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

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

commit 3fbcd5d04d6550bff820a4f240badadc0186a4d6
Merge: 2684395bed 32007cff27
Author: Michael Blow <[email protected]>
AuthorDate: Fri May 23 17:07:04 2025 -0400

    Merge branch 'gerrit/trinity' into 'gerrit/ionic'
    
    Change-Id: I8d48ac8209669e079be938b382b16de03f00dd85

 .../InjectTypeCastForFunctionArgumentsRule.java    |   1 +
 asterixdb/asterix-app/pom.xml                      |   2 +-
 .../hash_join_exchange.5.query.sqlpp               |  47 +++++
 .../hash_join_exchange.7.query.sqlpp               |  30 +++
 .../hash_join_exchange.9.query.sqlpp               |  41 ++++
 .../hash_join_exchange_1.11.query.sqlpp            |  43 ++++
 .../hash_join_exchange_1.13.query.sqlpp            |  36 ++++
 .../hash_join_exchange_1.5.query.sqlpp             |  46 +++++
 .../hash_join_exchange_1.7.query.sqlpp             |  33 +++
 .../hash_join_exchange_1.9.query.sqlpp             |  32 +++
 .../hash_join_exchange.5.query.plan                |  42 ++++
 .../hash_join_exchange.7.query.plan                |  42 ++++
 .../hash_join_exchange.9.query.plan                |  60 ++++++
 .../hash_join_exchange_1.11.query.plan             |  44 ++++
 .../hash_join_exchange_1.13.query.plan             |  42 ++++
 .../hash_join_exchange_1.5.query.plan              |  42 ++++
 .../hash_join_exchange_1.7.query.plan              |  44 ++++
 .../hash_join_exchange_1.9.query.plan              |  44 ++++
 .../hash_join_exchange.1.ddl.sqlpp                 |  28 +++
 .../hash_join_exchange.2.update.sqlpp              |  30 +++
 .../hash_join_exchange.3.update.sqlpp              |  37 ++++
 .../hash_join_exchange.4.query.sqlpp               |  33 +++
 .../hash_join_exchange.6.query.sqlpp               |  26 +++
 .../hash_join_exchange.8.query.sqlpp               |  33 +++
 .../hash_join_exchange_1.1.ddl.sqlpp               |  27 +++
 .../hash_join_exchange_1.10.query.sqlpp            |  33 +++
 .../hash_join_exchange_1.12.query.sqlpp            |  28 +++
 .../hash_join_exchange_1.2.update.sqlpp            |  24 +++
 .../hash_join_exchange_1.3.update.sqlpp            |  25 +++
 .../hash_join_exchange_1.4.query.sqlpp             |  31 +++
 .../hash_join_exchange_1.6.query.sqlpp             |  25 +++
 .../hash_join_exchange_1.8.query.sqlpp             |  24 +++
 .../handle_error_fun.01.query.sqlpp                |  25 +++
 .../hash_join_exchange/hash_join_exchange.4.adm    |  10 +
 .../hash_join_exchange/hash_join_exchange.6.adm    |  10 +
 .../hash_join_exchange/hash_join_exchange.8.adm    |  10 +
 .../hash_join_exchange_1.10.adm                    | 100 +++++++++
 .../hash_join_exchange_1.12.adm                    | 100 +++++++++
 .../hash_join_exchange_1.4.adm                     | 100 +++++++++
 .../hash_join_exchange_1.6.adm                     | 100 +++++++++
 .../hash_join_exchange_1.8.adm                     | 100 +++++++++
 .../misc/handle_error_fun/handle_error_fun.01.adm  |   1 +
 .../src/test/resources/runtimets/sqlpp_queries.xml |  15 ++
 asterixdb/asterix-external-data/pom.xml            |   5 -
 .../asterix/om/functions/BuiltinFunctions.java     |   3 +
 .../evaluators/functions/IfErrorDescriptor.java    |  70 +++++++
 .../runtime/functions/FunctionCollection.java      |   2 +
 asterixdb/pom.xml                                  | 229 ++-------------------
 .../physical/AbstractHashJoinPOperator.java        |  25 +--
 hyracks-fullstack/hyracks/hyracks-hdfs/pom.xml     |   4 +-
 hyracks-fullstack/pom.xml                          |  95 ++++++++-
 51 files changed, 1829 insertions(+), 250 deletions(-)

