Description
Currently, if NumPartitions is not set, we will set it using `spark.sql.shuffle.partitions` in Planner. However, this is not following general resolution process. We should do it in Analyzer and then Optimizer can use the value for optimization.