ANSI-Konformität in Databricks Runtime

Gilt für:check marked yes Databricks Runtime

In diesem Artikel wird die ANSI-Konformität in Databricks Runtime beschrieben. Informationen zum ANSI-Modus in Databricks SQL finden Sie unter ANSI_MODE.

Spark SQL bietet zwei Optionen zur Unterstützung der Kompatibilität mit dem ANSI-SQL-Standard: spark.sql.ansi.enabled und spark.sql.storeAssignmentPolicy.

Wenn spark.sql.ansi.enabled auf true festgelegt ist, verwendet Spark SQL einen ANSI-kompatiblen Dialekt, statt Hive-kompatibel zu sein. Spark löst z. B. zur Laufzeit eine Ausnahme aus, statt NULL-Ergebnisse zurückzugeben, wenn die Eingaben für einen SQL-Operator/eine SQL-Funktion ungültig sind. Einige ANSI-Dialektfunktionen stammen möglicherweise nicht direkt aus dem ANSI-SQL-Standard, aber ihr Verhalten entspricht dem Stil von ANSI SQL.

Darüber hinaus verfügt Spark SQL über eine unabhängige Option zum Steuern des impliziten Umwandlungsverhaltens beim Speichern von Zeilen in eine Tabelle. Das Umwandlungsverhalten ist im Standard als Speicherzuweisungsregeln definiert.

Wenn spark.sql.storeAssignmentPolicy auf ANSI festgelegt ist, entspricht Spark SQL den ANSI-Speicherzuweisungsregeln. Dies ist eine separate Konfiguration, da der Standardwert ANSI ist, während die Konfiguration spark.sql.ansi.enabled standardmäßig deaktiviert ist.

In der folgenden Tabelle wird das Verhalten zusammengefasst:

Eigenschaftenname Standard Bedeutung
spark.sql.ansi.enabled false Wenn die Eigenschaft auf „true“ festgelegt ist, versucht Spark, die ANSI-SQL-Spezifikation zu erfüllen:

* Löst eine Laufzeitausnahme aus, wenn bei einer Operation für ein Ganzzahl- oder Dezimalfeld ein Überlauf auftritt.
* Verbietet die Verwendung der reservierten Schlüsselwörter von ANSI SQL als Bezeichner im SQL-Parser.
spark.sql.storeAssignmentPolicy ANSI Beim Speichern eines Werts in einer Spalte mit einem anderen Datentyp führt Spark eine Typkonvertierung durch. Es gibt drei Richtlinien für die Typumwandlungsregeln: ANSI, legacy und strict.

* ANSI: Spark führt die Typumwandlung gemäß ANSI SQL aus. In der Praxis entspricht das Verhalten im Wesentlichen dem von PostgreSQL. Bestimmte nicht sinnvolle Typkonvertierungen wie das Konvertieren von „String“ in „Int“ oder „Double“ in „Boolean“ sind unzulässig.
* legacy: Spark lässt die Typumwandlung zu, solange es sich um eine gültige Umwandlung handelt, was sehr weit gefasst ist. Beispielsweise ist das Konvertieren von „String“ in „Int“ oder „Double“ in „Boolean“ zulässig. Dies ist auch das einzige Verhalten in Spark 2.x und ist mit Hive kompatibel.
* strict: Spark erlaubt keine Präzisionsverluste oder Datenverkürzungen bei der Typumwandlung. Beispielsweise ist die Umwandlung von double in int oder von decimal in double nicht erlaubt.

In den folgenden Unterabschnitten werden die Verhaltensänderungen bei arithmetischen Operationen, Typkonvertierungen und der SQL-Analyse bei aktiviertem ANSI-Modus aufgezeigt. In Bezug auf Typkonvertierungen in Spark SQL gibt es drei Arten, die in diesem Artikel einzeln vorgestellt werden: Umwandlung, Speicherzuweisung und Typkoersion.

Arithmetische Operationen

