Beam ZetaSQL の字句構造

Beam ZetaSQL ステートメントは、一連のトークンで構成されています。トークンには、識別子引用符付き識別子リテラルキーワード演算子、および特殊文字が含まれます。トークンは、空白 (スペース、バックスペース、タブ、改行) またはコメントで区切ることができます。

識別子

識別子は、列、テーブル、およびその他のデータベースオブジェクトに関連付けられた名前です。

識別子を指定する方法は、引用符なしまたは引用符付きの2つがあります

構文 (空白を無視し、正規表現を使用した文法として表示)

identifier: { quoted_identifier | unquoted_identifier }
unquoted_identifier: [A-Za-z_][A-Za-z_0-9]*
quoted_identifier: \`[^\\\`\r\n] any_escape* \`
any_escape: \\(. | \n | \r | \r\n)

Customers5
_dataField1
ADGROUP

無効な例

5Customers
_dataField!
GROUP

5Customers は、文字またはアンダースコアではなく数字で始まります。_dataField! には、文字、数字、またはアンダースコアではない特殊文字「!」が含まれています。GROUP は予約語であるため、バッククォート文字で囲まれていない場合は識別子として使用できません。

識別子と引用符付き識別子の両方で、大文字と小文字は区別されませんが、いくつかのニュアンスがあります。詳細については、大文字と小文字の区別 を参照してください。

引用符付き識別子には、以下で定義されている文字列リテラルと同じエスケープシーケンスがあります。

リテラル

リテラルは、組み込みデータ型の定数値を表します。一部のデータ型は、リテラルとして表現できますが、すべてではありません。

文字列およびバイトリテラル

文字列およびバイトリテラルは、単一 (') または二重 (") の引用符で引用符で囲むか、3つの単一 (''') または3つの二重 (""") の引用符のグループで3重引用符で囲む必要があります。

引用符付きリテラル

リテラル説明
引用符付き文字列
  • "abc"
  • "it's"
  • 'it\'s'
  • 'Title: "Boy"'
単一 (') 引用符で囲まれた引用符付き文字列には、エスケープされていない二重 (") 引用符を含めることができます。その逆も同様です。
バックスラッシュ (\) は、エスケープシーケンスを導入します。下の「エスケープシーケンス」表を参照してください。
引用符付き文字列には、バックスラッシュ (\) が前に付いている場合でも、改行を含めることはできません。

3重引用符付き文字列
  • """abc"""
  • '''it's'''
  • '''Title:"Boy"'''
  • '''two
    lines'''
  • '''why\?'''
埋め込まれた改行と引用符は、エスケープなしで許可されます (4番目の例を参照)。
バックスラッシュ (\) は、エスケープシーケンスを導入します。下の「エスケープシーケンス」表を参照してください。
行末にエスケープされていないバックスラッシュ (\) を付けることはできません。
開始引用符と一致する3つのエスケープされていない引用符が連続すると、文字列が終了します。


生文字列
  • R"abc+"
  • r'''abc+'''
  • R"""abc+"""
  • r'f\(abc,(.*),def\)'
生文字列リテラルプレフィックス (r または R) が付いた引用符付きまたは3重引用符付きリテラルは、生/正規表現文字列として解釈されます。
バックスラッシュ文字 (\) はエスケープ文字として機能しません。文字列リテラル内で、バックスラッシュの後に別の文字が続く場合、両方の文字が保持されます。
生文字列は、奇数のバックスラッシュで終わることはできません。
生文字列は、正規表現を構築するのに役立ちます。


プレフィックス文字 (rRbB) は、引用符付きまたは3重引用符付き文字列ではオプションであり、文字列が生/正規表現文字列またはバイトシーケンスであることをそれぞれ示します。たとえば、b'abc'b'''abc''' は両方ともバイト型として解釈されます。プレフィックス文字では大文字と小文字は区別されません。

プレフィックス付きの引用符付きリテラル

以下の表に、文字列リテラルで英数字以外の文字を表すための有効なエスケープシーケンスをすべて示します。この表にないシーケンスはすべてエラーになります。

エスケープシーケンス説明
\aベル
\bバックスペース
\fフォームフィード
\n改行
\rキャリッジリターン
\tタブ
\v垂直タブ
\\バックスラッシュ (\)
\?疑問符 (?)
\"二重引用符 (")
\'単一引用符 (')
\`バッククォート (`)
\ooo8進数エスケープ。正確に3桁 (0〜7の範囲)。単一の Unicode 文字 (文字列リテラル内) にデコードします。
\xhh または \Xhh16進数エスケープ。正確に2桁の16進数 (0〜9またはA〜Fまたはa〜f)。単一の Unicode 文字 (文字列リテラル内) にデコードします。例
  • '\x41' == 'A'
  • '\x41B''AB' です
  • '\x4' はエラーです
