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/05 15:43:23 UTC

svn commit: r1132406 [1/2] - in /cassandra/trunk: ./ contrib/ contrib/pig/src/java/org/apache/cassandra/hadoop/pig/ debian/ doc/cql/ drivers/java/src/org/apache/cassandra/cql/jdbc/ drivers/java/test/org/apache/cassandra/cql/ drivers/py/cql/ interface/t...

Author: jbellis
Date: Sun Jun  5 13:43:22 2011
New Revision: 1132406

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

Added:
    cassandra/trunk/src/java/org/apache/cassandra/cql/AlterTableStatement.java
      - copied unchanged from r1130862, cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/AlterTableStatement.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/Operation.java
      - copied unchanged from r1132405, cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/Operation.java
    cassandra/trunk/tools/stress/bin/stressd
      - copied unchanged from r1130862, cassandra/branches/cassandra-0.8/tools/stress/bin/stressd
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/StressAction.java
      - copied unchanged from r1130862, cassandra/branches/cassandra-0.8/tools/stress/src/org/apache/cassandra/stress/StressAction.java
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/StressServer.java
      - copied unchanged from r1130862, cassandra/branches/cassandra-0.8/tools/stress/src/org/apache/cassandra/stress/StressServer.java
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/server/
      - copied from r1130862, cassandra/branches/cassandra-0.8/tools/stress/src/org/apache/cassandra/stress/server/
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/server/StressThread.java
      - copied unchanged from r1130862, cassandra/branches/cassandra-0.8/tools/stress/src/org/apache/cassandra/stress/server/StressThread.java
Modified:
    cassandra/trunk/   (props changed)
    cassandra/trunk/CHANGES.txt
    cassandra/trunk/build.xml
    cassandra/trunk/contrib/   (props changed)
    cassandra/trunk/contrib/pig/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java
    cassandra/trunk/debian/changelog
    cassandra/trunk/doc/cql/CQL.textile
    cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CResultSet.java
    cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraConnection.java
    cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraResultSet.java
    cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/ColumnDecoder.java
    cassandra/trunk/drivers/java/test/org/apache/cassandra/cql/JdbcDriverTest.java
    cassandra/trunk/drivers/py/cql/marshal.py
    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/config/KSMetaData.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/AbstractModification.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/BatchStatement.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/StatementType.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/UpdateStatement.java
    cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java
    cassandra/trunk/src/java/org/apache/cassandra/db/DataTracker.java
    cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
    cassandra/trunk/src/java/org/apache/cassandra/db/TruncateVerbHandler.java
    cassandra/trunk/src/java/org/apache/cassandra/net/IncomingTcpConnection.java
    cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
    cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
    cassandra/trunk/test/system/test_cql.py
    cassandra/trunk/test/system/test_thrift_server.py
    cassandra/trunk/test/unit/org/apache/cassandra/SchemaLoader.java
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/Session.java
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/Stress.java
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/operations/CounterAdder.java
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/operations/CounterGetter.java
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/operations/IndexedRangeSlicer.java
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/operations/Inserter.java
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/operations/MultiGetter.java
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/operations/RangeSlicer.java
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/operations/Reader.java
    cassandra/trunk/tools/stress/src/org/apache/cassandra/stress/util/Operation.java

Propchange: cassandra/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jun  5 13:43:22 2011
@@ -1,8 +1,8 @@
-/cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1081914,1083000
-/cassandra/branches/cassandra-0.7:1026516-1128347,1129151
+/cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1131291
+/cassandra/branches/cassandra-0.7:1026516-1131292
 /cassandra/branches/cassandra-0.7.0:1053690-1055654
-/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1129091,1129094-1129095,1129155,1129462-1129463,1130863-1130864
-/cassandra/branches/cassandra-0.8.0:1125021-1127636,1129154
+/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1132405
+/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
 /cassandra/tags/cassandra-0.8.0-rc1:1102511-1125020

Modified: cassandra/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Sun Jun  5 13:43:22 2011
@@ -1,11 +1,16 @@
 0.8.1
- * add support for insert, delete in cql BATCH (CASSANDRA-2537)
- * add support for IN to cql SELECT, UPDATE (CASSANDRA-2553)
- * add timestamp support to cql INSERT, UPDATE, and BATCH (CASSANDRA-2555)
+ * CQL:
+   - support for insert, delete in BATCH (CASSANDRA-2537)
+   - support for IN to SELECT, UPDATE (CASSANDRA-2553)
+   - timestamp support for INSERT, UPDATE, and BATCH (CASSANDRA-2555)
+   - TTL support (CASSANDRA-2476)
+   - 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)
- * add CQL TTL support (CASSANDRA-2476)
  * optimize batches containing multiple updates to the same row
    (CASSANDRA-2583)
  * adjust hinted handoff page size to avoid OOM with large columns 
@@ -31,6 +36,9 @@
  * close scrub file handles (CASSANDRA-2669)
  * throttle migration replay (CASSANDRA-2714)
  * optimize column serializer creation (CASSANDRA-2716)
+ * fix truncate/compaction race (CASSANDRA-2673)
+ * workaround large resultsets causing large allocation retention
+   by nio sockets (CASSANDRA-2654)
 
 
 0.8.0-final
@@ -42,10 +50,11 @@
  * switch to native Thrift for Hadoop map/reduce (CASSANDRA-2667)
  * fix StackOverflowError when building from eclipse (CASSANDRA-2687)
  * only provide replication_factor to strategy_options "help" for
-   SimpleStrategy, OldNetworkTopologyStrategy (CASSANDRA-2678)
+   SimpleStrategy, OldNetworkTopologyStrategy (CASSANDRA-2678, 2713)
  * fix exception adding validators to non-string columns (CASSANDRA-2696)
  * avoid instantiating DatabaseDescriptor in JDBC (CASSANDRA-2694)
  * fix potential stack overflow during compaction (CASSANDRA-2626)
+ * clone super columns to avoid modifying them during flush (CASSANDRA-2675)
  * reset underlying iterator in EchoedRow constructor (CASSANDRA-2653)
 
 
@@ -147,6 +156,9 @@
  * reduce contention on Table.flusherLock (CASSANDRA-1954)
  * try harder to detect failures during streaming, cleaning up temporary
    files more reliably (CASSANDRA-2088)
+
+
+0.6.13
  * shut down server for OOM on a Thrift thread (CASSANDRA-2269)
  * fix tombstone handling in repair and sstable2json (CASSANDRA-2279)
  * preserve version when streaming data from old sstables (CASSANDRA-2283)

