spark-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From wenc...@apache.org
Subject [spark] branch branch-3.2 updated: [SPARK-36011][SQL] Disallow altering permanent views based on temporary views or UDFs
Date Tue, 06 Jul 2021 06:57:16 GMT
This is an automated email from the ASF dual-hosted git repository.

wenchen pushed a commit to branch branch-3.2
in repository https://gitbox.apache.org/repos/asf/spark.git


The following commit(s) were added to refs/heads/branch-3.2 by this push:
     new 176b055  [SPARK-36011][SQL] Disallow altering permanent views based on temporary
views or UDFs
176b055 is described below

commit 176b055c1245e3a12295038dccd02b1770fe4ad4
Author: RoryQi <1242949407@qq.com>
AuthorDate: Tue Jul 6 14:56:12 2021 +0800

    [SPARK-36011][SQL] Disallow altering permanent views based on temporary views or UDFs
    
    ### What changes were proposed in this pull request?
    PR #15764 disabled creating permanent views based on temporary views or UDFs.  But AlterViewCommand
didn't block temporary objects.
    
    ### Why are the changes needed?
    More robust view canonicalization.
    
    ### Does this PR introduce _any_ user-facing change?
    Yes, now if you alter a permanent view based on temporary views or UDFs, the operation
will fail.
    
    ### How was this patch tested?
    Add new unit tests.
    
    Closes #33204 from jerqi/alter_view.
    
    Authored-by: RoryQi <1242949407@qq.com>
    Signed-off-by: Wenchen Fan <wenchen@databricks.com>
    (cherry picked from commit e0c6b2e9655331e308a78d972db4a18d24b73e37)
    Signed-off-by: Wenchen Fan <wenchen@databricks.com>
---
 .../apache/spark/sql/execution/command/views.scala |  6 +++--
 .../spark/sql/execution/SQLViewTestSuite.scala     | 28 ++++++++++++++++++++++
 2 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/command/views.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/command/views.scala
index ebcd277..5e92ce2 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/execution/command/views.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/command/views.scala
@@ -259,7 +259,10 @@ case class AlterViewAsCommand(
   def markAsAnalyzed(): LogicalPlan = copy(isAnalyzed = true)
 
   override def run(session: SparkSession): Seq[Row] = {
-    if (session.sessionState.catalog.isTempView(name)) {
+    val isTemporary = session.sessionState.catalog.isTempView(name)
+    verifyTemporaryObjectsNotExists(session.sessionState.catalog, isTemporary, name, query)
+    verifyAutoGeneratedAliasesNotExists(query, isTemporary, name)
+    if (isTemporary) {
       alterTemporaryView(session, query)
     } else {
       alterPermanentView(session, query)
@@ -286,7 +289,6 @@ case class AlterViewAsCommand(
   }
 
   private def alterPermanentView(session: SparkSession, analyzedPlan: LogicalPlan): Unit
= {
-    verifyAutoGeneratedAliasesNotExists(analyzedPlan, isTemporary = false, name)
     val viewMeta = session.sessionState.catalog.getTableMetadata(name)
 
     // Detect cyclic view reference on ALTER VIEW.
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/SQLViewTestSuite.scala
b/sql/core/src/test/scala/org/apache/spark/sql/execution/SQLViewTestSuite.scala
index 80e9019..bc64f51 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/execution/SQLViewTestSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/SQLViewTestSuite.scala
@@ -465,4 +465,32 @@ class PersistedViewTestSuite extends SQLViewTestSuite with SharedSparkSession
{
       }
     }
   }
+
+  test("SPARK-36011: Disallow altering permanent views based on temporary views or UDFs")
{
+    import testImplicits._
+    withTable("t") {
+      (1 to 10).toDF("id").write.saveAsTable("t")
+      withView("v1") {
+        withTempView("v2") {
+          sql("CREATE VIEW v1 AS SELECT * FROM t")
+          sql("CREATE TEMPORARY VIEW v2 AS  SELECT * FROM t")
+          var e = intercept[AnalysisException] {
+            sql("ALTER VIEW v1 AS SELECT * FROM v2")
+          }.getMessage
+          assert(e.contains("Not allowed to create a permanent view `default`.`v1` by " +
+            "referencing a temporary view v2"))
+          val tempFunctionName = "temp_udf"
+          val functionClass = "test.org.apache.spark.sql.MyDoubleAvg"
+          withUserDefinedFunction(tempFunctionName -> true) {
+            sql(s"CREATE TEMPORARY FUNCTION $tempFunctionName AS '$functionClass'")
+            e = intercept[AnalysisException] {
+              sql(s"ALTER VIEW v1 AS SELECT $tempFunctionName(id) from t")
+            }.getMessage
+            assert(e.contains("Not allowed to create a permanent view `default`.`v1` by "
+
+              s"referencing a temporary function `$tempFunctionName`"))
+          }
+        }
+      }
+    }
+  }
 }

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org


Mime
View raw message