Author: slebresne
Date: Thu Jun  6 10:39:20 2013
New Revision: 1490231

URL: http://svn.apache.org/r1490231
Log:
Update typo in CQL doc

Modified:
    cassandra/site/publish/doc/cql3/CQL.html

Modified: cassandra/site/publish/doc/cql3/CQL.html
URL: 
http://svn.apache.org/viewvc/cassandra/site/publish/doc/cql3/CQL.html?rev=1490231&r1=1490230&r2=1490231&view=diff
==============================================================================
--- cassandra/site/publish/doc/cql3/CQL.html (original)
+++ cassandra/site/publish/doc/cql3/CQL.html Thu Jun  6 10:39:20 2013
@@ -1,4 +1,4 @@
-<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD 
XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";><html 
xmlns="http://www.w3.org/1999/xhtml";><head><meta http-equiv="Content-Type" 
content="text/html; charset=utf-8"/><title>CQL</title></head><body><p><link 
rel="StyleSheet" href="CQL.css" type="text/css" media="screen"></p><h1 
id="CassandraQueryLanguageCQLv3.0.2">Cassandra Query Language (CQL) 
v3.0.2</h1><span id="tableOfContents"><ol style="list-style: none;"><li><a 
href="CQL.html#CassandraQueryLanguageCQLv3.0.2">Cassandra Query Language (CQL) 
v3.0.2</a><ol style="list-style: none;"><li><a href="CQL.html#CQLSyntax">CQL 
Syntax</a><ol style="list-style: none;"><li><a 
href="CQL.html#Preamble">Preamble</a></li><li><a 
href="CQL.html#Conventions">Conventions</a></li><li><a 
href="CQL.html#identifiers">Identifiers and keywords</a></li><li><a 
href="CQL.html#constants">Constants</a></li><li><a 
href="CQL.html#Comments">Comment
 s</a></li><li><a href="CQL.html#statements">Statements</a></li><li><a 
href="CQL.html#preparedStatement">Prepared Statement</a></li></ol></li><li><a 
href="CQL.html#dataDefinition">Data Definition</a><ol style="list-style: 
none;"><li><a href="CQL.html#createKeyspaceStmt">CREATE KEYSPACE</a></li><li><a 
href="CQL.html#useStmt">USE</a></li><li><a 
href="CQL.html#alterKeyspaceStmt">ALTER KEYSPACE</a></li><li><a 
href="CQL.html#dropKeyspaceStmt">DROP KEYSPACE</a></li><li><a 
href="CQL.html#createTableStmt">CREATE TABLE</a></li><li><a 
href="CQL.html#alterTableStmt">ALTER TABLE</a></li><li><a 
href="CQL.html#dropTableStmt">DROP TABLE</a></li><li><a 
href="CQL.html#truncateStmt">TRUNCATE</a></li><li><a 
href="CQL.html#createIndexStmt">CREATE INDEX</a></li><li><a 
href="CQL.html#dropIndexStmt">DROP INDEX</a></li></ol></li><li><a 
href="CQL.html#dataManipulation">Data Manipulation</a><ol style="list-style: 
none;"><li><a href="CQL.html#insertStmt">INSERT</a></li><li><a 
href="CQL.html#updateStmt"
 >UPDATE</a></li><li><a href="CQL.html#deleteStmt">DELETE</a></li><li><a 
 >href="CQL.html#batchStmt">BATCH</a></li></ol></li><li><a 
 >href="CQL.html#queries">Queries</a><ol style="list-style: none;"><li><a 
 >href="CQL.html#selectStmt">SELECT</a></li></ol></li><li><a 
 >href="CQL.html#types">Data Types</a><ol style="list-style: none;"><li><a 
 >href="CQL.html#usingdates">Working with dates</a></li><li><a 
 >href="CQL.html#counters">Counters</a></li><li><a 
 >href="CQL.html#collections">Working with collections</a></li></ol></li><li><a 
 >href="CQL.html#functions">Functions</a><ol style="list-style: none;"><li><a 
 >href="CQL.html#tokenFun">Token</a></li><li><a 
 >href="CQL.html#timeuuidFun">Timeuuid functions</a></li><li><a 
 >href="CQL.html#blobFun">Blob conversion functions</a></li></ol></li><li><a 
 >href="CQL.html#appendixA">Appendix A: CQL Keywords</a></li><li><a 
 >href="CQL.html#changes">Changes</a><ol style="list-style: none;"><li><a 
 >href="CQL.html#a3.0.2">3.0.2</a></li><li><a href="CQL.html#a3.0.1">3.0.
 1</a></li></ol></li><li><a 
href="CQL.html#Versioning">Versioning</a></li></ol></li></ol></span><h2 
id="CQLSyntax">CQL Syntax</h2><h3 id="Preamble">Preamble</h3><p>This document 
describes the Cassandra Query Language (CQL) version 3. CQL v3 is not backward 
compatible with CQL v2 and differs from it in numerous ways. Note that this 
document describes the last version of the languages. However, the <a 
href="#changes">changes</a> section provides the diff between the different 
versions of CQL v3.</p><p>CQL v3 offers a model very close to SQL in the sense 
that data is put in <em>tables</em> containing <em>rows</em> of 
<em>columns</em>. For that reason, when used in this document, these terms 
(tables, rows and columns) have the same definition than they have in SQL. But 
please note that as such, they do <strong>not</strong> refer to the concept of 
rows and columns found in the internal implementation of Cassandra and in the 
thrift and CQL v2 API.</p><h3 id="Conventions">Convention
 s</h3><p>To aid in specifying the CQL syntax, we will use the following 
