milanisvet commented on code in PR #49518:
URL: https://github.com/apache/spark/pull/49518#discussion_r1917917583


##########
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala:
##########
@@ -1042,6 +1043,75 @@ trait CheckAnalysis extends PredicateHelper with 
LookupCatalog with QueryErrorsB
     if (Utils.isTesting) scrubOutIds(result) else result
   }
 
+  /**
+   * Recursion, according to SQL standard, comes with several limitations:
+   * 1. Recursive term can contain one recursive reference only.
+   * 2. Recursive reference can't be used in some kinds of joins and 
aggregations.
+   * This rule checks that these restrictions are not violated.
+   */
+  private def checkRecursion(
+      plan: LogicalPlan,
+      references: mutable.Map[Long, (Int, Seq[DataType])] = 
mutable.Map.empty): Unit = {
+    plan match {
+      // The map is filled with UnionLoop id as key and 0 (number of Ref 
occasions) and datatype
+      // as value
+      case UnionLoop(id, anchor, recursion, _) =>
+        checkRecursion(anchor, references)

Review Comment:
   `anchor` plan can't contain recursive references, but we also need to enter 
it to really confirm that.
   Here we are entering it with the `references` map which does not contain 
current id, so if we encounter a self-references there, it will throw an error.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org
For additional commands, e-mail: reviews-h...@spark.apache.org

Reply via email to