\uhhhhUnicode エスケープ。小文字の「u」と正確に4桁の16進数を使用します。文字列リテラルまたは識別子でのみ有効です。
これらの値がサロゲート Unicode 値であるため、D800〜DFFF の範囲は許可されていないことに注意してください。
\UhhhhhhhhUnicode エスケープ。大文字の「U」と正確に8桁の16進数を使用します。文字列リテラルまたは識別子でのみ有効です。
これらの値がサロゲート Unicode 値であるため、D800〜DFFF の範囲は許可されていないことに注意してください。また、10FFFF より大きい値は許可されていません。

整数リテラル

整数リテラルは、10進数 (0〜9) のシーケンス、または「0x」が前に付いた16進数値のいずれかです。整数には、それぞれ正と負の値を表す「+」または「-」を前に付けることができます。

123
0xABC
-123

整数リテラルは、INT64 として解釈されます。

浮動小数点リテラル

構文オプション

[+-]DIGITS.[DIGITS][e[+-]DIGITS]
[DIGITS].DIGITS[e[+-]DIGITS]
DIGITSe[+-]DIGITS

DIGITS は1つ以上の10進数 (0〜9) を表し、e は指数マーカー (e または E) を表します。

123.456e-67
.1E4
58.
4e2

小数点または指数マーカーのいずれかを含む数値リテラルは、double 型であると推定されます。

値が有効な float 範囲内にある場合、浮動小数点リテラルを float 型に暗黙的に強制変換できます。

NaN または無限大のリテラル表現はありません。

配列リテラル

配列リテラルは、角かっこで囲まれた要素のコンマ区切りリストです。ARRAY キーワードはオプションで、明示的な要素型 T もオプションです。

[1, 2, 3]
['x', 'y', 'xy']
ARRAY[1, 2, 3]
ARRAY<string>['x', 'y', 'xy']

タイムスタンプリテラル

構文

TIMESTAMP 'YYYY-[M]M-[D]D [[H]H:[M]M:[S]S[.DDDDDD]] [timezone]'

タイムスタンプリテラルには、TIMESTAMP キーワードと、単一引用符で囲まれた、標準のタイムスタンプ形式に準拠する文字列リテラルが含まれています。

タイムスタンプリテラルは、1年から9999年までの範囲 (両端を含む) をサポートしています。この範囲外のタイムスタンプは無効です。

タイムスタンプリテラルには、タイムゾーンを示す数値サフィックスを含めることができます

TIMESTAMP '2014-09-27 12:30:00.45-08'

このサフィックスがない場合、デフォルトのタイムゾーンである UTC が使用されます。

たとえば、次のタイムスタンプは、タイムゾーン UTC を使用して、2014年9月27日の午後12時30分を表します

TIMESTAMP '2014-09-27 12:30:00.45'

タイムゾーンの詳細については、タイムゾーン を参照してください。

タイムスタンプのリテラルは、タイムゾーン名を含む、正規のタイムスタンプ形式の文字列リテラルとして、タイムスタンプ式が期待される場所で使用される場合、暗黙的にタイムスタンプリテラルに変換されます。例えば、次のクエリでは、文字列リテラル "2014-09-27 12:30:00.45 America/Los_Angeles" がタイムスタンプリテラルに変換されます。

SELECT * FROM foo
WHERE timestamp_col = "2014-09-27 12:30:00.45 America/Los_Angeles"

タイムゾーン

タイムスタンプリテラルは特定の時点にマッピングする必要があるため、リテラルを正しく解釈するにはタイムゾーンが必要です。リテラル自体の一部としてタイムゾーンが指定されていない場合、Beam SQL実装によって設定されたデフォルトのタイムゾーン値が使用されます。

タイムゾーンは、協定世界時(UTC)からのオフセットを表す次の正規形式の文字列で表されます。

形式

(+|-)H[H][:M[M]]

'-08:00'
'-8:15'
'+3:00'
'+07:30'
'-7'

