Hi dev, I have a question about how join strategies are defined.
I see that CartesianProductExec is used only for InnerJoin, while for other kind of joins BroadcastNestedLoopJoinExec is used. For reference: https://github.com/apache/spark/blob/cd9f49a2aed3799964976ead06080a0f7044a0c3/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkStrategies.scala#L260 May you kindly explain me why this is done? It doesn't seem a great choice to me, since BroadcastNestedLoopJoinExec can fail with OOM. Thanks, Marco