In Spark SQL werden arithmetische Operationen für numerische Typen (mit Ausnahme von „Decimal“) standardmäßig nicht auf Überläufe überprüft. Das heißt, wenn eine Operation Überläufe verursacht, ist das Ergebnis dasselbe wie bei der entsprechenden Operation in einem Java- oder Scala-Programm (wenn z. B. die Summe von zwei ganzen Zahlen höher ist als der maximal darstellbare Wert, ist das Ergebnis eine negative Zahl). Andererseits gibt Spark SQL bei Dezimalüberläufen NULL zurück. Wenn spark.sql.ansi.enabled auf true festgelegt ist und ein Überlauf bei numerischen und Intervallarithmetikoperationen auftritt, wird zur Laufzeit eine arithmetische Ausnahme ausgelöst.

-- `spark.sql.ansi.enabled=true`
> SELECT 2147483647 + 1;
 error: integer overflow

-- `spark.sql.ansi.enabled=false`
> SELECT 2147483647 + 1;
  -2147483648

Umwandeln

Wenn spark.sql.ansi.enabled auf true festgelegt ist, löst die explizite Umwandlung durch die CAST-Syntax eine Laufzeitausnahme für ungültige Umwandlungsmuster aus, die im Standard definiert sind, z. B. Umwandlungen von einer Zeichenfolge in eine ganze Zahl.

Die CAST-Klausel des Spark-ANSI-Modus folgt den Syntaxregeln von Abschnitt 6.13 „Umwandlungsspezifikation“ in ISO/IEC 9075-2:2011 Information technology — Database languages — SQL — Part 2: Foundation (SQL/Foundation), mit der Ausnahme, dass sie speziell die folgenden einfachen Typkonvertierungen zulässt, die gemäß dem ANSI-Standard nicht zulässig sind:

  • NumericType <=> BooleanType
  • StringType <=> BinaryType

Die gültigen Kombinationen aus Quell- und Zieldatentyp in einem CAST-Ausdruck sind in der folgenden Tabelle aufgeführt. „J“ gibt an, dass die Kombination syntaktisch ohne Einschränkung gültig ist, und „N“ gibt an, dass die Kombination ungültig ist.

SourceTarget Numerisch String Date Timestamp Intervall Boolean Binary Array Map Struktur
Numeric J Y N N N Y N N N N
String J Y Y Y Y Y Y N N N
Date N J Y Y N N N N N N
Timestamp N J Y Y N N N N N N
Intervall N Y N N Y N N N N N
Boolean J Y N N N Y N N N N
Binary J N N N N N Y N N N
Array N N N N N N N Y N N
Map N N N N N N N N Y N
Struktur N N N N N N N N N J
-- Examples of explicit casting

-- `spark.sql.ansi.enabled=true`
> SELECT CAST('a' AS INT);
  ERROR: [CAST_INVALID_INPUT] The value 'a' of the type "STRING" cannot be cast to "INT" because it is malformed.

> SELECT CAST(2147483648L AS INT);
  ERROR: [CAST_OVERFLOW] The value 2147483648L of the type "BIGINT" cannot be cast to "INT" due to an overflow.

> SELECT CAST(DATE'2020-01-01' AS INT)
  ERROR: [DATATYPE_MISMATCH.CAST_WITH_FUNC_SUGGESTION] Cannot resolve "CAST(DATE '2020-01-01' AS INT)" due to data type mismatch: cannot cast "DATE" to "INT".

-- `spark.sql.ansi.enabled=false` (This is a default behavior)
> SELECT cast('a' AS INT);
  null

> SELECT CAST(2147483648L AS INT);
  -2147483648

> SELECT CAST(DATE'2020-01-01' AS INT);
  null

Speicherzuweisung

Die Einstellung spark.sql.storeAssignmentPolicy standardmäßig auf ANSI festgelegt. Wenn die Datentypen von Quellwerten durch diese Einstellung nicht mit den Zielspaltentypen übereinstimmen, fügt Spark SQL automatisch ANSI CAST-Klauseln zur INSERT-Anweisung hinzu. Während der Tabelleneinfügung prüft und lehnt Spark durch diese Richtlinie ungültige Umwandlungen ab und löst eine Ausnahme aus, um die Datenqualität sicherzustellen. Wenn das Einfügen aufgrund eines Typkonflikts fehlschlägt, werden somit keine Daten teilweise in die Tabelle geschrieben.

