정의

정의 (Definitions)

출처: 문서

본문

규약 (Conventions)

CQL 문법을 지정할 때 이 문서에서는 다음 규약을 사용해요:

  • 언어 규칙은 비공식적인 BNF 변형 표기법(Backus–Naur Form variant notation)으로 제공됩니다. 특히 선택 항목에는 대괄호([ item ])를, 반복 항목에는 *+를 사용해요(+는 최소 하나 이상을 의미).
  • 문법은 편의를 위해 다음 규약도 사용합니다: 비종단(non-terminal) 항목은 소문자로 표기하고(그 정의로 연결됨), 종단 키워드는 "전부 대문자"로 제공해요. 다만 키워드는 식별자이므로 실제로는 대소문자를 구분하지 않습니다. 또한 일부 초기 구성을 정규표현식으로 정의하는데, re(<정규표현식>)으로 표시해요.
  • 문법은 문서화 목적으로 제공되며 세부적인 내용 일부는 생략합니다. 예를 들어 CREATE TABLE 문의 마지막 컬럼 정의에 있는 쉼표는 선택적이지만, 이 문서의 문법이 그렇지 않다고 시사하더라도 존재하면 지원됩니다. 또한 문법이 받아들이는 모든 것이 반드시 유효한 CQL은 아닙니다.
  • 본문에서 키워드나 CQL 코드 조각을 참조할 때는 고정폭 글꼴로 표시됩니다.

식별자와 키워드

CQL 언어는 테이블, 컬럼 및 기타 객체를 식별하기 위해 식별자(identifier, 또는 이름)를 사용해요. 식별자는 정규표현식 [a-zA-Z][a-zA-Z0-9_]*과 일치하는 토큰입니다.

SELECTWITH 같은 많은 식별자는 키워드입니다. 언어에서 고정된 의미를 가지며 대부분 예약되어 있어요. 그 키워드 목록은 부록 A에서 확인할 수 있습니다.

식별자와 (따옴표 없이 쓰인) 키워드는 대소문자를 구분하지 않아요. 따라서 SELECTselectsElEcT와 같고, myIdmyidMYID와 같습니다. 자주 쓰는 규약(특히 이 문서의 예제에서)은 키워드는 대문자로, 다른 식별자는 소문자로 쓰는 것입니다.

