result.type = crit.getClass();
result.mergeJoin = ssc.getSubqueryHint().isMergeJoin();
if (!UNNEST && !result.mergeJoin) {
return result;
}
crit = new SubqueryCompareCriteria(ssc.getExpression(), ssc.getCommand(), SubqueryCompareCriteria.EQ, SubqueryCompareCriteria.SOME);
} else if (crit instanceof CompareCriteria) {
if (!UNNEST) {
return result;
}
//convert to the quantified form
CompareCriteria cc = (CompareCriteria)crit;
if (cc.getRightExpression() instanceof ScalarSubquery) {
ScalarSubquery ss = (ScalarSubquery)cc.getRightExpression();
result.type = ss.getClass();
//we can only use a semi-join if we know that 1 row will be present
if (ss.getCommand() instanceof Query) {
Query query = (Query)ss.getCommand();
if (query.getGroupBy() == null && query.hasAggregates()) {
crit = new SubqueryCompareCriteria(cc.getLeftExpression(), ss.getCommand(), cc.getOperator(), SubqueryCompareCriteria.SOME);
}
}
}
}
if (crit instanceof SubqueryCompareCriteria) {
SubqueryCompareCriteria scc = (SubqueryCompareCriteria)crit;
if (scc.getPredicateQuantifier() != SubqueryCompareCriteria.SOME
//TODO: could add an inline view if not a query
|| !(scc.getCommand() instanceof Query)) {
return result;
}
Query query = (Query)scc.getCommand();
Expression rightExpr = SymbolMap.getExpression(query.getProjectedSymbols().get(0));
if (result.not && !isNonNull(query, rightExpr)) {
return result;
}
if (result.type == null) {
result.type = scc.getClass();
}
result.query = query;
result.additionalCritieria = (Criteria)new CompareCriteria(scc.getLeftExpression(), scc.getOperator(), rightExpr).clone();
}
if (crit instanceof ExistsCriteria) {
ExistsCriteria exists = (ExistsCriteria)crit;
if (exists.getSubqueryHint().isNoUnnest()) {
return result;