diff --cc asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
index 10e8302c06,50431e1309..d216c2d9e4
--- a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
@@@ -7529,11 -7325,11 +7539,16 @@@
          <output-dir compare="Text">serialized_size_fun</output-dir>
        </compilation-unit>
      </test-case>
+     <test-case FilePath="misc">
+       <compilation-unit name="handle_error_fun">
+         <output-dir compare="Text">handle_error_fun</output-dir>
+       </compilation-unit>
+     </test-case>
 +    <test-case FilePath="misc">
 +      <compilation-unit name="query-ASTERIXDB-3299">
 +        <output-dir compare="Text">query-ASTERIXDB-3299</output-dir>
 +      </compilation-unit>
 +    </test-case>
      <test-case FilePath="misc">
        <compilation-unit name="query-ASTERIXDB-3334">
          <output-dir compare="Text">query-ASTERIXDB-3334</output-dir>
diff --cc 
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
index 2bf5adcf01,5f5fe73260..1250eb91f7
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
@@@ -1222,89 -1614,121 +1222,91 @@@ public class BuiltinFunctions 
      public static final FunctionIdentifier NUMERIC_ADD = 
AlgebricksBuiltinFunctions.NUMERIC_ADD;
      public static final FunctionIdentifier IS_MISSING = 
AlgebricksBuiltinFunctions.IS_MISSING;
      public static final FunctionIdentifier IS_NULL = 
AlgebricksBuiltinFunctions.IS_NULL;
 -    public static final FunctionIdentifier IS_UNKNOWN =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"is-unknown", 1);
 -    public static final FunctionIdentifier IS_ATOMIC =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-atomic", 
1);
 -    public static final FunctionIdentifier IS_BOOLEAN =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"is-boolean", 1);
 -    public static final FunctionIdentifier IS_BINARY =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-binary", 
1);
 -    public static final FunctionIdentifier IS_POINT =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-point", 
1);
 -    public static final FunctionIdentifier IS_LINE = new 
FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-line", 1);
 -    public static final FunctionIdentifier IS_RECTANGLE =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"is-rectangle", 1);
 -    public static final FunctionIdentifier IS_CIRCLE =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-circle", 
1);
 -    public static final FunctionIdentifier IS_POLYGON =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"is-polygon", 1);
 -    public static final FunctionIdentifier IS_SPATIAL =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"is-spatial", 1);
 -    public static final FunctionIdentifier IS_DATE = new 
FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-date", 1);
 -    public static final FunctionIdentifier IS_DATETIME =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"is-datetime", 1);
 -    public static final FunctionIdentifier IS_TIME = new 
FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-time", 1);
 -    public static final FunctionIdentifier IS_DURATION =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"is-duration", 1);
 -    public static final FunctionIdentifier IS_INTERVAL =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"is-interval", 1);
 -    public static final FunctionIdentifier IS_TEMPORAL =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"is-temporal", 1);
 -    public static final FunctionIdentifier IS_UUID = new 
FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-uuid", 1);
 -    public static final FunctionIdentifier IS_NUMBER =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-number", 
1);
 -    public static final FunctionIdentifier IS_STRING =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-string", 
1);
 -    public static final FunctionIdentifier IS_ARRAY =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-array", 
1);
 -    public static final FunctionIdentifier IS_OBJECT =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-object", 
1);
 -    public static final FunctionIdentifier IS_MULTISET =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"is-multiset", 1);
 -    public static final FunctionIdentifier GET_TYPE =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-type", 
1);
 -
 -    public static final FunctionIdentifier IS_SYSTEM_NULL =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"is-system-null", 1);
 -    public static final FunctionIdentifier CHECK_UNKNOWN =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"check-unknown", 1);
 +    public static final FunctionIdentifier IS_UNKNOWN = 
FunctionConstants.newAsterix("is-unknown", 1);
 +    public static final FunctionIdentifier IS_ATOMIC = 
FunctionConstants.newAsterix("is-atomic", 1);
 +    public static final FunctionIdentifier IS_BOOLEAN = 
FunctionConstants.newAsterix("is-boolean", 1);
 +    public static final FunctionIdentifier IS_BINARY = 
FunctionConstants.newAsterix("is-binary", 1);
 +    public static final FunctionIdentifier IS_POINT = 
FunctionConstants.newAsterix("is-point", 1);
 +    public static final FunctionIdentifier IS_LINE = 
