You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2011/06/13 21:40:22 UTC

svn commit: r1135244 - in /cassandra/trunk: ./ contrib/ doc/cql/ examples/bmt/ interface/thrift/gen-java/org/apache/cassandra/thrift/ src/java/org/apache/cassandra/config/ src/java/org/apache/cassandra/cql/ src/java/org/apache/cassandra/db/ src/java/or...

Author: jbellis
Date: Mon Jun 13 19:40:21 2011
New Revision: 1135244

URL: http://svn.apache.org/viewvc?rev=1135244&view=rev
Log:
merge from 0.8

Added:
    cassandra/trunk/examples/bmt/CassandraBulkLoader.java
      - copied unchanged from r1135241, cassandra/branches/cassandra-0.8/examples/bmt/CassandraBulkLoader.java
    cassandra/trunk/examples/bmt/README.txt
      - copied unchanged from r1135241, cassandra/branches/cassandra-0.8/examples/bmt/README.txt
    cassandra/trunk/src/java/org/apache/cassandra/db/DefinitionsUpdateVerbHandler.java
      - copied unchanged from r1135241, cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/DefinitionsUpdateVerbHandler.java
Removed:
    cassandra/trunk/src/java/org/apache/cassandra/db/DefinitionsAnnounceVerbHandler.java
    cassandra/trunk/src/java/org/apache/cassandra/db/DefinitionsUpdateResponseVerbHandler.java
Modified:
    cassandra/trunk/   (props changed)
    cassandra/trunk/CHANGES.txt
    cassandra/trunk/contrib/   (props changed)
    cassandra/trunk/doc/cql/CQL.textile
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java   (props changed)
    cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/AbstractModification.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g
    cassandra/trunk/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/DeleteStatement.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/UpdateStatement.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/WhereClause.java
    cassandra/trunk/src/java/org/apache/cassandra/db/DataTracker.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddKeyspace.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropKeyspace.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/Migration.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameColumnFamily.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameKeyspace.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/UpdateColumnFamily.java
    cassandra/trunk/src/java/org/apache/cassandra/service/MigrationManager.java
    cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
    cassandra/trunk/test/system/test_cql.py

Propchange: cassandra/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jun 13 19:40:21 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1131291
 /cassandra/branches/cassandra-0.7:1026516-1133874
 /cassandra/branches/cassandra-0.7.0:1053690-1055654
-/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1134430
+/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1135241
 /cassandra/branches/cassandra-0.8.0:1125021-1130369
 /cassandra/branches/cassandra-0.8.1:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689

Modified: cassandra/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Mon Jun 13 19:40:21 2011
@@ -9,6 +9,8 @@
    - ALTER COLUMNFAMILY (CASSANDRA-1709)
    - DROP INDEX (CASSANDRA-2617)
    - add SCHEMA/TABLE as aliases for KS/CF (CASSANDRA-2743)
+   - server handles wait-for-schema-agreement (CASSANDRA-2756)
+   - key alias support (CASSANDRA-2480)
  * add support for comparator parameters and a generic ReverseType
    (CASSANDRA-2355)
  * add CompositeType and DynamicCompositeType (CASSANDRA-2231)
@@ -49,6 +51,7 @@
  * fix removing columns and subcolumns that are supressed by a row or
    supercolumn tombstone during replica resolution (CASSANDRA-2590)
  * support sstable2json against snapshot sstables (CASSANDRA-2386)
+ * remove active-pull schema requests (CASSANDRA-2715)
 
 
 0.8.0-final

Propchange: cassandra/trunk/contrib/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jun 13 19:40:21 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/contrib:922689-1052356,1052358-1053452,1053454,1053456-1068009
 /cassandra/branches/cassandra-0.7/contrib:1026516-1133874
 /cassandra/branches/cassandra-0.7.0/contrib:1053690-1055654
-/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1134430
+/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1135241
 /cassandra/branches/cassandra-0.8.0/contrib:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/contrib:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/contrib:1051699-1053689

Modified: cassandra/trunk/doc/cql/CQL.textile
URL: http://svn.apache.org/viewvc/cassandra/trunk/doc/cql/CQL.textile?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/doc/cql/CQL.textile (original)
+++ cassandra/trunk/doc/cql/CQL.textile Mon Jun 13 19:40:21 2011
@@ -54,11 +54,11 @@ Following the column family clause is an
 h3. Filtering rows
 
 bc. 
-SELECT ... WHERE KEY = keyname AND name1 = value1
-SELECT ... WHERE KEY >= startkey and KEY =< endkey AND name1 = value1
-SELECT ... WHERE KEY IN ('<key>', '<key>', '<key>', ...)
+SELECT ... WHERE <KEY> = keyname AND name1 = value1
+SELECT ... WHERE <KEY> >= startkey and <KEY> =< endkey AND name1 = value1
+SELECT ... WHERE <KEY> IN ('<key>', '<key>', '<key>', ...)
 
-The WHERE clause provides for filtering the rows that appear in results.  The clause can filter on a key name, or range of keys, and in the case of indexed columns, on column values.  Key filters are specified using the @KEY@ keyword, a relational operator, (one of @=@, @>@, @>=@, @<@, and @<=@), and a term value.  When terms appear on both sides of a relational operator it is assumed the filter applies to an indexed column. With column index filters, the term on the left of the operator is the name, the term on the right is the value to filter __on__.
+The WHERE clause provides for filtering the rows that appear in results.  The clause can filter on a key name, or range of keys, and in the case of indexed columns, on column values.  Key filters are specified using the @KEY@ keyword or key alias name, a relational operator, (one of @=@, @>@, @>=@, @<@, and @<=@), and a term value.  When terms appear on both sides of a relational operator it is assumed the filter applies to an indexed column. With column index filters, the term on the left of the operator is the name, the term on the right is the value to filter __on__.
 
 __Note: The greater-than and less-than operators (@>@ and @<@) result in key ranges that are inclusive of the terms. There is no supported notion of "strictly" greater-than or less-than; these operators are merely supported as aliases to @>=@ and @<=@.__  
 
@@ -85,7 +85,7 @@ h2. INSERT
 _Synopsis:_
 
 bc.
-INSERT INTO <COLUMN FAMILY> (KEY, <col>, <col>, ...) VALUES (<key>, <val>, <val>, ...) [USING CONSISTENCY <LEVEL> [AND TIMESTAMP <timestamp>] [AND TTL <timeToLive>]];
+INSERT INTO <COLUMN FAMILY> (<KEY>, <col>, <col>, ...) VALUES (<key>, <val>, <val>, ...) [USING CONSISTENCY <LEVEL> [AND TIMESTAMP <timestamp>] [AND TTL <timeToLive>]];
 
 An @INSERT@ is used to write one or more columns to a record in a Cassandra column family. No results are returned. 
 
@@ -97,9 +97,9 @@ _Synopsis:_
 
 bc. 
 UPDATE <COLUMN FAMILY> [USING <CONSISTENCY> [AND TIMESTAMP <timestamp>] [AND TTL <timeToLive>]]
-        SET name1 = value1, name2 = value2 WHERE KEY = keyname;
+        SET name1 = value1, name2 = value2 WHERE <KEY> = keyname;
         
