diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index 68e06be7f3..19f744ed10 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -615,6 +615,27 @@ public final class CFMetaData this); } + public CFMetaData copyWithNewCompactValueType(AbstractType type) + { + assert isDense && compactValueColumn.type instanceof EmptyType && partitionColumns.size() == 1; + return copyOpts(new CFMetaData(ksName, + cfName, + cfId, + isSuper, + isCounter, + isDense, + isCompound, + isView, + copy(partitionKeyColumns), + copy(clusteringColumns), + PartitionColumns.of(compactValueColumn.withNewType(type)), + partitioner, + superCfKeyColumn, + superCfValueColumn), + this); + } + + private static List copy(List l) { List copied = new ArrayList<>(l.size()); diff --git a/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java index 5bff24ee98..193c24c5e7 100644 --- a/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java @@ -30,6 +30,8 @@ import org.apache.cassandra.cql3.ColumnIdentifier; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.BytesType; +import org.apache.cassandra.db.marshal.EmptyType; import org.apache.cassandra.db.view.View; import org.apache.cassandra.exceptions.*; import org.apache.cassandra.schema.IndexMetadata; @@ -109,7 +111,26 @@ public class AlterTableStatement extends SchemaAlteringStatement switch (oType) { case ALTER: - throw new InvalidRequestException("Altering of types is not allowed"); + // We do not support altering of types and only allow this to for people who have already one + // through the upgrade of 2.x CQL-created SSTables with Thrift writes, affected by CASSANDRA-15778. + if (meta.isDense() + && meta.compactValueColumn().equals(def) + && meta.compactValueColumn().type instanceof EmptyType + && validator != null) + { + if (validator.getType() instanceof BytesType) + { + cfm = meta.copyWithNewCompactValueType(validator.getType()); + break; + } + + throw new InvalidRequestException(String.format("Compact value type can only be changed to BytesType, but %s was given.", + validator.getType())); + } + else + { + throw new InvalidRequestException("Altering of types is not allowed"); + } case ADD: assert columnName != null; if (meta.isDense()) diff --git a/src/java/org/apache/cassandra/db/marshal/AbstractType.java b/src/java/org/apache/cassandra/db/marshal/AbstractType.java index 72bfa66b35..a15dd48b0d 100644 --- a/src/java/org/apache/cassandra/db/marshal/AbstractType.java +++ b/src/java/org/apache/cassandra/db/marshal/AbstractType.java @@ -394,7 +394,11 @@ public abstract class AbstractType implements Comparator public void writeValue(ByteBuffer value, DataOutputPlus out) throws IOException { assert value.hasRemaining(); - if (valueLengthIfFixed() >= 0) + int valueLengthIfFixed = valueLengthIfFixed(); + assert valueLengthIfFixed < 0 || value.remaining() == valueLengthIfFixed : String.format("Expected exactly %d bytes, but was %d", + valueLengthIfFixed, value.remaining()); + + if (valueLengthIfFixed >= 0) out.write(value); else ByteBufferUtil.writeWithVIntLength(value, out); @@ -403,7 +407,11 @@ public abstract class AbstractType implements Comparator public long writtenLength(ByteBuffer value) { assert value.hasRemaining(); - return valueLengthIfFixed() >= 0 + int valueLengthIfFixed = valueLengthIfFixed(); + assert valueLengthIfFixed < 0 || value.remaining() == valueLengthIfFixed : String.format("Expected exactly %d bytes, but was %d", + valueLengthIfFixed, value.remaining()); + + return valueLengthIfFixed >= 0 ? value.remaining() : TypeSizes.sizeofWithVIntLength(value); } diff --git a/src/java/org/apache/cassandra/schema/LegacySchemaMigrator.java b/src/java/org/apache/cassandra/schema/LegacySchemaMigrator.java index 59df65b162..b7f7e73d0e 100644 --- a/src/java/org/apache/cassandra/schema/LegacySchemaMigrator.java +++ b/src/java/org/apache/cassandra/schema/LegacySchemaMigrator.java @@ -632,9 +632,12 @@ public final class LegacySchemaMigrator } else { - // For dense compact tables, we get here if we don't have a compact value column, in which case we should add it - // (we use EmptyType to recognize that the compact value was not declared by the use (see CreateTableStatement too)) - defs.add(ColumnDefinition.regularDef(ksName, cfName, names.defaultCompactValueName(), EmptyType.instance)); + // For dense compact tables, we get here if we don't have a compact value column, in which case we should add it. + // We use EmptyType to recognize that the compact value was not declared by the user (see CreateTableStatement). + // If user made any writes to this column, compact value column should be initialized as bytes (see CASSANDRA-15778). + AbstractType compactColumnType = Boolean.getBoolean("cassandra.init_dense_table_compact_value_as_bytes") + ? BytesType.instance : EmptyType.instance; + defs.add(ColumnDefinition.regularDef(ksName, cfName, names.defaultCompactValueName(), compactColumnType)); } } diff --git a/src/java/org/apache/cassandra/serializers/EmptySerializer.java b/src/java/org/apache/cassandra/serializers/EmptySerializer.java index 733e179ef0..352ef2c3e1 100644 --- a/src/java/org/apache/cassandra/serializers/EmptySerializer.java +++ b/src/java/org/apache/cassandra/serializers/EmptySerializer.java @@ -40,7 +40,11 @@ public class EmptySerializer implements TypeSerializer public void validate(ByteBuffer bytes) throws MarshalException { if (bytes.remaining() > 0) - throw new MarshalException("EmptyType only accept empty values"); + { + throw new MarshalException("EmptyType only accept empty values. " + + "A non-empty value can be a result of a Thrift write into CQL-created dense table. " + + "See CASSANDRA-15778 for details."); + } } public String toString(Void value) diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-CompressionInfo.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-CompressionInfo.db new file mode 100644 index 0000000000..01bde10102 Binary files /dev/null and b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-CompressionInfo.db differ diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Data.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Data.db new file mode 100644 index 0000000000..4c891d2d51 Binary files /dev/null and b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Data.db differ diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Digest.sha1 b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Digest.sha1 new file mode 100644 index 0000000000..e71840b9fd --- /dev/null +++ b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Digest.sha1 @@ -0,0 +1 @@ +3389985016 \ No newline at end of file diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Filter.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Filter.db new file mode 100644 index 0000000000..b6728a157b Binary files /dev/null and b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Filter.db differ diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Index.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Index.db new file mode 100644 index 0000000000..64e12cd4ca Binary files /dev/null and b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Index.db differ diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Statistics.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Statistics.db new file mode 100644 index 0000000000..1361f7cc88 Binary files /dev/null and b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Statistics.db differ diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Summary.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Summary.db new file mode 100644 index 0000000000..76791c7423 Binary files /dev/null and b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-Summary.db differ diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-TOC.txt b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-TOC.txt new file mode 100644 index 0000000000..402e1ab9c7 --- /dev/null +++ b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_bytes/legacy_tables-legacy_ka_cql_created_dense_table_with_bytes-ka-1-TOC.txt @@ -0,0 +1,8 @@ +Digest.sha1 +CompressionInfo.db +Summary.db +Statistics.db +Data.db +Index.db +TOC.txt +Filter.db diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-CompressionInfo.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-CompressionInfo.db new file mode 100644 index 0000000000..6f36650c88 Binary files /dev/null and b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-CompressionInfo.db differ diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Data.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Data.db new file mode 100644 index 0000000000..bdad43139b Binary files /dev/null and b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Data.db differ diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Digest.sha1 b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Digest.sha1 new file mode 100644 index 0000000000..f9e4b9c152 --- /dev/null +++ b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Digest.sha1 @@ -0,0 +1 @@ +1334250623 \ No newline at end of file diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Filter.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Filter.db new file mode 100644 index 0000000000..b6728a157b Binary files /dev/null and b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Filter.db differ diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Index.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Index.db new file mode 100644 index 0000000000..64e12cd4ca Binary files /dev/null and b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Index.db differ diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Statistics.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Statistics.db new file mode 100644 index 0000000000..13dc64aff3 Binary files /dev/null and b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Statistics.db differ diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Summary.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Summary.db new file mode 100644 index 0000000000..76791c7423 Binary files /dev/null and b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-Summary.db differ diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-TOC.txt b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-TOC.txt new file mode 100644 index 0000000000..402e1ab9c7 --- /dev/null +++ b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_cql_created_dense_table_with_int/legacy_tables-legacy_ka_cql_created_dense_table_with_int-ka-1-TOC.txt @@ -0,0 +1,8 @@ +Digest.sha1 +CompressionInfo.db +Summary.db +Statistics.db +Data.db +Index.db +TOC.txt +Filter.db diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/AlterTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/AlterTest.java index d97583ada0..1efefc33af 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/operations/AlterTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/operations/AlterTest.java @@ -23,6 +23,7 @@ import org.junit.Test; import org.apache.cassandra.cql3.CQLTester; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.db.marshal.IntegerType; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.SyntaxException; @@ -506,4 +507,25 @@ public class AlterTest extends CQLTester assertInvalidMessage("Cannot rename unknown column column1 in keyspace", "ALTER TABLE %s RENAME column1 TO column2"); } + + @Test + public void testAlterTableAlterType() throws Throwable + { + createTable("CREATE TABLE %s (a int, b int, PRIMARY KEY (a,b)) WITH COMPACT STORAGE"); + assertInvalidMessage(String.format("Compact value type can only be changed to BytesType, but %s was given.", + IntegerType.instance), + "ALTER TABLE %s ALTER value TYPE 'org.apache.cassandra.db.marshal.IntegerType'"); + + execute("ALTER TABLE %s ALTER value TYPE 'org.apache.cassandra.db.marshal.BytesType'"); + + createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a,b)) WITH COMPACT STORAGE"); + assertInvalidMessage("Altering of types is not allowed", + "ALTER TABLE %s ALTER c TYPE 'org.apache.cassandra.db.marshal.BytesType'"); + + createTable("CREATE TABLE %s (a int, value int, PRIMARY KEY (a,value)) WITH COMPACT STORAGE"); + assertInvalidMessage("Altering of types is not allowed", + "ALTER TABLE %s ALTER value TYPE 'org.apache.cassandra.db.marshal.IntegerType'"); + execute("ALTER TABLE %s ALTER value1 TYPE 'org.apache.cassandra.db.marshal.BytesType'"); + } + } diff --git a/test/unit/org/apache/cassandra/db/ScrubTest.java b/test/unit/org/apache/cassandra/db/ScrubTest.java index 757add900f..e8a3285c79 100644 --- a/test/unit/org/apache/cassandra/db/ScrubTest.java +++ b/test/unit/org/apache/cassandra/db/ScrubTest.java @@ -42,6 +42,7 @@ import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.compaction.OperationType; import org.apache.cassandra.db.compaction.Scrubber; import org.apache.cassandra.db.lifecycle.LifecycleTransaction; +import org.apache.cassandra.db.marshal.Int32Type; import org.apache.cassandra.db.marshal.LongType; import org.apache.cassandra.db.marshal.UUIDType; import org.apache.cassandra.db.partitions.Partition; @@ -509,7 +510,7 @@ public class ScrubTest QueryProcessor.process("CREATE TABLE \"Keyspace1\".test_scrub_validation (a text primary key, b int)", ConsistencyLevel.ONE); ColumnFamilyStore cfs2 = keyspace.getColumnFamilyStore("test_scrub_validation"); - new Mutation(UpdateBuilder.create(cfs2.metadata, "key").newRow().add("b", LongType.instance.decompose(1L)).build()).apply(); + new Mutation(UpdateBuilder.create(cfs2.metadata, "key").newRow().add("b", Int32Type.instance.decompose(1)).build()).apply(); cfs2.forceBlockingFlush(); CompactionManager.instance.performScrub(cfs2, false, false, 2); diff --git a/test/unit/org/apache/cassandra/db/marshal/EmptyTypeTest.java b/test/unit/org/apache/cassandra/db/marshal/EmptyTypeTest.java index 30f63b3d3a..423e304565 100644 --- a/test/unit/org/apache/cassandra/db/marshal/EmptyTypeTest.java +++ b/test/unit/org/apache/cassandra/db/marshal/EmptyTypeTest.java @@ -88,7 +88,7 @@ public class EmptyTypeTest Assert.fail("compose is expected to reject non-empty values, but did not"); } catch (MarshalException e) { - Assert.assertEquals("EmptyType only accept empty values", e.getMessage()); + Assert.assertTrue(e.getMessage().startsWith("EmptyType only accept empty values")); } } } diff --git a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java index 42e8ff6c27..510d12f448 100644 --- a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java @@ -790,6 +790,43 @@ public class LegacySSTableTest cfs.loadNewSSTables(); } + + /** + * Test for CASSANDRA-15778 + */ + @Test + public void testReadLegacyCqlCreatedTableWithBytes() throws Exception { + String table = "legacy_ka_cql_created_dense_table_with_bytes"; + QueryProcessor.executeInternal("CREATE TABLE legacy_tables." + table + " (" + + " k int," + + " v text," + + " PRIMARY KEY(k, v)) WITH COMPACT STORAGE"); + loadLegacyTable("legacy_%s_cql_created_dense_table_with_bytes%s", "ka", ""); + QueryProcessor.executeInternal("ALTER TABLE legacy_tables." + table + " ALTER value TYPE 'org.apache.cassandra.db.marshal.BytesType';"); + UntypedResultSet rs = QueryProcessor.executeInternal("SELECT * FROM legacy_tables." + table); + Assert.assertNotNull(rs); + assertEquals(1, rs.size()); + assertEquals(ByteBufferUtil.bytes("byte string"), rs.one().getBytes("value")); + } + + /** + * Test for CASSANDRA-15778 + */ + @Test + public void testReadLegacyCqlCreatedTableWithInt() throws Exception { + String table = "legacy_ka_cql_created_dense_table_with_int"; + QueryProcessor.executeInternal("CREATE TABLE legacy_tables." + table + " (" + + " k int," + + " v text," + + " PRIMARY KEY(k, v)) WITH COMPACT STORAGE"); + loadLegacyTable("legacy_%s_cql_created_dense_table_with_int%s", "ka", ""); + QueryProcessor.executeInternal("ALTER TABLE legacy_tables." + table + " ALTER value TYPE 'org.apache.cassandra.db.marshal.BytesType';"); + UntypedResultSet rs = QueryProcessor.executeInternal("SELECT * FROM legacy_tables." + table); + Assert.assertNotNull(rs); + assertEquals(1, rs.size()); + assertEquals(ByteBufferUtil.bytes(0xaabbcc), rs.one().getBytes("value")); + } + /** * Generates sstables for 8 CQL tables (see {@link #createTables(String)}) in current * sstable format (version) into {@code test/data/legacy-sstables/VERSION}, where