You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by ht...@apache.org on 2019/04/22 17:56:13 UTC

[asterixdb] branch master updated: [NO ISSUE][FUN] Code generator alternative

This is an automated email from the ASF dual-hosted git repository.

htowaileb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 926c859  [NO ISSUE][FUN] Code generator alternative
926c859 is described below

commit 926c85941e241efcff626faa580739bc10c39d7d
Author: Hussain Towaileb <Hu...@Gmail.com>
AuthorDate: Fri Apr 19 08:38:15 2019 +0300

    [NO ISSUE][FUN] Code generator alternative
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    - Possible alternative to replace the generated code with a static
    method that does the NULL and MISSING checking step.
    - Missing and Null check uses static method and helper methods
    instead of varargs as a method argument.
    - NullMissingTest and ExceptionIT manually add the functions that need
    to be tested, this behavior will be changed later, the functions
    that need to be tested for the "missing/null in -> missing/null out"
    behavior will have their own flagging mechanism (annotation or
    a method) indicating that those methods will be tested, and
    the manual addition of functions will be removed.
    
    Change-Id: Icca2e2128c4b0f2bfd8675655cf5296cbbaeba88
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/3043
    Reviewed-by: Michael Blow <mb...@apache.org>
    Contrib: Michael Blow <mb...@apache.org>
    Integration-Tests: Michael Blow <mb...@apache.org>
    Tested-by: Michael Blow <mb...@apache.org>
---
 .../org/apache/asterix/runtime/ExceptionIT.java    | 394 +++++++++++++++-
 .../apache/asterix/runtime/NullMissingTest.java    | 467 ++++++++++++++++---
 .../runtime/FuzzyJoinFunctionRegistrant.java       |  34 +-
 .../common/EditDistanceCheckEvaluator.java         |  10 +-
 .../evaluators/common/EditDistanceEvaluator.java   |   8 +-
 .../evaluators/common/GramTokensEvaluator.java     |   5 +
 .../common/SimilarityJaccardCheckEvaluator.java    |   5 +
 .../common/SimilarityJaccardEvaluator.java         |   5 +
 .../evaluators/common/WordTokensEvaluator.java     |   6 +
 .../EditDistanceListIsFilterableDescriptor.java    |   4 +
 .../EditDistanceStringIsFilterableEvaluator.java   |   4 +
 .../functions/PrefixLenJaccardDescriptor.java      |   4 +
 .../functions/SpatialIntersectDescriptor.java      |   4 +
 asterixdb/asterix-runtime/pom.xml                  |  49 --
 .../evaluators/accessors/CircleCenterAccessor.java |   6 +
 .../evaluators/accessors/CircleRadiusAccessor.java |   6 +
 .../accessors/LineRectanglePolygonAccessor.java    |   6 +
 .../accessors/PointXCoordinateAccessor.java        |   6 +
 .../accessors/PointYCoordinateAccessor.java        |   6 +
 .../evaluators/accessors/TemporalDayAccessor.java  |   6 +
 .../evaluators/accessors/TemporalHourAccessor.java |   6 +
 .../accessors/TemporalIntervalEndAccessor.java     |   6 +
 .../accessors/TemporalIntervalEndDateAccessor.java |   6 +
 .../TemporalIntervalEndDatetimeAccessor.java       |   6 +
 .../accessors/TemporalIntervalEndTimeAccessor.java |   6 +
 .../accessors/TemporalIntervalStartAccessor.java   |   6 +
 .../TemporalIntervalStartDateAccessor.java         |   6 +
 .../TemporalIntervalStartDatetimeAccessor.java     |   6 +
 .../TemporalIntervalStartTimeAccessor.java         |   6 +
 .../accessors/TemporalMillisecondAccessor.java     |   6 +
 .../accessors/TemporalMinuteAccessor.java          |   6 +
 .../accessors/TemporalMonthAccessor.java           |   6 +
 .../accessors/TemporalSecondAccessor.java          |   6 +
 .../evaluators/accessors/TemporalYearAccessor.java |   6 +
 .../common/AbstractTypeCheckEvaluator.java         |  12 +-
 .../evaluators/common/CreateMBREvalFactory.java    |   6 +
 .../common/FullTextContainsEvaluator.java          |  29 +-
 .../comparisons/AbstractComparisonEvaluator.java   |   6 +
 .../ABinaryHexStringConstructorDescriptor.java     |   6 +
 .../constructors/ACircleConstructorDescriptor.java |   6 +
 .../constructors/ADateConstructorDescriptor.java   |   6 +
 .../ADateTimeConstructorDescriptor.java            |   6 +
 .../ADayTimeDurationConstructorDescriptor.java     |   6 +
 .../ADurationConstructorDescriptor.java            |   6 +
 .../constructors/AFloatConstructorDescriptor.java  |   6 +
 .../constructors/AInt16ConstructorDescriptor.java  |   6 +
 .../constructors/AInt32ConstructorDescriptor.java  |   6 +
 .../constructors/AInt8ConstructorDescriptor.java   |   6 +
 .../AIntervalConstructorDescriptor.java            |   5 +
 ...IntervalStartFromDateConstructorDescriptor.java |   5 +
 ...rvalStartFromDateTimeConstructorDescriptor.java |   5 +
 ...IntervalStartFromTimeConstructorDescriptor.java |   5 +
 .../constructors/ALineConstructorDescriptor.java   |   6 +
 .../APoint3DConstructorDescriptor.java             |   6 +
 .../constructors/APointConstructorDescriptor.java  |   6 +
 .../APolygonConstructorDescriptor.java             |   6 +
 .../ARectangleConstructorDescriptor.java           |   6 +
 .../constructors/ATimeConstructorDescriptor.java   |   6 +
 .../AUUIDFromStringConstructorDescriptor.java      |   6 +
 .../AYearMonthDurationConstructorDescriptor.java   |   6 +
 .../AbstractBooleanConstructorEvaluator.java       |   6 +
 .../AbstractDoubleConstructorEvaluator.java        |   6 +
 .../AbstractInt64ConstructorEvaluator.java         |   6 +
 .../AbstractStringConstructorEvaluator.java        |   6 +
 .../functions/AbstractArrayProcessArraysEval.java  |  19 +-
 .../functions/AbstractArrayProcessEval.java        |   5 +
 .../functions/AbstractArraySearchEval.java         |  10 +-
 .../functions/AbstractArraySliceEval.java          |   5 +
 .../functions/AbstractBinaryStringEval.java        |  11 +-
 .../functions/AbstractNumericArithmeticEval.java   |   4 +
 .../functions/AbstractQuadStringStringEval.java    |   4 +
 .../AbstractStringStringStringIntEval.java         |  16 +-
 .../functions/AbstractTripleStringEval.java        |  16 +-
 .../AbstractUnaryNumericFunctionEval.java          |   5 +
 .../functions/AbstractUnaryStringStringEval.java   |   5 +
 .../functions/AnyCollectionMemberDescriptor.java   |   5 +
 .../functions/ArrayFlattenDescriptor.java          |   4 +
 .../functions/ArrayIfNullDescriptor.java           |   5 +
 .../functions/ArrayIntersectDescriptor.java        |  18 +-
 .../evaluators/functions/ArrayRangeDescriptor.java |   8 +
 .../functions/ArrayRepeatDescriptor.java           |   5 +
 .../evaluators/functions/ArrayStarDescriptor.java  |   5 +
 .../evaluators/functions/CastTypeEvaluator.java    |   5 +
 .../functions/CodePointToStringDescriptor.java     |   5 +
 .../functions/CreateCircleDescriptor.java          |   4 +
 .../evaluators/functions/CreateLineDescriptor.java |   5 +
 .../functions/CreatePointDescriptor.java           |   4 +
 .../functions/CreatePolygonDescriptor.java         |   6 +
 .../functions/CreateRectangleDescriptor.java       |   4 +
 .../functions/DeepEqualityDescriptor.java          |   4 +
 .../evaluators/functions/GetItemDescriptor.java    |   4 +
 .../evaluators/functions/IsArrayDescriptor.java    |  23 +
 .../evaluators/functions/IsAtomicDescriptor.java   |  27 ++
 .../evaluators/functions/IsBooleanDescriptor.java  |  23 +
 .../evaluators/functions/IsNumberDescriptor.java   |  23 +
 .../evaluators/functions/IsObjectDescriptor.java   |  26 ++
 .../evaluators/functions/IsStringDescriptor.java   |  23 +
 .../evaluators/functions/LenDescriptor.java        |   5 +
 .../evaluators/functions/NotDescriptor.java        |   4 +
 .../functions/NumericATan2Descriptor.java          |   5 +
 .../functions/NumericRoundDescriptor.java          |   5 +
 .../NumericRoundHalfToEven2Descriptor.java         |   5 +
 .../NumericRoundHalfToEvenDescriptor.java          |   5 +
 .../functions/NumericTruncDescriptor.java          |   5 +
 .../evaluators/functions/PointableHelper.java      | 124 +++++
 .../functions/RandomWithSeedDescriptor.java        |   4 +
 .../functions/SpatialAreaDescriptor.java           |   4 +
 .../functions/SpatialCellDescriptor.java           |   5 +
 .../functions/SpatialDistanceDescriptor.java       |   4 +
 .../functions/StringConcatDescriptor.java          |   6 +
 .../evaluators/functions/StringJoinDescriptor.java |   5 +
 .../functions/StringLengthDescriptor.java          |   5 +
 .../functions/StringRepeatDescriptor.java          |   4 +
 .../functions/StringSplitDescriptor.java           |   4 +
 .../functions/StringToCodePointDescriptor.java     |   5 +
 .../evaluators/functions/Substring2Descriptor.java |   4 +
 .../functions/SubstringAfterDescriptor.java        |   7 +-
 .../functions/SubstringBeforeDescriptor.java       |   8 +-
 .../evaluators/functions/SubstringDescriptor.java  |   4 +
 .../evaluators/functions/ToArrayDescriptor.java    |   5 +
 .../evaluators/functions/ToAtomicDescriptor.java   |   4 +
 .../evaluators/functions/ToNumberDescriptor.java   |   5 +-
 .../evaluators/functions/ToObjectDescriptor.java   |   5 +
 .../functions/TreatAsIntegerDescriptor.java        |   4 +
 .../binary/AbstractFindBinaryEvaluator.java        |  17 +
 .../binary/AbstractSubBinaryEvaluator.java         |  17 +
 .../functions/binary/BinaryConcatDescriptor.java   |   5 +
 .../functions/binary/BinaryLengthDescriptor.java   |   6 +
 .../functions/binary/ParseBinaryDescriptor.java    |   5 +
 .../functions/binary/PrintBinaryDescriptor.java    |   5 +
 .../records/AbstractRecordPairsEvaluator.java      |   5 +
 .../records/FieldAccessByIndexEvalFactory.java     |  13 +-
 .../records/FieldAccessByNameEvalFactory.java      |   6 +
 .../records/FieldAccessNestedEvalFactory.java      |   6 +
 .../records/GetRecordFieldValueEvalFactory.java    |   8 +-
 .../records/GetRecordFieldsEvalFactory.java        |   6 +
 .../records/RecordAddFieldsDescriptor.java         |   4 +
 .../functions/records/RecordLengthDescriptor.java  |   4 +
 .../functions/records/RecordMergeDescriptor.java   |   4 +
 .../functions/records/RecordNamesDescriptor.java   |   4 +
 .../functions/records/RecordRemoveEvaluator.java   |   8 +-
 .../records/RecordRemoveFieldsEvalFactory.java     |   4 +
 .../functions/records/RecordRenameEvaluator.java   |  12 +-
 .../functions/records/RecordUnwrapEvaluator.java   |   5 +
 .../functions/records/RecordValuesEvaluator.java   |   5 +
 .../AbstractIntervalLogicFuncDescriptor.java       |   5 +
 .../AdjustDateTimeForTimeZoneDescriptor.java       |   5 +
 .../temporal/AdjustTimeForTimeZoneDescriptor.java  |   5 +
 .../CalendarDuartionFromDateDescriptor.java        |   5 +
 .../CalendarDurationFromDateTimeDescriptor.java    |   5 +
 .../temporal/DateFromDatetimeDescriptor.java       |   6 +
 .../temporal/DateFromUnixTimeInDaysDescriptor.java |   6 +
 .../DatetimeFromDateAndTimeDescriptor.java         |   5 +
 .../DatetimeFromUnixTimeInMsDescriptor.java        |   6 +
 .../DatetimeFromUnixTimeInSecsDescriptor.java      |   5 +
 .../functions/temporal/DayOfWeekDescriptor.java    |   5 +
 .../DayTimeDurationComparatorDescriptor.java       |   5 +
 .../temporal/DurationEqualDescriptor.java          |   5 +
 .../temporal/DurationFromIntervalDescriptor.java   |   5 +
 .../DurationFromMillisecondsDescriptor.java        |   6 +
 .../temporal/DurationFromMonthsDescriptor.java     |   6 +
 .../temporal/GetDayTimeDurationDescriptor.java     |   5 +
 .../temporal/GetOverlappingIntervalDescriptor.java |   6 +
 .../temporal/GetYearMonthDurationDescriptor.java   |   6 +
 .../functions/temporal/IntervalBinDescriptor.java  |   5 +
 .../MillisecondsFromDayTimeDurationDescriptor.java |   6 +
 .../MonthsFromYearMonthDurationDescriptor.java     |   6 +
 .../functions/temporal/OverlapBinsDescriptor.java  |   5 +
 .../functions/temporal/ParseDateDescriptor.java    |   5 +
 .../temporal/ParseDateTimeDescriptor.java          |   5 +
 .../functions/temporal/ParseTimeDescriptor.java    |   5 +
 .../functions/temporal/PrintDateDescriptor.java    |   5 +
 .../temporal/PrintDateTimeDescriptor.java          |   5 +
 .../functions/temporal/PrintTimeDescriptor.java    |   5 +
 .../temporal/TimeFromDatetimeDescriptor.java       |   5 +
 .../temporal/TimeFromUnixTimeInMsDescriptor.java   |   6 +
 .../temporal/UnixTimeFromDateInDaysDescriptor.java |   6 +
 .../UnixTimeFromDatetimeInMsDescriptor.java        |   6 +
 .../UnixTimeFromDatetimeInSecsDescriptor.java      |   6 +
 .../temporal/UnixTimeFromTimeInMsDescriptor.java   |   6 +
 .../YearMonthDurationComparatorDescriptor.java     |   5 +
 .../runtime/functions/FunctionCollection.java      | 504 ++++++++++-----------
 182 files changed, 2320 insertions(+), 437 deletions(-)

diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
index 2e7445f..cd96063 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
@@ -22,9 +22,16 @@ package org.apache.asterix.runtime;
 
 import static org.mockito.Mockito.mock;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.FunctionInfo;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
@@ -37,36 +44,81 @@ import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.primitive.VoidPointable;
 import org.junit.Assert;
+import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
+/**
+ * This test goes through all the functions that should respect the "missing/null in -> missing/null out" behavior,
+ * passes all possible combinations of ATypeType arguments and ensures the thrown Exceptions hae the appropriate error
+ * codes.
+ */
+
+@RunWith(Parameterized.class)
 public class ExceptionIT {
 
-    @Test
-    public void test() throws Exception {
+    // This will temporarily hold all the functions that need to be tested (codegen functions) until
+    // the alternative solution is implemented
+    private static Set<FunctionInfo> includedFunctions = new HashSet<>();
+
+    @Parameterized.Parameters(name = "NullMissingTest {index}: {0}")
+    public static Collection<Object[]> tests() {
+        List<Object[]> tests = new ArrayList<>();
+
+        // Get all the functions
         List<IFunctionDescriptorFactory> functions =
                 FunctionCollection.createDefaultFunctionCollection().getFunctionDescriptorFactories();
-        int testedFunctions = 0;
+
+        // Build the tests
         for (IFunctionDescriptorFactory func : functions) {
             String className = func.getClass().getName();
-            // We test all generated functions except
-            // record and cast functions, which requires type settings.
-            if (className.contains("Gen") && !className.contains("record") && !className.contains("Cast")) {
-                System.out.println("Testing " + className);
-                testFunction(func);
-                ++testedFunctions;
+            // We test all functions except record and cast functions, which requires type settings (we test them
+            // in runtime tests).
+            if (!className.contains("record") && !className.contains("Cast")) {
+                tests.add(new Object[] { getTestName(func), func });
             }
         }
-        // 208 is the current number of functions with generated code.
-        Assert.assertTrue(testedFunctions >= 208);
+        return tests;
+    }
+
+    private static String getTestName(IFunctionDescriptorFactory func) {
+        if (func.getClass().getEnclosingClass() != null) {
+            return func.getClass().getEnclosingClass().getSimpleName();
+        } else if (func.getClass().getSimpleName().contains("$$Lambda")) {
+            return func.getClass().getSimpleName().replaceAll("\\$\\$Lambda.*", "");
+        } else {
+            return func.getClass().getSimpleName();
+        }
     }
 
-    private void testFunction(IFunctionDescriptorFactory funcFactory) throws Exception {
-        AbstractScalarFunctionDynamicDescriptor funcDesc =
-                (AbstractScalarFunctionDynamicDescriptor) funcFactory.createFunctionDescriptor();
+    @Parameterized.Parameter
+    public String testName;
+
+    @Parameterized.Parameter(1)
+    public IFunctionDescriptorFactory funcFactory;
+
+    @Test
+    public void test() throws Exception {
+        IFunctionDescriptor functionDescriptor = funcFactory.createFunctionDescriptor();
+
+        // This checks whether the current function should go through this test or get excluded
+        if (!(functionDescriptor instanceof AbstractScalarFunctionDynamicDescriptor)
+                || !includedFunctions.contains(new FunctionInfo(functionDescriptor.getIdentifier(), true))) {
+            return;
+        }
+
+        // Get the arguments combinations
+        AbstractScalarFunctionDynamicDescriptor funcDesc = (AbstractScalarFunctionDynamicDescriptor) functionDescriptor;
         int inputArity = funcDesc.getIdentifier().getArity();
         Iterator<IScalarEvaluatorFactory[]> argEvalFactoryIterator = getArgCombinations(inputArity);
+
+        // Test is happening here
         while (argEvalFactoryIterator.hasNext()) {
-            IScalarEvaluatorFactory evalFactory = funcDesc.createEvaluatorFactory(argEvalFactoryIterator.next());
+            IScalarEvaluatorFactory[] factories = argEvalFactoryIterator.next();
+
+            // Evaluate
+            IScalarEvaluatorFactory evalFactory = funcDesc.createEvaluatorFactory(factories);
             IHyracksTaskContext ctx = mock(IHyracksTaskContext.class);
             try {
                 IScalarEvaluator evaluator = evalFactory.createScalarEvaluator(ctx);
@@ -81,7 +133,6 @@ public class ExceptionIT {
                     // Verifies the error code.
                     int errorCode = Integer.parseInt(msg.substring(3, 7));
                     Assert.assertTrue(errorCode >= 0 && errorCode < 1000);
-                    continue;
                 } else if (msg.startsWith("HYR")) {
                     // Verifies the error code.
                     int errorCode = Integer.parseInt(msg.substring(3, 7));
@@ -117,9 +168,318 @@ public class ExceptionIT {
                 ++index;
                 return scalarEvaluatorFactories;
             }
-
         };
+    }
+
+    // Adds all the functions that need to be tested, this is a temporary solution and will be replaced
+    // once the alternative solution is implemented
+    @BeforeClass
+    public static void buildFunctions() {
+        // Included
+        // FuzzyJoinFunctionRegistrant class
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SPATIAL_INTERSECT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PREFIX_LEN_JACCARD, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.WORD_TOKENS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.HASHED_WORD_TOKENS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.COUNTHASHED_WORD_TOKENS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GRAM_TOKENS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.HASHED_GRAM_TOKENS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.COUNTHASHED_GRAM_TOKENS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.EDIT_DISTANCE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.EDIT_DISTANCE_CHECK, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.EDIT_DISTANCE_STRING_IS_FILTERABLE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.EDIT_DISTANCE_LIST_IS_FILTERABLE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.EDIT_DISTANCE_CONTAINS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SIMILARITY_JACCARD, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SIMILARITY_JACCARD_CHECK, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SIMILARITY_JACCARD_SORTED, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SIMILARITY_JACCARD_SORTED_CHECK, true));
+
+        // FunctionCollection class
+        // Array functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_POSITION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_REPEAT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_CONTAINS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_REVERSE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_SORT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_DISTINCT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_UNION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_INTERSECT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_IFNULL, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_CONCAT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_RANGE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_FLATTEN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_SLICE_WITH_END_POSITION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_SLICE_WITHOUT_END_POSITION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_SYMDIFF, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_SYMDIFFN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_STAR, true));
+
+        // Element accessors
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_INDEX, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_NAME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FIELD_ACCESS_NESTED, true));
+
+        // Numeric functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_UNARY_MINUS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ADD, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_DIVIDE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_DIV, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_MULTIPLY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_SUBTRACT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_MOD, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_POWER, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NOT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.LEN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ABS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_CEILING, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_FLOOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ROUND, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ROUND_HALF_TO_EVEN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ROUND_HALF_TO_EVEN2, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ACOS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ASIN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ATAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_DEGREES, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_RADIANS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_COS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_COSH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_SIN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_SINH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_TAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_TANH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_EXP, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_LN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_LOG, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_SQRT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_SIGN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_TRUNC, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ATAN2, true));
+
+        // Comparisons functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.EQ, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.LT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.LE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NEQ, true));
+
+        // If-Equals functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.MISSING_IF, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NULL_IF, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NAN_IF, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.POSINF_IF, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NEGINF_IF, true));
+
+        // Binary functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.BINARY_LENGTH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PARSE_BINARY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PRINT_BINARY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.BINARY_CONCAT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SUBBINARY_FROM, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SUBBINARY_FROM_TO, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FIND_BINARY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FIND_BINARY_FROM, true));
+
+        // String functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_LIKE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_CONTAINS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_ENDS_WITH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_STARTS_WITH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SUBSTRING, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_EQUAL, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_LOWERCASE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_UPPERCASE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_LENGTH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SUBSTRING2, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SUBSTRING_BEFORE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SUBSTRING_AFTER, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_TO_CODEPOINT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CODEPOINT_TO_STRING, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_CONCAT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_JOIN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_MATCHES, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_MATCHES_WITH_FLAG, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REGEXP_LIKE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REGEXP_LIKE_WITH_FLAG, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REGEXP_POSITION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REGEXP_POSITION_WITH_FLAG, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REGEXP_REPLACE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REGEXP_REPLACE_WITH_FLAG, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_INITCAP, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_TRIM, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_LTRIM, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_RTRIM, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_TRIM2, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_LTRIM2, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_RTRIM2, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_POSITION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REPEAT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REPLACE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REPLACE_WITH_LIMIT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REVERSE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_SPLIT, true));
+
+        // Constructors
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.BOOLEAN_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.BINARY_HEX_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.BINARY_BASE64_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INT8_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INT16_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INT32_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INT64_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FLOAT_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DOUBLE_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.POINT_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.POINT3D_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.LINE_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.POLYGON_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CIRCLE_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECTANGLE_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TIME_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATE_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATETIME_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DURATION_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.YEAR_MONTH_DURATION_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DAY_TIME_DURATION_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.UUID_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_CONSTRUCTOR_START_FROM_DATE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_CONSTRUCTOR_START_FROM_TIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_CONSTRUCTOR_START_FROM_DATETIME, true));
+
+        // Spatial
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CREATE_POINT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CREATE_LINE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CREATE_POLYGON, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CREATE_CIRCLE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CREATE_RECTANGLE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SPATIAL_AREA, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SPATIAL_DISTANCE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CREATE_MBR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SPATIAL_CELL, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_POINT_X_COORDINATE_ACCESSOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_POINT_Y_COORDINATE_ACCESSOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_CIRCLE_RADIUS_ACCESSOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_CIRCLE_CENTER_ACCESSOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_POINTS_LINE_RECTANGLE_POLYGON_ACCESSOR, true));
+
+        // Full-text function
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FULLTEXT_CONTAINS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FULLTEXT_CONTAINS_WO_OPTION, true));
+
+        // Record functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_RECORD_FIELDS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_RECORD_FIELD_VALUE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DEEP_EQUAL, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_MERGE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ADD_FIELDS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.REMOVE_FIELDS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_LENGTH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_NAMES, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_REMOVE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_RENAME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_UNWRAP, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_VALUES, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PAIRS, true));
+
+        // Spatial and temporal type accessors
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_YEAR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_MONTH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_DAY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_HOUR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_MIN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_SEC, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_MILLISEC, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_START, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_END, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_START_DATE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_END_DATE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_START_TIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_END_TIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_START_DATETIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_END_DATETIME, true));
+
+        // Temporal functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.UNIX_TIME_FROM_DATE_IN_DAYS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.UNIX_TIME_FROM_TIME_IN_MS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.UNIX_TIME_FROM_DATETIME_IN_MS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.UNIX_TIME_FROM_DATETIME_IN_SECS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATE_FROM_UNIX_TIME_IN_DAYS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATE_FROM_DATETIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TIME_FROM_UNIX_TIME_IN_MS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TIME_FROM_DATETIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATETIME_FROM_UNIX_TIME_IN_MS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATETIME_FROM_UNIX_TIME_IN_SECS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATETIME_FROM_DATE_TIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CALENDAR_DURATION_FROM_DATETIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CALENDAR_DURATION_FROM_DATE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ADJUST_DATETIME_FOR_TIMEZONE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ADJUST_TIME_FOR_TIMEZONE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_BEFORE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_AFTER, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_MEETS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_MET_BY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_OVERLAPS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_OVERLAPPED_BY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_OVERLAPPING, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_STARTS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_STARTED_BY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_COVERS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_COVERED_BY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_ENDS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_ENDED_BY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DURATION_FROM_MILLISECONDS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DURATION_FROM_MONTHS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.YEAR_MONTH_DURATION_GREATER_THAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.YEAR_MONTH_DURATION_LESS_THAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DAY_TIME_DURATION_GREATER_THAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DAY_TIME_DURATION_LESS_THAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.MONTHS_FROM_YEAR_MONTH_DURATION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.MILLISECONDS_FROM_DAY_TIME_DURATION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DURATION_EQUAL, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_YEAR_MONTH_DURATION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_DAY_TIME_DURATION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_BIN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.OVERLAP_BINS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DAY_OF_WEEK, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PARSE_DATE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PARSE_TIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PARSE_DATETIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PRINT_DATE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PRINT_TIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PRINT_DATETIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_OVERLAPPING_INTERVAL, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DURATION_FROM_INTERVAL, true));
+
+        // Type functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.IS_ARRAY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.IS_ATOMIC, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.IS_BOOLEAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.IS_NUMBER, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.IS_OBJECT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.IS_STRING, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_ARRAY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_ATOMIC, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_BIGINT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_BOOLEAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_DOUBLE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_NUMBER, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_OBJECT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_STRING, true));
+
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TREAT_AS_INTEGER, true));
+
+        // Cast function
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CAST_TYPE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CAST_TYPE_LAX, true));
+
+        // Record function
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_PAIRS, true));
 