conventions in this document:</p><ul><li>Language rules will be given in a <a 
href="http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form";>BNF</a> -like 
notation:</li></ul><pre class="syntax"><pre>&lt;start> ::= TERMINAL 
&lt;non-terminal1> &lt;non-terminal1>
+<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD 
XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";><html 
xmlns="http://www.w3.org/1999/xhtml";><head><meta http-equiv="Content-Type" 
content="text/html; charset=utf-8"/><title>CQL</title></head><body><p><link 
rel="StyleSheet" href="CQL.css" type="text/css" media="screen"></p><h1 
id="CassandraQueryLanguageCQLv3.0.3">Cassandra Query Language (CQL) 
v3.0.3</h1><span id="tableOfContents"><ol style="list-style: none;"><li><a 
href="CQL.html#CassandraQueryLanguageCQLv3.0.3">Cassandra Query Language (CQL) 
v3.0.3</a><ol style="list-style: none;"><li><a href="CQL.html#CQLSyntax">CQL 
Syntax</a><ol style="list-style: none;"><li><a 
href="CQL.html#Preamble">Preamble</a></li><li><a 
href="CQL.html#Conventions">Conventions</a></li><li><a 
href="CQL.html#identifiers">Identifiers and keywords</a></li><li><a 
href="CQL.html#constants">Constants</a></li><li><a 
href="CQL.html#Comments">Comment
 s</a></li><li><a href="CQL.html#statements">Statements</a></li><li><a 
href="CQL.html#preparedStatement">Prepared Statement</a></li></ol></li><li><a 
href="CQL.html#dataDefinition">Data Definition</a><ol style="list-style: 
none;"><li><a href="CQL.html#createKeyspaceStmt">CREATE KEYSPACE</a></li><li><a 
href="CQL.html#useStmt">USE</a></li><li><a 
href="CQL.html#alterKeyspaceStmt">ALTER KEYSPACE</a></li><li><a 
href="CQL.html#dropKeyspaceStmt">DROP KEYSPACE</a></li><li><a 
href="CQL.html#createTableStmt">CREATE TABLE</a></li><li><a 
href="CQL.html#alterTableStmt">ALTER TABLE</a></li><li><a 
href="CQL.html#dropTableStmt">DROP TABLE</a></li><li><a 
href="CQL.html#truncateStmt">TRUNCATE</a></li><li><a 
href="CQL.html#createIndexStmt">CREATE INDEX</a></li><li><a 
href="CQL.html#dropIndexStmt">DROP INDEX</a></li></ol></li><li><a 
href="CQL.html#dataManipulation">Data Manipulation</a><ol style="list-style: 
none;"><li><a href="CQL.html#insertStmt">INSERT</a></li><li><a 
href="CQL.html#updateStmt"
 >UPDATE</a></li><li><a href="CQL.html#deleteStmt">DELETE</a></li><li><a 
 >href="CQL.html#batchStmt">BATCH</a></li></ol></li><li><a 
 >href="CQL.html#queries">Queries</a><ol style="list-style: none;"><li><a 
 >href="CQL.html#selectStmt">SELECT</a></li></ol></li><li><a 
 >href="CQL.html#types">Data Types</a><ol style="list-style: none;"><li><a 
 >href="CQL.html#usingdates">Working with dates</a></li><li><a 
 >href="CQL.html#counters">Counters</a></li><li><a 
 >href="CQL.html#collections">Working with collections</a></li></ol></li><li><a 
 >href="CQL.html#functions">Functions</a><ol style="list-style: none;"><li><a 
 >href="CQL.html#tokenFun">Token</a></li><li><a 
 >href="CQL.html#timeuuidFun">Timeuuid functions</a></li><li><a 
 >href="CQL.html#blobFun">Blob conversion functions</a></li></ol></li><li><a 
 >href="CQL.html#appendixA">Appendix A: CQL Keywords</a></li><li><a 
 >href="CQL.html#changes">Changes</a><ol style="list-style: none;"><li><a 
 >href="CQL.html#a3.0.3">3.0.3</a></li><li><a href="CQL.html#a3.0.2">3.0.
 2</a></li><li><a href="CQL.html#a3.0.1">3.0.1</a></li></ol></li><li><a 
href="CQL.html#Versioning">Versioning</a></li></ol></li></ol></span><h2 
id="CQLSyntax">CQL Syntax</h2><h3 id="Preamble">Preamble</h3><p>This document 
describes the Cassandra Query Language (CQL) version 3. CQL v3 is not backward 
compatible with CQL v2 and differs from it in numerous ways. Note that this 
document describes the last version of the languages. However, the <a 
href="#changes">changes</a> section provides the diff between the different 
versions of CQL v3.</p><p>CQL v3 offers a model very close to SQL in the sense 
that data is put in <em>tables</em> containing <em>rows</em> of 
<em>columns</em>. For that reason, when used in this document, these terms 
(tables, rows and columns) have the same definition than they have in SQL. But 
please note that as such, they do <strong>not</strong> refer to the concept of 
rows and columns found in the internal implementation of Cassandra and in the 
thrift and CQ
 L v2 API.</p><h3 id="Conventions">Conventions</h3><p>To aid in specifying the 
