Extend native protocol request flags, add versions to SUPPORTED, and introduce 
ProtocolVersion enum

patch by Stefania Alborghetti; reviewed by Benjamin Lerer for CASSANDRA-12838


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/e0adc166
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/e0adc166
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/e0adc166

Branch: refs/heads/cassandra-3.X
Commit: e0adc166a33033c9d2668547803a1e034c2c2494
Parents: 0a1f1c8
Author: Stefania Alborghetti <stefania.alborghe...@datastax.com>
Authored: Tue Oct 25 16:01:40 2016 +0800
Committer: Stefania Alborghetti <stefania.alborghe...@datastax.com>
Committed: Mon Oct 31 21:14:42 2016 +0800

----------------------------------------------------------------------
 CHANGES.txt                                     |   1 +
 doc/native_protocol_v5.spec                     |  13 +-
 ...driver-internal-only-3.7.0.post0-2481531.zip | Bin 0 -> 252057 bytes
 ...driver-internal-only-3.7.0.post0-70f41b5.zip | Bin 252036 -> 0 bytes
 .../org/apache/cassandra/cql3/CQL3Type.java     |  20 +--
 .../apache/cassandra/cql3/ColumnCondition.java  |  14 +-
 .../org/apache/cassandra/cql3/Constants.java    |   3 +-
 src/java/org/apache/cassandra/cql3/Lists.java   |   8 +-
 src/java/org/apache/cassandra/cql3/Maps.java    |   8 +-
 .../org/apache/cassandra/cql3/QueryOptions.java |  46 +++---
 .../apache/cassandra/cql3/QueryProcessor.java   |   5 +-
 .../org/apache/cassandra/cql3/ResultSet.java    |  61 ++++++--
 src/java/org/apache/cassandra/cql3/Sets.java    |   8 +-
 src/java/org/apache/cassandra/cql3/Term.java    |   3 +-
 src/java/org/apache/cassandra/cql3/Tuples.java  |   5 +-
 .../apache/cassandra/cql3/UntypedResultSet.java |   4 +-
 .../org/apache/cassandra/cql3/UserTypes.java    |   3 +-
 .../cassandra/cql3/functions/AggregateFcts.java |  81 +++++-----
 .../cql3/functions/AggregateFunction.java       |   8 +-
 .../cql3/functions/BytesConversionFcts.java     |   9 +-
 .../cassandra/cql3/functions/CastFcts.java      |   8 +-
 .../cassandra/cql3/functions/FromJsonFct.java   |   3 +-
 .../cassandra/cql3/functions/FunctionCall.java  |   5 +-
 .../cql3/functions/JavaBasedUDFunction.java     |   5 +-
 .../cassandra/cql3/functions/JavaUDF.java       |  23 +--
 .../cql3/functions/ScalarFunction.java          |   3 +-
 .../cql3/functions/ScriptBasedUDFunction.java   |   7 +-
 .../cassandra/cql3/functions/TimeFcts.java      |  25 +--
 .../cassandra/cql3/functions/ToJsonFct.java     |   3 +-
 .../cassandra/cql3/functions/TokenFct.java      |   3 +-
 .../cassandra/cql3/functions/UDAggregate.java   |   5 +-
 .../cql3/functions/UDFByteCodeVerifier.java     |   8 +-
 .../cassandra/cql3/functions/UDFunction.java    |  28 ++--
 .../cassandra/cql3/functions/UDHelper.java      |  15 +-
 .../cassandra/cql3/functions/UuidFcts.java      |   3 +-
 .../selection/AggregateFunctionSelector.java    |   5 +-
 .../cassandra/cql3/selection/FieldSelector.java |   5 +-
 .../cql3/selection/ScalarFunctionSelector.java  |   5 +-
 .../cassandra/cql3/selection/Selection.java     |  18 ++-
 .../cassandra/cql3/selection/Selector.java      |   5 +-
 .../cql3/selection/SimpleSelector.java          |   5 +-
 .../cassandra/cql3/selection/TermSelector.java  |   5 +-
 .../cql3/selection/WritetimeOrTTLSelector.java  |   5 +-
 .../statements/CreateAggregateStatement.java    |   4 +-
 .../cql3/statements/SelectStatement.java        |   5 +-
 .../cassandra/db/PartitionRangeReadCommand.java |   3 +-
 src/java/org/apache/cassandra/db/ReadQuery.java |   5 +-
 .../db/SinglePartitionReadCommand.java          |   7 +-
 .../org/apache/cassandra/db/SystemKeyspace.java |   4 +-
 .../db/marshal/AbstractCompositeType.java       |   3 +-
 .../cassandra/db/marshal/AbstractType.java      |   3 +-
 .../apache/cassandra/db/marshal/AsciiType.java  |   3 +-
 .../cassandra/db/marshal/BooleanType.java       |   3 +-
 .../apache/cassandra/db/marshal/ByteType.java   |   3 +-
 .../apache/cassandra/db/marshal/BytesType.java  |   3 +-
 .../cassandra/db/marshal/CollectionType.java    |   3 +-
 .../db/marshal/ColumnToCollectionType.java      |   3 +-
 .../cassandra/db/marshal/CounterColumnType.java |   3 +-
 .../apache/cassandra/db/marshal/DateType.java   |   3 +-
 .../cassandra/db/marshal/DecimalType.java       |   3 +-
 .../apache/cassandra/db/marshal/DoubleType.java |   3 +-
 .../cassandra/db/marshal/DurationType.java      |   3 +-
 .../db/marshal/DynamicCompositeType.java        |   3 +-
 .../apache/cassandra/db/marshal/FloatType.java  |   3 +-
 .../apache/cassandra/db/marshal/FrozenType.java |   3 +-
 .../cassandra/db/marshal/InetAddressType.java   |   3 +-
 .../apache/cassandra/db/marshal/Int32Type.java  |   3 +-
 .../cassandra/db/marshal/IntegerType.java       |   3 +-
 .../apache/cassandra/db/marshal/ListType.java   |  13 +-
 .../apache/cassandra/db/marshal/LongType.java   |   3 +-
 .../apache/cassandra/db/marshal/MapType.java    |   6 +-
 .../db/marshal/PartitionerDefinedOrder.java     |   3 +-
 .../cassandra/db/marshal/ReversedType.java      |   3 +-
 .../apache/cassandra/db/marshal/SetType.java    |   3 +-
 .../apache/cassandra/db/marshal/ShortType.java  |   3 +-
 .../cassandra/db/marshal/SimpleDateType.java    |   3 +-
 .../apache/cassandra/db/marshal/TimeType.java   |   3 +-
 .../cassandra/db/marshal/TimestampType.java     |   3 +-
 .../apache/cassandra/db/marshal/TupleType.java  |   3 +-
 .../apache/cassandra/db/marshal/UTF8Type.java   |   3 +-
 .../apache/cassandra/db/marshal/UserType.java   |   5 +-
 .../apache/cassandra/schema/SchemaKeyspace.java |   4 +-
 .../serializers/CollectionSerializer.java       |  26 ++--
 .../cassandra/serializers/ListSerializer.java   |  10 +-
 .../cassandra/serializers/MapSerializer.java    |  12 +-
 .../cassandra/serializers/SetSerializer.java    |   6 +-
 .../cassandra/service/StorageService.java       |   5 +-
 .../service/pager/AbstractQueryPager.java       |   5 +-
 .../service/pager/MultiPartitionPager.java      |   3 +-
 .../cassandra/service/pager/PagingState.java    |  24 +--
 .../service/pager/PartitionRangeQueryPager.java |   5 +-
 .../cassandra/service/pager/QueryPagers.java    |   4 +-
 .../service/pager/SinglePartitionPager.java     |   5 +-
 .../org/apache/cassandra/transport/CBCodec.java |   6 +-
 .../org/apache/cassandra/transport/CBUtil.java  |   8 +-
 .../org/apache/cassandra/transport/Client.java  |   6 +-
 .../apache/cassandra/transport/Connection.java  |   8 +-
 .../apache/cassandra/transport/DataType.java    |  80 +++++-----
 .../org/apache/cassandra/transport/Event.java   |  58 +++----
 .../org/apache/cassandra/transport/Frame.java   |  42 ++---
 .../org/apache/cassandra/transport/Message.java |  23 +--
 .../apache/cassandra/transport/OptionCodec.java |  26 ++--
 .../cassandra/transport/ProtocolException.java  |  17 +--
 .../cassandra/transport/ProtocolVersion.java    | 153 +++++++++++++++++++
 .../org/apache/cassandra/transport/Server.java  |   9 +-
 .../cassandra/transport/ServerConnection.java   |   6 +-
 .../cassandra/transport/SimpleClient.java       |  14 +-
 .../transport/messages/AuthChallenge.java       |   7 +-
 .../transport/messages/AuthResponse.java        |   8 +-
 .../transport/messages/AuthSuccess.java         |   7 +-
 .../transport/messages/AuthenticateMessage.java |   7 +-
 .../transport/messages/BatchMessage.java        |  10 +-
 .../transport/messages/CredentialsMessage.java  |   9 +-
 .../transport/messages/ErrorMessage.java        |  26 ++--
 .../transport/messages/EventMessage.java        |   7 +-
 .../transport/messages/ExecuteMessage.java      |  10 +-
 .../transport/messages/OptionsMessage.java      |   8 +-
 .../transport/messages/PrepareMessage.java      |   6 +-
 .../transport/messages/QueryMessage.java        |  11 +-
 .../transport/messages/ReadyMessage.java        |   7 +-
 .../transport/messages/RegisterMessage.java     |   8 +-
 .../transport/messages/ResultMessage.java       |  42 ++---
 .../transport/messages/StartupMessage.java      |   9 +-
 .../transport/messages/SupportedMessage.java    |   7 +-
 .../cassandra/cql3/functions/JavaSourceUDF.txt  |   5 +-
 .../org/apache/cassandra/cql3/ViewLongTest.java |   3 +-
 test/unit/org/apache/cassandra/Util.java        |  23 +++
 .../cassandra/cql3/CQL3TypeLiteralTest.java     |  26 ++--
 .../org/apache/cassandra/cql3/CQLTester.java    |  70 +++++----
 .../cassandra/cql3/ViewFilteringTest.java       |   3 +-
 .../apache/cassandra/cql3/ViewSchemaTest.java   |   3 +-
 .../org/apache/cassandra/cql3/ViewTest.java     |   3 +-
 .../cassandra/cql3/functions/TimeFctsTest.java  |   4 +-
 .../validation/entities/UFPureScriptTest.java   |   5 +-
 .../UFPureScriptTupleCollectionTest.java        |   6 +-
 .../cql3/validation/entities/UFTest.java        |  25 +--
 .../entities/udfverify/CallClone.java           |   5 +-
 .../entities/udfverify/CallComDatastax.java     |   5 +-
 .../entities/udfverify/CallFinalize.java        |   5 +-
 .../entities/udfverify/CallOrgApache.java       |   5 +-
 .../entities/udfverify/ClassWithField.java      |   5 +-
 .../udfverify/ClassWithInitializer.java         |   5 +-
 .../udfverify/ClassWithInitializer2.java        |   5 +-
 .../udfverify/ClassWithInitializer3.java        |   5 +-
 .../entities/udfverify/ClassWithInnerClass.java |   5 +-
 .../udfverify/ClassWithInnerClass2.java         |   5 +-
 .../udfverify/ClassWithStaticInitializer.java   |   5 +-
 .../udfverify/ClassWithStaticInnerClass.java    |   5 +-
 .../entities/udfverify/GoodClass.java           |   5 +-
 .../entities/udfverify/UseOfSynchronized.java   |   5 +-
 .../udfverify/UseOfSynchronizedWithNotify.java  |   5 +-
 .../UseOfSynchronizedWithNotifyAll.java         |   5 +-
 .../udfverify/UseOfSynchronizedWithWait.java    |   5 +-
 .../udfverify/UseOfSynchronizedWithWaitL.java   |   5 +-
 .../udfverify/UseOfSynchronizedWithWaitLI.java  |   5 +-
 .../entities/udfverify/UsingMapEntry.java       |   5 +-
 .../validation/operations/AggregationTest.java  |  10 +-
 .../cql3/validation/operations/AlterTest.java   |   6 +-
 .../apache/cassandra/index/CustomIndexTest.java |  24 +--
 .../cassandra/service/ClientWarningsTest.java   |  10 +-
 .../service/ProtocolBetaVersionTest.java        |  40 ++++-
 .../cassandra/service/QueryPagerTest.java       |  58 +++----
 .../service/pager/PagingStateTest.java          |  47 ++----
 .../cassandra/transport/DataTypeTest.java       |  14 +-
 .../cassandra/transport/ErrorMessageTest.java   |   6 +-
 .../cassandra/transport/MessagePayloadTest.java |   2 +-
 .../cassandra/transport/ProtocolErrorTest.java  |  13 +-
 .../transport/ProtocolVersionTest.java          |  97 ++++++++++++
 .../cassandra/transport/SerDeserTest.java       | 138 +++++++++++++----
 .../cassandra/utils/CassandraVersionTest.java   |  14 +-
 170 files changed, 1324 insertions(+), 821 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 82d3d9c..1b16518 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.10