+        // Other functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RANDOM_WITH_SEED, true));
     }
 
 }
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/NullMissingTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/NullMissingTest.java
index 35b379f..36d9902 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/NullMissingTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/NullMissingTest.java
@@ -22,12 +22,15 @@ package org.apache.asterix.runtime;
 
 import static org.mockito.Mockito.mock;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
 import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.FunctionInfo;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
@@ -36,7 +39,6 @@ import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
 import org.apache.asterix.runtime.functions.FunctionCollection;
 import org.apache.hyracks.algebricks.common.utils.Pair;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.algebricks.runtime.evaluators.ConstantEvalFactory;
@@ -44,66 +46,113 @@ import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.primitive.VoidPointable;
 import org.junit.Assert;
+import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
 
+/**
+ * This test goes through all the functions that should respect the "missing/null in -> missing/null out" behavior
+ * and ensures they respect that rule
+ */
+
+@RunWith(Parameterized.class)
 public class NullMissingTest {
 
-    @Test
-    public void test() throws Exception {
+    // This will temporarily hold all the functions that need to be tested (codegen functions) until
+    // the alternative solution is implemented
+    private static Set<FunctionInfo> includedFunctions = new HashSet<>();
+
+    // those are the functions that need IATypes of their args and use them in the function constructor
+    private static Set<FunctionInfo> functionsRequiringTypes = new HashSet<>();
+
+    @Parameters(name = "NullMissingTest {index}: {0}")
+    public static Collection<Object[]> tests() {
+        List<Object[]> tests = new ArrayList<>();
+
+        // Get all the functions
         List<IFunctionDescriptorFactory> functions =
                 FunctionCollection.createDefaultFunctionCollection().getFunctionDescriptorFactories();
-        int testedFunctions = 0;
-        Set<FunctionIdentifier> functionsRequiringTypes = new HashSet<>();
-        buildFunctionsRequiringTypes(functionsRequiringTypes);
+
+        // Build the tests
         for (IFunctionDescriptorFactory func : functions) {
             String className = func.getClass().getName();
-            // We test all generated functions except
-            // record and cast functions, which requires type settings (we test them in runtime tests).
-            if (className.contains("Gen") && !className.contains("record") && !className.contains("Cast")) {
-                testFunction(func, className, functionsRequiringTypes);
-                ++testedFunctions;
+            // We test all functions except record and cast functions, which requires type settings (we test them
+            // in runtime tests).
+            if (!className.contains("record") && !className.contains("Cast")) {
+                tests.add(new Object[] { getTestName(func), func });
             }
         }
-        // 217 is the current number of functions with generated code.
-        Assert.assertTrue("expected >= 217 generated functions to be tested, but was " + testedFunctions,
-                testedFunctions >= 217);
+        return tests;
+    }
+
+    private static String getTestName(IFunctionDescriptorFactory func) {
+        if (func.getClass().getEnclosingClass() != null) {
+            return func.getClass().getEnclosingClass().getSimpleName();
+        } else if (func.getClass().getSimpleName().contains("$$Lambda")) {
+            return func.getClass().getSimpleName().replaceAll("\\$\\$Lambda.*", "");
+        } else {
+            return func.getClass().getSimpleName();
+        }
     }
 
-    private void testFunction(IFunctionDescriptorFactory funcFactory, String className,
-            Set<FunctionIdentifier> functionsRequiringTypes) throws Exception {
+    @Parameter
+    public String testName;
+
+    @Parameter(1)
+    public IFunctionDescriptorFactory funcFactory;
+
+    @Test
+    public void test() throws Exception {
+        String className = funcFactory.getClass().getName();
         IFunctionDescriptor functionDescriptor = funcFactory.createFunctionDescriptor();
-        if (!(functionDescriptor instanceof AbstractScalarFunctionDynamicDescriptor)) {
+
+        // This checks whether the current function should go through this test or get excluded
+        if (!(functionDescriptor instanceof AbstractScalarFunctionDynamicDescriptor)
+                || !includedFunctions.contains(new FunctionInfo(functionDescriptor.getIdentifier(), true))) {
             System.out.println("Excluding " + className);
             return;
         }
         System.out.println("Testing " + className);
+
+        // Get the arguments combinations
         AbstractScalarFunctionDynamicDescriptor funcDesc = (AbstractScalarFunctionDynamicDescriptor) functionDescriptor;
         int inputArity = funcDesc.getIdentifier().getArity();
-        boolean t = functionsRequiringTypes.contains(funcDesc.getIdentifier()); // whether to build args types or not
-        Iterator<Pair<IScalarEvaluatorFactory[], IAType[]>> argEvalFactoryIterator = getArgCombinations(inputArity, t);
+        Iterator<Pair<IScalarEvaluatorFactory[], IAType[]>> argEvalFactoryIterator = getArgCombinations(inputArity);
         int index = 0;
+
+        // Test is happening here
         while (argEvalFactoryIterator.hasNext()) {
-            Pair<IScalarEvaluatorFactory[], IAType[]> next = argEvalFactoryIterator.next();
-            if (next.second != null) {
-                funcDesc.setImmutableStates((Object[]) next.second);
+            Pair<IScalarEvaluatorFactory[], IAType[]> argumentsAndTypesPair = argEvalFactoryIterator.next();
+
+            // Set the IAType if it's needed
+            if (functionsRequiringTypes.contains(new FunctionInfo(funcDesc.getIdentifier(), true))) {
+                funcDesc.setImmutableStates((Object[]) argumentsAndTypesPair.second);
             }
-            IScalarEvaluatorFactory evalFactory = funcDesc.createEvaluatorFactory(next.first);
+
+            // Evaluate
+            IScalarEvaluatorFactory evalFactory = funcDesc.createEvaluatorFactory(argumentsAndTypesPair.first);
             IHyracksTaskContext ctx = mock(IHyracksTaskContext.class);
             IScalarEvaluator evaluator = evalFactory.createScalarEvaluator(ctx);
             IPointable resultPointable = new VoidPointable();
             evaluator.evaluate(null, resultPointable);
+
+            // Result checks
             if (index != 0) {
-                Assert.assertTrue(resultPointable.getByteArray()[resultPointable
-                        .getStartOffset()] == ATypeTag.SERIALIZED_MISSING_TYPE_TAG);
+                Assert.assertEquals(ATypeTag.SERIALIZED_MISSING_TYPE_TAG,
+                        resultPointable.getByteArray()[resultPointable.getStartOffset()]);
             } else {
-                Assert.assertTrue(resultPointable.getByteArray()[resultPointable
-                        .getStartOffset()] == ATypeTag.SERIALIZED_NULL_TYPE_TAG);
+                Assert.assertEquals(ATypeTag.SERIALIZED_NULL_TYPE_TAG,
+                        resultPointable.getByteArray()[resultPointable.getStartOffset()]);
             }
             ++index;
         }
     }
 
-    private Iterator<Pair<IScalarEvaluatorFactory[], IAType[]>> getArgCombinations(int inputArity, boolean buildTypes) {
+    // Generates combinations of arguments and their type
+    private Iterator<Pair<IScalarEvaluatorFactory[], IAType[]>> getArgCombinations(int inputArity) {
         int argSize = inputArity >= 0 ? inputArity : 3;
         final int numCombinations = 1 << argSize;
         return new Iterator<Pair<IScalarEvaluatorFactory[], IAType[]>>() {
@@ -116,39 +165,351 @@ public class NullMissingTest {
 
             @Override
             public Pair<IScalarEvaluatorFactory[], IAType[]> next() {
+                IAType[] argumentTypes = new IAType[argSize];
                 IScalarEvaluatorFactory[] scalarEvaluatorFactories = new IScalarEvaluatorFactory[argSize];
-                IAType[] argsTypes = buildTypes ? new IAType[argSize] : null;
+
                 for (int j = 0; j < argSize; ++j) {
-                    IAType type = (index & (1 << j)) != 0 ? BuiltinType.AMISSING : BuiltinType.ANULL;
-                    scalarEvaluatorFactories[j] = new ConstantEvalFactory(new byte[] { type.getTypeTag().serialize() });
-                    if (buildTypes) {
-                        argsTypes[j] = type;
+                    if ((index & (1 << j)) != 0) {
+                        argumentTypes[j] = BuiltinType.AMISSING;
+                        scalarEvaluatorFactories[j] =
+                                new ConstantEvalFactory(new byte[] { ATypeTag.SERIALIZED_MISSING_TYPE_TAG });
+                    } else {
+                        argumentTypes[j] = BuiltinType.ANULL;
+                        scalarEvaluatorFactories[j] =
+                                new ConstantEvalFactory(new byte[] { ATypeTag.SERIALIZED_NULL_TYPE_TAG });
                     }
                 }
                 ++index;
-                return new Pair<>(scalarEvaluatorFactories, argsTypes);
+                return new Pair<>(scalarEvaluatorFactories, argumentTypes);
             }
-
         };
-
     }
 
-    // those are the functions that need IATypes of their args and use them in the function constructor
-    private void buildFunctionsRequiringTypes(Set<FunctionIdentifier> functionsRequiringTypes) {
-        functionsRequiringTypes.add(BuiltinFunctions.ARRAY_POSITION);
-        functionsRequiringTypes.add(BuiltinFunctions.ARRAY_CONTAINS);
-        functionsRequiringTypes.add(BuiltinFunctions.ARRAY_SORT);
-        functionsRequiringTypes.add(BuiltinFunctions.ARRAY_DISTINCT);
-        functionsRequiringTypes.add(BuiltinFunctions.EQ);
-        functionsRequiringTypes.add(BuiltinFunctions.LT);
-        functionsRequiringTypes.add(BuiltinFunctions.GT);
-        functionsRequiringTypes.add(BuiltinFunctions.GE);
-        functionsRequiringTypes.add(BuiltinFunctions.LE);
-        functionsRequiringTypes.add(BuiltinFunctions.NEQ);
-        functionsRequiringTypes.add(BuiltinFunctions.MISSING_IF);
-        functionsRequiringTypes.add(BuiltinFunctions.NAN_IF);
-        functionsRequiringTypes.add(BuiltinFunctions.NEGINF_IF);
-        functionsRequiringTypes.add(BuiltinFunctions.NULL_IF);
-        functionsRequiringTypes.add(BuiltinFunctions.POSINF_IF);
+    // Adds all the functions that need to be tested, this is a temporary solution and will be replaced
+    // once the alternative solution is implemented
+    @BeforeClass
+    public static void buildFunctions() {
+        // Those are the functions that need IATypes of their args and use them in the function constructor
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.ARRAY_POSITION, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.ARRAY_CONTAINS, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.ARRAY_SORT, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.ARRAY_DISTINCT, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.EQ, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.LT, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.GT, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.GE, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.LE, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.NEQ, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.MISSING_IF, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.NAN_IF, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.NEGINF_IF, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.NULL_IF, true));
+        functionsRequiringTypes.add(new FunctionInfo(BuiltinFunctions.POSINF_IF, true));
+
+        // Included
+        // FuzzyJoinFunctionRegistrant class
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SPATIAL_INTERSECT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PREFIX_LEN_JACCARD, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.WORD_TOKENS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.HASHED_WORD_TOKENS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.COUNTHASHED_WORD_TOKENS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GRAM_TOKENS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.HASHED_GRAM_TOKENS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.COUNTHASHED_GRAM_TOKENS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.EDIT_DISTANCE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.EDIT_DISTANCE_CHECK, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.EDIT_DISTANCE_STRING_IS_FILTERABLE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.EDIT_DISTANCE_LIST_IS_FILTERABLE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.EDIT_DISTANCE_CONTAINS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SIMILARITY_JACCARD, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SIMILARITY_JACCARD_CHECK, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SIMILARITY_JACCARD_SORTED, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SIMILARITY_JACCARD_SORTED_CHECK, true));
+
+        // FunctionCollection class
+        // Array functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_POSITION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_REPEAT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_CONTAINS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_REVERSE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_SORT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_DISTINCT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_UNION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_INTERSECT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_IFNULL, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_CONCAT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_RANGE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_FLATTEN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_SLICE_WITH_END_POSITION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_SLICE_WITHOUT_END_POSITION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_SYMDIFF, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_SYMDIFFN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ARRAY_STAR, true));
+
+        // Element accessors
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_INDEX, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_NAME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FIELD_ACCESS_NESTED, true));
+
+        // Numeric functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_UNARY_MINUS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ADD, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_DIVIDE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_DIV, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_MULTIPLY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_SUBTRACT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_MOD, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_POWER, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NOT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.LEN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ABS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_CEILING, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_FLOOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ROUND, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ROUND_HALF_TO_EVEN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ROUND_HALF_TO_EVEN2, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ACOS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ASIN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ATAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_DEGREES, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_RADIANS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_COS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_COSH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_SIN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_SINH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_TAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_TANH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_EXP, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_LN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_LOG, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_SQRT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_SIGN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_TRUNC, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NUMERIC_ATAN2, true));
+
+        // Comparisons functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.EQ, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.LT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.LE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NEQ, true));
+
+        // If-Equals functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.MISSING_IF, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NULL_IF, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NAN_IF, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.POSINF_IF, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.NEGINF_IF, true));
+
+        // Binary functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.BINARY_LENGTH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PARSE_BINARY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PRINT_BINARY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.BINARY_CONCAT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SUBBINARY_FROM, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SUBBINARY_FROM_TO, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FIND_BINARY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FIND_BINARY_FROM, true));
+
+        // String functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_LIKE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_CONTAINS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_ENDS_WITH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_STARTS_WITH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SUBSTRING, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_EQUAL, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_LOWERCASE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_UPPERCASE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_LENGTH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SUBSTRING2, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SUBSTRING_BEFORE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SUBSTRING_AFTER, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_TO_CODEPOINT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CODEPOINT_TO_STRING, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_CONCAT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_JOIN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_MATCHES, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_MATCHES_WITH_FLAG, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REGEXP_LIKE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REGEXP_LIKE_WITH_FLAG, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REGEXP_POSITION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REGEXP_POSITION_WITH_FLAG, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REGEXP_REPLACE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REGEXP_REPLACE_WITH_FLAG, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_INITCAP, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_TRIM, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_LTRIM, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_RTRIM, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_TRIM2, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_LTRIM2, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_RTRIM2, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_POSITION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REPEAT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REPLACE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REPLACE_WITH_LIMIT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_REVERSE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_SPLIT, true));
+
+        // Constructors
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.BOOLEAN_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.BINARY_HEX_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.BINARY_BASE64_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.STRING_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INT8_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INT16_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INT32_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INT64_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FLOAT_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DOUBLE_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.POINT_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.POINT3D_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.LINE_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.POLYGON_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CIRCLE_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECTANGLE_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TIME_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATE_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATETIME_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DURATION_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.YEAR_MONTH_DURATION_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DAY_TIME_DURATION_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.UUID_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_CONSTRUCTOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_CONSTRUCTOR_START_FROM_DATE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_CONSTRUCTOR_START_FROM_TIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_CONSTRUCTOR_START_FROM_DATETIME, true));
+
+        // Spatial
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CREATE_POINT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CREATE_LINE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CREATE_POLYGON, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CREATE_CIRCLE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CREATE_RECTANGLE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SPATIAL_AREA, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SPATIAL_DISTANCE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CREATE_MBR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.SPATIAL_CELL, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_POINT_X_COORDINATE_ACCESSOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_POINT_Y_COORDINATE_ACCESSOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_CIRCLE_RADIUS_ACCESSOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_CIRCLE_CENTER_ACCESSOR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_POINTS_LINE_RECTANGLE_POLYGON_ACCESSOR, true));
+
+        // Full-text function
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FULLTEXT_CONTAINS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.FULLTEXT_CONTAINS_WO_OPTION, true));
+
+        // Record functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_RECORD_FIELDS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_RECORD_FIELD_VALUE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DEEP_EQUAL, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_MERGE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ADD_FIELDS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.REMOVE_FIELDS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_LENGTH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_NAMES, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_REMOVE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_RENAME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_UNWRAP, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_VALUES, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PAIRS, true));
+
+        // Spatial and temporal type accessors
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_YEAR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_MONTH, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_DAY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_HOUR, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_MIN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_SEC, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_MILLISEC, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_START, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_END, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_START_DATE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_END_DATE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_START_TIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_END_TIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_START_DATETIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ACCESSOR_TEMPORAL_INTERVAL_END_DATETIME, true));
+
+        // Temporal functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.UNIX_TIME_FROM_DATE_IN_DAYS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.UNIX_TIME_FROM_TIME_IN_MS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.UNIX_TIME_FROM_DATETIME_IN_MS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.UNIX_TIME_FROM_DATETIME_IN_SECS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATE_FROM_UNIX_TIME_IN_DAYS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATE_FROM_DATETIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TIME_FROM_UNIX_TIME_IN_MS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TIME_FROM_DATETIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATETIME_FROM_UNIX_TIME_IN_MS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATETIME_FROM_UNIX_TIME_IN_SECS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DATETIME_FROM_DATE_TIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CALENDAR_DURATION_FROM_DATETIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CALENDAR_DURATION_FROM_DATE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ADJUST_DATETIME_FOR_TIMEZONE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.ADJUST_TIME_FOR_TIMEZONE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_BEFORE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_AFTER, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_MEETS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_MET_BY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_OVERLAPS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_OVERLAPPED_BY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_OVERLAPPING, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_STARTS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_STARTED_BY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_COVERS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_COVERED_BY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_ENDS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_ENDED_BY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DURATION_FROM_MILLISECONDS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DURATION_FROM_MONTHS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.YEAR_MONTH_DURATION_GREATER_THAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.YEAR_MONTH_DURATION_LESS_THAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DAY_TIME_DURATION_GREATER_THAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DAY_TIME_DURATION_LESS_THAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.MONTHS_FROM_YEAR_MONTH_DURATION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.MILLISECONDS_FROM_DAY_TIME_DURATION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DURATION_EQUAL, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_YEAR_MONTH_DURATION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_DAY_TIME_DURATION, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.INTERVAL_BIN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.OVERLAP_BINS, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DAY_OF_WEEK, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PARSE_DATE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PARSE_TIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PARSE_DATETIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PRINT_DATE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PRINT_TIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.PRINT_DATETIME, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.GET_OVERLAPPING_INTERVAL, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.DURATION_FROM_INTERVAL, true));
+
+        // Type functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.IS_ARRAY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.IS_ATOMIC, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.IS_BOOLEAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.IS_NUMBER, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.IS_OBJECT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.IS_STRING, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_ARRAY, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_ATOMIC, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_BIGINT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_BOOLEAN, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_DOUBLE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_NUMBER, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_OBJECT, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TO_STRING, true));
+
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.TREAT_AS_INTEGER, true));
+
+        // Cast function
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CAST_TYPE, true));
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.CAST_TYPE_LAX, true));
+
+        // Record function
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RECORD_PAIRS, true));
+
+        // Other functions
+        includedFunctions.add(new FunctionInfo(BuiltinFunctions.RANDOM_WITH_SEED, true));
     }
 }
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/FuzzyJoinFunctionRegistrant.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/FuzzyJoinFunctionRegistrant.java
index 35d8727..83ebc98 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/FuzzyJoinFunctionRegistrant.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/FuzzyJoinFunctionRegistrant.java
@@ -49,24 +49,24 @@ public class FuzzyJoinFunctionRegistrant implements IFunctionRegistrant {
         fc.add(SimilarityJaccardPrefixCheckDescriptor.FACTORY);
 
         // Spatial
-        fc.addGenerated(SpatialIntersectDescriptor.FACTORY);
+        fc.add(SpatialIntersectDescriptor.FACTORY);
 
         // fuzzyjoin function
-        fc.addGenerated(PrefixLenJaccardDescriptor.FACTORY);
-        fc.addGenerated(WordTokensDescriptor.FACTORY);
-        fc.addGenerated(HashedWordTokensDescriptor.FACTORY);
-        fc.addGenerated(CountHashedWordTokensDescriptor.FACTORY);
-        fc.addGenerated(GramTokensDescriptor.FACTORY);
-        fc.addGenerated(HashedGramTokensDescriptor.FACTORY);
-        fc.addGenerated(CountHashedGramTokensDescriptor.FACTORY);
-        fc.addGenerated(EditDistanceDescriptor.FACTORY);
-        fc.addGenerated(EditDistanceCheckDescriptor.FACTORY);
-        fc.addGenerated(EditDistanceStringIsFilterableDescriptor.FACTORY);
-        fc.addGenerated(EditDistanceListIsFilterableDescriptor.FACTORY);
-        fc.addGenerated(EditDistanceContainsDescriptor.FACTORY);
-        fc.addGenerated(SimilarityJaccardDescriptor.FACTORY);
-        fc.addGenerated(SimilarityJaccardCheckDescriptor.FACTORY);
-        fc.addGenerated(SimilarityJaccardSortedDescriptor.FACTORY);
-        fc.addGenerated(SimilarityJaccardSortedCheckDescriptor.FACTORY);
+        fc.add(PrefixLenJaccardDescriptor.FACTORY);
+        fc.add(WordTokensDescriptor.FACTORY);
+        fc.add(HashedWordTokensDescriptor.FACTORY);
+        fc.add(CountHashedWordTokensDescriptor.FACTORY);
+        fc.add(GramTokensDescriptor.FACTORY);
+        fc.add(HashedGramTokensDescriptor.FACTORY);
+        fc.add(CountHashedGramTokensDescriptor.FACTORY);
+        fc.add(EditDistanceDescriptor.FACTORY);
+        fc.add(EditDistanceCheckDescriptor.FACTORY);
+        fc.add(EditDistanceStringIsFilterableDescriptor.FACTORY);
+        fc.add(EditDistanceListIsFilterableDescriptor.FACTORY);
+        fc.add(EditDistanceContainsDescriptor.FACTORY);
+        fc.add(SimilarityJaccardDescriptor.FACTORY);
+        fc.add(SimilarityJaccardCheckDescriptor.FACTORY);
+        fc.add(SimilarityJaccardSortedDescriptor.FACTORY);
+        fc.add(SimilarityJaccardSortedCheckDescriptor.FACTORY);
     }
 }
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceCheckEvaluator.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceCheckEvaluator.java
index 62e4732..b2d064e 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceCheckEvaluator.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceCheckEvaluator.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -66,12 +67,17 @@ public class EditDistanceCheckEvaluator extends EditDistanceEvaluator {
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         resultStorage.reset();
         firstStringEval.evaluate(tuple, argPtr1);
+        secondStringEval.evaluate(tuple, argPtr2);
+        edThreshEval.evaluate(tuple, argPtrThreshold);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr1, argPtr2, argPtrThreshold)) {
+            return;
+        }
+
         firstTypeTag =
                 EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset()]);