CQL syntax, we will use the following conventions in this 
document:</p><ul><li>Language rules will be given in a <a 
href="http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form";>BNF</a> -like 
notation:</li></ul><pre class="syntax"><pre>&lt;start> ::= TERMINAL 
&lt;non-terminal1> &lt;non-terminal1>
 </pre></pre><ul><li>Nonterminal symbols will have <code>&lt;angle 
brackets></code>.</li><li>As additional shortcut notations to BNF, we&#8217;ll 
use traditional regular expression&#8217;s symbols (<code>?</code>, 
<code>+</code> and <code>*</code>) to signify that a given symbol is optional 
and/or can be repeated. We&#8217;ll also allow parentheses to group symbols and 
the <code>[&lt;characters>]</code> notation to represent any one of 
<code>&lt;characters></code>.</li><li>The grammar is provided for documentation 
purposes and leave some minor details out. For instance, the last column 
definition in a <code>CREATE TABLE</code> statement is optional but supported 
if present even though the provided grammar in this document suggest it is not 
supported. </li><li>Sample code will be provided in a code block:</li></ul><pre 
class="sample"><pre>SELECT sample_usage FROM cql;
 </pre></pre><ul><li>References to keywords or pieces of CQL code in running 
text will be shown in a <code>fixed-width font</code>.</li></ul><h3 
id="identifiers">Identifiers and keywords</h3><p>The CQL language uses 
<em>identifiers</em> (or <em>names</em>) to identify tables, columns and other 
objects. An identifier is a token matching the regular expression <code 
lang="a-zA-Z">[a-zA-Z0-9_]</code><code>*</code>.</p><p>A number of such 
identifiers, like <code>SELECT</code> or <code>WITH</code>, are 
<em>keywords</em>. They have a fixed meaning for the language and most are 
reserved. The list of those keywords can be found in <a 
href="#appendixA">Appendix A</a>.</p><p>Identifiers and (unquoted) keywords are 
case insensitive. Thus <code>SELECT</code> is the same than <code>select</code> 
or <code>sElEcT</code>, and <code>myId</code> is the same than 
<code>myid</code> or <code>MYID</code> for instance. A convention often used 
(in particular by the samples of this documentation) is 
 to use upper case for keywords and lower case for other 
