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).
---