-        secondStringEval.evaluate(tuple, argPtr2);
         secondTypeTag =
                 EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset()]);
-        edThreshEval.evaluate(tuple, argPtrThreshold);
 
         if (!checkArgTypes(firstTypeTag, secondTypeTag)) {
             result.set(resultStorage);
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceEvaluator.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceEvaluator.java
index cc103e0..52ed298 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceEvaluator.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceEvaluator.java
@@ -29,6 +29,7 @@ import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.IncompatibleTypeException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.asterix.runtime.exceptions.UnsupportedItemTypeException;
@@ -79,9 +80,14 @@ public class EditDistanceEvaluator implements IScalarEvaluator {
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         resultStorage.reset();
         firstStringEval.evaluate(tuple, argPtr1);
+        secondStringEval.evaluate(tuple, argPtr2);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr1, argPtr2)) {
+            return;
+        }
+
         firstTypeTag =
                 EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset()]);
-        secondStringEval.evaluate(tuple, argPtr2);
         secondTypeTag =
                 EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset()]);
 
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/GramTokensEvaluator.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/GramTokensEvaluator.java
index d60c311..6d972ee 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/GramTokensEvaluator.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/GramTokensEvaluator.java
@@ -27,6 +27,7 @@ import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.types.AOrderedListType;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -72,6 +73,10 @@ public class GramTokensEvaluator implements IScalarEvaluator {
         gramLengthEval.evaluate(tuple, gramLengthArg);
         prePostEval.evaluate(tuple, prePostArg);
 
+        if (PointableHelper.checkAndSetMissingOrNull(result, stringArg, gramLengthArg, prePostArg)) {
+            return;
+        }
+
         int gramLength = ATypeHierarchy.getIntegerValue(BuiltinFunctions.GRAM_TOKENS.getName(), 1,
                 gramLengthArg.getByteArray(), gramLengthArg.getStartOffset());
         tokenizer.setGramlength(gramLength);
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardCheckEvaluator.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardCheckEvaluator.java
index 19f7869..184e33b 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardCheckEvaluator.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardCheckEvaluator.java
@@ -27,6 +27,7 @@ import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.types.AOrderedListType;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -68,6 +69,10 @@ public class SimilarityJaccardCheckEvaluator extends SimilarityJaccardEvaluator
         secondOrdListEval.evaluate(tuple, argPtr2);
         jaccThreshEval.evaluate(tuple, jaccThreshPointable);
 
+        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr1, argPtr2, jaccThreshPointable)) {
+            return;
+        }
+
         firstTypeTag =
                 EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset()]);
         secondTypeTag =
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardEvaluator.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardEvaluator.java
index 29d5eb3..ec86efe 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardEvaluator.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardEvaluator.java
@@ -32,6 +32,7 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.runtime.evaluators.functions.BinaryHashMap;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -107,6 +108,10 @@ public class SimilarityJaccardEvaluator implements IScalarEvaluator {
         firstOrdListEval.evaluate(tuple, argPtr1);
         secondOrdListEval.evaluate(tuple, argPtr2);
 
+        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr1, argPtr2)) {
+            return;
+        }
+
         firstTypeTag =
                 EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset()]);
         secondTypeTag =
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/WordTokensEvaluator.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/WordTokensEvaluator.java
index 2ee5a96..938b312 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/WordTokensEvaluator.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/common/WordTokensEvaluator.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import org.apache.asterix.builders.OrderedListBuilder;
 import org.apache.asterix.om.types.AOrderedListType;
 import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -55,6 +56,11 @@ public class WordTokensEvaluator implements IScalarEvaluator {
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         resultStorage.reset();
         stringEval.evaluate(tuple, argPtr);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+            return;
+        }
+
         tokenizer.reset(argPtr.getByteArray(), argPtr.getStartOffset(), argPtr.getLength());
         try {
             listBuilder.reset(listType);
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceListIsFilterableDescriptor.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceListIsFilterableDescriptor.java
index 70903cb..657e039 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceListIsFilterableDescriptor.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceListIsFilterableDescriptor.java
@@ -108,6 +108,10 @@ public class EditDistanceListIsFilterableDescriptor extends AbstractScalarFuncti
             listEval.evaluate(tuple, listPtr);
             edThreshEval.evaluate(tuple, edThreshPtr);
 
+            if (PointableHelper.checkAndSetMissingOrNull(result, listPtr, edThreshPtr)) {
+                return;
+            }
+
             // Check type and compute string length.
             byte[] bytes = listPtr.getByteArray();
             int offset = listPtr.getStartOffset();
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceStringIsFilterableEvaluator.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceStringIsFilterableEvaluator.java
index b41479c..bebac59 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceStringIsFilterableEvaluator.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceStringIsFilterableEvaluator.java
@@ -78,6 +78,10 @@ public class EditDistanceStringIsFilterableEvaluator implements IScalarEvaluator
         gramLenEval.evaluate(tuple, gramLenPtr);
         usePrePostEval.evaluate(tuple, usePrePostPtr);
 
+        if (PointableHelper.checkAndSetMissingOrNull(result, stringPtr, edThreshPtr, gramLenPtr, usePrePostPtr)) {
+            return;
+        }
+
         // Check type and compute string length.
         byte typeTag = stringPtr.getByteArray()[stringPtr.getStartOffset()];
         if (typeTag != ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/PrefixLenJaccardDescriptor.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/PrefixLenJaccardDescriptor.java
index d3fc6fc..a5997b4 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/PrefixLenJaccardDescriptor.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/PrefixLenJaccardDescriptor.java
@@ -87,6 +87,10 @@ public class PrefixLenJaccardDescriptor extends AbstractScalarFunctionDynamicDes
                         evalLen.evaluate(tuple, lenPtr);
                         evalThreshold.evaluate(tuple, thresholdPtr);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, lenPtr, thresholdPtr)) {
+                            return;
+                        }
+
                         // length
                         int length = ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 0, lenPtr.getByteArray(),
                                 lenPtr.getStartOffset());
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java
index 67e519f..e025c85 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java
@@ -769,6 +769,10 @@ public class SpatialIntersectDescriptor extends AbstractScalarFunctionDynamicDes
                         eval0.evaluate(tuple, inputArg0);
                         eval1.evaluate(tuple, inputArg1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0, inputArg1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = inputArg0.getByteArray();
                         byte[] bytes1 = inputArg1.getByteArray();
                         int offset0 = inputArg0.getStartOffset();
diff --git a/asterixdb/asterix-runtime/pom.xml b/asterixdb/asterix-runtime/pom.xml
index 7b6faf0..196a52f 100644
--- a/asterixdb/asterix-runtime/pom.xml
+++ b/asterixdb/asterix-runtime/pom.xml
@@ -35,55 +35,6 @@
       <comments>A business-friendly OSS license</comments>
     </license>
   </licenses>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.asterix</groupId>
-        <artifactId>asterix-evaluator-generator-maven-plugin</artifactId>
-        <version>${project.version}</version>
-        <configuration>
-          <evaluatorPackagePrefix>org.apache.asterix.runtime.evaluators</evaluatorPackagePrefix>
-        </configuration>
-        <executions>
-          <execution>
-            <id>generate-evaluator</id>
-            <phase>process-classes</phase>
-            <goals>
-              <goal>generate-evaluator</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.eclipse.m2e</groupId>
-          <artifactId>lifecycle-mapping</artifactId>
-          <version>1.0.0</version>
-          <configuration>
-            <lifecycleMappingMetadata>
-              <pluginExecutions>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>org.apache.asterix</groupId>
-                    <artifactId>asterix-evaluator-generator-maven-plugin</artifactId>
-                    <versionRange>[0.0,)</versionRange>
-                    <goals>
-                      <goal>generate-evaluator</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <ignore />
-                  </action>
-                </pluginExecution>
-              </pluginExecutions>
-            </lifecycleMappingMetadata>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-  </build>
   <dependencies>
     <dependency>
       <groupId>org.apache.asterix</groupId>
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleCenterAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleCenterAccessor.java
index 16dbbd4..cc0918f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleCenterAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleCenterAccessor.java
@@ -33,6 +33,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -78,6 +79,11 @@ public class CircleCenterAccessor extends AbstractScalarFunctionDynamicDescripto
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
                         resultStorage.reset();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleRadiusAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleRadiusAccessor.java
index e017416..31a8c82 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleRadiusAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleRadiusAccessor.java
@@ -32,6 +32,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -76,6 +77,11 @@ public class CircleRadiusAccessor extends AbstractScalarFunctionDynamicDescripto
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
                         resultStorage.reset();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/LineRectanglePolygonAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/LineRectanglePolygonAccessor.java
index 60ee118..0be9d29 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/LineRectanglePolygonAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/LineRectanglePolygonAccessor.java
@@ -38,6 +38,7 @@ import org.apache.asterix.om.types.AOrderedListType;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -86,6 +87,11 @@ public class LineRectanglePolygonAccessor extends AbstractScalarFunctionDynamicD
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
                         resultStorage.reset();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointXCoordinateAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointXCoordinateAccessor.java
index 7db8065..169161b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointXCoordinateAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointXCoordinateAccessor.java
@@ -33,6 +33,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -76,6 +77,11 @@ public class PointXCoordinateAccessor extends AbstractScalarFunctionDynamicDescr
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointYCoordinateAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointYCoordinateAccessor.java
index c9415e5..84d4b04 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointYCoordinateAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointYCoordinateAccessor.java
@@ -33,6 +33,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -80,6 +81,11 @@ public class PointYCoordinateAccessor extends AbstractScalarFunctionDynamicDescr
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalDayAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalDayAccessor.java
index 5a0f633..6fc4823 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalDayAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalDayAccessor.java
@@ -35,6 +35,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -86,6 +87,11 @@ public class TemporalDayAccessor extends AbstractScalarFunctionDynamicDescriptor
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalHourAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalHourAccessor.java
index 2727bb2..e8ed71a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalHourAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalHourAccessor.java
@@ -35,6 +35,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -88,6 +89,11 @@ public class TemporalHourAccessor extends AbstractScalarFunctionDynamicDescripto
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndAccessor.java
index 98d6a9d..1c1b515 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndAccessor.java
@@ -35,6 +35,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -90,6 +91,11 @@ public class TemporalIntervalEndAccessor extends AbstractScalarFunctionDynamicDe
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDateAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDateAccessor.java
index 909b657..202f3f3 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDateAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDateAccessor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -78,6 +79,11 @@ public class TemporalIntervalEndDateAccessor extends AbstractScalarFunctionDynam
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDatetimeAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDatetimeAccessor.java
index a62a8a8..c2e54d0 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDatetimeAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDatetimeAccessor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -80,6 +81,11 @@ public class TemporalIntervalEndDatetimeAccessor extends AbstractScalarFunctionD
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndTimeAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndTimeAccessor.java
index 4d545e8..c70a995 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndTimeAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndTimeAccessor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -77,6 +78,11 @@ public class TemporalIntervalEndTimeAccessor extends AbstractScalarFunctionDynam
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartAccessor.java
index b209139..73da65a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartAccessor.java
@@ -35,6 +35,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -90,6 +91,11 @@ public class TemporalIntervalStartAccessor extends AbstractScalarFunctionDynamic
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDateAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDateAccessor.java
index 901d685..e981466 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDateAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDateAccessor.java
@@ -33,6 +33,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -80,6 +81,11 @@ public class TemporalIntervalStartDateAccessor extends AbstractScalarFunctionDyn
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDatetimeAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDatetimeAccessor.java
index 63cd481..2b4ad55 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDatetimeAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDatetimeAccessor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -77,6 +78,11 @@ public class TemporalIntervalStartDatetimeAccessor extends AbstractScalarFunctio
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartTimeAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartTimeAccessor.java
index 9a1b86f..a3f7691 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartTimeAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartTimeAccessor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -78,6 +79,11 @@ public class TemporalIntervalStartTimeAccessor extends AbstractScalarFunctionDyn
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMillisecondAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMillisecondAccessor.java
index 0bf8b9e..bb9ee8d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMillisecondAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMillisecondAccessor.java
@@ -35,6 +35,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -86,6 +87,11 @@ public class TemporalMillisecondAccessor extends AbstractScalarFunctionDynamicDe
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMinuteAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMinuteAccessor.java
index 9022399..12fe896 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMinuteAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMinuteAccessor.java
@@ -35,6 +35,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -89,6 +90,11 @@ public class TemporalMinuteAccessor extends AbstractScalarFunctionDynamicDescrip
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMonthAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMonthAccessor.java
index 6759667..be3f64c 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMonthAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMonthAccessor.java
@@ -35,6 +35,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -86,6 +87,11 @@ public class TemporalMonthAccessor extends AbstractScalarFunctionDynamicDescript
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalSecondAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalSecondAccessor.java
index 372924c..c23ca0a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalSecondAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalSecondAccessor.java
@@ -35,6 +35,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -86,6 +87,11 @@ public class TemporalSecondAccessor extends AbstractScalarFunctionDynamicDescrip
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalYearAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalYearAccessor.java
index c5fe9f0..6bdad11 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalYearAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalYearAccessor.java
@@ -35,6 +35,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -87,6 +88,11 @@ public class TemporalYearAccessor extends AbstractScalarFunctionDynamicDescripto
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int startOffset = argPtr.getStartOffset();
                         int len = argPtr.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/AbstractTypeCheckEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/AbstractTypeCheckEvaluator.java
index 0fa6c0e..203c664 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/AbstractTypeCheckEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/AbstractTypeCheckEvaluator.java
@@ -39,12 +39,12 @@ public abstract class AbstractTypeCheckEvaluator implements IScalarEvaluator {
         MISSING
     }
 
-    private static final byte[] MISSING_BYTES = new byte[] { ATypeTag.SERIALIZED_MISSING_TYPE_TAG };
-    private final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
-    private final DataOutput out = resultStorage.getDataOutput();
-    private final IPointable argPtr = new VoidPointable();
-    private final IScalarEvaluator eval;
-    private static final AObjectSerializerDeserializer aObjSerDer = AObjectSerializerDeserializer.INSTANCE;
+    protected static final byte[] MISSING_BYTES = new byte[] { ATypeTag.SERIALIZED_MISSING_TYPE_TAG };
+    protected final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
+    protected final DataOutput out = resultStorage.getDataOutput();
+    protected final IPointable argPtr = new VoidPointable();
+    protected final IScalarEvaluator eval;
+    protected static final AObjectSerializerDeserializer aObjSerDer = AObjectSerializerDeserializer.INSTANCE;
 
     public AbstractTypeCheckEvaluator(IScalarEvaluator argEval) {
         this.eval = argEval;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/CreateMBREvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/CreateMBREvalFactory.java
index 9fe6474..5a0fa64 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/CreateMBREvalFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/CreateMBREvalFactory.java
@@ -33,6 +33,7 @@ import org.apache.asterix.dataflow.data.nontagged.serde.ARectangleSerializerDese
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.EnumDeserializer;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -77,6 +78,11 @@ public class CreateMBREvalFactory implements IScalarEvaluatorFactory {
                 eval0.evaluate(tuple, inputArg0);
                 eval1.evaluate(tuple, inputArg1);
                 eval2.evaluate(tuple, inputArg2);
+
+                if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0, inputArg1, inputArg2)) {
+                    return;
+                }
+
                 byte[] data0 = inputArg0.getByteArray();
                 byte[] data1 = inputArg1.getByteArray();
                 byte[] data2 = inputArg2.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/FullTextContainsEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/FullTextContainsEvaluator.java
index fd429d0..6634bf4 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/FullTextContainsEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/FullTextContainsEvaluator.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
 import org.apache.asterix.runtime.evaluators.functions.FullTextContainsDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -126,18 +127,44 @@ public class FullTextContainsEvaluator implements IScalarEvaluator {
 
     @Override
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+        boolean isReturnNull = false;
         resultStorage.reset();
 
         evalLeft.evaluate(tuple, argLeft);
-        argLeft.getValue(outLeft);
         evalRight.evaluate(tuple, argRight);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, argLeft, argRight)) {
+            if (result.getByteArray()[0] == ATypeTag.SERIALIZED_MISSING_TYPE_TAG) {
+                return;
+            }
+
+            // null value, but check other arguments for missing first (higher priority)
+            isReturnNull = true;
+        }
+
+        argLeft.getValue(outLeft);
         argRight.getValue(outRight);
 
         for (int i = 0; i < optionArgsLength; i++) {
             evalOptions[i].evaluate(tuple, argOptions[i]);
+
+            if (PointableHelper.checkAndSetMissingOrNull(result, argOptions[i])) {
+                if (result.getByteArray()[0] == ATypeTag.SERIALIZED_MISSING_TYPE_TAG) {
+                    return;
+                }
+
+                // null value, but check other arguments for missing first (higher priority)
+                isReturnNull = true;
+            }
+
             argOptions[i].getValue(outOptions[i]);
         }
 
+        if (isReturnNull) {
+            PointableHelper.setNull(result);
+            return;
+        }
+
         ATypeTag typeTag1 = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argLeft.getTag());
         ATypeTag typeTag2 = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argRight.getTag());
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java
index 0134e6b..f95c738 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java
@@ -43,6 +43,7 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.algebricks.runtime.evaluators.ConstantEvalFactory;
@@ -97,6 +98,11 @@ public abstract class AbstractComparisonEvaluator implements IScalarEvaluator {
         // Evaluates input args.
         evalLeft.evaluate(tuple, argLeft);
         evalRight.evaluate(tuple, argRight);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, argLeft, argRight)) {
+            return;
+        }
+
         evaluateImpl(result);
     }
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABinaryHexStringConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABinaryHexStringConstructorDescriptor.java
index dd25e49..30f619b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABinaryHexStringConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABinaryHexStringConstructorDescriptor.java
@@ -27,6 +27,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -91,6 +92,11 @@ public class ABinaryHexStringConstructorDescriptor extends AbstractScalarFunctio
         public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
             try {
                 eval.evaluate(tuple, inputArg);
+
+                if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                    return;
+                }
+
                 byte[] binary = inputArg.getByteArray();
                 int startOffset = inputArg.getStartOffset();
                 int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ACircleConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ACircleConstructorDescriptor.java
