diff --git a/CHANGES.txt b/CHANGES.txt index 3b0524b217..45ed523b71 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,7 @@ * Duplicate the buffer before passing it to analyser in SASI operation (CASSANDRA-13512) * Properly evict pstmts from prepared statements cache (CASSANDRA-13641) Merged from 3.0: + * Drop table should remove corresponding entries in dropped_columns table (CASSANDRA-13730) * Log warn message until legacy auth tables have been migrated (CASSANDRA-13371) * Fix incorrect [2.1 <- 3.0] serialization of counter cells created in 2.0 (CASSANDRA-13691) * Fix invalid writetime for null cells (CASSANDRA-13711) diff --git a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java index 03c393fc46..1f8d2fcc18 100644 --- a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java +++ b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java @@ -31,6 +31,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.config.*; +import org.apache.cassandra.config.CFMetaData.DroppedColumn; import org.apache.cassandra.config.ColumnDefinition.ClusteringOrder; import org.apache.cassandra.cql3.*; import org.apache.cassandra.cql3.functions.*; @@ -656,6 +657,9 @@ public final class SchemaKeyspace for (ColumnDefinition column : table.allColumns()) dropColumnFromSchemaMutation(table, column, builder); + for (CFMetaData.DroppedColumn column : table.getDroppedColumns().values()) + dropDroppedColumnFromSchemaMutation(table, column, timestamp, builder); + for (TriggerMetadata trigger : table.getTriggers()) dropTriggerFromSchemaMutation(table, trigger, builder); @@ -694,6 +698,11 @@ public final class SchemaKeyspace .add("type", expandUserTypes(column.type).asCQL3Type().toString()); } + private static void dropDroppedColumnFromSchemaMutation(CFMetaData table, DroppedColumn column, long timestamp, Mutation.SimpleBuilder builder) + { + builder.update(DroppedColumns).row(table.cfName, column.name).delete(); + } + private static void addTriggerToSchemaMutation(CFMetaData table, TriggerMetadata trigger, Mutation.SimpleBuilder builder) { builder.update(Triggers) diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/DropTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/DropTest.java index e5c70897be..692eb45fb9 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/operations/DropTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/operations/DropTest.java @@ -34,4 +34,17 @@ public class DropTest extends CQLTester execute("DROP TABLE IF EXISTS keyspace_does_not_exist.table_does_not_exist"); } + @Test + public void testDropTableWithDroppedColumns() throws Throwable + { + // CASSANDRA-13730: entry should be removed from dropped_columns table when table is dropped + String cf = createTable("CREATE TABLE %s (k1 int, c1 int , v1 int, v2 int, PRIMARY KEY (k1, c1))"); + + execute("ALTER TABLE %s DROP v2"); + execute("DROP TABLE %s"); + + assertRowsIgnoringOrder(execute("select * from system_schema.dropped_columns where keyspace_name = '" + + keyspace() + + "' and table_name = '" + cf + "'")); + } }