From 3a518dd53bb1a4f3f08909ef24a6f3e0c3dda17d Mon Sep 17 00:00:00 2001 From: pineappleBest123 Date: Sun, 5 Apr 2026 21:53:38 -0700 Subject: [PATCH] [ASTERIXDB-3021][COMP] Emit cross product warning for implicit joins When a query uses implicit cross join syntax (FROM A, B without a join condition), SimpleUnnestToProductRule rewrites the unnest pipeline into an InnerJoinOperator with a constant TRUE condition but never emits a warning. Explicit JOIN ... ON TRUE already triggers the CROSS_PRODUCT_JOIN warning via JoinUtils. This change closes that gap. - Change warnIfCrossProduct() in JoinUtils from private to public - Call JoinUtils.warnIfCrossProduct() in SimpleUnnestToProductRule after the cross product join is constructed --- .../algebricks/rewriter/rules/SimpleUnnestToProductRule.java | 3 +++ .../org/apache/hyracks/algebricks/rewriter/util/JoinUtils.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/SimpleUnnestToProductRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/SimpleUnnestToProductRule.java index 58a15e23e8f..a95f209be9b 100644 --- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/SimpleUnnestToProductRule.java +++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/SimpleUnnestToProductRule.java @@ -37,6 +37,7 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities; import org.apache.hyracks.algebricks.core.algebra.util.OperatorPropertiesUtil; import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule; +import org.apache.hyracks.algebricks.rewriter.util.JoinUtils; public class SimpleUnnestToProductRule implements IAlgebraicRewriteRule { @@ -142,6 +143,8 @@ && descOrSelfIsSourceScan(currentOpRef.getValue())) { context.computeAndSetTypeEnvironmentForOperator(boundaryOperator); context.computeAndSetTypeEnvironmentForOperator(innerBranchOperator); context.computeAndSetTypeEnvironmentForOperator(join); + JoinUtils.warnIfCrossProduct(join.getCondition().getValue(), + innerBranchOperator.getSourceLocation(), context); return true; } diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/JoinUtils.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/JoinUtils.java index 085580f08ea..f4afb6fe5de 100644 --- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/JoinUtils.java +++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/JoinUtils.java @@ -340,7 +340,7 @@ private static BuildSide getHashJoinBuildSide(ILogicalExpression e, List