ANSI-Konformität in Databricks Runtime
Gilt für: 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 ein Überlauf in einem Vorgang in einem ganzzahligen oder dezimalen Feld 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:
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.
- Diese Funktion löst
elt
: Diese Funktion löstArrayIndexOutOfBoundsException
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östIllegalArgumentException
aus, wenn die Eingabe kein gültiger Wochentag ist.parse_url
: Diese Funktion löstIllegalArgumentException
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östArrayIndexOutOfBoundsException
aus, wenn ungültige Indizes verwendet werden.map_col[key]
: Dieser Operator löstNoSuchElementException
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 mitCAST
identisch, außer dass sie das ErgebnisNULL
zurückgibt, statt bei Laufzeitfehlern eine Ausnahme auszulösen.try_add
: Diese Funktion ist mit dem Additionsoperator (+
) identisch, außer dass sie das ErgebnisNULL
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 ErgebnisNULL
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 |