-An @UPDATE@ is used to write one or more columns to a record in a Cassandra column family. No results are returned.
+An @UPDATE@ is used to write one or more columns to a record in a Cassandra column family. No results are returned. Key can be given using @KEY@ keyword or by alias set per ColumnFamily.
 
 h3. Column Family
 
@@ -132,20 +132,20 @@ UPDATE ... [USING TTL <timeToLive>] ...
 h3. Specifying Columns and Row
 
 bc. 
-UPDATE ... SET name1 = value1, name2 = value2 WHERE KEY = keyname;
-UPDATE ... SET name1 = value1, name2 = value2 WHERE KEY IN ('<key>', '<key>', ...)
+UPDATE ... SET name1 = value1, name2 = value2 WHERE <KEY> = keyname;
+UPDATE ... SET name1 = value1, name2 = value2 WHERE <KEY> IN ('<key>', '<key>', ...)
 
-Rows are created or updated by supplying column names and values in term assignment format. Multiple columns can be set by separating the name/value pairs using commas.  Each update statement requires exactly one key to be specified using a WHERE clause and the @KEY@ keyword.
+Rows are created or updated by supplying column names and values in term assignment format. Multiple columns can be set by separating the name/value pairs using commas.  Each update statement requires exactly one key to be specified using a WHERE clause and the @KEY@ keyword or key alias.
 
 h2. DELETE
 
 _Synopsis:_
 
 bc. 
-DELETE [COLUMNS] FROM <COLUMN FAMILY> [USING <CONSISTENCY>] WHERE KEY = keyname1
-DELETE [COLUMNS] FROM <COLUMN FAMILY> [USING <CONSISTENCY>] WHERE KEY IN (keyname1, keyname2);
+DELETE [COLUMNS] FROM <COLUMN FAMILY> [USING <CONSISTENCY>] WHERE <KEY> = keyname1
+DELETE [COLUMNS] FROM <COLUMN FAMILY> [USING <CONSISTENCY>] WHERE <KEY> IN (keyname1, keyname2);
 
-A @DELETE@ is used to perform the removal of one or more columns from one or more rows.
+A @DELETE@ is used to perform the removal of one or more columns from one or more rows. Key can be given using @KEY@ keyword or by alias set per ColumnFamily.
 
 h3. Specifying Columns
 