Beispiele:

-- spark.sql.storeAssignmentPolicy=ANSI
> CREATE TABLE test(i INT);
> INSERT INTO test VALUES (2147483648L);
  ERROR: [CAST_OVERFLOW_IN_TABLE_INSERT] Fail to insert a value of "BIGINT" type into the "INT" type column `i` due to an overflow.

> INSERT INTO test VALUES ('a');
  ERROR: [CAST_INVALID_INPUT ERROR] The value 'a' of the type "STRING" cannot be cast to "INT" because it is malformed

Diese Beispiele zeigen, dass Spark SQL verhindert, dass inkompatible Daten eingefügt werden, wodurch die Datenintegrität sichergestellt wird.

Wenn spark.sql.storeAssignmentPolicy auf LEGACY festgelegt ist, greift Spark SQL auf das Verhalten zurück, das bis zu Spark 2.x bestand. In diesem Fall verwendet es anstelle von ANSI CAST ältere CAST-Vorgänge. Mit dieser Richtlinie führen ungültige Umwandlungen während der Tabelleneinfügung dazu, dass entweder NULL-Werte oder falsche Werte eingefügt werden, anstatt eine Ausnahme zu auslösen. Beispiele:

-- spark.sql.storeAssignmentPolicy=LEGACY
> CREATE TABLE test(i INT);
> INSERT INTO test VALUES (2147483648L);
> INSERT INTO test VALUES ('a');
> SELECT * FROM test;

-- Results
--  -2147483648 (incorrect value due to overflow)
--  null (cannot cast 'a' to INT)

Typumwandlung

Typerweiterung und Rangfolge von Typen

Wenn spark.sql.ansi.enabled auf true festgelegt ist, verwendet Spark SQL mehrere Regeln, die steuern, wie Konflikte zwischen Datentypen gelöst werden. Das Kernstück dieser Konfliktlösung ist die Typenrangfolgeliste, die definiert, ob Werte eines bestimmten Datentyps implizit auf einen anderen Datentyp heraufgestuft/erweitert werden können.

Datentyp Rangfolgeliste (vom niedrigsten zum höchsten Typ)
Byte Byte -> Short -> Int -> Long -> Decimal -> Float* -> Double
Schnellstart 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 Date -> Timestamp
Timestamp Timestamp
String string
Binary Binary
Boolean Boolean
Intervall Intervall
Map Zuordnung**
Array Array**
Struktur Struktur**
  • Bei der Auflösung des kleinsten gemeinsamen Typs wird „Float“ übersprungen, um Genauigkeitsverluste zu vermeiden.

** Bei einem komplexen Typ wird die Rangfolgeregel rekursiv auf die zugehörigen Komponentenelemente angewendet.

Spezielle Regeln gelten für den Typ „String“ und den nicht typisierten NULL-Wert. Ein NULL-Wert kann auf jeden anderen Typ heraufgestuft werden, und „String“ kann auf jeden einfachen Datentyp heraufgestuft werden.

Hier sehen Sie eine grafische Darstellung der Rangfolgeliste in Form eines gerichteten Baums: Graphical representation of precedence rules

Auflösung des kleinsten gemeinsamen Typs

Der kleinste gemeinsame Typ aus einer Reihe von Typen ist der niedrigste Typ, der aus der Rangfolgeliste von allen Elementen der Reihe von Typen erreicht werden kann.

Die Auflösung des kleinsten gemeinsamen Typs wird für Folgendes verwendet:

  • Entscheiden, ob eine Funktion, die einen Parameter eines Typs erwartet, mit einem Argument eines niedrigeren Typs aufgerufen werden kann.
  • Ableiten des Argumenttyps für Funktionen, die einen gemeinsamen Argumenttyp für mehrere Parameter erwarten, z. B. COALESCE, LEAST oder GREATEST.
  • Ableiten der Operandentypen für Operatoren wie z. B. arithmetische Operationen oder Vergleiche.
  • Ableiten des Ergebnistyps für Ausdrücke wie den CASE-Ausdruck.
  • Ableiten der Element-, Schlüssel- oder Werttypen für Array- und Map-Konstruktoren.