index 0649fc8..c0b2544 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ACircleConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ACircleConstructorDescriptor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -79,6 +80,11 @@ public class ACircleConstructorDescriptor extends AbstractScalarFunctionDynamicD
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java
index 9849cef..742f456 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java
@@ -32,6 +32,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -80,6 +81,11 @@ public class ADateConstructorDescriptor extends AbstractScalarFunctionDynamicDes
                         try {
                             resultStorage.reset();
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java
index 9b71d4b..cbcf343 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java
@@ -32,6 +32,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -78,6 +79,11 @@ public class ADateTimeConstructorDescriptor extends AbstractScalarFunctionDynami
                         try {
                             resultStorage.reset();
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADayTimeDurationConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADayTimeDurationConstructorDescriptor.java
index f6c6f09..e53e8d4 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADayTimeDurationConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADayTimeDurationConstructorDescriptor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -80,6 +81,11 @@ public class ADayTimeDurationConstructorDescriptor extends AbstractScalarFunctio
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADurationConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADurationConstructorDescriptor.java
index f3d1ba8..8ccb217 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADurationConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADurationConstructorDescriptor.java
@@ -32,6 +32,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -77,6 +78,11 @@ public class ADurationConstructorDescriptor extends AbstractScalarFunctionDynami
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AFloatConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AFloatConstructorDescriptor.java
index 09f2594..b6c69a5 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AFloatConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AFloatConstructorDescriptor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
 import org.apache.asterix.runtime.evaluators.common.NumberUtils;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -76,6 +77,11 @@ public class AFloatConstructorDescriptor extends AbstractScalarFunctionDynamicDe
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt16ConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt16ConstructorDescriptor.java
index ae91c46..d56bbbc 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt16ConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt16ConstructorDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -79,6 +80,11 @@ public class AInt16ConstructorDescriptor extends AbstractScalarFunctionDynamicDe
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int startOffset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt32ConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt32ConstructorDescriptor.java
index b4f1ae8..8f440bc 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt32ConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt32ConstructorDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -78,6 +79,11 @@ public class AInt32ConstructorDescriptor extends AbstractScalarFunctionDynamicDe
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int startOffset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt8ConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt8ConstructorDescriptor.java
index 3132640..0764b9c 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt8ConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt8ConstructorDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -79,6 +80,11 @@ public class AInt8ConstructorDescriptor extends AbstractScalarFunctionDynamicDes
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int startOffset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalConstructorDescriptor.java
index f103192..26fd672 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalConstructorDescriptor.java
@@ -34,6 +34,7 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.IncompatibleTypeException;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.UnsupportedItemTypeException;
@@ -83,6 +84,10 @@ public class AIntervalConstructorDescriptor extends AbstractScalarFunctionDynami
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         byte[] bytes1 = argPtr1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java
index 185da45..af3dcf7 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java
@@ -40,6 +40,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -95,6 +96,10 @@ public class AIntervalStartFromDateConstructorDescriptor extends AbstractScalarF
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         int len0 = argPtr0.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java
index 67a6832..e2045a2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java
@@ -40,6 +40,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -91,6 +92,10 @@ public class AIntervalStartFromDateTimeConstructorDescriptor extends AbstractSca
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         int len0 = argPtr0.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromTimeConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromTimeConstructorDescriptor.java
index a71c665..c880f2d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromTimeConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromTimeConstructorDescriptor.java
@@ -39,6 +39,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -92,6 +93,10 @@ public class AIntervalStartFromTimeConstructorDescriptor extends AbstractScalarF
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         int len0 = argPtr0.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ALineConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ALineConstructorDescriptor.java
index 39bb515..097d7c3 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ALineConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ALineConstructorDescriptor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -79,6 +80,11 @@ public class ALineConstructorDescriptor extends AbstractScalarFunctionDynamicDes
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APoint3DConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APoint3DConstructorDescriptor.java
index 4b8b0bf..bfd762f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APoint3DConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APoint3DConstructorDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -77,6 +78,11 @@ public class APoint3DConstructorDescriptor extends AbstractScalarFunctionDynamic
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APointConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APointConstructorDescriptor.java
index 0a7c381..f48ec3f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APointConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APointConstructorDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -76,6 +77,11 @@ public class APointConstructorDescriptor extends AbstractScalarFunctionDynamicDe
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APolygonConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APolygonConstructorDescriptor.java
index f88713c..f147d8b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APolygonConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APolygonConstructorDescriptor.java
@@ -28,6 +28,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -73,6 +74,11 @@ public class APolygonConstructorDescriptor extends AbstractScalarFunctionDynamic
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ARectangleConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ARectangleConstructorDescriptor.java
index 69cd147..dea61f3 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ARectangleConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ARectangleConstructorDescriptor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -78,6 +79,11 @@ public class ARectangleConstructorDescriptor extends AbstractScalarFunctionDynam
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java
index 9b28fb6..e13d7f4 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java
@@ -32,6 +32,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -78,6 +79,11 @@ public class ATimeConstructorDescriptor extends AbstractScalarFunctionDynamicDes
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
index 53c36bc..f8d88f2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -82,6 +83,11 @@ public class AUUIDFromStringConstructorDescriptor extends AbstractScalarFunction
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int start = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AYearMonthDurationConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AYearMonthDurationConstructorDescriptor.java
index 60344fc..8ded0cf 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AYearMonthDurationConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AYearMonthDurationConstructorDescriptor.java
@@ -32,6 +32,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -80,6 +81,11 @@ public class AYearMonthDurationConstructorDescriptor extends AbstractScalarFunct
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         try {
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
                             int len = inputArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractBooleanConstructorEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractBooleanConstructorEvaluator.java
index b78eb54..7e1e35b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractBooleanConstructorEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractBooleanConstructorEvaluator.java
@@ -27,6 +27,7 @@ import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -71,6 +72,11 @@ public abstract class AbstractBooleanConstructorEvaluator implements IScalarEval
         try {
             inputEval.evaluate(tuple, inputArg);
             resultStorage.reset();
+
+            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                return;
+            }
+
             evaluateImpl(result);
         } catch (IOException e) {
             throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e, ATypeTag.SERIALIZED_BOOLEAN_TYPE_TAG);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractDoubleConstructorEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractDoubleConstructorEvaluator.java
index 5354fc0..04220ce 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractDoubleConstructorEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractDoubleConstructorEvaluator.java
@@ -28,6 +28,7 @@ import org.apache.asterix.om.base.AMutableDouble;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.common.NumberUtils;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -69,6 +70,11 @@ public abstract class AbstractDoubleConstructorEvaluator implements IScalarEvalu
         try {
             inputEval.evaluate(tuple, inputArg);
             resultStorage.reset();
+
+            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                return;
+            }
+
             evaluateImpl(result);
         } catch (IOException e) {
             throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e, ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractInt64ConstructorEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractInt64ConstructorEvaluator.java
index a49c1ee..cab2db4 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractInt64ConstructorEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractInt64ConstructorEvaluator.java
@@ -28,6 +28,7 @@ import org.apache.asterix.om.base.AMutableInt64;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.common.NumberUtils;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -69,6 +70,11 @@ public abstract class AbstractInt64ConstructorEvaluator implements IScalarEvalua
         try {
             inputEval.evaluate(tuple, inputArg);
             resultStorage.reset();
+
+            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                return;
+            }
+
             evaluateImpl(result);
         } catch (IOException e) {
             throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e, ATypeTag.SERIALIZED_INT64_TYPE_TAG);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractStringConstructorEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractStringConstructorEvaluator.java
index 9f2dc2d..5ce7853 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractStringConstructorEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractStringConstructorEvaluator.java
@@ -31,6 +31,7 @@ import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserial
 import org.apache.asterix.dataflow.data.nontagged.serde.AInt8SerializerDeserializer;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.common.NumberUtils;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.UnsupportedTypeException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -69,6 +70,11 @@ public abstract class AbstractStringConstructorEvaluator implements IScalarEvalu
         try {
             inputEval.evaluate(tuple, inputArg);
             resultStorage.reset();
+
+            if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                return;
+            }
+
             evaluateImpl(result);
         } catch (IOException e) {
             throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e, ATypeTag.SERIALIZED_STRING_TYPE_TAG);
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 edbfbad..ca09929 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
@@ -83,17 +83,28 @@ public abstract class AbstractArrayProcessArraysEval implements IScalarEvaluator
     @Override
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         byte listArgType;
-        boolean returnNull = false;
+        boolean isReturnNull = false;
         AbstractCollectionType outList = null;
         ATypeTag listTag;
+
         try {
             for (int i = 0; i < listsEval.length; i++) {
                 listsEval[i].evaluate(tuple, tempList);
-                if (!returnNull) {
+
+                if (PointableHelper.checkAndSetMissingOrNull(result, tempList)) {
+                    if (result.getByteArray()[0] == ATypeTag.SERIALIZED_MISSING_TYPE_TAG) {
+                        return;
+                    }
+
+                    // null value, but check other arguments for missing first (higher priority)
+                    isReturnNull = true;
+                }
+
+                if (!isReturnNull) {
                     listArgType = tempList.getByteArray()[tempList.getStartOffset()];
                     listTag = ATYPETAGDESERIALIZER.deserialize(listArgType);
                     if (!listTag.isListType()) {
-                        returnNull = true;
+                        isReturnNull = true;
                     } else if (outList != null && outList.getTypeTag() != listTag) {
                         throw new RuntimeDataException(ErrorCode.DIFFERENT_LIST_TYPE_ARGS, sourceLocation);
                     } else {
@@ -107,7 +118,7 @@ public abstract class AbstractArrayProcessArraysEval implements IScalarEvaluator
                 }
             }
 
-            if (returnNull) {
+            if (isReturnNull) {
                 PointableHelper.setNull(result);
                 return;
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayProcessEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayProcessEval.java
index 9cdd32c..f892e2f 100755
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayProcessEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayProcessEval.java
@@ -82,6 +82,11 @@ public abstract class AbstractArrayProcessEval implements IScalarEvaluator {
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         // get the list argument and make sure it's a list
         listArgEval.evaluate(tuple, listArg);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, listArg)) {
+            return;
+        }
+
         byte listArgType = listArg.getByteArray()[listArg.getStartOffset()];
 
         // create the new list with the same type as the input list
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArraySearchEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArraySearchEval.java
index 70ea031..275591e 100755
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArraySearchEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArraySearchEval.java
@@ -71,14 +71,20 @@ public abstract class AbstractArraySearchEval implements IScalarEvaluator {
 
     @Override
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
-        // 1st arg: list
+        // Evaluators
         listEval.evaluate(tuple, listArg);
+        searchedValueEval.evaluate(tuple, searchedValueArg);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, listArg, searchedValueArg)) {
+            return;
+        }
+
+        // 1st arg: list
         byte[] listBytes = listArg.getByteArray();
         int listOffset = listArg.getStartOffset();
 
         // TODO(ali): could be optimized to not evaluate again if the search value evaluator is a constant
         // 2nd arg: value to search for
-        searchedValueEval.evaluate(tuple, searchedValueArg);
         byte[] valueBytes = searchedValueArg.getByteArray();
         int valueOffset = searchedValueArg.getStartOffset();
         int valueLength = searchedValueArg.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArraySliceEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArraySliceEval.java
index 8a70c9c..036447a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArraySliceEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArraySliceEval.java
@@ -131,6 +131,11 @@ public abstract class AbstractArraySliceEval extends AbstractScalarEval {
             endPositionEval.evaluate(tuple, endPositionPointable);
         }
 
+        if (PointableHelper.checkAndSetMissingOrNull(result, listPointable, startPositionPointable,
+                endPositionPointable)) {
+            return;
+        }
+
         // Positions
         int startPositionValue;
         int endPositionValue = 0;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringEval.java
index ea1138e..b1fa1eb 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringEval.java
@@ -70,14 +70,17 @@ public abstract class AbstractBinaryStringEval implements IScalarEvaluator {
     public void evaluate(IFrameTupleReference tuple, IPointable resultPointable) throws HyracksDataException {
         resultStorage.reset();
 
-        // Gets the first argument.
+        // Gets the arguments
         evalLeft.evaluate(tuple, argPtrLeft);
+        evalRight.evaluate(tuple, argPtrSecond);
+
+        if (PointableHelper.checkAndSetMissingOrNull(resultPointable, argPtrLeft, argPtrSecond)) {
+            return;
+        }
+
         byte[] bytes0 = argPtrLeft.getByteArray();
         int offset0 = argPtrLeft.getStartOffset();
         int len0 = argPtrLeft.getLength();
-
-        // Gets the second argument.
-        evalRight.evaluate(tuple, argPtrSecond);
         byte[] bytes1 = argPtrSecond.getByteArray();
         int offset1 = argPtrSecond.getStartOffset();
         int len1 = argPtrSecond.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractNumericArithmeticEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractNumericArithmeticEval.java
index b127799..7520fe9 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractNumericArithmeticEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractNumericArithmeticEval.java
@@ -184,6 +184,10 @@ public abstract class AbstractNumericArithmeticEval extends AbstractScalarFuncti
 
                         resultStorage.reset();
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         ATypeTag argTypeMax = null;
 
                         for (int i = 0; i < 2; i++) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractQuadStringStringEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractQuadStringStringEval.java
index 4825707..756c60d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractQuadStringStringEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractQuadStringStringEval.java
@@ -88,6 +88,10 @@ public abstract class AbstractQuadStringStringEval implements IScalarEvaluator {
         eval2.evaluate(tuple, ptr2);
         eval3.evaluate(tuple, ptr3);
 
+        if (PointableHelper.checkAndSetMissingOrNull(result, ptr0, ptr1, ptr2, ptr3)) {
+            return;
+        }
+
         processArgument(0, ptr0, strPtr0);
         processArgument(1, ptr1, strPtr1);
         processArgument(2, ptr2, strPtr2);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractStringStringStringIntEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractStringStringStringIntEval.java
index c4bd804..eb16423 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractStringStringStringIntEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractStringStringStringIntEval.java
@@ -74,26 +74,28 @@ public abstract class AbstractStringStringStringIntEval implements IScalarEvalua
     @SuppressWarnings("unchecked")
     @Override
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
-        // Gets the first argument.
+        // Gets the arguments
         eval0.evaluate(tuple, argPtrFirst);
+        eval1.evaluate(tuple, argPtrSecond);
+        eval2.evaluate(tuple, argPtrThird);
+        eval3.evaluate(tuple, argPtrFourth);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, argPtrFirst, argPtrSecond, argPtrThird, argPtrFourth)) {
+            return;
+        }
+
         byte[] bytes0 = argPtrFirst.getByteArray();
         int start0 = argPtrFirst.getStartOffset();
         int len0 = argPtrFirst.getLength();
 
-        // Gets the second argument.
-        eval1.evaluate(tuple, argPtrSecond);
         byte[] bytes1 = argPtrSecond.getByteArray();
         int start1 = argPtrSecond.getStartOffset();
         int len1 = argPtrSecond.getLength();
 
-        // Gets the third argument.
-        eval2.evaluate(tuple, argPtrThird);
         byte[] bytes2 = argPtrThird.getByteArray();
         int start2 = argPtrThird.getStartOffset();
         int len2 = argPtrThird.getLength();
 
-        // Gets the fourth argument.
-        eval3.evaluate(tuple, argPtrFourth);
         byte[] bytes3 = argPtrFourth.getByteArray();
         int start3 = argPtrFourth.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringEval.java
index a098c7d..5377946 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringEval.java
@@ -71,20 +71,22 @@ abstract class AbstractTripleStringEval implements IScalarEvaluator {
     @SuppressWarnings("unchecked")
     @Override
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
-        // Gets the first argument.
+        // Gets the arguments
         eval0.evaluate(tuple, argPtrFirst);
+        eval1.evaluate(tuple, argPtrSecond);
+        eval2.evaluate(tuple, argPtrThird);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, argPtrFirst, argPtrSecond, argPtrThird)) {
+            return;
+        }
+
+        // Arguments
         byte[] bytes0 = argPtrFirst.getByteArray();
         int start0 = argPtrFirst.getStartOffset();
         int len0 = argPtrFirst.getLength();
-
-        // Gets the second argument.
-        eval1.evaluate(tuple, argPtrSecond);
         byte[] bytes1 = argPtrSecond.getByteArray();
         int start1 = argPtrSecond.getStartOffset();
         int len1 = argPtrSecond.getLength();
-
-        // Gets the third argument.
-        eval2.evaluate(tuple, argPtrThird);
         byte[] bytes2 = argPtrThird.getByteArray();
         int start2 = argPtrThird.getStartOffset();
         int len2 = argPtrThird.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericFunctionEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericFunctionEval.java
index d2a4164..2060c58 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericFunctionEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericFunctionEval.java
@@ -107,6 +107,11 @@ abstract class AbstractUnaryNumericFunctionEval implements IScalarEvaluator {
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         resultStorage.reset();
         argEval.evaluate(tuple, argPtr);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+            return;
+        }
+
         byte[] data = argPtr.getByteArray();
         int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryStringStringEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryStringStringEval.java
index fca1068..0bfe1c2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryStringStringEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryStringStringEval.java
@@ -64,6 +64,11 @@ abstract class AbstractUnaryStringStringEval implements IScalarEvaluator {
     public void evaluate(IFrameTupleReference tuple, IPointable resultPointable) throws HyracksDataException {
         resultStorage.reset();
         argEval.evaluate(tuple, argPtr);
+
+        if (PointableHelper.checkAndSetMissingOrNull(resultPointable, argPtr)) {
+            return;
+        }
+
         byte[] argBytes = argPtr.getByteArray();
         int offset = argPtr.getStartOffset();
         byte inputTypeTag = argBytes[offset];
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AnyCollectionMemberDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AnyCollectionMemberDescriptor.java
index b03dafa..be5cd0e 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AnyCollectionMemberDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AnyCollectionMemberDescriptor.java
@@ -90,6 +90,11 @@ public class AnyCollectionMemberDescriptor extends AbstractScalarFunctionDynamic
 
                     resultStorage.reset();
                     evalList.evaluate(tuple, inputArgList);
+
+                    if (PointableHelper.checkAndSetMissingOrNull(result, inputArgList)) {
+                        return;
+                    }
+
                     byte[] serList = inputArgList.getByteArray();
                     int offset = inputArgList.getStartOffset();
 
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 fc8fc84..3fd6afb 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
@@ -151,6 +151,10 @@ public class ArrayFlattenDescriptor extends AbstractScalarFunctionDynamicDescrip
             // 2nd arg: depthArg
             depthEval.evaluate(tuple, depthArg);
 
+            if (PointableHelper.checkAndSetMissingOrNull(result, pointable, depthArg)) {
+                return;
+            }
+
             ATypeTag listType = ATYPETAGDESERIALIZER.deserialize(pointable.getByteArray()[pointable.getStartOffset()]);
             if (!ATypeHierarchy.isCompatible(ATYPETAGDESERIALIZER.deserialize(depthArg.getTag()), ATypeTag.DOUBLE)
                     || !listType.isListType()) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIfNullDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIfNullDescriptor.java
index 53853e2..24ec182 100755
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIfNullDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIfNullDescriptor.java
@@ -100,6 +100,11 @@ public class ArrayIfNullDescriptor extends AbstractScalarFunctionDynamicDescript
         public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
             // get the list argument and make sure it's a list
             listArgEval.evaluate(tuple, listArg);
+
+            if (PointableHelper.checkAndSetMissingOrNull(result, listArg)) {
+                return;
+            }
+
             byte[] listBytes = listArg.getByteArray();
             int offset = listArg.getStartOffset();
             ATypeTag listType = ATYPETAGDESERIALIZER.deserialize(listBytes[offset]);
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 f043294..12ddfdd 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
@@ -210,7 +210,7 @@ public class ArrayIntersectDescriptor extends AbstractScalarFunctionDynamicDescr
         @Override
         public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
             byte listArgType;
-            boolean returnNull = false;
+            boolean isReturnNull = false;
             AbstractCollectionType outList = null;
             ATypeTag listTag;
             int minListIndex = 0;
@@ -221,11 +221,21 @@ public class ArrayIntersectDescriptor extends AbstractScalarFunctionDynamicDescr
             try {
                 for (int i = 0; i < listsEval.length; i++) {
                     listsEval[i].evaluate(tuple, pointable);
-                    if (!returnNull) {
+
+                    if (PointableHelper.checkAndSetMissingOrNull(result, pointable)) {
+                        if (result.getByteArray()[0] == ATypeTag.SERIALIZED_MISSING_TYPE_TAG) {
+                            return;
+                        }
+
+                        // null value, but check other arguments for missing first (higher priority)
+                        isReturnNull = true;
+                    }
+
+                    if (!isReturnNull) {
                         listArgType = pointable.getByteArray()[pointable.getStartOffset()];
                         listTag = ATYPETAGDESERIALIZER.deserialize(listArgType);
                         if (!listTag.isListType()) {
-                            returnNull = true;
+                            isReturnNull = true;
                         } else if (outList != null && outList.getTypeTag() != listTag) {
                             throw new RuntimeDataException(ErrorCode.DIFFERENT_LIST_TYPE_ARGS, sourceLoc);
                         } else {
@@ -245,7 +255,7 @@ public class ArrayIntersectDescriptor extends AbstractScalarFunctionDynamicDescr
                     }
                 }
 
-                if (returnNull) {
+                if (isReturnNull) {
                     PointableHelper.setNull(result);
                     return;
                 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRangeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRangeDescriptor.java
index 902ec7a..5551d95 100755
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRangeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRangeDescriptor.java
@@ -119,6 +119,14 @@ public class ArrayRangeDescriptor extends AbstractScalarFunctionDynamicDescripto
         public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
             startNumEval.evaluate(tuple, start);
             endNumEval.evaluate(tuple, end);
+            if (stepNumEval != null) {
+                stepNumEval.evaluate(tuple, step);
+            }
+
+            if (PointableHelper.checkAndSetMissingOrNull(result, start, end, step)) {
+                return;
+            }
+
             String n = getIdentifier().getName();
             ATypeTag startTag = ATYPETAGDESERIALIZER.deserialize(start.getTag());
             ATypeTag endTag = ATYPETAGDESERIALIZER.deserialize(end.getTag());
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRepeatDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRepeatDescriptor.java
index 5e50fe0..fa3efc2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRepeatDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRepeatDescriptor.java
@@ -124,6 +124,11 @@ public class ArrayRepeatDescriptor extends AbstractScalarFunctionDynamicDescript
 
             // 2nd arg: number of repetitions
             repeatEval.evaluate(tuple, repeatArg);
+
+            if (PointableHelper.checkAndSetMissingOrNull(result, repeatedValueArg, repeatArg)) {
+                return;
+            }
+
             repeatArgValue.set(repeatArg);
             if (!ATypeHierarchy.isCompatible(ATypeTag.DOUBLE, ATypeTag.VALUE_TYPE_MAPPING[repeatArgValue.getTag()])) {
                 PointableHelper.setNull(result);
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 a247639..9b74616 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
@@ -208,6 +208,11 @@ public class ArrayStarDescriptor extends AbstractScalarFunctionDynamicDescriptor
         public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
             storage.reset();
             listEval.evaluate(tuple, tempList);
+
+            if (PointableHelper.checkAndSetMissingOrNull(result, tempList)) {
+                return;
+            }
+
             ATypeTag listTag = ATYPETAGDESERIALIZER.deserialize(tempList.getByteArray()[tempList.getStartOffset()]);
             if (listTag != ATypeTag.ARRAY) {
                 PointableHelper.setNull(result);
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 b9f693b..e8c2f6e 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
@@ -67,6 +67,11 @@ public class CastTypeEvaluator implements IScalarEvaluator {
     @Override
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         argEvaluator.evaluate(tuple, argPointable);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, argPointable)) {
+            return;
+        }
+
         inputPointable.set(argPointable);
         cast(result);
     }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CodePointToStringDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CodePointToStringDescriptor.java
index 40308fd..a09b291 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CodePointToStringDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CodePointToStringDescriptor.java
@@ -76,6 +76,11 @@ public class CodePointToStringDescriptor extends AbstractScalarFunctionDynamicDe
                         try {
                             resultStorage.reset();
                             evalList.evaluate(tuple, inputArgList);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArgList)) {
+                                return;
+                            }
+
                             byte[] serOrderedList = inputArgList.getByteArray();
                             int offset = inputArgList.getStartOffset();
                             int size;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateCircleDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateCircleDescriptor.java
index 46eed06..d6393ed 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateCircleDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateCircleDescriptor.java
@@ -84,6 +84,10 @@ public class CreateCircleDescriptor extends AbstractScalarFunctionDynamicDescrip
                         eval0.evaluate(tuple, inputArg0);
                         eval1.evaluate(tuple, inputArg1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0, inputArg1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = inputArg0.getByteArray();
                         int offset0 = inputArg0.getStartOffset();
                         byte[] bytes1 = inputArg1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateLineDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateLineDescriptor.java
index 9c38dbe..721cefe 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateLineDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateLineDescriptor.java
@@ -83,6 +83,11 @@ public class CreateLineDescriptor extends AbstractScalarFunctionDynamicDescripto
                         resultStorage.reset();
                         eval0.evaluate(tuple, inputArg0);
                         eval1.evaluate(tuple, inputArg1);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0, inputArg1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = inputArg0.getByteArray();
                         int offset0 = inputArg0.getStartOffset();
                         byte[] bytes1 = inputArg1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreatePointDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreatePointDescriptor.java
index bd5d0a8..a0d1462 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreatePointDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreatePointDescriptor.java
@@ -77,6 +77,10 @@ public class CreatePointDescriptor extends AbstractScalarFunctionDynamicDescript
                         eval0.evaluate(tuple, inputArg0);
                         eval1.evaluate(tuple, inputArg1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0, inputArg1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = inputArg0.getByteArray();
                         int offset0 = inputArg0.getStartOffset();
                         byte[] bytes1 = inputArg1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreatePolygonDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreatePolygonDescriptor.java
index bdb8b94..067fc72 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreatePolygonDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreatePolygonDescriptor.java
@@ -76,6 +76,7 @@ public class CreatePolygonDescriptor extends AbstractScalarFunctionDynamicDescri
                     @SuppressWarnings("unchecked")
                     private final ISerializerDeserializer<ANull> nullSerde =
                             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
+                    @SuppressWarnings("unchecked")
                     private final ISerializerDeserializer<AMissing> missingSerde =
                             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AMISSING);
 
@@ -84,6 +85,11 @@ public class CreatePolygonDescriptor extends AbstractScalarFunctionDynamicDescri
                         try {
                             resultStorage.reset();
                             evalList.evaluate(tuple, inputArgList);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArgList)) {
+                                return;
+                            }
+
                             byte[] listBytes = inputArgList.getByteArray();
                             int offset = inputArgList.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateRectangleDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateRectangleDescriptor.java
index 91756f8..3316c71 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateRectangleDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateRectangleDescriptor.java
@@ -83,6 +83,10 @@ public class CreateRectangleDescriptor extends AbstractScalarFunctionDynamicDesc
                         eval0.evaluate(tuple, inputArg0);
                         eval1.evaluate(tuple, inputArg1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0, inputArg1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = inputArg0.getByteArray();
                         int offset0 = inputArg0.getStartOffset();
                         byte[] bytes1 = inputArg1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/DeepEqualityDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/DeepEqualityDescriptor.java
index c277159..037feae 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/DeepEqualityDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/DeepEqualityDescriptor.java
@@ -98,6 +98,10 @@ public class DeepEqualityDescriptor extends AbstractScalarFunctionDynamicDescrip
                             evalLeft.evaluate(tuple, pointableLeft);
                             evalRight.evaluate(tuple, pointableRight);
 
+                            if (PointableHelper.checkAndSetMissingOrNull(result, pointableLeft, pointableRight)) {
+                                return;
+                            }
+
                             // Using deep equality assessment to assess the equality of the two values
                             boolean isEqual = deepEqualAssessor.isEqual(pointableLeft, pointableRight);
                             ABoolean resultBit = isEqual ? ABoolean.TRUE : ABoolean.FALSE;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GetItemDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GetItemDescriptor.java
index 70b0891..8e1c575 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GetItemDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GetItemDescriptor.java
@@ -92,6 +92,10 @@ public class GetItemDescriptor extends AbstractScalarFunctionDynamicDescriptor {
                         evalList.evaluate(tuple, inputArgList);
                         evalIdx.evaluate(tuple, inputArgIdx);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, inputArgList, inputArgIdx)) {
+                            return;
+                        }
+
                         byte[] serList = inputArgList.getByteArray();
                         int offset = inputArgList.getStartOffset();
                         byte[] indexBytes = inputArgIdx.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsArrayDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsArrayDescriptor.java
index 1b2f8fc..04e6615 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsArrayDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsArrayDescriptor.java
@@ -19,6 +19,7 @@
 
 package org.apache.asterix.runtime.evaluators.functions;
 
+import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
@@ -30,6 +31,8 @@ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 public class IsArrayDescriptor extends AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
@@ -50,6 +53,26 @@ public class IsArrayDescriptor extends AbstractScalarFunctionDynamicDescriptor {
                 final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
                 return new AbstractTypeCheckEvaluator(eval) {
 
+                    // Overridden because other functions using the same class shouldn't perform the missing/null check
+                    @Override
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
+                        Value match = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]);
+                        if (match == Value.MISSING) {
+                            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
+                            return;
+                        }
+                        ABoolean res = match == Value.TRUE ? ABoolean.TRUE : ABoolean.FALSE;
+                        resultStorage.reset();
+                        aObjSerDer.serialize(res, out);
+                        result.set(resultStorage);
+                    }
+
                     @Override
                     protected Value isMatch(byte typeTag) {
                         return typeTag == ATypeTag.SERIALIZED_ORDEREDLIST_TYPE_TAG ? Value.TRUE : Value.FALSE;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsAtomicDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsAtomicDescriptor.java
index 124ffa2..d238271 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsAtomicDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsAtomicDescriptor.java
@@ -19,6 +19,7 @@
 
 package org.apache.asterix.runtime.evaluators.functions;
 
+import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
@@ -30,6 +31,8 @@ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 public class IsAtomicDescriptor extends AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
@@ -49,6 +52,30 @@ public class IsAtomicDescriptor extends AbstractScalarFunctionDynamicDescriptor
             public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException {
                 final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
                 return new AbstractTypeCheckEvaluator(eval) {
+
+                    // TODO(Hussain) Consider making a different AbstractTypeCheckEvaluator class for the methods
+                    // that require the Missing/Null checks, that should keep the code cleaner. Currently, this is the
+                    // scenario because some functions require Missing/Null checks while others don't, and they're
+                    // extending the same base class, so the evaluate(...) needs to be overridden
+                    @Override
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
+                        Value match = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]);
+                        if (match == Value.MISSING) {
+                            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
+                            return;
+                        }
+                        ABoolean res = match == Value.TRUE ? ABoolean.TRUE : ABoolean.FALSE;
+                        resultStorage.reset();
+                        aObjSerDer.serialize(res, out);
+                        result.set(resultStorage);
+                    }
+
                     @Override
                     protected Value isMatch(byte typeTag) {
                         return EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(typeTag).isDerivedType() ? Value.FALSE
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsBooleanDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsBooleanDescriptor.java
index cd5945a..39e2f9d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsBooleanDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsBooleanDescriptor.java
@@ -19,6 +19,7 @@
 
 package org.apache.asterix.runtime.evaluators.functions;
 
+import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
@@ -30,6 +31,8 @@ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 public class IsBooleanDescriptor extends AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
@@ -50,6 +53,26 @@ public class IsBooleanDescriptor extends AbstractScalarFunctionDynamicDescriptor
                 final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
                 return new AbstractTypeCheckEvaluator(eval) {
 
+                    // Overridden because other functions using the same class shouldn't perform the missing/null check
+                    @Override
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
+                        Value match = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]);
+                        if (match == Value.MISSING) {
+                            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
+                            return;
+                        }
+                        ABoolean res = match == Value.TRUE ? ABoolean.TRUE : ABoolean.FALSE;
+                        resultStorage.reset();
+                        aObjSerDer.serialize(res, out);
+                        result.set(resultStorage);
+                    }
+
                     @Override
                     protected Value isMatch(byte typeTag) {
                         return typeTag == ATypeTag.SERIALIZED_BOOLEAN_TYPE_TAG ? Value.TRUE : Value.FALSE;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNumberDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNumberDescriptor.java
index 00d0091..a18ffc3 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNumberDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNumberDescriptor.java
@@ -19,6 +19,7 @@
 
 package org.apache.asterix.runtime.evaluators.functions;
 
+import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
@@ -30,6 +31,8 @@ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 public class IsNumberDescriptor extends AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
@@ -50,6 +53,26 @@ public class IsNumberDescriptor extends AbstractScalarFunctionDynamicDescriptor
                 final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
                 return new AbstractTypeCheckEvaluator(eval) {
 
+                    // Overridden because other functions using the same class shouldn't perform the missing/null check
+                    @Override
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
+                        Value match = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]);
+                        if (match == Value.MISSING) {
+                            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
+                            return;
+                        }
+                        ABoolean res = match == Value.TRUE ? ABoolean.TRUE : ABoolean.FALSE;
+                        resultStorage.reset();
+                        aObjSerDer.serialize(res, out);
+                        result.set(resultStorage);
+                    }
+
                     @Override
                     protected Value isMatch(byte typeTag) {
                         return typeTag == ATypeTag.SERIALIZED_INT8_TYPE_TAG
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsObjectDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsObjectDescriptor.java
index 0a34f71..afa2091 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsObjectDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsObjectDescriptor.java
@@ -19,6 +19,7 @@
 
 package org.apache.asterix.runtime.evaluators.functions;
 
+import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
@@ -30,6 +31,8 @@ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 public class IsObjectDescriptor extends AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
@@ -50,6 +53,29 @@ public class IsObjectDescriptor extends AbstractScalarFunctionDynamicDescriptor
                 final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
                 return new AbstractTypeCheckEvaluator(eval) {
 
+                    // TODO(Hussain) Consider making a different AbstractTypeCheckEvaluator class for the methods
+                    // that require the Missing/Null checks, that should keep the code cleaner. Currently, this is the
+                    // scenario because some functions require Missing/Null checks while others don't, and they're
+                    // extending the same base class, so the evaluate(...) needs to be overridden
+                    @Override
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
+                        Value match = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]);
+                        if (match == Value.MISSING) {
+                            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
+                            return;
+                        }
+                        ABoolean res = match == Value.TRUE ? ABoolean.TRUE : ABoolean.FALSE;
+                        resultStorage.reset();
+                        aObjSerDer.serialize(res, out);
+                        result.set(resultStorage);
+                    }
+
                     @Override
                     protected Value isMatch(byte typeTag) {
                         return typeTag == ATypeTag.SERIALIZED_RECORD_TYPE_TAG ? Value.TRUE : Value.FALSE;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsStringDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsStringDescriptor.java
index 82aba1f..10aa953 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsStringDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsStringDescriptor.java
@@ -19,6 +19,7 @@
 
 package org.apache.asterix.runtime.evaluators.functions;
 
+import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
@@ -30,6 +31,8 @@ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 public class IsStringDescriptor extends AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
@@ -50,6 +53,26 @@ public class IsStringDescriptor extends AbstractScalarFunctionDynamicDescriptor
                 final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
                 return new AbstractTypeCheckEvaluator(eval) {
 
+                    // Overridden because other functions using the same class shouldn't perform the missing/null check
+                    @Override
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
+                        Value match = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]);
+                        if (match == Value.MISSING) {
+                            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
+                            return;
+                        }
+                        ABoolean res = match == Value.TRUE ? ABoolean.TRUE : ABoolean.FALSE;
+                        resultStorage.reset();
+                        aObjSerDer.serialize(res, out);
+                        result.set(resultStorage);
+                    }
+
                     @Override
                     protected Value isMatch(byte typeTag) {
                         return typeTag == ATypeTag.SERIALIZED_STRING_TYPE_TAG ? Value.TRUE : Value.FALSE;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/LenDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/LenDescriptor.java
index 1c8a051..203904b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/LenDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/LenDescriptor.java
@@ -78,6 +78,11 @@ public class LenDescriptor extends AbstractScalarFunctionDynamicDescriptor {
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         evalList.evaluate(tuple, inputVal);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, inputVal)) {
+                            return;
+                        }
+
                         byte[] serList = inputVal.getByteArray();
                         int offset = inputVal.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NotDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NotDescriptor.java
index 7c9736d..8a4603f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NotDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NotDescriptor.java
@@ -79,6 +79,10 @@ public class NotDescriptor extends AbstractScalarFunctionDynamicDescriptor {
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
                         if (bytes[offset] == ATypeTag.SERIALIZED_BOOLEAN_TYPE_TAG) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericATan2Descriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericATan2Descriptor.java
index 4c1eb2d..3a5a32a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericATan2Descriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericATan2Descriptor.java
@@ -83,6 +83,11 @@ public class NumericATan2Descriptor extends AbstractScalarFunctionDynamicDescrip
                         resultStorage.reset();
                         evalLeft.evaluate(tuple, leftPtr);
                         evalRight.evaluate(tuple, rightPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, leftPtr, rightPtr)) {
+                            return;
+                        }
+
                         for (int i = 0; i < args.length; i++) {
                             IPointable argPtr = i == 0 ? leftPtr : rightPtr;
                             byte[] data = argPtr.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericRoundDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericRoundDescriptor.java
index be8247b..24c823e 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericRoundDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericRoundDescriptor.java
@@ -98,6 +98,11 @@ public class NumericRoundDescriptor extends AbstractScalarFunctionDynamicDescrip
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] data = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericRoundHalfToEven2Descriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericRoundHalfToEven2Descriptor.java
index 6d06373..1dbbb07 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericRoundHalfToEven2Descriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericRoundHalfToEven2Descriptor.java
@@ -122,6 +122,11 @@ public class NumericRoundHalfToEven2Descriptor extends AbstractScalarFunctionDyn
                         resultStorage.reset();
                         eval.evaluate(tuple, argValue);
                         precision.evaluate(tuple, argPrecision);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argValue, argPrecision)) {
+                            return;
+                        }
+
                         byte[] data = argValue.getByteArray();
                         int offset = argValue.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericRoundHalfToEvenDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericRoundHalfToEvenDescriptor.java
index 4f722f3..29dac86 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericRoundHalfToEvenDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericRoundHalfToEvenDescriptor.java
@@ -98,6 +98,11 @@ public class NumericRoundHalfToEvenDescriptor extends AbstractScalarFunctionDyna
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] data = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericTruncDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericTruncDescriptor.java
index b03fdbc..ca59451 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericTruncDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericTruncDescriptor.java
@@ -130,6 +130,11 @@ public class NumericTruncDescriptor extends AbstractScalarFunctionDynamicDescrip
             resultStorage.reset();
             eval.evaluate(tuple, argValue);
             precision.evaluate(tuple, argPrecision);
+
+            if (PointableHelper.checkAndSetMissingOrNull(result, argValue, argPrecision)) {
+                return;
+            }
+
             byte[] data = argValue.getByteArray();
             int offset = argValue.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PointableHelper.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PointableHelper.java
index 2914f63..2db724a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PointableHelper.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PointableHelper.java
@@ -45,6 +45,14 @@ import org.apache.hyracks.util.string.UTF8StringWriter;
 
 public class PointableHelper {
 
+    // represents the possible value states for a pointable
+    private enum PointableValueState {
+        EMPTY_POINTABLE,
+        MISSING,
+        NULL,
+        PRESENT
+    }
+
     private static final byte[] NULL_BYTES = new byte[] { ATypeTag.SERIALIZED_NULL_TYPE_TAG };
     private static final byte[] MISSING_BYTES = new byte[] { ATypeTag.SERIALIZED_MISSING_TYPE_TAG };
     private final UTF8StringWriter utf8Writer;
@@ -158,4 +166,120 @@ public class PointableHelper {
     public static void setMissing(IPointable pointable) {
         pointable.set(MISSING_BYTES, 0, MISSING_BYTES.length);
     }
+
+    // checkAndSetMissingOrNull with 1 argument
+    public static boolean checkAndSetMissingOrNull(IPointable result, IPointable pointable1) {
+        return checkAndSetMissingOrNull(result, pointable1, null, null, null);
+    }
+
+    // checkAndSetMissingOrNull with 2 arguments
+    public static boolean checkAndSetMissingOrNull(IPointable result, IPointable pointable1, IPointable pointable2) {
+        return checkAndSetMissingOrNull(result, pointable1, pointable2, null, null);
+    }
+
+    // checkAndSetMissingOrNull with 3 arguments
+    public static boolean checkAndSetMissingOrNull(IPointable result, IPointable pointable1, IPointable pointable2,
+            IPointable pointable3) {
+        return checkAndSetMissingOrNull(result, pointable1, pointable2, pointable3, null);
+    }
+
+    /**
+     * This method takes multiple pointables, the first pointable being the pointable to write the result to, and
+     * checks their ATypeTag value. If a missing or null ATypeTag is encountered, the method will set the result
+     * pointable to missing or null accordingly, and will return {@code true}.
+     *
+     * As the missing encounter has a higher priority than the null, the method will keep checking if any missing has
+     * been encountered first, if not, it will do a null check at the end.
+     *
+     * @param result the result pointable that will hold the data
+     * @param pointable1 the first pointable to be checked
+     * @param pointable2 the second pointable to be checked
+     * @param pointable3 the third pointable to be checked
+     * @param pointable4 the fourth pointable to be checked
+     *
+     * @return {@code true} if the pointable value is missing or null, {@code false} otherwise.
+     */
+    public static boolean checkAndSetMissingOrNull(IPointable result, IPointable pointable1, IPointable pointable2,
+            IPointable pointable3, IPointable pointable4) {
+
+        // this flag will keep an eye on whether a null value is encountered or not
+        boolean isMeetNull = false;
+
+        switch (getPointableValueState(pointable1)) {
+            case MISSING:
+                setMissing(result);
+                return true;
+            case NULL:
+                isMeetNull = true;
+                break;
+        }
+
+        if (pointable2 != null) {
+            switch (getPointableValueState(pointable2)) {
+                case MISSING:
+                    setMissing(result);
+                    return true;
+                case NULL:
+                    isMeetNull = true;
+                    break;
+            }
+        }
+
+        if (pointable3 != null) {
+            switch (getPointableValueState(pointable3)) {
+                case MISSING:
+                    setMissing(result);
+                    return true;
+                case NULL:
+                    isMeetNull = true;
+                    break;
+            }
+        }
+
+        if (pointable4 != null) {
+            switch (getPointableValueState(pointable4)) {
+                case MISSING:
+                    setMissing(result);
+                    return true;
+                case NULL:
+                    isMeetNull = true;
+                    break;
+            }
+        }
+
+        // this is reached only if no missing is encountered in all the passed pointables
+        if (isMeetNull) {
+            setNull(result);
+            return true;
+        }
+
+        // no missing or null encountered
+        return false;
+    }
+
+    /**
+     * This method checks and returns the pointable value state.
+     *
+     * @param pointable the pointable to be checked
+     *
+     * @return the pointable value state for the passed pointable
+     */
+    private static PointableValueState getPointableValueState(IPointable pointable) {
+        if (pointable.getLength() == 0) {
+            return PointableValueState.EMPTY_POINTABLE;
+        }
+
+        byte[] bytes = pointable.getByteArray();
+        int offset = pointable.getStartOffset();
+
+        if (bytes[offset] == ATypeTag.SERIALIZED_MISSING_TYPE_TAG) {
+            return PointableValueState.MISSING;
+        }
+
+        if (bytes[offset] == ATypeTag.SERIALIZED_NULL_TYPE_TAG) {
+            return PointableValueState.NULL;
+        }
+
+        return PointableValueState.PRESENT;
+    }
 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/RandomWithSeedDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/RandomWithSeedDescriptor.java
index 6dd5eac..28ee9f4 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/RandomWithSeedDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/RandomWithSeedDescriptor.java
@@ -62,6 +62,10 @@ public class RandomWithSeedDescriptor extends AbstractScalarFunctionDynamicDescr
                             throws HyracksDataException {
                         eval0.evaluate(tuple, arg0);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(resultPointable, arg0)) {
+                            return;
+                        }
+
                         byte[] bytes = arg0.getByteArray();
                         int offset = arg0.getStartOffset();
                         ATypeTag tt = ATypeTag.VALUE_TYPE_MAPPING[bytes[offset]];
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialAreaDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialAreaDescriptor.java
index 1aec610..05693a4 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialAreaDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialAreaDescriptor.java
@@ -74,6 +74,10 @@ public class SpatialAreaDescriptor extends AbstractScalarFunctionDynamicDescript
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         try {
                             byte[] bytes = argPtr.getByteArray();
                             int offset = argPtr.getStartOffset();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialCellDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialCellDescriptor.java
index ce9ab54..ffc6da2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialCellDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialCellDescriptor.java
@@ -90,6 +90,11 @@ public class SpatialCellDescriptor extends AbstractScalarFunctionDynamicDescript
                         eval2.evaluate(tuple, inputArg2);
                         eval3.evaluate(tuple, inputArg3);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0, inputArg1, inputArg2,
+                                inputArg3)) {
+                            return;
+                        }
+
                         byte[] bytes0 = inputArg0.getByteArray();
                         byte[] bytes1 = inputArg1.getByteArray();
                         byte[] bytes2 = inputArg2.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialDistanceDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialDistanceDescriptor.java
index e6997f6..b6a7569 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialDistanceDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialDistanceDescriptor.java
@@ -72,6 +72,10 @@ public class SpatialDistanceDescriptor extends AbstractScalarFunctionDynamicDesc
                         eval0.evaluate(tuple, inputArg0);
                         eval1.evaluate(tuple, inputArg1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0, inputArg1)) {
+                            return;
+                        }
+
                         try {
                             byte[] bytes0 = inputArg0.getByteArray();
                             byte[] bytes1 = inputArg1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringConcatDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringConcatDescriptor.java
index a2872bf..f26a71f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringConcatDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringConcatDescriptor.java
@@ -73,6 +73,7 @@ public class StringConcatDescriptor extends AbstractScalarFunctionDynamicDescrip
                     @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<ANull> nullSerde =
                             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
+                    @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<AMissing> missingSerde =
                             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AMISSING);
                     private final byte[] tempLengthArray = new byte[5];
@@ -82,6 +83,11 @@ public class StringConcatDescriptor extends AbstractScalarFunctionDynamicDescrip
                         resultStorage.reset();
                         try {
                             evalList.evaluate(tuple, inputArgList);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, inputArgList)) {
+                                return;
+                            }
+
                             byte[] listBytes = inputArgList.getByteArray();
                             int listOffset = inputArgList.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringJoinDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringJoinDescriptor.java