FunctionConstants.newAsterix("is-line", 1);
 +    public static final FunctionIdentifier IS_RECTANGLE = 
FunctionConstants.newAsterix("is-rectangle", 1);
 +    public static final FunctionIdentifier IS_CIRCLE = 
FunctionConstants.newAsterix("is-circle", 1);
 +    public static final FunctionIdentifier IS_POLYGON = 
FunctionConstants.newAsterix("is-polygon", 1);
 +    public static final FunctionIdentifier IS_SPATIAL = 
FunctionConstants.newAsterix("is-spatial", 1);
 +    public static final FunctionIdentifier IS_DATE = 
FunctionConstants.newAsterix("is-date", 1);
 +    public static final FunctionIdentifier IS_DATETIME = 
FunctionConstants.newAsterix("is-datetime", 1);
 +    public static final FunctionIdentifier IS_TIME = 
FunctionConstants.newAsterix("is-time", 1);
 +    public static final FunctionIdentifier IS_DURATION = 
FunctionConstants.newAsterix("is-duration", 1);
 +    public static final FunctionIdentifier IS_INTERVAL = 
FunctionConstants.newAsterix("is-interval", 1);
 +    public static final FunctionIdentifier IS_TEMPORAL = 
FunctionConstants.newAsterix("is-temporal", 1);
 +    public static final FunctionIdentifier IS_UUID = 
FunctionConstants.newAsterix("is-uuid", 1);
 +    public static final FunctionIdentifier IS_NUMBER = 
FunctionConstants.newAsterix("is-number", 1);
 +    public static final FunctionIdentifier IS_STRING = 
FunctionConstants.newAsterix("is-string", 1);
 +    public static final FunctionIdentifier IS_ARRAY = 
FunctionConstants.newAsterix("is-array", 1);
 +    public static final FunctionIdentifier IS_OBJECT = 
FunctionConstants.newAsterix("is-object", 1);
 +    public static final FunctionIdentifier IS_MULTISET = 
FunctionConstants.newAsterix("is-multiset", 1);
 +    public static final FunctionIdentifier GET_TYPE = 
FunctionConstants.newAsterix("get-type", 1);
 +
 +    public static final FunctionIdentifier IS_SYSTEM_NULL = 
FunctionConstants.newAsterix("is-system-null", 1);
 +    public static final FunctionIdentifier CHECK_UNKNOWN = 
FunctionConstants.newAsterix("check-unknown", 1);
      public static final FunctionIdentifier COLLECTION_TO_SEQUENCE =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"collection-to-sequence", 1);
 +            FunctionConstants.newAsterix("collection-to-sequence", 1);
  
      public static final FunctionIdentifier IF_MISSING =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"if-missing", FunctionIdentifier.VARARGS);
 +            FunctionConstants.newAsterix("if-missing", 
FunctionIdentifier.VARARGS);
      public static final FunctionIdentifier IF_NULL =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "if-null", 
FunctionIdentifier.VARARGS);
 +            FunctionConstants.newAsterix("if-null", 
FunctionIdentifier.VARARGS);
      public static final FunctionIdentifier IF_MISSING_OR_NULL =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"if-missing-or-null", FunctionIdentifier.VARARGS);
 +            FunctionConstants.newAsterix("if-missing-or-null", 
FunctionIdentifier.VARARGS);
      public static final FunctionIdentifier IF_SYSTEM_NULL =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"if-system-null", FunctionIdentifier.VARARGS);
 -    public static final FunctionIdentifier IF_INF =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "if-inf", 
FunctionIdentifier.VARARGS);
 -    public static final FunctionIdentifier IF_NAN =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "if-nan", 
FunctionIdentifier.VARARGS);
 +            FunctionConstants.newAsterix("if-system-null", 
FunctionIdentifier.VARARGS);
 +    public static final FunctionIdentifier IF_INF = 
FunctionConstants.newAsterix("if-inf", FunctionIdentifier.VARARGS);
 +    public static final FunctionIdentifier IF_NAN = 
FunctionConstants.newAsterix("if-nan", FunctionIdentifier.VARARGS);
      public static final FunctionIdentifier IF_NAN_OR_INF =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"if-nan-or-inf", FunctionIdentifier.VARARGS);
 -
 -    public static final FunctionIdentifier MISSING_IF =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"missing-if", 2);
 -    public static final FunctionIdentifier NULL_IF = new 
