Cassandra Documentation


You are viewing the documentation for a prerelease version.


The following describes the changes in each version of CQL.


  • Add vector similarity functions (18640)

  • Remove deprecated functions dateOf and unixTimestampOf, replaced by toTimestamp and toUnixTimestamp (18328)

  • Added support for attaching masking functions to table columns (18068)

  • Add UNMASK permission (18069)

  • Add SELECT_MASKED permission (18070)

  • Add support for using UDFs as masking functions (18071)

  • Adopt snake_case function names, deprecating all previous camelCase or alltogetherwithoutspaces function names (18037)

  • Add new vector data type (18504)


  • Add support for IF EXISTS and IF NOT EXISTS in ALTER statements (16916)

  • Allow GRANT/REVOKE multiple permissions in a single statement (17030)

  • Pre hashed passwords in CQL (17334)

  • Add support for type casting in WHERE clause components and in the values of INSERT/UPDATE statements (14337)

  • Add support for CONTAINS and CONTAINS KEY in conditional UPDATE and DELETE statement (10537)

  • Allow to grant permission for all tables in a keyspace (17027)

  • Allow to aggregate by time intervals (11871)


  • Adds support for arithmetic operators (11935)

  • Adds support for + and - operations on dates (11936)

  • Adds currentTimestamp, currentDate, currentTime and currentTimeUUID functions (13132)


  • ALTER TABLE ALTER has been removed; a column’s type may not be changed after creation (12443).

  • ALTER TYPE ALTER has been removed; a field’s type may not be changed after creation (12443).


  • Adds a new duration data types <data-types> (11873).

  • Support for GROUP BY (10707).

  • Adds a DEFAULT UNSET option for INSERT JSON to ignore omitted columns (11424).

  • Allows null as a legal value for TTL on insert and update. It will be treated as equivalent to inserting a 0 (12216).


  • If a table has a non zero default_time_to_live, then explicitly specifying a TTL of 0 in an INSERT or UPDATE statement will result in the new writes not having any expiration (that is, an explicit TTL of 0 cancels the default_time_to_live). This wasn’t the case before and the default_time_to_live was applied even though a TTL had been explicitly set.

  • ALTER TABLE ADD and DROP now allow multiple columns to be added/removed.

  • New PER PARTITION LIMIT option for SELECT statements (see CASSANDRA-7017.

  • User-defined functions <cql-functions> can now instantiate UDTValue and TupleValue instances via the new UDFContext interface (see CASSANDRA-10818.

  • User-defined types <udts> may now be stored in a non-frozen form, allowing individual fields to be updated and deleted in UPDATE statements and DELETE statements, respectively. (CASSANDRA-7423).


  • Adds CAST functions.


  • Support for materialized views <materialized-views>.

  • DELETE support for inequality expressions and IN restrictions on any primary key columns.

  • UPDATE support for IN restrictions on any primary key columns.


  • The syntax TRUNCATE TABLE X is now accepted as an alias for TRUNCATE X.


  • User-defined functions and aggregates <cql-functions> are now supported.

  • Allows double-dollar enclosed strings literals as an alternative to single-quote enclosed strings.

  • Introduces Roles to supersede user based authentication and access control

  • New date, time, tinyint and smallint data types <data-types> have been added.

  • JSON support <cql-json> has been added

  • Adds new time conversion functions and deprecate dateOf and unixTimestampOf.


  • User-defined types <udts> supported.

  • CREATE INDEX now supports indexing collection columns, including indexing the keys of map collections through the keys() function

  • Indexes on collections may be queried using the new CONTAINS and CONTAINS KEY operators

  • Tuple types <tuples> were added to hold fixed-length sets of typed positional fields.

  • DROP INDEX now supports optionally specifying a keyspace.


  • SELECT statements now support selecting multiple rows in a single partition using an IN clause on combinations of clustering columns.

  • IF NOT EXISTS and IF EXISTS syntax is now supported by CREATE USER and DROP USER statements, respectively.


  • A new uuid() method has been added.

  • Support for DELETE …​ IF EXISTS syntax.


  • It is now possible to group clustering columns in a relation, see WHERE <where-clause> clauses.

  • Added support for static columns <static-columns>.


  • CREATE INDEX now allows specifying options when creating CUSTOM indexes.


  • Millisecond precision formats have been added to the timestamp <timestamps> parser.


  • NaN and Infinity has been added as valid float constants. They are now reserved keywords. In the unlikely case you we using them as a column identifier (or keyspace/table one), you will now need to double quote them.


  • SELECT statement now allows listing the partition keys (using the DISTINCT modifier). See CASSANDRA-4536.

  • The syntax c IN ? is now supported in WHERE clauses. In that case, the value expected for the bind variable will be a list of whatever type c is.

  • It is now possible to use named bind variables (using :name instead of ?).


  • ALTER TABLE DROP option added.

  • SELECT statement now supports aliases in select clause. Aliases in WHERE and ORDER BY clauses are not supported.

  • CREATE statements for KEYSPACE, TABLE and INDEX now supports an IF NOT EXISTS condition. Similarly, DROP statements support a IF EXISTS condition.

  • INSERT statements optionally supports a IF NOT EXISTS condition and UPDATE supports IF conditions.


  • SELECT, UPDATE, and DELETE statements now allow empty IN relations (see CASSANDRA-5626.


  • Updated the syntax for custom secondary indexes <secondary-indexes>.

  • Non-equal condition on the partition key are now never supported, even for ordering partitioner as this was not correct (the order was not the one of the type of the partition key). Instead, the token method should always be used for range queries on the partition key (see WHERE clauses <where-clause>).


  • Support for custom secondary indexes <secondary-indexes> has been added.


  • Type validation for the constants <constants> has been fixed. For instance, the implementation used to allow '2' as a valid value for an int column (interpreting it has the equivalent of 2), or 42 as a valid blob value (in which case 42 was interpreted as an hexadecimal representation of the blob). This is no longer the case, type validation of constants is now more strict. See the data types <data-types> section for details on which constant is allowed for which type.

  • The type validation fixed of the previous point has lead to the introduction of blobs constants to allow the input of blobs. Do note that while the input of blobs as strings constant is still supported by this version (to allow smoother transition to blob constant), it is now deprecated and will be removed by a future version. If you were using strings as blobs, you should thus update your client code ASAP to switch blob constants.

  • A number of functions to convert native types to blobs have also been introduced. Furthermore the token function is now also allowed in select clauses. See the section on functions <cql-functions> for details.


  • Date strings (and timestamps) are no longer accepted as valid timeuuid values. Doing so was a bug in the sense that date string are not valid timeuuid, and it was thus resulting in confusing behaviors. However, the following new methods have been added to help working with timeuuid: now, minTimeuuid, maxTimeuuid , dateOf and unixTimestampOf.

  • Float constants now support the exponent notation. In other words, 4.2E10 is now a valid floating point value.


Versioning of the CQL language adheres to the Semantic Versioning guidelines. Versions take the form X.Y.Z where X, Y, and Z are integer values representing major, minor, and patch level respectively. There is no correlation between Cassandra release versions and the CQL language version.

version description


The major version must be bumped when backward incompatible changes are introduced. This should rarely occur.


Minor version increments occur when new, but backward compatible, functionality is introduced.


The patch version is incremented when bugs are fixed.