Modified: cassandra/trunk/build.xml
URL: http://svn.apache.org/viewvc/cassandra/trunk/build.xml?rev=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/build.xml (original)
+++ cassandra/trunk/build.xml Sun Jun  5 13:43:22 2011
@@ -64,7 +64,7 @@
     <property name="test.long.src" value="${test.dir}/long"/>
     <property name="test.distributed.src" value="${test.dir}/distributed"/>
     <property name="dist.dir" value="${build.dir}/dist"/>
-    <property name="cql.driver.version" value="1.0.2" />
+    <property name="cql.driver.version" value="1.0.3" />
     <condition property="version" value="${base.version}">
       <isset property="release"/>
     </condition>
@@ -693,7 +693,6 @@ url=${svn.entry.url}?pathrev=${svn.entry
                destdir="${build.classes.main}" includeantruntime="false">
             <src path="${build.src.java}"/>
             <src path="${build.src.gen-java}"/>
-            <src path="${build.src.driver}" />
             <classpath refid="cassandra.classpath"/>
         </javac>
         <javac debug="true" debuglevel="${debuglevel}"
@@ -972,7 +971,10 @@ url=${svn.entry.url}?pathrev=${svn.entry
      debug="true"
      debuglevel="${debuglevel}"
      destdir="${test.classes}">
-      <classpath refid="cassandra.classpath"/>
+      <classpath>
+        <path refid="cassandra.classpath"/>
+        <pathelement location="${build.classes.cql}"/>
+      </classpath>
       <src path="${test.unit.src}"/>
       <src path="${test.long.src}"/>
       <src path="${test.src.driver}"/>
@@ -1024,6 +1026,7 @@ url=${svn.entry.url}?pathrev=${svn.entry
         <classpath>
           <path refid="cassandra.classpath" />
           <pathelement location="${test.classes}"/>
+          <pathelement location="${build.classes.cql}"/>
           <path refid="cobertura.classpath"/>
           <pathelement location="${test.conf}"/>
           <fileset dir="${test.lib}">

Propchange: cassandra/trunk/contrib/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jun  5 13:43:22 2011
@@ -1,8 +1,8 @@
 /cassandra/branches/cassandra-0.6/contrib:922689-1052356,1052358-1053452,1053454,1053456-1068009
-/cassandra/branches/cassandra-0.7/contrib:1026516-1128347,1129151
+/cassandra/branches/cassandra-0.7/contrib:1026516-1131292
 /cassandra/branches/cassandra-0.7.0/contrib:1053690-1055654
-/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1129091,1129094-1129095,1129155,1129462-1129463,1130863-1130864
-/cassandra/branches/cassandra-0.8.0/contrib:1125021-1127636,1129154
+/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1132405
+/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
 /cassandra/tags/cassandra-0.8.0-rc1/contrib:1102511-1125020

Modified: cassandra/trunk/contrib/pig/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/contrib/pig/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java?rev=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/contrib/pig/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java (original)
+++ cassandra/trunk/contrib/pig/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java Sun Jun  5 13:43:22 2011
@@ -357,12 +357,12 @@ public class CassandraStorage extends Lo
                Mutation mutation = new Mutation();
                if (DataType.findType(pair.get(1)) == DataType.BAG) // supercolumn
                {
-                   org.apache.cassandra.hadoop.avro.SuperColumn sc = new org.apache.cassandra.hadoop.avro.SuperColumn();
+                   org.apache.cassandra.thrift.SuperColumn sc = new org.apache.cassandra.thrift.SuperColumn();
                    sc.name = objToBB(pair.get(0));
-                   ArrayList<org.apache.cassandra.hadoop.avro.Column> columns = new ArrayList<org.apache.cassandra.hadoop.avro.Column>();
+                   ArrayList<org.apache.cassandra.thrift.Column> columns = new ArrayList<org.apache.cassandra.thrift.Column>();
                    for (Tuple subcol : (DefaultDataBag) pair.get(1))
                    {
-                       org.apache.cassandra.hadoop.avro.Column column = new org.apache.cassandra.hadoop.avro.Column();
+                       org.apache.cassandra.thrift.Column column = new org.apache.cassandra.thrift.Column();
                        column.name = objToBB(subcol.get(0));
                        column.value = objToBB(subcol.get(1));
                        column.setTimestamp(System.currentTimeMillis() * 1000);

Modified: cassandra/trunk/debian/changelog
URL: http://svn.apache.org/viewvc/cassandra/trunk/debian/changelog?rev=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/debian/changelog (original)
+++ cassandra/trunk/debian/changelog Sun Jun  5 13:43:22 2011
@@ -2,7 +2,7 @@ cassandra (0.8.0) unstable; urgency=low
 
   * New release
 
- -- Eric Evans <ee...@apache.org>  Mon, 23 May 2011 15:59:48 -0500
+ -- Eric Evans <ee...@apache.org>  Mon, 30 May 2011 12:58:23 -0500
 
 cassandra (0.8.0~rc1) unstable; urgency=low
 

Modified: cassandra/trunk/doc/cql/CQL.textile
URL: http://svn.apache.org/viewvc/cassandra/trunk/doc/cql/CQL.textile?rev=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/doc/cql/CQL.textile (original)
+++ cassandra/trunk/doc/cql/CQL.textile Sun Jun  5 13:43:22 2011
@@ -69,6 +69,17 @@ SELECT ... WHERE <CLAUSE> [LIMIT N] ...
 
 Limiting the number of rows returned can be achieved by adding the @LIMIT@ option to a @SELECT@ expression. @LIMIT@ defaults to 10,000 when left unset.
 
+h2. ALTER TABLE
+
+_Synopsis:_
+
+bc.
+ALTER TABLE <columnFamily> ADD <column> <validator>;
+ALTER TABLE <columnFamily> ALTER <column> TYPE <validator>;
+ALTER TABLE <columnFamily> DROP <column>;
+
+An @ALTER@ is used to manipulate with ColumnFamily columns. It allows you to add new columns, alter and drop existing columns. No results are returned.
+
 h2. INSERT
 
 _Synopsis:_
@@ -282,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/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CResultSet.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CResultSet.java?rev=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CResultSet.java (original)
+++ cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CResultSet.java Sun Jun  5 13:43:22 2011
@@ -48,6 +48,7 @@ public class CResultSet extends Abstract
     
     // the current row key when iterating through results.
     private byte[] curRowKey = null;
+    private TypedColumn typedCurRowKey = null;
     
     /** The values. */
     private List<TypedColumn> values = new ArrayList<TypedColumn>();
@@ -78,6 +79,11 @@ public class CResultSet extends Abstract
         return curRowKey;
     }
 
+    public TypedColumn getTypedKey()
+    {
+        return typedCurRowKey;
+    }
+
     public TypedColumn getColumn(int i)
     {
         return values.get(i);
@@ -379,6 +385,8 @@ public class CResultSet extends Abstract
             CqlRow row = rSetIter.next();
             rowNumber++;
             curRowKey = row.getKey();
+            typedCurRowKey = decoder.makeKeyColumn(keyspace, columnFamily, curRowKey);
+
             List<Column> cols = row.getColumns();
             for (Column col : cols)
             {

Modified: cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraConnection.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraConnection.java?rev=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraConnection.java (original)
+++ cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraConnection.java Sun Jun  5 13:43:22 2011
@@ -28,8 +28,10 @@ import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.NClob;
 import java.sql.PreparedStatement;
+import java.sql.ResultSet;
 import java.sql.SQLClientInfoException;
 import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
 import java.sql.SQLWarning;
 import java.sql.SQLXML;
 import java.sql.Savepoint;
@@ -52,10 +54,13 @@ import org.apache.thrift.transport.TTran
  */
 class CassandraConnection implements Connection
 {
-    
-    /** The cassandra con. */
+    private Properties clientInfo = new Properties();
+
+    /**
+     * The cassandra con.
+     */
     private org.apache.cassandra.cql.jdbc.Connection cassandraCon;
-    
+
     /**
      * Instantiates a new cassandra connection.
      *
@@ -77,8 +82,7 @@ class CassandraConnection implements Con
             final int host_backwardIdx = host_port.indexOf('/');
             final String port = host_port.substring(host_colonIdx + 1, host_backwardIdx);
             final String keyspace = host_port.substring(host_backwardIdx + 1);
-            cassandraCon = new org.apache.cassandra.cql.jdbc.Connection(hostName, Integer.valueOf(port), userName,
-                                                                                                                             password);
+            cassandraCon = new org.apache.cassandra.cql.jdbc.Connection(hostName, Integer.valueOf(port), userName, password);
             final String useQ = "USE " + keyspace;
             cassandraCon.execute(useQ);
         }
@@ -120,7 +124,7 @@ class CassandraConnection implements Con
         }
 
     }
-    
+
     /**
      * @param arg0
      * @return
@@ -128,10 +132,10 @@ class CassandraConnection implements Con
      */
     public boolean isWrapperFor(Class<?> arg0) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLException("no object is found that implements this interface");
     }
 
-    
+
     /**
      * @param <T>
      * @param arg0
@@ -140,17 +144,19 @@ class CassandraConnection implements Con
      */
     public <T> T unwrap(Class<T> arg0) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLException("no object is found that implements this interface");
     }
 
 
-
     /**
      * @throws SQLException
      */
     public void clearWarnings() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        // This implementation does not support the collection of warnings so clearing is a no-op
+        // but it is still an exception to call this on a closed connection.
+        if (isClosed())
+            throw new SQLException("this method was called on a closed Connection");
     }
 
     /**
@@ -172,7 +178,7 @@ class CassandraConnection implements Con
      */
     public void commit() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLException("The Cassandra Implementation is always in auto-commit mode.");
     }
 
 
@@ -184,7 +190,7 @@ class CassandraConnection implements Con
      */
     public Array createArrayOf(String arg0, Object[] arg1) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -194,7 +200,7 @@ class CassandraConnection implements Con
      */
     public Blob createBlob() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -204,7 +210,7 @@ class CassandraConnection implements Con
      */
     public Clob createClob() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -214,7 +220,7 @@ class CassandraConnection implements Con
      */
     public NClob createNClob() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -224,10 +230,10 @@ class CassandraConnection implements Con
      */
     public SQLXML createSQLXML() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
-    
+
     /**
      * @return
      * @throws SQLException
@@ -246,7 +252,7 @@ class CassandraConnection implements Con
      */
     public Statement createStatement(int arg0, int arg1) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -259,7 +265,7 @@ class CassandraConnection implements Con
      */
     public Statement createStatement(int arg0, int arg1, int arg2) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -271,7 +277,7 @@ class CassandraConnection implements Con
      */
     public Struct createStruct(String arg0, Object[] arg1) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -281,7 +287,7 @@ class CassandraConnection implements Con
      */
     public boolean getAutoCommit() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        return true;
     }
 
 
@@ -291,7 +297,12 @@ class CassandraConnection implements Con
      */
     public String getCatalog() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        // This implementation does not support the catalog names so null is always returned if the connection is open.
+        // but it is still an exception to call this on a closed connection.
+        if (isClosed())
+            throw new SQLException("this method was called on a closed Connection");
+
+        return null;
     }
 
 
@@ -301,18 +312,24 @@ class CassandraConnection implements Con
      */
     public Properties getClientInfo() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        if (isClosed())
+            throw new SQLException("this method was called on a closed Connection");
+
+        return clientInfo;
     }
 
 
     /**
-     * @param arg0
+     * @param label
      * @return
      * @throws SQLException
      */