Spezielle Regeln werden angewendet, wenn der kleinste gemeinsame Typ in FLOAT aufgelöst wird. Wenn bei Werten vom Typ „Float“ einer der Typen INT, BIGINT oder DECIMAL ist, wird der kleinste gemeinsame Typ zu DOUBLE erweitert, um einen potenziellen Verlust von Ziffern zu vermeiden.

-- 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

-- The substring function expects arguments of type INT for the start and length parameters.
> SELECT substring('hello', 1Y, 2);
he

> SELECT substring('hello', '1', 2);
he

> SELECT substring('hello', 1L, 2);
Error: Argument 2 requires an INT type.

> SELECT substring('hello', str, 2) FROM VALUES(CAST('1' AS STRING)) AS T(str);
Error: Argument 2 requires an INT type.

SQL-Funktionen

Das Verhalten einiger SQL-Funktionen kann im ANSI-Modus (spark.sql.ansi.enabled=true) anders ausfallen.

  • size: Diese Funktion gibt bei Null-Eingaben im ANSI-Modus NULL zurück.
  • element_at:
    • Diese Funktion löst ArrayIndexOutOfBoundsException aus, wenn ungültige Indizes verwendet werden.
    • Diese Funktion löst NoSuchElementException aus, wenn der Schlüssel in der Zuordnung nicht vorhanden ist.
  • elt: Diese Funktion löst ArrayIndexOutOfBoundsException aus, wenn ungültige Indizes verwendet werden.
  • make_date: Diese Funktion schlägt mit einer Ausnahme fehl, wenn das resultierende Datum ungültig ist.
  • make_timestamp: Diese Funktion schlägt mit einer Ausnahme fehl, wenn der resultierende Zeitstempel ungültig ist.
  • make_interval: Diese Funktion schlägt mit einer Ausnahme fehl, wenn das resultierende Intervall ungültig ist.
  • next_day: Diese Funktion löst IllegalArgumentException aus, wenn die Eingabe kein gültiger Wochentag ist.
  • parse_url: Diese Funktion löst IllegalArgumentException aus, wenn die Eingabezeichenfolge keine gültige URL ist.
  • to_date: Diese Funktion schlägt mit einer Ausnahme fehl, wenn die Eingabezeichenfolge nicht analysiert werden kann oder die Musterzeichenfolge ungültig ist.
  • to_timestamp: Diese Funktion schlägt mit einer Ausnahme fehl, wenn die Eingabezeichenfolge nicht analysiert werden kann oder die Musterzeichenfolge ungültig ist.
  • to_unix_timestamp: Diese Funktion schlägt mit einer Ausnahme fehl, wenn die Eingabezeichenfolge nicht analysiert werden kann oder die Musterzeichenfolge ungültig ist.
  • unix_timestamp: Diese Funktion schlägt mit einer Ausnahme fehl, wenn die Eingabezeichenfolge nicht analysiert werden kann oder die Musterzeichenfolge ungültig ist.

SQL-Operatoren

Das Verhalten einiger SQL-Operatoren kann im ANSI-Modus (spark.sql.ansi.enabled=true) anders ausfallen.

  • array_col[index]: Dieser Operator löst ArrayIndexOutOfBoundsException aus, wenn ungültige Indizes verwendet werden.
  • map_col[key]: Dieser Operator löst NoSuchElementException aus, wenn der Schlüssel in der Zuordnung nicht vorhanden ist.
  • CAST(string_col AS TIMESTAMP): Dieser Operator schlägt mit einer Ausnahme fehl, wenn die Eingabezeichenfolge nicht analysiert werden kann.
  • CAST(string_col AS DATE): Dieser Operator schlägt mit einer Ausnahme fehl, wenn die Eingabezeichenfolge nicht analysiert werden kann.