@@ -171,10 +171,10 @@ Following the column family identifier i
 h3(#deleterows). Specifying Rows
 
 bc. 
-DELETE ... WHERE KEY = keyname1
-DELETE ... WHERE KEY IN (keyname1, keyname2)
+DELETE ... WHERE <KEY> = keyname1
+DELETE ... WHERE <KEY> IN (keyname1, keyname2)
 
-The @WHERE@ clause is used to determine which row(s) a @DELETE@ applies to.  The first form allows the specification of a single keyname using the @KEY@ keyword and the @=@ operator.  The second form allows a list of keyname terms to be specified using the @IN@ notation and a parenthesized list of comma-delimited keyname terms.
+The @WHERE@ clause is used to determine which row(s) a @DELETE@ applies to. The first form allows the specification of a single keyname using the @KEY@ keyword (or by key alias) and the @=@ operator.  The second form allows a list of keyname terms to be specified using the @IN@ notation and a parenthesized list of comma-delimited keyname terms.
 
 h2. BATCH
 
@@ -229,8 +229,8 @@ h2. CREATE COLUMNFAMILY
 _Synopsis:_
 
 bc. 
-CREATE COLUMNFAMILY <COLUMN FAMILY> (KEY <type> PRIMARY KEY [, name1 type, name2 type, ...]);
-CREATE COLUMNFAMILY <COLUMN FAMILY> (KEY <type> PRIMARY KEY [, name1 type, name2 type, ...])
+CREATE COLUMNFAMILY <COLUMN FAMILY> (<KEY> <type> PRIMARY KEY [, name1 type, name2 type, ...]);
+CREATE COLUMNFAMILY <COLUMN FAMILY> (<KEY> <type> PRIMARY KEY [, name1 type, name2 type, ...])
     [WITH keyword1 = arg1 [AND keyword2 = arg2 [AND ...]]];
 
 @CREATE COLUMNFAMILY@ statements create new column family namespaces under the current keyspace. Valid column family names are strings of alphanumeric characters and underscores, which begin with a letter.
@@ -238,14 +238,14 @@ CREATE COLUMNFAMILY <COLUMN FAMILY> (KEY
 h3(#keytypes). Specifying Key Type
 
 bc. 
-CREATE ... (KEY <type> PRIMARY KEY) ...
+CREATE ... (<KEY> <type> PRIMARY KEY) ...
 
-When creating a new column family, you must specify key type.  The list of possible key types is identical to column comparators/validators, (see "Specifying Column Type":columntypes).  It's important to note that the key type must be compatible with the partitioner in use, for example @OrderPreservingPartitioner@ and @CollatingOrderPreservingPartitioner@ both require UTF-8 keys.
+When creating a new column family, you must specify key type.  The list of possible key types is identical to column comparators/validators, (see "Specifying Column Type":columntypes).  It's important to note that the key type must be compatible with the partitioner in use, for example @OrderPreservingPartitioner@ and @CollatingOrderPreservingPartitioner@ both require UTF-8 keys. If you use name instead of @KEY@ keyword, name alias will be set automatically.
 
 h3(#columntypes). Specifying Column Type (optional)
 
 bc. 
-CREATE ... (KEY <type> PRIMARY KEY, name1 type, name2 type) ...
+CREATE ... (<KEY> <type> PRIMARY KEY, name1 type, name2 type) ...
 
 It is possible to assign columns a type during column family creation.  Columns configured with a type are validated accordingly when a write occurs. Column types are specified as a parenthesized, comma-separated list of column term and type pairs.  The list of recognized types are:
 

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jun 13 19:40:21 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
 /cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1133874
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1134430
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1135241
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jun 13 19:40:21 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
 /cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1133874
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1134430
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1135241
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jun 13 19:40:21 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
 /cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1133874
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1134430
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1135241
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jun 13 19:40:21 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
 /cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1133874
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1134430
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1135241
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jun 13 19:40:21 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
 /cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1133874
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1134430
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1135241
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1051699-1053689

Modified: cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java Mon Jun 13 19:40:21 2011
@@ -74,7 +74,8 @@ public final class CFMetaData
     public final static double DEFAULT_MEMTABLE_OPERATIONS_IN_MILLIONS = sizeMemtableOperations(DEFAULT_MEMTABLE_THROUGHPUT_IN_MB);
     public final static double DEFAULT_MERGE_SHARDS_CHANCE = 0.1;
     public final static String DEFAULT_ROW_CACHE_PROVIDER = "org.apache.cassandra.cache.ConcurrentLinkedHashCacheProvider";
-    public static final String DEFAULT_COMPACTION_STRATEGY_CLASS = "org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy";
+    public final static String DEFAULT_COMPACTION_STRATEGY_CLASS = "org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy";
+    public final static ByteBuffer DEFAULT_KEY_NAME = ByteBufferUtil.bytes("KEY");
 
     private static final int MIN_CF_ID = 1000;
     private static final AtomicInteger idGen = new AtomicInteger(MIN_CF_ID);
@@ -87,7 +88,6 @@ public final class CFMetaData
     public static final CFMetaData SchemaCf = newSystemMetadata(Migration.SCHEMA_CF, 3, "current state of the schema", UTF8Type.instance, null, DEFAULT_SYSTEM_MEMTABLE_THROUGHPUT_IN_MB);
     public static final CFMetaData IndexCf = newSystemMetadata(SystemTable.INDEX_CF, 5, "indexes that have been completed", UTF8Type.instance, null, DEFAULT_SYSTEM_MEMTABLE_THROUGHPUT_IN_MB);
     public static final CFMetaData NodeIdCf = newSystemMetadata(SystemTable.NODE_ID_CF, 6, "nodeId and their metadata", TimeUUIDType.instance, null, DEFAULT_SYSTEM_MEMTABLE_THROUGHPUT_IN_MB);
-    private static final ByteBuffer DEFAULT_KEY_NAME = ByteBufferUtil.bytes("KEY");
 
     /**
      * @return A calculated memtable throughput size for this machine.

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/AbstractModification.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/AbstractModification.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/AbstractModification.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/AbstractModification.java Mon Jun 13 19:40:21 2011
@@ -20,14 +20,13 @@
  */
 package org.apache.cassandra.cql;
 
+import java.util.List;
+
 import org.apache.cassandra.db.IMutation;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.thrift.ConsistencyLevel;
 import org.apache.cassandra.thrift.InvalidRequestException;
 
-import java.nio.ByteBuffer;
-import java.util.List;
-
 public abstract class AbstractModification
 {
     public static final ConsistencyLevel defaultConsistency = ConsistencyLevel.ONE;
@@ -36,18 +35,20 @@ public abstract class AbstractModificati
     protected final ConsistencyLevel cLevel;
     protected final Long timestamp;
     protected final int timeToLive;
+    protected final String keyName;
 
-    public AbstractModification(String columnFamily, Attributes attrs)
+    public AbstractModification(String columnFamily, String keyAlias, Attributes attrs)
     {
-        this(columnFamily, attrs.getConsistencyLevel(), attrs.getTimestamp(), attrs.getTimeToLive());
+        this(columnFamily, keyAlias, attrs.getConsistencyLevel(), attrs.getTimestamp(), attrs.getTimeToLive());
     }
 
-    public AbstractModification(String columnFamily, ConsistencyLevel cLevel, Long timestamp, int timeToLive)
+    public AbstractModification(String columnFamily, String keyAlias, ConsistencyLevel cLevel, Long timestamp, int timeToLive)
     {
         this.columnFamily = columnFamily;
         this.cLevel = cLevel;
         this.timestamp = timestamp;
         this.timeToLive = timeToLive;
+        this.keyName = keyAlias.toUpperCase();
     }
 
     public String getColumnFamily()

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g Mon Jun 13 19:40:21 2011
@@ -185,8 +185,9 @@ whereClause returns [WhereClause clause]
     }
     : first=relation { $clause = new WhereClause(first); } 
           (K_AND next=relation { $clause.and(next); })*
-      | K_KEY K_IN '(' f1=term { inClause.andKeyEquals(f1); }
-                      (',' fN=term { inClause.andKeyEquals(fN); } )* ')'
+      | key_alias=term { inClause.setKeyAlias(key_alias.getText()); }
+           K_IN '(' f1=term { inClause.andKeyEquals(f1); }
+                  (',' fN=term { inClause.andKeyEquals(fN); } )* ')'
         { $clause = inClause; }
     ;
 
@@ -212,12 +213,12 @@ insertStatement returns [UpdateStatement
           List<Term> columnValues = new ArrayList<Term>();
       }
       K_INSERT K_INTO columnFamily=( IDENT | STRING_LITERAL | INTEGER )
-          '(' K_KEY    ( ',' column_name=term  { columnNames.add($column_name.item); } )+ ')'
+          '(' key_alias=term ( ',' column_name=term  { columnNames.add($column_name.item); } )+ ')'
         K_VALUES
           '(' key=term ( ',' column_value=term { columnValues.add($column_value.item); })+ ')'
         ( usingClause[attrs] )?
       {
-          return new UpdateStatement($columnFamily.text, columnNames, columnValues, Collections.singletonList(key), attrs);
+          return new UpdateStatement($columnFamily.text, key_alias.getText(), columnNames, columnValues, Collections.singletonList(key), attrs);
       }
     ;
 
@@ -298,11 +299,11 @@ updateStatement returns [UpdateStatement
       K_UPDATE columnFamily=( IDENT | STRING_LITERAL | INTEGER )
           ( usingClause[attrs] )?
           K_SET termPairWithOperation[columns] (',' termPairWithOperation[columns])*
-          K_WHERE ( K_KEY '=' key=term { keyList = Collections.singletonList(key); }
-                    |
-                    K_KEY K_IN '(' keys=termList { keyList = $keys.items; } ')' )
+          K_WHERE ( key_alias=term ('=' key=term { keyList = Collections.singletonList(key); }
+                                    |
+                                    K_IN '(' keys=termList { keyList = $keys.items; } ')' ))
       {
-          return new UpdateStatement($columnFamily.text, columns, keyList, attrs);
+          return new UpdateStatement($columnFamily.text, key_alias.getText(), columns, keyList, attrs);
       }
     ;
 
@@ -326,11 +327,11 @@ deleteStatement returns [DeleteStatement
           ( cols=termList { columnsList = $cols.items; })?
           K_FROM columnFamily=( IDENT | STRING_LITERAL | INTEGER )
           ( K_USING K_CONSISTENCY K_LEVEL { cLevel = ConsistencyLevel.valueOf($K_LEVEL.text); } )?
-          K_WHERE ( K_KEY '=' key=term           { keyList = Collections.singletonList(key); }
-                  | K_KEY K_IN '(' keys=termList { keyList = $keys.items; } ')'
+          K_WHERE ( key_alias=term ('=' key=term           { keyList = Collections.singletonList(key); }
+                                   | K_IN '(' keys=termList { keyList = $keys.items; } ')')
                   )?
       {
-          return new DeleteStatement(columnsList, $columnFamily.text, cLevel, keyList);
+          return new DeleteStatement(columnsList, $columnFamily.text, key_alias.getText(), cLevel, keyList);
       }
     ;
 
@@ -366,7 +367,7 @@ createColumnFamilyStatement returns [Cre
 
 createCfamColumns[CreateColumnFamilyStatement expr]
     : n=term v=createCfamColumnValidator { $expr.addColumn(n, $v.validator); }
-    | K_KEY v=createCfamColumnValidator K_PRIMARY K_KEY { $expr.setKeyType($v.validator); }
+    | k=term v=createCfamColumnValidator K_PRIMARY K_KEY { $expr.setKeyAlias(k.getText()); $expr.setKeyType($v.validator); }
     ;
 
 createCfamColumnValidator returns [String validator]
@@ -451,9 +452,8 @@ termPairWithOperation[Map<Term, Operatio
 
 // Note: ranges are inclusive so >= and >, and < and <= all have the same semantics.  
 relation returns [Relation rel]
-    : { Term entity = new Term("KEY", STRING_LITERAL); }
-      (name=term { entity = $name.item; } ) type=('=' | '<' | '<=' | '>=' | '>') t=term
-      { return new Relation(entity, $type.text, $t.item); }
+    : name=term type=('=' | '<' | '<=' | '>=' | '>') t=term
+      { return new Relation($name.item, $type.text, $t.item); }
     ;
 
 // TRUNCATE <CF>;

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java Mon Jun 13 19:40:21 2011
@@ -35,6 +35,7 @@ import org.apache.cassandra.db.ColumnFam
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.TypeParser;
 import org.apache.cassandra.thrift.InvalidRequestException;
+import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
 /** A <code>CREATE COLUMNFAMILY</code> parsed from a CQL query statement. */
@@ -93,7 +94,8 @@ public class CreateColumnFamilyStatement
     private final Map<Term, String> columns = new HashMap<Term, String>();
     private final Map<String, String> properties = new HashMap<String, String>();
     private List<String> keyValidator = new ArrayList<String>();
-    
+    private ByteBuffer keyAlias = null;
+
     public CreateColumnFamilyStatement(String name)
     {
         this.name = name;
@@ -174,7 +176,14 @@ public class CreateColumnFamilyStatement
     {
         return keyValidator.get(0);
     }
-    
+
+    public void setKeyAlias(String alias)
+    {
+        // if we got KEY in input we don't need to set an alias
+        if (!alias.toUpperCase().equals("KEY"))
+            keyAlias = ByteBufferUtil.bytes(alias);
+    }
+
     /** Map a keyword to the corresponding value */
     public void addProperty(String name, String value)
     {
@@ -261,7 +270,8 @@ public class CreateColumnFamilyStatement
                    .mergeShardsChance(0.0)
                    .columnMetadata(getColumns(comparator))
                    .keyValidator(TypeParser.parse(comparators.get(getKeyType())))
-                   .rowCacheProvider(FBUtilities.newCacheProvider(getPropertyString(KW_ROW_CACHE_PROVIDER, CFMetaData.DEFAULT_ROW_CACHE_PROVIDER)));
+                   .rowCacheProvider(FBUtilities.newCacheProvider(getPropertyString(KW_ROW_CACHE_PROVIDER, CFMetaData.DEFAULT_ROW_CACHE_PROVIDER)))
+                   .keyAlias(keyAlias);
         }
         catch (ConfigurationException e)
         {

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/DeleteStatement.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/DeleteStatement.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/DeleteStatement.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/DeleteStatement.java Mon Jun 13 19:40:21 2011
@@ -47,9 +47,9 @@ public class DeleteStatement extends Abs
     private List<Term> columns;
     private List<Term> keys;
     
-    public DeleteStatement(List<Term> columns, String columnFamily, ConsistencyLevel cLevel, List<Term> keys)
+    public DeleteStatement(List<Term> columns, String columnFamily, String keyName, ConsistencyLevel cLevel, List<Term> keys)
     {
-        super(columnFamily, cLevel, null, 0);
+        super(columnFamily, keyName, cLevel, null, 0);
 
         this.columns = columns;
         this.keys = keys;
@@ -102,6 +102,7 @@ public class DeleteStatement extends Abs
     public void mutationForKey(RowMutation mutation, String keyspace, Long timestamp) throws InvalidRequestException
     {
         CFMetaData metadata = validateColumnFamily(keyspace, columnFamily);
+        QueryProcessor.validateKeyAlias(metadata, keyName);
 
         AbstractType comparator = metadata.getComparatorFor(null);
 

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java Mon Jun 13 19:40:21 2011
@@ -63,6 +63,10 @@ public class QueryProcessor
 {
     private static final Logger logger = LoggerFactory.getLogger(QueryProcessor.class);
 
+    private static final long timeLimitForSchemaAgreement = 10 * 1000;
+
+    public static final String DEFAULT_KEY_NAME = bufferToString(CFMetaData.DEFAULT_KEY_NAME);
+
     private static List<org.apache.cassandra.db.Row> getSlice(String keyspace, SelectStatement select)
     throws InvalidRequestException, TimedOutException, UnavailableException
     {
@@ -343,9 +347,9 @@ public class QueryProcessor
             throw new InvalidRequestException("No indexed columns present in by-columns clause with \"equals\" operator");
         }
     }
-    
+
     // Copypasta from o.a.c.thrift.CassandraDaemon
-    private static void applyMigrationOnStage(final Migration m) throws InvalidRequestException
+    private static void applyMigrationOnStage(final Migration m) throws SchemaDisagreementException, InvalidRequestException
     {
         Future<?> f = StageManager.getStage(Stage.MIGRATION).submit(new Callable<Object>()
         {
@@ -380,6 +384,8 @@ public class QueryProcessor
                 throw ex;
             }
         }
+
+        validateSchemaIsSettled();
     }
     
     public static void validateKey(ByteBuffer key) throws InvalidRequestException
@@ -397,6 +403,14 @@ public class QueryProcessor
         }
     }
 
+    public static void validateKeyAlias(CFMetaData cfm, String key) throws InvalidRequestException
+    {
+        assert key.toUpperCase().equals(key); // should always be uppercased by caller
+        String realKeyAlias = bufferToString(cfm.getKeyName()).toUpperCase();
+        if (!realKeyAlias.equals(key))
+            throw new InvalidRequestException(String.format("Expected key '%s' to be present in WHERE clause for '%s'", key, cfm.cfName));
+    }
+
     private static void validateColumnNames(Iterable<ByteBuffer> columns)
     throws InvalidRequestException
     {
@@ -463,13 +477,17 @@ public class QueryProcessor
     // Copypasta from CassandraServer (where it is private).
     private static void validateSchemaAgreement() throws SchemaDisagreementException
     {
-        // unreachable hosts don't count towards disagreement
-        Map<String, List<String>> versions = Maps.filterKeys(StorageProxy.describeSchemaVersions(),
-                                                             Predicates.not(Predicates.equalTo(StorageProxy.UNREACHABLE)));
-        if (versions.size() > 1)
+       if (describeSchemaVersions().size() > 1)
             throw new SchemaDisagreementException();
     }
 
+    private static Map<String, List<String>> describeSchemaVersions()
+    {
+        // unreachable hosts don't count towards disagreement
+        return Maps.filterKeys(StorageProxy.describeSchemaVersions(),
+                               Predicates.not(Predicates.equalTo(StorageProxy.UNREACHABLE)));
+    }
+
     public static CqlResult process(String queryString, ClientState clientState)
     throws RecognitionException, UnavailableException, InvalidRequestException, TimedOutException, SchemaDisagreementException
     {
@@ -492,8 +510,15 @@ public class QueryProcessor
                 SelectStatement select = (SelectStatement)statement.statement;
                 clientState.hasColumnFamilyAccess(select.getColumnFamily(), Permission.READ);
                 metadata = validateColumnFamily(keyspace, select.getColumnFamily());
+
+                // need to do this in here because we need a CFMD.getKeyName()
+                select.extractKeyAliasFromColumns(metadata);
+
+                if (select.getKeys().size() > 0)
+                    validateKeyAlias(metadata, select.getKeyAlias());
+
                 validateSelect(keyspace, select);
-                
+
                 List<org.apache.cassandra.db.Row> rows;
 
                 // By-key
@@ -940,4 +965,37 @@ public class QueryProcessor
         
         return statement;
     }
+
+    private static void validateSchemaIsSettled() throws SchemaDisagreementException
+    {
+        long limit = System.currentTimeMillis() + timeLimitForSchemaAgreement;
+
+        outer:
+        while (limit - System.currentTimeMillis() >= 0)
+        {
+            String currentVersionId = DatabaseDescriptor.getDefsVersion().toString();
+            for (String version : describeSchemaVersions().keySet())
+            {
+                if (!version.equals(currentVersionId))
+                    continue outer;
+            }
+
+            // schemas agree
+            return;
+        }
+
+        throw new SchemaDisagreementException();
+    }
+
+    private static String bufferToString(ByteBuffer string)
+    {
+        try
+        {
+            return ByteBufferUtil.string(string);
+        }
+        catch (CharacterCodingException e)
+        {
+            throw new RuntimeException(e.getMessage(), e);
+        }
+    }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java Mon Jun 13 19:40:21 2011
@@ -23,6 +23,7 @@ package org.apache.cassandra.cql;
 import java.nio.ByteBuffer;
 import java.util.List;
 
+import org.apache.cassandra.config.CFMetaData;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.thrift.ConsistencyLevel;
@@ -142,6 +143,16 @@ public class SelectStatement
         return clause.includeFinishKey();
     }
 
+    public String getKeyAlias()
+    {
+        return clause.getKeyAlias();
+    }
+
+    public void extractKeyAliasFromColumns(CFMetaData cfm)
+    {
+        clause.extractKeysFromColumns(cfm);
+    }
+
     public AbstractType getComparator(String keyspace)
     {
         return DatabaseDescriptor.getComparator(keyspace, columnFamily);

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/UpdateStatement.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/UpdateStatement.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/UpdateStatement.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/UpdateStatement.java Mon Jun 13 19:40:21 2011
@@ -49,22 +49,24 @@ public class UpdateStatement extends Abs
     private Map<Term, Operation> columns;
     private List<Term> columnNames, columnValues;
     private List<Term> keys;
-    
+
     /**
      * Creates a new UpdateStatement from a column family name, columns map, consistency
      * level, and key term.
      * 
      * @param columnFamily column family name
+     * @param keyName alias key name
      * @param columns a map of column name/values pairs
      * @param keys the keys to update
      * @param attrs additional attributes for statement (CL, timestamp, timeToLive)
      */
     public UpdateStatement(String columnFamily,
+                           String keyName,
                            Map<Term, Operation> columns,
                            List<Term> keys,
                            Attributes attrs)
     {
-        super(columnFamily, attrs);
+        super(columnFamily, keyName, attrs);
 
         this.columns = columns;
         this.keys = keys;
@@ -76,18 +78,20 @@ public class UpdateStatement extends Abs
      * alternate update format, <code>INSERT</code>.
      * 
      * @param columnFamily column family name
+     * @param keyName alias key name
      * @param columnNames list of column names
      * @param columnValues list of column values (corresponds to names)
      * @param keys the keys to update
      * @param attrs additional attributes for statement (CL, timestamp, timeToLive)
      */
     public UpdateStatement(String columnFamily,
+                           String keyName,
                            List<Term> columnNames,
                            List<Term> columnValues,
                            List<Term> keys,
                            Attributes attrs)
     {
-        super(columnFamily, attrs);
+        super(columnFamily, keyName, attrs);
 
         this.columnNames = columnNames;
         this.columnValues = columnValues;
@@ -139,6 +143,8 @@ public class UpdateStatement extends Abs
 
         CFMetaData metadata = validateColumnFamily(keyspace, columnFamily, hasCommutativeOperation);
 
+        QueryProcessor.validateKeyAlias(metadata, keyName);
+
         // Avoid unnecessary authorizations.
         if (!(cfamsSeen.contains(columnFamily)))
         {

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/WhereClause.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/WhereClause.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/WhereClause.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/WhereClause.java Mon Jun 13 19:40:21 2011
@@ -21,7 +21,15 @@ package org.apache.cassandra.cql;
  */
 
 
+import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.thrift.InvalidRequestException;
+import org.apache.cassandra.thrift.ThriftValidation;
+import org.apache.cassandra.utils.ByteBufferUtil;
+
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -30,10 +38,13 @@ import java.util.List;
  */
 public class WhereClause
 {
+    // added to either by the parser, e.g. from an IN clause, or by extractKeysFromColumns
     private List<Term> keys = new ArrayList<Term>();
     private Term startKey, finishKey;
     private List<Relation> columns = new ArrayList<Relation>();
     private boolean includeStartKey = false, includeFinishKey = false;
+    // set by extractKeysFromColumns
+    private String keyAlias = null;
 
     /**
      * Create a new WhereClause with the first parsed relation.
@@ -96,11 +107,6 @@ public class WhereClause
         return startKey != null;
     }
     
-    public boolean isKeyList()
-    {
-        return !isKeyRange();
-    }
-    
     public Term getStartKey()
     {
         return startKey;
@@ -125,4 +131,47 @@ public class WhereClause
     {
         return includeFinishKey;
     }
+
+    public void setKeyAlias(String alias)
+    {
+        keyAlias = alias.toUpperCase();
+    }
+
+    public String getKeyAlias()
+    {
+        // TODO fix special casing here, key alias should always be set post-extract
+        // key alias as not related to keys in here, it can be unset when we have a query like
+        // SELECT * FROM <CF> WHERE key = 1 and col > 2 and col < 3;
+        // it will be always set when statement looks like this
+        // SELECT * FROM <CF> WHERE <key> IN (.., .., ..);
+        // key is NULL when KEY keyword is used or when key alias given by user was not recognized
+        // validateKeyAlias will throw an exception for us in that case
+        return keyAlias == null ? QueryProcessor.DEFAULT_KEY_NAME : keyAlias;
+    }
+
+    public void extractKeysFromColumns(CFMetaData cfm)
+    {
+        ByteBuffer realKeyAlias = cfm.getKeyName();
+
+        if (!keys.isEmpty())
+            return; // we already have key(s) set
+
+        Iterator<Relation> iter = columns.iterator();
+
+        while (iter.hasNext())
+        {
+            Relation relation = iter.next();
+
+            ByteBuffer name = ByteBufferUtil.bytes(relation.getEntity().getText());
+
+            if (name.equals(realKeyAlias))
+            {
+                // setting found key as an alias
+                keyAlias = relation.getEntity().getText().toUpperCase();
+                keys.add(relation.getValue()); // add a key value to the keys list
+                iter.remove(); // removing it from the columns
+                break;
+            }
+        }
+    }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/DataTracker.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/DataTracker.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/DataTracker.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/DataTracker.java Mon Jun 13 19:40:21 2011
@@ -38,7 +38,7 @@ import org.apache.cassandra.io.sstable.D
 import org.apache.cassandra.io.sstable.SSTableReader;
 import org.apache.cassandra.utils.Pair;
 
-public class DataTracker
+public class    DataTracker
 {
     private static final Logger logger = LoggerFactory.getLogger(DataTracker.class);
 

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java Mon Jun 13 19:40:21 2011
@@ -8,6 +8,7 @@ import java.util.Map;
 
 import org.apache.cassandra.config.*;
 import org.apache.cassandra.db.Table;
+import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.UUIDGen;
 
@@ -88,7 +89,7 @@ public class AddColumnFamily extends Mig
         DatabaseDescriptor.setTableDefinition(ksm, newVersion);
         // these definitions could have come from somewhere else.
         CFMetaData.fixMaxId();
-        if (!clientMode)
+        if (!StorageService.instance.isClientMode())
             Table.open(ksm.name).initCf(cfm.cfId, cfm.cfName);
     }
 

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddKeyspace.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddKeyspace.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddKeyspace.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddKeyspace.java Mon Jun 13 19:40:21 2011
@@ -25,6 +25,7 @@ import org.apache.cassandra.config.Confi
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.KSMetaData;
 import org.apache.cassandra.db.Table;
+import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.UUIDGen;
 
@@ -69,7 +70,7 @@ public class AddKeyspace extends Migrati
         DatabaseDescriptor.setTableDefinition(ksm, newVersion);
         // these definitions could have come from somewhere else.
         CFMetaData.fixMaxId();
-        if (!clientMode)
+        if (!StorageService.instance.isClientMode())
         {
             Table.open(ksm.name);
         }

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java Mon Jun 13 19:40:21 2011
@@ -11,6 +11,7 @@ import org.apache.cassandra.config.KSMet
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.Table;
+import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.UUIDGen;
 
@@ -78,7 +79,7 @@ public class DropColumnFamily extends Mi
         CFMetaData.purge(cfm);
         DatabaseDescriptor.setTableDefinition(ksm, newVersion);
 
-        if (!clientMode)
+        if (!StorageService.instance.isClientMode())
         {
             cfs.snapshot(Table.getTimestampedSnapshotName(null));
 

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropKeyspace.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropKeyspace.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropKeyspace.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropKeyspace.java Mon Jun 13 19:40:21 2011
@@ -28,6 +28,7 @@ import org.apache.cassandra.db.ColumnFam
 import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.HintedHandOffManager;
 import org.apache.cassandra.db.Table;
+import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.UUIDGen;
 
@@ -61,7 +62,7 @@ public class DropKeyspace extends Migrat
             {
                 ColumnFamilyStore cfs = Table.open(ksm.name).getColumnFamilyStore(cfm.cfName);
                 CFMetaData.purge(cfm);
-                if (!clientMode)
+                if (!StorageService.instance.isClientMode())
                 {
                     cfs.snapshot(snapshotName);
                     cfs.flushLock.lock();

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/Migration.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/Migration.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/Migration.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/Migration.java Mon Jun 13 19:40:21 2011
@@ -38,7 +38,6 @@ import org.apache.cassandra.config.KSMet
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.filter.QueryFilter;
 import org.apache.cassandra.db.filter.QueryPath;
-import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.io.SerDeUtils;
 import org.apache.cassandra.io.util.DataOutputBuffer;
 import org.apache.cassandra.service.MigrationManager;
@@ -76,15 +75,12 @@ public abstract class Migration
     protected RowMutation rm;
     protected UUID newVersion;
     protected UUID lastVersion;
-    
-    // this doesn't follow the serialized migration around.
-    protected transient boolean clientMode;
-    
+
+    // the migration in column form, used when announcing to others
+    private IColumn column;
+
     /** Subclasses must have a matching constructor */
-    protected Migration() 
-    {
-        clientMode = StorageService.instance.isClientMode();
-    }
+    protected Migration() { }
 
     Migration(UUID newVersion, UUID lastVersion)
     {
@@ -103,16 +99,17 @@ public abstract class Migration
             throw new ConfigurationException("New version timestamp is not newer than the current version timestamp.");
         // write to schema
         assert rm != null;
-        if (!clientMode)
+        if (!StorageService.instance.isClientMode())
+        {
             rm.apply();
 
-        // write migration.
-        if (!clientMode)
-        {
             long now = System.currentTimeMillis();
             ByteBuffer buf = serialize();
             RowMutation migration = new RowMutation(Table.SYSTEM_TABLE, MIGRATIONS_KEY);
-            migration.add(new QueryPath(MIGRATIONS_CF, null, ByteBuffer.wrap(UUIDGen.decompose(newVersion))), buf, now);
+            ColumnFamily cf = ColumnFamily.create(Table.SYSTEM_TABLE, MIGRATIONS_CF);
+            column = new Column(ByteBuffer.wrap(UUIDGen.decompose(newVersion)), buf, now);
+            cf.addColumn(column);
+            migration.add(cf);
             migration.apply();
             
             // note that we're storing this in the system table, which is not replicated
@@ -155,14 +152,13 @@ public abstract class Migration
         
         applyModels(); 
     }
-    
+
+    /** send this migration immediately to existing nodes in the cluster.  apply() must be called first. */
     public final void announce()
     {
-        if (StorageService.instance.isClientMode())
-            return;
-        
-        // immediate notification for existing nodes.
-        MigrationManager.announce(newVersion, Gossiper.instance.getLiveMembers());
+        assert !StorageService.instance.isClientMode();
+        assert column != null;
+        MigrationManager.announce(column);
     }
 
     public final void passiveAnnounce()

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameColumnFamily.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameColumnFamily.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameColumnFamily.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameColumnFamily.java Mon Jun 13 19:40:21 2011
@@ -9,6 +9,7 @@ import org.apache.cassandra.config.Confi
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.KSMetaData;
 import org.apache.cassandra.db.Table;
+import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.UUIDGen;
 
@@ -100,7 +101,7 @@ public class RenameColumnFamily extends 
         }
         DatabaseDescriptor.setTableDefinition(ksm, newVersion);
         
-        if (!clientMode)
+        if (!StorageService.instance.isClientMode())
         {
             Table.open(ksm.name).renameCf(cfId, newName);
         }

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameKeyspace.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameKeyspace.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameKeyspace.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameKeyspace.java Mon Jun 13 19:40:21 2011
@@ -29,8 +29,8 @@ import org.apache.cassandra.config.CFMet
 import org.apache.cassandra.config.ConfigurationException;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.KSMetaData;
-import org.apache.cassandra.db.HintedHandOffManager;
 import org.apache.cassandra.db.Table;
+import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.UUIDGen;
 
@@ -80,7 +80,7 @@ public class RenameKeyspace extends Migr
 
     public void applyModels() throws IOException
     {
-        if (!clientMode)
+        if (!StorageService.instance.isClientMode())
             renameKsStorageFiles(oldName, newName);
         
         KSMetaData oldKsm = DatabaseDescriptor.getTableDefinition(oldName);
@@ -105,7 +105,7 @@ public class RenameKeyspace extends Migr
         DatabaseDescriptor.clearTableDefinition(oldKsm, newVersion);
         DatabaseDescriptor.setTableDefinition(newKsm, newVersion);
         
-        if (!clientMode)
+        if (!StorageService.instance.isClientMode())
         {
             Table.clear(oldKsm.name);
             Table.open(newName);

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/UpdateColumnFamily.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/UpdateColumnFamily.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/UpdateColumnFamily.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/UpdateColumnFamily.java Mon Jun 13 19:40:21 2011
@@ -6,6 +6,7 @@ import org.apache.cassandra.config.*;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Table;
 import org.apache.cassandra.db.migration.avro.ColumnDef;
+import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.UUIDGen;
 
@@ -78,7 +79,7 @@ public class UpdateColumnFamily extends 
         }
         DatabaseDescriptor.setTableDefinition(null, newVersion);
 
-        if (!clientMode)
+        if (!StorageService.instance.isClientMode())
         {
             Table table = Table.open(metadata.ksName);
             ColumnFamilyStore oldCfs = table.getColumnFamilyStore(metadata.cfName);

Modified: cassandra/trunk/src/java/org/apache/cassandra/service/MigrationManager.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/MigrationManager.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/MigrationManager.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/MigrationManager.java Mon Jun 13 19:40:21 2011
@@ -87,19 +87,15 @@ public class MigrationManager implements
     public static void rectify(UUID theirVersion, InetAddress endpoint)
     {
         UUID myVersion = DatabaseDescriptor.getDefsVersion();
-        if (theirVersion.timestamp() == myVersion.timestamp())
-            return;
-        else if (theirVersion.timestamp() > myVersion.timestamp())
-        {
-            logger.debug("My data definitions are old. Asking for updates since {}", myVersion.toString());
-            announce(myVersion, Collections.singleton(endpoint));
-        }
-        else if (!StorageService.instance.isClientMode())
+        if (theirVersion.timestamp() < myVersion.timestamp()
+            && !StorageService.instance.isClientMode())
         {
             if (lastPushed.get(endpoint) == null || theirVersion.timestamp() >= lastPushed.get(endpoint).timestamp())
             {
                 logger.debug("Schema on {} is old. Sending updates since {}", endpoint, theirVersion);
-                pushMigrations(theirVersion, myVersion, endpoint);
+                Collection<IColumn> migrations = Migration.getLocalMigrations(theirVersion, myVersion);
+                pushMigrations(endpoint, migrations);
+                lastPushed.put(endpoint, TimeUUIDType.instance.compose(Iterables.getLast(migrations).name()));
             }
             else
             {
@@ -109,28 +105,26 @@ public class MigrationManager implements
         }
     }
 
-    /** actively announce my version to a set of hosts via rpc.  They may culminate with them sending me migrations. */
-    public static void announce(final UUID version, Set<InetAddress> hosts)
+    private static void pushMigrations(InetAddress endpoint, Collection<IColumn> migrations)
     {
-        MessageProducer prod = new CachingMessageProducer(new MessageProducer() {
-            public Message getMessage(Integer protocolVersion) throws IOException
-            {
-                return makeVersionMessage(version, protocolVersion);
-            }
-        });
-        for (InetAddress host : hosts)
+        try
         {
-            try 
-            {
-                MessagingService.instance().sendOneWay(prod.getMessage(Gossiper.instance.getVersion(host)), host);
-            }
-            catch (IOException ex)
-            {
-                // happened during message serialization.
-                throw new IOError(ex);
-            }
+            Message msg = makeMigrationMessage(migrations, Gossiper.instance.getVersion(endpoint));
+            MessagingService.instance().sendOneWay(msg, endpoint);
         }
-        passiveAnnounce(version);
+        catch (IOException ex)
+        {
+            throw new IOError(ex);
+        }
+    }
+
+    /** actively announce a new version to active hosts via rpc */
+    public static void announce(IColumn column)
+    {
+
+        Collection<IColumn> migrations = Collections.singleton(column);
+        for (InetAddress endpoint : Gossiper.instance.getLiveMembers())
+            pushMigrations(endpoint, migrations);
     }
 
     /** announce my version passively over gossip **/
@@ -138,7 +132,7 @@ public class MigrationManager implements
     {
         // this is for notifying nodes as they arrive in the cluster.
         Gossiper.instance.addLocalApplicationState(ApplicationState.SCHEMA, StorageService.instance.valueFactory.migration(version));
-        logger.debug("Announcing my schema is " + version);
+        logger.debug("Gossiping my schema version " + version);
     }
 
     /**
@@ -197,30 +191,7 @@ public class MigrationManager implements
         }
         passiveAnnounce(to); // we don't need to send rpcs, but we need to update gossip
     }
-    
-    /** pushes migrations from this host to another host */
-    public static void pushMigrations(UUID from, UUID to, InetAddress host)
-    {
-        // I want all the rows from theirVersion through myVersion.
-        Collection<IColumn> migrations = Migration.getLocalMigrations(from, to);
-        try
-        {
-            Message msg = makeMigrationMessage(migrations, Gossiper.instance.getVersion(host));
-            MessagingService.instance().sendOneWay(msg, host);
-            lastPushed.put(host, TimeUUIDType.instance.compose(Iterables.getLast(migrations).name()));
-        }
-        catch (IOException ex)
-        {
-            throw new IOError(ex);
-        }
-    }
-    
-    private static Message makeVersionMessage(UUID version, int protocolVersion)
-    {
-        byte[] body = version.toString().getBytes();
-        return new Message(FBUtilities.getLocalAddress(), StorageService.Verb.DEFINITIONS_ANNOUNCE, body, protocolVersion);
-    }
-    
+
     // other half of transformation is in DefinitionsUpdateResponseVerbHandler.
     private static Message makeMigrationMessage(Collection<IColumn> migrations, int version) throws IOException
     {
@@ -241,7 +212,7 @@ public class MigrationManager implements
         }
         dout.close();
         byte[] body = bout.toByteArray();
-        return new Message(FBUtilities.getLocalAddress(), StorageService.Verb.DEFINITIONS_UPDATE_RESPONSE, body, version);
+        return new Message(FBUtilities.getLocalAddress(), StorageService.Verb.DEFINITIONS_UPDATE, body, version);
     }
     
     // other half of this transformation is in MigrationManager.

Modified: cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java Mon Jun 13 19:40:21 2011
@@ -104,8 +104,8 @@ public class StorageService implements I
         GOSSIP_DIGEST_SYN,
         GOSSIP_DIGEST_ACK,
         GOSSIP_DIGEST_ACK2,
-        DEFINITIONS_ANNOUNCE,
-        DEFINITIONS_UPDATE_RESPONSE,
+        DEFINITIONS_ANNOUNCE, // Deprecated
+        DEFINITIONS_UPDATE,
         TRUNCATE,
         SCHEMA_CHECK,
         INDEX_SCAN,
@@ -137,8 +137,7 @@ public class StorageService implements I
         put(Verb.GOSSIP_DIGEST_ACK, Stage.GOSSIP);
         put(Verb.GOSSIP_DIGEST_ACK2, Stage.GOSSIP);
         put(Verb.GOSSIP_DIGEST_SYN, Stage.GOSSIP);
-        put(Verb.DEFINITIONS_ANNOUNCE, Stage.READ);
-        put(Verb.DEFINITIONS_UPDATE_RESPONSE, Stage.READ);
+        put(Verb.DEFINITIONS_UPDATE, Stage.READ);
         put(Verb.TRUNCATE, Stage.MUTATION);
         put(Verb.SCHEMA_CHECK, Stage.MIGRATION);
         put(Verb.INDEX_SCAN, Stage.READ);
@@ -257,8 +256,7 @@ public class StorageService implements I
         MessagingService.instance().registerVerbHandlers(Verb.GOSSIP_DIGEST_ACK, new GossipDigestAckVerbHandler());
         MessagingService.instance().registerVerbHandlers(Verb.GOSSIP_DIGEST_ACK2, new GossipDigestAck2VerbHandler());
         
-        MessagingService.instance().registerVerbHandlers(Verb.DEFINITIONS_ANNOUNCE, new DefinitionsAnnounceVerbHandler());
-        MessagingService.instance().registerVerbHandlers(Verb.DEFINITIONS_UPDATE_RESPONSE, new DefinitionsUpdateResponseVerbHandler());
+        MessagingService.instance().registerVerbHandlers(Verb.DEFINITIONS_UPDATE, new DefinitionsUpdateVerbHandler());
         MessagingService.instance().registerVerbHandlers(Verb.TRUNCATE, new TruncateVerbHandler());
         MessagingService.instance().registerVerbHandlers(Verb.SCHEMA_CHECK, new SchemaCheckVerbHandler());
 
@@ -364,7 +362,7 @@ public class StorageService implements I
         {
             throw new IOError(ex);
         }
-        MigrationManager.announce(DatabaseDescriptor.getDefsVersion(), DatabaseDescriptor.getSeeds());
+        MigrationManager.passiveAnnounce(DatabaseDescriptor.getDefsVersion());
     }
 
     public synchronized void initServer() throws IOException, org.apache.cassandra.config.ConfigurationException
@@ -431,7 +429,7 @@ public class StorageService implements I
 
         MessagingService.instance().listen(FBUtilities.getLocalAddress());
         StorageLoadBalancer.instance.startBroadcasting();
-        MigrationManager.announce(DatabaseDescriptor.getDefsVersion(), DatabaseDescriptor.getSeeds());
+        MigrationManager.passiveAnnounce(DatabaseDescriptor.getDefsVersion());
         Gossiper.instance.addLocalApplicationState(ApplicationState.RELEASE_VERSION, valueFactory.releaseVersion());
 
         HintedHandOffManager.instance.registerMBean();

Modified: cassandra/trunk/test/system/test_cql.py
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/system/test_cql.py?rev=1135244&r1=1135243&r2=1135244&view=diff
==============================================================================
--- cassandra/trunk/test/system/test_cql.py (original)
+++ cassandra/trunk/test/system/test_cql.py Mon Jun 13 19:40:21 2011
@@ -1185,3 +1185,90 @@ class TestCql(ThriftTester):
         assert_raises(cql.ProgrammingError,
                       cursor.execute,
                       "UPDATE CounterCF SET count_me = count_not_me + 2 WHERE key = 'counter1'")
+
+    def test_key_alias_support(self):
+        "should be possible to use alias instead of KEY keyword"
+        cursor = init()
+
+        cursor.execute("""
+               CREATE SCHEMA KeyAliasKeyspace WITH strategy_options:replication_factor = '1'
+                   AND strategy_class = 'SimpleStrategy';
+        """)
+        cursor.execute("USE KeyAliasKeyspace;")
+
+        # create a Column Family with key alias
+        cursor.execute("""
+            CREATE COLUMNFAMILY KeyAliasCF (
+                'id' varint PRIMARY KEY,
+                'username' text
+            ) WITH comment = 'shiny, new, cf' AND default_validation = ascii;
+        """)
+
+        # TODO: temporary (until this can be done with CQL).
+        ksdef = thrift_client.describe_keyspace("KeyAliasKeyspace")
+        cfdef = ksdef.cf_defs[0]
+
+        assert len(ksdef.cf_defs) == 1, \
+            "expected 1 column family total, found %d" % len(ksdef.cf_defs)
+        assert cfdef.key_alias == 'id', "expected 'id' alias, got %s" % cfdef.key_alias
+
+        # try do insert/update
+        cursor.execute("INSERT INTO KeyAliasCF (id, username) VALUES (1, jbellis)")
+
+        # check if we actually stored anything
+        cursor.execute("SELECT * FROM KeyAliasCF WHERE id = 1")
+        assert cursor.rowcount == 1, "expected 1 results, got %d" % cursor.rowcount
+        colnames = [col_d[0] for col_d in cursor.description]
+        assert len(colnames) == 2
+
+        r = cursor.fetchone()
+        assert len(r) == 2, "expected 2, got %d" % len(r)
+        assert r[0] == 1
+        assert r[1] == 'jbellis'
+
+        cursor.execute("UPDATE KeyAliasCF SET username = 'xedin' WHERE id = 2")
+
+        # check if we actually stored anything
+        cursor.execute("SELECT * FROM KeyAliasCF WHERE id = 2")
+        assert cursor.rowcount == 1, "expected 1 results, got %d" % cursor.rowcount
+        colnames = [col_d[0] for col_d in cursor.description]
+        assert len(colnames) == 2
+
+        r = cursor.fetchone()
+        assert len(r) == 2, "expected 2, got %d" % len(r)
+        assert r[0] == 2
+        assert r[1] == 'xedin'
+
+        # delete with key alias
+        cursor.execute("DELETE FROM KeyAliasCF WHERE id = 2")
+        # check if we actually stored anything
+        cursor.execute("SELECT * FROM KeyAliasCF WHERE id = 2")
+        assert cursor.rowcount == 1, "expected 1 results, got %d" % cursor.rowcount
+
+        r = cursor.fetchone()
+        assert len(r) == 1, "expected 1, got %s" % r
+        assert r[0] == 2, "expected id = 2, got %d" % r[0]
+
+        # if alias was set you can't use KEY keyword anymore
+        assert_raises(cql.ProgrammingError,
+                      cursor.execute,
+                      "INSERT INTO KeyAliasCF (KEY, username) VALUES (6, jbellis)")
+
+        assert_raises(cql.ProgrammingError,
+                      cursor.execute,
+                      "UPDATE KeyAliasCF SET username = 'xedin' WHERE KEY = 7")
+
+        assert_raises(cql.ProgrammingError,
+                      cursor.execute,
+                      "DELETE FROM KeyAliasCF WHERE KEY = 2")
+
+        assert_raises(cql.ProgrammingError,
+                      cursor.execute,
+                      "SELECT * FROM KeyAliasCF WHERE KEY = 2")
+
+        assert_raises(cql.ProgrammingError,
+                      cursor.execute,
+                      "SELECT * FROM KeyAliasCF WHERE KEY IN (1, 2)")
+
+        cursor.execute("USE Keyspace1")
+        cursor.execute("DROP KEYSPACE KeyAliasKeyspace")