FunctionIdentifier(FunctionConstants.ASTERIX_NS, "null-if", 2);
 -    public static final FunctionIdentifier NAN_IF = new 
FunctionIdentifier(FunctionConstants.ASTERIX_NS, "nan-if", 2);
 -    public static final FunctionIdentifier POSINF_IF =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "posinf-if", 
2);
 -    public static final FunctionIdentifier NEGINF_IF =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "neginf-if", 
2);
 -
 -    public static final FunctionIdentifier TO_ATOMIC =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "to-atomic", 
1);
 -    public static final FunctionIdentifier TO_ARRAY =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "to-array", 
1);
 -    public static final FunctionIdentifier TO_BIGINT =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "to-bigint", 
1);
 -    public static final FunctionIdentifier TO_BOOLEAN =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"to-boolean", 1);
 -    public static final FunctionIdentifier TO_DOUBLE =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "to-double", 
1);
 -    public static final FunctionIdentifier TO_NUMBER =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "to-number", 
1);
 -    public static final FunctionIdentifier TO_OBJECT =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "to-object", 
1);
 -    public static final FunctionIdentifier TO_STRING =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "to-string", 
1);
 -
 -    public static final FunctionIdentifier TREAT_AS_INTEGER =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"treat-as-integer", 1);
 +            FunctionConstants.newAsterix("if-nan-or-inf", 
FunctionIdentifier.VARARGS);
 +
 +    public static final FunctionIdentifier MISSING_IF = 
FunctionConstants.newAsterix("missing-if", 2);
 +    public static final FunctionIdentifier NULL_IF = 
FunctionConstants.newAsterix("null-if", 2);
 +    public static final FunctionIdentifier NAN_IF = 
FunctionConstants.newAsterix("nan-if", 2);
 +    public static final FunctionIdentifier POSINF_IF = 
FunctionConstants.newAsterix("posinf-if", 2);
 +    public static final FunctionIdentifier NEGINF_IF = 
FunctionConstants.newAsterix("neginf-if", 2);
 +
 +    public static final FunctionIdentifier TO_ATOMIC = 
FunctionConstants.newAsterix("to-atomic", 1);
 +    public static final FunctionIdentifier TO_ARRAY = 
FunctionConstants.newAsterix("to-array", 1);
 +    public static final FunctionIdentifier TO_BIGINT = 
FunctionConstants.newAsterix("to-bigint", 1);
 +    public static final FunctionIdentifier TO_BOOLEAN = 
FunctionConstants.newAsterix("to-boolean", 1);
 +    public static final FunctionIdentifier TO_DOUBLE = 
FunctionConstants.newAsterix("to-double", 1);
 +    public static final FunctionIdentifier TO_NUMBER = 
FunctionConstants.newAsterix("to-number", 1);
 +    public static final FunctionIdentifier TO_OBJECT = 
FunctionConstants.newAsterix("to-object", 1);
 +    public static final FunctionIdentifier TO_OBJECT_VAR_STR = 
FunctionConstants.newAsterix("to-object-var-str", 1);
 +    public static final FunctionIdentifier TO_STRING = 
FunctionConstants.newAsterix("to-string", 1);
 +
 +    public static final FunctionIdentifier TREAT_AS_INTEGER = 
FunctionConstants.newAsterix("treat-as-integer", 1);
      public static final FunctionIdentifier IS_NUMERIC_ADD_COMPATIBLE =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"is-numeric-add-compatible", 1);
 +            FunctionConstants.newAsterix("is-numeric-add-compatible", 1);
  
      public static final FunctionIdentifier EXTERNAL_LOOKUP =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"external-lookup", FunctionIdentifier.VARARGS);
 +            FunctionConstants.newAsterix("external-lookup", 
FunctionIdentifier.VARARGS);
  
 -    public static final FunctionIdentifier GET_JOB_PARAMETER =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"get-job-param", 1);
 +    public static final FunctionIdentifier GET_JOB_PARAMETER = 
FunctionConstants.newAsterix("get-job-param", 1);
  
 -    public static final FunctionIdentifier META =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "meta", 
FunctionIdentifier.VARARGS);
 +    public static final FunctionIdentifier META = 
FunctionConstants.newAsterix("meta", FunctionIdentifier.VARARGS);
      public static final FunctionIdentifier META_KEY =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "meta-key", 
