ANSI 準拠
Spark SQL では、SQL 標準に準拠するための 2 つのオプションがあります。それは spark.sql.ansi.enabled と spark.sql.storeAssignmentPolicy です(詳細は以下の表を参照)。
デフォルトでは、spark.sql.ansi.enabled は true で、Spark SQL は Hive 準拠ではなく、ANSI 準拠の構文を使用します。たとえば、SQL 演算子/関数への入力が無効な場合、Spark は null 結果を返すのではなく、実行時に例外をスローします。一部の ANSI 構文機能は ANSI SQL 標準から直接ではないかもしれませんが、その動作は ANSI SQL のスタイルに沿っています。
さらに、Spark SQL には、テーブルに行を挿入する際の暗黙的なキャスト動作を制御する独立したオプションがあります。キャスト動作は、標準ではストア代入ルールとして定義されています。
デフォルトでは、spark.sql.storeAssignmentPolicy は ANSI で、Spark SQL は ANSI ストア代入ルールに準拠します。
| プロパティ名 | デフォルト | 意味 | バージョン以降 |
|---|---|---|---|
spark.sql.ansi.enabled |
true | true の場合、Spark は ANSI SQL 仕様に準拠しようとします。 1. Spark SQL は、整数オーバーフローエラー、文字列解析エラーなど、無効な操作に対して実行時例外をスローします。 2. Spark は、データ型間の競合を解決するために異なる型変換ルールを使用します。これらのルールは、データ型の優先順位に基づいて一貫しています。 |
3.0.0 |
spark.sql.storeAssignmentPolicy |
ANSI | 異なるデータ型の列に値を挿入する際、Spark は型変換を実行します。現在、型変換ルールには ANSI、legacy、strict の 3 つのポリシーをサポートしています。 1. ANSI ポリシーでは、Spark は ANSI SQL に従って型変換を実行します。実際には、PostgreSQL とほぼ同じ動作になります。文字列から整数への変換や、double から boolean への変換など、一部の不合理な型変換は許可されません。数値型列に挿入する際、値がターゲットデータ型の範囲外の場合、オーバーフローエラーがスローされます。 2. legacy ポリシーでは、Spark は有効な Cast であれば型変換を許可します。これは非常に緩いです。例:文字列から整数への変換や、double から boolean への変換が許可されます。これは Spark 2.x での唯一の動作であり、Hive と互換性があります。 3. strict ポリシーでは、Spark は型変換における精度損失やデータ切り捨てを一切許可しません。例:double から int への変換や、decimal から double への変換は許可されません。 |
3.0.0 |
次のサブセクションでは、ANSI モードが有効な場合の算術演算、型変換、SQL 解析における動作の変更について説明します。Spark SQL での型変換には 3 種類あり、この記事で順に紹介します:キャスト、ストア代入、型変換。
算術演算
Spark SQL では、デフォルトで、間隔型と数値型のオーバーフローの両方に対して実行時に算術例外がスローされます。spark.sql.ansi.enabled が false の場合、decimal 型は null 値を生成し、その他の数値型は Java/Scala プログラムの対応する操作と同じように動作します(例:2 つの整数の合計が表現可能な最大値を超える場合、結果は負の数になります)。これは Spark 3 以前の動作です。
-- `spark.sql.ansi.enabled=true`
SELECT 2147483647 + 1;
org.apache.spark.SparkArithmeticException: [ARITHMETIC_OVERFLOW] integer overflow. Use 'try_add' to tolerate overflow and return NULL instead. If necessary set spark.sql.ansi.enabled to "false" to bypass this error.
== SQL(line 1, position 8) ==
SELECT 2147483647 + 1
^^^^^^^^^^^^^^
SELECT abs(-2147483648);
org.apache.spark.SparkArithmeticException: [ARITHMETIC_OVERFLOW] integer overflow. If necessary set spark.sql.ansi.enabled to "false" to bypass this error.
-- `spark.sql.ansi.enabled=false`
SELECT 2147483647 + 1;
+----------------+
|(2147483647 + 1)|
+----------------+
| -2147483648|
+----------------+
SELECT abs(-2147483648);
+----------------+
|abs(-2147483648)|
+----------------+
| -2147483648|
+----------------+
キャスト
spark.sql.ansi.enabled が true に設定されている場合、CAST 構文による明示的なキャストは、標準で定義されている不正なキャストパターン(例:文字列から整数へのキャスト)に対して実行時例外をスローします。
さらに、ANSI SQL モードは、ANSI モードがオフの場合に許可されている次の型変換を禁止します。
- 数値型 <=> バイナリ型
- 日付型 <=> ブール型
- タイムスタンプ型 <=> ブール型
- 日付型 => 数値型
CAST 式で有効なソースとターゲットのデータ型の組み合わせは、次の表で示されます。「Y」は制限なしで構文的に有効な組み合わせを示し、「N」は無効な組み合わせを示します。
| ソース\ターゲット | 数値型 | 文字列型 | 日付 | タイムスタンプ型 | Timestamp_NTZ | 間隔型 | ブール型 | バイナリ型 | 配列型 | マップ型 | 構造体型 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 数値型 | Y | Y | N | Y | N | Y | Y | N | N | N | N |
| 文字列型 | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N |
| 日付 | N | Y | Y | Y | Y | N | N | N | N | N | N |
| タイムスタンプ型 | Y | Y | Y | Y | Y | N | N | N | N | N | N |
| Timestamp_NTZ | N | Y | Y | Y | Y | N | N | N | N | N | N |
| 間隔型 | Y | Y | N | N | N | Y | N | N | N | N | N |
| ブール型 | Y | Y | N | N | N | N | Y | N | N | N | N |
| バイナリ型 | N | Y | N | N | N | N | N | Y | N | N | N |
| 配列型 | N | Y | N | N | N | N | N | N | Y | N | N |
| マップ型 | N | Y | N | N | N | N | N | N | N | Y | N |
| 構造体型 | N | Y | N | N | N | N | N | N | N | N | Y |
上記の表では、新しい構文のすべての CAST は赤色の Y でマークされています。
- CAST(数値型 AS 数値型): 値がターゲットデータ型の範囲外の場合、オーバーフロー例外をスローします。
- CAST(文字列型 AS (数値型/日付型/タイムスタンプ型/Timestamp_NTZ/間隔型/ブール型)): 値がターゲットデータ型として解析できない場合、実行時例外をスローします。
- CAST(タイムスタンプ型 AS 数値型): エポックからの秒数がターゲットデータ型の範囲外の場合、オーバーフロー例外をスローします。
- CAST(数値型 AS タイムスタンプ型): 数値に 1000000(マイクロ秒/秒)を掛けた値が Long 型の範囲外の場合、オーバーフロー例外をスローします。
- CAST(配列型 AS 配列型): 要素の変換にエラーがある場合、例外をスローします。
- CAST(マップ型 AS マップ型): キーと値の変換にエラーがある場合、例外をスローします。
- CAST(構造体型 AS 構造体型): 構造体フィールドの変換にエラーがある場合、例外をスローします。
- CAST(数値型 AS 文字列型): 指数が必要な場合、科学表記法ではなく、decimal 値を文字列にキャストする際に常にプレーンな文字列表現を使用します。
- CAST(間隔型 AS 数値型): 日時間隔のマイクロ秒数または年月間隔の月数がターゲットデータ型の範囲外の場合、オーバーフロー例外をスローします。
- CAST(数値型 AS 間隔型): 数値にターゲット間隔の終了単位を掛けた値が、年月間隔の場合は Int 型、日時間隔の場合は Long 型の範囲外の場合、オーバーフロー例外をスローします。
-- Examples of explicit casting
-- `spark.sql.ansi.enabled=true` (This is a default behaviour)
SELECT CAST('a' AS INT);
org.apache.spark.SparkNumberFormatException: [CAST_INVALID_INPUT] The value 'a' of the type "STRING" cannot be cast to "INT" because it is malformed. Correct the value as per the syntax, or change its target type. Use `try_cast` to tolerate malformed input and return NULL instead.
== SQL(line 1, position 8) ==
SELECT CAST('a' AS INT)
^^^^^^^^^^^^^^^^
SELECT CAST(2147483648L AS INT);
org.apache.spark.SparkArithmeticException: [CAST_OVERFLOW] The value 2147483648L of the type "BIGINT" cannot be cast to "INT" due to an overflow. Use `try_cast` to tolerate overflow and return NULL instead.
SELECT CAST(DATE'2020-01-01' AS INT);
org.apache.spark.sql.AnalysisException: cannot resolve 'CAST(DATE '2020-01-01' AS INT)' due to data type mismatch: cannot cast date to int.
To convert values from date to int, you can use function UNIX_DATE instead.
-- `spark.sql.ansi.enabled=false`
SELECT CAST('a' AS INT);
+--------------+
|CAST(a AS INT)|
+--------------+
| null|
+--------------+
SELECT CAST(2147483648L AS INT);
+-----------------------+
|CAST(2147483648 AS INT)|
+-----------------------+
| -2147483648|
+-----------------------+
SELECT CAST(DATE'2020-01-01' AS INT)
+------------------------------+
|CAST(DATE '2020-01-01' AS INT)|
+------------------------------+
| null|
+------------------------------+
-- Examples of store assignment rules
CREATE TABLE t (v INT);
-- `spark.sql.storeAssignmentPolicy=ANSI`
INSERT INTO t VALUES ('1');
org.apache.spark.sql.AnalysisException: [INCOMPATIBLE_DATA_FOR_TABLE.CANNOT_SAFELY_CAST] Cannot write incompatible data for table `spark_catalog`.`default`.`t`: Cannot safely cast `v`: "STRING" to "INT".
-- `spark.sql.storeAssignmentPolicy=LEGACY` (This is a legacy behaviour until Spark 2.x)
INSERT INTO t VALUES ('1');
SELECT * FROM t;
+---+
| v|
+---+
| 1|
+---+
キャストでの丸め
小数点以下を持つ decimal を INTERVAL HOUR TO SECOND のような SECOND を終了単位とする間隔型にキャストする場合、Spark は小数点以下の部分を「最近傍」に向かって丸めます。ただし、両方の隣接する値が等距離にある場合は、切り上げます。
ストア代入
最初にも述べたように、spark.sql.storeAssignmentPolicy が ANSI(デフォルト値)に設定されている場合、Spark SQL はテーブル挿入時に ANSI ストア代入ルールに準拠します。テーブル挿入における有効なソースとターゲットのデータ型の組み合わせは、次の表で示されます。
| ソース\ターゲット | 数値型 | 文字列型 | 日付 | タイムスタンプ型 | Timestamp_NTZ | 間隔型 | ブール型 | バイナリ型 | 配列型 | マップ型 | 構造体型 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 数値型 | Y | Y | N | N | N | N | N | N | N | N | N |
| 文字列型 | N | Y | N | N | N | N | N | N | N | N | N |
| 日付 | N | Y | Y | Y | Y | N | N | N | N | N | N |
| タイムスタンプ型 | N | Y | Y | Y | Y | N | N | N | N | N | N |
| Timestamp_NTZ | N | Y | Y | Y | Y | N | N | N | N | N | N |
| 間隔型 | N | Y | N | N | N | N* | N | N | N | N | N |
| ブール型 | N | Y | N | N | N | N | Y | N | N | N | N |
| バイナリ型 | N | Y | N | N | N | N | N | Y | N | N | N |
| 配列型 | N | N | N | N | N | N | N | N | Y** | N | N |
| マップ型 | N | N | N | N | N | N | N | N | N | Y** | N |
| 構造体型 | N | N | N | N | N | N | N | N | N | N | Y** |
* Spark は間隔型テーブル列をサポートしていません。
** Array/Map/Struct 型の場合、データ型チェックルールはコンポーネント要素に再帰的に適用されます。
テーブル挿入中、Spark は数値値のオーバーフロー時に例外をスローします。
CREATE TABLE test(i INT);
INSERT INTO test VALUES (2147483648L);
org.apache.spark.SparkArithmeticException: [CAST_OVERFLOW_IN_TABLE_INSERT] Fail to insert a value of "BIGINT" type into the "INT" type column `i` due to an overflow. Use `try_cast` on the input value to tolerate overflow and return NULL instead.
型変換
型昇格と優先順位
spark.sql.ansi.enabled が true に設定されている場合、Spark SQL はデータ型間の競合を解決するためのいくつかのルールを使用します。この競合解決の中心となるのは、指定されたデータ型の値が暗黙的に別のデータ型に昇格できるかどうかを定義する型優先順位リストです。
| データ型 | 優先順位リスト(狭い方から広い方へ) |
|---|---|
| Byte | Byte -> Short -> Int -> Long -> Decimal -> Float* -> Double |
| Short | Short -> Int -> Long -> Decimal -> Float* -> Double |
| Int | Int -> Long -> Decimal -> Float* -> Double |
| Long | Long -> Decimal -> Float* -> Double |
| Decimal | Decimal -> Float* -> Double |
| Float | Float -> Double |
| Double | Double |
| 日付 | Date -> Timestamp_NTZ -> Timestamp |
| タイムスタンプ型 | タイムスタンプ型 |
| 文字列型 | String, Long -> Double, Date -> Timestamp_NTZ -> Timestamp, Boolean, Binary ** |
| バイナリ型 | バイナリ型 |
| ブール型 | ブール型 |
| 間隔型 | 間隔型 |
| マップ型 | Map*** |
| 配列型 | Array*** |
| 構造体型 | Struct*** |
* 共通の最小型解決では、精度損失を避けるために float はスキップされます。
** String は複数の種類のデータ型に昇格できます。Byte/Short/Int/Decimal/Float はこの優先順位リストにないことに注意してください。Byte/Short/Int と String の間の共通の最小型は Long であり、Decimal/Float の間の共通の最小型は Double です。
*** 複合型の場合、優先順位ルールはコンポーネント要素に再帰的に適用されます。
型指定のない NULL には特別なルールが適用されます。NULL は任意の他の型に昇格できます。
これは、優先順位リストの有向木としてのグラフィカルな表現です:
共通の最小型解決
型のセットの共通の最小型とは、セットのすべての要素から優先順位リストで到達可能な最も狭い型です。
共通の最小型解決は、次の目的で使用されます。
- 複数のパラメータに対して共通の引数型を期待する関数(coalesce、least、greatest など)の引数型を導出します。
- 算術演算や比較などの演算子のオペランド型を導出します。
- CASE 式などの式の結果型を導出します。
- 配列およびマップコンストラクタの要素型、キー型、または値型を導出します。共通の最小型が FLOAT に解決される場合は特別なルールが適用されます。float 型の値の場合、INT、BIGINT、または DECIMAL のいずれかの型がある場合、桁落ちの可能性を避けるために共通の最小型は DOUBLE にプッシュされます。
Decimal 型は、精度とスケールというパラメータを持つため、ここでは少し複雑です。decimal(precision, scale) は、値が整数部分で最大 precision - scale 桁、小数部分で scale 桁を持つことができることを意味します。decimal 型間の共通の最小型は、すべての値を表現するのに十分な整数桁と小数桁を持つ必要があります。より正確には、decimal(p1, s1) と decimal(p2, s2) の間の共通の最小型は、スケールが max(s1, s2)、精度が max(s1, s2) + max(p1 - s1, p2 - s2) になります。しかし、Spark の decimal 型には最大精度 38 があります。最終的な decimal 型がより高い精度を必要とする場合、切り捨てを行う必要があります。整数部分の桁はより重要であるため、Spark はまず小数部分の桁を切り捨てます。たとえば、decimal(48, 20) は decimal(38, 10) に削減されます。
注:算術演算では、decimal 入力用の共通の最小型を計算するために特別なルールがあります。
| 演算 | 結果の精度 | 結果のスケール |
|---|---|---|
| e1 + e2 | max(s1, s2) + max(p1 - s1, p2 - s2) + 1 | max(s1, s2) |
| e1 - e2 | max(s1, s2) + max(p1 - s1, p2 - s2) + 1 | max(s1, s2) |
| e1 * e2 | p1 + p2 + 1 | s1 + s2 |
| e1 / e2 | p1 - s1 + s2 + max(6, s1 + p2 + 1) | max(6, s1 + p2 + 1) |
| e1 % e2 | min(p1 - s1, p2 - s2) + max(s1, s2) | max(s1, s2) |
切り捨てルールも算術演算では異なります。小数部分には少なくとも 6 桁が保持されるため、scale は最大 6 までしか削減できません。この場合、オーバーフローが発生する可能性があります。
-- The coalesce function accepts any set of argument types as long as they share a least common type.
-- The result type is the least common type of the arguments.
> SET spark.sql.ansi.enabled=true;
> SELECT typeof(coalesce(1Y, 1L, NULL));
BIGINT
> SELECT typeof(coalesce(1, DATE'2020-01-01'));
Error: Incompatible types [INT, DATE]
> SELECT typeof(coalesce(ARRAY(1Y), ARRAY(1L)));
ARRAY<BIGINT>
> SELECT typeof(coalesce(1, 1F));
DOUBLE
> SELECT typeof(coalesce(1L, 1F));
DOUBLE
> SELECT (typeof(coalesce(1BD, 1F)));
DOUBLE
> SELECT typeof(coalesce(1, '2147483648'))
BIGINT
> SELECT typeof(coalesce(1.0, '2147483648'))
DOUBLE
> SELECT typeof(coalesce(DATE'2021-01-01', '2022-01-01'))
DATE
SQL 関数
関数呼び出し
ANSI モード (spark.sql.ansi.enabled=true) では、Spark SQL の関数呼び出しは
- 一般的に、
ストア代入ルールに従って、入力値を SQL 関数の宣言されたパラメータ型として格納します。 - 型指定のない NULL には特別なルールが適用されます。NULL は任意の他の型に昇格できます。
> SET spark.sql.ansi.enabled=true;
-- implicitly cast Int to String type
> SELECT concat('total number: ', 1);
total number: 1
-- implicitly cast Timestamp to Date type
> select datediff(now(), current_date);
0
-- implicitly cast String to Double type
> SELECT ceil('0.1');
1
-- special rule: implicitly cast NULL to Date type
> SELECT year(null);
NULL
> CREATE TABLE t(s string);
-- Can't store String column as Numeric types.
> SELECT ceil(s) from t;
Error in query: cannot resolve 'CEIL(spark_catalog.default.t.s)' due to data type mismatch
-- Can't store String column as Date type.
> select year(s) from t;
Error in query: cannot resolve 'year(spark_catalog.default.t.s)' due to data type mismatch
挙動が異なる関数
一部の SQL 関数の挙動は、ANSI モード(spark.sql.ansi.enabled=true)では異なる場合があります。
size: この関数は、null 入力に対して null を返します。element_at:- この関数は、無効なインデックスを使用すると
ArrayIndexOutOfBoundsExceptionをスローします。
- この関数は、無効なインデックスを使用すると
elt: この関数は、無効なインデックスを使用するとArrayIndexOutOfBoundsExceptionをスローします。parse_url: この関数は、入力文字列が無効な URL の場合、IllegalArgumentExceptionをスローします。to_date: この関数は、入力文字列が解析できない場合、またはパターン文字列が無効な場合に例外で失敗するはずです。to_timestamp: この関数は、入力文字列が解析できない場合、またはパターン文字列が無効な場合に例外で失敗するはずです。unix_timestamp: この関数は、入力文字列が解析できない場合、またはパターン文字列が無効な場合に例外で失敗するはずです。to_unix_timestamp: この関数は、入力文字列が解析できない場合、またはパターン文字列が無効な場合に例外で失敗するはずです。make_date: 結果の日付が無効な場合、この関数は例外で失敗するはずです。make_timestamp: 結果のタイムスタンプが無効な場合、この関数は例外で失敗するはずです。make_interval: 結果の間隔が無効な場合、この関数は例外で失敗するはずです。next_day: 入力が有効な曜日の場合でない場合、この関数はIllegalArgumentExceptionをスローします。
SQL 演算子
一部の SQL 演算子の挙動は、ANSI モード(spark.sql.ansi.enabled=true)では異なる場合があります。
array_col[index]: この演算子は、無効なインデックスを使用するとArrayIndexOutOfBoundsExceptionをスローします。
ANSI モードに役立つ関数
ANSI モードがオンの場合、無効な操作に対して例外がスローされます。これらの例外を抑制するには、次の SQL 関数を使用できます。
try_cast:CASTと同じですが、実行時エラーで例外をスローする代わりにNULL結果を返します。try_add: 加算演算子+と同じですが、整数値のオーバーフローで例外をスローする代わりにNULL結果を返します。try_subtract: 加算演算子-と同じですが、整数値のオーバーフローで例外をスローする代わりにNULL結果を返します。try_multiply: 加算演算子*と同じですが、整数値のオーバーフローで例外をスローする代わりにNULL結果を返します。try_divide: 除算演算子/と同じですが、0 で割る場合に例外をスローする代わりにNULL結果を返します。try_mod: 剰余演算子%と同じですが、0 で割る場合に例外をスローする代わりにNULL結果を返します。try_sum:sum関数と同じですが、整数/decimal/間隔値のオーバーフローで例外をスローする代わりにNULL結果を返します。try_avg:avg関数と同じですが、decimal/間隔値のオーバーフローで例外をスローする代わりにNULL結果を返します。try_element_at:element_at関数と同じですが、配列のインデックス範囲外で例外をスローする代わりにNULL結果を返します。try_to_timestamp:to_timestamp関数と同じですが、文字列解析エラーで例外をスローする代わりにNULL結果を返します。try_parse_url:parse_url関数と同じですが、URL 解析エラーで例外をスローする代わりにNULL結果を返します。try_make_timestamp:make_timestamp関数と同じですが、エラーで例外をスローする代わりにNULL結果を返します。try_make_timestamp_ltz:make_timestamp_ltz関数と同じですが、エラーで例外をスローする代わりにNULL結果を返します。try_make_timestamp_ntz:make_timestamp_ntz関数と同じですが、エラーで例外をスローする代わりにNULL結果を返します。try_make_interval:make_interval関数と同じですが、無効な間隔で例外をスローする代わりにNULL結果を返します。
SQL キーワード(オプション、デフォルトで無効)
spark.sql.ansi.enabled と spark.sql.ansi.enforceReservedKeywords の両方が true の場合、Spark SQL は ANSI モードパーサーを使用します。
ANSI モードパーサーでは、Spark SQL には 2 種類のキーワードがあります。
- 非予約キーワード: 特定のコンテキストでのみ特殊な意味を持ち、他のコンテキストでは識別子として使用できるキーワード。例:
EXPLAIN SELECT ...はコマンドですが、EXPLAIN は他の場所で識別子として使用できます。 - 予約キーワード: 予約されており、テーブル、ビュー、列、関数、エイリアスなどの識別子として使用できないキーワード。
デフォルトパーサーでは、Spark SQL には 2 種類のキーワードがあります。
- 非予約キーワード: ANSI モードが有効な場合と同じ定義。
- 厳格非予約キーワード: 非予約キーワードの厳格なバージョンであり、テーブルエイリアスとして使用できません。
デフォルトでは、spark.sql.ansi.enforceReservedKeywords は false です。
以下は、Spark SQL のすべてのキーワードのリストです。
| キーワード | Spark SQL ANSI モード |
Spark SQL 非ANSI モード |
SQL-2016 |
|---|---|---|---|
| ADD | 非予約 | 非予約 | 非予約 |
| AFTER | 非予約 | 非予約 | 非予約 |
| AGGREGATE | 非予約 | 非予約 | 非予約 |
| ALL | 予約 | 非予約 | 予約 |
| ALTER | 非予約 | 非予約 | 予約 |
| ALWAYS | 非予約 | 非予約 | 非予約 |
| ANALYZE | 非予約 | 非予約 | 非予約 |
| AND | 予約 | 非予約 | 予約 |
| ANTI | 非予約 | 厳格非予約 | 非予約 |
| ANY | 予約 | 非予約 | 予約 |
| ANY_VALUE | 非予約 | 非予約 | 非予約 |
| ARCHIVE | 非予約 | 非予約 | 非予約 |
| ARRAY | 非予約 | 非予約 | 予約 |
| AS | 予約 | 非予約 | 予約 |
| ASC | 非予約 | 非予約 | 非予約 |
| AT | 非予約 | 非予約 | 予約 |
| ATOMIC | 非予約 | 非予約 | 非予約 |
| AUTHORIZATION | 予約 | 非予約 | 予約 |
| BEGIN | 非予約 | 非予約 | 非予約 |
| BETWEEN | 非予約 | 非予約 | 予約 |
| BIGINT | 非予約 | 非予約 | 予約 |
| BINARY | 非予約 | 非予約 | 予約 |
| BINDING | 非予約 | 非予約 | 非予約 |
| BOOLEAN | 非予約 | 非予約 | 予約 |
| BOTH | 予約 | 非予約 | 予約 |
| BUCKET | 非予約 | 非予約 | 非予約 |
| BUCKETS | 非予約 | 非予約 | 非予約 |
| BY | 非予約 | 非予約 | 予約 |
| BYTE | 非予約 | 非予約 | 非予約 |
| CACHE | 非予約 | 非予約 | 非予約 |
| CALL | 予約 | 非予約 | 予約 |
| CALLED | 非予約 | 非予約 | 非予約 |
| CASCADE | 非予約 | 非予約 | 非予約 |
| CASE | 予約 | 非予約 | 予約 |
| CAST | 予約 | 非予約 | 予約 |
| CATALOG | 非予約 | 非予約 | 非予約 |
| CATALOGS | 非予約 | 非予約 | 非予約 |
| CHANGE | 非予約 | 非予約 | 非予約 |
| CHAR | 非予約 | 非予約 | 予約 |
| CHARACTER | 非予約 | 非予約 | 予約 |
| CHECK | 予約 | 非予約 | 予約 |
| CLEAR | 非予約 | 非予約 | 非予約 |
| CLUSTER | 非予約 | 非予約 | 非予約 |
| CLUSTERED | 非予約 | 非予約 | 非予約 |
| CODEGEN | 非予約 | 非予約 | 非予約 |
| COLLATE | 予約 | 非予約 | 予約 |
| COLLATION | 予約 | 非予約 | 予約 |
| COLLECTION | 非予約 | 非予約 | 非予約 |
| COLUMN | 予約 | 非予約 | 予約 |
| COLUMNS | 非予約 | 非予約 | 非予約 |
| COMMENT | 非予約 | 非予約 | 非予約 |
| COMMIT | 非予約 | 非予約 | 予約 |
| COMPACT | 非予約 | 非予約 | 非予約 |
| COMPACTIONS | 非予約 | 非予約 | 非予約 |
| COMPENSATION | 非予約 | 非予約 | 非予約 |
| COMPUTE | 非予約 | 非予約 | 非予約 |
| CONCATENATE | 非予約 | 非予約 | 非予約 |
| CONDITION | 非予約 | 非予約 | 非予約 |
| CONSTRAINT | 予約 | 非予約 | 予約 |
| CONTAINS | 非予約 | 非予約 | 非予約 |
| CONTINUE | 非予約 | 非予約 | 非予約 |
| COST | 非予約 | 非予約 | 非予約 |
| CREATE | 予約 | 非予約 | 予約 |
| CROSS | 予約 | 厳格非予約 | 予約 |
| CUBE | 非予約 | 非予約 | 予約 |
| CURRENT | 非予約 | 非予約 | 予約 |
| CURRENT_DATE | 予約 | 非予約 | 予約 |
| CURRENT_TIME | 予約 | 非予約 | 予約 |
| CURRENT_TIMESTAMP | 予約 | 非予約 | 予約 |
| CURRENT_USER | 予約 | 非予約 | 予約 |
| DATA | 非予約 | 非予約 | 非予約 |
| DATE | 非予約 | 非予約 | 予約 |
| DATABASE | 非予約 | 非予約 | 非予約 |
| DATABASES | 非予約 | 非予約 | 非予約 |
| DATEADD | 非予約 | 非予約 | 非予約 |
| DATE_ADD | 非予約 | 非予約 | 非予約 |
| DATEDIFF | 非予約 | 非予約 | 非予約 |
| DATE_DIFF | 非予約 | 非予約 | 非予約 |
| DAY | 非予約 | 非予約 | 非予約 |
| DAYS | 非予約 | 非予約 | 非予約 |
| DAYOFYEAR | 非予約 | 非予約 | 非予約 |
| DBPROPERTIES | 非予約 | 非予約 | 非予約 |
| DEC | 非予約 | 非予約 | 予約 |
| DECIMAL | 非予約 | 非予約 | 予約 |
| DECLARE | 非予約 | 非予約 | 非予約 |
| DEFAULT | 非予約 | 非予約 | 非予約 |
| DEFINED | 非予約 | 非予約 | 非予約 |
| DEFINER | 非予約 | 非予約 | 非予約 |
| DELETE | 非予約 | 非予約 | 予約 |
| DELIMITED | 非予約 | 非予約 | 非予約 |
| DESC | 非予約 | 非予約 | 非予約 |
| DESCRIBE | 非予約 | 非予約 | 予約 |
| DETERMINISTIC | 非予約 | 非予約 | 予約 |
| DFS | 非予約 | 非予約 | 非予約 |
| DIRECTORIES | 非予約 | 非予約 | 非予約 |
| DIRECTORY | 非予約 | 非予約 | 非予約 |
| DISTINCT | 予約 | 非予約 | 予約 |
| DISTRIBUTE | 非予約 | 非予約 | 非予約 |
| DIV | 非予約 | 非予約 | キーワードではない |
| DO | 非予約 | 非予約 | 非予約 |
| DOUBLE | 非予約 | 非予約 | 予約 |
| DROP | 非予約 | 非予約 | 予約 |
| ELSE | 予約 | 非予約 | 予約 |
| ELSEIF | 非予約 | 非予約 | 非予約 |
| END | 予約 | 非予約 | 予約 |
| ESCAPE | 予約 | 非予約 | 予約 |
| ESCAPED | 非予約 | 非予約 | 非予約 |
| EVOLUTION | 非予約 | 非予約 | 非予約 |
| EXCEPT | 予約 | 厳格非予約 | 予約 |
| EXCHANGE | 非予約 | 非予約 | 非予約 |
| EXCLUDE | 非予約 | 非予約 | 非予約 |
| EXECUTE | 予約 | 非予約 | 予約 |
| EXISTS | 非予約 | 非予約 | 予約 |
| EXIT | 非予約 | 非予約 | 非予約 |
| EXPLAIN | 非予約 | 非予約 | 非予約 |
| EXPORT | 非予約 | 非予約 | 非予約 |
| EXTEND | 非予約 | 非予約 | 非予約 |
| EXTENDED | 非予約 | 非予約 | 非予約 |
| EXTERNAL | 非予約 | 非予約 | 予約 |
| EXTRACT | 非予約 | 非予約 | 予約 |
| FALSE | 予約 | 非予約 | 予約 |
| FETCH | 予約 | 非予約 | 予約 |
| FIELDS | 非予約 | 非予約 | 非予約 |
| FILTER | 予約 | 非予約 | 予約 |
| FILEFORMAT | 非予約 | 非予約 | 非予約 |
| FIRST | 非予約 | 非予約 | 非予約 |
| FLOAT | 非予約 | 非予約 | 予約 |
| FOLLOWING | 非予約 | 非予約 | 非予約 |
| FOR | 予約 | 非予約 | 予約 |
| FOREIGN | 予約 | 非予約 | 予約 |
| FORMAT | 非予約 | 非予約 | 非予約 |
| FORMATTED | 非予約 | 非予約 | 非予約 |
| FOUND | 非予約 | 非予約 | 非予約 |
| FROM | 予約 | 非予約 | 予約 |
| FULL | 予約 | 厳格非予約 | 予約 |
| FUNCTION | 非予約 | 非予約 | 予約 |
| FUNCTIONS | 非予約 | 非予約 | 非予約 |
| GENERATED | 非予約 | 非予約 | 非予約 |
| GLOBAL | 非予約 | 非予約 | 予約 |
| GRANT | 予約 | 非予約 | 予約 |
| GROUP | 予約 | 非予約 | 予約 |
| GROUPING | 非予約 | 非予約 | 予約 |
| HANDLER | 非予約 | 非予約 | 非予約 |
| HAVING | 予約 | 非予約 | 予約 |
| HOUR | 非予約 | 非予約 | 非予約 |
| HOURS | 非予約 | 非予約 | 非予約 |
| IDENTIFIER | 非予約 | 非予約 | 非予約 |
| IDENTITY | 非予約 | 非予約 | 非予約 |
| IF | 非予約 | 非予約 | キーワードではない |
| IGNORE | 非予約 | 非予約 | 非予約 |
| IMMEDIATE | 非予約 | 非予約 | 非予約 |
| IMPORT | 非予約 | 非予約 | 非予約 |
| IN | 予約 | 非予約 | 予約 |
| INCLUDE | 非予約 | 非予約 | 非予約 |
| INCREMENT | 非予約 | 非予約 | 非予約 |
| INDEX | 非予約 | 非予約 | 非予約 |
| INDEXES | 非予約 | 非予約 | 非予約 |
| INNER | 予約 | 厳格非予約 | 予約 |
| INPATH | 非予約 | 非予約 | 非予約 |
| INPUT | 非予約 | 非予約 | 非予約 |
| INPUTFORMAT | 非予約 | 非予約 | 非予約 |
| INSERT | 非予約 | 非予約 | 予約 |
| INT | 非予約 | 非予約 | 予約 |
| INTEGER | 非予約 | 非予約 | 予約 |
| INTERSECT | 予約 | 厳格非予約 | 予約 |
| INTERVAL | 非予約 | 非予約 | 予約 |
| INTO | 予約 | 非予約 | 予約 |
| INVOKER | 非予約 | 非予約 | 非予約 |
| IS | 予約 | 非予約 | 予約 |
| ITEMS | 非予約 | 非予約 | 非予約 |
| ITERATE | 非予約 | 非予約 | 非予約 |
| JOIN | 予約 | 厳格非予約 | 予約 |
| JSON | 非予約 | 非予約 | 非予約 |
| KEYS | 非予約 | 非予約 | 非予約 |
| LANGUAGE | 非予約 | 非予約 | 予約 |
| LAST | 非予約 | 非予約 | 非予約 |
| LATERAL | 予約 | 厳格非予約 | 予約 |
| LAZY | 非予約 | 非予約 | 非予約 |
| LEADING | 予約 | 非予約 | 予約 |
| LEAVE | 非予約 | 非予約 | 非予約 |
| LEFT | 予約 | 厳格非予約 | 予約 |
| LIKE | 非予約 | 非予約 | 予約 |
| ILIKE | 非予約 | 非予約 | 非予約 |
| LIMIT | 非予約 | 非予約 | 非予約 |
| LINES | 非予約 | 非予約 | 非予約 |
| LIST | 非予約 | 非予約 | 非予約 |
| LOAD | 非予約 | 非予約 | 非予約 |
| LOCAL | 非予約 | 非予約 | 予約 |
| LOCATION | 非予約 | 非予約 | 非予約 |
| LOCK | 非予約 | 非予約 | 非予約 |
| LOCKS | 非予約 | 非予約 | 非予約 |
| LOGICAL | 非予約 | 非予約 | 非予約 |
| LONG | 非予約 | 非予約 | 非予約 |
| LOOP | 非予約 | 非予約 | 非予約 |
| MACRO | 非予約 | 非予約 | 非予約 |
| MAP | 非予約 | 非予約 | 非予約 |
| MATCHED | 非予約 | 非予約 | 非予約 |
| MERGE | 非予約 | 非予約 | 非予約 |
| MICROSECOND | 非予約 | 非予約 | 非予約 |
| MICROSECONDS | 非予約 | 非予約 | 非予約 |
| MILLISECOND | 非予約 | 非予約 | 非予約 |
| MILLISECONDS | 非予約 | 非予約 | 非予約 |
| MINUTE | 非予約 | 非予約 | 非予約 |
| MINUTES | 非予約 | 非予約 | 非予約 |
| MINUS | 非予約 | 厳格非予約 | 非予約 |
| MODIFIES | 非予約 | 非予約 | 非予約 |
| MONTH | 非予約 | 非予約 | 非予約 |
| MONTHS | 非予約 | 非予約 | 非予約 |
| MSCK | 非予約 | 非予約 | 非予約 |
| NAME | 非予約 | 非予約 | 非予約 |
| NAMESPACE | 非予約 | 非予約 | 非予約 |
| NAMESPACES | 非予約 | 非予約 | 非予約 |
| NANOSECOND | 非予約 | 非予約 | 非予約 |
| NANOSECONDS | 非予約 | 非予約 | 非予約 |
| NATURAL | 予約 | 厳格非予約 | 予約 |
| NO | 非予約 | 非予約 | 予約 |
| NONE | 非予約 | 非予約 | 予約 |
| NOT | 予約 | 非予約 | 予約 |
| NULL | 予約 | 非予約 | 予約 |
| NULLS | 非予約 | 非予約 | 非予約 |
| NUMERIC | 非予約 | 非予約 | 非予約 |
| OF | 非予約 | 非予約 | 予約 |
| OFFSET | 予約 | 非予約 | 予約 |
| ON | 予約 | 厳格非予約 | 予約 |
| ONLY | 予約 | 非予約 | 予約 |
| OPTION | 非予約 | 非予約 | 非予約 |
| OPTIONS | 非予約 | 非予約 | 非予約 |
| OR | 予約 | 非予約 | 予約 |
| ORDER | 予約 | 非予約 | 予約 |
| OUT | 非予約 | 非予約 | 予約 |
| OUTER | 予約 | 非予約 | 予約 |
| OUTPUTFORMAT | 非予約 | 非予約 | 非予約 |
| OVER | 非予約 | 非予約 | 非予約 |
| OVERLAPS | 予約 | 非予約 | 予約 |
| OVERLAY | 非予約 | 非予約 | 非予約 |
| OVERWRITE | 非予約 | 非予約 | 非予約 |
| PARTITION | 非予約 | 非予約 | 予約 |
| PARTITIONED | 非予約 | 非予約 | 非予約 |
| PARTITIONS | 非予約 | 非予約 | 非予約 |
| PERCENT | 非予約 | 非予約 | 非予約 |
| PIVOT | 非予約 | 非予約 | 非予約 |
| PLACING | 非予約 | 非予約 | 非予約 |
| POSITION | 非予約 | 非予約 | 予約 |
| PRECEDING | 非予約 | 非予約 | 非予約 |
| PRIMARY | 予約 | 非予約 | 予約 |
| PRINCIPALS | 非予約 | 非予約 | 非予約 |
| PROPERTIES | 非予約 | 非予約 | 非予約 |
| PURGE | 非予約 | 非予約 | 非予約 |
| QUARTER | 非予約 | 非予約 | 非予約 |
| QUERY | 非予約 | 非予約 | 非予約 |
| RANGE | 非予約 | 非予約 | 予約 |
| READS | 非予約 | 非予約 | 非予約 |
| REAL | 非予約 | 非予約 | 予約 |
| RECORDREADER | 非予約 | 非予約 | 非予約 |
| RECORDWRITER | 非予約 | 非予約 | 非予約 |
| RECOVER | 非予約 | 非予約 | 非予約 |
| RECURSIVE | 予約 | 非予約 | 予約 |
| REDUCE | 非予約 | 非予約 | 非予約 |
| REFERENCES | 予約 | 非予約 | 予約 |
| REFRESH | 非予約 | 非予約 | 非予約 |
| REGEXP | 非予約 | 非予約 | キーワードではない |
| RENAME | 非予約 | 非予約 | 非予約 |
| REPAIR | 非予約 | 非予約 | 非予約 |
| REPEAT | 非予約 | 非予約 | 非予約 |
| REPEATABLE | 非予約 | 非予約 | 非予約 |
| REPLACE | 非予約 | 非予約 | 非予約 |
| RESET | 非予約 | 非予約 | 非予約 |
| RESPECT | 非予約 | 非予約 | 非予約 |
| RESTRICT | 非予約 | 非予約 | 非予約 |
| RETURN | 非予約 | 非予約 | 予約 |
| RETURNS | 非予約 | 非予約 | 予約 |
| REVOKE | 非予約 | 非予約 | 予約 |
| RIGHT | 予約 | 厳格非予約 | 予約 |
| RLIKE | 非予約 | 非予約 | 非予約 |
| ROLE | 非予約 | 非予約 | 非予約 |
| ROLES | 非予約 | 非予約 | 非予約 |
| ROLLBACK | 非予約 | 非予約 | 予約 |
| ROLLUP | 非予約 | 非予約 | 予約 |
| ROW | 非予約 | 非予約 | 予約 |
| ROWS | 非予約 | 非予約 | 予約 |
| SCHEMA | 非予約 | 非予約 | 非予約 |
| SCHEMAS | 非予約 | 非予約 | 非予約 |
| SECOND | 非予約 | 非予約 | 非予約 |
| SECONDS | 非予約 | 非予約 | 非予約 |
| SECURITY | 非予約 | 非予約 | 非予約 |
| SELECT | 予約 | 非予約 | 予約 |
| SEMI | 非予約 | 厳格非予約 | 非予約 |
| SEPARATED | 非予約 | 非予約 | 非予約 |
| SERDE | 非予約 | 非予約 | 非予約 |
| SERDEPROPERTIES | 非予約 | 非予約 | 非予約 |
| SESSION_USER | 予約 | 非予約 | 予約 |
| SET | 非予約 | 非予約 | 予約 |
| SETS | 非予約 | 非予約 | 非予約 |
| SHORT | 非予約 | 非予約 | 非予約 |
| SHOW | 非予約 | 非予約 | 非予約 |
| SINGLE | 非予約 | 非予約 | 非予約 |
| SKEWED | 非予約 | 非予約 | 非予約 |
| SMALLINT | 非予約 | 非予約 | 予約 |
| SOME | 予約 | 非予約 | 予約 |
| SORT | 非予約 | 非予約 | 非予約 |
| SORTED | 非予約 | 非予約 | 非予約 |
| SOURCE | 非予約 | 非予約 | 非予約 |
| SPECIFIC | 非予約 | 非予約 | 予約 |
| SQL | 予約 | 非予約 | 予約 |
| SQLEXCEPTION | 非予約 | 非予約 | 非予約 |
| SQLSTATE | 非予約 | 非予約 | 非予約 |
| START | 非予約 | 非予約 | 予約 |
| STATISTICS | 非予約 | 非予約 | 非予約 |
| STORED | 非予約 | 非予約 | 非予約 |
| STRATIFY | 非予約 | 非予約 | 非予約 |
| STRING | 非予約 | 非予約 | 非予約 |
| STRUCT | 非予約 | 非予約 | 非予約 |
| SUBSTR | 非予約 | 非予約 | 非予約 |
| SUBSTRING | 非予約 | 非予約 | 非予約 |
| SYNC | 非予約 | 非予約 | 非予約 |
| SYSTEM_TIME | 非予約 | 非予約 | 非予約 |
| SYSTEM_VERSION | 非予約 | 非予約 | 非予約 |
| TABLE | 予約 | 非予約 | 予約 |
| TABLES | 非予約 | 非予約 | 非予約 |
| TABLESAMPLE | 非予約 | 非予約 | 予約 |
| TARGET | 非予約 | 非予約 | 非予約 |
| TBLPROPERTIES | 非予約 | 非予約 | 非予約 |
| TEMP | 非予約 | 非予約 | キーワードではない |
| TEMPORARY | 非予約 | 非予約 | 非予約 |
| TERMINATED | 非予約 | 非予約 | 非予約 |
| THEN | 予約 | 非予約 | 予約 |
| TIME | 予約 | 非予約 | 予約 |
| TIMEDIFF | 非予約 | 非予約 | 非予約 |
| TIMESTAMP | 非予約 | 非予約 | 非予約 |
| TIMESTAMP_LTZ | 非予約 | 非予約 | 非予約 |
| TIMESTAMP_NTZ | 非予約 | 非予約 | 非予約 |
| TIMESTAMPADD | 非予約 | 非予約 | 非予約 |
| TIMESTAMPDIFF | 非予約 | 非予約 | 非予約 |
| TINYINT | 非予約 | 非予約 | 非予約 |
| TO | 予約 | 非予約 | 予約 |
| TOUCH | 非予約 | 非予約 | 非予約 |
| TRAILING | 予約 | 非予約 | 予約 |
| TRANSACTION | 非予約 | 非予約 | 非予約 |
| TRANSACTIONS | 非予約 | 非予約 | 非予約 |
| TRANSFORM | 非予約 | 非予約 | 非予約 |
| TRIM | 非予約 | 非予約 | 非予約 |
| TRUE | 非予約 | 非予約 | 予約 |
| TRUNCATE | 非予約 | 非予約 | 予約 |
| TRY_CAST | 非予約 | 非予約 | 非予約 |
| TYPE | 非予約 | 非予約 | 非予約 |
| UNARCHIVE | 非予約 | 非予約 | 非予約 |
| UNBOUNDED | 非予約 | 非予約 | 非予約 |
| UNCACHE | 非予約 | 非予約 | 非予約 |
| UNION | 予約 | 厳格非予約 | 予約 |
| UNIQUE | 予約 | 非予約 | 予約 |
| UNKNOWN | 予約 | 非予約 | 予約 |
| UNLOCK | 非予約 | 非予約 | 非予約 |
| UNPIVOT | 非予約 | 非予約 | 非予約 |
| UNSET | 非予約 | 非予約 | 非予約 |
| UNTIL | 非予約 | 非予約 | 非予約 |
| UPDATE | 非予約 | 非予約 | 予約 |
| USE | 非予約 | 非予約 | 非予約 |
| USER | 予約 | 非予約 | 予約 |
| USING | 予約 | 厳格非予約 | 予約 |
| VALUE | 非予約 | 非予約 | 非予約 |
| VALUES | 非予約 | 非予約 | 予約 |
| VARCHAR | 非予約 | 非予約 | 予約 |
| VAR | 非予約 | 非予約 | 非予約 |
| VARIABLE | 非予約 | 非予約 | 非予約 |
| VARIANT | 非予約 | 非予約 | 予約 |
| VERSION | 非予約 | 非予約 | 非予約 |
| VIEW | 非予約 | 非予約 | 非予約 |
| VIEWS | 非予約 | 非予約 | 非予約 |
| VOID | 非予約 | 非予約 | 非予約 |
| WEEK | 非予約 | 非予約 | 非予約 |
| WEEKS | 非予約 | 非予約 | 非予約 |
| WHEN | 予約 | 非予約 | 予約 |
| WHERE | 予約 | 非予約 | 予約 |
| WHILE | 非予約 | 非予約 | 非予約 |
| WINDOW | 非予約 | 非予約 | 予約 |
| WITH | 予約 | 非予約 | 予約 |
| WITHIN | 予約 | 非予約 | 予約 |
| X | 非予約 | 非予約 | 非予約 |
| YEAR | 非予約 | 非予約 | 非予約 |
| YEARS | 非予約 | 非予約 | 非予約 |
| ZONE | 非予約 | 非予約 | 非予約 |