-    public String getClientInfo(String arg0) throws SQLException
+    public String getClientInfo(String label) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        if (isClosed())
+            throw new SQLException("this method was called on a closed Connection");
+
+        return clientInfo.getProperty(label);
     }
 
 
@@ -322,7 +339,11 @@ class CassandraConnection implements Con
      */
     public int getHoldability() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        if (isClosed())
+            throw new SQLException("this method was called on a closed Connection");
+
+        // the rationale is there are really no commits in Cassandra so no boundary...
+        return ResultSet.HOLD_CURSORS_OVER_COMMIT;
     }
 
 
@@ -332,7 +353,11 @@ class CassandraConnection implements Con
      */
     public DatabaseMetaData getMetaData() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        if (isClosed())
+            throw new SQLException("this method was called on a closed Connection");
+
+        // the rationale is there is no DatabaseMetaData to return but if there was we would return it...
+        return null;
     }
 
 
@@ -342,7 +367,10 @@ class CassandraConnection implements Con
      */
     public int getTransactionIsolation() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        if (isClosed())
+            throw new SQLException("this method was called on a closed Connection");
+
+        return Connection.TRANSACTION_NONE;
     }
 
 
@@ -352,7 +380,7 @@ class CassandraConnection implements Con
      */
     public Map<String, Class<?>> getTypeMap() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -362,7 +390,11 @@ class CassandraConnection implements Con
      */
     public SQLWarning getWarnings() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        if (isClosed())
+            throw new SQLException("this method was called on a closed Connection");
+
+        // the rationale is there are no warnings to return in this implementation...
+        return null;
     }
 
 