FunctionIdentifier.VARARGS);
 +            FunctionConstants.newAsterix("meta-key", 
FunctionIdentifier.VARARGS);
  
      public static final FunctionIdentifier DECODE_DATAVERSE_NAME =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"decode-dataverse-name", 1);
 +            FunctionConstants.newAsterix("decode-dataverse-name", 1);
 +
 +    public static final FunctionIdentifier SERIALIZED_SIZE = 
FunctionConstants.newAsterix("serialized-size", 1);
 +
 +    public static final FunctionIdentifier PUT_AUTOGENERATED_KEY =
 +            FunctionConstants.newAsterix("put-autogenerated-key", 
FunctionIdentifier.VARARGS);
  
 -    public static final FunctionIdentifier SERIALIZED_SIZE =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"serialized-size", 1);
 -    public static final FunctionIdentifier IF_ERROR =
 -            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "if-error", 
2);
 +    public static final FunctionIdentifier ACCESS_FIELD = 
FunctionConstants.newAsterix("access-field", 2);
 +
 +    public static final FunctionIdentifier ACCESS_NESTED_FIELD = 
FunctionConstants.newAsterix("access-nested-field", 2);
 +
++    public static final FunctionIdentifier IF_ERROR = 
FunctionConstants.newAsterix("if-error", 2);
+ 
      static {
          // first, take care of Algebricks builtin functions
          addFunction(IS_MISSING, BooleanOnlyTypeComputer.INSTANCE, true);
@@@ -2159,8 -2570,8 +2161,9 @@@
          addFunction(DECODE_DATAVERSE_NAME, 
OrderedListOfAStringTypeComputer.INSTANCE_NULLABLE, true);
  
          addPrivateFunction(COLLECTION_TO_SEQUENCE, 
CollectionToSequenceTypeComputer.INSTANCE, true);
 -        addPrivateFunction(SERIALIZED_SIZE, AInt64TypeComputer.INSTANCE, 
true);
 +        addFunction(SERIALIZED_SIZE, AInt64TypeComputer.INSTANCE, true);
 +        // used by CBO's internal sampling queries for determining projection 
sizes
+         addPrivateFunction(IF_ERROR, AnyTypeComputer.INSTANCE, true);
  
          // external lookup
          addPrivateFunction(EXTERNAL_LOOKUP, AnyTypeComputer.INSTANCE, false);
diff --cc 
asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfErrorDescriptor.java
index 0000000000,a4e830f824..d51d8d0025
mode 000000,100644..100644
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfErrorDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfErrorDescriptor.java
@@@ -1,0 -1,70 +1,70 @@@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one
+  * or more contributor license agreements.  See the NOTICE file
+  * distributed with this work for additional information
+  * regarding copyright ownership.  The ASF licenses this file
+  * to you under the Apache License, Version 2.0 (the
+  * "License"); you may not use this file except in compliance
+  * with the License.  You may obtain a copy of the License at
+  *
+  *   http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing,
+  * software distributed under the License is distributed on an
+  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  * KIND, either express or implied.  See the License for the
+  * specific language governing permissions and limitations
+  * under the License.
+  */
+ 
+ package org.apache.asterix.runtime.evaluators.functions;
+ 
+ import org.apache.asterix.om.functions.BuiltinFunctions;
+ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+ import 
org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+ import 
org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 -import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
++import org.apache.hyracks.api.context.IEvaluatorContext;
+ import org.apache.hyracks.api.exceptions.HyracksDataException;
+ import org.apache.hyracks.data.std.api.IPointable;
+ import org.apache.hyracks.data.std.primitive.VoidPointable;
+ import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+ 
+ public final class IfErrorDescriptor extends 
AbstractScalarFunctionDynamicDescriptor {
+     private static final long serialVersionUID = 1L;
+ 
+     public static final IFunctionDescriptorFactory FACTORY = 
IfErrorDescriptor::new;
+ 
+     @Override
+     public IScalarEvaluatorFactory 
createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+         return new IScalarEvaluatorFactory() {
+             private static final long serialVersionUID = 1L;
+ 
+             @Override
+             public IScalarEvaluator createScalarEvaluator(IEvaluatorContext 
ctx) throws HyracksDataException {
+                 return new AbstractScalarEval(sourceLoc, getIdentifier()) {
+                     private final IScalarEvaluator eval0 = 
args[0].createScalarEvaluator(ctx);
+                     private final IScalarEvaluator eval1 = 
args[1].createScalarEvaluator(ctx);
+                     private final VoidPointable arg = 
VoidPointable.FACTORY.createPointable();
+ 
+                     @Override
+                     public void evaluate(IFrameTupleReference tuple, 
IPointable result) throws HyracksDataException {
+                         try {
+                             eval0.evaluate(tuple, arg);
+                             result.set(arg);
+                         } catch (Throwable th) {
+                             eval1.evaluate(tuple, arg);
+                             result.set(arg);
+                         }
+                     }
+                 };
+             }
+         };
+     }
+ 
+     @Override
+     public FunctionIdentifier getIdentifier() {
+         return BuiltinFunctions.IF_ERROR;
+     }
+ }
diff --cc 
asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
index d682d7a58a,95f3135b9a..f6ef58f9fc
--- 
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
@@@ -1360,7 -1336,7 +1361,8 @@@ public final class FunctionCollection i
          fc.add(DecodeDataverseNameDescriptor.FACTORY);
          fc.add(RandomWithSeedDescriptor.FACTORY);
          fc.add(SerializedSizeDescriptor.FACTORY);
 +        fc.add(PutAutogeneratedKeyDescriptor.FACTORY);
