Github user gatorsmile commented on a diff in the pull request:

    https://github.com/apache/spark/pull/13451#discussion_r65489841
  
    --- Diff: 
sql/core/src/test/scala/org/apache/spark/sql/sources/CreateTableAsSelectSuite.scala
 ---
    @@ -40,172 +43,175 @@ class CreateTableAsSelectSuite extends DataSourceTest 
with SharedSQLContext with
       override def afterAll(): Unit = {
         try {
           spark.catalog.dropTempView("jt")
    +      if (path.exists()) {
    +        Utils.deleteRecursively(path)
    +      }
         } finally {
           super.afterAll()
         }
       }
     
    -  after {
    -    Utils.deleteRecursively(path)
    +  before {
    +    if (path.exists()) {
    +      Utils.deleteRecursively(path)
    +    }
       }
     
    -  test("CREATE TEMPORARY TABLE AS SELECT") {
    -    sql(
    -      s"""
    -        |CREATE TEMPORARY TABLE jsonTable
    -        |USING json
    -        |OPTIONS (
    -        |  path '${path.toString}'
    -        |) AS
    -        |SELECT a, b FROM jt
    -      """.stripMargin)
    -
    -    checkAnswer(
    -      sql("SELECT a, b FROM jsonTable"),
    -      sql("SELECT a, b FROM jt").collect())
    -
    -    spark.catalog.dropTempView("jsonTable")
    +  test("CREATE TABLE USING AS SELECT") {
    +    withTable("jsonTable") {
    +      sql(
    +        s"""
    +           |CREATE TABLE jsonTable
    +           |USING json
    +           |OPTIONS (
    +           |  path '${path.toString}'
    +           |) AS
    +           |SELECT a, b FROM jt
    +         """.stripMargin)
    +
    +      checkAnswer(
    +        sql("SELECT a, b FROM jsonTable"),
    +        sql("SELECT a, b FROM jt").collect())
    +    }
       }
     
    -  test("CREATE TEMPORARY TABLE AS SELECT based on the file without write 
permission") {
    +  test("CREATE TABLE USING AS SELECT based on the file without write 
permission") {
         val childPath = new File(path.toString, "child")
         path.mkdir()
    -    childPath.createNewFile()
         path.setWritable(false)
     
    -    val e = intercept[IOException] {
    +    val e = intercept[Exception] {
           sql(
             s"""
    -           |CREATE TEMPORARY TABLE jsonTable
    +           |CREATE TABLE jsonTable
                |USING json
                |OPTIONS (
    -           |  path '${path.toString}'
    +           |  path '${childPath.toString}'
                |) AS
                |SELECT a, b FROM jt
    -        """.stripMargin)
    +         """.stripMargin)
           sql("SELECT a, b FROM jsonTable").collect()
         }
    -    assert(e.getMessage().contains("Unable to clear output directory"))
     
    +    assert(e.getMessage().contains("Job aborted"))
         path.setWritable(true)
       }
     
       test("create a table, drop it and create another one with the same 
name") {
    -    sql(
    -      s"""
    -        |CREATE TEMPORARY TABLE jsonTable
    -        |USING json
    -        |OPTIONS (
    -        |  path '${path.toString}'
    -        |) AS
    -        |SELECT a, b FROM jt
    -      """.stripMargin)
    -
    -    checkAnswer(
    -      sql("SELECT a, b FROM jsonTable"),
    -      sql("SELECT a, b FROM jt").collect())
    -
    -    val message = intercept[ParseException]{
    +    withTable("jsonTable") {
           sql(
             s"""
    -        |CREATE TEMPORARY TABLE IF NOT EXISTS jsonTable
    -        |USING json
    -        |OPTIONS (
    -        |  path '${path.toString}'
    -        |) AS
    -        |SELECT a * 4 FROM jt
    -      """.stripMargin)
    -    }.getMessage
    -    assert(message.toLowerCase.contains("operation not allowed"))
    -
    -    // Overwrite the temporary table.
    -    sql(
    -      s"""
    -        |CREATE TEMPORARY TABLE jsonTable
    -        |USING json
    -        |OPTIONS (
    -        |  path '${path.toString}'
    -        |) AS
    -        |SELECT a * 4 FROM jt
    -      """.stripMargin)
    -    checkAnswer(
    -      sql("SELECT * FROM jsonTable"),
    -      sql("SELECT a * 4 FROM jt").collect())
    -
    -    spark.catalog.dropTempView("jsonTable")
    -    // Explicitly delete the data.
    -    if (path.exists()) Utils.deleteRecursively(path)
    -
    -    sql(
    -      s"""
    -        |CREATE TEMPORARY TABLE jsonTable
    -        |USING json
    -        |OPTIONS (
    -        |  path '${path.toString}'
    -        |) AS
    -        |SELECT b FROM jt
    -      """.stripMargin)
    -
    -    checkAnswer(
    -      sql("SELECT * FROM jsonTable"),
    -      sql("SELECT b FROM jt").collect())
    -
    -    spark.catalog.dropTempView("jsonTable")
    -  }
    +           |CREATE TABLE jsonTable
    +           |USING json
    +           |OPTIONS (
    +           |  path '${path.toString}'
    +           |) AS
    +           |SELECT a, b FROM jt
    +         """.stripMargin)
    +
    +      checkAnswer(
    +        sql("SELECT a, b FROM jsonTable"),
    +        sql("SELECT a, b FROM jt").collect())
    +
    +      // Creates a table of the same name with flag "if not exists", 
nothing happens
    +      sql(
    +        s"""
    +           |CREATE TABLE IF NOT EXISTS jsonTable
    +           |USING json
    +           |OPTIONS (
    +           |  path '${path.toString}'
    +           |) AS
    +           |SELECT a * 4 FROM jt
    +         """.stripMargin)
    +      checkAnswer(
    +        sql("SELECT * FROM jsonTable"),
    +        sql("SELECT a, b FROM jt").collect())
    +
    +      // Explicitly drops the table and deletes the underlying data.
    +      sql("DROP TABLE jsonTable")
    +      if (path.exists()) Utils.deleteRecursively(path)
     
    -  test("CREATE TEMPORARY TABLE AS SELECT with IF NOT EXISTS is not 
allowed") {
    -    val message = intercept[ParseException]{
    +      // Creates a table of the same name again, this time we succeed.
           sql(
             s"""
    -        |CREATE TEMPORARY TABLE IF NOT EXISTS jsonTable
    -        |USING json
    -        |OPTIONS (
    -        |  path '${path.toString}'
    -        |) AS
    -        |SELECT b FROM jt
    -      """.stripMargin)
    -    }.getMessage
    -    assert(message.toLowerCase.contains("operation not allowed"))
    +           |CREATE TABLE jsonTable
    +           |USING json
    +           |OPTIONS (
    +           |  path '${path.toString}'
    +           |) AS
    +           |SELECT b FROM jt
    +         """.stripMargin)
    +
    +      checkAnswer(
    +        sql("SELECT * FROM jsonTable"),
    +        sql("SELECT b FROM jt").collect())
    +    }
    +  }
    +
    +  test("disallows CREATE TEMPORARY TABLE ... USING ... AS query") {
    +    withTable("t") {
    +      val error = intercept[ParseException] {
    +        sql(
    +          s"""
    +             |CREATE TEMPORARY TABLE t USING PARQUET
    +             |OPTIONS (PATH '${path.toString}')
    +             |PARTITIONED BY (a)
    +             |AS SELECT 1 AS a, 2 AS b
    +           """.stripMargin
    +        )
    +      }.getMessage
    +      assert(error.contains("Operation not allowed") &&
    +        error.contains("CREATE TEMPORARY TABLE ... USING ... AS query"))
    +    }
       }
     
    -  test("a CTAS statement with column definitions is not allowed") {
    -    intercept[AnalysisException]{
    +  test("disallows CREATE EXTERNAL TABLE ... USING ... AS query") {
    +    withTable("t") {
    +      val error = intercept[ParseException] {
    +        sql(
    +          s"""
    +             |CREATE EXTERNAL TABLE t USING PARQUET
    +             |OPTIONS (PATH '${path.toString}')
    +             |AS SELECT 1 AS a, 2 AS b
    +           """.stripMargin
    +        )
    +      }.getMessage
    +
    +      assert(error.contains("Operation not allowed") &&
    +        error.contains("CREATE EXTERNAL TABLE ... USING"))
    +    }
    +  }
    +
    +  test("create table using as select - with partitioned by") {
    +    val catalog = spark.sessionState.catalog
    +    withTable("t") {
           sql(
             s"""
    -        |CREATE TEMPORARY TABLE jsonTable (a int, b string)
    -        |USING json
    -        |OPTIONS (
    -        |  path '${path.toString}'
    -        |) AS
    -        |SELECT a, b FROM jt
    -      """.stripMargin)
    +           |CREATE TABLE t USING PARQUET
    +           |OPTIONS (PATH '${path.toString}')
    +           |PARTITIONED BY (a)
    +           |AS SELECT 1 AS a, 2 AS b
    +           """.stripMargin
    --- End diff --
    
    Nit: The indent issue


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastruct...@apache.org or file a JIRA ticket
with INFRA.
---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org
For additional commands, e-mail: reviews-h...@spark.apache.org

Reply via email to