Nützliche Funktionen für den ANSI-Modus

Wenn der ANSI-Modus aktiviert ist, werden Ausnahmen für ungültige Operationen ausgelöst. Sie können die folgenden SQL-Funktionen verwenden, um solche Ausnahmen zu unterdrücken.

  • try_cast: Diese Funktion ist mit CAST identisch, außer dass sie das Ergebnis NULL zurückgibt, statt bei Laufzeitfehlern eine Ausnahme auszulösen.
  • try_add: Diese Funktion ist mit dem Additionsoperator (+) identisch, außer dass sie das Ergebnis NULL zurückgibt, statt bei einem Ganzzahlüberlauf eine Ausnahme auszulösen.
  • try_divide: Diese Funktion ist mit dem Divisionsoperator (/) identisch, außer dass sie das Ergebnis NULL zurückgibt, statt bei einer Division durch Null (0) eine Ausnahme auszulösen.

SQL-Schlüsselwörter

Wenn spark.sql.ansi.enabled auf „true“ festgelegt ist, verwendet Spark SQL den Parser im ANSI-Modus. In diesem Modus verfügt Spark SQL über zwei Arten von Schlüsselwörtern:

  • Reservierte Schlüsselwörter: Schlüsselwörter, die reserviert sind und nicht als Bezeichner für Tabellen, Ansichten, Spalten, Funktionen, Aliase usw. verwendet werden können.
  • Nicht reservierte Schlüsselwörter: Schlüsselwörter, die nur in bestimmten Kontexten eine besondere Bedeutung haben und in anderen Kontexten als Bezeichner verwendet werden können. Beispielsweise ist EXPLAIN SELECT ... ein Befehl, aber EXPLAIN kann an anderen Stellen als Bezeichner verwendet werden.

Wenn der ANSI-Modus deaktiviert ist, verfügt Spark SQL über zwei Arten von Schlüsselwörtern:

  • Nicht reservierte Schlüsselwörter: Es gilt dieselbe Definition wie bei aktiviertem ANSI-Modus.
  • Nicht reservierte Schlüsselwörter im strikten Modus: Eine strikte Version nicht reservierter Schlüsselwörter, die nicht als Tabellenalias verwendet werden können.

Standardmäßig ist spark.sql.ansi.enabled auf „false“ festgelegt.

Im Folgenden finden Sie eine Liste aller Schlüsselwörter in Spark SQL.