@@ -372,7 +404,10 @@ class CassandraConnection implements Con
      */
     public boolean isClosed() throws SQLException
     {
-        return false;
+        if (cassandraCon == null)
+            return true;
+
+        return !cassandraCon.isOpen();
     }
 
 
@@ -387,24 +422,34 @@ class CassandraConnection implements Con
 
 
     /**
-     * @param arg0
+     * @param timeout
      * @return
      * @throws SQLException
      */
-    public boolean isValid(int arg0) throws SQLException
+    public boolean isValid(int timeout) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+
+        if (timeout < 0)
+            throw new SQLException("the timeout value was less than zero");
+
+        // this needs to be more robust. Some query needs to be made to verify connection is really up.
+        return !isClosed();
     }
 
 
     /**
-     * @param arg0
+     * @param sql
      * @return
      * @throws SQLException
      */
-    public String nativeSQL(String arg0) throws SQLException
+    public String nativeSQL(String sql) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        if (isClosed())
+            throw new SQLException("this method was called on a closed Connection");
+
+        // the rationale is there are no distinction between grammars in this implementation...
+        // so we are just return the input argument
+        return sql;
     }
 
 
@@ -415,7 +460,7 @@ class CassandraConnection implements Con
      */
     public CallableStatement prepareCall(String arg0) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -428,7 +473,7 @@ class CassandraConnection implements Con
      */
     public CallableStatement prepareCall(String arg0, int arg1, int arg2) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -442,7 +487,7 @@ class CassandraConnection implements Con
      */
     public CallableStatement prepareCall(String arg0, int arg1, int arg2, int arg3) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -465,7 +510,7 @@ class CassandraConnection implements Con
      */
     public PreparedStatement prepareStatement(String arg0, int arg1) throws SQLException
     {
-        return null;
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -477,7 +522,7 @@ class CassandraConnection implements Con
      */
     public PreparedStatement prepareStatement(String arg0, int[] arg1) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -489,7 +534,7 @@ class CassandraConnection implements Con
      */
     public PreparedStatement prepareStatement(String arg0, String[] arg1) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -502,7 +547,7 @@ class CassandraConnection implements Con
      */
     public PreparedStatement prepareStatement(String arg0, int arg1, int arg2) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -516,7 +561,7 @@ class CassandraConnection implements Con
      */
     public PreparedStatement prepareStatement(String arg0, int arg1, int arg2, int arg3) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
@@ -526,18 +571,16 @@ class CassandraConnection implements Con
      */
     public void releaseSavepoint(Savepoint arg0) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
-
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
     /**
      * @throws SQLException
-     */ 
+     */
     public void rollback() throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
-
+        throw new SQLException("the Cassandra Implementation is always in auto-commit mode");
     }
 
 
@@ -547,19 +590,18 @@ class CassandraConnection implements Con
      */
     public void rollback(Savepoint arg0) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
-
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 
     /**
-     * @param arg0
+     * @param autoCommit
      * @throws SQLException
      */
-    public void setAutoCommit(boolean arg0) throws SQLException
+    public void setAutoCommit(boolean autoCommit) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
-
+        if (!autoCommit)
+            throw new SQLException("the Cassandra Implementation is always in auto-commit mode");
     }
 
 
@@ -569,29 +611,35 @@ class CassandraConnection implements Con
      */
     public void setCatalog(String arg0) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        if (isClosed())
+            throw new SQLException("this method was called on a closed Connection");
+
+        // the rationale is there are no catalog name to set in this implementation...
+        // so we are "silently ignoring" the request
     }
 
 
     /**
-     * @param arg0
+     * @param props
      * @throws SQLClientInfoException
      */
-    public void setClientInfo(Properties arg0) throws SQLClientInfoException
+    public void setClientInfo(Properties props) throws SQLClientInfoException
     {
-        throw new UnsupportedOperationException("method not supported");
+        // this needs to be revisited when and if we actually start to use the clientInfo properties
+        if (props != null)
+            clientInfo = props;
     }
 
 
     /**
-     * @param arg0
-     * @param arg1
+     * @param key
+     * @param value
      * @throws SQLClientInfoException
      */
-    public void setClientInfo(String arg0, String arg1) throws SQLClientInfoException
+    public void setClientInfo(String key, String value) throws SQLClientInfoException
     {
-        throw new UnsupportedOperationException("method not supported");
-
+        // this needs to be revisited when and if we actually start to use the clientInfo properties
+        clientInfo.setProperty(key, value);
     }
 
 
@@ -601,9 +649,13 @@ class CassandraConnection implements Con
      */
     public void setHoldability(int arg0) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        if (isClosed())
+            throw new SQLException("this method was called on a closed Connection");
+
+        // the rationale is there are no holdability to set in this implementation...
+        // so we are "silently ignoring" the request
     }
-    
+
 
     /**
      * @param arg0
@@ -611,9 +663,13 @@ class CassandraConnection implements Con
      */
     public void setReadOnly(boolean arg0) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        if (isClosed())
+            throw new SQLException("this method was called on a closed Connection");
+
+        // the rationale is all connections are read/write in the Cassandra implementation...
+        // so we are "silently ignoring" the request
     }
-    
+
 
     /**
      * @return
@@ -623,7 +679,7 @@ class CassandraConnection implements Con
     {
         throw new UnsupportedOperationException("method not supported");
     }
-    
+
 
     /**
      * @param arg0
@@ -632,19 +688,23 @@ class CassandraConnection implements Con
      */
     public Savepoint setSavepoint(String arg0) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
-    
+
 
     /**
-     * @param arg0
+     * @param level
      * @throws SQLException
      */
-    public void setTransactionIsolation(int arg0) throws SQLException
+    public void setTransactionIsolation(int level) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        if (isClosed())
+            throw new SQLException("this method was called on a closed Connection");
+
+        if (level != Connection.TRANSACTION_NONE)
+            throw new SQLException("the Cassandra Inplementation does not support transactions");
     }
-    
+
 
     /**
      * @param arg0
@@ -652,7 +712,7 @@ class CassandraConnection implements Con
      */
     public void setTypeMap(Map<String, Class<?>> arg0) throws SQLException
     {
-        throw new UnsupportedOperationException("method not supported");
+        throw new SQLFeatureNotSupportedException("the Cassandra Implementation does not support this method");
     }
 
 }

Modified: cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraResultSet.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraResultSet.java?rev=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraResultSet.java (original)
+++ cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraResultSet.java Sun Jun  5 13:43:22 2011
@@ -30,6 +30,7 @@ public interface CassandraResultSet exte
      * @return the current row key
      */
     public byte[] getKey();