index 2c00ee5..07a91cb 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringJoinDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringJoinDescriptor.java
@@ -75,6 +75,7 @@ public class StringJoinDescriptor extends AbstractScalarFunctionDynamicDescripto
                     @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<ANull> nullSerde =
                             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
+                    @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<AMissing> missingSerde =
                             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AMISSING);
                     private final byte[] tempLengthArray = new byte[5];
@@ -85,6 +86,10 @@ public class StringJoinDescriptor extends AbstractScalarFunctionDynamicDescripto
                         evalList.evaluate(tuple, inputArgList);
                         evalSep.evaluate(tuple, inputArgSep);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, inputArgList, inputArgSep)) {
+                            return;
+                        }
+
                         byte[] listBytes = inputArgList.getByteArray();
                         int listOffset = inputArgList.getStartOffset();
                         if (listBytes[listOffset] != ATypeTag.SERIALIZED_ORDEREDLIST_TYPE_TAG
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringLengthDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringLengthDescriptor.java
index f2f78e1..e2b945d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringLengthDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringLengthDescriptor.java
@@ -75,6 +75,11 @@ public class StringLengthDescriptor extends AbstractScalarFunctionDynamicDescrip
                         try {
                             resultStorage.reset();
                             eval.evaluate(tuple, inputArg);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(resultPointable, inputArg)) {
+                                return;
+                            }
+
                             byte[] serString = inputArg.getByteArray();
                             int offset = inputArg.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRepeatDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRepeatDescriptor.java
index 068ab71..55ca090 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRepeatDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRepeatDescriptor.java
@@ -80,6 +80,10 @@ public class StringRepeatDescriptor extends AbstractScalarFunctionDynamicDescrip
                         evalString.evaluate(tuple, argString);
                         evalStart.evaluate(tuple, argNumber);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argString, argNumber)) {
+                            return;
+                        }
+
                         // Gets the repeating times.
                         byte[] bytes = argNumber.getByteArray();
                         int offset = argNumber.getStartOffset();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringSplitDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringSplitDescriptor.java
index 67a3aef..bc1ac3a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringSplitDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringSplitDescriptor.java
@@ -91,6 +91,10 @@ public class StringSplitDescriptor extends AbstractScalarFunctionDynamicDescript
                             stringEval.evaluate(tuple, argString);
                             patternEval.evaluate(tuple, argPattern);
 
+                            if (PointableHelper.checkAndSetMissingOrNull(result, argString, argPattern)) {
+                                return;
+                            }
+
                             // Gets the bytes of the source string.
                             byte[] srcString = argString.getByteArray();
                             int srcOffset = argString.getStartOffset();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringToCodePointDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringToCodePointDescriptor.java
index c14425a..f24cbbe 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringToCodePointDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringToCodePointDescriptor.java
@@ -83,6 +83,11 @@ public class StringToCodePointDescriptor extends AbstractScalarFunctionDynamicDe
                         try {
                             resultStorage.reset();
                             stringEval.evaluate(tuple, argPtr);
+
+                            if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                                return;
+                            }
+
                             byte[] serString = argPtr.getByteArray();
                             int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/Substring2Descriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/Substring2Descriptor.java
index 7cf3694..9184c26 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/Substring2Descriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/Substring2Descriptor.java
@@ -82,6 +82,10 @@ public class Substring2Descriptor extends AbstractStringOffsetConfigurableDescri
                         evalString.evaluate(tuple, argString);
                         evalStart.evaluate(tuple, argStart);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argString, argStart)) {
+                            return;
+                        }
+
                         byte[] bytes = argStart.getByteArray();
                         int offset = argStart.getStartOffset();
                         int start = ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 1, bytes, offset);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringAfterDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringAfterDescriptor.java
index 3f3ca14..ab12943 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringAfterDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringAfterDescriptor.java
@@ -72,10 +72,15 @@ public class SubstringAfterDescriptor extends AbstractScalarFunctionDynamicDescr
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         evalString.evaluate(tuple, array0);
+                        evalPattern.evaluate(tuple, array1);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, array0, array1)) {
+                            return;
+                        }
+
                         byte[] src = array0.getByteArray();
                         int srcOffset = array0.getStartOffset();
                         int srcLen = array0.getLength();
-                        evalPattern.evaluate(tuple, array1);
                         byte[] pattern = array1.getByteArray();
                         int patternOffset = array1.getStartOffset();
                         int patternLen = array1.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringBeforeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringBeforeDescriptor.java
index b61ee4d..dbc5163 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringBeforeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringBeforeDescriptor.java
@@ -73,11 +73,15 @@ public class SubstringBeforeDescriptor extends AbstractScalarFunctionDynamicDesc
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         evalString.evaluate(tuple, array0);
+                        evalPattern.evaluate(tuple, array1);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, array0, array1)) {
+                            return;
+                        }
+
                         byte[] src = array0.getByteArray();
                         int srcOffset = array0.getStartOffset();
                         int srcLen = array0.getLength();
-
-                        evalPattern.evaluate(tuple, array1);
                         byte[] pattern = array1.getByteArray();
                         int patternOffset = array1.getStartOffset();
                         int patternLen = array1.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringDescriptor.java
