[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 <mblow@apache.org>
Contrib: Michael Blow <mblow@apache.org>
Integration-Tests: Michael Blow <mblow@apache.org>
Tested-by: Michael Blow <mblow@apache.org>
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 @@
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.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 {
+ // 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();
+
+ // Build the tests
+ for (IFunctionDescriptorFactory func : functions) {
+ String className = func.getClass().getName();
+ // 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 });
+ }
+ }
+ 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();
+ }
+ }
+
+ @Parameterized.Parameter
+ public String testName;
+
+ @Parameterized.Parameter(1)
+ public IFunctionDescriptorFactory funcFactory;
+
@Test
public void test() throws Exception {
- List<IFunctionDescriptorFactory> functions =
- FunctionCollection.createDefaultFunctionCollection().getFunctionDescriptorFactories();
- int testedFunctions = 0;
- 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;
- }
- }
- // 208 is the current number of functions with generated code.
- Assert.assertTrue(testedFunctions >= 208);
- }
+ IFunctionDescriptor functionDescriptor = funcFactory.createFunctionDescriptor();
- private void testFunction(IFunctionDescriptorFactory funcFactory) throws Exception {
- AbstractScalarFunctionDynamicDescriptor funcDesc =
- (AbstractScalarFunctionDynamicDescriptor) 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 @@
// 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 @@
++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 @@
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.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.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 {
+ // 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();
+
+ // Build the tests
+ for (IFunctionDescriptorFactory func : functions) {
+ String className = func.getClass().getName();
+ // 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 });
+ }
+ }
+ 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();
+ }
+ }
+
+ @Parameter
+ public String testName;
+
+ @Parameter(1)
+ public IFunctionDescriptorFactory funcFactory;
+
@Test
public void test() throws Exception {
- List<IFunctionDescriptorFactory> functions =
- FunctionCollection.createDefaultFunctionCollection().getFunctionDescriptorFactories();
- int testedFunctions = 0;
- Set<FunctionIdentifier> functionsRequiringTypes = new HashSet<>();
- buildFunctionsRequiringTypes(functionsRequiringTypes);
- 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;
- }
- }
- // 217 is the current number of functions with generated code.
- Assert.assertTrue("expected >= 217 generated functions to be tested, but was " + testedFunctions,
- testedFunctions >= 217);
- }
-
- private void testFunction(IFunctionDescriptorFactory funcFactory, String className,
- Set<FunctionIdentifier> functionsRequiringTypes) 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 @@
@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 @@
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.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 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.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 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.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 @@
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.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 @@
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.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 @@
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 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 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 @@
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 @@
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 @@
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 @@
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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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.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 @@
@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 @@
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.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 @@
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.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 @@
@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.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 @@
// 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.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 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.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 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.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 @@
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.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 @@
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.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 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.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 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.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 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.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 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.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 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.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 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.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 @@
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.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 @@
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.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 @@
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.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 @@
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.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 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.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 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.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 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.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 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.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 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.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 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.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 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.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 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.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 @@
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.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 @@
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.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 @@
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.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 @@
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 @@
@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 @@
}
}
- 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 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 @@
@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 @@
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 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 @@
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 @@
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 @@
@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 @@
@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 @@
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 @@
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 @@
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 @@
// 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 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 @@
@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 @@
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 @@
}
}
- 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..5551d956 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 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 @@
// 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 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 @@
@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 @@
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 @@
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 @@
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 @@
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 @@
@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 @@
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 @@
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 @@
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 @@
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 1b2f8fc7..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.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 @@
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.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 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.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 @@
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.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 @@
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.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 @@
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.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 @@
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 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 @@
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 @@
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 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 @@
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 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 @@
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 @@
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 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 @@
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 @@
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 @@
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 @@
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 @@
@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 @@
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 @@
@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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 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 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 @@
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 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 @@
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 @@
@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 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 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.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 @@
@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 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 @@
@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.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 @@
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.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 @@
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.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 @@
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.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 @@
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 @@
@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.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 @@
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.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 @@
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.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 @@
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.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 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.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 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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.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 @@
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.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 @@
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.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 @@
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.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 @@
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.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 @@
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.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 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.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 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.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 @@
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.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 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.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 @@
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.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 @@
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.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 @@
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.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 @@
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.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 @@
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.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 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.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 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.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 @@
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.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 @@
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.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 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.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 @@
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.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 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.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 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.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 @@
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.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 @@
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.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 @@
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.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 @@
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.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 @@
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.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 @@
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.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 @@
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.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 @@
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.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 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.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 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.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 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.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 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.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 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.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 @@
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 @@
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 @@
// 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;