fix for issue 172: string-length function does not return string length for a concatenated string
diff --git a/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/query-issue172/query-issue172.1.ddl.aql b/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/query-issue172/query-issue172.1.ddl.aql
new file mode 100644
index 0000000..e1fab96
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/query-issue172/query-issue172.1.ddl.aql
@@ -0,0 +1,7 @@
+/*
+ * Description : This test case is to verify the fix for issue172
+ : https://code.google.com/p/asterixdb/issues/detail?id=172
+ * Expected Res : Success
+ * Date : 19th May 2013
+ */
+
diff --git a/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/query-issue172/query-issue172.2.update.aql b/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/query-issue172/query-issue172.2.update.aql
new file mode 100644
index 0000000..b08fc74
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/query-issue172/query-issue172.2.update.aql
@@ -0,0 +1,7 @@
+/*
+ * Description : This test case is to verify the fix for issue172
+ : https://code.google.com/p/asterixdb/issues/detail?id=172
+ * Expected Res : Success
+ * Date : 19th May 2013
+ */
+
diff --git a/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/query-issue172/query-issue172.3.query.aql b/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/query-issue172/query-issue172.3.query.aql
new file mode 100644
index 0000000..b695ccb
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/query-issue172/query-issue172.3.query.aql
@@ -0,0 +1,9 @@
+/*
+ * Description : This test case is to verify the fix for issue172
+ : https://code.google.com/p/asterixdb/issues/detail?id=172
+ * Expected Res : Success
+ * Date : 19th May 2013
+ */
+
+let $a := string-length(string-concat(["this is a ","test string"]))
+return $a
diff --git a/asterix-app/src/test/resources/runtimets/results/user-defined-functions/query-issue172/query-issue172.1.adm b/asterix-app/src/test/resources/runtimets/results/user-defined-functions/query-issue172/query-issue172.1.adm
new file mode 100644
index 0000000..aabe6ec
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/results/user-defined-functions/query-issue172/query-issue172.1.adm
@@ -0,0 +1 @@
+21
diff --git a/asterix-app/src/test/resources/runtimets/testsuite.xml b/asterix-app/src/test/resources/runtimets/testsuite.xml
index 18ec161..7f5556b 100644
--- a/asterix-app/src/test/resources/runtimets/testsuite.xml
+++ b/asterix-app/src/test/resources/runtimets/testsuite.xml
@@ -4034,13 +4034,16 @@
</test-case>
</test-group>
<test-group name="user-defined-functions">
- <!-- internal function
<test-case FilePath="user-defined-functions">
<compilation-unit name="query-issue201">
<output-dir compare="Text">query-issue201</output-dir>
</compilation-unit>
</test-case>
- -->
+ <test-case FilePath="user-defined-functions">
+ <compilation-unit name="query-issue172">
+ <output-dir compare="Text">query-issue172</output-dir>
+ </compilation-unit>
+ </test-case>
<test-case FilePath="user-defined-functions">
<compilation-unit name="query-issue455">
<output-dir compare="Text">query-issue455</output-dir>
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryStringInt32OrNullTypeComputer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryStringInt32OrNullTypeComputer.java
index 2d3018d..7b82c41 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryStringInt32OrNullTypeComputer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/typecomputer/impl/UnaryStringInt32OrNullTypeComputer.java
@@ -1,6 +1,5 @@
package edu.uci.ics.asterix.om.typecomputer.impl;
-
import java.util.ArrayList;
import java.util.List;
@@ -17,20 +16,21 @@
import edu.uci.ics.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
/**
- *
* @author Xiaoyu Ma
*/
-public class UnaryStringInt32OrNullTypeComputer implements IResultTypeComputer {
-
+public class UnaryStringInt32OrNullTypeComputer implements IResultTypeComputer {
+
public static final UnaryStringInt32OrNullTypeComputer INSTANCE = new UnaryStringInt32OrNullTypeComputer();
- private UnaryStringInt32OrNullTypeComputer() {}
-
+
+ private UnaryStringInt32OrNullTypeComputer() {
+ }
+
@Override
public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expression;
- if(fce.getArguments().isEmpty())
- throw new AlgebricksException("Wrong Argument Number.");
+ if (fce.getArguments().isEmpty())
+ throw new AlgebricksException("Wrong Argument Number.");
ILogicalExpression arg0 = fce.getArguments().get(0).getValue();
IAType t0;
try {
@@ -38,21 +38,23 @@
} catch (AlgebricksException e) {
throw new AlgebricksException(e);
}
- if (t0.getTypeTag() != ATypeTag.NULL &&
- t0.getTypeTag() != ATypeTag.STRING ) {
+ if (t0.getTypeTag() != ATypeTag.NULL
+ && t0.getTypeTag() != ATypeTag.STRING
+ && (t0.getTypeTag() == ATypeTag.UNION && !((AUnionType) t0).getUnionList()
+ .contains(BuiltinType.ASTRING))) {
throw new NotImplementedException("Expects String Type.");
- }
-
+ }
+
List<IAType> unionList = new ArrayList<IAType>();
unionList.add(BuiltinType.ANULL);
- if(t0.getTypeTag() == ATypeTag.NULL) {
+ if (t0.getTypeTag() == ATypeTag.NULL) {
return BuiltinType.ANULL;
}
-
- if(t0.getTypeTag() == ATypeTag.STRING) {
+
+ if (t0.getTypeTag() == ATypeTag.STRING || t0.getTypeTag().equals(ATypeTag.UNION)) {
unionList.add(BuiltinType.AINT32);
- }
-
+ }
+
return new AUnionType(unionList, "String-length-Result");
- }
+ }
}