index 4d9f61a..87fb1a9 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringDescriptor.java
@@ -89,6 +89,10 @@ public class SubstringDescriptor extends AbstractStringOffsetConfigurableDescrip
                         evalStart.evaluate(tuple, argStart);
                         evalLen.evaluate(tuple, argLen);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argString, argStart, argLen)) {
+                            return;
+                        }
+
                         byte[] bytes = argStart.getByteArray();
                         int offset = argStart.getStartOffset();
                         int start = ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 0, bytes, offset);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToArrayDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToArrayDescriptor.java
index 9764aed..81d73b2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToArrayDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToArrayDescriptor.java
@@ -84,6 +84,11 @@ public class ToArrayDescriptor extends AbstractScalarFunctionDynamicDescriptor {
                     public void evaluate(IFrameTupleReference tuple, IPointable resultPointable)
                             throws HyracksDataException {
                         eval0.evaluate(tuple, arg0);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(resultPointable, arg0)) {
+                            return;
+                        }
+
                         byte[] data = arg0.getByteArray();
                         int offset = arg0.getStartOffset();
                         if (data[offset] == ATypeTag.SERIALIZED_ORDEREDLIST_TYPE_TAG) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToAtomicDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToAtomicDescriptor.java
index 16554b5..62efd43 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToAtomicDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToAtomicDescriptor.java
@@ -90,6 +90,10 @@ public class ToAtomicDescriptor extends AbstractScalarFunctionDynamicDescriptor
                             throws HyracksDataException {
                         eval0.evaluate(tuple, arg);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(resultPointable, arg)) {
+                            return;
+                        }
+
                         IValueReference itemPtr = arg;
                         IAType itemTypeInferred = argType;
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToNumberDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToNumberDescriptor.java
index 770f200..2b7550e 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToNumberDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToNumberDescriptor.java
@@ -84,9 +84,12 @@ public class ToNumberDescriptor extends AbstractScalarFunctionDynamicDescriptor
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         inputEval.evaluate(tuple, inputArg);
-
                         resultStorage.reset();
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                            return;
+                        }
+
                         byte[] bytes = inputArg.getByteArray();
                         int startOffset = inputArg.getStartOffset();
                         ATypeTag tt = ATypeTag.VALUE_TYPE_MAPPING[bytes[startOffset]];
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectDescriptor.java
index b981fcf..9e56e56 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectDescriptor.java
@@ -68,6 +68,11 @@ public class ToObjectDescriptor extends AbstractScalarFunctionDynamicDescriptor
                     public void evaluate(IFrameTupleReference tuple, IPointable resultPointable)
                             throws HyracksDataException {
                         eval0.evaluate(tuple, arg0);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(resultPointable, arg0)) {
+                            return;
+                        }
+
                         byte[] data = arg0.getByteArray();
                         int offset = arg0.getStartOffset();
                         if (data[offset] == ATypeTag.SERIALIZED_RECORD_TYPE_TAG) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/TreatAsIntegerDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/TreatAsIntegerDescriptor.java
index 2c3e148..1a25386 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/TreatAsIntegerDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/TreatAsIntegerDescriptor.java
@@ -77,6 +77,10 @@ public class TreatAsIntegerDescriptor extends AbstractScalarFunctionDynamicDescr
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         inputEval.evaluate(tuple, inputArg);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+                            return;
+                        }
+
                         int intValue;
                         byte[] bytes = inputArg.getByteArray();
                         int startOffset = inputArg.getStartOffset();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractFindBinaryEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractFindBinaryEvaluator.java
index 6cd1cef..b684015 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractFindBinaryEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractFindBinaryEvaluator.java
@@ -24,6 +24,7 @@ import org.apache.asterix.om.base.AInt64;
 import org.apache.asterix.om.base.AMutableInt64;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -55,8 +56,24 @@ public abstract class AbstractFindBinaryEvaluator extends AbstractBinaryScalarEv
     @Override
     public void evaluate(IFrameTupleReference tuple, IPointable resultPointable) throws HyracksDataException {
         resultStorage.reset();
+        boolean isReturnNull = false;
+
         for (int i = 0; i < pointables.length; ++i) {
             evaluators[i].evaluate(tuple, pointables[i]);
+
+            if (PointableHelper.checkAndSetMissingOrNull(resultPointable, pointables[i])) {
+                if (resultPointable.getByteArray()[0] == ATypeTag.SERIALIZED_MISSING_TYPE_TAG) {
+                    return;
+                }
+
+                // null value, but check other arguments for missing first (higher priority)
+                isReturnNull = true;
+            }
+        }
+
+        if (isReturnNull) {
+            PointableHelper.setNull(resultPointable);
+            return;
         }
 
         int fromOffset = getFromOffset(tuple);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractSubBinaryEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractSubBinaryEvaluator.java
index f49f06b..0c1e5ea 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractSubBinaryEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractSubBinaryEvaluator.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -51,8 +52,24 @@ public abstract class AbstractSubBinaryEvaluator extends AbstractBinaryScalarEva
     @Override
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         resultStorage.reset();
+        boolean isReturnNull = false;
+
         for (int i = 0; i < pointables.length; ++i) {
             evaluators[i].evaluate(tuple, pointables[i]);
+
+            if (PointableHelper.checkAndSetMissingOrNull(result, pointables[i])) {
+                if (result.getByteArray()[0] == ATypeTag.SERIALIZED_MISSING_TYPE_TAG) {
+                    return;
+                }
+
+                // null value, but check other arguments for missing first (higher priority)
+                isReturnNull = true;
+            }
+        }
+
+        if (isReturnNull) {
+            PointableHelper.setNull(result);
+            return;
         }
 
         try {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryConcatDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryConcatDescriptor.java
index 152801d..e107150 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryConcatDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryConcatDescriptor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
 import org.apache.asterix.runtime.evaluators.common.ListAccessor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.asterix.runtime.exceptions.UnsupportedItemTypeException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -82,6 +83,10 @@ public class BinaryConcatDescriptor extends AbstractScalarFunctionDynamicDescrip
                         resultStorage.reset();
                         evaluators[0].evaluate(tuple, pointables[0]);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, pointables[0])) {
+                            return;
+                        }
+
                         byte[] data = pointables[0].getByteArray();
                         int offset = pointables[0].getStartOffset();
                         byte typeTag = data[offset];
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryLengthDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryLengthDescriptor.java
index 031eca9..816057c 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryLengthDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryLengthDescriptor.java
@@ -28,6 +28,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -68,6 +69,11 @@ public class BinaryLengthDescriptor extends AbstractScalarFunctionDynamicDescrip
                             throws HyracksDataException {
                         resultStorage.reset();
                         evaluators[0].evaluate(tuple, pointables[0]);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(resultPointable, pointables[0])) {
+                            return;
+                        }
+
                         ATypeTag tag = ATypeTag.VALUE_TYPE_MAPPING[pointables[0].getByteArray()[pointables[0]
                                 .getStartOffset()]];
                         checkTypeMachingThrowsIfNot(EXPECTED_TAGS, tag);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/ParseBinaryDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/ParseBinaryDescriptor.java
index b2ea044..e27203b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/ParseBinaryDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/ParseBinaryDescriptor.java
@@ -28,6 +28,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.UnsupportedItemTypeException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -86,6 +87,10 @@ public class ParseBinaryDescriptor extends AbstractScalarFunctionDynamicDescript
                         evaluators[0].evaluate(tuple, pointables[0]);
                         evaluators[1].evaluate(tuple, pointables[1]);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, pointables[0], pointables[1])) {
+                            return;
+                        }
+
                         ATypeTag binaryTag = ATypeTag.VALUE_TYPE_MAPPING[pointables[0].getByteArray()[pointables[0]
                                 .getStartOffset()]];
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/PrintBinaryDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/PrintBinaryDescriptor.java
index 7f61d39..34080f9 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/PrintBinaryDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/PrintBinaryDescriptor.java
@@ -26,6 +26,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.UnsupportedItemTypeException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -79,6 +80,10 @@ public class PrintBinaryDescriptor extends AbstractScalarFunctionDynamicDescript
                         evaluators[0].evaluate(tuple, pointables[0]);
                         evaluators[1].evaluate(tuple, pointables[1]);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, pointables[0], pointables[1])) {
+                            return;
+                        }
+
                         try {
                             ATypeTag arg0Tag = ATypeTag.VALUE_TYPE_MAPPING[pointables[0].getByteArray()[pointables[0]
                                     .getStartOffset()]];
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 82c45af..e324230 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
@@ -50,6 +50,11 @@ abstract class AbstractRecordPairsEvaluator implements IScalarEvaluator {
     @Override
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         eval0.evaluate(tuple, inputPointable);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, inputPointable)) {
+            return;
+        }
+
         final ATypeTag inputTypeTag = PointableHelper.getTypeTag(inputPointable);
         if (!validateInputType(inputTypeTag)) {
             PointableHelper.setNull(result);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByIndexEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByIndexEvalFactory.java
index 3fcf87d..04d92ae 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByIndexEvalFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByIndexEvalFactory.java
@@ -28,6 +28,7 @@ import org.apache.asterix.om.types.AUnionType;
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.om.utils.NonTaggedFormatUtil;
 import org.apache.asterix.om.utils.RecordUtil;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -87,16 +88,22 @@ public class FieldAccessByIndexEvalFactory implements IScalarEvaluatorFactory {
                 try {
                     resultStorage.reset();
                     eval0.evaluate(tuple, inputArg0);
+                    eval1.evaluate(tuple, inputArg1);
+
+                    if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0, inputArg1)) {
+                        return;
+                    }
+
                     byte[] serRecord = inputArg0.getByteArray();
                     int offset = inputArg0.getStartOffset();
+                    byte[] indexBytes = inputArg1.getByteArray();
+                    int indexOffset = inputArg1.getStartOffset();
 
                     if (serRecord[offset] != ATypeTag.SERIALIZED_RECORD_TYPE_TAG) {
                         throw new TypeMismatchException(sourceLoc, serRecord[offset],
                                 ATypeTag.SERIALIZED_RECORD_TYPE_TAG);
                     }
-                    eval1.evaluate(tuple, inputArg1);
-                    byte[] indexBytes = inputArg1.getByteArray();
-                    int indexOffset = inputArg1.getStartOffset();
+
                     if (indexBytes[indexOffset] != ATypeTag.SERIALIZED_INT32_TYPE_TAG) {
                         throw new TypeMismatchException(sourceLoc, indexBytes[offset],
                                 ATypeTag.SERIALIZED_INT32_TYPE_TAG);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByNameEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByNameEvalFactory.java
index e66cc52..4daf0a6 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByNameEvalFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByNameEvalFactory.java
@@ -27,6 +27,7 @@ import org.apache.asterix.formats.nontagged.BinaryHashFunctionFactoryProvider;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.om.utils.NonTaggedFormatUtil;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -80,6 +81,11 @@ public class FieldAccessByNameEvalFactory implements IScalarEvaluatorFactory {
                     resultStorage.reset();
                     eval0.evaluate(tuple, inputArg0);
                     eval1.evaluate(tuple, inputArg1);
+
+                    if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0, inputArg1)) {
+                        return;
+                    }
+
                     byte[] serRecord = inputArg0.getByteArray();
                     int serRecordOffset = inputArg0.getStartOffset();
                     int serRecordLen = inputArg0.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessNestedEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessNestedEvalFactory.java
index f885f5a..24445c0 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessNestedEvalFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessNestedEvalFactory.java
@@ -38,6 +38,7 @@ import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.om.types.runtime.RuntimeRecordTypeInfo;
 import org.apache.asterix.om.utils.NonTaggedFormatUtil;
 import org.apache.asterix.om.utils.RecordUtil;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -118,6 +119,11 @@ public class FieldAccessNestedEvalFactory implements IScalarEvaluatorFactory {
                 try {
                     resultStorage.reset();
                     eval0.evaluate(tuple, inputArg0);
+
+                    if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0)) {
+                        return;
+                    }
+
                     byte[] serRecord = inputArg0.getByteArray();
                     int offset = inputArg0.getStartOffset();
                     int start = offset;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldValueEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldValueEvalFactory.java
index 7cc3aa3..61f4510 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldValueEvalFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldValueEvalFactory.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.om.types.runtime.RuntimeRecordTypeInfo;
 import org.apache.asterix.om.utils.NonTaggedFormatUtil;
 import org.apache.asterix.om.utils.RecordUtil;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -86,12 +87,17 @@ public class GetRecordFieldValueEvalFactory implements IScalarEvaluatorFactory {
             public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                 try {
                     resultStorage.reset();
+                    recordEval.evaluate(tuple, inputArg0);
                     fieldNameEval.evaluate(tuple, inputArg1);
+
+                    if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0, inputArg1)) {
+                        return;
+                    }
+
                     byte[] serFldName = inputArg1.getByteArray();
                     int serFldNameOffset = inputArg1.getStartOffset();
                     int serFldNameLen = inputArg1.getLength();
 
-                    recordEval.evaluate(tuple, inputArg0);
                     byte[] serRecord = inputArg0.getByteArray();
                     int serRecordOffset = inputArg0.getStartOffset();
                     int serRecordLen = inputArg0.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldsEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldsEvalFactory.java
index cbfa312..ec9335f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldsEvalFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldsEvalFactory.java
@@ -25,6 +25,7 @@ import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.pointables.nonvisitor.ARecordPointable;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -66,6 +67,11 @@ public class GetRecordFieldsEvalFactory implements IScalarEvaluatorFactory {
             public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                 resultStorage.reset();
                 eval0.evaluate(tuple, inputArg0);
+
+                if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0)) {
+                    return;
+                }
+
                 byte[] data = inputArg0.getByteArray();
                 int offset = inputArg0.getStartOffset();
                 int len = inputArg0.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordAddFieldsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordAddFieldsDescriptor.java
index 0edd74b..c50c6d0 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordAddFieldsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordAddFieldsDescriptor.java
@@ -144,6 +144,10 @@ public class RecordAddFieldsDescriptor extends AbstractScalarFunctionDynamicDesc
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         // Make sure we get a valid record
                         byte typeTag0 = argPtr0.getByteArray()[argPtr0.getStartOffset()];
                         if (typeTag0 != ATypeTag.SERIALIZED_RECORD_TYPE_TAG) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordLengthDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordLengthDescriptor.java
index cd24ef7..cb575ea 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordLengthDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordLengthDescriptor.java
@@ -93,6 +93,10 @@ public class RecordLengthDescriptor extends AbstractScalarFunctionDynamicDescrip
                         resultStorage.reset();
                         eval0.evaluate(tuple, argPtr);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(resultPointable, argPtr)) {
+                            return;
+                        }
+
                         byte[] data = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordMergeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordMergeDescriptor.java
index 7de372f..b87789f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordMergeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordMergeDescriptor.java
@@ -124,6 +124,10 @@ public class RecordMergeDescriptor extends AbstractScalarFunctionDynamicDescript
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         vp0.set(argPtr0);
                         vp1.set(argPtr1);
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordNamesDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordNamesDescriptor.java
index 0ba2aa3..45291fa 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordNamesDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordNamesDescriptor.java
@@ -91,6 +91,10 @@ public class RecordNamesDescriptor extends AbstractScalarFunctionDynamicDescript
                         resultStorage.reset();
                         eval0.evaluate(tuple, argPtr);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(resultPointable, argPtr)) {
+                            return;
+                        }
+
                         byte[] data = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRemoveEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRemoveEvaluator.java
index d92c9a1..e0ac241 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRemoveEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRemoveEvaluator.java
@@ -78,13 +78,19 @@ class RecordRemoveEvaluator implements IScalarEvaluator {
         resultStorage.reset();
         boolean returnNull = false;
         eval0.evaluate(tuple, inputRecordPointable);
+        eval1.evaluate(tuple, fieldToRemovePointable);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, inputRecordPointable, fieldToRemovePointable)) {
+            return;
+        }
+
         byte[] data = inputRecordPointable.getByteArray();
         int offset = inputRecordPointable.getStartOffset();
         byte typeTag = data[offset];
         if (typeTag != ATypeTag.SERIALIZED_RECORD_TYPE_TAG) {
             returnNull = true;
         }
-        eval1.evaluate(tuple, fieldToRemovePointable);
+
         data = fieldToRemovePointable.getByteArray();
         offset = fieldToRemovePointable.getStartOffset();
         typeTag = data[offset];
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRemoveFieldsEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRemoveFieldsEvalFactory.java
index 2d372f3..21bde27 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRemoveFieldsEvalFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRemoveFieldsEvalFactory.java
@@ -98,6 +98,10 @@ class RecordRemoveFieldsEvalFactory implements IScalarEvaluatorFactory {
                 eval0.evaluate(tuple, inputArg0);
                 eval1.evaluate(tuple, inputArg1);
 
+                if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0, inputArg1)) {
+                    return;
+                }
+
                 byte inputTypeTag0 = inputArg0.getByteArray()[inputArg0.getStartOffset()];
                 if (inputTypeTag0 != ATypeTag.SERIALIZED_RECORD_TYPE_TAG) {
                     throw new TypeMismatchException(sourceLoc, BuiltinFunctions.REMOVE_FIELDS, 0, inputTypeTag0,
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRenameEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRenameEvaluator.java
index 3d46b69..8feba26 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRenameEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRenameEvaluator.java
@@ -82,20 +82,28 @@ class RecordRenameEvaluator implements IScalarEvaluator {
         resultStorage.reset();
         boolean returnNull = false;
         eval0.evaluate(tuple, inputRecordPointable);
+        eval1.evaluate(tuple, oldFieldNamePointable);
+        eval2.evaluate(tuple, newFieldNamePointable);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, inputRecordPointable, oldFieldNamePointable,
+                newFieldNamePointable)) {
+            return;
+        }
+
         byte[] data = inputRecordPointable.getByteArray();
         int offset = inputRecordPointable.getStartOffset();
         byte typeTag = data[offset];
         if (typeTag != ATypeTag.SERIALIZED_RECORD_TYPE_TAG) {
             returnNull = true;
         }
-        eval1.evaluate(tuple, oldFieldNamePointable);
+
         data = oldFieldNamePointable.getByteArray();
         offset = oldFieldNamePointable.getStartOffset();
         typeTag = data[offset];
         if (typeTag != ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
             returnNull = true;
         }
-        eval2.evaluate(tuple, newFieldNamePointable);
+
         data = newFieldNamePointable.getByteArray();
         offset = newFieldNamePointable.getStartOffset();
         typeTag = data[offset];
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 97bc01a..522aa54 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
@@ -69,6 +69,11 @@ class RecordUnwrapEvaluator implements IScalarEvaluator {
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         resultStorage.reset();
         eval0.evaluate(tuple, inputRecordPointable);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, inputRecordPointable)) {
+            return;
+        }
+
         final byte[] data = inputRecordPointable.getByteArray();
         final int offset = inputRecordPointable.getStartOffset();
         final byte typeTag = data[offset];
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 6f228bd..783f4e6 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
@@ -62,6 +62,11 @@ class RecordValuesEvaluator implements IScalarEvaluator {
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         resultStorage.reset();
         eval0.evaluate(tuple, inputRecordPointable);
+
+        if (PointableHelper.checkAndSetMissingOrNull(result, inputRecordPointable)) {
+            return;
+        }
+
         final ATypeTag inputTypeTag = PointableHelper.getTypeTag(inputRecordPointable);
         if (inputTypeTag != ATypeTag.OBJECT) {
             PointableHelper.setNull(result);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AbstractIntervalLogicFuncDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AbstractIntervalLogicFuncDescriptor.java
index a972e5a..fba0c42 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AbstractIntervalLogicFuncDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AbstractIntervalLogicFuncDescriptor.java
@@ -26,6 +26,7 @@ import org.apache.asterix.om.pointables.nonvisitor.AIntervalPointable;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.IncompatibleTypeException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -74,6 +75,10 @@ public abstract class AbstractIntervalLogicFuncDescriptor extends AbstractScalar
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte typeTag0 = argPtr0.getTag();
                         if (typeTag0 != ATypeTag.SERIALIZED_INTERVAL_TYPE_TAG) {
                             throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, typeTag0,
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AdjustDateTimeForTimeZoneDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AdjustDateTimeForTimeZoneDescriptor.java
index 5f373aa..74a2c93 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AdjustDateTimeForTimeZoneDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AdjustDateTimeForTimeZoneDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -87,6 +88,10 @@ public class AdjustDateTimeForTimeZoneDescriptor extends AbstractScalarFunctionD
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         byte[] bytes1 = argPtr1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AdjustTimeForTimeZoneDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AdjustTimeForTimeZoneDescriptor.java
index b57961a..2ee8fcd 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AdjustTimeForTimeZoneDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AdjustTimeForTimeZoneDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -85,6 +86,10 @@ public class AdjustTimeForTimeZoneDescriptor extends AbstractScalarFunctionDynam
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         byte[] bytes1 = argPtr1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDuartionFromDateDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDuartionFromDateDescriptor.java
index 6244087..2623484 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDuartionFromDateDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDuartionFromDateDescriptor.java
@@ -33,6 +33,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -88,6 +89,10 @@ public class CalendarDuartionFromDateDescriptor extends AbstractScalarFunctionDy
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         byte[] bytes1 = argPtr1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDurationFromDateTimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDurationFromDateTimeDescriptor.java
index 5ee87fa..c441eca 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDurationFromDateTimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDurationFromDateTimeDescriptor.java
@@ -33,6 +33,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -105,6 +106,10 @@ public class CalendarDurationFromDateTimeDescriptor extends AbstractScalarFuncti
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         byte[] bytes1 = argPtr1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromDatetimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromDatetimeDescriptor.java
index f280811..bc00ea7 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromDatetimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromDatetimeDescriptor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -80,6 +81,11 @@ public class DateFromDatetimeDescriptor extends AbstractScalarFunctionDynamicDes
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromUnixTimeInDaysDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromUnixTimeInDaysDescriptor.java
index a365989..f155b6b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromUnixTimeInDaysDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromUnixTimeInDaysDescriptor.java
@@ -29,6 +29,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -77,6 +78,11 @@ public class DateFromUnixTimeInDaysDescriptor extends AbstractScalarFunctionDyna
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         aDate.setValue(ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 0,
                                 argPtr.getByteArray(), argPtr.getStartOffset()));
                         dateSerde.serialize(aDate, out);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromDateAndTimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromDateAndTimeDescriptor.java
index 57a74c0..8b4871a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromDateAndTimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromDateAndTimeDescriptor.java
@@ -32,6 +32,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -87,6 +88,10 @@ public class DatetimeFromDateAndTimeDescriptor extends AbstractScalarFunctionDyn
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         byte[] bytes1 = argPtr1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInMsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInMsDescriptor.java
index 6fb5a2b..c943c63 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInMsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInMsDescriptor.java
@@ -33,6 +33,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -87,6 +88,11 @@ public class DatetimeFromUnixTimeInMsDescriptor extends AbstractScalarFunctionDy
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
                         ATypeTag argPtrTypeTag = ATypeTag.VALUE_TYPE_MAPPING[bytes[offset]];
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInSecsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInSecsDescriptor.java
index d0ef6f1..8eae644 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInSecsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInSecsDescriptor.java
@@ -33,6 +33,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -87,6 +88,10 @@ public class DatetimeFromUnixTimeInSecsDescriptor extends AbstractScalarFunction
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
                         ATypeTag argPtrTypeTag = ATypeTag.VALUE_TYPE_MAPPING[bytes[offset]];
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayOfWeekDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayOfWeekDescriptor.java
index 1419725..c826370 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayOfWeekDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayOfWeekDescriptor.java
@@ -32,6 +32,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -84,6 +85,10 @@ public class DayOfWeekDescriptor extends AbstractScalarFunctionDynamicDescriptor
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayTimeDurationComparatorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayTimeDurationComparatorDescriptor.java
index 172e2e9..8d08fd7 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayTimeDurationComparatorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayTimeDurationComparatorDescriptor.java
@@ -27,6 +27,7 @@ import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -77,6 +78,10 @@ public class DayTimeDurationComparatorDescriptor extends AbstractScalarFunctionD
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         byte[] bytes1 = argPtr1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationEqualDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationEqualDescriptor.java
index da2f29a3..ac37271 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationEqualDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationEqualDescriptor.java
@@ -29,6 +29,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -78,6 +79,10 @@ public class DurationEqualDescriptor extends AbstractScalarFunctionDynamicDescri
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         byte[] bytes1 = argPtr1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromIntervalDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromIntervalDescriptor.java
index 8f816e8..7157a36 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromIntervalDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromIntervalDescriptor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -81,6 +82,10 @@ public class DurationFromIntervalDescriptor extends AbstractScalarFunctionDynami
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMillisecondsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMillisecondsDescriptor.java
index 9df23a3..173f3c4 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMillisecondsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMillisecondsDescriptor.java
@@ -33,6 +33,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -82,6 +83,11 @@ public class DurationFromMillisecondsDescriptor extends AbstractScalarFunctionDy
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval0.evaluate(tuple, argPtr0);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr0.getByteArray();
                         int offset = argPtr0.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMonthsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMonthsDescriptor.java
index b066c0d..3671523 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMonthsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMonthsDescriptor.java
@@ -29,6 +29,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -77,6 +78,11 @@ public class DurationFromMonthsDescriptor extends AbstractScalarFunctionDynamicD
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval0.evaluate(tuple, argPtr0);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr0.getByteArray();
                         int offset = argPtr0.getStartOffset();
                         aDuration.setValue(ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 0, bytes, offset),
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetDayTimeDurationDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetDayTimeDurationDescriptor.java
index 0e932b2..3293a67 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetDayTimeDurationDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetDayTimeDurationDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -80,6 +81,10 @@ public class GetDayTimeDurationDescriptor extends AbstractScalarFunctionDynamicD
                         resultStorage.reset();
                         eval0.evaluate(tuple, argPtr0);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr0.getByteArray();
                         int offset = argPtr0.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetOverlappingIntervalDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetOverlappingIntervalDescriptor.java
index 9374aba..b718757 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetOverlappingIntervalDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetOverlappingIntervalDescriptor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.pointables.nonvisitor.AIntervalPointable;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.IncompatibleTypeException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -88,6 +89,11 @@ public class GetOverlappingIntervalDescriptor extends AbstractScalarFunctionDyna
                         resultStorage.reset();
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte type0 = argPtr0.getTag();
                         byte type1 = argPtr1.getTag();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetYearMonthDurationDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetYearMonthDurationDescriptor.java
index 1013449..5a8d912 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetYearMonthDurationDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetYearMonthDurationDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -78,6 +79,11 @@ public class GetYearMonthDurationDescriptor extends AbstractScalarFunctionDynami
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval0.evaluate(tuple, argPtr0);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         if (bytes0[offset0] != ATypeTag.SERIALIZED_DURATION_TYPE_TAG) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/IntervalBinDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/IntervalBinDescriptor.java
index 9426104..c68a816 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/IntervalBinDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/IntervalBinDescriptor.java
@@ -37,6 +37,7 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.IncompatibleTypeException;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.OverflowException;
@@ -100,6 +101,10 @@ public class IntervalBinDescriptor extends AbstractScalarFunctionDynamicDescript
                         eval1.evaluate(tuple, argPtr1);
                         eval2.evaluate(tuple, argPtr2);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1, argPtr2)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         ATypeTag type0 = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes0[offset0]);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MillisecondsFromDayTimeDurationDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MillisecondsFromDayTimeDurationDescriptor.java