+    public TypedColumn getTypedKey();
 
     /** @return a BigInteger value for the given column offset*/
     public BigInteger getBigInteger(int i);

Modified: cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/ColumnDecoder.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/ColumnDecoder.java?rev=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/ColumnDecoder.java (original)
+++ cassandra/trunk/drivers/java/src/org/apache/cassandra/cql/jdbc/ColumnDecoder.java Sun Jun  5 13:43:22 2011
@@ -128,4 +128,14 @@ class ColumnDecoder
                                getNameType(keyspace, columnFamily, column.name),
                                getValueType(keyspace, columnFamily, column.name));
     }
+
+    /** constructs a typed column to hold the key */
+    public TypedColumn makeKeyColumn(String keyspace, String columnFamily, byte[] key)
+    {
+        CFMetaData md = metadata.get(String.format("%s.%s", keyspace, columnFamily));
+        Column column = new Column(md.getKeyName()).setValue(key).setTimestamp(-1);
+        return new TypedColumn(column,
+                               getNameType(keyspace, columnFamily, md.getKeyName()),
+                               getValueType(keyspace, columnFamily, md.getKeyName()));
+    }
 }

Modified: cassandra/trunk/drivers/java/test/org/apache/cassandra/cql/JdbcDriverTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/drivers/java/test/org/apache/cassandra/cql/JdbcDriverTest.java?rev=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/drivers/java/test/org/apache/cassandra/cql/JdbcDriverTest.java (original)
+++ cassandra/trunk/drivers/java/test/org/apache/cassandra/cql/JdbcDriverTest.java Sun Jun  5 13:43:22 2011
@@ -27,7 +27,10 @@ import java.math.BigInteger;
 import java.nio.ByteBuffer;
 import java.sql.*;
 import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
 
+import org.apache.cassandra.cql.jdbc.CassandraResultSet;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -256,27 +259,31 @@ public class JdbcDriverTest extends Embe
     public void testWithStatement() throws SQLException
     {
         Statement stmt = con.createStatement();
-        
+        List<String> keys = Arrays.asList(jsmith);
         String selectQ = "SELECT 1, 2 FROM JdbcInteger WHERE KEY='" + jsmith + "'";
-        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, "1", "2");
+        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, keys, "1", "2");
         
         selectQ = "SELECT 3, 4 FROM JdbcInteger WHERE KEY='" + jsmith + "'";
-        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, "3", "4");
+        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, keys, "3", "4");
         
         selectQ = "SELECT 1, 2, 3, 4 FROM JdbcInteger WHERE KEY='" + jsmith + "'";
-        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, "1", "2", "3", "4");
+        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, keys, "1", "2", "3", "4");
         
         selectQ = "SELECT 1, 2 FROM JdbcLong WHERE KEY='" + jsmith + "'";
-        checkResultSet(stmt.executeQuery(selectQ), "Long", 1, "1", "2");
+        checkResultSet(stmt.executeQuery(selectQ), "Long", 1, keys, "1", "2");
         
         selectQ = "SELECT 'first', last FROM JdbcAscii WHERE KEY='" + jsmith + "'";
-        checkResultSet(stmt.executeQuery(selectQ), "String", 1, "first", "last");
+        checkResultSet(stmt.executeQuery(selectQ), "String", 1, keys, "first", "last");
         
         selectQ = String.format("SELECT '%s', '%s' FROM JdbcBytes WHERE KEY='%s'", first, last, jsmith);
-        checkResultSet(stmt.executeQuery(selectQ), "Bytes", 1, first, last);
+        checkResultSet(stmt.executeQuery(selectQ), "Bytes", 1, keys, first, last);
         
         selectQ = "SELECT 'first', last FROM JdbcUtf8 WHERE KEY='" + jsmith + "'";
-        checkResultSet(stmt.executeQuery(selectQ), "String", 1, "first", "last");
+        checkResultSet(stmt.executeQuery(selectQ), "String", 1, keys, "first", "last");
+
+        String badKey = FBUtilities.bytesToHex(String.format("jsmith-%s", System.currentTimeMillis()).getBytes());
+        selectQ = "SELECT 1, 2 FROM JdbcInteger WHERE KEY IN ('" + badKey + "', '" + jsmith + "')";
+        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, keys, "1", "2");
     }
     
     @Test
@@ -293,29 +300,35 @@ public class JdbcDriverTest extends Embe
    @Test
     public void testWithPreparedStatement() throws SQLException
     {
+        List<String> keys = Arrays.asList(jsmith);
+
         String selectQ = String.format("SELECT '%s', '%s' FROM Standard1 WHERE KEY='%s'", first, last, jsmith);
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Bytes", 1, first, last);
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Bytes", 1, keys, first, last);
         
         selectQ = "SELECT 1, 2 FROM JdbcInteger WHERE KEY='" + jsmith + "'";
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, "1", "2");
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, keys, "1", "2");
         
         selectQ = "SELECT 3, 4 FROM JdbcInteger WHERE KEY='" + jsmith + "'";
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, "3", "4");
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, keys, "3", "4");
         
         selectQ = "SELECT 1, 2, 3, 4 FROM JdbcInteger WHERE KEY='" + jsmith + "'";
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, "1", "2", "3", "4");
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, keys, "1", "2", "3", "4");
         
         selectQ = "SELECT 1, 2 FROM JdbcLong WHERE KEY='" + jsmith + "'";
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Long", 1, "1", "2");
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Long", 1, keys, "1", "2");
         
         selectQ = "SELECT 'first', last FROM JdbcAscii WHERE KEY='" + jsmith + "'";
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "String", 1, "first", "last");
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "String", 1, keys, "first", "last");
         
         selectQ = String.format("SELECT '%s', '%s' FROM JdbcBytes WHERE KEY='%s'", first, last, jsmith);
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Bytes", 1, first, last);
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Bytes", 1, keys, first, last);
         
         selectQ = "SELECT 'first', last FROM JdbcUtf8 WHERE KEY='" + jsmith + "'";
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "String", 1, "first", "last");
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "String", 1, keys, "first", "last");
+
+        String badKey = FBUtilities.bytesToHex(String.format("jsmith-%s", System.currentTimeMillis()).getBytes());
+        selectQ = "SELECT 1, 2 FROM JdbcInteger WHERE KEY IN ('" + badKey + "', '" + jsmith + "')";
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, keys, "1", "2");
     }
 
     /* Method to test with Delete statement. */
