[ASTERIXDB-2704][FUN] Field access on a non-object value should give warning
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
Field access on a non-object value should give warning
instead of error and return MISSING.
- change sugar-01-negative since it was not doing
the intended test.
- remove the type check from the type computer and defer
the check to runtime.
Change-Id: I90b23ba8cb6838f78645982f26cf8b0cf7dadb4c
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/9147
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByIndexFieldAccessRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByIndexFieldAccessRule.java
index 9c478ee..abc434f 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByIndexFieldAccessRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByIndexFieldAccessRule.java
@@ -23,13 +23,12 @@
import java.util.Collections;
import org.apache.asterix.algebra.base.OperatorAnnotation;
-import org.apache.asterix.lang.common.util.FunctionUtil;
import org.apache.asterix.om.base.AInt32;
import org.apache.asterix.om.constants.AsterixConstantValue;
import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.typecomputer.impl.TypeComputeUtils;
import org.apache.asterix.om.types.ARecordType;
import org.apache.asterix.om.types.ATypeTag;
-import org.apache.asterix.om.types.AUnionType;
import org.apache.asterix.om.types.IAType;
import org.apache.asterix.om.utils.ConstantExpressionUtil;
import org.apache.commons.lang3.mutable.Mutable;
@@ -77,20 +76,19 @@
return false;
}
boolean changed = false;
- AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr;
- for (Mutable<ILogicalExpression> funcArgRef : funcExpr.getArguments()) {
+ AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr;
+ for (Mutable<ILogicalExpression> funcArgRef : fce.getArguments()) {
if (rewriteExpressionReference(op, funcArgRef, context)) {
changed = true;
}
}
- AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr;
if (fce.getFunctionIdentifier() != BuiltinFunctions.FIELD_ACCESS_BY_NAME) {
return changed;
}
changed |= extractFirstArg(fce, op, context);
IVariableTypeEnvironment env = context.getOutputTypeEnvironment(op.getInputs().get(0).getValue());
IAType t = (IAType) env.getType(fce.getArguments().get(0).getValue());
- changed |= rewriteFieldAccess(exprRef, fce, getActualType(t));
+ changed |= rewriteFieldAccess(exprRef, fce, TypeComputeUtils.getActualType(t));
return changed;
}
@@ -117,7 +115,7 @@
// Rewrites field-access-by-name into field-access-by-index if possible.
private boolean rewriteFieldAccess(Mutable<ILogicalExpression> exprRef, AbstractFunctionCallExpression fce,
- IAType t) throws AlgebricksException {
+ IAType t) {
if (t.getTypeTag() != ATypeTag.OBJECT) {
return false;
}
@@ -129,20 +127,6 @@
return changed;
}
- // Gets the actual type of a given type.
- private IAType getActualType(IAType t) throws AlgebricksException {
- switch (t.getTypeTag()) {
- case ANY:
- case OBJECT:
- return t;
- case UNION:
- return ((AUnionType) t).getActualType();
- default:
- throw new AlgebricksException("Cannot call field-access on data of type " + t);
- }
- }
-
- @SuppressWarnings("unchecked")
private static ILogicalExpression createFieldAccessByIndex(ARecordType recType,
AbstractFunctionCallExpression fce) {
String s = ConstantExpressionUtil.getStringArgument(fce, 1);
@@ -154,7 +138,8 @@
return null;
}
ScalarFunctionCallExpression faExpr = new ScalarFunctionCallExpression(
- FunctionUtil.getFunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_INDEX), fce.getArguments().get(0),
+ BuiltinFunctions.getBuiltinFunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_INDEX),
+ fce.getArguments().get(0),
new MutableObject<>(new ConstantExpression(new AsterixConstantValue(new AInt32(k)))));
faExpr.setSourceLocation(fce.getSourceLocation());
return faExpr;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.01.ddl.sqlpp
new file mode 100644
index 0000000..aa4fd86
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.01.ddl.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+USE test;
+
+CREATE TYPE t1 AS {
+id: int,
+str1: string
+};
+
+CREATE DATASET ds1(t1) PRIMARY KEY id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.02.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.02.update.sqlpp
new file mode 100644
index 0000000..c78eeb5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.02.update.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+USE test;
+
+INSERT INTO ds1([{"id": 1, "str1": "text", "str2": "text"}]);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.03.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.03.query.sqlpp
new file mode 100644
index 0000000..6832a64
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.03.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+/*
+ * Description: tests reporting invalid argument type for field-access function
+ */
+// requesttype=application/json
+// param max-warnings:json=1000
+
+USE test;
+
+FROM ds1 AS ds1
+SELECT ds1.str1.x, ds1.str2.y;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.04.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.04.query.sqlpp
new file mode 100644
index 0000000..bb65e36
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.04.query.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+/*
+ * Description: tests reporting invalid argument type for field-access function
+ */
+// requesttype=application/json
+// param max-warnings:json=1000
+
+SELECT "x".y;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.99.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.99.ddl.sqlpp
new file mode 100644
index 0000000..36b2bab
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/field-access/field-access.99.ddl.sqlpp
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+DROP DATAVERSE test IF EXISTS;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_001/numeric_fun_001.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_001/numeric_fun_001.01.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_001/numeric_fun_001.01.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_001/numeric_fun_001.01.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_001/numeric_fun_001.02.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_001/numeric_fun_001.02.update.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_001/numeric_fun_001.02.update.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_001/numeric_fun_001.02.update.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_001/numeric_fun_001.03.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_001/numeric_fun_001.03.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_001/numeric_fun_001.03.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_001/numeric_fun_001.03.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_001/numeric_fun_001.04.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_001/numeric_fun_001.04.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_001/numeric_fun_001.04.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_001/numeric_fun_001.04.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_002/numeric_fun_002.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_002/numeric_fun_002.01.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_002/numeric_fun_002.01.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_002/numeric_fun_002.01.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_002/numeric_fun_002.02.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_002/numeric_fun_002.02.update.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_002/numeric_fun_002.02.update.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_002/numeric_fun_002.02.update.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_002/numeric_fun_002.03.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_002/numeric_fun_002.03.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_002/numeric_fun_002.03.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_002/numeric_fun_002.03.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_002/numeric_fun_002.04.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_002/numeric_fun_002.04.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_002/numeric_fun_002.04.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_002/numeric_fun_002.04.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_003/numeric_fun_003.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_003/numeric_fun_003.01.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_003/numeric_fun_003.01.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_003/numeric_fun_003.01.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_003/numeric_fun_003.02.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_003/numeric_fun_003.02.update.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_003/numeric_fun_003.02.update.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_003/numeric_fun_003.02.update.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_003/numeric_fun_003.03.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_003/numeric_fun_003.03.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_003/numeric_fun_003.03.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_003/numeric_fun_003.03.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_003/numeric_fun_003.04.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_003/numeric_fun_003.04.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/numeric_fun/numeric_fun_003/numeric_fun_003.04.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/numeric_fun/numeric_fun_003/numeric_fun_003.04.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.01.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.01.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.01.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.02.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.02.update.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.02.update.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.02.update.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.03.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.03.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.03.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.03.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.04.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.04.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.04.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.04.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.05.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.05.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.05.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.05.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.06.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.06.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.06.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.06.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.07.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.07.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.07.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.07.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.08.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.08.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.08.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.08.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.09.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.09.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_001/string_fun_001.09.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.09.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_002/string_fun_002.01.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_002/string_fun_002.01.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_002/string_fun_002.01.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_002/string_fun_002.01.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_003/string_fun_003.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.01.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_003/string_fun_003.01.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.01.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_003/string_fun_003.02.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.02.update.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_003/string_fun_003.02.update.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.02.update.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_003/string_fun_003.03.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.03.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_003/string_fun_003.03.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.03.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_003/string_fun_003.04.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.04.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_003/string_fun_003.04.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.04.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_003/string_fun_003.05.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.05.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_003/string_fun_003.05.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.05.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_003/string_fun_003.06.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.06.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_003/string_fun_003.06.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.06.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_004/string_fun_004.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.01.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_004/string_fun_004.01.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.01.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_004/string_fun_004.02.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.02.update.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_004/string_fun_004.02.update.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.02.update.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_004/string_fun_004.03.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.03.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_004/string_fun_004.03.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.03.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_004/string_fun_004.04.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.04.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_004/string_fun_004.04.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.04.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_004/string_fun_004.05.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.05.query.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_004/string_fun_004.05.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.05.query.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_004/string_fun_004.06.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.06.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null/string_fun/string_fun_004/string_fun_004.06.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.06.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-01-negative/sugar-01-negative.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-01-negative/sugar-01-negative.3.query.sqlpp
index 0218637..523e8ed 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-01-negative/sugar-01-negative.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-01-negative/sugar-01-negative.3.query.sqlpp
@@ -23,5 +23,5 @@
// cannot be used like a SQL-92 sugar, e.g., AVG. Its input must be a collection.
FROM Employee e
GROUP BY e.deptno AS deptno GROUP AS g
-SELECT deptno AS deptno, STRICT_AVG(g.e.salary) AS avgpay,
+SELECT deptno AS deptno, STRICT_AVG(g[0].e.salary) AS avgpay,
(SELECT i.e.name AS name, i.e.salary AS salary FROM g AS i) AS workers;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-01-negative/sugar-01-negative.99.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-01-negative/sugar-01-negative.99.ddl.sqlpp
new file mode 100644
index 0000000..9293a16
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-01-negative/sugar-01-negative.99.ddl.sqlpp
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+DROP DATAVERSE gby IF EXISTS;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/field-access/field-access.03.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/field-access/field-access.03.adm
new file mode 100644
index 0000000..f7bcb87
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/field-access/field-access.03.adm
@@ -0,0 +1 @@
+{ }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/field-access/field-access.04.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/field-access/field-access.04.adm
new file mode 100644
index 0000000..f7bcb87
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/field-access/field-access.04.adm
@@ -0,0 +1 @@
+{ }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/numeric_fun/numeric_fun_001/numeric_fun_001.03.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/numeric_fun/numeric_fun_001/numeric_fun_001.03.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/numeric_fun/numeric_fun_001/numeric_fun_001.03.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/numeric_fun/numeric_fun_001/numeric_fun_001.03.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/numeric_fun/numeric_fun_002/numeric_fun_002.03.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/numeric_fun/numeric_fun_002/numeric_fun_002.03.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/numeric_fun/numeric_fun_002/numeric_fun_002.03.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/numeric_fun/numeric_fun_002/numeric_fun_002.03.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/numeric_fun/numeric_fun_003/numeric_fun_003.03.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/numeric_fun/numeric_fun_003/numeric_fun_003.03.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/numeric_fun/numeric_fun_003/numeric_fun_003.03.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/numeric_fun/numeric_fun_003/numeric_fun_003.03.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_001/string_fun_001.03.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.03.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_001/string_fun_001.03.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.03.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_001/string_fun_001.04.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.04.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_001/string_fun_001.04.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.04.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_001/string_fun_001.05.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.05.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_001/string_fun_001.05.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.05.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_001/string_fun_001.06.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.06.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_001/string_fun_001.06.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.06.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_001/string_fun_001.07.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.07.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_001/string_fun_001.07.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.07.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_001/string_fun_001.08.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.08.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_001/string_fun_001.08.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_001/string_fun_001.08.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_002/string_fun_002.01.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_002/string_fun_002.01.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_002/string_fun_002.01.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_002/string_fun_002.01.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_003/string_fun_003.01.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.01.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_003/string_fun_003.01.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.01.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_003/string_fun_003.02.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.02.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_003/string_fun_003.02.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.02.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_003/string_fun_003.03.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.03.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_003/string_fun_003.03.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_003/string_fun_003.03.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_004/string_fun_004.03.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.03.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_004/string_fun_004.03.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.03.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_004/string_fun_004.04.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.04.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_004/string_fun_004.04.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.04.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_004/string_fun_004.05.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.05.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null/string_fun/string_fun_004/string_fun_004.05.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/fun_return_null_missing/string_fun/string_fun_004/string_fun_004.05.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index ed5399d..b75da14 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -5639,7 +5639,7 @@
<test-case FilePath="group-by">
<compilation-unit name="sugar-01-negative">
<output-dir compare="Text">core-01</output-dir>
- <expected-error>ASX1091: Type mismatch: expected value of type object, but got the value of type array (in line 26, at column 38)</expected-error>
+ <expected-error>ASX0037: Type mismatch: expected value of type array or multiset, but got the value of type bigint (in line 26, at column 26)</expected-error>
</compilation-unit>
</test-case>
<test-case FilePath="group-by">
@@ -13375,6 +13375,11 @@
<output-dir compare="Clean-JSON">issue-ASTERIXDB-1165</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="json">
+ <compilation-unit name="int01">
+ <output-dir compare="Clean-JSON">int01-cleanjson</output-dir>
+ </compilation-unit>
+ </test-case>
</test-group>
<test-group name="materialization">
<test-case FilePath="materialization">
@@ -13492,13 +13497,6 @@
</compilation-unit>
</test-case>
</test-group>
- <test-group name="cleanjson">
- <test-case FilePath="json">
- <compilation-unit name="int01">
- <output-dir compare="Clean-JSON">int01-cleanjson</output-dir>
- </compilation-unit>
- </test-case>
- </test-group>
<test-group name="csv">
<test-case FilePath="csv">
<compilation-unit name="basic-types">
@@ -14159,8 +14157,8 @@
</compilation-unit>
</test-case>
</test-group>
- <test-group name="fun_return_null/string_fun">
- <test-case FilePath="fun_return_null/string_fun" check-warnings="true">
+ <test-group name="fun_return_null_missing/string_fun">
+ <test-case FilePath="fun_return_null_missing/string_fun" check-warnings="true">
<compilation-unit name="string_fun_001">
<output-dir compare="Text">string_fun_001</output-dir>
<expected-warn>Type mismatch: function trim expects its 1st input parameter to be of type string, but the actual input type is bigint (in line 41, at column 1)</expected-warn>
@@ -14260,7 +14258,7 @@
<expected-warn>Type mismatch: function ends-with expects its 1st input parameter to be of type string, but the actual input type is bigint (in line 33, at column 1)</expected-warn>
</compilation-unit>
</test-case>
- <test-case FilePath="fun_return_null/string_fun" check-warnings="true">
+ <test-case FilePath="fun_return_null_missing/string_fun" check-warnings="true">
<compilation-unit name="string_fun_002">
<output-dir compare="Text">string_fun_002</output-dir>
<expected-warn>Type mismatch: function rtrim expects its 1st input parameter to be of type string, but the actual input type is bigint (in line 42, at column 1)</expected-warn>
@@ -14295,7 +14293,7 @@
<expected-warn>Type mismatch: function regexp-position expects its 1st input parameter to be of type string, but the actual input type is integer (in line 50, at column 1)</expected-warn>
</compilation-unit>
</test-case>
- <test-case FilePath="fun_return_null/string_fun" check-warnings="true">
+ <test-case FilePath="fun_return_null_missing/string_fun" check-warnings="true">
<compilation-unit name="string_fun_003">
<output-dir compare="Text">string_fun_003</output-dir>
<expected-warn>Invalid value: function repeat expects its 2nd input parameter to be an integer value, got 5.3 (in line 31, at column 1)</expected-warn>
@@ -14320,7 +14318,7 @@
<expected-warn>Invalid value: function substring expects its 2nd input parameter to be an integer value, got Infinity (in line 34, at column 1)</expected-warn>
</compilation-unit>
</test-case>
- <test-case FilePath="fun_return_null/string_fun" check-warnings="true">
+ <test-case FilePath="fun_return_null_missing/string_fun" check-warnings="true">
<compilation-unit name="string_fun_004">
<output-dir compare="Text">string_fun_004</output-dir>
<expected-warn>Type mismatch: function string-concat expects its 2nd input parameter to be of type string, but the actual input type is tinyint (in line 30, at column 1)</expected-warn>
@@ -14346,8 +14344,8 @@
</compilation-unit>
</test-case>
</test-group>
- <test-group name="fun_return_null/numeric_fun" >
- <test-case FilePath="fun_return_null/numeric_fun" check-warnings="true">
+ <test-group name="fun_return_null_missing/numeric_fun" >
+ <test-case FilePath="fun_return_null_missing/numeric_fun" check-warnings="true">
<compilation-unit name="numeric_fun_001">
<output-dir compare="Text">numeric_fun_001</output-dir>
<expected-warn>Type mismatch: function abs expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
@@ -14424,7 +14422,7 @@
<source-location>false</source-location>
</compilation-unit>
</test-case>
- <test-case FilePath="fun_return_null/numeric_fun" check-warnings="true">
+ <test-case FilePath="fun_return_null_missing/numeric_fun" check-warnings="true">
<compilation-unit name="numeric_fun_002">
<output-dir compare="Text">numeric_fun_002</output-dir>
<expected-warn>Type mismatch: function round expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
@@ -14451,7 +14449,7 @@
<source-location>false</source-location>
</compilation-unit>
</test-case>
- <test-case FilePath="fun_return_null/numeric_fun" check-warnings="true">
+ <test-case FilePath="fun_return_null_missing/numeric_fun" check-warnings="true">
<compilation-unit name="numeric_fun_003">
<output-dir compare="Text">numeric_fun_003</output-dir>
<expected-warn>Type mismatch: function numeric-add expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
@@ -14495,6 +14493,15 @@
<source-location>false</source-location>
</compilation-unit>
</test-case>
+ <test-case FilePath="fun_return_null_missing" check-warnings="true">
+ <compilation-unit name="field-access">
+ <output-dir compare="Text">field-access</output-dir>
+ <expected-warn>Type mismatch: function field-access-by-name expects its 1st input parameter to be of type object, but the actual input type is string</expected-warn>
+ <expected-warn>Type mismatch: function field-access-by-name expects its 1st input parameter to be of type object, but the actual input type is string</expected-warn>
+ <expected-warn>Type mismatch: function field-access-by-name expects its 1st input parameter to be of type object, but the actual input type is string</expected-warn>
+ <source-location>false</source-location>
+ </compilation-unit>
+ </test-case>
</test-group>
<test-group name="window">
<test-case FilePath="window">
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/FieldAccessByNameResultType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/FieldAccessByNameResultType.java
index c5373bc..1c4939a 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/FieldAccessByNameResultType.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/FieldAccessByNameResultType.java
@@ -18,7 +18,6 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.exceptions.TypeMismatchException;
import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
import org.apache.asterix.om.types.ARecordType;
import org.apache.asterix.om.types.ATypeTag;
@@ -28,8 +27,6 @@
import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-import org.apache.hyracks.api.exceptions.SourceLocation;
public class FieldAccessByNameResultType extends AbstractResultTypeComputer {
@@ -39,18 +36,6 @@
}
@Override
- protected void checkArgType(FunctionIdentifier funcId, int argIndex, IAType type, SourceLocation sourceLoc)
- throws AlgebricksException {
- ATypeTag actualTypeTag = type.getTypeTag();
- if (argIndex == 0 && actualTypeTag != ATypeTag.OBJECT) {
- throw new TypeMismatchException(sourceLoc, actualTypeTag, ATypeTag.OBJECT);
- }
- if (argIndex == 1 && actualTypeTag != ATypeTag.STRING) {
- throw new TypeMismatchException(sourceLoc, actualTypeTag, ATypeTag.STRING);
- }
- }
-
- @Override
protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
IAType firstArgType = strippedInputTypes[0];
if (firstArgType.getTypeTag() != ATypeTag.OBJECT) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByNameDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByNameDescriptor.java
index 4b24f4e..c5c7c97 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByNameDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByNameDescriptor.java
@@ -43,7 +43,7 @@
@Override
public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
- return new FieldAccessByNameEvalFactory(args[0], args[1], sourceLoc);
+ return new FieldAccessByNameEvalFactory(args[0], args[1], sourceLoc, getIdentifier());
}
}
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 0d68785..8549292 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
@@ -24,11 +24,12 @@
import org.apache.asterix.dataflow.data.nontagged.serde.ARecordSerializerDeserializer;
import org.apache.asterix.formats.nontagged.BinaryComparatorFactoryProvider;
import org.apache.asterix.formats.nontagged.BinaryHashFunctionFactoryProvider;
+import org.apache.asterix.om.exceptions.ExceptionUtil;
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.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;
@@ -45,15 +46,17 @@
private static final long serialVersionUID = 1L;
- private IScalarEvaluatorFactory recordEvalFactory;
- private IScalarEvaluatorFactory fldNameEvalFactory;
+ private final IScalarEvaluatorFactory recordEvalFactory;
+ private final IScalarEvaluatorFactory fldNameEvalFactory;
private final SourceLocation sourceLoc;
+ private final FunctionIdentifier funID;
public FieldAccessByNameEvalFactory(IScalarEvaluatorFactory recordEvalFactory,
- IScalarEvaluatorFactory fldNameEvalFactory, SourceLocation sourceLoc) {
+ IScalarEvaluatorFactory fldNameEvalFactory, SourceLocation sourceLoc, FunctionIdentifier funID) {
this.recordEvalFactory = recordEvalFactory;
this.fldNameEvalFactory = fldNameEvalFactory;
this.sourceLoc = sourceLoc;
+ this.funID = funID;
}
@Override
@@ -64,16 +67,13 @@
BinaryHashFunctionFactoryProvider.UTF8STRING_POINTABLE_INSTANCE.createBinaryHashFunction();
private final IBinaryComparator fieldNameComparator =
BinaryComparatorFactoryProvider.UTF8STRING_POINTABLE_INSTANCE.createBinaryComparator();
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
+ private final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
+ private final DataOutput out = resultStorage.getDataOutput();
- private IPointable inputArg0 = new VoidPointable();
- private IPointable inputArg1 = new VoidPointable();
- private IScalarEvaluator eval0 = recordEvalFactory.createScalarEvaluator(ctx);
- private IScalarEvaluator eval1 = fldNameEvalFactory.createScalarEvaluator(ctx);
- private int fieldValueOffset;
- private int fieldValueLength;
- private ATypeTag fieldValueTypeTag;
+ private final IPointable inputArg0 = new VoidPointable();
+ private final IPointable inputArg1 = new VoidPointable();
+ private final IScalarEvaluator eval0 = recordEvalFactory.createScalarEvaluator(ctx);
+ private final IScalarEvaluator eval1 = fldNameEvalFactory.createScalarEvaluator(ctx);
@Override
public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
@@ -91,21 +91,33 @@
int serRecordLen = inputArg0.getLength();
if (serRecord[serRecordOffset] != ATypeTag.SERIALIZED_RECORD_TYPE_TAG) {
- throw new TypeMismatchException(sourceLoc, serRecord[serRecordOffset],
- ATypeTag.SERIALIZED_RECORD_TYPE_TAG);
+ ExceptionUtil.warnTypeMismatch(ctx, sourceLoc, funID, serRecord[serRecordOffset], 0,
+ ATypeTag.OBJECT);
+ out.writeByte(ATypeTag.SERIALIZED_MISSING_TYPE_TAG);
+ result.set(resultStorage);
+ return;
}
byte[] serFldName = inputArg1.getByteArray();
int serFldNameOffset = inputArg1.getStartOffset();
- fieldValueOffset = ARecordSerializerDeserializer.getFieldOffsetByName(serRecord, serRecordOffset,
- serRecordLen, serFldName, serFldNameOffset, fieldNameHashFunction, fieldNameComparator);
+ if (serFldName[serFldNameOffset] != ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
+ ExceptionUtil.warnTypeMismatch(ctx, sourceLoc, funID, serFldName[serFldNameOffset], 1,
+ ATypeTag.STRING);
+ out.writeByte(ATypeTag.SERIALIZED_MISSING_TYPE_TAG);
+ result.set(resultStorage);
+ return;
+ }
+ int fieldValueOffset =
+ ARecordSerializerDeserializer.getFieldOffsetByName(serRecord, serRecordOffset, serRecordLen,
+ serFldName, serFldNameOffset, fieldNameHashFunction, fieldNameComparator);
if (fieldValueOffset < 0) {
out.writeByte(ATypeTag.SERIALIZED_MISSING_TYPE_TAG);
result.set(resultStorage);
return;
}
- fieldValueTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(serRecord[fieldValueOffset]);
- fieldValueLength = NonTaggedFormatUtil.getFieldValueLength(serRecord, fieldValueOffset,
+ ATypeTag fieldValueTypeTag =
+ EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(serRecord[fieldValueOffset]);
+ int fieldValueLength = NonTaggedFormatUtil.getFieldValueLength(serRecord, fieldValueOffset,
fieldValueTypeTag, true) + 1;
result.set(serRecord, fieldValueOffset, fieldValueLength);
} catch (IOException e) {