index 6968f17..1e9077b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MillisecondsFromDayTimeDurationDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MillisecondsFromDayTimeDurationDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -77,6 +78,11 @@ public class MillisecondsFromDayTimeDurationDescriptor extends AbstractScalarFun
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval0.evaluate(tuple, argPtr0);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr0.getByteArray();
                         int offset = argPtr0.getStartOffset();
                         if (bytes[offset] != ATypeTag.SERIALIZED_DAY_TIME_DURATION_TYPE_TAG) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MonthsFromYearMonthDurationDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MonthsFromYearMonthDurationDescriptor.java
index 093711f..6b04a62 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MonthsFromYearMonthDurationDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MonthsFromYearMonthDurationDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -77,6 +78,11 @@ public class MonthsFromYearMonthDurationDescriptor extends AbstractScalarFunctio
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval0.evaluate(tuple, argPtr0);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr0.getByteArray();
                         int offset = argPtr0.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/OverlapBinsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/OverlapBinsDescriptor.java
index c8f73b9..34fb7d8 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/OverlapBinsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/OverlapBinsDescriptor.java
@@ -41,6 +41,7 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.IncompatibleTypeException;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.OverflowException;
@@ -108,6 +109,10 @@ public class OverlapBinsDescriptor extends AbstractScalarFunctionDynamicDescript
                         eval1.evaluate(tuple, argPtr1);
                         eval2.evaluate(tuple, argPtr2);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1, argPtr2)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateDescriptor.java
index da8d732..9c43cfc 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateDescriptor.java
@@ -33,6 +33,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -96,6 +97,10 @@ public class ParseDateDescriptor extends AbstractScalarFunctionDynamicDescriptor
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         int len0 = argPtr0.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateTimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateTimeDescriptor.java
index ab19f9e..a76f913 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateTimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateTimeDescriptor.java
@@ -32,6 +32,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -88,6 +89,10 @@ public class ParseDateTimeDescriptor extends AbstractScalarFunctionDynamicDescri
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         int len0 = argPtr0.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseTimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseTimeDescriptor.java
index af85b5b..17fbd37 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseTimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseTimeDescriptor.java
@@ -32,6 +32,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -88,6 +89,10 @@ public class ParseTimeDescriptor extends AbstractScalarFunctionDynamicDescriptor
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         int len0 = argPtr0.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/PrintDateDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/PrintDateDescriptor.java
index c0b155d..565e10a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/PrintDateDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/PrintDateDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -82,6 +83,10 @@ public class PrintDateDescriptor extends AbstractScalarFunctionDynamicDescriptor
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         byte[] bytes1 = argPtr1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/PrintDateTimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/PrintDateTimeDescriptor.java
index 066bef0..af909f8 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/PrintDateTimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/PrintDateTimeDescriptor.java
@@ -29,6 +29,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -81,6 +82,10 @@ public class PrintDateTimeDescriptor extends AbstractScalarFunctionDynamicDescri
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         byte[] bytes1 = argPtr1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/PrintTimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/PrintTimeDescriptor.java
index 2ad3642..3ce0ce3 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/PrintTimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/PrintTimeDescriptor.java
@@ -29,6 +29,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -80,6 +81,10 @@ public class PrintTimeDescriptor extends AbstractScalarFunctionDynamicDescriptor
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         byte[] bytes1 = argPtr1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromDatetimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromDatetimeDescriptor.java
index c0dccdc..aeb02ca 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromDatetimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromDatetimeDescriptor.java
@@ -31,6 +31,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -85,6 +86,10 @@ public class TimeFromDatetimeDescriptor extends AbstractScalarFunctionDynamicDes
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromUnixTimeInMsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromUnixTimeInMsDescriptor.java
index a253a89..3a854ae 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromUnixTimeInMsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromUnixTimeInMsDescriptor.java
@@ -29,6 +29,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -79,6 +80,11 @@ public class TimeFromUnixTimeInMsDescriptor extends AbstractScalarFunctionDynami
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         aTime.setValue(ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 0,
                                 argPtr.getByteArray(), argPtr.getStartOffset()));
                         timeSerde.serialize(aTime, out);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDateInDaysDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDateInDaysDescriptor.java
index 4c65646..675590d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDateInDaysDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDateInDaysDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -78,6 +79,11 @@ public class UnixTimeFromDateInDaysDescriptor extends AbstractScalarFunctionDyna
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInMsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInMsDescriptor.java
index 68da88d..1ef1b97 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInMsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInMsDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -76,6 +77,11 @@ public class UnixTimeFromDatetimeInMsDescriptor extends AbstractScalarFunctionDy
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInSecsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInSecsDescriptor.java
index be9e307..5efa5f2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInSecsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInSecsDescriptor.java
@@ -32,6 +32,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -82,6 +83,11 @@ public class UnixTimeFromDatetimeInSecsDescriptor extends AbstractScalarFunction
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromTimeInMsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromTimeInMsDescriptor.java
index a44626d..2bae6ad 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromTimeInMsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromTimeInMsDescriptor.java
@@ -30,6 +30,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -78,6 +79,11 @@ public class UnixTimeFromTimeInMsDescriptor extends AbstractScalarFunctionDynami
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         resultStorage.reset();
                         eval.evaluate(tuple, argPtr);
+
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+                            return;
+                        }
+
                         byte[] bytes = argPtr.getByteArray();
                         int offset = argPtr.getStartOffset();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/YearMonthDurationComparatorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/YearMonthDurationComparatorDescriptor.java
index f7407c2..4f1800b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/YearMonthDurationComparatorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/YearMonthDurationComparatorDescriptor.java
@@ -27,6 +27,7 @@ import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -77,6 +78,10 @@ public class YearMonthDurationComparatorDescriptor extends AbstractScalarFunctio
                         eval0.evaluate(tuple, argPtr0);
                         eval1.evaluate(tuple, argPtr1);
 
+                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr0, argPtr1)) {
+                            return;
+                        }
+
                         byte[] bytes0 = argPtr0.getByteArray();
                         int offset0 = argPtr0.getStartOffset();
                         byte[] bytes1 = argPtr1.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
