ANSI 準拠
Spark SQL では、SQL 標準に準拠するために 2 つのオプションがあります。spark.sql.ansi.enabled
と spark.sql.storeAssignmentPolicy
(詳細は下の表を参照)。
spark.sql.ansi.enabled
が true
に設定されている場合、Spark SQL は Hive 準拠ではなく、ANSI 準拠のダイアレクトを使用します。たとえば、Spark は、SQL 演算子/関数への入力が無効な場合、null 結果を返す代わりに、実行時に例外をスローします。一部の ANSI ダイアレクト機能は ANSI SQL 標準から直接のものではないかもしれませんが、その動作は ANSI SQL のスタイルに沿っています。
さらに、Spark SQL には、テーブルに行を挿入するときの暗黙的なキャスト動作を制御するための独立したオプションがあります。キャスト動作は、標準でストア割り当てルールとして定義されています。
spark.sql.storeAssignmentPolicy
が ANSI
に設定されている場合、Spark SQL は ANSI ストア割り当てルールに準拠します。この設定のデフォルト値は ANSI
であり、設定 spark.sql.ansi.enabled
はデフォルトで無効になっているため、これは別の設定です。
プロパティ名 | デフォルト | 意味 | バージョン |
---|---|---|---|
spark.sql.ansi.enabled |
false | 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 と同じです。文字列を int に変換したり、double を boolean に変換するなど、不合理な型の変換を許可しません。数値型の列に挿入する場合、値がターゲットデータ型の範囲外にあるとオーバーフローエラーがスローされます。 2. legacy ポリシーでは、Spark は有効な Cast である限り、非常に緩い型強制を許可します。たとえば、文字列を int に変換したり、double を boolean に変換することは許可されています。また、これは Spark 2.x で唯一の動作であり、Hive と互換性があります。 3. strict ポリシーでは、Spark は型強制で精度の低下やデータ切り捨てを一切許可しません。たとえば、double を int に変換したり、decimal を double に変換することは許可されていません。 |
3.0.0 |
以下のサブセクションでは、ANSI モードが有効になっている場合の算術演算、型変換、および SQL 解析の動作変更について説明します。Spark SQL の型変換には、キャスト、ストア割り当て、型の強制の 3 つの種類があり、この記事ではそれらを 1 つずつ紹介します。
算術演算
Spark SQL では、数値型 (decimal を除く) で実行される算術演算は、デフォルトではオーバーフローがチェックされません。これは、演算がオーバーフローを引き起こす場合、結果は Java/Scala プログラムでの対応する演算と同じになることを意味します (たとえば、2 つの整数の合計が表現可能な最大値よりも大きい場合、結果は負の数になります)。一方、Spark SQL は decimal のオーバーフローに対して null を返します。spark.sql.ansi.enabled
が true
に設定されていて、数値および間隔の算術演算でオーバーフローが発生した場合、実行時に算術例外をスローします。
-- `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」は、組み合わせが無効であることを示します。
ソース\ターゲット | 数値 | 文字列 | 日付 | タイムスタンプ | タイムスタンプ_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 |
タイムスタンプ_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 (数値/日付/タイムスタンプ/タイムスタンプ_NTZ/間隔/ブール)): 値をターゲットデータ型として解析できない場合は、実行時例外を発生させます。
- CAST(タイムスタンプ AS 数値): エポックからの秒数がターゲットデータ型の範囲外にある場合は、オーバーフロー例外を発生させます。
- CAST(数値 AS タイムスタンプ): 数値に 1000000 (1 秒あたりのマイクロ秒数) を掛けた値が Long 型の範囲外にある場合は、オーバーフロー例外を発生させます。
- CAST(配列 AS 配列): 要素の変換に問題がある場合は例外を発生させます。
- CAST(マップ AS マップ): キーと値の変換に問題がある場合は例外を発生させます。
- CAST(構造体 AS 構造体): 構造体フィールドの変換に問題がある場合は例外を発生させます。
- CAST(数値 AS 文字列): 10 進数値を文字列にキャストする場合、指数が必要な場合でも、科学的記数法を使用せずに、常にプレーンな文字列表現を使用します。
- CAST(間隔 AS 数値): 日時間隔のマイクロ秒数または年月間隔の月数がターゲットデータ型の範囲外にある場合は、オーバーフロー例外を発生させます。
- CAST(数値 AS 間隔): 数値にターゲット間隔の終了単位を掛けた値が、年月間隔の場合は Int 型の範囲外である場合、または日時間隔の場合は Long 型の範囲外である場合は、オーバーフロー例外を発生させます。
-- Examples of explicit casting
-- `spark.sql.ansi.enabled=true`
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. If necessary set "spark.sql.ansi.enabled" to "false" to bypass this error.
== 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. If necessary set "spark.sql.ansi.enabled" to "false" to bypass this error.
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` (This is a default behaviour)
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|
+---+
キャストでの丸め
小数部を持つ 10 進数を、INTERVAL HOUR TO SECOND のように終了単位として SECOND を持つ間隔型にキャストする場合、Spark は、両方の近傍が等距離にある場合を除き、小数部を「最近傍」に向かって丸めます。この場合は、切り上げます。
ストア割り当て
冒頭で述べたように、spark.sql.storeAssignmentPolicy
が ANSI
(これはデフォルト値) に設定されている場合、Spark SQL はテーブル挿入時に ANSI ストア割り当てルールに準拠します。テーブル挿入でのソースとターゲットのデータ型の有効な組み合わせは、次の表で与えられます。
ソース\ターゲット | 数値 | 文字列 | 日付 | タイムスタンプ | タイムスタンプ_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 |
タイムスタンプ_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 は間隔型のテーブル列をサポートしていません。
** 配列/マップ/構造体型の場合、データ型チェックルールは、その構成要素に対して再帰的に適用されます。
テーブル挿入中、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 はスキップされます。
** 文字列は、複数の種類のデータ型に昇格できます。Byte/Short/Int/Decimal/Float は、この優先順位リストには含まれていないことに注意してください。Byte/Short/Int と文字列の最小共通型は Long であり、Decimal/Float の最小共通型は Double です。
*** 複合型の場合、優先順位ルールは、その構成要素に対して再帰的に適用されます。
型なし NULL には特別なルールが適用されます。NULL は他の任意の型に昇格できます。
これは、優先順位リストを有向木としてグラフで表したものです:
最小共通型解決
型の集合における最小共通型は、型の集合のすべての要素によって、優先順位リストから到達可能な最も狭い型です。
最小共通型解決は、以下の場合に使用されます。
- coalesce、least、greatestなどの複数のパラメータに共有される引数型を期待する関数の引数型を導出します。
- 算術演算や比較などの演算子のオペランド型を導出します。
- case式などの式の戻り型を導出します。
- 配列およびマップコンストラクターの要素型、キー型、または値型を導出します。最小共通型がFLOATに解決される場合は、特別なルールが適用されます。float型の値の場合、いずれかの型がINT、BIGINT、またはDECIMALの場合、桁の損失の可能性を避けるために最小共通型はDOUBLEにプッシュされます。
-- 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関数の宣言されたパラメータ型として入力値を格納する際の
Store assignment
ルールに従います。 - 型なし 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_sum
:関数sum
と同じですが、整数/10進数/間隔値のオーバーフローで例外をスローする代わりにNULL
の結果を返します。try_avg
:関数avg
と同じですが、10進数/間隔値のオーバーフローで例外をスローする代わりにNULL
の結果を返します。try_element_at
:関数element_at
と同じですが、配列のインデックスが範囲外の場合に例外をスローする代わりにNULL
の結果を返します。try_to_timestamp
:関数to_timestamp
と同じですが、文字列解析エラーで例外をスローする代わりに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.enabled
とspark.sql.ansi.enforceReservedKeywords
の両方がfalseです。
以下は、Spark SQLのすべてのキーワードのリストです。
キーワード | Spark SQL ANSIモード |
Spark SQL デフォルトモード |
SQL-2016 |
---|---|---|---|
ADD | 非予約 | 非予約 | 非予約 |
AFTER | 非予約 | 非予約 | 非予約 |
ALL | 予約 | 非予約 | 予約 |
ALTER | 非予約 | 非予約 | 予約 |
ALWAYS | 非予約 | 非予約 | 非予約 |
ANALYZE | 非予約 | 非予約 | 非予約 |
AND | 予約 | 非予約 | 予約 |
ANTI | 非予約 | 厳密な非予約 | 非予約 |
ANY | 予約 | 非予約 | 予約 |
ANY_VALUE | 非予約 | 非予約 | 非予約 |
ARCHIVE | 非予約 | 非予約 | 非予約 |
ARRAY | 非予約 | 非予約 | 予約 |
AS | 予約 | 非予約 | 予約 |
ASC | 非予約 | 非予約 | 非予約 |
AT | 非予約 | 非予約 | 予約 |
AUTHORIZATION | 予約 | 非予約 | 予約 |
BETWEEN | 非予約 | 非予約 | 予約 |
BIGINT | 非予約 | 非予約 | 予約 |
BINARY | 非予約 | 非予約 | 予約 |
BOOLEAN | 非予約 | 非予約 | 予約 |
BOTH | 予約 | 非予約 | 予約 |
BUCKET | 非予約 | 非予約 | 非予約 |
BUCKETS | 非予約 | 非予約 | 非予約 |
BY | 非予約 | 非予約 | 予約 |
BYTE | 非予約 | 非予約 | 非予約 |
CACHE | 非予約 | 非予約 | 非予約 |
CASCADE | 非予約 | 非予約 | 非予約 |
CASE | 予約 | 非予約 | 予約 |
CAST | 予約 | 非予約 | 予約 |
CATALOG | 非予約 | 非予約 | 非予約 |
CATALOGS | 非予約 | 非予約 | 非予約 |
CHANGE | 非予約 | 非予約 | 非予約 |
CHAR | 非予約 | 非予約 | 予約 |
CHARACTER | 非予約 | 非予約 | 予約 |
CHECK | 予約 | 非予約 | 予約 |
CLEAR | 非予約 | 非予約 | 非予約 |
CLUSTER | 非予約 | 非予約 | 非予約 |
CLUSTERED | 非予約 | 非予約 | 非予約 |
CODEGEN | 非予約 | 非予約 | 非予約 |
COLLATE | 予約 | 非予約 | 予約 |
COLLECTION | 非予約 | 非予約 | 非予約 |
COLUMN | 予約 | 非予約 | 予約 |
COLUMNS | 非予約 | 非予約 | 非予約 |
COMMENT | 非予約 | 非予約 | 非予約 |
COMMIT | 非予約 | 非予約 | 予約 |
COMPACT | 非予約 | 非予約 | 非予約 |
COMPACTIONS | 非予約 | 非予約 | 非予約 |
COMPUTE | 非予約 | 非予約 | 非予約 |
CONCATENATE | 非予約 | 非予約 | 非予約 |
CONSTRAINT | 予約 | 非予約 | 予約 |
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 | 非予約 | 非予約 | 予約 |
DEFAULT | 非予約 | 非予約 | 非予約 |
DEFINED | 非予約 | 非予約 | 非予約 |
DELETE | 非予約 | 非予約 | 予約 |
DELIMITED | 非予約 | 非予約 | 非予約 |
DESC | 非予約 | 非予約 | 非予約 |
DESCRIBE | 非予約 | 非予約 | 予約 |
DFS | 非予約 | 非予約 | 非予約 |
DIRECTORIES | 非予約 | 非予約 | 非予約 |
DIRECTORY | 非予約 | 非予約 | 非予約 |
DISTINCT | 予約 | 非予約 | 予約 |
DISTRIBUTE | 非予約 | 非予約 | 非予約 |
DIV | 非予約 | 非予約 | キーワードではない |
DOUBLE | 非予約 | 非予約 | 予約 |
DROP | 非予約 | 非予約 | 予約 |
ELSE | 予約 | 非予約 | 予約 |
END | 予約 | 非予約 | 予約 |
ESCAPE | 予約 | 非予約 | 予約 |
ESCAPED | 非予約 | 非予約 | 非予約 |
EXCEPT | 予約 | 厳密な非予約 | 予約 |
EXCHANGE | 非予約 | 非予約 | 非予約 |
EXCLUDE | 非予約 | 非予約 | 非予約 |
EXISTS | 非予約 | 非予約 | 予約 |
EXPLAIN | 非予約 | 非予約 | 非予約 |
EXPORT | 非予約 | 非予約 | 非予約 |
EXTENDED | 非予約 | 非予約 | 非予約 |
EXTERNAL | 非予約 | 非予約 | 予約 |
EXTRACT | 非予約 | 非予約 | 予約 |
FALSE | 予約 | 非予約 | 予約 |
FETCH | 予約 | 非予約 | 予約 |
FIELDS | 非予約 | 非予約 | 非予約 |
FILTER | 予約 | 非予約 | 予約 |
FILEFORMAT | 非予約 | 非予約 | 非予約 |
FIRST | 非予約 | 非予約 | 非予約 |
FLOAT | 非予約 | 非予約 | 予約 |
FOLLOWING | 非予約 | 非予約 | 非予約 |
FOR | 予約 | 非予約 | 予約 |
FOREIGN | 予約 | 非予約 | 予約 |
FORMAT | 非予約 | 非予約 | 非予約 |
FORMATTED | 非予約 | 非予約 | 非予約 |
FROM | 予約 | 非予約 | 予約 |
FULL | 予約 | 厳密な非予約 | 予約 |
FUNCTION | 非予約 | 非予約 | 予約 |
FUNCTIONS | 非予約 | 非予約 | 非予約 |
GENERATED | 非予約 | 非予約 | 非予約 |
GLOBAL | 非予約 | 非予約 | 予約 |
GRANT | 予約 | 非予約 | 予約 |
GROUP | 予約 | 非予約 | 予約 |
GROUPING | 非予約 | 非予約 | 予約 |
HAVING | 予約 | 非予約 | 予約 |
HOUR | 非予約 | 非予約 | 非予約 |
HOURS | 非予約 | 非予約 | 非予約 |
IDENTIFIER | 非予約 | 非予約 | 非予約 |
IF | 非予約 | 非予約 | キーワードではない |
IGNORE | 非予約 | 非予約 | 非予約 |
IMPORT | 非予約 | 非予約 | 非予約 |
IN | 予約 | 非予約 | 予約 |
INCLUDE | 非予約 | 非予約 | 非予約 |
INDEX | 非予約 | 非予約 | 非予約 |
INDEXES | 非予約 | 非予約 | 非予約 |
INNER | 予約 | 厳密な非予約 | 予約 |
INPATH | 非予約 | 非予約 | 非予約 |
INPUTFORMAT | 非予約 | 非予約 | 非予約 |
INSERT | 非予約 | 非予約 | 予約 |
INT | 非予約 | 非予約 | 予約 |
INTEGER | 非予約 | 非予約 | 予約 |
INTERSECT | 予約 | 厳密な非予約 | 予約 |
INTERVAL | 非予約 | 非予約 | 予約 |
INTO | 予約 | 非予約 | 予約 |
IS | 予約 | 非予約 | 予約 |
ITEMS | 非予約 | 非予約 | 非予約 |
JOIN | 予約 | 厳密な非予約 | 予約 |
KEYS | 非予約 | 非予約 | 非予約 |
LAST | 非予約 | 非予約 | 非予約 |
LATERAL | 予約 | 厳密な非予約 | 予約 |
LAZY | 非予約 | 非予約 | 非予約 |
LEADING | 予約 | 非予約 | 予約 |
LEFT | 予約 | 厳密な非予約 | 予約 |
LIKE | 非予約 | 非予約 | 予約 |
ILIKE | 非予約 | 非予約 | 非予約 |
LIMIT | 非予約 | 非予約 | 非予約 |
LINES | 非予約 | 非予約 | 非予約 |
LIST | 非予約 | 非予約 | 非予約 |
LOAD | 非予約 | 非予約 | 非予約 |
LOCAL | 非予約 | 非予約 | 予約 |
LOCATION | 非予約 | 非予約 | 非予約 |
LOCK | 非予約 | 非予約 | 非予約 |
LOCKS | 非予約 | 非予約 | 非予約 |
LOGICAL | 非予約 | 非予約 | 非予約 |
LONG | 非予約 | 非予約 | 非予約 |
MACRO | 非予約 | 非予約 | 非予約 |
MAP | 非予約 | 非予約 | 非予約 |
MATCHED | 非予約 | 非予約 | 非予約 |
MERGE | 非予約 | 非予約 | 非予約 |
MICROSECOND | 非予約 | 非予約 | 非予約 |
MICROSECONDS | 非予約 | 非予約 | 非予約 |
MILLISECOND | 非予約 | 非予約 | 非予約 |
MILLISECONDS | 非予約 | 非予約 | 非予約 |
MINUTE | 非予約 | 非予約 | 非予約 |
MINUTES | 非予約 | 非予約 | 非予約 |
MINUS | 非予約 | 厳密な非予約 | 非予約 |
MONTH | 非予約 | 非予約 | 非予約 |
MONTHS | 非予約 | 非予約 | 非予約 |
MSCK | 非予約 | 非予約 | 非予約 |
NAME | 非予約 | 非予約 | 非予約 |
NAMESPACE | 非予約 | 非予約 | 非予約 |
NAMESPACES | 非予約 | 非予約 | 非予約 |
NANOSECOND | 非予約 | 非予約 | 非予約 |
NANOSECONDS | 非予約 | 非予約 | 非予約 |
NATURAL | 予約 | 厳密な非予約 | 予約 |
NO | 非予約 | 非予約 | 予約 |
NOT | 予約 | 非予約 | 予約 |
NULL | 予約 | 非予約 | 予約 |
NULLS | 非予約 | 非予約 | 非予約 |
NUMERIC | 非予約 | 非予約 | 非予約 |
OF | 非予約 | 非予約 | 予約 |
OFFSET | 予約 | 非予約 | 予約 |
ON | 予約 | 厳密な非予約 | 予約 |
ONLY | 予約 | 非予約 | 予約 |
OPTION | 非予約 | 非予約 | 非予約 |
OPTIONS | 非予約 | 非予約 | 非予約 |
OR | 予約 | 非予約 | 予約 |
ORDER | 予約 | 非予約 | 予約 |
OUT | 非予約 | 非予約 | 予約 |
OUTER | 予約 | 非予約 | 予約 |
OUTPUTFORMAT | 非予約 | 非予約 | 非予約 |
OVER | 非予約 | 非予約 | 非予約 |
OVERLAPS | 予約 | 非予約 | 予約 |
OVERLAY | 非予約 | 非予約 | 非予約 |
OVERWRITE | 非予約 | 非予約 | 非予約 |
PARTITION | 非予約 | 非予約 | 予約 |
PARTITIONED | 非予約 | 非予約 | 非予約 |
PARTITIONS | 非予約 | 非予約 | 非予約 |
PERCENT | 非予約 | 非予約 | 非予約 |
PERCENTILE_CONT | 予約 | 非予約 | 非予約 |
PERCENTILE_DISC | 予約 | 非予約 | 非予約 |
PIVOT | 非予約 | 非予約 | 非予約 |
PLACING | 非予約 | 非予約 | 非予約 |
POSITION | 非予約 | 非予約 | 予約 |
PRECEDING | 非予約 | 非予約 | 非予約 |
PRIMARY | 予約 | 非予約 | 予約 |
PRINCIPALS | 非予約 | 非予約 | 非予約 |
PROPERTIES | 非予約 | 非予約 | 非予約 |
PURGE | 非予約 | 非予約 | 非予約 |
QUARTER | 非予約 | 非予約 | 非予約 |
QUERY | 非予約 | 非予約 | 非予約 |
RANGE | 非予約 | 非予約 | 予約 |
REAL | 非予約 | 非予約 | 予約 |
RECORDREADER | 非予約 | 非予約 | 非予約 |
RECORDWRITER | 非予約 | 非予約 | 非予約 |
RECOVER | 非予約 | 非予約 | 非予約 |
REDUCE | 非予約 | 非予約 | 非予約 |
REFERENCES | 予約 | 非予約 | 予約 |
REFRESH | 非予約 | 非予約 | 非予約 |
REGEXP | 非予約 | 非予約 | キーワードではない |
RENAME | 非予約 | 非予約 | 非予約 |
REPAIR | 非予約 | 非予約 | 非予約 |
REPEATABLE | 非予約 | 非予約 | 非予約 |
REPLACE | 非予約 | 非予約 | 非予約 |
RESET | 非予約 | 非予約 | 非予約 |
RESPECT | 非予約 | 非予約 | 非予約 |
RESTRICT | 非予約 | 非予約 | 非予約 |
REVOKE | 非予約 | 非予約 | 予約 |
RIGHT | 予約 | 厳密な非予約 | 予約 |
RLIKE | 非予約 | 非予約 | 非予約 |
ROLE | 非予約 | 非予約 | 非予約 |
ROLES | 非予約 | 非予約 | 非予約 |
ROLLBACK | 非予約 | 非予約 | 予約 |
ROLLUP | 非予約 | 非予約 | 予約 |
ROW | 非予約 | 非予約 | 予約 |
ROWS | 非予約 | 非予約 | 予約 |
SCHEMA | 非予約 | 非予約 | 非予約 |
SCHEMAS | 非予約 | 非予約 | 非予約 |
SECOND | 非予約 | 非予約 | 非予約 |
SECONDS | 非予約 | 非予約 | 非予約 |
SELECT | 予約 | 非予約 | 予約 |
SEMI | 非予約 | 厳密な非予約 | 非予約 |
SEPARATED | 非予約 | 非予約 | 非予約 |
SERDE | 非予約 | 非予約 | 非予約 |
SERDEPROPERTIES | 非予約 | 非予約 | 非予約 |
SESSION_USER | 予約 | 非予約 | 予約 |
SET | 非予約 | 非予約 | 予約 |
SETS | 非予約 | 非予約 | 非予約 |
SHORT | 非予約 | 非予約 | 非予約 |
SHOW | 非予約 | 非予約 | 非予約 |
SKEWED | 非予約 | 非予約 | 非予約 |
SMALLINT | 非予約 | 非予約 | 予約 |
SOME | 予約 | 非予約 | 予約 |
SORT | 非予約 | 非予約 | 非予約 |
SORTED | 非予約 | 非予約 | 非予約 |
SOURCE | 非予約 | 非予約 | 非予約 |
START | 非予約 | 非予約 | 予約 |
STATISTICS | 非予約 | 非予約 | 非予約 |
STORED | 非予約 | 非予約 | 非予約 |
STRATIFY | 非予約 | 非予約 | 非予約 |
STRING | 非予約 | 非予約 | 非予約 |
STRUCT | 非予約 | 非予約 | 非予約 |
SUBSTR | 非予約 | 非予約 | 非予約 |
SUBSTRING | 非予約 | 非予約 | 非予約 |
SYNC | 非予約 | 非予約 | 非予約 |
SYSTEM_TIME | 非予約 | 非予約 | 非予約 |
SYSTEM_VERSION | 非予約 | 非予約 | 非予約 |
TABLE | 予約 | 非予約 | 予約 |
TABLES | 非予約 | 非予約 | 非予約 |
TABLESAMPLE | 非予約 | 非予約 | 予約 |
TARGET | 非予約 | 非予約 | 非予約 |
TBLPROPERTIES | 非予約 | 非予約 | 非予約 |
TEMP | 非予約 | 非予約 | キーワードではない |
TEMPORARY | 非予約 | 非予約 | 非予約 |
TERMINATED | 非予約 | 非予約 | 非予約 |
THEN | 予約 | 非予約 | 予約 |
TIME | 予約 | 非予約 | 予約 |
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 | 非予約 | 非予約 | 非予約 |
UPDATE | 非予約 | 非予約 | 予約 |
USE | 非予約 | 非予約 | 非予約 |
USER | 予約 | 非予約 | 予約 |
USING | 予約 | 厳密な非予約 | 予約 |
VALUES | 非予約 | 非予約 | 予約 |
VARCHAR | 非予約 | 非予約 | 予約 |
VERSION | 非予約 | 非予約 | 非予約 |
VIEW | 非予約 | 非予約 | 非予約 |
VIEWS | 非予約 | 非予約 | 非予約 |
VOID | 非予約 | 非予約 | 非予約 |
WEEK | 非予約 | 非予約 | 非予約 |
WEEKS | 非予約 | 非予約 | 非予約 |
WHEN | 予約 | 非予約 | 予約 |
WHERE | 予約 | 非予約 | 予約 |
ウィンドウ | 非予約 | 非予約 | 予約 |
付き | 予約 | 非予約 | 予約 |
以内 | 予約 | 非予約 | 予約 |
X | 非予約 | 非予約 | 非予約 |
年 | 非予約 | 非予約 | 非予約 |
年間 | 非予約 | 非予約 | 非予約 |
ゾーン | 非予約 | 非予約 | 非予約 |