ANSI 準拠

Spark SQL では、SQL 標準に準拠するための 2 つのオプションがあります。それは spark.sql.ansi.enabledspark.sql.storeAssignmentPolicy です(詳細は以下の表を参照)。

デフォルトでは、spark.sql.ansi.enabledtrue で、Spark SQL は Hive 準拠ではなく、ANSI 準拠の構文を使用します。たとえば、SQL 演算子/関数への入力が無効な場合、Spark は null 結果を返すのではなく、実行時に例外をスローします。一部の ANSI 構文機能は ANSI SQL 標準から直接ではないかもしれませんが、その動作は ANSI SQL のスタイルに沿っています。

さらに、Spark SQL には、テーブルに行を挿入する際の暗黙的なキャスト動作を制御する独立したオプションがあります。キャスト動作は、標準ではストア代入ルールとして定義されています。

デフォルトでは、spark.sql.storeAssignmentPolicyANSI で、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.enabledfalse の場合、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.enabledtrue に設定されている場合、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 でマークされています。

-- 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.storeAssignmentPolicyANSI(デフォルト値)に設定されている場合、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.enabledtrue に設定されている場合、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 は任意の他の型に昇格できます。

これは、優先順位リストの有向木としてのグラフィカルな表現です:型優先順位リスト

共通の最小型解決

型のセットの共通の最小型とは、セットのすべての要素から優先順位リストで到達可能な最も狭い型です。

共通の最小型解決は、次の目的で使用されます。

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 の関数呼び出しは

> 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)では異なる場合があります。

SQL 演算子

一部の SQL 演算子の挙動は、ANSI モード(spark.sql.ansi.enabled=true)では異なる場合があります。

ANSI モードに役立つ関数

ANSI モードがオンの場合、無効な操作に対して例外がスローされます。これらの例外を抑制するには、次の SQL 関数を使用できます。

SQL キーワード(オプション、デフォルトで無効)

spark.sql.ansi.enabledspark.sql.ansi.enforceReservedKeywords の両方が true の場合、Spark SQL は ANSI モードパーサーを使用します。

ANSI モードパーサーでは、Spark SQL には 2 種類のキーワードがあります。

デフォルトパーサーでは、Spark SQL には 2 種類のキーワードがあります。

デフォルトでは、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 非予約 非予約 非予約