index 15ece9c..a5e6561 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
@@ -554,24 +554,24 @@ public final class FunctionCollection implements IFunctionCollection {
         fc.add(ArrayPrependDescriptor.FACTORY);
         fc.add(ArrayAppendDescriptor.FACTORY);
         fc.add(ArrayInsertDescriptor.FACTORY);
-        fc.addGenerated(ArrayPositionDescriptor.FACTORY);
-        fc.addGenerated(ArrayRepeatDescriptor.FACTORY);
-        fc.addGenerated(ArrayContainsDescriptor.FACTORY);
-        fc.addGenerated(ArrayReverseDescriptor.FACTORY);
-        fc.addGenerated(ArraySortDescriptor.FACTORY);
-        fc.addGenerated(ArrayDistinctDescriptor.FACTORY);
-        fc.addGenerated(ArrayUnionDescriptor.FACTORY);
-        fc.addGenerated(ArrayIntersectDescriptor.FACTORY);
-        fc.addGenerated(ArrayIfNullDescriptor.FACTORY);
-        fc.addGenerated(ArrayConcatDescriptor.FACTORY);
-        fc.addGenerated(ArrayRangeDescriptor.FACTORY);
-        fc.addGenerated(ArrayFlattenDescriptor.FACTORY);
+        fc.add(ArrayPositionDescriptor.FACTORY);
+        fc.add(ArrayRepeatDescriptor.FACTORY);
+        fc.add(ArrayContainsDescriptor.FACTORY);
+        fc.add(ArrayReverseDescriptor.FACTORY);
+        fc.add(ArraySortDescriptor.FACTORY);
+        fc.add(ArrayDistinctDescriptor.FACTORY);
+        fc.add(ArrayUnionDescriptor.FACTORY);
+        fc.add(ArrayIntersectDescriptor.FACTORY);
+        fc.add(ArrayIfNullDescriptor.FACTORY);
+        fc.add(ArrayConcatDescriptor.FACTORY);
+        fc.add(ArrayRangeDescriptor.FACTORY);
+        fc.add(ArrayFlattenDescriptor.FACTORY);
         fc.add(ArrayReplaceDescriptor.FACTORY);
-        fc.addGenerated(ArraySliceWithEndPositionDescriptor.FACTORY);
-        fc.addGenerated(ArraySliceWithoutEndPositionDescriptor.FACTORY);
-        fc.addGenerated(ArraySymDiffDescriptor.FACTORY);
-        fc.addGenerated(ArraySymDiffnDescriptor.FACTORY);
-        fc.addGenerated(ArrayStarDescriptor.FACTORY);
+        fc.add(ArraySliceWithEndPositionDescriptor.FACTORY);
+        fc.add(ArraySliceWithoutEndPositionDescriptor.FACTORY);
+        fc.add(ArraySymDiffDescriptor.FACTORY);
+        fc.add(ArraySymDiffnDescriptor.FACTORY);
+        fc.add(ArrayStarDescriptor.FACTORY);
 
         // unnesting functions
         fc.add(TidRunningAggregateDescriptor.FACTORY);
@@ -843,279 +843,279 @@ public final class FunctionCollection implements IFunctionCollection {
         // functions that need generated class for null-handling.
 
         // Element accessors.
-        fc.addGenerated(FieldAccessByIndexDescriptor.FACTORY);
-        fc.addGenerated(FieldAccessByNameDescriptor.FACTORY);
-        fc.addGenerated(FieldAccessNestedDescriptor.FACTORY);
+        fc.add(FieldAccessByIndexDescriptor.FACTORY);
+        fc.add(FieldAccessByNameDescriptor.FACTORY);
+        fc.add(FieldAccessNestedDescriptor.FACTORY);
 
-        fc.addGenerated(AnyCollectionMemberDescriptor.FACTORY);
-        fc.addGenerated(GetItemDescriptor.FACTORY);
+        fc.add(AnyCollectionMemberDescriptor.FACTORY);
+        fc.add(GetItemDescriptor.FACTORY);
 
         // Numeric functions
         fc.add(IfInfDescriptor.FACTORY);
         fc.add(IfNanDescriptor.FACTORY);
         fc.add(IfNanOrInfDescriptor.FACTORY);
-        fc.addGenerated(NumericUnaryMinusDescriptor.FACTORY);
-        fc.addGenerated(NumericAddDescriptor.FACTORY);
-        fc.addGenerated(NumericDivideDescriptor.FACTORY);
-        fc.addGenerated(NumericDivDescriptor.FACTORY);
-        fc.addGenerated(NumericMultiplyDescriptor.FACTORY);
-        fc.addGenerated(NumericSubDescriptor.FACTORY);
-        fc.addGenerated(NumericModuloDescriptor.FACTORY);
-        fc.addGenerated(NumericPowerDescriptor.FACTORY);
-        fc.addGenerated(NotDescriptor.FACTORY);
-        fc.addGenerated(LenDescriptor.FACTORY);
-        fc.addGenerated(NumericAbsDescriptor.FACTORY);
-        fc.addGenerated(NumericCeilingDescriptor.FACTORY);
-        fc.addGenerated(NumericFloorDescriptor.FACTORY);
-        fc.addGenerated(NumericRoundDescriptor.FACTORY);
-        fc.addGenerated(NumericRoundHalfToEvenDescriptor.FACTORY);
-        fc.addGenerated(NumericRoundHalfToEven2Descriptor.FACTORY);
-        fc.addGenerated(NumericACosDescriptor.FACTORY);
-        fc.addGenerated(NumericASinDescriptor.FACTORY);
-        fc.addGenerated(NumericATanDescriptor.FACTORY);
-        fc.addGenerated(NumericDegreesDescriptor.FACTORY);
-        fc.addGenerated(NumericRadiansDescriptor.FACTORY);
-        fc.addGenerated(NumericCosDescriptor.FACTORY);
-        fc.addGenerated(NumericCoshDescriptor.FACTORY);
-        fc.addGenerated(NumericSinDescriptor.FACTORY);
-        fc.addGenerated(NumericSinhDescriptor.FACTORY);
-        fc.addGenerated(NumericTanDescriptor.FACTORY);
-        fc.addGenerated(NumericTanhDescriptor.FACTORY);
-        fc.addGenerated(NumericExpDescriptor.FACTORY);
-        fc.addGenerated(NumericLnDescriptor.FACTORY);
-        fc.addGenerated(NumericLogDescriptor.FACTORY);
-        fc.addGenerated(NumericSqrtDescriptor.FACTORY);
-        fc.addGenerated(NumericSignDescriptor.FACTORY);
-        fc.addGenerated(NumericTruncDescriptor.FACTORY);
-        fc.addGenerated(NumericATan2Descriptor.FACTORY);
+        fc.add(NumericUnaryMinusDescriptor.FACTORY);
+        fc.add(NumericAddDescriptor.FACTORY);
+        fc.add(NumericDivideDescriptor.FACTORY);
+        fc.add(NumericDivDescriptor.FACTORY);
+        fc.add(NumericMultiplyDescriptor.FACTORY);
+        fc.add(NumericSubDescriptor.FACTORY);
+        fc.add(NumericModuloDescriptor.FACTORY);
+        fc.add(NumericPowerDescriptor.FACTORY);
+        fc.add(NotDescriptor.FACTORY);
+        fc.add(LenDescriptor.FACTORY);
+        fc.add(NumericAbsDescriptor.FACTORY);
+        fc.add(NumericCeilingDescriptor.FACTORY);
+        fc.add(NumericFloorDescriptor.FACTORY);
+        fc.add(NumericRoundDescriptor.FACTORY);
+        fc.add(NumericRoundHalfToEvenDescriptor.FACTORY);
+        fc.add(NumericRoundHalfToEven2Descriptor.FACTORY);
+        fc.add(NumericACosDescriptor.FACTORY);
+        fc.add(NumericASinDescriptor.FACTORY);
+        fc.add(NumericATanDescriptor.FACTORY);
+        fc.add(NumericDegreesDescriptor.FACTORY);
+        fc.add(NumericRadiansDescriptor.FACTORY);
+        fc.add(NumericCosDescriptor.FACTORY);
+        fc.add(NumericCoshDescriptor.FACTORY);
+        fc.add(NumericSinDescriptor.FACTORY);
+        fc.add(NumericSinhDescriptor.FACTORY);
+        fc.add(NumericTanDescriptor.FACTORY);
+        fc.add(NumericTanhDescriptor.FACTORY);
+        fc.add(NumericExpDescriptor.FACTORY);
+        fc.add(NumericLnDescriptor.FACTORY);
+        fc.add(NumericLogDescriptor.FACTORY);
+        fc.add(NumericSqrtDescriptor.FACTORY);
+        fc.add(NumericSignDescriptor.FACTORY);
+        fc.add(NumericTruncDescriptor.FACTORY);
+        fc.add(NumericATan2Descriptor.FACTORY);
 
         // Comparisons.
-        fc.addGenerated(EqualsDescriptor.FACTORY);
-        fc.addGenerated(GreaterThanDescriptor.FACTORY);
-        fc.addGenerated(GreaterThanOrEqualsDescriptor.FACTORY);
-        fc.addGenerated(LessThanDescriptor.FACTORY);
-        fc.addGenerated(LessThanOrEqualsDescriptor.FACTORY);
-        fc.addGenerated(NotEqualsDescriptor.FACTORY);
+        fc.add(EqualsDescriptor.FACTORY);
+        fc.add(GreaterThanDescriptor.FACTORY);
+        fc.add(GreaterThanOrEqualsDescriptor.FACTORY);
+        fc.add(LessThanDescriptor.FACTORY);
+        fc.add(LessThanOrEqualsDescriptor.FACTORY);
+        fc.add(NotEqualsDescriptor.FACTORY);
 
         // If-Equals functions
-        fc.addGenerated(MissingIfEqualsDescriptor.FACTORY);
-        fc.addGenerated(NullIfEqualsDescriptor.FACTORY);
-        fc.addGenerated(NanIfEqualsDescriptor.FACTORY);
-        fc.addGenerated(PosInfIfEqualsDescriptor.FACTORY);
-        fc.addGenerated(NegInfIfEqualsDescriptor.FACTORY);
+        fc.add(MissingIfEqualsDescriptor.FACTORY);
+        fc.add(NullIfEqualsDescriptor.FACTORY);
+        fc.add(NanIfEqualsDescriptor.FACTORY);
+        fc.add(PosInfIfEqualsDescriptor.FACTORY);
+        fc.add(NegInfIfEqualsDescriptor.FACTORY);
 
         // Binary functions
-        fc.addGenerated(BinaryLengthDescriptor.FACTORY);
-        fc.addGenerated(ParseBinaryDescriptor.FACTORY);
-        fc.addGenerated(PrintBinaryDescriptor.FACTORY);
-        fc.addGenerated(BinaryConcatDescriptor.FACTORY);
-        fc.addGenerated(SubBinaryFromDescriptor.FACTORY);
-        fc.addGenerated(SubBinaryFromToDescriptor.FACTORY);
-        fc.addGenerated(FindBinaryDescriptor.FACTORY);
-        fc.addGenerated(FindBinaryFromDescriptor.FACTORY);
+        fc.add(BinaryLengthDescriptor.FACTORY);
+        fc.add(ParseBinaryDescriptor.FACTORY);
+        fc.add(PrintBinaryDescriptor.FACTORY);
+        fc.add(BinaryConcatDescriptor.FACTORY);
+        fc.add(SubBinaryFromDescriptor.FACTORY);
+        fc.add(SubBinaryFromToDescriptor.FACTORY);
+        fc.add(FindBinaryDescriptor.FACTORY);
+        fc.add(FindBinaryFromDescriptor.FACTORY);
 
         // String functions
-        fc.addGenerated(StringLikeDescriptor.FACTORY);
-        fc.addGenerated(StringContainsDescriptor.FACTORY);
-        fc.addGenerated(StringEndsWithDescriptor.FACTORY);
-        fc.addGenerated(StringStartsWithDescriptor.FACTORY);
-        fc.addGenerated(SubstringDescriptor.FACTORY);
-        fc.addGenerated(StringEqualDescriptor.FACTORY);
-        fc.addGenerated(StringLowerCaseDescriptor.FACTORY);
-        fc.addGenerated(StringUpperCaseDescriptor.FACTORY);
-        fc.addGenerated(StringLengthDescriptor.FACTORY);
-        fc.addGenerated(Substring2Descriptor.FACTORY);
-        fc.addGenerated(SubstringBeforeDescriptor.FACTORY);
-        fc.addGenerated(SubstringAfterDescriptor.FACTORY);
-        fc.addGenerated(StringToCodePointDescriptor.FACTORY);
-        fc.addGenerated(CodePointToStringDescriptor.FACTORY);
-        fc.addGenerated(StringConcatDescriptor.FACTORY);
-        fc.addGenerated(StringJoinDescriptor.FACTORY);
-        fc.addGenerated(StringRegExpContainsDescriptor.FACTORY);
-        fc.addGenerated(StringRegExpContainsWithFlagDescriptor.FACTORY);
-        fc.addGenerated(StringRegExpLikeDescriptor.FACTORY);
-        fc.addGenerated(StringRegExpLikeWithFlagDescriptor.FACTORY);
-        fc.addGenerated(StringRegExpPositionDescriptor.FACTORY);
-        fc.addGenerated(StringRegExpPositionWithFlagDescriptor.FACTORY);
-        fc.addGenerated(StringRegExpReplaceDescriptor.FACTORY);
-        fc.addGenerated(StringRegExpReplaceWithFlagDescriptor.FACTORY);
-        fc.addGenerated(StringInitCapDescriptor.FACTORY);
-        fc.addGenerated(StringTrimDescriptor.FACTORY);
-        fc.addGenerated(StringLTrimDescriptor.FACTORY);
-        fc.addGenerated(StringRTrimDescriptor.FACTORY);
-        fc.addGenerated(StringTrim2Descriptor.FACTORY);
-        fc.addGenerated(StringLTrim2Descriptor.FACTORY);
-        fc.addGenerated(StringRTrim2Descriptor.FACTORY);
-        fc.addGenerated(StringPositionDescriptor.FACTORY);
-        fc.addGenerated(StringRepeatDescriptor.FACTORY);
-        fc.addGenerated(StringReplaceDescriptor.FACTORY);
-        fc.addGenerated(StringReplaceWithLimitDescriptor.FACTORY);
-        fc.addGenerated(StringReverseDescriptor.FACTORY);
-        fc.addGenerated(StringSplitDescriptor.FACTORY);
+        fc.add(StringLikeDescriptor.FACTORY);
+        fc.add(StringContainsDescriptor.FACTORY);
+        fc.add(StringEndsWithDescriptor.FACTORY);
+        fc.add(StringStartsWithDescriptor.FACTORY);
+        fc.add(SubstringDescriptor.FACTORY);
+        fc.add(StringEqualDescriptor.FACTORY);
+        fc.add(StringLowerCaseDescriptor.FACTORY);
+        fc.add(StringUpperCaseDescriptor.FACTORY);
+        fc.add(StringLengthDescriptor.FACTORY);
+        fc.add(Substring2Descriptor.FACTORY);
+        fc.add(SubstringBeforeDescriptor.FACTORY);
+        fc.add(SubstringAfterDescriptor.FACTORY);
+        fc.add(StringToCodePointDescriptor.FACTORY);
+        fc.add(CodePointToStringDescriptor.FACTORY);
+        fc.add(StringConcatDescriptor.FACTORY);
+        fc.add(StringJoinDescriptor.FACTORY);
+        fc.add(StringRegExpContainsDescriptor.FACTORY);
+        fc.add(StringRegExpContainsWithFlagDescriptor.FACTORY);
+        fc.add(StringRegExpLikeDescriptor.FACTORY);
+        fc.add(StringRegExpLikeWithFlagDescriptor.FACTORY);
+        fc.add(StringRegExpPositionDescriptor.FACTORY);
+        fc.add(StringRegExpPositionWithFlagDescriptor.FACTORY);
+        fc.add(StringRegExpReplaceDescriptor.FACTORY);
+        fc.add(StringRegExpReplaceWithFlagDescriptor.FACTORY);
+        fc.add(StringInitCapDescriptor.FACTORY);
+        fc.add(StringTrimDescriptor.FACTORY);
+        fc.add(StringLTrimDescriptor.FACTORY);
+        fc.add(StringRTrimDescriptor.FACTORY);
+        fc.add(StringTrim2Descriptor.FACTORY);
+        fc.add(StringLTrim2Descriptor.FACTORY);
+        fc.add(StringRTrim2Descriptor.FACTORY);
+        fc.add(StringPositionDescriptor.FACTORY);
+        fc.add(StringRepeatDescriptor.FACTORY);
+        fc.add(StringReplaceDescriptor.FACTORY);
+        fc.add(StringReplaceWithLimitDescriptor.FACTORY);
+        fc.add(StringReverseDescriptor.FACTORY);
+        fc.add(StringSplitDescriptor.FACTORY);
 
         // Constructors
-        fc.addGenerated(ABooleanConstructorDescriptor.FACTORY);
-        fc.addGenerated(ABinaryHexStringConstructorDescriptor.FACTORY);
-        fc.addGenerated(ABinaryBase64StringConstructorDescriptor.FACTORY);
-        fc.addGenerated(AStringConstructorDescriptor.FACTORY);
-        fc.addGenerated(AInt8ConstructorDescriptor.FACTORY);
-        fc.addGenerated(AInt16ConstructorDescriptor.FACTORY);
-        fc.addGenerated(AInt32ConstructorDescriptor.FACTORY);
-        fc.addGenerated(AInt64ConstructorDescriptor.FACTORY);
-        fc.addGenerated(AFloatConstructorDescriptor.FACTORY);
-        fc.addGenerated(ADoubleConstructorDescriptor.FACTORY);
-        fc.addGenerated(APointConstructorDescriptor.FACTORY);
-        fc.addGenerated(APoint3DConstructorDescriptor.FACTORY);
-        fc.addGenerated(ALineConstructorDescriptor.FACTORY);
-        fc.addGenerated(APolygonConstructorDescriptor.FACTORY);
-        fc.addGenerated(ACircleConstructorDescriptor.FACTORY);
-        fc.addGenerated(ARectangleConstructorDescriptor.FACTORY);
-        fc.addGenerated(ATimeConstructorDescriptor.FACTORY);
-        fc.addGenerated(ADateConstructorDescriptor.FACTORY);
-        fc.addGenerated(ADateTimeConstructorDescriptor.FACTORY);
-        fc.addGenerated(ADurationConstructorDescriptor.FACTORY);
-        fc.addGenerated(AYearMonthDurationConstructorDescriptor.FACTORY);
-        fc.addGenerated(ADayTimeDurationConstructorDescriptor.FACTORY);
-        fc.addGenerated(AUUIDFromStringConstructorDescriptor.FACTORY);
-        fc.addGenerated(AIntervalConstructorDescriptor.FACTORY);
-        fc.addGenerated(AIntervalStartFromDateConstructorDescriptor.FACTORY);
-        fc.addGenerated(AIntervalStartFromDateTimeConstructorDescriptor.FACTORY);
-        fc.addGenerated(AIntervalStartFromTimeConstructorDescriptor.FACTORY);
+        fc.add(ABooleanConstructorDescriptor.FACTORY);
+        fc.add(ABinaryHexStringConstructorDescriptor.FACTORY);
+        fc.add(ABinaryBase64StringConstructorDescriptor.FACTORY);
+        fc.add(AStringConstructorDescriptor.FACTORY);
+        fc.add(AInt8ConstructorDescriptor.FACTORY);
+        fc.add(AInt16ConstructorDescriptor.FACTORY);
+        fc.add(AInt32ConstructorDescriptor.FACTORY);
+        fc.add(AInt64ConstructorDescriptor.FACTORY);
+        fc.add(AFloatConstructorDescriptor.FACTORY);
+        fc.add(ADoubleConstructorDescriptor.FACTORY);
+        fc.add(APointConstructorDescriptor.FACTORY);
+        fc.add(APoint3DConstructorDescriptor.FACTORY);
+        fc.add(ALineConstructorDescriptor.FACTORY);
+        fc.add(APolygonConstructorDescriptor.FACTORY);
+        fc.add(ACircleConstructorDescriptor.FACTORY);
+        fc.add(ARectangleConstructorDescriptor.FACTORY);
+        fc.add(ATimeConstructorDescriptor.FACTORY);
+        fc.add(ADateConstructorDescriptor.FACTORY);
+        fc.add(ADateTimeConstructorDescriptor.FACTORY);
+        fc.add(ADurationConstructorDescriptor.FACTORY);
+        fc.add(AYearMonthDurationConstructorDescriptor.FACTORY);
+        fc.add(ADayTimeDurationConstructorDescriptor.FACTORY);
+        fc.add(AUUIDFromStringConstructorDescriptor.FACTORY);
+        fc.add(AIntervalConstructorDescriptor.FACTORY);
+        fc.add(AIntervalStartFromDateConstructorDescriptor.FACTORY);
+        fc.add(AIntervalStartFromDateTimeConstructorDescriptor.FACTORY);
+        fc.add(AIntervalStartFromTimeConstructorDescriptor.FACTORY);
 
         // Spatial
-        fc.addGenerated(CreatePointDescriptor.FACTORY);
-        fc.addGenerated(CreateLineDescriptor.FACTORY);
-        fc.addGenerated(CreatePolygonDescriptor.FACTORY);
-        fc.addGenerated(CreateCircleDescriptor.FACTORY);
-        fc.addGenerated(CreateRectangleDescriptor.FACTORY);
-        fc.addGenerated(SpatialAreaDescriptor.FACTORY);
-        fc.addGenerated(SpatialDistanceDescriptor.FACTORY);
-        fc.addGenerated(CreateMBRDescriptor.FACTORY);
-        fc.addGenerated(SpatialCellDescriptor.FACTORY);
-        fc.addGenerated(PointXCoordinateAccessor.FACTORY);
-        fc.addGenerated(PointYCoordinateAccessor.FACTORY);
-        fc.addGenerated(CircleRadiusAccessor.FACTORY);
-        fc.addGenerated(CircleCenterAccessor.FACTORY);
-        fc.addGenerated(LineRectanglePolygonAccessor.FACTORY);
+        fc.add(CreatePointDescriptor.FACTORY);
+        fc.add(CreateLineDescriptor.FACTORY);
+        fc.add(CreatePolygonDescriptor.FACTORY);
+        fc.add(CreateCircleDescriptor.FACTORY);
+        fc.add(CreateRectangleDescriptor.FACTORY);
+        fc.add(SpatialAreaDescriptor.FACTORY);
+        fc.add(SpatialDistanceDescriptor.FACTORY);
+        fc.add(CreateMBRDescriptor.FACTORY);
+        fc.add(SpatialCellDescriptor.FACTORY);
+        fc.add(PointXCoordinateAccessor.FACTORY);
+        fc.add(PointYCoordinateAccessor.FACTORY);
+        fc.add(CircleRadiusAccessor.FACTORY);
+        fc.add(CircleCenterAccessor.FACTORY);
+        fc.add(LineRectanglePolygonAccessor.FACTORY);
 
         // full-text function
-        fc.addGenerated(FullTextContainsDescriptor.FACTORY);
-        fc.addGenerated(FullTextContainsWithoutOptionDescriptor.FACTORY);
+        fc.add(FullTextContainsDescriptor.FACTORY);
+        fc.add(FullTextContainsWithoutOptionDescriptor.FACTORY);
 
         // Record functions.
-        fc.addGenerated(GetRecordFieldsDescriptor.FACTORY);
-        fc.addGenerated(GetRecordFieldValueDescriptor.FACTORY);
-        fc.addGenerated(DeepEqualityDescriptor.FACTORY);
-        fc.addGenerated(RecordMergeDescriptor.FACTORY);
-        fc.addGenerated(RecordAddFieldsDescriptor.FACTORY);
-        fc.addGenerated(RecordRemoveFieldsDescriptor.FACTORY);
-        fc.addGenerated(RecordLengthDescriptor.FACTORY);
-        fc.addGenerated(RecordNamesDescriptor.FACTORY);
-        fc.addGenerated(RecordRemoveDescriptor.FACTORY);
-        fc.addGenerated(RecordRenameDescriptor.FACTORY);
-        fc.addGenerated(RecordUnwrapDescriptor.FACTORY);
+        fc.add(GetRecordFieldsDescriptor.FACTORY);
+        fc.add(GetRecordFieldValueDescriptor.FACTORY);
+        fc.add(DeepEqualityDescriptor.FACTORY);
+        fc.add(RecordMergeDescriptor.FACTORY);
+        fc.add(RecordAddFieldsDescriptor.FACTORY);
+        fc.add(RecordRemoveFieldsDescriptor.FACTORY);
+        fc.add(RecordLengthDescriptor.FACTORY);
+        fc.add(RecordNamesDescriptor.FACTORY);
+        fc.add(RecordRemoveDescriptor.FACTORY);
+        fc.add(RecordRenameDescriptor.FACTORY);
+        fc.add(RecordUnwrapDescriptor.FACTORY);
         fc.add(RecordReplaceDescriptor.FACTORY);
         fc.add(RecordAddDescriptor.FACTORY);
         fc.add(RecordPutDescriptor.FACTORY);
-        fc.addGenerated(RecordValuesDescriptor.FACTORY);
-        fc.addGenerated(PairsDescriptor.FACTORY);
+        fc.add(RecordValuesDescriptor.FACTORY);
+        fc.add(PairsDescriptor.FACTORY);
 
         // Spatial and temporal type accessors
-        fc.addGenerated(TemporalYearAccessor.FACTORY);
-        fc.addGenerated(TemporalMonthAccessor.FACTORY);
-        fc.addGenerated(TemporalDayAccessor.FACTORY);
-        fc.addGenerated(TemporalHourAccessor.FACTORY);
-        fc.addGenerated(TemporalMinuteAccessor.FACTORY);
-        fc.addGenerated(TemporalSecondAccessor.FACTORY);
-        fc.addGenerated(TemporalMillisecondAccessor.FACTORY);
-        fc.addGenerated(TemporalIntervalStartAccessor.FACTORY);
-        fc.addGenerated(TemporalIntervalEndAccessor.FACTORY);
-        fc.addGenerated(TemporalIntervalStartDateAccessor.FACTORY);
-        fc.addGenerated(TemporalIntervalEndDateAccessor.FACTORY);
-        fc.addGenerated(TemporalIntervalStartTimeAccessor.FACTORY);
-        fc.addGenerated(TemporalIntervalEndTimeAccessor.FACTORY);
-        fc.addGenerated(TemporalIntervalStartDatetimeAccessor.FACTORY);
-        fc.addGenerated(TemporalIntervalEndDatetimeAccessor.FACTORY);
+        fc.add(TemporalYearAccessor.FACTORY);
+        fc.add(TemporalMonthAccessor.FACTORY);
+        fc.add(TemporalDayAccessor.FACTORY);
+        fc.add(TemporalHourAccessor.FACTORY);
+        fc.add(TemporalMinuteAccessor.FACTORY);
+        fc.add(TemporalSecondAccessor.FACTORY);
+        fc.add(TemporalMillisecondAccessor.FACTORY);
+        fc.add(TemporalIntervalStartAccessor.FACTORY);
+        fc.add(TemporalIntervalEndAccessor.FACTORY);
+        fc.add(TemporalIntervalStartDateAccessor.FACTORY);
+        fc.add(TemporalIntervalEndDateAccessor.FACTORY);
+        fc.add(TemporalIntervalStartTimeAccessor.FACTORY);
+        fc.add(TemporalIntervalEndTimeAccessor.FACTORY);
+        fc.add(TemporalIntervalStartDatetimeAccessor.FACTORY);
+        fc.add(TemporalIntervalEndDatetimeAccessor.FACTORY);
 
         // Temporal functions
-        fc.addGenerated(UnixTimeFromDateInDaysDescriptor.FACTORY);
-        fc.addGenerated(UnixTimeFromTimeInMsDescriptor.FACTORY);
-        fc.addGenerated(UnixTimeFromDatetimeInMsDescriptor.FACTORY);
-        fc.addGenerated(UnixTimeFromDatetimeInSecsDescriptor.FACTORY);
-        fc.addGenerated(DateFromUnixTimeInDaysDescriptor.FACTORY);
-        fc.addGenerated(DateFromDatetimeDescriptor.FACTORY);
-        fc.addGenerated(TimeFromUnixTimeInMsDescriptor.FACTORY);
-        fc.addGenerated(TimeFromDatetimeDescriptor.FACTORY);
-        fc.addGenerated(DatetimeFromUnixTimeInMsDescriptor.FACTORY);
-        fc.addGenerated(DatetimeFromUnixTimeInSecsDescriptor.FACTORY);
-        fc.addGenerated(DatetimeFromDateAndTimeDescriptor.FACTORY);
-        fc.addGenerated(CalendarDurationFromDateTimeDescriptor.FACTORY);
-        fc.addGenerated(CalendarDuartionFromDateDescriptor.FACTORY);
-        fc.addGenerated(AdjustDateTimeForTimeZoneDescriptor.FACTORY);
-        fc.addGenerated(AdjustTimeForTimeZoneDescriptor.FACTORY);
-        fc.addGenerated(IntervalBeforeDescriptor.FACTORY);
-        fc.addGenerated(IntervalAfterDescriptor.FACTORY);
-        fc.addGenerated(IntervalMeetsDescriptor.FACTORY);
-        fc.addGenerated(IntervalMetByDescriptor.FACTORY);
-        fc.addGenerated(IntervalOverlapsDescriptor.FACTORY);
-        fc.addGenerated(IntervalOverlappedByDescriptor.FACTORY);
-        fc.addGenerated(OverlapDescriptor.FACTORY);
-        fc.addGenerated(IntervalStartsDescriptor.FACTORY);
-        fc.addGenerated(IntervalStartedByDescriptor.FACTORY);
-        fc.addGenerated(IntervalCoversDescriptor.FACTORY);
-        fc.addGenerated(IntervalCoveredByDescriptor.FACTORY);
-        fc.addGenerated(IntervalEndsDescriptor.FACTORY);
-        fc.addGenerated(IntervalEndedByDescriptor.FACTORY);
-        fc.addGenerated(DurationFromMillisecondsDescriptor.FACTORY);
-        fc.addGenerated(DurationFromMonthsDescriptor.FACTORY);
-        fc.addGenerated(YearMonthDurationGreaterThanComparatorDescriptor.FACTORY);
-        fc.addGenerated(YearMonthDurationLessThanComparatorDescriptor.FACTORY);
-        fc.addGenerated(DayTimeDurationGreaterThanComparatorDescriptor.FACTORY);
-        fc.addGenerated(DayTimeDurationLessThanComparatorDescriptor.FACTORY);
-        fc.addGenerated(MonthsFromYearMonthDurationDescriptor.FACTORY);
-        fc.addGenerated(MillisecondsFromDayTimeDurationDescriptor.FACTORY);
-        fc.addGenerated(DurationEqualDescriptor.FACTORY);
-        fc.addGenerated(GetYearMonthDurationDescriptor.FACTORY);
-        fc.addGenerated(GetDayTimeDurationDescriptor.FACTORY);
-        fc.addGenerated(IntervalBinDescriptor.FACTORY);
-        fc.addGenerated(OverlapBinsDescriptor.FACTORY);
-        fc.addGenerated(DayOfWeekDescriptor.FACTORY);
-        fc.addGenerated(ParseDateDescriptor.FACTORY);
-        fc.addGenerated(ParseTimeDescriptor.FACTORY);
-        fc.addGenerated(ParseDateTimeDescriptor.FACTORY);
-        fc.addGenerated(PrintDateDescriptor.FACTORY);
-        fc.addGenerated(PrintTimeDescriptor.FACTORY);
-        fc.addGenerated(PrintDateTimeDescriptor.FACTORY);
-        fc.addGenerated(GetOverlappingIntervalDescriptor.FACTORY);
-        fc.addGenerated(DurationFromIntervalDescriptor.FACTORY);
+        fc.add(UnixTimeFromDateInDaysDescriptor.FACTORY);
+        fc.add(UnixTimeFromTimeInMsDescriptor.FACTORY);
+        fc.add(UnixTimeFromDatetimeInMsDescriptor.FACTORY);
+        fc.add(UnixTimeFromDatetimeInSecsDescriptor.FACTORY);
+        fc.add(DateFromUnixTimeInDaysDescriptor.FACTORY);
+        fc.add(DateFromDatetimeDescriptor.FACTORY);
+        fc.add(TimeFromUnixTimeInMsDescriptor.FACTORY);
+        fc.add(TimeFromDatetimeDescriptor.FACTORY);
+        fc.add(DatetimeFromUnixTimeInMsDescriptor.FACTORY);
+        fc.add(DatetimeFromUnixTimeInSecsDescriptor.FACTORY);
+        fc.add(DatetimeFromDateAndTimeDescriptor.FACTORY);
+        fc.add(CalendarDurationFromDateTimeDescriptor.FACTORY);
+        fc.add(CalendarDuartionFromDateDescriptor.FACTORY);
+        fc.add(AdjustDateTimeForTimeZoneDescriptor.FACTORY);
+        fc.add(AdjustTimeForTimeZoneDescriptor.FACTORY);
+        fc.add(IntervalBeforeDescriptor.FACTORY);
+        fc.add(IntervalAfterDescriptor.FACTORY);
+        fc.add(IntervalMeetsDescriptor.FACTORY);
+        fc.add(IntervalMetByDescriptor.FACTORY);
+        fc.add(IntervalOverlapsDescriptor.FACTORY);
+        fc.add(IntervalOverlappedByDescriptor.FACTORY);
+        fc.add(OverlapDescriptor.FACTORY);
+        fc.add(IntervalStartsDescriptor.FACTORY);
+        fc.add(IntervalStartedByDescriptor.FACTORY);
+        fc.add(IntervalCoversDescriptor.FACTORY);
+        fc.add(IntervalCoveredByDescriptor.FACTORY);
+        fc.add(IntervalEndsDescriptor.FACTORY);
+        fc.add(IntervalEndedByDescriptor.FACTORY);
+        fc.add(DurationFromMillisecondsDescriptor.FACTORY);
+        fc.add(DurationFromMonthsDescriptor.FACTORY);
+        fc.add(YearMonthDurationGreaterThanComparatorDescriptor.FACTORY);
+        fc.add(YearMonthDurationLessThanComparatorDescriptor.FACTORY);
+        fc.add(DayTimeDurationGreaterThanComparatorDescriptor.FACTORY);
+        fc.add(DayTimeDurationLessThanComparatorDescriptor.FACTORY);
+        fc.add(MonthsFromYearMonthDurationDescriptor.FACTORY);
+        fc.add(MillisecondsFromDayTimeDurationDescriptor.FACTORY);
+        fc.add(DurationEqualDescriptor.FACTORY);
+        fc.add(GetYearMonthDurationDescriptor.FACTORY);
+        fc.add(GetDayTimeDurationDescriptor.FACTORY);
+        fc.add(IntervalBinDescriptor.FACTORY);
+        fc.add(OverlapBinsDescriptor.FACTORY);
+        fc.add(DayOfWeekDescriptor.FACTORY);
+        fc.add(ParseDateDescriptor.FACTORY);
+        fc.add(ParseTimeDescriptor.FACTORY);
+        fc.add(ParseDateTimeDescriptor.FACTORY);
+        fc.add(PrintDateDescriptor.FACTORY);
+        fc.add(PrintTimeDescriptor.FACTORY);
+        fc.add(PrintDateTimeDescriptor.FACTORY);
+        fc.add(GetOverlappingIntervalDescriptor.FACTORY);
+        fc.add(DurationFromIntervalDescriptor.FACTORY);
 
         // Type functions.
-        fc.addGenerated(IsArrayDescriptor.FACTORY);
-        fc.addGenerated(IsAtomicDescriptor.FACTORY);
-        fc.addGenerated(IsBooleanDescriptor.FACTORY);
-        fc.addGenerated(IsNumberDescriptor.FACTORY);
-        fc.addGenerated(IsObjectDescriptor.FACTORY);
-        fc.addGenerated(IsStringDescriptor.FACTORY);
-        fc.addGenerated(ToArrayDescriptor.FACTORY);
-        fc.addGenerated(ToAtomicDescriptor.FACTORY);
-        fc.addGenerated(ToBigIntDescriptor.FACTORY);
-        fc.addGenerated(ToBooleanDescriptor.FACTORY);
-        fc.addGenerated(ToDoubleDescriptor.FACTORY);
-        fc.addGenerated(ToNumberDescriptor.FACTORY);
-        fc.addGenerated(ToObjectDescriptor.FACTORY);
-        fc.addGenerated(ToStringDescriptor.FACTORY);
+        fc.add(IsArrayDescriptor.FACTORY);
+        fc.add(IsAtomicDescriptor.FACTORY);
+        fc.add(IsBooleanDescriptor.FACTORY);
+        fc.add(IsNumberDescriptor.FACTORY);
+        fc.add(IsObjectDescriptor.FACTORY);
+        fc.add(IsStringDescriptor.FACTORY);
+        fc.add(ToArrayDescriptor.FACTORY);
+        fc.add(ToAtomicDescriptor.FACTORY);
+        fc.add(ToBigIntDescriptor.FACTORY);
+        fc.add(ToBooleanDescriptor.FACTORY);
+        fc.add(ToDoubleDescriptor.FACTORY);
+        fc.add(ToNumberDescriptor.FACTORY);
+        fc.add(ToObjectDescriptor.FACTORY);
+        fc.add(ToStringDescriptor.FACTORY);
 
-        fc.addGenerated(TreatAsIntegerDescriptor.FACTORY);
+        fc.add(TreatAsIntegerDescriptor.FACTORY);
 
         // Cast function
-        fc.addGenerated(CastTypeDescriptor.FACTORY);
-        fc.addGenerated(CastTypeLaxDescriptor.FACTORY);
+        fc.add(CastTypeDescriptor.FACTORY);
+        fc.add(CastTypeLaxDescriptor.FACTORY);
 
         // Record function
-        fc.addGenerated(RecordPairsDescriptor.FACTORY);
+        fc.add(RecordPairsDescriptor.FACTORY);
 
         // Other functions
-        fc.addGenerated(RandomWithSeedDescriptor.FACTORY);
+        fc.add(RandomWithSeedDescriptor.FACTORY);
 
         ServiceLoader.load(IFunctionRegistrant.class).iterator().forEachRemaining(c -> c.register(fc));
         return fc;