= Appendices

[[appendix-A]]
== Appendix A: CQL Keywords

CQL distinguishes between _reserved_ and _non-reserved_ keywords.
Reserved keywords cannot be used as identifier, they are truly reserved
for the language (but one can enclose a reserved keyword by
double-quotes to use it as an identifier). Non-reserved keywords however
only have a specific meaning in certain context but can used as
identifier otherwise. The only _raison d’être_ of these non-reserved
keywords is convenience: some keyword are non-reserved when it was
always easy for the parser to decide whether they were used as keywords
or not.

[width="48%",cols="60%,40%",options="header",]
|===
|Keyword |Reserved?
|`ADD` |yes
|`AGGREGATE` |no
|`ALL` |no
|`ALLOW` |yes
|`ALTER` |yes
|`AND` |yes
|`APPLY` |yes
|`AS` |no
|`ASC` |yes
|`ASCII` |no
|`AUTHORIZE` |yes
|`BATCH` |yes
|`BEGIN` |yes
|`BIGINT` |no
|`BLOB` |no
|`BOOLEAN` |no
|`BY` |yes
|`CALLED` |no
|`CLUSTERING` |no
|`COLUMNFAMILY` |yes
|`COMPACT` |no
|`CONTAINS` |no
|`COUNT` |no
|`COUNTER` |no
|`CREATE` |yes
|`CUSTOM` |no
|`DATE` |no
|`DECIMAL` |no
|`DELETE` |yes
|`DESC` |yes
|`DESCRIBE` |yes
|`DISTINCT` |no
|`DOUBLE` |no
|`DROP` |yes
|`ENTRIES` |yes
|`EXECUTE` |yes
|`EXISTS` |no
|`FILTERING` |no
|`FINALFUNC` |no
|`FLOAT` |no
|`FROM` |yes
|`FROZEN` |no
|`FULL` |yes
|`FUNCTION` |no
|`FUNCTIONS` |no
|`GRANT` |yes
|`IF` |yes
|`IN` |yes
|`INDEX` |yes
|`INET` |no
|`INFINITY` |yes
|`INITCOND` |no
|`INPUT` |no
|`INSERT` |yes
|`INT` |no
|`INTO` |yes
|`JSON` |no
|`KEY` |no
|`KEYS` |no
|`KEYSPACE` |yes
|`KEYSPACES` |no
|`LANGUAGE` |no
|`LIMIT` |yes
|`LIST` |no
|`LOGIN` |no
|`MAP` |no
|`MODIFY` |yes
|`NAN` |yes
|`NOLOGIN` |no
|`NORECURSIVE` |yes
|`NOSUPERUSER` |no
|`NOT` |yes
|`NULL` |yes
|`OF` |yes
|`ON` |yes
|`OPTIONS` |no
|`OR` |yes
|`ORDER` |yes
|`PASSWORD` |no
|`PERMISSION` |no
|`PERMISSIONS` |no
|`PRIMARY` |yes
|`RENAME` |yes
|`REPLACE` |yes
|`RETURNS` |no
|`REVOKE` |yes
|`ROLE` |no
|`ROLES` |no
|`SCHEMA` |yes
|`SELECT` |yes
|`SET` |yes
|`SFUNC` |no
|`SMALLINT` |no
|`STATIC` |no
|`STORAGE` |no
|`STYPE` |no
|`SUPERUSER` |no
|`TABLE` |yes
|`TEXT` |no
|`TIME` |no
|`TIMESTAMP` |no
|`TIMEUUID` |no
|`TINYINT` |no
|`TO` |yes
|`TOKEN` |yes
|`TRIGGER` |no
|`TRUNCATE` |yes
|`TTL` |no
|`TUPLE` |no
|`TYPE` |no
|`UNLOGGED` |yes
|`UPDATE` |yes
|`USE` |yes
|`USER` |no
|`USERS` |no
|`USING` |yes
|`UUID` |no
|`VALUES` |no
|`VARCHAR` |no
|`VARINT` |no
|`WHERE` |yes
|`WITH` |yes
|`WRITETIME` |no
|===

== Appendix B: CQL Reserved Types

The following type names are not currently used by CQL, but are reserved
for potential future use. User-defined types may not use reserved type
names as their name.

[width="25%",cols="100%",options="header",]
|===
|type
|`bitstring`
|`byte`
|`complex`
|`enum`
|`interval`
|`macaddr`
|===

== Appendix C: Dropping Compact Storage

Starting version 4.0, Thrift and COMPACT STORAGE is no longer supported.

`ALTER ... DROP COMPACT STORAGE` statement makes Compact Tables
CQL-compatible, exposing internal structure of Thrift/Compact Tables:

* CQL-created Compact Tables that have no clustering columns, will
expose an additional clustering column `column1` with `UTF8Type`.
* CQL-created Compact Tables that had no regular columns, will expose a
regular column `value` with `BytesType`.
* For CQL-Created Compact Tables, all columns originally defined as
`regular` will be come `static`
* CQL-created Compact Tables that have clustering but have no regular
columns will have an empty value column (of `EmptyType`)
* SuperColumn Tables (can only be created through Thrift) will expose a
compact value map with an empty name.
* Thrift-created Compact Tables will have types corresponding to their
Thrift definition.
