gengliangwang commented on a change in pull request #35855:
URL: https://github.com/apache/spark/pull/35855#discussion_r835479625
##########
File path:
sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/catalog/SessionCatalogSuite.scala
##########
@@ -120,6 +121,67 @@ abstract class SessionCatalogSuite extends AnalysisTest
with Eventually {
assert(e.contains(s"`$name` is not a valid name for tables/databases."))
}
+ test("create table with default columns") {
+ withBasicCatalog { catalog =>
+ assert(catalog.externalCatalog.listTables("db1").isEmpty)
+ assert(catalog.externalCatalog.listTables("db2").toSet == Set("tbl1",
"tbl2"))
+ catalog.createTable(newTable(
+ "tbl3", Some("db1"), defaultColumns = true), ignoreIfExists = false)
+ catalog.createTable(newTable(
+ "tbl3", Some("db2"), defaultColumns = true), ignoreIfExists = false)
+ assert(catalog.externalCatalog.listTables("db1").toSet == Set("tbl3"))
+ assert(catalog.externalCatalog.listTables("db2").toSet == Set("tbl1",
"tbl2", "tbl3"))
+ // Inspect the default column values.
+ val db1tbl3 = catalog.externalCatalog.getTable("db1", "tbl3")
+ val currentDefault =
ResolveDefaultColumns.CURRENT_DEFAULT_COLUMN_METADATA_KEY
+
+ def findField(name: String, schema: StructType): StructField =
+ schema.fields.filter(_.name == name).head
+ val columnA: StructField = findField("a", db1tbl3.schema)
+ val columnB: StructField = findField("b", db1tbl3.schema)
+ val columnC: StructField = findField("c", db1tbl3.schema)
+ val columnD: StructField = findField("d", db1tbl3.schema)
+ val columnE: StructField = findField("e", db1tbl3.schema)
+
+ val defaultValueColumnA: String =
columnA.metadata.getString(currentDefault)
+ val defaultValueColumnB: String =
columnB.metadata.getString(currentDefault)
+ val defaultValueColumnC: String =
columnC.metadata.getString(currentDefault)
+ val defaultValueColumnD: String =
columnD.metadata.getString(currentDefault)
+ val defaultValueColumnE: String =
columnE.metadata.getString(currentDefault)
+
+ assert(defaultValueColumnA == "42")
+ assert(defaultValueColumnB == "\"abc\"")
+ assert(defaultValueColumnC == "_@#$%")
+ assert(defaultValueColumnD == "(select min(x) from badtable)")
+ assert(defaultValueColumnE == "41 + 1")
+
+ // Analyze the default column values.
+ val analyzer = new Analyzer(new SessionCatalog(new InMemoryCatalog,
FunctionRegistry.builtin))
+ val statementType = "CREATE TABLE"
+ assert(ResolveDefaultColumns.analyze(analyzer, columnA,
statementType).sql == "42")
+ assert(ResolveDefaultColumns.analyze(analyzer, columnB,
statementType).sql == "'abc'")
+ assert(intercept[AnalysisException] {
+ ResolveDefaultColumns.analyze(analyzer, columnC, statementType)
+ }.getMessage.contains("fails to parse as a valid expression"))
+ assert(intercept[AnalysisException] {
+ ResolveDefaultColumns.analyze(analyzer, columnD, statementType)
+ }.getMessage.contains("fails to resolve as a valid expression"))
+ assert(intercept[AnalysisException] {
+ ResolveDefaultColumns.analyze(analyzer, columnE, statementType)
+ }.getMessage.contains("statement provided a value of incompatible type"))
+
+ // Make sure that constant-folding default values does not take place
when the feature is
+ // disabled.
+ withSQLConf(SQLConf.ENABLE_DEFAULT_COLUMNS.key -> "false") {
Review comment:
nit: actually I was expecting a test case which captures parser
exception when the conf is disabled.
--
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]