Author: jbellis Date: Sun Jun 5 13:41:30 2011 New Revision: 1132405 URL: http://svn.apache.org/viewvc?rev=1132405&view=rev Log: add cql drop index patch by pyaskevich and jbellis for CASSANDRA-2617
Modified: cassandra/branches/cassandra-0.8/CHANGES.txt cassandra/branches/cassandra-0.8/doc/cql/CQL.textile cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/config/CFMetaData.java cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/Cql.g cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/QueryProcessor.java cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/StatementType.java cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java cassandra/branches/cassandra-0.8/test/system/test_cql.py cassandra/branches/cassandra-0.8/test/system/test_thrift_server.py cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/SchemaLoader.java Modified: cassandra/branches/cassandra-0.8/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/CHANGES.txt?rev=1132405&r1=1132404&r2=1132405&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/CHANGES.txt (original) +++ cassandra/branches/cassandra-0.8/CHANGES.txt Sun Jun 5 13:41:30 2011 @@ -7,6 +7,7 @@ - counter support (CASSANDRA-2473) - improve JDBC spec compliance (CASSANDRA-2720) - ALTER TABLE (CASSANDRA-1709) + - DROP INDEX (CASSANDRA-2617) * add support for comparator parameters and a generic ReverseType (CASSANDRA-2355) * add CompositeType and DynamicCompositeType (CASSANDRA-2231) Modified: cassandra/branches/cassandra-0.8/doc/cql/CQL.textile URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/doc/cql/CQL.textile?rev=1132405&r1=1132404&r2=1132405&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/doc/cql/CQL.textile (original) +++ cassandra/branches/cassandra-0.8/doc/cql/CQL.textile Sun Jun 5 13:41:30 2011 @@ -293,6 +293,15 @@ bc. CREATE INDEX [index_name] ON <column A @CREATE INDEX@ statement is used to create a new, automatic secondary index for the named column. +h2. DROP INDEX + +_Synopsis:_ + +bc. DROP INDEX <INDEX_NAME> + +A @DROP INDEX@ statement is used to drop an existing secondary index. +DROP INDEX <INDEX_NAME> statement will search all ColumnFamilies in the current Keyspace for specified index and delete it if found. + h2. DROP _Synopsis:_ Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/config/CFMetaData.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/config/CFMetaData.java?rev=1132405&r1=1132404&r2=1132405&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/config/CFMetaData.java (original) +++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/config/CFMetaData.java Sun Jun 5 13:41:30 2011 @@ -308,6 +308,10 @@ public final class CFMetaData /** * generate a column family name for an index corresponding to the given column. * This is NOT the same as the index's name! This is only used in sstable filenames and is not exposed to users. + * + * @param info A definition of the column with index + * + * @return name of the index ColumnFamily */ public String indexColumnFamilyName(ColumnDefinition info) { @@ -373,6 +377,8 @@ public final class CFMetaData for (ColumnDef aColumn_metadata : cf.column_metadata) { ColumnDefinition cd = ColumnDefinition.inflate(aColumn_metadata); + if (cd.getIndexName() == null) + cd.setIndexName(getDefaultIndexName(comparator, cd.name)); column_metadata.put(cd.name, cd); } @@ -934,6 +940,37 @@ public final class CFMetaData return column_metadata.get(name); } + /** + * Convert a null index_name to appropriate default name according to column status + * @param cf_def Thrift ColumnFamily Definition + */ + public static void addDefaultIndexNames(org.apache.cassandra.thrift.CfDef cf_def) throws InvalidRequestException + { + if (cf_def.column_metadata == null) + return; + + AbstractType comparator; + try + { + comparator = TypeParser.parse(cf_def.comparator_type); + } + catch (ConfigurationException e) + { + throw new InvalidRequestException(e.getMessage()); + } + + for (org.apache.cassandra.thrift.ColumnDef column : cf_def.column_metadata) + { + if (column.index_type != null && column.index_name == null) + column.index_name = getDefaultIndexName(comparator, column.name); + } + } + + public static String getDefaultIndexName(AbstractType comparator, ByteBuffer columnName) + { + return comparator.getString(columnName).replaceAll("\\W", "") + "_idx"; + } + @Override public String toString() { Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/Cql.g URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/Cql.g?rev=1132405&r1=1132404&r2=1132405&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/Cql.g (original) +++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/Cql.g Sun Jun 5 13:41:30 2011 @@ -113,6 +113,7 @@ query returns [CQLStatement stmnt] | createKeyspaceStatement { $stmnt = new CQLStatement(StatementType.CREATE_KEYSPACE, $createKeyspaceStatement.expr); } | createColumnFamilyStatement { $stmnt = new CQLStatement(StatementType.CREATE_COLUMNFAMILY, $createColumnFamilyStatement.expr); } | createIndexStatement { $stmnt = new CQLStatement(StatementType.CREATE_INDEX, $createIndexStatement.expr); } + | dropIndexStatement { $stmnt = new CQLStatement(StatementType.DROP_INDEX, $dropIndexStatement.expr); } | dropKeyspaceStatement { $stmnt = new CQLStatement(StatementType.DROP_KEYSPACE, $dropKeyspaceStatement.ksp); } | dropColumnFamilyStatement { $stmnt = new CQLStatement(StatementType.DROP_COLUMNFAMILY, $dropColumnFamilyStatement.cfam); } | alterTableStatement { $stmnt = new CQLStatement(StatementType.ALTER_TABLE, $alterTableStatement.expr); } @@ -383,6 +384,15 @@ createIndexStatement returns [CreateInde : K_CREATE K_INDEX (idxName=IDENT)? K_ON cf=( IDENT | STRING_LITERAL | INTEGER ) '(' columnName=term ')' endStmnt { $expr = new CreateIndexStatement($idxName.text, $cf.text, columnName); } ; +/** + * DROP INDEX ON <CF>.<COLUMN_OR_INDEX_NAME> + * DROP INDEX <INDEX_NAME> + */ +dropIndexStatement returns [DropIndexStatement expr] + : + K_DROP K_INDEX index=( IDENT | STRING_LITERAL | INTEGER ) endStmnt + { $expr = new DropIndexStatement($index.text); } + ; /** DROP KEYSPACE <KSP>; */ dropKeyspaceStatement returns [String ksp] Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/QueryProcessor.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/QueryProcessor.java?rev=1132405&r1=1132404&r2=1132405&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/QueryProcessor.java (original) +++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/QueryProcessor.java Sun Jun 5 13:41:30 2011 @@ -47,7 +47,6 @@ import org.apache.cassandra.db.filter.Qu import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.MarshalException; import org.apache.cassandra.db.migration.*; -import org.apache.cassandra.db.migration.avro.CfDef; import org.apache.cassandra.dht.*; import org.apache.cassandra.dht.Token; import org.apache.cassandra.service.ClientState; @@ -641,7 +640,7 @@ public class QueryProcessor { KsDef ksd = new KsDef(create.getName(), create.getStrategyClass(), - Collections.<org.apache.cassandra.thrift.CfDef>emptyList()) + Collections.<CfDef>emptyList()) .setStrategy_options(create.getStrategyOptions()); ThriftValidation.validateKsDef(ksd); applyMigrationOnStage(new AddKeyspace(KSMetaData.fromThrift(ksd))); @@ -695,37 +694,58 @@ public class QueryProcessor createIdx.getColumnFamily())); if (oldCfm == null) throw new InvalidRequestException("No such column family: " + createIdx.getColumnFamily()); - + + boolean columnExists = false; ByteBuffer columnName = createIdx.getColumnName().getByteBuffer(); - ColumnDefinition columnDef = oldCfm.getColumn_metadata().get(columnName); - - // Meta-data for this column already exists - if (columnDef != null) + // mutating oldCfm directly would be bad, but mutating a Thrift copy is fine. This also + // sets us up to use validateCfDef to check for index name collisions. + CfDef cf_def = CFMetaData.convertToThrift(oldCfm); + for (ColumnDef cd : cf_def.column_metadata) { - // This column is already indexed, stop, drop, and roll. - if (columnDef.getIndexType() != null) - throw new InvalidRequestException("Index exists"); - // Add index attrs to the existing definition - columnDef.setIndexName(createIdx.getIndexName()); - columnDef.setIndexType(org.apache.cassandra.thrift.IndexType.KEYS); + if (cd.name.equals(columnName)) + { + if (cd.index_type != null) + throw new InvalidRequestException("Index already exists"); + logger.debug("Updating column {} definition for index {}", oldCfm.comparator.getString(columnName), createIdx.getIndexName()); + cd.setIndex_type(IndexType.KEYS); + cd.setIndex_name(createIdx.getIndexName()); + columnExists = true; + break; + } } - // No meta-data, create a new column definition from scratch. - else + if (!columnExists) + throw new InvalidRequestException("No column definition found for column " + oldCfm.comparator.getString(columnName)); + + CFMetaData.addDefaultIndexNames(cf_def); + ThriftValidation.validateCfDef(cf_def, oldCfm); + try { - columnDef = new ColumnDefinition(columnName, - DatabaseDescriptor.getValueValidator(keyspace, - createIdx.getColumnFamily(), - columnName), - org.apache.cassandra.thrift.IndexType.KEYS, - createIdx.getIndexName()); + applyMigrationOnStage(new UpdateColumnFamily(CFMetaData.convertToAvro(cf_def))); + } + catch (ConfigurationException e) + { + InvalidRequestException ex = new InvalidRequestException(e.toString()); + ex.initCause(e); + throw ex; + } + catch (IOException e) + { + InvalidRequestException ex = new InvalidRequestException(e.toString()); + ex.initCause(e); + throw ex; } - CfDef cfamilyDef = CFMetaData.convertToAvro(oldCfm); - cfamilyDef.column_metadata.add(columnDef.deflate()); - + result.type = CqlResultType.VOID; + return result; + + case DROP_INDEX: + DropIndexStatement dropIdx = (DropIndexStatement)statement.statement; + clientState.hasColumnFamilyListAccess(Permission.WRITE); + validateSchemaAgreement(); + try { - applyMigrationOnStage(new UpdateColumnFamily(cfamilyDef)); + applyMigrationOnStage(dropIdx.generateMutation(clientState.getKeyspace())); } catch (ConfigurationException e) { @@ -739,10 +759,10 @@ public class QueryProcessor ex.initCause(e); throw ex; } - + result.type = CqlResultType.VOID; return result; - + case DROP_KEYSPACE: String deleteKeyspace = (String)statement.statement; clientState.hasKeyspaceListAccess(Permission.WRITE); Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/StatementType.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/StatementType.java?rev=1132405&r1=1132404&r2=1132405&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/StatementType.java (original) +++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/StatementType.java Sun Jun 5 13:41:30 2011 @@ -24,7 +24,7 @@ import java.util.EnumSet; public enum StatementType { - SELECT, INSERT, UPDATE, BATCH, USE, TRUNCATE, DELETE, CREATE_KEYSPACE, CREATE_COLUMNFAMILY, CREATE_INDEX, + SELECT, INSERT, UPDATE, BATCH, USE, TRUNCATE, DELETE, CREATE_KEYSPACE, CREATE_COLUMNFAMILY, CREATE_INDEX, DROP_INDEX, DROP_KEYSPACE, DROP_COLUMNFAMILY, ALTER_TABLE; // Statement types that don't require a keyspace to be set. Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java?rev=1132405&r1=1132404&r2=1132405&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java (original) +++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java Sun Jun 5 13:41:30 2011 @@ -799,7 +799,8 @@ public class CassandraServer implements { logger.debug("add_column_family"); state().hasColumnFamilyListAccess(Permission.WRITE); - ThriftValidation.validateCfDef(cf_def); + CFMetaData.addDefaultIndexNames(cf_def); + ThriftValidation.validateCfDef(cf_def, null); validateSchemaAgreement(); try @@ -866,10 +867,11 @@ public class CassandraServer implements try { Collection<CFMetaData> cfDefs = new ArrayList<CFMetaData>(ks_def.cf_defs.size()); - for (CfDef cfDef : ks_def.cf_defs) + for (CfDef cf_def : ks_def.cf_defs) { - ThriftValidation.validateCfDef(cfDef); - cfDefs.add(CFMetaData.fromThrift(cfDef)); + CFMetaData.addDefaultIndexNames(cf_def); + ThriftValidation.validateCfDef(cf_def, null); + cfDefs.add(CFMetaData.fromThrift(cf_def)); } ThriftValidation.validateKsDef(ks_def); @@ -953,11 +955,10 @@ public class CassandraServer implements { logger.debug("update_column_family"); state().hasColumnFamilyListAccess(Permission.WRITE); - ThriftValidation.validateCfDef(cf_def); if (cf_def.keyspace == null || cf_def.name == null) throw new InvalidRequestException("Keyspace and CF name must be set."); CFMetaData oldCfm = DatabaseDescriptor.getCFMetaData(CFMetaData.getId(cf_def.keyspace, cf_def.name)); - if (oldCfm == null) + if (oldCfm == null) throw new InvalidRequestException("Could not find column family definition to modify."); validateSchemaAgreement(); Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java?rev=1132405&r1=1132404&r2=1132405&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java (original) +++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java Sun Jun 5 13:41:30 2011 @@ -29,6 +29,7 @@ import org.apache.cassandra.db.marshal.A import org.apache.cassandra.db.marshal.AsciiType; import org.apache.cassandra.db.marshal.MarshalException; import org.apache.cassandra.db.marshal.TypeParser; +import org.apache.cassandra.db.migration.Migration; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.RandomPartitioner; import org.apache.cassandra.dht.Token; @@ -513,7 +514,7 @@ public class ThriftValidation throw new InvalidRequestException("No indexed columns present in index clause with operator EQ"); } - public static void validateCfDef(CfDef cf_def) throws InvalidRequestException + public static void validateCfDef(CfDef cf_def, CFMetaData old) throws InvalidRequestException { try { @@ -533,6 +534,22 @@ public class ThriftValidation } } + if (cf_def.key_alias != null) + { + if (!cf_def.key_alias.hasRemaining()) + throw new InvalidRequestException("key_alias may not be empty"); + try + { + // it's hard to use a key in a select statement if we can't type it. + // for now let's keep it simple and require ascii. + AsciiType.instance.validate(cf_def.key_alias); + } + catch (MarshalException e) + { + throw new InvalidRequestException("Key aliases must be ascii"); + } + } + ColumnFamilyType cfType = ColumnFamilyType.create(cf_def.column_type); if (cfType == null) throw new InvalidRequestException("invalid column type " + cf_def.column_type); @@ -550,16 +567,17 @@ public class ThriftValidation ? TypeParser.parse(cf_def.comparator_type) : TypeParser.parse(cf_def.subcomparator_type); + // initialize a set of names NOT in the CF under consideration Set<String> indexNames = new HashSet<String>(); - for (ColumnDef c : cf_def.column_metadata) + for (ColumnFamilyStore cfs : ColumnFamilyStore.all()) { - // Ensure that given idx_names and auto_generated idx_names cannot collide - CFMetaData cfm = CFMetaData.fromThrift(cf_def); - String idxName = cfm.indexColumnFamilyName(ColumnDefinition.fromColumnDef(c)); - if (indexNames.contains(idxName)) - throw new InvalidRequestException("Duplicate index names " + idxName); - indexNames.add(idxName); + if (!cfs.getColumnFamilyName().equals(cf_def.name)) + for (ColumnDefinition cd : cfs.metadata.getColumn_metadata().values()) + indexNames.add(cd.getIndexName()); + } + for (ColumnDef c : cf_def.column_metadata) + { TypeParser.parse(c.validation_class); try @@ -572,11 +590,31 @@ public class ThriftValidation ByteBufferUtil.bytesToHex(c.name), cf_def.comparator_type)); } - if ((c.index_name != null) && (c.index_type == null)) - throw new ConfigurationException("index_name cannot be set without index_type"); - - if (cfType == ColumnFamilyType.Super && c.index_type != null) - throw new InvalidRequestException("Secondary indexes are not supported on supercolumns"); + if (c.index_type == null) + { + if (c.index_name != null) + throw new ConfigurationException("index_name cannot be set without index_type"); + } + else + { + if (cfType == ColumnFamilyType.Super) + throw new InvalidRequestException("Secondary indexes are not supported on supercolumns"); + assert c.index_name != null; // should have a default set by now if none was provided + if (!Migration.isLegalName(c.index_name)) + throw new InvalidRequestException("Illegal index name " + c.index_name); + // check index names against this CF _and_ globally + if (indexNames.contains(c.index_name)) + throw new InvalidRequestException("Duplicate index name " + c.index_name); + indexNames.add(c.index_name); + + ColumnDefinition oldCd = old == null ? null : old.getColumnDefinition(c.name); + if (oldCd != null && oldCd.getIndexType() != null) + { + assert oldCd.getIndexName() != null; + if (!oldCd.getIndexName().equals(c.index_name)) + throw new InvalidRequestException("Cannot modify index name"); + } + } } validateMinMaxCompactionThresholds(cf_def); validateMemtableSettings(cf_def); Modified: cassandra/branches/cassandra-0.8/test/system/test_cql.py URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/system/test_cql.py?rev=1132405&r1=1132404&r2=1132405&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/test/system/test_cql.py (original) +++ cassandra/branches/cassandra-0.8/test/system/test_cql.py Sun Jun 5 13:41:30 2011 @@ -530,7 +530,7 @@ class TestCql(ThriftTester): "creating column indexes" cursor = init() cursor.execute("USE Keyspace1") - cursor.execute("CREATE COLUMNFAMILY CreateIndex1 (KEY text PRIMARY KEY)") + cursor.execute("CREATE COLUMNFAMILY CreateIndex1 (KEY text PRIMARY KEY, items text, stuff int)") cursor.execute("CREATE INDEX namedIndex ON CreateIndex1 (items)") cursor.execute("CREATE INDEX ON CreateIndex1 (stuff)") @@ -539,10 +539,9 @@ class TestCql(ThriftTester): cfam = [i for i in ksdef.cf_defs if i.name == "CreateIndex1"][0] items = [i for i in cfam.column_metadata if i.name == "items"][0] stuff = [i for i in cfam.column_metadata if i.name == "stuff"][0] - assert items.index_name == "namedIndex", "missing index (or name)" + assert items.index_name == "namedIndex", items.index_name assert items.index_type == 0, "missing index" - assert not stuff.index_name, \ - "index_name should be unset, not %s" % stuff.index_name + assert stuff.index_name != None, "index_name should be set" assert stuff.index_type == 0, "missing index" # already indexed @@ -550,6 +549,34 @@ class TestCql(ThriftTester): cursor.execute, "CREATE INDEX ON CreateIndex1 (stuff)") + def test_drop_indexes(self): + "droping indexes on columns" + cursor = init() + cursor.execute("""CREATE KEYSPACE DropIndexTests WITH strategy_options:replication_factor = '1' + AND strategy_class = 'SimpleStrategy';""") + cursor.execute("USE DropIndexTests") + cursor.execute("CREATE COLUMNFAMILY IndexedCF (KEY text PRIMARY KEY, n text)") + cursor.execute("CREATE INDEX namedIndex ON IndexedCF (n)") + + ksdef = thrift_client.describe_keyspace("DropIndexTests") + columns = ksdef.cf_defs[0].column_metadata + + assert columns[0].index_name == "namedIndex" + assert columns[0].index_type == 0 + + # testing "DROP INDEX <INDEX_NAME>" + cursor.execute("DROP INDEX namedIndex") + + ksdef = thrift_client.describe_keyspace("DropIndexTests") + columns = ksdef.cf_defs[0].column_metadata + + assert columns[0].index_type == None + assert columns[0].index_name == None + + assert_raises(cql.ProgrammingError, + cursor.execute, + "DROP INDEX undefIndex") + def test_time_uuid(self): "store and retrieve time-based (type 1) uuids" cursor = init() Modified: cassandra/branches/cassandra-0.8/test/system/test_thrift_server.py URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/system/test_thrift_server.py?rev=1132405&r1=1132404&r2=1132405&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/test/system/test_thrift_server.py (original) +++ cassandra/branches/cassandra-0.8/test/system/test_thrift_server.py Sun Jun 5 13:41:30 2011 @@ -1421,7 +1421,7 @@ class TestMutations(ThriftTester): client.system_update_column_family(modified_cf) # Add a second indexed CF ... - birthdate_coldef = ColumnDef('birthdate', 'BytesType', IndexType.KEYS, 'birthdate_index') + birthdate_coldef = ColumnDef('birthdate', 'BytesType', IndexType.KEYS, 'birthdate2_index') age_coldef = ColumnDef('age', 'BytesType', IndexType.KEYS, 'age_index') cfdef = CfDef('Keyspace1', 'BlankCF2', column_metadata=[birthdate_coldef, age_coldef]) client.system_add_column_family(cfdef) Modified: cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/SchemaLoader.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/SchemaLoader.java?rev=1132405&r1=1132404&r2=1132405&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/SchemaLoader.java (original) +++ cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/SchemaLoader.java Sun Jun 5 13:41:30 2011 @@ -21,6 +21,7 @@ package org.apache.cassandra; import java.nio.ByteBuffer; import java.util.*; +import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.commons.lang.NotImplementedException; import com.google.common.base.Charsets; @@ -249,7 +250,7 @@ public class SchemaLoader {{ ByteBuffer cName = ByteBuffer.wrap("birthdate".getBytes(Charsets.UTF_8)); IndexType keys = withIdxType ? IndexType.KEYS : null; - put(cName, new ColumnDefinition(cName, LongType.instance, keys, null)); + put(cName, new ColumnDefinition(cName, LongType.instance, keys, ByteBufferUtil.bytesToHex(cName))); }}); } private static CFMetaData jdbcCFMD(String ksName, String cfName, AbstractType comp)