+ * Extend native protocol request flags, add versions to SUPPORTED, and 
introduce ProtocolVersion enum (CASSANDRA-12838)
  * Set JOINING mode when running pre-join tasks (CASSANDRA-12836)
  * remove net.mintern.primitive library due to license issue (CASSANDRA-12845)
  * Properly format IPv6 addresses when logging JMX service URL 
(CASSANDRA-12454)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/doc/native_protocol_v5.spec
----------------------------------------------------------------------
diff --git a/doc/native_protocol_v5.spec b/doc/native_protocol_v5.spec
index bbde714..35dd2d7 100644
--- a/doc/native_protocol_v5.spec
+++ b/doc/native_protocol_v5.spec
@@ -317,7 +317,7 @@ Table of Contents
     
<consistency><flags>[<n>[name_1]<value_1>...[name_n]<value_n>][<result_page_size>][<paging_state>][<serial_consistency>][<timestamp>]
   where:
     - <consistency> is the [consistency] level for the operation.
-    - <flags> is a [byte] whose bits define the options for this query and
+    - <flags> is a [int] whose bits define the options for this query and
       in particular influence what the remainder of the message contains.
       A flag is set if the bit corresponding to its `mask` is set. Supported
       flags are, given their mask:
@@ -398,7 +398,7 @@ Table of Contents
         - If <type> == 1, the batch will be "unlogged".
         - If <type> == 2, the batch will be a "counter" batch (and non-counter
           statements will be rejected).
-    - <flags> is a [byte] whose bits define the options for this query and
+    - <flags> is a [int] whose bits define the options for this query and
       in particular influence what the remainder of the message contains. It 
is similar
       to the <flags> from QUERY and EXECUTE methods, except that the 4 
rightmost
       bits must always be 0 as their corresponding options do not make sense 
for
@@ -514,7 +514,12 @@ Table of Contents
   comes as a response to an OPTIONS message.
 
   The body of a SUPPORTED message is a [string multimap]. This multimap gives
-  for each of the supported STARTUP options, the list of supported values.
+  for each of the supported STARTUP options, the list of supported values. It
+  also includes:
+      - "PROTOCOL_VERSIONS": the list of native protocol versions that are
+      supported, encoded as the version number followed by a slash and the
+      version description. For example: 3/v3, 4/v4, 5/v5-beta. If a version is
+      in beta, it will have the word "beta" in its description.
 
 
 4.2.5. RESULT
@@ -1175,3 +1180,5 @@ Table of Contents
   * <numfailures> in Read_failure and Write_failure error message bodies 
(Section 9)
     has been replaced with <reasonmap>. The <reasonmap> maps node IP addresses 
to
     a failure reason code which indicates why the request failed on that node.
+  * Enlarged flag's bitmaps for QUERY, EXECUTE and BATCH messages from [byte] 
to [int]
+    (Sections 4.1.4, 4.1.6 and 4.1.7).

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/lib/cassandra-driver-internal-only-3.7.0.post0-2481531.zip
----------------------------------------------------------------------
diff --git a/lib/cassandra-driver-internal-only-3.7.0.post0-2481531.zip 
b/lib/cassandra-driver-internal-only-3.7.0.post0-2481531.zip
new file mode 100644
index 0000000..11d5944
Binary files /dev/null and 
b/lib/cassandra-driver-internal-only-3.7.0.post0-2481531.zip differ

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/lib/cassandra-driver-internal-only-3.7.0.post0-70f41b5.zip
----------------------------------------------------------------------
diff --git a/lib/cassandra-driver-internal-only-3.7.0.post0-70f41b5.zip 
b/lib/cassandra-driver-internal-only-3.7.0.post0-70f41b5.zip
deleted file mode 100644
index 4bbe903..0000000
Binary files a/lib/cassandra-driver-internal-only-3.7.0.post0-70f41b5.zip and 
/dev/null differ

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/CQL3Type.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/CQL3Type.java 
b/src/java/org/apache/cassandra/cql3/CQL3Type.java
index 94b8f6d..20f3e2d 100644
--- a/src/java/org/apache/cassandra/cql3/CQL3Type.java
+++ b/src/java/org/apache/cassandra/cql3/CQL3Type.java
@@ -34,6 +34,7 @@ import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.Types;
 import org.apache.cassandra.serializers.CollectionSerializer;
 import org.apache.cassandra.serializers.MarshalException;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 public interface CQL3Type
@@ -54,12 +55,11 @@ public interface CQL3Type
 
     /**
      * Generates CQL literal from a binary value of this type.
-     *
-     * @param buffer the value to convert to a CQL literal. This value must be
+     *  @param buffer the value to convert to a CQL literal. This value must be
      * serialized with {@code version} of the native protocol.
      * @param version the native protocol version in which {@code buffer} is 
encoded.
      */
