cloud-fan commented on code in PR #49518:
URL: https://github.com/apache/spark/pull/49518#discussion_r1917524917
##########
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)
+ checkRecursion(recursion, references += id -> (0,
anchor.output.map(_.dataType)))
+ references -= id
+ case r @ UnionLoopRef(loopId, output, false) =>
+ // If we encounter a recursive reference, it has to be present in the
map
+ if (!references.contains(loopId)) {
+ r.failAnalysis(
+ errorClass = "INVALID_RECURSIVE_REFERENCE.PLACE",
Review Comment:
can end users really hit this 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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]