큐오트 식별자(quoted identifier)라고 하는 두 번째 종류의 식별자가 있어요. 이는 임의의 문자 시퀀스(비어 있지 않은)를 큰따옴표(")로 감싸서 정의합니다. 큐오트 식별자는 절대 키워드가 아니에요. 따라서 "select"는 예약 키워드가 아니며 컬럼을 참조하는 데 사용할 수 있어요(다만 이렇게 쓰는 것은 매우 권장되지 않습니다). 반면 select는 파싱 오류를 일으킵니다. 또한 따옴표 없는 식별자·키워드와 달리 큐오트 식별자는 대소문자를 구분합니다("My Quoted Id""my quoted id"와 다릅니다). [a-zA-Z][a-zA-Z0-9_]*와 일치하는 완전히 소문자 큐오트 식별자는 그러나 큰따옴표를 제거해 얻은 따옴표 없는 식별자와 동등해요("myid"myidmyId와 같지만 "myId"와는 다릅니다). 큐오트 식별자 안에서 큰따옴표 문자를 반복해 이스케이프할 수 있으므로 "foo "" bar"는 유효한 식별자입니다.

큐오트 식별자는 임의의 이름을 가진 컬럼을 선언할 수 있는데, 이는 때로 서버가 사용하는 특정 이름과 충돌할 수 있어요. 예를 들어 조건부 업데이트를 사용하면 서버는 "[applied]"라는 특수 결과 이름을 포함한 결과 집합으로 응답합니다. 이런 이름의 컬럼을 선언했다면 일부 도구를 혼란스럽게 할 수 있으므로 피해야 해요. 일반적으로 따옴표 없는 식별자를 선호하되, 큐오트 식별자를 사용한다면 대괄호로 감싼 이름(예: "[applied]")과 함수 호출처럼 보이는 이름(예: "f(x)")은 피하는 것이 좋습니다.

더 공식적으로 표현하면 다음과 같아요:

identifier::= unquoted_identifier | quoted_identifier
unquoted_identifier::= re('[a-zA-Z][a-zA-Z0-9]*')
quoted_identifier::= '"' (any character where " can appear if doubled)+ '"'

상수 (Constants)

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+

다시 말하면:

  • 문자열 상수(string constant)는 작은따옴표(')로 감싼 임의의 문자 시퀀스예요. 작은따옴표는 반복해서 포함할 수 있어요. 예: 'It''s raining today'. 이는 큰따옴표를 사용하는 큐오트 식별자와 혼동하면 안 됩니다. 또는 문자열을 두 개의 달러 문자로 감싸서 정의할 수 있는데, 이 경우 이스케이프 없이 작은따옴표를 쓸 수 있어요(It's raining today). 이 후자의 형태는 사용자 정의 함수를 정의할 때 함수 본문에서 작은따옴표를 이스케이프할 필요가 없도록(달러보다 작은따옴표가 더 자주 등장하므로) 자주 사용됩니다.
  • 정수, 부동소수, 불리언 상수는 예상대로 정의돼요. 다만 float는 특수 상수 NaNInfinity를 허용한다는 점에 유의하세요.
  • CQL은 UUID 상수를 지원해요.
  • blob의 내용은 16진수로 제공되며 0x 접두사로 시작합니다.
  • 특수 NULL 상수는 값이 없음을 나타냅니다.

이 상수들이 어떻게 타입이 지정되는지는 데이터 타입 섹션을 참고하세요.

항 (Terms)

CQL에는 term이라는 개념이 있어요. term은 CQL이 지원하는 값의 종류를 나타냅니다. term은 다음과 같이 정의됩니다:

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

따라서 term은 다음 중 하나입니다:

  • 상수(constant)
  • 컬렉션(collection), 벡터(vector), 사용자 정의 타입(user-defined type), 또는 튜플(tuple) 중 하나의 리터럴(literal)
  • 네이티브 함수 또는 사용자 정의 함수 중 하나의 함수 호출(function call)
  • term 사이의 산술 연산(arithmetic operation)
  • 타입 힌트(type hint)
  • 바인드 마커(bind marker) — 실행 시점에 바인딩될 변수를 나타내요. 자세한 내용은 prepared-statement 섹션을 참고하세요. 바인드 마커는 익명(?) 또는 이름 붙은(:some_name) 형태일 수 있어요. 후자는 변수를 참조하고 바인딩하기에 더 편리한 방법을 제공하므로 일반적으로 선호됩니다.

주석 (Comments)

CQL에서 주석은 이중 대시(--)나 이중 슬래시(//)로 시작하는 줄입니다.

/**/로 감싸는 멀티라인 주석도 지원됩니다(다만 중첩은 지원되지 않아요).

-- This is a comment
// This is a comment too
/* This is
   a multi-line comment */

문 (Statements)

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

준비된 문 (Prepared Statements)

CQL은 prepared statement를 지원해요. prepared statement는 쿼리를 한 번만 파싱하고 서로 다른 구체적인 값으로 여러 번 실행할 수 있게 해주는 최적화입니다.

적어도 하나의 바인드 마커(위 bind_marker 참고)를 사용하는 모든 문은 준비되어야 합니다. 준비 후 그 문은 각 마커에 구체적인 값을 제공해 실행할 수 있어요. 문이 어떻게 준비되고 실행되는지의 정확한 세부 사항은 사용하는 CQL 드라이버에 따라 다르므로, 드라이버 문서를 참고해야 합니다.

더 알아보기 (Learn more)