Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,13 @@ class SessionCatalog(
tableRelationCache.invalidate(key)
}

/** This method discards any cached table relation plans for the given table identifier. */
def invalidateCachedTable(name: TableIdentifier): Unit = {
val dbName = formatDatabaseName(name.database.getOrElse(currentDb))
val tableName = formatTableName(name.table)
invalidateCachedTable(QualifiedTableName(dbName, tableName))
}

/** This method provides a way to invalidate all the cached plans. */
def invalidateAllCachedTables(): Unit = {
tableRelationCache.invalidateAll()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,7 @@ case class AlterTableSetPropertiesCommand(
properties = table.properties ++ properties,
comment = properties.get(TableCatalog.PROP_COMMENT).orElse(table.comment))
catalog.alterTable(newTable)
catalog.invalidateCachedTable(tableName)
Seq.empty[Row]
}

Expand Down Expand Up @@ -315,6 +316,7 @@ case class AlterTableUnsetPropertiesCommand(
val newProperties = table.properties.filter { case (k, _) => !propKeys.contains(k) }
val newTable = table.copy(properties = newProperties, comment = tableComment)
catalog.alterTable(newTable)
catalog.invalidateCachedTable(tableName)
Seq.empty[Row]
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,4 +123,28 @@ class HiveParquetSuite extends QueryTest with ParquetTest with TestHiveSingleton
assert(msg.contains("cannot resolve '`c3`' given input columns"))
}
}

test("SPARK-37098: Alter table properties should invalidate cache") {
// specify the compression in case we change it in future
withSQLConf(SQLConf.PARQUET_COMPRESSION.key -> "snappy") {
withTempPath { dir =>
withTable("t") {
sql(s"CREATE TABLE t (c int) STORED AS PARQUET LOCATION '${dir.getCanonicalPath}'")
// cache table metadata
sql("SELECT * FROM t")
sql("ALTER TABLE t SET TBLPROPERTIES('parquet.compression'='gzip')")
sql("INSERT INTO TABLE t values(1)")
val files1 = dir.listFiles().filter(_.getName.endsWith("gz.parquet"))
assert(files1.length == 1)

// cache table metadata again
sql("SELECT * FROM t")
sql("ALTER TABLE t UNSET TBLPROPERTIES('parquet.compression')")
sql("INSERT INTO TABLE t values(1)")
val files2 = dir.listFiles().filter(_.getName.endsWith("snappy.parquet"))
assert(files2.length == 1)
}
}
}
}
}