Schlüsselwort Spark SQL-ANSI-Modus Spark SQL-Standardmodus SQL-2016
ADD non-reserved non-reserved non-reserved
AFTER non-reserved non-reserved non-reserved
ALL reserved non-reserved reserved
ALTER non-reserved non-reserved reserved
ALWAYS non-reserved non-reserved non-reserved
ANALYSIEREN non-reserved non-reserved non-reserved
AND reserved non-reserved reserved
ANTI non-reserved strict-non-reserved non-reserved
BELIEBIG reserved non-reserved reserved
ARCHIVE non-reserved non-reserved non-reserved
ARRAY non-reserved non-reserved reserved
AS reserved non-reserved reserved
ASC non-reserved non-reserved non-reserved
AT non-reserved non-reserved reserved
AUTHORIZATION reserved non-reserved reserved
BETWEEN non-reserved non-reserved reserved
BOTH reserved non-reserved reserved
BUCKET non-reserved non-reserved non-reserved
BUCKETS non-reserved non-reserved non-reserved
BY non-reserved non-reserved reserved
CACHE non-reserved non-reserved non-reserved
CASCADE non-reserved non-reserved non-reserved
CASE reserved non-reserved reserved
CAST reserved non-reserved reserved
CHANGE non-reserved non-reserved non-reserved
CHECK reserved non-reserved reserved
CLEAR non-reserved non-reserved non-reserved
CLUSTER non-reserved non-reserved non-reserved
CLUSTERED non-reserved non-reserved non-reserved
CODEGEN non-reserved non-reserved non-reserved
COLLATE reserved non-reserved reserved
COLLECTION non-reserved non-reserved non-reserved
COLUMN reserved non-reserved reserved
COLUMNS non-reserved non-reserved non-reserved
COMMENT non-reserved non-reserved non-reserved
COMMIT non-reserved non-reserved reserved
COMPACT non-reserved non-reserved non-reserved
COMPACTIONS non-reserved non-reserved non-reserved
COMPUTE non-reserved non-reserved non-reserved
CONCATENATE non-reserved non-reserved non-reserved
CONSTRAINT reserved non-reserved reserved
COST non-reserved non-reserved non-reserved
CREATE reserved non-reserved reserved
CROSS reserved strict-non-reserved reserved
CUBE non-reserved non-reserved reserved
CURRENT non-reserved non-reserved reserved
CURRENT_DATE reserved non-reserved reserved
CURRENT_TIME reserved non-reserved reserved
CURRENT_TIMESTAMP reserved non-reserved reserved
CURRENT_USER reserved non-reserved reserved
DATA non-reserved non-reserved non-reserved
DATENBANK non-reserved non-reserved non-reserved
DATABASES non-reserved non-reserved non-reserved
DAY non-reserved non-reserved non-reserved
DBPROPERTIES non-reserved non-reserved non-reserved
DEFINED non-reserved non-reserved non-reserved
DELETE non-reserved non-reserved reserved
DELIMITED non-reserved non-reserved non-reserved
DESC non-reserved non-reserved non-reserved
DESCRIBE non-reserved non-reserved reserved
DFS non-reserved non-reserved non-reserved
DIRECTORIES non-reserved non-reserved non-reserved
DIRECTORY non-reserved non-reserved non-reserved
DISTINCT reserved non-reserved reserved
DISTRIBUTE non-reserved non-reserved non-reserved
DIV non-reserved non-reserved kein Schlüsselwort
DROP non-reserved non-reserved reserved
ELSE reserved non-reserved reserved
END reserved non-reserved reserved
ESCAPE reserved non-reserved reserved
ESCAPED non-reserved non-reserved non-reserved
EXCEPT reserved strict-non-reserved reserved
EXCHANGE non-reserved non-reserved non-reserved
EXISTS non-reserved non-reserved reserved
EXPLAIN non-reserved non-reserved non-reserved
EXPORT non-reserved non-reserved non-reserved
EXTENDED non-reserved non-reserved non-reserved
EXTERNAL non-reserved non-reserved reserved
EXTRACT non-reserved non-reserved reserved
FALSE reserved non-reserved reserved
FETCH reserved non-reserved reserved
FIELDS non-reserved non-reserved non-reserved
FILTER reserved non-reserved reserved
FILEFORMAT non-reserved non-reserved non-reserved
FIRST non-reserved non-reserved non-reserved
FN non-reserved non-reserved non-reserved
FOLLOWING non-reserved non-reserved non-reserved
FOR reserved non-reserved reserved
FOREIGN reserved non-reserved reserved
FORMAT non-reserved non-reserved non-reserved
FORMATTED non-reserved non-reserved non-reserved
FROM reserved non-reserved reserved
FULL reserved strict-non-reserved reserved
FUNCTION non-reserved non-reserved reserved
FUNCTIONS non-reserved non-reserved non-reserved
GENERATED non-reserved non-reserved non-reserved
GLOBAL non-reserved non-reserved reserved
GRANT reserved non-reserved reserved
GRANTS non-reserved non-reserved non-reserved
GROUP reserved non-reserved reserved
GROUPING non-reserved non-reserved reserved
HAVING reserved non-reserved reserved
HOUR non-reserved non-reserved non-reserved
IF non-reserved non-reserved kein Schlüsselwort
IGNORE non-reserved non-reserved non-reserved
IMPORT non-reserved non-reserved non-reserved
IN reserved non-reserved reserved
INDEX non-reserved non-reserved non-reserved
INDEXES non-reserved non-reserved non-reserved
INNER reserved strict-non-reserved reserved
INPATH non-reserved non-reserved non-reserved
INPUTFORMAT non-reserved non-reserved non-reserved
INSERT non-reserved non-reserved reserved
INTERSECT reserved strict-non-reserved reserved
INTERVAL non-reserved non-reserved reserved
INTO reserved non-reserved reserved
IS reserved non-reserved reserved
ITEMS non-reserved non-reserved non-reserved
JOIN reserved strict-non-reserved reserved
KEY non-reserved non-reserved non-reserved
KEYS non-reserved non-reserved non-reserved
LAST non-reserved non-reserved non-reserved
LATERAL reserved strict-non-reserved reserved
LAZY non-reserved non-reserved non-reserved
LEADING reserved non-reserved reserved
LEFT reserved strict-non-reserved reserved
LIKE non-reserved non-reserved reserved
ILIKE non-reserved non-reserved non-reserved
LIMIT non-reserved non-reserved non-reserved
LINES non-reserved non-reserved non-reserved
AUFLISTEN non-reserved non-reserved non-reserved
LOAD non-reserved non-reserved non-reserved
LOCAL non-reserved non-reserved reserved
LOCATION non-reserved non-reserved non-reserved
LOCK non-reserved non-reserved non-reserved
LOCKS non-reserved non-reserved non-reserved
LOGICAL non-reserved non-reserved non-reserved
MACRO non-reserved non-reserved non-reserved
MAP non-reserved non-reserved non-reserved
MATCHED non-reserved non-reserved non-reserved
MERGE non-reserved non-reserved non-reserved
MINUTE non-reserved non-reserved non-reserved
MINUS non-reserved strict-non-reserved non-reserved
MONTH non-reserved non-reserved non-reserved
MSCK non-reserved non-reserved non-reserved
NAMESPACE non-reserved non-reserved non-reserved
NAMESPACES non-reserved non-reserved non-reserved
NATURAL reserved strict-non-reserved reserved
NO non-reserved non-reserved reserved
NOT reserved non-reserved reserved
NULL reserved non-reserved reserved
NULLS non-reserved non-reserved non-reserved
OF non-reserved non-reserved reserved
EIN reserved strict-non-reserved reserved
ONLY reserved non-reserved reserved
OPTION non-reserved non-reserved non-reserved
OPTIONS non-reserved non-reserved non-reserved
OR reserved non-reserved reserved
ORDER reserved non-reserved reserved
OUT non-reserved non-reserved reserved
OUTER reserved non-reserved reserved
OUTPUTFORMAT non-reserved non-reserved non-reserved
OVER non-reserved non-reserved non-reserved
OVERLAPS reserved non-reserved reserved
OVERLAY non-reserved non-reserved non-reserved
OVERWRITE non-reserved non-reserved non-reserved
PARTITION non-reserved non-reserved reserved
PARTITIONED non-reserved non-reserved non-reserved
PARTITIONS non-reserved non-reserved non-reserved
PERCENT non-reserved non-reserved non-reserved
PIVOT non-reserved non-reserved non-reserved
PLACING non-reserved non-reserved non-reserved
POSITION non-reserved non-reserved reserved
PRECEDING non-reserved non-reserved non-reserved
PRIMARY reserved non-reserved reserved
PRINCIPALS non-reserved non-reserved non-reserved
PROPERTIES non-reserved non-reserved non-reserved
PURGE non-reserved non-reserved non-reserved
QUALIFY reserved non-reserved reserved
QUERY non-reserved non-reserved non-reserved
RANGE non-reserved non-reserved reserved
RECIPIENT non-reserved non-reserved non-reserved
RECIPIENTS non-reserved non-reserved non-reserved
RECORDREADER non-reserved non-reserved non-reserved
RECORDWRITER non-reserved non-reserved non-reserved
RECOVER non-reserved non-reserved non-reserved
REDUCE non-reserved non-reserved non-reserved
REFERENCES reserved non-reserved reserved
REFRESH non-reserved non-reserved non-reserved
REGEXP non-reserved non-reserved kein Schlüsselwort
REMOVE non-reserved non-reserved non-reserved
RENAME non-reserved non-reserved non-reserved
REPAIR non-reserved non-reserved non-reserved
REPLACE non-reserved non-reserved non-reserved
RESET non-reserved non-reserved non-reserved
RESPECT non-reserved non-reserved non-reserved
RESTRICT non-reserved non-reserved non-reserved
REVOKE non-reserved non-reserved reserved
RIGHT reserved strict-non-reserved reserved
RLIKE non-reserved non-reserved non-reserved
ROLE non-reserved non-reserved non-reserved
ROLES non-reserved non-reserved non-reserved
ROLLBACK non-reserved non-reserved reserved
ROLLUP non-reserved non-reserved reserved
ROW non-reserved non-reserved reserved
ROWS non-reserved non-reserved reserved
SCHEMA non-reserved non-reserved non-reserved
SCHEMAS non-reserved non-reserved kein Schlüsselwort
SECOND non-reserved non-reserved non-reserved
SELECT reserved non-reserved reserved
SEMI non-reserved strict-non-reserved non-reserved
SEPARATED non-reserved non-reserved non-reserved
SERDE non-reserved non-reserved non-reserved
SERDEPROPERTIES non-reserved non-reserved non-reserved
SESSION_USER reserved non-reserved reserved
SET non-reserved non-reserved reserved
SETS non-reserved non-reserved non-reserved
SHARE non-reserved non-reserved non-reserved
SHARES non-reserved non-reserved non-reserved
SHOW non-reserved non-reserved non-reserved
SKEWED non-reserved non-reserved non-reserved
SOME reserved non-reserved reserved
SORT non-reserved non-reserved non-reserved
SORTED non-reserved non-reserved non-reserved
START non-reserved non-reserved reserved
STATISTICS non-reserved non-reserved non-reserved
STORED non-reserved non-reserved non-reserved
STRATIFY non-reserved non-reserved non-reserved
STRUCT non-reserved non-reserved non-reserved
SUBSTR non-reserved non-reserved non-reserved
SUBSTRING non-reserved non-reserved non-reserved
SYNC non-reserved non-reserved non-reserved
TABLE reserved non-reserved reserved
TABLES non-reserved non-reserved non-reserved
TABLESAMPLE non-reserved non-reserved reserved
TBLPROPERTIES non-reserved non-reserved non-reserved
TEMP non-reserved non-reserved kein Schlüsselwort
TEMPORARY non-reserved non-reserved non-reserved
TERMINATED non-reserved non-reserved non-reserved
THEN reserved non-reserved reserved
TIME reserved non-reserved reserved
TO reserved non-reserved reserved
TOUCH non-reserved non-reserved non-reserved
TRAILING reserved non-reserved reserved
TRANSACTION non-reserved non-reserved non-reserved
TRANSACTIONS non-reserved non-reserved non-reserved
TRANSFORM non-reserved non-reserved non-reserved
TRIM non-reserved non-reserved non-reserved
TRUE non-reserved non-reserved reserved
TRUNCATE non-reserved non-reserved reserved
TRY_CAST non-reserved non-reserved non-reserved
TYPE non-reserved non-reserved non-reserved
UNARCHIVE non-reserved non-reserved non-reserved
UNBOUNDED non-reserved non-reserved non-reserved
UNCACHE non-reserved non-reserved non-reserved
UNION reserved strict-non-reserved reserved
UNIQUE reserved non-reserved reserved
UNKNOWN reserved non-reserved reserved
UNLOCK non-reserved non-reserved non-reserved
UNSET non-reserved non-reserved non-reserved
UPDATE non-reserved non-reserved reserved
USE non-reserved non-reserved non-reserved
USER reserved non-reserved reserved
USING reserved strict-non-reserved reserved
VALUES non-reserved non-reserved reserved
VIEW non-reserved non-reserved non-reserved
VIEWS non-reserved non-reserved non-reserved
WHEN reserved non-reserved reserved
WHERE reserved non-reserved reserved
WINDOW non-reserved non-reserved reserved
WITH reserved non-reserved reserved
YEAR non-reserved non-reserved non-reserved
ZONE non-reserved non-reserved non-reserved