定义
约定
为了帮助指定 CQL 语法,我们将在本文档中使用以下约定
-
语言规则将以非正式的 BNF 变体 表示法给出。特别是,我们将使用方括号 (
[ item ]
) 表示可选项目,*
和+
表示重复项目(其中+
表示至少一个)。 -
语法还将使用以下约定以方便起见:非终结符将使用小写字母(并链接到它们的定义),而终结符关键字将以“全部大写”提供。但是请注意,关键字是
标识符
,因此在实践中不区分大小写。我们还将使用正则表达式定义一些早期构造,我们将用re(<some regular expression>)
表示。 -
语法是为了文档目的而提供的,并省略了一些细微之处。例如,
CREATE TABLE
语句中最后一个列定义的逗号是可选的,但即使本文档中的语法建议并非如此,如果存在,也会得到支持。此外,并非语法接受的所有内容都一定是有效的 CQL。 -
对运行文本中关键字或 CQL 代码片段的引用将以
等宽字体
显示。
标识符和关键字
CQL 语言使用标识符(或名称)来标识表、列和其他对象。标识符是与正则表达式[a-zA-Z][a-zA-Z0-9_]*
匹配的标记。
一些这样的标识符,如SELECT
或WITH
,是关键字。它们对语言有固定的含义,大多数是保留的。这些关键字的列表可以在附录 A中找到。
标识符和(未加引号的)关键字不区分大小写。因此,SELECT
与select
或sElEcT
相同,myId
与myid
或MYID
相同。通常使用的一种约定(特别是此文档的示例)是使用大写字母表示关键字,使用小写字母表示其他标识符。
还有一种称为带引号的标识符的标识符,通过将任意字符序列(非空)括在双引号 ("
) 中来定义。带引号的标识符永远不会是关键字。因此,"select"
不是保留关键字,可以用来引用列(注意,使用这种方法特别不建议),而select
会引发解析错误。此外,与未加引号的标识符和关键字不同,带引号的标识符区分大小写("My Quoted Id"
与"my quoted id"
不同)。但是,与[a-zA-Z][a-zA-Z0-9_]*
匹配的完全小写的带引号的标识符与通过删除双引号获得的未加引号的标识符等效(因此,"myid"
等效于myid
和myId
,但与"myId"
不同)。在带引号的标识符中,双引号字符可以重复以转义它,因此"foo "" bar"
是一个有效的标识符。
带引号的标识符可以声明具有任意名称的列,这些名称有时会与服务器使用的特定名称冲突。例如,在使用条件更新时,服务器将使用包含名为 |
更正式地说,我们有
identifier::= unquoted_identifier | quoted_identifier
unquoted_identifier::= re('[a-zA-Z][link:[a-zA-Z0-9]]*')
quoted_identifier::= '"' (any character where " can appear if doubled)+ '"'
常量
CQL 定义了以下常量
constant::= string | integer | float | boolean | uuid | blob | NULL
string::= ''' (any character where ' can appear if doubled)+ ''' : '$$' (any character other than '$$') '$$'
integer::= re('-?[0-9]+')
float::= re('-?[0-9]+(.[0-9]*)?([eE][+-]?[0-9+])?') | NAN | INFINITY
boolean::= TRUE | FALSE
uuid::= hex\{8}-hex\{4}-hex\{4}-hex\{4}-hex\{12}
hex::= re("[0-9a-fA-F]")
blob::= '0' ('x' | 'X') hex+
换句话说
-
字符串常量是任意字符序列,用单引号 (
'
) 括起来。可以通过重复单引号来包含单引号,例如'It''s raining today'
。这些不要与使用双引号的带引号的标识符
混淆。或者,可以通过用两个美元符号括起来来定义字符串,在这种情况下,单引号可以在不转义的情况下使用(It's raining today
)。后一种形式通常在定义用户定义函数 时使用,以避免在函数体中转义单引号字符(因为它们比$$
更可能出现)。 -
整数、浮点数和布尔常量按预期定义。但是请注意,浮点数允许特殊常量
NaN
和Infinity
。 -
CQL 支持UUID 常量。
-
blob 的内容以十六进制提供,并以
0x
为前缀。 -
特殊常量
NULL
表示没有值。
有关这些常量的类型,请参见数据类型 部分。
术语
CQL 有术语的概念,它表示 CQL 支持的值类型。术语由以下内容定义
term::= constant | literal | function_call | arithmetic_operation | type_hint | bind_marker
literal::= collection_literal | vector_literal | udt_literal | tuple_literal
function_call::= identifier '(' [ term (',' term)* ] ')'
arithmetic_operation::= '-' term | term ('+' | '-' | '*' | '/' | '%') term
type_hint::= '(' cql_type ')' term
bind_marker::= '?' | ':' identifier
因此,术语是以下之一
注释
CQL 中的注释是以下任一内容开头的行:双破折号 (--
) 或双斜杠 (//
)。
多行注释也受支持,方法是在/
和 /
之间括起来(但不支持嵌套)。
-- This is a comment
// This is a comment too
/* This is
a multi-line comment */
语句
CQL 由可以分为以下类别的语句组成
-
data-definition
语句,用于定义和更改数据的存储方式(键空间和表)。 -
data-manipulation
语句,用于选择、插入和删除数据。 -
secondary-indexes
语句。 -
materialized-views
语句。 -
cql-roles
语句。 -
cql-permissions
语句。 -
用户定义函数 (UDF)
语句。 -
udts
语句。 -
cql-triggers
语句。
所有语句都列在下面,并在本文档的其余部分中进行了描述(请参见上面的链接)
cql_statement::= statement [ ';' ]
statement:=: ddl_statement :
| dml_statement
| secondary_index_statement
| materialized_view_statement
| role_or_permission_statement
| udf_statement
| udt_statement
| trigger_statement
ddl_statement::= use_statement
| create_keyspace_statement
| alter_keyspace_statement
| drop_keyspace_statement
| create_table_statement
| alter_table_statement
| drop_table_statement
| truncate_statement
dml_statement::= select_statement
| insert_statement
| update_statement
| delete_statement
| batch_statement
secondary_index_statement::= create_index_statement
| drop_index_statement
materialized_view_statement::= create_materialized_view_statement
| drop_materialized_view_statement
role_or_permission_statement::= create_role_statement
| alter_role_statement
| drop_role_statement
| grant_role_statement
| revoke_role_statement
| list_roles_statement
| grant_permission_statement
| revoke_permission_statement
| list_permissions_statement
| create_user_statement
| alter_user_statement
| drop_user_statement
| list_users_statement
udf_statement::= create_function_statement
| drop_function_statement
| create_aggregate_statement
| drop_aggregate_statement
udt_statement::= create_type_statement
| alter_type_statement
| drop_type_statement
trigger_statement::= create_trigger_statement
| drop_trigger_statement