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