タイムゾーンは、tzデータベースの文字列タイムゾーン名を使用して表現することもできます。包括的ではないがより簡単な参考資料として、Wikipediaのtzデータベースのタイムゾーン一覧を参照してください。正規のタイムゾーン名の形式は、<大陸/[地域/]都市>(例:America/Los_Angeles)です。

すべてのタイムゾーン名が、特定の期間中に同じ時刻を報告する場合でも、交換可能ではないことに注意してください。例えば、America/Los_Angelesは、夏時間中はUTC-7:00と同じ時刻を報告しますが、夏時間外ではUTC-8:00と同じ時刻を報告します。

TIMESTAMP '2014-09-27 12:30:00 America/Los_Angeles'
TIMESTAMP '2014-09-27 12:30:00 America/Argentina/Buenos_Aires'

大文字と小文字の区別

Beam SQLでは、大文字と小文字の区別に関して次の規則に従います。

カテゴリ大文字と小文字を区別するか?注記
キーワードいいえ 
関数名いいえ 
テーブル名注記を参照テーブル名は通常、大文字と小文字を区別しませんが、大文字と小文字を区別するテーブル名を使用するデータベースをクエリする場合は、区別する場合があります。
列名いいえ 
文字列値はい
文字列比較はい 
クエリ内のエイリアスいいえ 
正規表現マッチング注記を参照正規表現マッチングは、式自体で大文字と小文字を区別しないように指定されていない限り、デフォルトで大文字と小文字を区別します。
LIKE マッチングはい 

予約語

キーワードは、Beam SQL言語で特別な意味を持つトークンのグループであり、次の特性を持ちます。

Beam SQLには、次の予約済みキーワードがあります。

ALL
AND
ANY
ARRAY
AS
ASC
ASSERT_ROWS_MODIFIED
AT
BETWEEN
BY
CASE
CAST
COLLATE
CONTAINS
CREATE
CROSS
CUBE
CURRENT
DEFAULT
DEFINE
DESC
DISTINCT
ELSE
END
ENUM
ESCAPE
EXCEPT
EXCLUDE
EXISTS
EXTRACT
FALSE
FETCH
FOLLOWING
FOR
FROM
FULL
GROUP
GROUPING
GROUPS
HASH
HAVING
IF
IGNORE
IN
INNER
INTERSECT
INTERVAL
INTO
IS
JOIN
LATERAL
LEFT
LIKE
LIMIT
LOOKUP
MERGE
NATURAL
NEW
NO
NOT
NULL
NULLS
OF
ON
OR
ORDER
OUTER
OVER
PARTITION
PRECEDING
PROTO
RANGE
RECURSIVE
RESPECT
RIGHT
ROLLUP
ROWS
SELECT
SET
SOME
STRUCT
TABLESAMPLE
THEN
TO
TREAT
TRUE
UNBOUNDED
UNION
UNNEST
USING
WHEN
WHERE
WINDOW
WITH
WITHIN

終端のセミコロン

ステートメントは、アプリケーションプログラミングインターフェース(API)を通じて送信されたクエリ文字列のコンテキストで、オプションで終端セミコロン(;)を使用できます。一部の対話型ツールでは、ステートメントに終端セミコロンが必要です。複数のステートメントを含むリクエストでは、ステートメントはセミコロンで区切る必要がありますが、最後のステートメントではセミコロンはオプションです。

コメント

コメントは、パーサーによって無視される一連の文字です。Beam SQLでは、次のタイプのコメントがサポートされています。

単一行コメント

1行コメントは、コメントの前に#または--を付加することでサポートされます。

SELECT x FROM T; # xはフィールド、Tはテーブル

コメントには、 '#' 文字から行末までのすべての文字が含まれます。

SELECT x FROM T; -- xはフィールド、Tはテーブル

コメントには、'--' シーケンスから行末までのすべての文字が含まれます。オプションで '--' の後にスペースを追加できます。

複数行コメント

複数行コメントは、/* <コメント> */を使用してコメントを囲むことでサポートされます。

SELECT x FROM T /* x is a field and T is a table */
WHERE x = 3;

無効な例

SELECT x FROM T /* comment starts here
                /* comment ends on this line */
                this line is not considered a comment */
WHERE x = 3;

コメントには、最初に現れた '/*' から、次に現れた '*/' で囲まれた、改行を含むすべての文字が含まれます。ネストされたコメントはサポートされていません。2番目の例には、クエリを無効にするネストされたコメントが含まれています。