= Changes

The following describes the changes in each version of CQL.

== 3.4.6

* 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`)

== 3.4.5

* Adds support for arithmetic operators (`11935`)
* Adds support for `+` and `-` operations on dates (`11936`)
* Adds `currentTimestamp`, `currentDate`, `currentTime` and
`currentTimeUUID` functions (`13132`)

== 3.4.4

* `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`).

== 3.4.3

* 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`).

== 3.4.2

* 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
https://issues.apache.org/jira/browse/CASSANDRA-7017)[CASSANDRA-7017].
* `User-defined functions <cql-functions>` can now instantiate
`UDTValue` and `TupleValue` instances via the new `UDFContext` interface
(see
https://issues.apache.org/jira/browse/CASSANDRA-10818)[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.
(https://issues.apache.org/jira/browse/CASSANDRA-7423)[CASSANDRA-7423]).

== 3.4.1

* Adds `CAST` functions.

== 3.4.0

* 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.

== 3.3.1

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

== 3.3.0

* `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`.

== 3.2.0

* `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.

== 3.1.7

* `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.

== 3.1.6

* A new `uuid()` method has been added.
* Support for `DELETE ... IF EXISTS` syntax.

== 3.1.5

* It is now possible to group clustering columns in a relation, see
`WHERE <where-clause>` clauses.
* Added support for `static columns <static-columns>`.

== 3.1.4

* `CREATE INDEX` now allows specifying options when creating CUSTOM
indexes.

== 3.1.3

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

== 3.1.2

* `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.

== 3.1.1

* `SELECT` statement now allows listing the partition keys (using the
`DISTINCT` modifier). See
https://issues.apache.org/jira/browse/CASSANDRA-4536[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 `?`).

== 3.1.0

* `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.

== 3.0.5

* `SELECT`, `UPDATE`, and `DELETE` statements now allow empty `IN`
relations (see
https://issues.apache.org/jira/browse/CASSANDRA-5626)[CASSANDRA-5626].

== 3.0.4

* 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>`).

== 3.0.3

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

== 3.0.2

* 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.

== 3.0.1

* 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
https://issues.apache.org/jira/browse/CASSANDRA-4936[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

Versioning of the CQL language adheres to the http://semver.org[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.

[cols=",",options="header",]
|===
|version |description
| Major | The major version _must_ be bumped when backward incompatible changes
are introduced. This should rarely occur.
| Minor | Minor version increments occur when new, but backward compatible,
functionality is introduced.
| Patch | The patch version is incremented when bugs are fixed.
|===
