[NO ISSUE][COMP] Fix infinite loop in CheckFilterExpressionTypeRule
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
When select condition is a UNION type, but not a BOOLEAN or ANY, this rule
may fall into infinite loop.
Change-Id: Ice4c9aa61658197a7140517d0a770886dfe040ec
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2578
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Dmitry Lychagin <dmitry.lychagin@couchbase.com>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/CheckFilterExpressionTypeRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/CheckFilterExpressionTypeRule.java
index ab359bf..444e5bc 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/CheckFilterExpressionTypeRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/CheckFilterExpressionTypeRule.java
@@ -75,11 +75,13 @@
* @return true if it is; false otherwise.
*/
private boolean isPossibleBoolean(IAType type) {
- while (NonTaggedFormatUtil.isOptional(type)) {
- IAType actualType = ((AUnionType) type).getActualType();
+ IAType checkingType = type;
+ while (NonTaggedFormatUtil.isOptional(checkingType)) {
+ IAType actualType = ((AUnionType) checkingType).getActualType();
if (actualType.getTypeTag() == ATypeTag.BOOLEAN || actualType.getTypeTag() == ATypeTag.ANY) {
return true;
}
+ checkingType = actualType;
}
return false;
}