Github user amansinha100 commented on a diff in the pull request: https://github.com/apache/drill/pull/889#discussion_r140161176 --- Diff: exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/JoinUtils.java --- @@ -203,32 +203,23 @@ public static void addLeastRestrictiveCasts(LogicalExpression[] leftExpressions, } /** - * Utility method to check if a subquery (represented by its root RelNode) is provably scalar. Currently - * only aggregates with no group-by are considered scalar. In the future, this method should be generalized - * to include more cases and reconciled with Calcite's notion of scalar. + * Utility method to check if a subquery (represented by its root RelNode) is provably scalar. * @param root The root RelNode to be examined * @return True if the root rel or its descendant is scalar, False otherwise */ public static boolean isScalarSubquery(RelNode root) { - DrillAggregateRel agg = null; - RelNode currentrel = root; - while (agg == null && currentrel != null) { - if (currentrel instanceof DrillAggregateRel) { - agg = (DrillAggregateRel)currentrel; - } else if (currentrel instanceof RelSubset) { - currentrel = ((RelSubset)currentrel).getBest() ; - } else if (currentrel.getInputs().size() == 1) { - // If the rel is not an aggregate or RelSubset, but is a single-input rel (could be Project, - // Filter, Sort etc.), check its input - currentrel = currentrel.getInput(0); - } else { - break; + RelMetadataQuery relMetadataQuery = RelMetadataQuery.instance(); + RelNode currentRel = root; + while (currentRel != null) { + if (currentRel instanceof RelSubset) { + currentRel = ((RelSubset) currentRel).getBest(); + continue; } - } - - if (agg != null) { - if (agg.getGroupSet().isEmpty()) { + Double rowCount = relMetadataQuery.getMaxRowCount(currentRel); + if (rowCount != null && rowCount.equals(1.0)) { --- End diff -- For scalar, the value could be <= 1.0 (0 also qualifies).
---