identifiers.</p><p>There is a second kind of identifiers called <em>quoted 
identifiers</em> defined by enclosing an arbitrary sequence of characters in 
double-quotes(<code>"</code>). Quoted identifiers are never keywords. Thus 
<code>"select"</code> is not a reserved keyword and can be used to refer to a 
column, while <code>select</code> would raise a parse error. Also, contrarily 
to unquoted identifiers and keywords, quoted identifiers are case sensitive 
(<code>"My Quoted Id"</code> is <em>different</em> from <code>"my quoted 
id"</code>). A fully lowercase quoted identifier that matches <code 
lang="a-zA-Z">[a-zA-Z0-9_]</code><code>*</code> is equivalent to the unquoted 
identifier obtained by removing the double-quote (so <code>"myid"</code> is 
equivalent to <code>myid</code> and to <code>myId</code> but different from 
<code>"myId"</code>). Inside a quoted identifier, the double-quote character 
can be repeated to escape 
 it, so <code>"foo "" bar"</code> is a valid identifier.</p><h3 
id="constants">Constants</h3><p>CQL defines the following kind of 
<em>constants</em>: strings, integers, floats, booleans, uuids and 
blobs:</p><ul><li>A string constant is an arbitrary sequence of characters 
characters enclosed by single-quote(<code>'</code>). One can include a 
single-quote in a string by repeating it, e.g. <code>'It''s raining 
today'</code>. Those are not to be confused with quoted identifiers that use 
double-quotes.</li><li>An integer constant is defined by 
<code>'-'?[0-9]+</code>.</li><li>A float constant is defined by 
<code>'-'?[0-9]+('.'[0-9]*)?([eE][+-]?[0-9+])?</code>.</li><li>A boolean 
constant is either <code>true</code> or <code>false</code> up to 
case-insensitivity (i.e. <code>True</code> is a valid boolean 
constant).</li><li>A <a 
href="http://en.wikipedia.org/wiki/Universally_unique_identifier";>UUID</a> 
constant is defined by <code>hex{8}-hex{4}-hex{4}-hex{4}-hex{12}</code> where 
<cod
 e>hex</code> is an hexadecimal character, e.g. <code>[0-9a-fA-F]</code> and 
<code>{4}</code> is the number of such characters.</li><li>A blob constant is 
an hexadecimal number defined by <code>0[xX](hex)+</code> where 
<code>hex</code> is an hexadecimal character, e.g. 
<code>[0-9a-fA-F]</code>.</li></ul><p>For how these constants are typed, see 
the <a href="#types">data types section</a>.</p><h3 
id="Comments">Comments</h3><p>A comment in CQL is a line beginning by either 
double dashes (<code>--</code>) or double slash (<code>//</code>).</p><pre 
class="sample"><pre>-- This is a comment
 // This is a comment too
@@ -109,9 +109,11 @@ WITH comment = 'A most excellent and use
 </pre></pre><p><i>Sample:</i></p><pre class="sample"><pre>DROP TABLE 
worldSeriesAttendees;
 </pre></pre><p>The <code>DROP TABLE</code> statement results in the immediate, 
irreversible removal of a table, including all data contained in it. As for 
table creation, <code>DROP COLUMNFAMILY</code> is allowed as an alias for 
<code>DROP TABLE</code>.</p><h3 
id="truncateStmt">TRUNCATE</h3><p><i>Syntax:</i></p><pre 
class="syntax"><pre>&lt;truncate-stmt> ::= TRUNCATE &lt;tablename>
 </pre></pre><p><i>Sample:</i></p><pre class="sample"><pre>TRUNCATE 
superImportantData;
-</pre></pre><p>The <code>TRUNCATE</code> statement permanently removes all 
data from a table.</p><h3 id="createIndexStmt">CREATE 
INDEX</h3><p><i>Syntax:</i></p><pre class="syntax"><pre>&lt;create-index-stmt> 
::= CREATE INDEX &lt;identifier>? ON &lt;tablename> '(' &lt;identifier> ')'
+</pre></pre><p>The <code>TRUNCATE</code> statement permanently removes all 
data from a table.</p><h3 id="createIndexStmt">CREATE 
INDEX</h3><p><i>Syntax:</i></p><pre class="syntax"><pre>&lt;create-index-stmt> 
::= CREATE ( CUSTOM )? INDEX &lt;identifier>? ON &lt;tablename> '(' 
&lt;identifier> ')'
+                                        ( WITH &lt;properties> )?
 </pre></pre><p><i>Sample:</i></p><pre class="sample"><pre>CREATE INDEX 
userIndex ON NerdMovies (user);
 CREATE INDEX ON Mutants (abilityId);
+CREATE CUSTOM INDEX ON users (email) WITH options = {'class': 
'path.to.the.IndexClass'};
 </pre></pre><p>The <code>CREATE INDEX</code> statement is used to create a new 
(automatic) secondary index for a given (existing) column in a given table. A 
name for the index itself can be specified before the <code>ON</code> keyword, 
if desired. If data already exists for the column, it will be indexed during 
the execution of this statement. After the index is created, new data for the 
column is indexed automatically at insertion time.</p><h3 
id="dropIndexStmt">DROP INDEX</h3><p><i>Syntax:</i></p><pre 
class="syntax"><pre>&lt;drop-index-stmt> ::= DROP INDEX &lt;identifier>
 </pre></pre><p><i>Sample:</i></p><pre class="sample"><pre>DROP INDEX userIndex;
 </pre></pre><p>The <code>DROP INDEX</code> statement is used to drop an 
existing secondary index. The argument of the statement is the index 
name.</p><h2 id="dataManipulation">Data Manipulation</h2><h3 
id="insertStmt">INSERT</h3><p><i>Syntax:</i></p><pre 
class="syntax"><pre>&lt;insertStatement> ::= INSERT INTO &lt;tablename>
@@ -307,4 +309,4 @@ UPDATE plays SET scores = scores - [ 12,
 )
 </pre></pre><p>then the <code>token</code> function will take a single 
argument of type <code>text</code> (in that case, the partition key is 
<code>userid</code> (there is no clustering key so the partition key is the 
same than the primary key)), and the return type will be 
<code>bigint</code>.</p><h3 id="timeuuidFun">Timeuuid functions</h3><h4 
id="now"><code>now</code></h4><p>The <code>now</code> function takes no 
arguments and generates a new unique timeuuid (at the time where the statement 
using it is executed). Note that this method is useful for insertion but is 
largely non-sensical in <code>WHERE</code> clauses. For instance, a query of 
the form</p><pre class="sample"><pre>SELECT * FROM myTable WHERE t = now()
 </pre></pre><p>will never return any result by design, since the value 
returned by <code>now()</code> is guaranteed to be unique.</p><h4 
id="minTimeuuidandmaxTimeuuid"><code>minTimeuuid</code> and 
<code>maxTimeuuid</code></h4><p>The <code>minTimeuuid</code> (resp. 
<code>maxTimeuuid</code>) function takes a <code>timestamp</code> value 
<code>t</code> (which can be <a href="#usingdates">either a timestamp or a date 
string</a>) and return a <em>fake</em> <code>timeuuid</code> corresponding to 
the <em>smallest</em> (resp. <em>biggest</em>) possible <code>timeuuid</code> 
having for timestamp <code>t</code>. So for instance:</p> <pre 
class="sample"><pre>SELECT * FROM myTable WHERE t > maxTimeuuid('2013-01-01 
00:05+0000') AND t &lt; minTimeuuid('2013-02-02 10:00+0000')
-</pre></pre> <p>will select all rows where the <code>timeuuid</code> column 
<code>t</code> is strictly older than &#8216;2013-01-01 00:05+0000&#8217; but 
stricly younger than &#8216;2013-02-02 10:00+0000&#8217;.  Please note that 
<code>t >= maxTimeuuid('2013-01-01 00:05+0000')</code> would still <em>not</em> 
select a <code>timeuuid</code> generated exactly at &#8216;2013-01-01 
00:05+0000&#8217; and is essentially equivalent to <code>t > 
maxTimeuuid('2013-01-01 00:05+0000')</code>.</p><p><em>Warning</em>: We called 
the values generated by <code>minTimeuuid</code> and <code>maxTimeuuid</code> 
<em>fake</em> UUID because they do no respect the Time-Based UUID generation 
process specified by the <a href="http://www.ietf.org/rfc/rfc4122.txt";>RFC 
4122</a>. In particular, the value returned by these 2 methods will not be 
unique. This means you should only use those methods for querying (as in the 
example above). Inserting the result of those methods is almost certainly <em>a 
bad ide
 a</em>.</p><h4 id="dateOfandunixTimestampOf"><code>dateOf</code> and 
<code>unixTimestampOf</code></h4><p>The <code>dateOf</code> and 
<code>unixTimestampOf</code> functions take a <code>timeuuid</code> argument 
and extract the embeded timestamp. However, while the <code>dateof</code> 
function return it with the <code>timestamp</code> type (that most client, 
including cqlsh, interpret as a date), the <code>unixTimestampOf</code> 
function returns it as a <code>bigint</code> raw value.</p><h3 
id="blobFun">Blob conversion functions</h3><p>A number of functions are 
provided to &#8220;convert&#8221; the native types into binary data 
(<code>blob</code>). For every <code>&lt;native-type></code> <code>type</code> 
supported by CQL3 (a notable exceptions is <code>blob</code>, for obvious 
reasons), the function <code>typeAsBlob</code> takes a argument of type 
<code>type</code> and return it as a <code>blob</code>.  Conversely, the 
function <code>blobAsType</code> takes a 64-bit <code>blo
 b</code> argument and convert it to a <code>bigint</code> value.  And so for 
instance, <code>bigintAsBlob(3)</code> is <code>0x0000000000000003</code> and 
<code>blobAsBigint(0x0000000000000003)</code> is <code>3</code>.</p><h2 
id="appendixA">Appendix A: CQL Keywords</h2><p>CQL distinguishes between 
<em>reserved</em> and <em>non-reserved</em> 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 identifer otherwise. The only <em>raison d'être</em> 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.</p><table><tr><th>Keyword      </th><th>Reserved? 
</th></tr><tr><td><code>ADD</code>          </td><td>yes 
</td></tr><tr><td><code>ALL</code>
           </td><td>no  </td></tr><tr><td><code>ALTER</code>        
</td><td>yes </td></tr><tr><td><code>AND</code>          </td><td>yes 
</td></tr><tr><td><code>ANY</code>          </td><td>yes 
</td></tr><tr><td><code>APPLY</code>        </td><td>yes 
</td></tr><tr><td><code>ASC</code>          </td><td>yes 
</td></tr><tr><td><code>ASCII</code>        </td><td>no  
</td></tr><tr><td><code>AUTHORIZE</code>    </td><td>yes 
</td></tr><tr><td><code>BATCH</code>        </td><td>yes 
</td></tr><tr><td><code>BEGIN</code>        </td><td>yes 
</td></tr><tr><td><code>BIGINT</code>       </td><td>no  
</td></tr><tr><td><code>BLOB</code>         </td><td>no  
</td></tr><tr><td><code>BOOLEAN</code>      </td><td>no  
</td></tr><tr><td><code>BY</code>           </td><td>yes 
</td></tr><tr><td><code>CLUSTERING</code>   </td><td>no  
</td></tr><tr><td><code>COLUMNFAMLY</code>  </td><td>yes 
</td></tr><tr><td><code>COMPACT</code>      </td><td>no  
</td></tr><tr><td><code>CONSITENCY</code>   </td><td>n
 o  </td></tr><tr><td><code>COUNT</code>        </td><td>no  
</td></tr><tr><td><code>COUNTER</code>      </td><td>no  
</td></tr><tr><td><code>CREATE</code>       </td><td>yes 
</td></tr><tr><td><code>DECIMAL</code>      </td><td>no  
</td></tr><tr><td><code>DELETE</code>       </td><td>yes 
</td></tr><tr><td><code>DESC</code>         </td><td>yes 
</td></tr><tr><td><code>DOUBLE</code>       </td><td>no  
</td></tr><tr><td><code>DROP</code>         </td><td>yes 
</td></tr><tr><td><code>EACH_QUORUM</code>  </td><td>yes 
</td></tr><tr><td><code>FLOAT</code>        </td><td>no  
</td></tr><tr><td><code>FROM</code>         </td><td>yes 
</td></tr><tr><td><code>GRANT</code>        </td><td>yes 
</td></tr><tr><td><code>IN</code>           </td><td>yes 
</td></tr><tr><td><code>INDEX</code>        </td><td>yes 
</td></tr><tr><td><code>INSERT</code>       </td><td>yes 
</td></tr><tr><td><code>INT</code>          </td><td>no  
</td></tr><tr><td><code>INTO</code>         </td><td>yes </td></tr><tr><td
 ><code>KEY</code>          </td><td>no  
 ></td></tr><tr><td><code>KEYSPACE</code>     </td><td>yes 
 ></td></tr><tr><td><code>LEVEL</code>        </td><td>no  
 ></td></tr><tr><td><code>LIMIT</code>        </td><td>yes 
 ></td></tr><tr><td><code>LOCAL_QUORUM</code> </td><td>yes 
 ></td></tr><tr><td><code>MODIFY</code>       </td><td>yes 
 ></td></tr><tr><td><code>NORECURSIVE</code>  </td><td>yes 
 ></td></tr><tr><td><code>NOSUPERUSER</code>  </td><td>no  
 ></td></tr><tr><td><code>OF</code>           </td><td>yes 
 ></td></tr><tr><td><code>ON</code>           </td><td>yes 
 ></td></tr><tr><td><code>ONE</code>          </td><td>yes 
 ></td></tr><tr><td><code>ORDER</code>        </td><td>yes 
 ></td></tr><tr><td><code>PASSWORD</code>     </td><td>no  
 ></td></tr><tr><td><code>PERMISSION</code>   </td><td>no  
 ></td></tr><tr><td><code>PERMISSIONS</code>  </td><td>no  
 ></td></tr><tr><td><code>PRIMARY</code>      </td><td>yes 
 ></td></tr><tr><td><code>QUORUM</code>       </td><td>yes 
 ></td></tr><tr><td><code>REVOKE</code>
        </td><td>yes </td></tr><tr><td><code>SCHEMA</code>       </td><td>yes 
</td></tr><tr><td><code>SELECT</code>       </td><td>yes 
</td></tr><tr><td><code>SET</code>          </td><td>yes 
</td></tr><tr><td><code>STORAGE</code>      </td><td>no  
</td></tr><tr><td><code>SUPERUSER</code>    </td><td>no  
</td></tr><tr><td><code>TABLE</code>        </td><td>yes 
</td></tr><tr><td><code>TEXT</code>         </td><td>no  
</td></tr><tr><td><code>TIMESTAMP</code>    </td><td>no  
</td></tr><tr><td><code>TIMEUUID</code>     </td><td>no  
</td></tr><tr><td><code>THREE</code>        </td><td>yes 
</td></tr><tr><td><code>TOKEN</code>        </td><td>yes 
</td></tr><tr><td><code>TRUNCATE</code>     </td><td>yes 
</td></tr><tr><td><code>TTL</code>          </td><td>no  
</td></tr><tr><td><code>TWO</code>          </td><td>yes 
</td></tr><tr><td><code>TYPE</code>         </td><td>no  
</td></tr><tr><td><code>UPDATE</code>       </td><td>yes 
</td></tr><tr><td><code>USE</code>          </td><td>yes 
 </td></tr><tr><td><code>USER</code>         </td><td>no  
</td></tr><tr><td><code>USERS</code>        </td><td>no  
</td></tr><tr><td><code>USING</code>        </td><td>yes 
</td></tr><tr><td><code>UUID</code>         </td><td>no  
</td></tr><tr><td><code>VALUES</code>       </td><td>no  
</td></tr><tr><td><code>VARCHAR</code>      </td><td>no  
</td></tr><tr><td><code>VARINT</code>       </td><td>no  
</td></tr><tr><td><code>WHERE</code>        </td><td>yes 
</td></tr><tr><td><code>WITH</code>         </td><td>yes 
</td></tr><tr><td><code>WRITETIME</code>    </td><td>no  </td></tr></table><h2 
id="changes">Changes</h2><p>The following describes the addition/changes 
brought for each version of CQL.</p><h3 id="a3.0.2">3.0.2</h3><ul><li>Type 
validation for the <a href="#constants">constants</a> has been fixed. For 
instance, the implementation used to allow <code>'2'</code> as a valid value 
for an <code>int</code> column (interpreting it has the equivalent of 
<code>2</code>), or <code>42
 </code> as a valid <code>blob</code> value (in which case <code>42</code> 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 <a 
href="#types">data types</a> section for details on which constant is allowed 
for which type.</li><li>The type validation fixed of the previous point has 
lead to the introduction of <a href="#constants">blobs constants</a> to allow 
inputing blobs. Do note that while inputing blobs as strings constant is still 
supported by this version (to allow smoother transition to blob constant), it 
is now deprecated (in particular the <a href="#types">data types</a> section 
does not list strings constants as valid blobs) 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.</li><li>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 <a 
href="#functions">section on functions</a> for details.</li></ul><h3 
id="a3.0.1">3.0.1</h3><ul><li><a href="#usingdates">Date strings</a> (and 
timestamps) are no longer accepted as valid <code>timeuuid</code> values. Doing 
so was a bug in the sense that date string are not valid <code>timeuuid</code>, 
and it was thus resulting in <a 
href="https://issues.apache.org/jira/browse/CASSANDRA-4936";>confusing 
behaviors</a>.  However, the following new methods have been added to help 
working with <code>timeuuid</code>: <code>now</code>, <code>minTimeuuid</code>, 
<code>maxTimeuuid</code> , <code>dateOf</code> and 
<code>unixTimestampOf</code>. See the <a href="#usingtimeuuid">section 
dedicated to these methods</a> for more detail.</li><li>&#8220;Float 
constants&#8221;#constants now support the exponent notation. In other words, 
<code>4.2E10</code> is now a valid floating point value.</li></ul><h2 
id="Versioning">Versi
 oning</h2><p>Versioning of the CQL language adheres to the <a 
href="http://semver.org";>Semantic Versioning</a> 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.</p><table><tr><th>version</th><th>description</th></tr><tr><td>Major   
  </td><td>The major version <em>must</em> be bumped when backward incompatible 
changes are introduced. This should rarely occur.</td></tr><tr><td>Minor     
</td><td>Minor version increments occur when new, but backward compatible, 
functionality is introduced.</td></tr><tr><td>Patch     </td><td>The patch 
version is incremented when bugs are fixed.</td></tr></table></body></html>
\ No newline at end of file
+</pre></pre> <p>will select all rows where the <code>timeuuid</code> column 
<code>t</code> is strictly older than &#8216;2013-01-01 00:05+0000&#8217; but 
stricly younger than &#8216;2013-02-02 10:00+0000&#8217;.  Please note that 
<code>t >= maxTimeuuid('2013-01-01 00:05+0000')</code> would still <em>not</em> 
select a <code>timeuuid</code> generated exactly at &#8216;2013-01-01 
00:05+0000&#8217; and is essentially equivalent to <code>t > 
maxTimeuuid('2013-01-01 00:05+0000')</code>.</p><p><em>Warning</em>: We called 
the values generated by <code>minTimeuuid</code> and <code>maxTimeuuid</code> 
<em>fake</em> UUID because they do no respect the Time-Based UUID generation 
process specified by the <a href="http://www.ietf.org/rfc/rfc4122.txt";>RFC 
4122</a>. In particular, the value returned by these 2 methods will not be 
unique. This means you should only use those methods for querying (as in the 
example above). Inserting the result of those methods is almost certainly <em>a 
bad ide
 a</em>.</p><h4 id="dateOfandunixTimestampOf"><code>dateOf</code> and 
<code>unixTimestampOf</code></h4><p>The <code>dateOf</code> and 
<code>unixTimestampOf</code> functions take a <code>timeuuid</code> argument 
and extract the embeded timestamp. However, while the <code>dateof</code> 
function return it with the <code>timestamp</code> type (that most client, 
including cqlsh, interpret as a date), the <code>unixTimestampOf</code> 
function returns it as a <code>bigint</code> raw value.</p><h3 
id="blobFun">Blob conversion functions</h3><p>A number of functions are 
provided to &#8220;convert&#8221; the native types into binary data 
(<code>blob</code>). For every <code>&lt;native-type></code> <code>type</code> 
supported by CQL3 (a notable exceptions is <code>blob</code>, for obvious 
reasons), the function <code>typeAsBlob</code> takes a argument of type 
<code>type</code> and return it as a <code>blob</code>.  Conversely, the 
function <code>blobAsType</code> takes a 64-bit <code>blo
 b</code> argument and convert it to a <code>bigint</code> value.  And so for 
instance, <code>bigintAsBlob(3)</code> is <code>0x0000000000000003</code> and 
<code>blobAsBigint(0x0000000000000003)</code> is <code>3</code>.</p><h2 
id="appendixA">Appendix A: CQL Keywords</h2><p>CQL distinguishes between 
<em>reserved</em> and <em>non-reserved</em> 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 identifer otherwise. The only <em>raison d'être</em> 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.</p><table><tr><th>Keyword      </th><th>Reserved? 
</th></tr><tr><td><code>ADD</code>          </td><td>yes 
</td></tr><tr><td><code>ALL</code>
           </td><td>no  </td></tr><tr><td><code>ALTER</code>        
</td><td>yes </td></tr><tr><td><code>AND</code>          </td><td>yes 
</td></tr><tr><td><code>ANY</code>          </td><td>yes 
</td></tr><tr><td><code>APPLY</code>        </td><td>yes 
</td></tr><tr><td><code>ASC</code>          </td><td>yes 
</td></tr><tr><td><code>ASCII</code>        </td><td>no  
</td></tr><tr><td><code>AUTHORIZE</code>    </td><td>yes 
</td></tr><tr><td><code>BATCH</code>        </td><td>yes 
</td></tr><tr><td><code>BEGIN</code>        </td><td>yes 
</td></tr><tr><td><code>BIGINT</code>       </td><td>no  
</td></tr><tr><td><code>BLOB</code>         </td><td>no  
</td></tr><tr><td><code>BOOLEAN</code>      </td><td>no  
</td></tr><tr><td><code>BY</code>           </td><td>yes 
</td></tr><tr><td><code>CLUSTERING</code>   </td><td>no  
</td></tr><tr><td><code>COLUMNFAMILY</code> </td><td>yes 
</td></tr><tr><td><code>COMPACT</code>      </td><td>no  
</td></tr><tr><td><code>CONSISTENCY</code>  </td><td>n
 o  </td></tr><tr><td><code>COUNT</code>        </td><td>no  
</td></tr><tr><td><code>COUNTER</code>      </td><td>no  
</td></tr><tr><td><code>CREATE</code>       </td><td>yes 
</td></tr><tr><td><code>DECIMAL</code>      </td><td>no  
</td></tr><tr><td><code>DELETE</code>       </td><td>yes 
</td></tr><tr><td><code>DESC</code>         </td><td>yes 
</td></tr><tr><td><code>DOUBLE</code>       </td><td>no  
</td></tr><tr><td><code>DROP</code>         </td><td>yes 
</td></tr><tr><td><code>EACH_QUORUM</code>  </td><td>yes 
</td></tr><tr><td><code>FLOAT</code>        </td><td>no  
</td></tr><tr><td><code>FROM</code>         </td><td>yes 
</td></tr><tr><td><code>GRANT</code>        </td><td>yes 
</td></tr><tr><td><code>IN</code>           </td><td>yes 
</td></tr><tr><td><code>INDEX</code>        </td><td>yes 
</td></tr><tr><td><code>CUSTOM</code>       </td><td>no  
</td></tr><tr><td><code>INSERT</code>       </td><td>yes 
</td></tr><tr><td><code>INT</code>          </td><td>no  </td></tr><tr><td
 ><code>INTO</code>         </td><td>yes </td></tr><tr><td><code>KEY</code>     
 >     </td><td>no  </td></tr><tr><td><code>KEYSPACE</code>     </td><td>yes 
 ></td></tr><tr><td><code>LEVEL</code>        </td><td>no  
 ></td></tr><tr><td><code>LIMIT</code>        </td><td>yes 
 ></td></tr><tr><td><code>LOCAL_QUORUM</code> </td><td>yes 
 ></td></tr><tr><td><code>MODIFY</code>       </td><td>yes 
 ></td></tr><tr><td><code>NORECURSIVE</code>  </td><td>yes 
 ></td></tr><tr><td><code>NOSUPERUSER</code>  </td><td>no  
 ></td></tr><tr><td><code>OF</code>           </td><td>yes 
 ></td></tr><tr><td><code>ON</code>           </td><td>yes 
 ></td></tr><tr><td><code>ONE</code>          </td><td>yes 
 ></td></tr><tr><td><code>ORDER</code>        </td><td>yes 
 ></td></tr><tr><td><code>PASSWORD</code>     </td><td>no  
 ></td></tr><tr><td><code>PERMISSION</code>   </td><td>no  
 ></td></tr><tr><td><code>PERMISSIONS</code>  </td><td>no  
 ></td></tr><tr><td><code>PRIMARY</code>      </td><td>yes 
 ></td></tr><tr><td><code>QUORUM</code>
        </td><td>yes </td></tr><tr><td><code>REVOKE</code>       </td><td>yes 
</td></tr><tr><td><code>SCHEMA</code>       </td><td>yes 
</td></tr><tr><td><code>SELECT</code>       </td><td>yes 
</td></tr><tr><td><code>SET</code>          </td><td>yes 
</td></tr><tr><td><code>STORAGE</code>      </td><td>no  
</td></tr><tr><td><code>SUPERUSER</code>    </td><td>no  
</td></tr><tr><td><code>TABLE</code>        </td><td>yes 
</td></tr><tr><td><code>TEXT</code>         </td><td>no  
</td></tr><tr><td><code>TIMESTAMP</code>    </td><td>no  
</td></tr><tr><td><code>TIMEUUID</code>     </td><td>no  
</td></tr><tr><td><code>THREE</code>        </td><td>yes 
</td></tr><tr><td><code>TOKEN</code>        </td><td>yes 
</td></tr><tr><td><code>TRUNCATE</code>     </td><td>yes 
</td></tr><tr><td><code>TTL</code>          </td><td>no  
</td></tr><tr><td><code>TWO</code>          </td><td>yes 
</td></tr><tr><td><code>TYPE</code>         </td><td>no  
</td></tr><tr><td><code>UPDATE</code>       </td><td>yes 
 </td></tr><tr><td><code>USE</code>          </td><td>yes 
</td></tr><tr><td><code>USER</code>         </td><td>no  
</td></tr><tr><td><code>USERS</code>        </td><td>no  
</td></tr><tr><td><code>USING</code>        </td><td>yes 
</td></tr><tr><td><code>UUID</code>         </td><td>no  
</td></tr><tr><td><code>VALUES</code>       </td><td>no  
</td></tr><tr><td><code>VARCHAR</code>      </td><td>no  
</td></tr><tr><td><code>VARINT</code>       </td><td>no  
</td></tr><tr><td><code>WHERE</code>        </td><td>yes 
</td></tr><tr><td><code>WITH</code>         </td><td>yes 
</td></tr><tr><td><code>WRITETIME</code>    </td><td>no  </td></tr></table><h2 
id="changes">Changes</h2><p>The following describes the addition/changes 
brought for each version of CQL.</p><h3 id="a3.0.3">3.0.3</h3><ul><li>Support 
for custom <a href="#createIndexStmt">secondary indexes</a> has been 
added.</li></ul><h3 id="a3.0.2">3.0.2</h3><ul><li>Type validation for the <a 
href="#constants">constants</a> has been fi
 xed. For instance, the implementation used to allow <code>'2'</code> as a 
valid value for an <code>int</code> column (interpreting it has the equivalent 
of <code>2</code>), or <code>42</code> as a valid <code>blob</code> value (in 
which case <code>42</code> 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 <a href="#types">data types</a> section for details on which 
constant is allowed for which type.</li><li>The type validation fixed of the 
previous point has lead to the introduction of <a href="#constants">blobs 
constants</a> to allow inputing blobs. Do note that while inputing blobs as 
strings constant is still supported by this version (to allow smoother 
transition to blob constant), it is now deprecated (in particular the <a 
href="#types">data types</a> section does not list strings constants as valid 
blobs) 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.</li><li>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 <a href="#functions">section on functions</a> for 
details.</li></ul><h3 id="a3.0.1">3.0.1</h3><ul><li><a href="#usingdates">Date 
strings</a> (and timestamps) are no longer accepted as valid 
<code>timeuuid</code> values. Doing so was a bug in the sense that date string 
are not valid <code>timeuuid</code>, and it was thus resulting in <a 
href="https://issues.apache.org/jira/browse/CASSANDRA-4936";>confusing 
behaviors</a>.  However, the following new methods have been added to help 
working with <code>timeuuid</code>: <code>now</code>, <code>minTimeuuid</code>, 
<code>maxTimeuuid</code> , <code>dateOf</code> and 
<code>unixTimestampOf</code>. See the <a href="#usingtimeuuid">section 
dedicated to these methods</a> for more detail.</li><l
 i>&#8220;Float constants&#8221;#constants now support the exponent notation. 
In other words, <code>4.2E10</code> is now a valid floating point 
value.</li></ul><h2 id="Versioning">Versioning</h2><p>Versioning of the CQL 
language adheres to the <a href="http://semver.org";>Semantic Versioning</a> 
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.</p><table><tr><th>version</th><th>description</th></tr><tr><td>Major   
  </td><td>The major version <em>must</em> be bumped when backward incompatible 
changes are introduced. This should rarely occur.</td></tr><tr><td>Minor     
</td><td>Minor version increments occur when new, but backward compatible, 
functionality is introduced.</td></tr><tr><td>Patch     </td><td>The patch 
version is incremented when bugs are fixed.</td></tr></table></body></html>
\ No newline at end of file


Reply via email to