-    public String toCQLLiteral(ByteBuffer buffer, int version);
+    public String toCQLLiteral(ByteBuffer buffer, ProtocolVersion version);
 
     public enum Native implements CQL3Type
     {
@@ -105,7 +105,7 @@ public interface CQL3Type
          * {@link 
org.apache.cassandra.serializers.TypeSerializer#toString(Object)}
          * {@link 
org.apache.cassandra.serializers.TypeSerializer#deserialize(ByteBuffer)} 
implementations.
          */
-        public String toCQLLiteral(ByteBuffer buffer, int version)
+        public String toCQLLiteral(ByteBuffer buffer, ProtocolVersion version)
         {
             return type.getSerializer().toCQLLiteral(buffer);
         }
@@ -136,7 +136,7 @@ public interface CQL3Type
             return type;
         }
 
-        public String toCQLLiteral(ByteBuffer buffer, int version)
+        public String toCQLLiteral(ByteBuffer buffer, ProtocolVersion version)
         {
             // *always* use the 'blob' syntax to express custom types in CQL
             return Native.BLOB.toCQLLiteral(buffer, version);
@@ -184,7 +184,7 @@ public interface CQL3Type
             return true;
         }
 
-        public String toCQLLiteral(ByteBuffer buffer, int version)
+        public String toCQLLiteral(ByteBuffer buffer, ProtocolVersion version)
         {
             if (buffer == null)
                 return "null";
@@ -216,7 +216,7 @@ public interface CQL3Type
             return target.toString();
         }
 
-        private void generateMapCQLLiteral(ByteBuffer buffer, int version, 
StringBuilder target, int size)
+        private void generateMapCQLLiteral(ByteBuffer buffer, ProtocolVersion 
version, StringBuilder target, int size)
         {
             CQL3Type keys = ((MapType) type).getKeysType().asCQL3Type();
             CQL3Type values = ((MapType) type).getValuesType().asCQL3Type();
@@ -232,7 +232,7 @@ public interface CQL3Type
             }
         }
 
-        private static void generateSetOrListCQLLiteral(ByteBuffer buffer, int 
version, StringBuilder target, int size, CQL3Type elements)
+        private static void generateSetOrListCQLLiteral(ByteBuffer buffer, 
ProtocolVersion version, StringBuilder target, int size, CQL3Type elements)
         {
             for (int i = 0; i < size; i++)
             {
@@ -316,7 +316,7 @@ public interface CQL3Type
             return type;
         }
 
-        public String toCQLLiteral(ByteBuffer buffer, int version)
+        public String toCQLLiteral(ByteBuffer buffer, ProtocolVersion version)
         {
             if (buffer == null)
                 return "null";
@@ -404,7 +404,7 @@ public interface CQL3Type
             return type;
         }
 
-        public String toCQLLiteral(ByteBuffer buffer, int version)
+        public String toCQLLiteral(ByteBuffer buffer, ProtocolVersion version)
         {
             if (buffer == null)
                 return "null";

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/ColumnCondition.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/ColumnCondition.java 
b/src/java/org/apache/cassandra/cql3/ColumnCondition.java
index 304f8bc..07f9f60 100644
--- a/src/java/org/apache/cassandra/cql3/ColumnCondition.java
+++ b/src/java/org/apache/cassandra/cql3/ColumnCondition.java
@@ -28,7 +28,7 @@ import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.exceptions.InvalidRequestException;
-import org.apache.cassandra.transport.Server;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 /**
@@ -508,11 +508,11 @@ public class ColumnCondition
             // make sure we use v3 serialization format for comparison
             ByteBuffer conditionValue;
             if (type.kind == CollectionType.Kind.LIST)
-                conditionValue = ((Lists.Value) value).get(Server.VERSION_3);
+                conditionValue = ((Lists.Value) value).get(ProtocolVersion.V3);
             else if (type.kind == CollectionType.Kind.SET)
-                conditionValue = ((Sets.Value) value).get(Server.VERSION_3);
+                conditionValue = ((Sets.Value) value).get(ProtocolVersion.V3);
             else
-                conditionValue = ((Maps.Value) value).get(Server.VERSION_3);
+                conditionValue = ((Maps.Value) value).get(ProtocolVersion.V3);
 
             return compareWithOperator(operator, type, conditionValue, 
cell.value());
         }
@@ -680,7 +680,7 @@ public class ColumnCondition
                         if (cell == null)
                             return true;
                     }
-                    else if (type.compare(value.get(Server.VERSION_3), 
cell.value()) == 0)
+                    else if (type.compare(value.get(ProtocolVersion.V3), 
cell.value()) == 0)
                     {
                         return true;
                     }
@@ -782,7 +782,7 @@ public class ColumnCondition
     static class UDTBound extends Bound
     {
         private final ByteBuffer value;
-        private final int protocolVersion;
+        private final ProtocolVersion protocolVersion;
 
         private UDTBound(ColumnCondition condition, QueryOptions options) 
throws InvalidRequestException
         {
@@ -826,7 +826,7 @@ public class ColumnCondition
     public static class UDTInBound extends Bound
     {
         private final List<ByteBuffer> inValues;
-        private final int protocolVersion;
+        private final ProtocolVersion protocolVersion;
 
         private UDTInBound(ColumnCondition condition, QueryOptions options) 
throws InvalidRequestException
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/Constants.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Constants.java 
b/src/java/org/apache/cassandra/cql3/Constants.java
index c701b71..03e2053 100644
--- a/src/java/org/apache/cassandra/cql3/Constants.java
+++ b/src/java/org/apache/cassandra/cql3/Constants.java
@@ -26,6 +26,7 @@ import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.serializers.MarshalException;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 /**
@@ -312,7 +313,7 @@ public abstract class Constants
             this.bytes = bytes;
         }
 
-        public ByteBuffer get(int protocolVersion)
+        public ByteBuffer get(ProtocolVersion protocolVersion)
         {
             return bytes;
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/Lists.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Lists.java 
b/src/java/org/apache/cassandra/cql3/Lists.java
index ad0af6d..037162b 100644
--- a/src/java/org/apache/cassandra/cql3/Lists.java
+++ b/src/java/org/apache/cassandra/cql3/Lists.java
@@ -35,7 +35,7 @@ import org.apache.cassandra.db.marshal.ListType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.serializers.CollectionSerializer;
 import org.apache.cassandra.serializers.MarshalException;
-import org.apache.cassandra.transport.Server;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.UUIDGen;
 
@@ -141,7 +141,7 @@ public abstract class Lists
             this.elements = elements;
         }
 
-        public static Value fromSerialized(ByteBuffer value, ListType type, 
int version) throws InvalidRequestException
+        public static Value fromSerialized(ByteBuffer value, ListType type, 
ProtocolVersion version) throws InvalidRequestException
         {
             try
             {
@@ -160,7 +160,7 @@ public abstract class Lists
             }
         }
 
-        public ByteBuffer get(int protocolVersion)
+        public ByteBuffer get(ProtocolVersion protocolVersion)
         {
             return CollectionSerializer.pack(elements, elements.size(), 
protocolVersion);
         }
@@ -412,7 +412,7 @@ public abstract class Lists
                 if (value == null)
                     params.addTombstone(column);
                 else
-                    params.addCell(column, value.get(Server.CURRENT_VERSION));
+                    params.addCell(column, value.get(ProtocolVersion.CURRENT));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/Maps.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Maps.java 
b/src/java/org/apache/cassandra/cql3/Maps.java
index 952bff0..5c3bc44 100644
--- a/src/java/org/apache/cassandra/cql3/Maps.java
+++ b/src/java/org/apache/cassandra/cql3/Maps.java
@@ -31,7 +31,7 @@ import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.serializers.CollectionSerializer;
 import org.apache.cassandra.serializers.MarshalException;
-import org.apache.cassandra.transport.Server;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.Pair;
 
@@ -161,7 +161,7 @@ public abstract class Maps
             this.map = map;
         }
 
-        public static Value fromSerialized(ByteBuffer value, MapType type, int 
version) throws InvalidRequestException
+        public static Value fromSerialized(ByteBuffer value, MapType type, 
ProtocolVersion version) throws InvalidRequestException
         {
             try
             {
@@ -179,7 +179,7 @@ public abstract class Maps
             }
         }
 
-        public ByteBuffer get(int protocolVersion)
+        public ByteBuffer get(ProtocolVersion protocolVersion)
         {
             List<ByteBuffer> buffers = new ArrayList<>(2 * map.size());
             for (Map.Entry<ByteBuffer, ByteBuffer> entry : map.entrySet())
@@ -374,7 +374,7 @@ public abstract class Maps
                 if (value == null)
                     params.addTombstone(column);
                 else
-                    params.addCell(column, value.get(Server.CURRENT_VERSION));
+                    params.addCell(column, value.get(ProtocolVersion.CURRENT));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/QueryOptions.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/QueryOptions.java 
b/src/java/org/apache/cassandra/cql3/QueryOptions.java
index e6cda89..1ba8f89 100644
--- a/src/java/org/apache/cassandra/cql3/QueryOptions.java
+++ b/src/java/org/apache/cassandra/cql3/QueryOptions.java
@@ -21,6 +21,7 @@ import java.nio.ByteBuffer;
 import java.util.*;
 
 import com.google.common.collect.ImmutableList;
+
 import io.netty.buffer.ByteBuf;
 
 import org.apache.cassandra.config.ColumnDefinition;
@@ -32,7 +33,7 @@ import org.apache.cassandra.service.pager.PagingState;
 import org.apache.cassandra.transport.CBCodec;
 import org.apache.cassandra.transport.CBUtil;
 import org.apache.cassandra.transport.ProtocolException;
-import org.apache.cassandra.transport.Server;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.Pair;
 
 /**
@@ -44,7 +45,7 @@ public abstract class QueryOptions
                                                                        
Collections.<ByteBuffer>emptyList(),
                                                                        false,
                                                                        
SpecificOptions.DEFAULT,
-                                                                       
Server.CURRENT_VERSION);
+                                                                       
ProtocolVersion.CURRENT);
 
     public static final CBCodec<QueryOptions> codec = new Codec();
 
@@ -53,27 +54,27 @@ public abstract class QueryOptions
 
     public static QueryOptions fromThrift(ConsistencyLevel consistency, 
List<ByteBuffer> values)
     {
-        return new DefaultQueryOptions(consistency, values, false, 
SpecificOptions.DEFAULT, Server.VERSION_3);
+        return new DefaultQueryOptions(consistency, values, false, 
SpecificOptions.DEFAULT, ProtocolVersion.V3);
     }
 
     public static QueryOptions forInternalCalls(ConsistencyLevel consistency, 
List<ByteBuffer> values)
     {
-        return new DefaultQueryOptions(consistency, values, false, 
SpecificOptions.DEFAULT, Server.VERSION_3);
+        return new DefaultQueryOptions(consistency, values, false, 
SpecificOptions.DEFAULT, ProtocolVersion.V3);
     }
 
     public static QueryOptions forInternalCalls(List<ByteBuffer> values)
     {
-        return new DefaultQueryOptions(ConsistencyLevel.ONE, values, false, 
SpecificOptions.DEFAULT, Server.VERSION_3);
+        return new DefaultQueryOptions(ConsistencyLevel.ONE, values, false, 
SpecificOptions.DEFAULT, ProtocolVersion.V3);
     }
 
-    public static QueryOptions forProtocolVersion(int protocolVersion)
+    public static QueryOptions forProtocolVersion(ProtocolVersion 
protocolVersion)
     {
         return new DefaultQueryOptions(null, null, true, null, 
protocolVersion);
     }
 
-    public static QueryOptions create(ConsistencyLevel consistency, 
List<ByteBuffer> values, boolean skipMetadata, int pageSize, PagingState 
pagingState, ConsistencyLevel serialConsistency)
+    public static QueryOptions create(ConsistencyLevel consistency, 
List<ByteBuffer> values, boolean skipMetadata, int pageSize, PagingState 
pagingState, ConsistencyLevel serialConsistency, ProtocolVersion version)
     {
-        return new DefaultQueryOptions(consistency, values, skipMetadata, new 
SpecificOptions(pageSize, pagingState, serialConsistency, -1L), 0);
+        return new DefaultQueryOptions(consistency, values, skipMetadata, new 
SpecificOptions(pageSize, pagingState, serialConsistency, -1L), version);
     }
 
     public static QueryOptions addColumnSpecifications(QueryOptions options, 
List<ColumnSpecification> columnSpecs)
@@ -180,7 +181,7 @@ public abstract class QueryOptions
      * The protocol version for the query. Will be 3 if the object don't come 
from
      * a native protocol request (i.e. it's been allocated locally or by 
CQL-over-thrift).
      */
-    public abstract int getProtocolVersion();
+    public abstract ProtocolVersion getProtocolVersion();
 
     // Mainly for the sake of BatchQueryOptions
     abstract SpecificOptions getSpecificOptions();
@@ -198,9 +199,9 @@ public abstract class QueryOptions
 
         private final SpecificOptions options;
 
-        private final transient int protocolVersion;
+        private final transient ProtocolVersion protocolVersion;
 
-        DefaultQueryOptions(ConsistencyLevel consistency, List<ByteBuffer> 
values, boolean skipMetadata, SpecificOptions options, int protocolVersion)
+        DefaultQueryOptions(ConsistencyLevel consistency, List<ByteBuffer> 
values, boolean skipMetadata, SpecificOptions options, ProtocolVersion 
protocolVersion)
         {
             this.consistency = consistency;
             this.values = values;
@@ -224,7 +225,7 @@ public abstract class QueryOptions
             return skipMetadata;
         }
 
-        public int getProtocolVersion()
+        public ProtocolVersion getProtocolVersion()
         {
             return protocolVersion;
         }
@@ -259,7 +260,7 @@ public abstract class QueryOptions
             return wrapped.skipMetadata();
         }
 
-        public int getProtocolVersion()
+        public ProtocolVersion getProtocolVersion()
         {
             return wrapped.getProtocolVersion();
         }
@@ -364,7 +365,7 @@ public abstract class QueryOptions
 
     private static class Codec implements CBCodec<QueryOptions>
     {
-        private static enum Flag
+        private enum Flag
         {
             // The order of that enum matters!!
             VALUES,
@@ -397,10 +398,12 @@ public abstract class QueryOptions
             }
         }
 
-        public QueryOptions decode(ByteBuf body, int version)
+        public QueryOptions decode(ByteBuf body, ProtocolVersion version)
         {
             ConsistencyLevel consistency = CBUtil.readConsistencyLevel(body);
-            EnumSet<Flag> flags = Flag.deserialize((int)body.readByte());
+            EnumSet<Flag> flags = 
Flag.deserialize(version.isGreaterOrEqualTo(ProtocolVersion.V5)
+                                                   ? 
(int)body.readUnsignedInt()
+                                                   : (int)body.readByte());
 
             List<ByteBuffer> values = Collections.<ByteBuffer>emptyList();
             List<String> names = null;
@@ -443,12 +446,15 @@ public abstract class QueryOptions
             return names == null ? opts : new OptionsWithNames(opts, names);
         }
 
-        public void encode(QueryOptions options, ByteBuf dest, int version)
+        public void encode(QueryOptions options, ByteBuf dest, ProtocolVersion 
version)
         {
             CBUtil.writeConsistencyLevel(options.getConsistency(), dest);
 
             EnumSet<Flag> flags = gatherFlags(options);
-            dest.writeByte((byte)Flag.serialize(flags));
+            if (version.isGreaterOrEqualTo(ProtocolVersion.V5))
+                dest.writeInt(Flag.serialize(flags));
+            else
+                dest.writeByte((byte)Flag.serialize(flags));
 
             if (flags.contains(Flag.VALUES))
                 CBUtil.writeValueList(options.getValues(), dest);
@@ -466,14 +472,14 @@ public abstract class QueryOptions
             // don't bother.
         }
 
-        public int encodedSize(QueryOptions options, int version)
+        public int encodedSize(QueryOptions options, ProtocolVersion version)
         {
             int size = 0;
 
             size += CBUtil.sizeOfConsistencyLevel(options.getConsistency());
 
             EnumSet<Flag> flags = gatherFlags(options);
-            size += 1;
+            size += (version.isGreaterOrEqualTo(ProtocolVersion.V5) ? 4 : 1);
 
             if (flags.contains(Flag.VALUES))
                 size += CBUtil.sizeOfValueList(options.getValues());

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/QueryProcessor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java 
b/src/java/org/apache/cassandra/cql3/QueryProcessor.java
index 1d5a024..288fd4b 100644
--- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java
+++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java
@@ -35,7 +35,6 @@ import org.slf4j.LoggerFactory;
 import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
 import org.antlr.runtime.*;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.Schema;
 import org.apache.cassandra.config.SchemaConstants;
@@ -53,7 +52,7 @@ import org.apache.cassandra.service.*;
 import org.apache.cassandra.service.pager.QueryPager;
 import org.apache.cassandra.thrift.ThriftClientState;
 import org.apache.cassandra.tracing.Tracing;
-import org.apache.cassandra.transport.Server;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.*;
 
@@ -342,7 +341,7 @@ public class QueryProcessor implements QueryHandler
             throw new IllegalArgumentException("Only SELECTs can be paged");
 
         SelectStatement select = (SelectStatement)prepared.statement;
-        QueryPager pager = select.getQuery(makeInternalOptions(prepared, 
values), FBUtilities.nowInSeconds()).getPager(null, Server.CURRENT_VERSION);
+        QueryPager pager = select.getQuery(makeInternalOptions(prepared, 
values), FBUtilities.nowInSeconds()).getPager(null, ProtocolVersion.CURRENT);
         return UntypedResultSet.create(select, pager, pageSize);
     }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/ResultSet.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/ResultSet.java 
b/src/java/org/apache/cassandra/cql3/ResultSet.java
index e9a0f42..9659509 100644
--- a/src/java/org/apache/cassandra/cql3/ResultSet.java
+++ b/src/java/org/apache/cassandra/cql3/ResultSet.java
@@ -177,7 +177,7 @@ public class ResultSet
          *   - rows count (4 bytes)
          *   - rows
          */
-        public ResultSet decode(ByteBuf body, int version)
+        public ResultSet decode(ByteBuf body, ProtocolVersion version)
         {
             ResultMetadata m = ResultMetadata.codec.decode(body, version);
             int rowCount = body.readInt();
@@ -191,7 +191,7 @@ public class ResultSet
             return rs;
         }
 
-        public void encode(ResultSet rs, ByteBuf dest, int version)
+        public void encode(ResultSet rs, ByteBuf dest, ProtocolVersion version)
         {
             ResultMetadata.codec.encode(rs.metadata, dest, version);
             dest.writeInt(rs.rows.size());
@@ -204,7 +204,7 @@ public class ResultSet
             }
         }
 
-        public int encodedSize(ResultSet rs, int version)
+        public int encodedSize(ResultSet rs, ProtocolVersion version)
         {
             int size = ResultMetadata.codec.encodedSize(rs.metadata, version) 
+ 4;
             for (List<ByteBuffer> row : rs.rows)
@@ -296,6 +296,29 @@ public class ResultSet
         }
 
         @Override
+        public boolean equals(Object other)
+        {
+            if (this == other)
+                return true;
+
+            if (!(other instanceof ResultMetadata))
+                return false;
+
+            ResultMetadata that = (ResultMetadata) other;
+
+            return Objects.equals(flags, that.flags)
+                   && Objects.equals(names, that.names)
+                   && columnCount == that.columnCount
+                   && Objects.equals(pagingState, that.pagingState);
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return Objects.hash(flags, names, columnCount, pagingState);
+        }
+
+        @Override
         public String toString()
         {
             StringBuilder sb = new StringBuilder();
@@ -320,7 +343,7 @@ public class ResultSet
 
         private static class Codec implements CBCodec<ResultMetadata>
         {
-            public ResultMetadata decode(ByteBuf body, int version)
+            public ResultMetadata decode(ByteBuf body, ProtocolVersion version)
             {
                 // flags & column count
                 int iflags = body.readInt();
@@ -358,13 +381,14 @@ public class ResultSet
                 return new ResultMetadata(flags, names, names.size(), state);
             }
 
-            public void encode(ResultMetadata m, ByteBuf dest, int version)
+            public void encode(ResultMetadata m, ByteBuf dest, ProtocolVersion 
version)
             {
                 boolean noMetadata = m.flags.contains(Flag.NO_METADATA);
                 boolean globalTablesSpec = 
m.flags.contains(Flag.GLOBAL_TABLES_SPEC);
                 boolean hasMorePages = m.flags.contains(Flag.HAS_MORE_PAGES);
 
-                assert version > 1 || (!hasMorePages && !noMetadata): "version 
= " + version + ", flags = " + m.flags;
+                assert version.isGreaterThan(ProtocolVersion.V1) || 
(!hasMorePages && !noMetadata)
+                    : "version = " + version + ", flags = " + m.flags;
 
                 dest.writeInt(Flag.serialize(m.flags));
                 dest.writeInt(m.columnCount);
@@ -394,7 +418,7 @@ public class ResultSet
                 }
             }
 
-            public int encodedSize(ResultMetadata m, int version)
+            public int encodedSize(ResultMetadata m, ProtocolVersion version)
             {
                 boolean noMetadata = m.flags.contains(Flag.NO_METADATA);
                 boolean globalTablesSpec = 
m.flags.contains(Flag.GLOBAL_TABLES_SPEC);
@@ -462,6 +486,9 @@ public class ResultSet
         @Override
         public boolean equals(Object other)
         {
+            if (this == other)
+                return true;
+
             if (!(other instanceof PreparedMetadata))
                 return false;
 
@@ -472,6 +499,12 @@ public class ResultSet
         }
 
         @Override
+        public int hashCode()
+        {
+            return Objects.hash(names, flags) + 
Arrays.hashCode(partitionKeyBindIndexes);
+        }
+
+        @Override
         public String toString()
         {
             StringBuilder sb = new StringBuilder();
@@ -498,7 +531,7 @@ public class ResultSet
 
         private static class Codec implements CBCodec<PreparedMetadata>
         {
-            public PreparedMetadata decode(ByteBuf body, int version)
+            public PreparedMetadata decode(ByteBuf body, ProtocolVersion 
version)
             {
                 // flags & column count
                 int iflags = body.readInt();
@@ -507,7 +540,7 @@ public class ResultSet
                 EnumSet<Flag> flags = Flag.deserialize(iflags);
 
                 short[] partitionKeyBindIndexes = null;
-                if (version >= Server.VERSION_4)
+                if (version.isGreaterOrEqualTo(ProtocolVersion.V4))
                 {
                     int numPKNames = body.readInt();
                     if (numPKNames > 0)
@@ -541,13 +574,13 @@ public class ResultSet
                 return new PreparedMetadata(flags, names, 
partitionKeyBindIndexes);
             }
 
-            public void encode(PreparedMetadata m, ByteBuf dest, int version)
+            public void encode(PreparedMetadata m, ByteBuf dest, 
ProtocolVersion version)
             {
                 boolean globalTablesSpec = 
m.flags.contains(Flag.GLOBAL_TABLES_SPEC);
                 dest.writeInt(Flag.serialize(m.flags));
                 dest.writeInt(m.names.size());
 
-                if (version >= Server.VERSION_4)
+                if (version.isGreaterOrEqualTo(ProtocolVersion.V4))
                 {
                     // there's no point in providing partition key bind 
indexes if the statements affect multiple tables
                     if (m.partitionKeyBindIndexes == null || !globalTablesSpec)
@@ -580,7 +613,7 @@ public class ResultSet
                 }
             }
 
-            public int encodedSize(PreparedMetadata m, int version)
+            public int encodedSize(PreparedMetadata m, ProtocolVersion version)
             {
                 boolean globalTablesSpec = 
m.flags.contains(Flag.GLOBAL_TABLES_SPEC);
                 int size = 8;
@@ -590,7 +623,7 @@ public class ResultSet
                     size += CBUtil.sizeOfString(m.names.get(0).cfName);
                 }
 
-                if (m.partitionKeyBindIndexes != null && version >= 
Server.VERSION_4)
+                if (m.partitionKeyBindIndexes != null && 
version.isGreaterOrEqualTo(ProtocolVersion.V4))
                     size += 4 + 2 * m.partitionKeyBindIndexes.length;
 
                 for (ColumnSpecification name : m.names)
@@ -608,7 +641,7 @@ public class ResultSet
         }
     }
 
-    public static enum Flag
+    public enum Flag
     {
         // The order of that enum matters!!
         GLOBAL_TABLES_SPEC,

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/Sets.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Sets.java 
b/src/java/org/apache/cassandra/cql3/Sets.java
index e8617aa..d17a771 100644
--- a/src/java/org/apache/cassandra/cql3/Sets.java
+++ b/src/java/org/apache/cassandra/cql3/Sets.java
@@ -31,7 +31,7 @@ import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.serializers.CollectionSerializer;
 import org.apache.cassandra.serializers.MarshalException;
-import org.apache.cassandra.transport.Server;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 /**
@@ -149,7 +149,7 @@ public abstract class Sets
             this.elements = elements;
         }
 
-        public static Value fromSerialized(ByteBuffer value, SetType type, int 
version) throws InvalidRequestException
+        public static Value fromSerialized(ByteBuffer value, SetType type, 
ProtocolVersion version) throws InvalidRequestException
         {
             try
             {
@@ -167,7 +167,7 @@ public abstract class Sets
             }
         }
 
-        public ByteBuffer get(int protocolVersion)
+        public ByteBuffer get(ProtocolVersion protocolVersion)
         {
             return CollectionSerializer.pack(elements, elements.size(), 
protocolVersion);
         }
@@ -308,7 +308,7 @@ public abstract class Sets
                 if (value == null)
                     params.addTombstone(column);
                 else
-                    params.addCell(column, value.get(Server.CURRENT_VERSION));
+                    params.addCell(column, value.get(ProtocolVersion.CURRENT));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/Term.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Term.java 
b/src/java/org/apache/cassandra/cql3/Term.java
index 2c2eba6..11b9860 100644
--- a/src/java/org/apache/cassandra/cql3/Term.java
+++ b/src/java/org/apache/cassandra/cql3/Term.java
@@ -23,6 +23,7 @@ import java.util.List;
 import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.transport.ProtocolVersion;
 
 /**
  * A CQL3 term, i.e. a column value with or without bind variables.
@@ -156,7 +157,7 @@ public interface Term
          * @return the serialized value of this terminal.
          * @param protocolVersion
          */
-        public abstract ByteBuffer get(int protocolVersion) throws 
InvalidRequestException;
+        public abstract ByteBuffer get(ProtocolVersion protocolVersion) throws 
InvalidRequestException;
 
         public ByteBuffer bindAndGet(QueryOptions options) throws 
InvalidRequestException
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/Tuples.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Tuples.java 
b/src/java/org/apache/cassandra/cql3/Tuples.java
index 267832d..32a31fd 100644
--- a/src/java/org/apache/cassandra/cql3/Tuples.java
+++ b/src/java/org/apache/cassandra/cql3/Tuples.java
@@ -30,6 +30,7 @@ import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.serializers.MarshalException;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 /**
@@ -179,7 +180,7 @@ public class Tuples
             return new Value(type.split(bytes));
         }
 
-        public ByteBuffer get(int protocolVersion)
+        public ByteBuffer get(ProtocolVersion protocolVersion)
         {
             return TupleType.buildValue(elements);
         }
@@ -296,7 +297,7 @@ public class Tuples
             }
         }
 
-        public ByteBuffer get(int protocolVersion)
+        public ByteBuffer get(ProtocolVersion protocolVersion)
         {
             throw new UnsupportedOperationException();
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/UntypedResultSet.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/UntypedResultSet.java 
b/src/java/org/apache/cassandra/cql3/UntypedResultSet.java
index 3d70051..d896071 100644
--- a/src/java/org/apache/cassandra/cql3/UntypedResultSet.java
+++ b/src/java/org/apache/cassandra/cql3/UntypedResultSet.java
@@ -22,6 +22,7 @@ import java.net.InetAddress;
 import java.nio.ByteBuffer;
 import java.util.*;
 
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.AbstractIterator;
 
 import org.apache.cassandra.config.CFMetaData;
@@ -32,7 +33,6 @@ import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.db.partitions.PartitionIterator;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.service.pager.QueryPager;
-import org.apache.cassandra.transport.Server;
 import org.apache.cassandra.utils.FBUtilities;
 
 /** a utility for doing internal cql-based queries */
@@ -245,7 +245,7 @@ public abstract class UntypedResultSet implements 
Iterable<UntypedResultSet.Row>
                 {
                     ComplexColumnData complexData = 
row.getComplexColumnData(def);
                     if (complexData != null)
-                        data.put(def.name.toString(), 
((CollectionType)def.type).serializeForNativeProtocol(complexData.iterator(), 
Server.VERSION_3));
+                        data.put(def.name.toString(), 
((CollectionType)def.type).serializeForNativeProtocol(complexData.iterator(), 
ProtocolVersion.V3));
                 }
             }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/UserTypes.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/UserTypes.java 
b/src/java/org/apache/cassandra/cql3/UserTypes.java
index 41b8eed..e867179 100644
--- a/src/java/org/apache/cassandra/cql3/UserTypes.java
+++ b/src/java/org/apache/cassandra/cql3/UserTypes.java
@@ -26,6 +26,7 @@ import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.db.rows.CellPath;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 import static org.apache.cassandra.cql3.Constants.UNSET_VALUE;
@@ -172,7 +173,7 @@ public abstract class UserTypes
             return new Value(type, type.split(bytes));
         }
 
-        public ByteBuffer get(int protocolVersion)
+        public ByteBuffer get(ProtocolVersion protocolVersion)
         {
             return TupleType.buildValue(elements);
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java 
b/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java
index 530b7ba..85d3763 100644
--- a/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java
+++ b/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java
@@ -28,6 +28,7 @@ import java.util.List;
 import org.apache.cassandra.cql3.CQL3Type;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.transport.ProtocolVersion;
 
 /**
  * Factory methods for aggregate functions.
@@ -102,12 +103,12 @@ public abstract class AggregateFcts
                             count = 0;
                         }
 
-                        public ByteBuffer compute(int protocolVersion)
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion)
                         {
                             return LongType.instance.decompose(count);
                         }
 
-                        public void addInput(int protocolVersion, 
List<ByteBuffer> values)
+                        public void addInput(ProtocolVersion protocolVersion, 
List<ByteBuffer> values)
                         {
                             count++;
                         }
@@ -139,12 +140,12 @@ public abstract class AggregateFcts
                             sum = BigDecimal.ZERO;
                         }
 
-                        public ByteBuffer compute(int protocolVersion)
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion)
                         {
                             return ((DecimalType) returnType()).decompose(sum);
                         }
 
-                        public void addInput(int protocolVersion, 
List<ByteBuffer> values)
+                        public void addInput(ProtocolVersion protocolVersion, 
List<ByteBuffer> values)
                         {
                             ByteBuffer value = values.get(0);
 
@@ -178,12 +179,12 @@ public abstract class AggregateFcts
                             avg = BigDecimal.ZERO;
                         }
 
-                        public ByteBuffer compute(int protocolVersion)
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion)
                         {
                             return DecimalType.instance.decompose(avg);
                         }
 
-                        public void addInput(int protocolVersion, 
List<ByteBuffer> values)
+                        public void addInput(ProtocolVersion protocolVersion, 
List<ByteBuffer> values)
                         {
                             ByteBuffer value = values.get(0);
 
@@ -218,12 +219,12 @@ public abstract class AggregateFcts
                             sum = BigInteger.ZERO;
                         }
 
-                        public ByteBuffer compute(int protocolVersion)
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion)
                         {
                             return ((IntegerType) returnType()).decompose(sum);
                         }
 
-                        public void addInput(int protocolVersion, 
List<ByteBuffer> values)
+                        public void addInput(ProtocolVersion protocolVersion, 
List<ByteBuffer> values)
                         {
                             ByteBuffer value = values.get(0);
 
@@ -257,7 +258,7 @@ public abstract class AggregateFcts
                             sum = BigInteger.ZERO;
                         }
 
-                        public ByteBuffer compute(int protocolVersion)
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion)
                         {
                             if (count == 0)
                                 return 
IntegerType.instance.decompose(BigInteger.ZERO);
@@ -265,7 +266,7 @@ public abstract class AggregateFcts
                             return 
IntegerType.instance.decompose(sum.divide(BigInteger.valueOf(count)));
                         }
 
-                        public void addInput(int protocolVersion, 
List<ByteBuffer> values)
+                        public void addInput(ProtocolVersion protocolVersion, 
List<ByteBuffer> values)
                         {
                             ByteBuffer value = values.get(0);
 
@@ -297,12 +298,12 @@ public abstract class AggregateFcts
                             sum = 0;
                         }
 
-                        public ByteBuffer compute(int protocolVersion)
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion)
                         {
                             return ((ByteType) returnType()).decompose(sum);
                         }
 
-                        public void addInput(int protocolVersion, 
List<ByteBuffer> values)
+                        public void addInput(ProtocolVersion protocolVersion, 
List<ByteBuffer> values)
                         {
                             ByteBuffer value = values.get(0);
 
@@ -326,7 +327,7 @@ public abstract class AggregateFcts
                 {
                     return new AvgAggregate(ByteType.instance)
                     {
-                        public ByteBuffer compute(int protocolVersion) throws 
InvalidRequestException
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion) throws InvalidRequestException
                         {
                             return ByteType.instance.decompose((byte) 
computeInternal());
                         }
@@ -351,12 +352,12 @@ public abstract class AggregateFcts
                             sum = 0;
                         }
 
-                        public ByteBuffer compute(int protocolVersion)
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion)
                         {
                             return ((ShortType) returnType()).decompose(sum);
                         }
 
-                        public void addInput(int protocolVersion, 
List<ByteBuffer> values)
+                        public void addInput(ProtocolVersion protocolVersion, 
List<ByteBuffer> values)
                         {
                             ByteBuffer value = values.get(0);
 
@@ -380,7 +381,7 @@ public abstract class AggregateFcts
                 {
                     return new AvgAggregate(ShortType.instance)
                     {
-                        public ByteBuffer compute(int protocolVersion)
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion)
                         {
                             return ShortType.instance.decompose((short) 
computeInternal());
                         }
@@ -405,12 +406,12 @@ public abstract class AggregateFcts
                             sum = 0;
                         }
 
-                        public ByteBuffer compute(int protocolVersion)
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion)
                         {
                             return ((Int32Type) returnType()).decompose(sum);
                         }
 
-                        public void addInput(int protocolVersion, 
List<ByteBuffer> values)
+                        public void addInput(ProtocolVersion protocolVersion, 
List<ByteBuffer> values)
                         {
                             ByteBuffer value = values.get(0);
 
@@ -434,7 +435,7 @@ public abstract class AggregateFcts
                 {
                     return new AvgAggregate(Int32Type.instance)
                     {
-                        public ByteBuffer compute(int protocolVersion)
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion)
                         {
                             return Int32Type.instance.decompose((int) 
computeInternal());
                         }
@@ -464,7 +465,7 @@ public abstract class AggregateFcts
                 {
                     return new AvgAggregate(LongType.instance)
                     {
-                        public ByteBuffer compute(int protocolVersion)
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion)
                         {
                             return 
LongType.instance.decompose(computeInternal());
                         }
@@ -482,7 +483,7 @@ public abstract class AggregateFcts
                 {
                     return new FloatSumAggregate(FloatType.instance)
                     {
-                        public ByteBuffer compute(int protocolVersion) throws 
InvalidRequestException
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion) throws InvalidRequestException
                         {
                             return FloatType.instance.decompose((float) 
computeInternal());
                         }
@@ -500,7 +501,7 @@ public abstract class AggregateFcts
                 {
                     return new FloatAvgAggregate(FloatType.instance)
                     {
-                        public ByteBuffer compute(int protocolVersion) throws 
InvalidRequestException
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion) throws InvalidRequestException
                         {
                             return FloatType.instance.decompose((float) 
computeInternal());
                         }
@@ -518,7 +519,7 @@ public abstract class AggregateFcts
                 {
                     return new FloatSumAggregate(DoubleType.instance)
                     {
-                        public ByteBuffer compute(int protocolVersion) throws 
InvalidRequestException
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion) throws InvalidRequestException
                         {
                             return 
DoubleType.instance.decompose(computeInternal());
                         }
@@ -550,7 +551,7 @@ public abstract class AggregateFcts
             simpleSum = 0;
         }
 
-        public void addInput(int protocolVersion, List<ByteBuffer> values)
+        public void addInput(ProtocolVersion protocolVersion, List<ByteBuffer> 
values)
         {
             ByteBuffer value = values.get(0);
 
@@ -635,7 +636,7 @@ public abstract class AggregateFcts
             }
         }
 
-        public void addInput(int protocolVersion, List<ByteBuffer> values)
+        public void addInput(ProtocolVersion protocolVersion, List<ByteBuffer> 
values)
         {
             ByteBuffer value = values.get(0);
 
@@ -678,7 +679,7 @@ public abstract class AggregateFcts
                 {
                     return new FloatAvgAggregate(DoubleType.instance)
                     {
-                        public ByteBuffer compute(int protocolVersion) throws 
InvalidRequestException
+                        public ByteBuffer compute(ProtocolVersion 
protocolVersion) throws InvalidRequestException
                         {
                             return 
DoubleType.instance.decompose(computeInternal());
                         }
@@ -708,7 +709,7 @@ public abstract class AggregateFcts
         {
             return new AvgAggregate(LongType.instance)
             {
-                public ByteBuffer compute(int protocolVersion) throws 
InvalidRequestException
+                public ByteBuffer compute(ProtocolVersion protocolVersion) 
throws InvalidRequestException
                 {
                     return 
CounterColumnType.instance.decompose(computeInternal());
                 }
@@ -733,12 +734,12 @@ public abstract class AggregateFcts
                     min = null;
                 }
 
-                public ByteBuffer compute(int protocolVersion)
+                public ByteBuffer compute(ProtocolVersion protocolVersion)
                 {
                     return min != null ? LongType.instance.decompose(min) : 
null;
                 }
 
-                public void addInput(int protocolVersion, List<ByteBuffer> 
values)
+                public void addInput(ProtocolVersion protocolVersion, 
List<ByteBuffer> values)
                 {
                     ByteBuffer value = values.get(0);
 
@@ -771,12 +772,12 @@ public abstract class AggregateFcts
                     max = null;
                 }
 
-                public ByteBuffer compute(int protocolVersion)
+                public ByteBuffer compute(ProtocolVersion protocolVersion)
                 {
                     return max != null ? LongType.instance.decompose(max) : 
null;
                 }
 
-                public void addInput(int protocolVersion, List<ByteBuffer> 
values)
+                public void addInput(ProtocolVersion protocolVersion, 
List<ByteBuffer> values)
                 {
                     ByteBuffer value = values.get(0);
 
@@ -813,12 +814,12 @@ public abstract class AggregateFcts
                         max = null;
                     }
 
-                    public ByteBuffer compute(int protocolVersion)
+                    public ByteBuffer compute(ProtocolVersion protocolVersion)
                     {
                         return max;
                     }
 
-                    public void addInput(int protocolVersion, List<ByteBuffer> 
values)
+                    public void addInput(ProtocolVersion protocolVersion, 
List<ByteBuffer> values)
                     {
                         ByteBuffer value = values.get(0);
 
@@ -854,12 +855,12 @@ public abstract class AggregateFcts
                         min = null;
                     }
 
-                    public ByteBuffer compute(int protocolVersion)
+                    public ByteBuffer compute(ProtocolVersion protocolVersion)
                     {
                         return min;
                     }
 
-                    public void addInput(int protocolVersion, List<ByteBuffer> 
values)
+                    public void addInput(ProtocolVersion protocolVersion, 
List<ByteBuffer> values)
                     {
                         ByteBuffer value = values.get(0);
 
@@ -895,12 +896,12 @@ public abstract class AggregateFcts
                         count = 0;
                     }
 
-                    public ByteBuffer compute(int protocolVersion)
+                    public ByteBuffer compute(ProtocolVersion protocolVersion)
                     {
                         return ((LongType) returnType()).decompose(count);
                     }
 
-                    public void addInput(int protocolVersion, List<ByteBuffer> 
values)
+                    public void addInput(ProtocolVersion protocolVersion, 
List<ByteBuffer> values)
                     {
                         ByteBuffer value = values.get(0);
 
@@ -923,12 +924,12 @@ public abstract class AggregateFcts
             sum = 0;
         }
 
-        public ByteBuffer compute(int protocolVersion)
+        public ByteBuffer compute(ProtocolVersion protocolVersion)
         {
             return LongType.instance.decompose(sum);
         }
 
-        public void addInput(int protocolVersion, List<ByteBuffer> values)
+        public void addInput(ProtocolVersion protocolVersion, List<ByteBuffer> 
values)
         {
             ByteBuffer value = values.get(0);
 
@@ -979,7 +980,7 @@ public abstract class AggregateFcts
             }
         }
 
-        public void addInput(int protocolVersion, List<ByteBuffer> values)
+        public void addInput(ProtocolVersion protocolVersion, List<ByteBuffer> 
values)
         {
             ByteBuffer value = values.get(0);
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/functions/AggregateFunction.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/functions/AggregateFunction.java 
b/src/java/org/apache/cassandra/cql3/functions/AggregateFunction.java
index ddbc9d1..b207563 100644
--- a/src/java/org/apache/cassandra/cql3/functions/AggregateFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/AggregateFunction.java
@@ -21,6 +21,7 @@ import java.nio.ByteBuffer;
 import java.util.List;
 
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.transport.ProtocolVersion;
 
 /**
  * Performs a calculation on a set of values and return a single value.
@@ -41,11 +42,10 @@ public interface AggregateFunction extends Function
     {
         /**
          * Adds the specified input to this aggregate.
-         *
-         * @param protocolVersion native protocol version
+         *  @param protocolVersion native protocol version
          * @param values the values to add to the aggregate.
          */
-        public void addInput(int protocolVersion, List<ByteBuffer> values) 
throws InvalidRequestException;
+        public void addInput(ProtocolVersion protocolVersion, List<ByteBuffer> 
values) throws InvalidRequestException;
 
         /**
          * Computes and returns the aggregate current value.
@@ -53,7 +53,7 @@ public interface AggregateFunction extends Function
          * @param protocolVersion native protocol version
          * @return the aggregate current value.
          */
-        public ByteBuffer compute(int protocolVersion) throws 
InvalidRequestException;
+        public ByteBuffer compute(ProtocolVersion protocolVersion) throws 
InvalidRequestException;
 
         /**
          * Reset this aggregate.

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java 
b/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java
index d9c6a52..33771b7 100644
--- a/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java
+++ b/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java
@@ -26,6 +26,7 @@ import org.apache.cassandra.cql3.CQL3Type;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.BytesType;
 import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.serializers.MarshalException;
@@ -60,7 +61,7 @@ public abstract class BytesConversionFcts
         String name = fromType.asCQL3Type() + "asblob";
         return new NativeScalarFunction(name, BytesType.instance, fromType)
         {
-            public ByteBuffer execute(int protocolVersion, List<ByteBuffer> 
parameters)
+            public ByteBuffer execute(ProtocolVersion protocolVersion, 
List<ByteBuffer> parameters)
             {
                 return parameters.get(0);
             }
@@ -72,7 +73,7 @@ public abstract class BytesConversionFcts
         final String name = "blobas" + toType.asCQL3Type();
         return new NativeScalarFunction(name, toType, BytesType.instance)
         {
-            public ByteBuffer execute(int protocolVersion, List<ByteBuffer> 
parameters) throws InvalidRequestException
+            public ByteBuffer execute(ProtocolVersion protocolVersion, 
List<ByteBuffer> parameters) throws InvalidRequestException
             {
                 ByteBuffer val = parameters.get(0);
                 try
@@ -92,7 +93,7 @@ public abstract class BytesConversionFcts
 
     public static final Function VarcharAsBlobFct = new 
NativeScalarFunction("varcharasblob", BytesType.instance, UTF8Type.instance)
     {
-        public ByteBuffer execute(int protocolVersion, List<ByteBuffer> 
parameters)
+        public ByteBuffer execute(ProtocolVersion protocolVersion, 
List<ByteBuffer> parameters)
         {
             return parameters.get(0);
         }
@@ -100,7 +101,7 @@ public abstract class BytesConversionFcts
 
     public static final Function BlobAsVarcharFct = new 
NativeScalarFunction("blobasvarchar", UTF8Type.instance, BytesType.instance)
     {
-        public ByteBuffer execute(int protocolVersion, List<ByteBuffer> 
parameters)
+        public ByteBuffer execute(ProtocolVersion protocolVersion, 
List<ByteBuffer> parameters)
         {
             return parameters.get(0);
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/functions/CastFcts.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/CastFcts.java 
b/src/java/org/apache/cassandra/cql3/functions/CastFcts.java
index b5d3698..9e5c729 100644
--- a/src/java/org/apache/cassandra/cql3/functions/CastFcts.java
+++ b/src/java/org/apache/cassandra/cql3/functions/CastFcts.java
@@ -44,6 +44,8 @@ import org.apache.cassandra.db.marshal.TimeUUIDType;
 import org.apache.cassandra.db.marshal.TimestampType;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.db.marshal.UUIDType;
+import org.apache.cassandra.transport.ProtocolVersion;
+
 import org.apache.commons.lang3.text.WordUtils;
 
 /**
@@ -224,7 +226,7 @@ public final class CastFcts
             this.converter = converter;
         }
 
-        public final ByteBuffer execute(int protocolVersion, List<ByteBuffer> 
parameters)
+        public final ByteBuffer execute(ProtocolVersion protocolVersion, 
List<ByteBuffer> parameters)
         {
             ByteBuffer bb = parameters.get(0);
             if (bb == null)
@@ -297,7 +299,7 @@ public final class CastFcts
             this.delegate = delegate;
         }
 
-        public ByteBuffer execute(int protocolVersion, List<ByteBuffer> 
parameters)
+        public ByteBuffer execute(ProtocolVersion protocolVersion, 
List<ByteBuffer> parameters)
         {
             return delegate.execute(protocolVersion, parameters);
         }
@@ -323,7 +325,7 @@ public final class CastFcts
             super(inputType, outputType);
         }
 
-        public ByteBuffer execute(int protocolVersion, List<ByteBuffer> 
parameters)
+        public ByteBuffer execute(ProtocolVersion protocolVersion, 
List<ByteBuffer> parameters)
         {
             ByteBuffer bb = parameters.get(0);
             if (bb == null)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/functions/FromJsonFct.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/FromJsonFct.java 
b/src/java/org/apache/cassandra/cql3/functions/FromJsonFct.java
index 2b9e8c6..8f07b38 100644
--- a/src/java/org/apache/cassandra/cql3/functions/FromJsonFct.java
+++ b/src/java/org/apache/cassandra/cql3/functions/FromJsonFct.java
@@ -28,6 +28,7 @@ import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.exceptions.FunctionExecutionException;
 import org.apache.cassandra.serializers.MarshalException;
+import org.apache.cassandra.transport.ProtocolVersion;
 
 public class FromJsonFct extends NativeScalarFunction
 {
@@ -51,7 +52,7 @@ public class FromJsonFct extends NativeScalarFunction
         super("fromjson", returnType, UTF8Type.instance);
     }
 
-    public ByteBuffer execute(int protocolVersion, List<ByteBuffer> parameters)
+    public ByteBuffer execute(ProtocolVersion protocolVersion, 
List<ByteBuffer> parameters)
     {
         assert parameters.size() == 1 : "Unexpectedly got " + 
parameters.size() + " arguments for fromJson()";
         ByteBuffer argument = parameters.get(0);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java 
b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java
index 3905c83..bcc912f 100644
--- a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java
+++ b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java
@@ -27,6 +27,7 @@ import 
org.apache.cassandra.cql3.statements.RequestValidations;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.serializers.MarshalException;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 public class FunctionCall extends Term.NonTerminal
@@ -69,7 +70,7 @@ public class FunctionCall extends Term.NonTerminal
         return executeInternal(options.getProtocolVersion(), fun, buffers);
     }
 
-    private static ByteBuffer executeInternal(int protocolVersion, 
ScalarFunction fun, List<ByteBuffer> params) throws InvalidRequestException
+    private static ByteBuffer executeInternal(ProtocolVersion protocolVersion, 
ScalarFunction fun, List<ByteBuffer> params) throws InvalidRequestException
     {
         ByteBuffer result = fun.execute(protocolVersion, params);
         try
@@ -96,7 +97,7 @@ public class FunctionCall extends Term.NonTerminal
         return false;
     }
 
-    private static Term.Terminal makeTerminal(Function fun, ByteBuffer result, 
int version) throws InvalidRequestException
+    private static Term.Terminal makeTerminal(Function fun, ByteBuffer result, 
ProtocolVersion version) throws InvalidRequestException
     {
         if (fun.returnType().isCollection())
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/functions/JavaBasedUDFunction.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/functions/JavaBasedUDFunction.java 
b/src/java/org/apache/cassandra/cql3/functions/JavaBasedUDFunction.java
index 34c6cc9..8f12899 100644
--- a/src/java/org/apache/cassandra/cql3/functions/JavaBasedUDFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/JavaBasedUDFunction.java
@@ -48,6 +48,7 @@ import org.apache.cassandra.concurrent.NamedThreadFactory;
 import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.FBUtilities;
 import org.eclipse.jdt.core.compiler.IProblem;
 import org.eclipse.jdt.internal.compiler.*;
@@ -362,12 +363,12 @@ public final class JavaBasedUDFunction extends UDFunction
         return executor;
     }
 
-    protected ByteBuffer executeUserDefined(int protocolVersion, 
List<ByteBuffer> params)
+    protected ByteBuffer executeUserDefined(ProtocolVersion protocolVersion, 
List<ByteBuffer> params)
     {
         return javaUDF.executeImpl(protocolVersion, params);
     }
 
-    protected Object executeAggregateUserDefined(int protocolVersion, Object 
firstParam, List<ByteBuffer> params)
+    protected Object executeAggregateUserDefined(ProtocolVersion 
protocolVersion, Object firstParam, List<ByteBuffer> params)
     {
         return javaUDF.executeAggregateImpl(protocolVersion, firstParam, 
params);
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/functions/JavaUDF.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/JavaUDF.java 
b/src/java/org/apache/cassandra/cql3/functions/JavaUDF.java
index 56a7ced..fab29f3 100644
--- a/src/java/org/apache/cassandra/cql3/functions/JavaUDF.java
+++ b/src/java/org/apache/cassandra/cql3/functions/JavaUDF.java
@@ -22,6 +22,7 @@ import java.nio.ByteBuffer;
 import java.util.List;
 
 import com.datastax.driver.core.TypeCodec;
+import org.apache.cassandra.transport.ProtocolVersion;
 
 /**
  * Base class for all Java UDFs.
@@ -43,64 +44,64 @@ public abstract class JavaUDF
         this.udfContext = udfContext;
     }
 
-    protected abstract ByteBuffer executeImpl(int protocolVersion, 
List<ByteBuffer> params);
+    protected abstract ByteBuffer executeImpl(ProtocolVersion protocolVersion, 
List<ByteBuffer> params);
 
-    protected abstract Object executeAggregateImpl(int protocolVersion, Object 
firstParam, List<ByteBuffer> params);
+    protected abstract Object executeAggregateImpl(ProtocolVersion 
protocolVersion, Object firstParam, List<ByteBuffer> params);
 
-    protected Object compose(int protocolVersion, int argIndex, ByteBuffer 
value)
+    protected Object compose(ProtocolVersion protocolVersion, int argIndex, 
ByteBuffer value)
     {
         return UDFunction.compose(argCodecs, protocolVersion, argIndex, value);
     }
 
-    protected ByteBuffer decompose(int protocolVersion, Object value)
+    protected ByteBuffer decompose(ProtocolVersion protocolVersion, Object 
value)
     {
         return UDFunction.decompose(returnCodec, protocolVersion, value);
     }
 
     // do not remove - used by generated Java UDFs
-    protected float compose_float(int protocolVersion, int argIndex, 
ByteBuffer value)
+    protected float compose_float(ProtocolVersion protocolVersion, int 
argIndex, ByteBuffer value)
     {
         assert value != null && value.remaining() > 0;
         return (float) UDHelper.deserialize(TypeCodec.cfloat(), 
protocolVersion, value);
     }
 
     // do not remove - used by generated Java UDFs
-    protected double compose_double(int protocolVersion, int argIndex, 
ByteBuffer value)
+    protected double compose_double(ProtocolVersion protocolVersion, int 
argIndex, ByteBuffer value)
     {
         assert value != null && value.remaining() > 0;
         return (double) UDHelper.deserialize(TypeCodec.cdouble(), 
protocolVersion, value);
     }
 
     // do not remove - used by generated Java UDFs
-    protected byte compose_byte(int protocolVersion, int argIndex, ByteBuffer 
value)
+    protected byte compose_byte(ProtocolVersion protocolVersion, int argIndex, 
ByteBuffer value)
     {
         assert value != null && value.remaining() > 0;
         return (byte) UDHelper.deserialize(TypeCodec.tinyInt(), 
protocolVersion, value);
     }
 
     // do not remove - used by generated Java UDFs
-    protected short compose_short(int protocolVersion, int argIndex, 
ByteBuffer value)
+    protected short compose_short(ProtocolVersion protocolVersion, int 
argIndex, ByteBuffer value)
     {
         assert value != null && value.remaining() > 0;
         return (short) UDHelper.deserialize(TypeCodec.smallInt(), 
protocolVersion, value);
     }
 
     // do not remove - used by generated Java UDFs
-    protected int compose_int(int protocolVersion, int argIndex, ByteBuffer 
value)
+    protected int compose_int(ProtocolVersion protocolVersion, int argIndex, 
ByteBuffer value)
     {
         assert value != null && value.remaining() > 0;
         return (int) UDHelper.deserialize(TypeCodec.cint(), protocolVersion, 
value);
     }
 
     // do not remove - used by generated Java UDFs
-    protected long compose_long(int protocolVersion, int argIndex, ByteBuffer 
value)
+    protected long compose_long(ProtocolVersion protocolVersion, int argIndex, 
ByteBuffer value)
     {
         assert value != null && value.remaining() > 0;
         return (long) UDHelper.deserialize(TypeCodec.bigint(), 
protocolVersion, value);
     }
 
     // do not remove - used by generated Java UDFs
-    protected boolean compose_boolean(int protocolVersion, int argIndex, 
ByteBuffer value)
+    protected boolean compose_boolean(ProtocolVersion protocolVersion, int 
argIndex, ByteBuffer value)
     {
         assert value != null && value.remaining() > 0;
         return (boolean) UDHelper.deserialize(TypeCodec.cboolean(), 
protocolVersion, value);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java 
b/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java
index ba258df..1f98372 100644
--- a/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java
@@ -21,6 +21,7 @@ import java.nio.ByteBuffer;
 import java.util.List;
 
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.transport.ProtocolVersion;
 
 /**
  * Determines a single output value based on a single input value.
@@ -37,5 +38,5 @@ public interface ScalarFunction extends Function
      * @return the result of applying this function to the parameter
      * @throws InvalidRequestException if this function cannot not be applied 
to the parameter
      */
-    public ByteBuffer execute(int protocolVersion, List<ByteBuffer> 
parameters) throws InvalidRequestException;
+    public ByteBuffer execute(ProtocolVersion protocolVersion, 
List<ByteBuffer> parameters) throws InvalidRequestException;
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e0adc166/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDFunction.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDFunction.java 
b/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDFunction.java
index 8c15dc9..3ad60d0 100644
--- a/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDFunction.java
@@ -32,6 +32,7 @@ import org.apache.cassandra.concurrent.NamedThreadFactory;
 import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.transport.ProtocolVersion;
 
 final class ScriptBasedUDFunction extends UDFunction
 {
@@ -171,7 +172,7 @@ final class ScriptBasedUDFunction extends UDFunction
         return executor;
     }
 
-    public ByteBuffer executeUserDefined(int protocolVersion, List<ByteBuffer> 
parameters)
+    public ByteBuffer executeUserDefined(ProtocolVersion protocolVersion, 
List<ByteBuffer> parameters)
     {
         Object[] params = new Object[argTypes.size()];
         for (int i = 0; i < params.length; i++)
@@ -183,12 +184,12 @@ final class ScriptBasedUDFunction extends UDFunction
     }
 
     /**
-     * Like {@link #executeUserDefined(int, List)} but the first parameter is 
already in non-serialized form.
+     * Like {@link UDFunction#executeUserDefined(ProtocolVersion, List)} but 
the first parameter is already in non-serialized form.
      * Remaining parameters (2nd paramters and all others) are in {@code 
parameters}.
      * This is used to prevent superfluous (de)serialization of the state of 
aggregates.
      * Means: scalar functions of aggregates are called using this variant.
      */
-    protected Object executeAggregateUserDefined(int protocolVersion, Object 
firstParam, List<ByteBuffer> parameters)
+    protected Object executeAggregateUserDefined(ProtocolVersion 
protocolVersion, Object firstParam, List<ByteBuffer> parameters)
     {
         Object[] params = new Object[argTypes.size()];
         params[0] = firstParam;

Reply via email to