@@ -412,11 +425,23 @@ public class JdbcDriverTest extends Embe
     /** iterates over a result set checking columns */
     private static void checkResultSet(ResultSet rs, String accessor, int expectedRows, String... cols) throws SQLException
     {
+        checkResultSet(rs, accessor, expectedRows, null, cols);
+    }
+
+    private static void checkResultSet(ResultSet rs, String accessor, int expectedRows, List<String> keys,  String... cols) throws SQLException
+    {
         int actualRows = 0;
         assert rs != null;
+        Iterator<String> keyIter = (keys == null) ? null : keys.iterator();
+        CassandraResultSet cassandraRs = (CassandraResultSet)rs;
         while (rs.next())
         {
             actualRows++;
+            if (keyIter != null)
+            {
+                assert cassandraRs.getTypedKey().getValueString().equals(keyIter.next());
+            }
+
             for (int c = 0; c < cols.length; c++)
             {
                 // getObject should always work.

Modified: cassandra/trunk/drivers/py/cql/marshal.py
URL: http://svn.apache.org/viewvc/cassandra/trunk/drivers/py/cql/marshal.py?rev=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/drivers/py/cql/marshal.py (original)
+++ cassandra/trunk/drivers/py/cql/marshal.py Sun Jun  5 13:43:22 2011
@@ -39,6 +39,7 @@ LONG_TYPE = "org.apache.cassandra.db.mar
 UUID_TYPE = "org.apache.cassandra.db.marshal.UUIDType"
 LEXICAL_UUID_TYPE = "org.apache.cassandra.db.marshal.LexicalType"
 TIME_UUID_TYPE = "org.apache.cassandra.db.marshal.TimeUUIDType"
+COUNTER_COLUMN_TYPE = "org.apache.cassandra.db.marshal.CounterColumnType"
 
 def prepare(query, params):
     # For every match of the form ":param_name", call marshal
@@ -76,14 +77,15 @@ else:
 def unmarshal_uuid(bytestr):
     return UUID(bytes=bytestr)
 
-unmarshallers = {BYTES_TYPE:        unmarshal_noop,
-                 ASCII_TYPE:        unmarshal_noop,
-                 UTF8_TYPE:         unmarshal_utf8,
-                 INTEGER_TYPE:      unmarshal_int,
-                 LONG_TYPE:         unmarshal_long,
-                 UUID_TYPE:         unmarshal_uuid,
-                 LEXICAL_UUID_TYPE: unmarshal_uuid,
-                 TIME_UUID_TYPE:    unmarshal_uuid}
+unmarshallers = {BYTES_TYPE:          unmarshal_noop,
+                 ASCII_TYPE:          unmarshal_noop,
+                 UTF8_TYPE:           unmarshal_utf8,
+                 INTEGER_TYPE:        unmarshal_int,
+                 LONG_TYPE:           unmarshal_long,
+                 UUID_TYPE:           unmarshal_uuid,
+                 LEXICAL_UUID_TYPE:   unmarshal_uuid,
+                 TIME_UUID_TYPE:      unmarshal_uuid,
+                 COUNTER_COLUMN_TYPE: unmarshal_long}
 
 def decode_bigint(term):
     val = int(term.encode('hex'), 16)

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jun  5 13:43:22 2011
@@ -1,8 +1,8 @@
-/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1081914,1083000
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1128347,1129151
+/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-1131292
 /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-1129091,1129094-1129095,1129155,1129462-1129463,1130863-1130864
-/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1125021-1127636,1129154
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1132405
+/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
 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1102511-1125020

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jun  5 13:43:22 2011
@@ -1,8 +1,8 @@
-/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1081914,1083000
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1128347,1129151
+/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-1131292
 /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-1129091,1129094-1129095,1129155,1129462-1129463,1130863-1130864
-/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1125021-1127636,1129154
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1132405
+/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
 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1102511-1125020

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jun  5 13:43:22 2011
@@ -1,8 +1,8 @@
-/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1081914,1083000
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1128347,1129151
+/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-1131292
 /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-1129091,1129094-1129095,1129155,1129462-1129463,1130863-1130864
-/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1125021-1127636,1129154
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1132405
+/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
 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1102511-1125020

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jun  5 13:43:22 2011
@@ -1,8 +1,8 @@
-/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1081914,1083000
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1128347,1129151
+/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-1131292
 /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-1129091,1129094-1129095,1129155,1129462-1129463,1130863-1130864
-/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1125021-1127636,1129154
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1132405
+/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
 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1102511-1125020

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jun  5 13:43:22 2011
@@ -1,8 +1,8 @@
-/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1081914,1083000
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1128347,1129151
+/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-1131292
 /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-1129091,1129094-1129095,1129155,1129462-1129463,1130863-1130864
-/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1125021-1127636,1129154
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1132405
+/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
 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1102511-1125020

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=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java Sun Jun  5 13:43:22 2011
@@ -257,7 +257,7 @@ public final class CFMetaData
 
     public static CFMetaData newIndexMetadata(CFMetaData parent, ColumnDefinition info, AbstractType columnComparator)
     {
-        return new CFMetaData(parent.ksName, parent.indexName(info), ColumnFamilyType.Standard, columnComparator, null)
+        return new CFMetaData(parent.ksName, parent.indexColumnFamilyName(info), ColumnFamilyType.Standard, columnComparator, null)
                              .keyCacheSize(0.0)
                              .readRepairChance(0.0)
                              .gcGraceSeconds(parent.gcGraceSeconds)
@@ -305,10 +305,18 @@ public final class CFMetaData
         cfIdMap.remove(new Pair<String, String>(cfm.ksName, cfm.cfName));
     }
     
-    /** convention for nameing secondary indexes. */
-    public String indexName(ColumnDefinition info)
+    /**
+     * 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)
     {
-        return cfName + "." + (info.getIndexName() == null ? comparator.getString(info.name) + "_idx" : info.getIndexName());
+        // TODO simplify this when info.index_name is guaranteed to be set
+        return cfName + "." + (info.getIndexName() == null ? ByteBufferUtil.bytesToHex(info.name) : info.getIndexName());
     }
 
     public org.apache.cassandra.db.migration.avro.CfDef deflate()
@@ -369,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);
         }
 
@@ -930,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/trunk/src/java/org/apache/cassandra/config/KSMetaData.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java?rev=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java Sun Jun  5 13:43:22 2011
@@ -68,7 +68,10 @@ public final class KSMetaData
     
     public static Map<String, String> forwardsCompatibleOptions(KsDef ks_def)
     {
-        Map<String, String> options = new HashMap<String, String>(ks_def.strategy_options);
+        Map<String, String> options;
+        options = ks_def.strategy_options == null
+                ? new HashMap<String, String>()
+                : new HashMap<String, String>(ks_def.strategy_options);
         maybeAddReplicationFactor(options, ks_def.strategy_class, ks_def.isSetReplication_factor() ? ks_def.replication_factor : null);
         return options;
     }

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=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/AbstractModification.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/AbstractModification.java Sun Jun  5 13:43:22 2011
@@ -20,7 +20,7 @@
  */
 package org.apache.cassandra.cql;
 
-import org.apache.cassandra.db.RowMutation;
+import org.apache.cassandra.db.IMutation;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.thrift.ConsistencyLevel;
 import org.apache.cassandra.thrift.InvalidRequestException;
@@ -95,8 +95,8 @@ public abstract class AbstractModificati
      *
      * @throws InvalidRequestException on the wrong request
      */
-    public abstract List<RowMutation> prepareRowMutations(String keyspace, ClientState clientState)
-            throws InvalidRequestException;
+    public abstract List<IMutation> prepareRowMutations(String keyspace, ClientState clientState)
+            throws org.apache.cassandra.thrift.InvalidRequestException;
 
     /**
      * Convert statement into a list of mutations to apply on the server
@@ -109,37 +109,6 @@ public abstract class AbstractModificati
      *
      * @throws InvalidRequestException on the wrong request
      */
-    public abstract List<RowMutation> prepareRowMutations(String keyspace, ClientState clientState, Long timestamp)
-            throws InvalidRequestException;
-
-    /**
-     * Compute a row mutation for a single key
-     *
-     * @param key The key for mutation
-     * @param keyspace The keyspace
-     * @param timestamp The global timestamp for mutation
-     *
-     * @return row mutation
-     *
-     * @throws InvalidRequestException on the wrong request
-     */
-    public abstract RowMutation mutationForKey(ByteBuffer key, String keyspace, Long timestamp)
-        throws InvalidRequestException;
-
-    /**
-     * Compute a row mutation for a single key and add it to the given RowMutation object
-     *
-     * @param mutation The row mutation to add computed mutation into
-     * @param keyspace The keyspace
-     * @param timestamp The global timestamp for mutation
-     *
-     * @throws InvalidRequestException on the wrong request
-     */
-    public abstract void mutationForKey(RowMutation mutation, String keyspace, Long timestamp)
-            throws InvalidRequestException;
-
-    /**
-     * @return a list of the keys associated with the statement
-     */
-    public abstract List<Term> getKeys();
+    public abstract List<IMutation> prepareRowMutations(String keyspace, ClientState clientState, Long timestamp)
+            throws org.apache.cassandra.thrift.InvalidRequestException;
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/BatchStatement.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/BatchStatement.java?rev=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/BatchStatement.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/BatchStatement.java Sun Jun  5 13:43:22 2011
@@ -20,23 +20,14 @@
  */
 package org.apache.cassandra.cql;
 
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 
-import org.apache.cassandra.auth.Permission;
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.ColumnFamily;
-import org.apache.cassandra.db.RowMutation;
-import org.apache.cassandra.db.marshal.AbstractType;
+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 static org.apache.cassandra.thrift.ThriftValidation.validateColumnFamily;
-
 /**
  * A <code>BATCH</code> statement parsed from a CQL query.
  *
@@ -85,41 +76,12 @@ public class BatchStatement
         return timeToLive;
     }
 
-    public List<RowMutation> getMutations(String keyspace, ClientState clientState) throws InvalidRequestException
+    public List<IMutation> getMutations(String keyspace, ClientState clientState) throws InvalidRequestException
     {
-        // To avoid unnecessary authorizations.
-        List<String> seenColumnFamilies = new ArrayList<String>();
-
-        List<RowMutation> batch = new LinkedList<RowMutation>();
-
-        for (AbstractModification statement : statements)
-        {
-            final String columnFamily = statement.getColumnFamily();
-
-            authorizeColumnFamily(keyspace, columnFamily, clientState, seenColumnFamilies);
-
-            AbstractType<?> keyValidator = getKeyType(keyspace, columnFamily);
-
-            for (Term rawKey : statement.getKeys()) // for each key of the statement
-            {
-                ByteBuffer key = rawKey.getByteBuffer(keyValidator);
+        List<IMutation> batch = new LinkedList<IMutation>();
 
-                boolean found = false;
-
-                for (RowMutation mutation : batch)
-                {
-                    if (mutation.key().equals(key) && hasColumnFamily(mutation.getColumnFamilies(), columnFamily))
-                    {
-                        statement.mutationForKey(mutation, keyspace, timestamp);
-
-                        found = true;
-                        break;
-                    }
-                }
-
-                if (!found) // if mutation was not found we should add a new one
-                    batch.add(statement.mutationForKey(key, keyspace, timestamp));
-            }
+        for (AbstractModification statement : statements) {
+            batch.addAll(statement.prepareRowMutations(keyspace, clientState, timestamp));
         }
 
         return batch;
@@ -130,34 +92,6 @@ public class BatchStatement
         return timestamp != null;
     }
 
-    private boolean hasColumnFamily(Collection<ColumnFamily> columnFamilies, String columnFamily)
-    {
-        for (ColumnFamily cf : columnFamilies)
-        {
-            if (cf.metadata().cfName.equals(columnFamily))
-                return true;
-        }
-
-        return false;
-    }
-
-    private void authorizeColumnFamily(String keyspace, String columnFamily, ClientState state, List<String> seenCFs)
-    throws InvalidRequestException
-    {
-        validateColumnFamily(keyspace, columnFamily, false);
-
-        if (!seenCFs.contains(columnFamily))
-        {
-            state.hasColumnFamilyAccess(columnFamily, Permission.WRITE);
-            seenCFs.add(columnFamily);
-        }
-    }
-
-    public AbstractType<?> getKeyType(String keyspace, String columnFamily)
-    {
-        return DatabaseDescriptor.getCFMetaData(keyspace, columnFamily).getKeyValidator();
-    }
-
     public String toString()
     {
         return String.format("BatchStatement(statements=%s, consistency=%s)", statements, consistency);

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=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g Sun Jun  5 13:43:22 2011
@@ -35,6 +35,8 @@ options {
     import java.util.ArrayList;
     import org.apache.cassandra.thrift.ConsistencyLevel;
     import org.apache.cassandra.thrift.InvalidRequestException;
+
+    import static org.apache.cassandra.cql.AlterTableStatement.OperationType;
 }
 
 @members {
@@ -111,8 +113,10 @@ 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); }
     ;
 
 // USE <KEYSPACE>;
@@ -288,12 +292,12 @@ batchStatementObjective returns [Abstrac
 updateStatement returns [UpdateStatement expr]
     : {
           Attributes attrs = new Attributes();
-          Map<Term, Term> columns = new HashMap<Term, Term>();
+          Map<Term, Operation> columns = new HashMap<Term, Operation>();
           List<Term> keyList = null;
       }
       K_UPDATE columnFamily=( IDENT | STRING_LITERAL | INTEGER )
           ( usingClause[attrs] )?
-          K_SET termPair[columns] (',' termPair[columns])*
+          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; } ')' )
@@ -380,19 +384,49 @@ 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]
     : K_DROP K_KEYSPACE name=( IDENT | STRING_LITERAL | INTEGER ) endStmnt { $ksp = $name.text; }
     ;
 
+
+alterTableStatement returns [AlterTableStatement expr]
+    :
+    {
+        OperationType type = null;
+        String columnFamily = null, columnName = null, validator = null;
+    }
+    K_ALTER K_TABLE name=( IDENT | STRING_LITERAL | INTEGER ) { columnFamily = $name.text; }
+          ( K_ALTER { type = OperationType.ALTER; }
+               (col=( IDENT | STRING_LITERAL | INTEGER ) { columnName = $col.text; })
+               K_TYPE alterValidator=comparatorType { validator = $alterValidator.text; }
+          | K_ADD { type = OperationType.ADD; }
+               (col=( IDENT | STRING_LITERAL | INTEGER ) { columnName = $col.text; })
+               addValidator=comparatorType { validator = $addValidator.text; }
+          | K_DROP { type = OperationType.DROP; }
+               (col=( IDENT | STRING_LITERAL | INTEGER ) { columnName = $col.text; }))
+    endStmnt
+      {
+          $expr = new AlterTableStatement(columnFamily, type, columnName, validator);
+      }
+    ;
 /** DROP COLUMNFAMILY <CF>; */
 dropColumnFamilyStatement returns [String cfam]
     : K_DROP K_COLUMNFAMILY name=( IDENT | STRING_LITERAL | INTEGER ) endStmnt { $cfam = $name.text; }
     ;
 
 comparatorType
-    : 'bytea' | 'ascii' | 'text' | 'varchar' | 'int' | 'varint' | 'bigint' | 'uuid'
+    : 'bytea' | 'ascii' | 'text' | 'varchar' | 'int' | 'varint' | 'bigint' | 'uuid' | 'counter'
     ;
 
 term returns [Term item]
@@ -409,6 +443,12 @@ termPair[Map<Term, Term> columns]
     :   key=term '=' value=term { columns.put(key, value); }
     ;
 
+termPairWithOperation[Map<Term, Operation> columns]
+    : key=term '=' (value=term { columns.put(key, new Operation(value)); }
+		    | c=term ( '+' v=term { columns.put(key, new Operation(c, org.apache.cassandra.cql.Operation.OperationType.PLUS, v)); }
+                            | '-' v=term { columns.put(key, new Operation(c, org.apache.cassandra.cql.Operation.OperationType.MINUS, v)); } ))
+    ;
+
 // Note: ranges are inclusive so >= and >, and < and <= all have the same semantics.  
 relation returns [Relation rel]
     : { Term entity = new Term("KEY", STRING_LITERAL); }
@@ -468,6 +508,10 @@ K_INTO:        I N T O;
 K_VALUES:      V A L U E S;
 K_TIMESTAMP:   T I M E S T A M P;
 K_TTL:         T T L;
+K_ALTER:       A L T E R;
+K_TABLE:       T A B L E;
+K_ADD:         A D D;
+K_TYPE:        T Y P E;
 
 // Case-insensitive alpha characters
 fragment A: ('a'|'A');

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=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java Sun Jun  5 13:43:22 2011
@@ -58,7 +58,7 @@ public class CreateColumnFamilyStatement
     private static final String KW_ROW_CACHE_PROVIDER = "row_cache_provider";
     
     // Maps CQL short names to the respective Cassandra comparator/validator class names
-    private static final Map<String, String> comparators = new HashMap<String, String>();
+    public  static final Map<String, String> comparators = new HashMap<String, String>();
     private static final Set<String> keywords = new HashSet<String>();
     
     static
@@ -71,6 +71,7 @@ public class CreateColumnFamilyStatement
         comparators.put("int", "LongType");
         comparators.put("bigint", "LongType");
         comparators.put("uuid", "UUIDType");
+        comparators.put("counter", "CounterColumnType");
 
         keywords.add(KW_COMPARATOR);
         keywords.add(KW_COMMENT);

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=1132406&r1=1132405&r2=1132406&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/DeleteStatement.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/DeleteStatement.java Sun Jun  5 13:43:22 2011
@@ -27,6 +27,7 @@ import java.util.List;
 import org.apache.cassandra.auth.Permission;
 import org.apache.cassandra.config.CFMetaData;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.IMutation;
 import org.apache.cassandra.db.RowMutation;
 import org.apache.cassandra.db.filter.QueryPath;
 import org.apache.cassandra.db.marshal.AbstractType;
@@ -66,18 +67,18 @@ public class DeleteStatement extends Abs
     }
 
     /** {@inheritDoc} */
-    public List<RowMutation> prepareRowMutations(String keyspace, ClientState clientState) throws InvalidRequestException
+    public List<IMutation> prepareRowMutations(String keyspace, ClientState clientState) throws InvalidRequestException
     {
         return prepareRowMutations(keyspace, clientState, null);
     }
 
     /** {@inheritDoc} */
-    public List<RowMutation> prepareRowMutations(String keyspace, ClientState clientState, Long timestamp) throws InvalidRequestException
+    public List<IMutation> prepareRowMutations(String keyspace, ClientState clientState, Long timestamp) throws InvalidRequestException
     {
         clientState.hasColumnFamilyAccess(columnFamily, Permission.WRITE);
         AbstractType<?> keyType = DatabaseDescriptor.getCFMetaData(keyspace, columnFamily).getKeyValidator();
 
-        List<RowMutation> rowMutations = new ArrayList<RowMutation>();
+        List<IMutation> rowMutations = new ArrayList<IMutation>();
 
         for (Term key : keys)
         {
@@ -100,7 +101,8 @@ public class DeleteStatement extends Abs
     /** {@inheritDoc} */
     public void mutationForKey(RowMutation mutation, String keyspace, Long timestamp) throws InvalidRequestException
     {
-        CFMetaData metadata = validateColumnFamily(keyspace, columnFamily, false);
+        CFMetaData metadata = validateColumnFamily(keyspace, columnFamily);
+
         AbstractType comparator = metadata.getComparatorFor(null);
 
         if (columns.size() < 1) // No columns, delete the row