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重引用符で囲む必要があります。
引用符付きリテラル
リテラル | 例 | 説明 |
---|---|---|
引用符付き文字列 |
| 単一 (' ) 引用符で囲まれた引用符付き文字列には、エスケープされていない二重 (" ) 引用符を含めることができます。その逆も同様です。バックスラッシュ ( \ ) は、エスケープシーケンスを導入します。下の「エスケープシーケンス」表を参照してください。引用符付き文字列には、バックスラッシュ ( \ ) が前に付いている場合でも、改行を含めることはできません。 |
3重引用符付き文字列 |
| 埋め込まれた改行と引用符は、エスケープなしで許可されます (4番目の例を参照)。 バックスラッシュ ( \ ) は、エスケープシーケンスを導入します。下の「エスケープシーケンス」表を参照してください。行末にエスケープされていないバックスラッシュ ( \ ) を付けることはできません。開始引用符と一致する3つのエスケープされていない引用符が連続すると、文字列が終了します。 |
生文字列 |
| 生文字列リテラルプレフィックス (r または R ) が付いた引用符付きまたは3重引用符付きリテラルは、生/正規表現文字列として解釈されます。バックスラッシュ文字 ( \ ) はエスケープ文字として機能しません。文字列リテラル内で、バックスラッシュの後に別の文字が続く場合、両方の文字が保持されます。生文字列は、奇数のバックスラッシュで終わることはできません。 生文字列は、正規表現を構築するのに役立ちます。 |
プレフィックス文字 (r
、R
、b
、B
) は、引用符付きまたは3重引用符付き文字列ではオプションであり、文字列が生/正規表現文字列またはバイトシーケンスであることをそれぞれ示します。たとえば、b'abc'
と b'''abc'''
は両方ともバイト型として解釈されます。プレフィックス文字では大文字と小文字は区別されません。
プレフィックス付きの引用符付きリテラル
以下の表に、文字列リテラルで英数字以外の文字を表すための有効なエスケープシーケンスをすべて示します。この表にないシーケンスはすべてエラーになります。
エスケープシーケンス | 説明 |
---|---|
\a | ベル |
\b | バックスペース |
\f | フォームフィード |
\n | 改行 |
\r | キャリッジリターン |
\t | タブ |
\v | 垂直タブ |
\\ | バックスラッシュ (\ ) |
\? | 疑問符 (? ) |
\" | 二重引用符 (" ) |
\' | 単一引用符 (' ) |
\` | バッククォート (` ) |
\ooo | 8進数エスケープ。正確に3桁 (0〜7の範囲)。単一の Unicode 文字 (文字列リテラル内) にデコードします。 |
\xhh または \Xhh | 16進数エスケープ。正確に2桁の16進数 (0〜9またはA〜Fまたはa〜f)。単一の Unicode 文字 (文字列リテラル内) にデコードします。例
|
\uhhhh | Unicode エスケープ。小文字の「u」と正確に4桁の16進数を使用します。文字列リテラルまたは識別子でのみ有効です。 これらの値がサロゲート Unicode 値であるため、D800〜DFFF の範囲は許可されていないことに注意してください。 |
\Uhhhhhhhh | Unicode エスケープ。大文字の「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番目の例には、クエリを無効にするネストされたコメントが含まれています。