+         fc.add(IfErrorDescriptor.FACTORY);
  
          
ServiceLoader.load(IFunctionRegistrant.class).iterator().forEachRemaining(c -> 
c.register(fc));
          return fc;
diff --cc 
hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractHashJoinPOperator.java
index 800c839725,443b21174c..920f567b42
--- 
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractHashJoinPOperator.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractHashJoinPOperator.java
@@@ -143,17 -142,15 +143,15 @@@ public abstract class AbstractHashJoinP
                                      Set<LogicalVariable> firstDeliveredVars = 
unorderedFirstDelivered.getColumnSet();
                                      UnorderedPartitionedProperty 
unorderedRequired =
                                              (UnorderedPartitionedProperty) 
requirements;
-                                     Set<LogicalVariable> originalRequiredVars 
= unorderedRequired.getColumnSet();
 -                                    Set<LogicalVariable> modifiedRequiredVars 
= new ListSet<LogicalVariable>();
 +                                    Set<LogicalVariable> modifiedRequiredVars 
= new ListSet<>();
                                      Map<LogicalVariable, EquivalenceClass> 
eqmap = context.getEquivalenceClassMap(op);
 -                                    Set<LogicalVariable> coveredVars = new 
ListSet<LogicalVariable>();
 +                                    Set<LogicalVariable> coveredVars = new 
ListSet<>();
-                                     List<LogicalVariable> keysFirst =
-                                             
(keysRightBranch.containsAll(originalRequiredVars)) ? keysRightBranch
-                                                     : keysLeftBranch;
+                                     List<LogicalVariable> keysFirst = 
(keysRightBranch.containsAll(firstDeliveredVars))
+                                             ? keysRightBranch : 
keysLeftBranch;
                                      List<LogicalVariable> keysSecond =
                                              keysFirst == keysRightBranch ? 
keysLeftBranch : keysRightBranch;
-                                     for (LogicalVariable r : 
originalRequiredVars) {
-                                         EquivalenceClass ecSnd = eqmap.get(r);
+                                     for (LogicalVariable r : 
firstDeliveredVars) {
+                                         EquivalenceClass ecFirst = 
eqmap.get(r);
                                          boolean found = false;
                                          int j = 0;
                                          for (LogicalVariable rvar : 
keysFirst) {
diff --cc hyracks-fullstack/pom.xml
index 6793d24637,1e4f07022e..aa1f8a2bad
--- a/hyracks-fullstack/pom.xml
+++ b/hyracks-fullstack/pom.xml
@@@ -75,10 -75,7 +75,10 @@@
      <snappy.version>1.1.10.5</snappy.version>
      <jackson.version>2.14.3</jackson.version>
      <jackson-databind.version>${jackson.version}</jackson-databind.version>
-     <netty.version>4.1.118.Final</netty.version>
+     <netty.version>4.1.121.Final</netty.version>
 +    <asm.version>9.3</asm.version>
 +    <awsjavasdk.version>2.29.27</awsjavasdk.version>
 +    <gcsjavasdk.version>2.45.0</gcsjavasdk.version>
  
      <implementation.title>Apache Hyracks and Algebricks - 
${project.name}</implementation.title>
      <implementation.url>https://asterixdb.apache.org/</implementation.url>

Reply via email to