Conformité ANSI dans Databricks Runtime
S’applique à : Databricks Runtime
Cet article décrit la conformité ANSI dans Databricks Runtime. Pour le mode ANSI dans Databricks SQL, consultez ANSI_MODE.
Spark SQL dispose de deux options pour prendre en charge la conformité avec ANSI SQL : spark.sql.ansi.enabled
et spark.sql.storeAssignmentPolicy
.
Quand spark.sql.ansi.enabled
est défini sur true
, Spark SQL utilise un dialecte conforme à ANSI plutôt qu’à Hive. Par exemple, Spark lèvera une exception au moment de l’exécution au lieu de retourner des résultats null si les entrées d’un opérateur ou d’une fonction SQL ne sont pas valides. Certaines caractéristiques du dialecte ANSI ne sont pas directement issues de la norme ANSI SQL, mais leurs comportements s’alignent sur le style d’ANSI SQL.
De plus, Spark SQL offre une option indépendante pour contrôler les comportements de conversion implicite lors du stockage de lignes dans une table. Les comportements de conversion sont définis comme des règles d’affectation de magasin dans la norme.
Quand spark.sql.storeAssignmentPolicy
est défini sur ANSI
, Spark SQL est conforme aux règles d’affectation de magasin ANSI. Il s’agit d’une configuration distincte, car sa valeur par défaut est ANSI
, tandis que la configuration spark.sql.ansi.enabled
est désactivée par défaut.
Le tableau suivant récapitule ce comportement :
Nom de la propriété | Default | Signification |
---|---|---|
spark.sql.ansi.enabled |
false | Si la valeur est true, Spark tente de se conformer à la spécification ANSI SQL : - Lève une exception d’exécution si un dépassement de capacité se produit dans une opération sur un champ entier ou décimal. - Interdit l’utilisation des mots clés réservés d’ANSI SQL comme identificateurs dans l’analyseur SQL. |
spark.sql.storeAssignmentPolicy |
ANSI | Lors du stockage d’une valeur dans une colonne d’un type de données différent, Spark effectue une conversion de type. Il existe trois stratégies pour les règles de forçage de type : ANSI , legacy et strict .- ANSI : Spark effectue un forçage de type conformément à ANSI SQL. Dans la pratique, le comportement est essentiellement le même que celui de PostgreSQL. Il interdit certaines conversions de type déraisonnable, telles que la conversion d’une chaîne en entier ou d’une valeur double en valeur booléenne.- legacy : Spark autorise le forçage de type tant qu’il s’agit d’une conversion valide, ce qui est très vague. Par exemple, la conversion d’une chaîne en entier ou d’une valeur double en valeur booléenne est autorisée. Il s’agit également du seul comportement dans Spark 2.x et il est compatible avec Hive.- strict : Spark n’autorise aucune perte de précision ou troncation de données dans le forçage de type ; ainsi, la conversion de valeur double en entier ou de valeur décimale en valeur double n’est pas autorisée. |
Les sous-sections suivantes présentent des changements de comportement dans les opérations arithmétiques, les conversions de types et l’analyse des SQL lorsque le mode ANSI est activé. En ce qui concerne les conversions de types dans Spark SQL, il en existe de trois sortes que cet article présente : cast, affectation de magasin et forçage de type.
Opérations arithmétiques
Dans Spark SQL, les opérations arithmétiques effectuées sur des types numériques (à l’exception du type décimal) ne sont pas vérifiées par défaut sur le plan des dépassements.
Cela signifie que, si une opération provoque des dépassements, le résultat est le même avec l’opération correspondante dans un programme Java ou Scala (par exemple, si la somme de 2 entiers est supérieure à la valeur maximale pouvant être représentée, le résultat est un nombre négatif). Par ailleurs, Spark SQL retourne la valeur null pour les dépassements décimaux.
Lorsque spark.sql.ansi.enabled
est défini sur true
et qu’un dépassement se produit dans des opérations arithmétiques numériques et d’intervalle, celui-ci lève une exception arithmétique au moment de l’exécution.
-- `spark.sql.ansi.enabled=true`
> SELECT 2147483647 + 1;
error: integer overflow
-- `spark.sql.ansi.enabled=false`
> SELECT 2147483647 + 1;
-2147483648
Caster
Lorsque spark.sql.ansi.enabled
est défini sur true
, un cast explicite à l’aide de la syntaxe CAST
lève une exception de runtime pour les modèles de cast non autorisés définis dans la norme, tels des casts de chaîne en entier.
La clause CAST
du mode ANSI Spark suit les règles de syntaxe de la section 6.13 « cast specification » de la spécification ISO/IEC 9075-2:2011 Information technology — Database languages - SQL — Part 2: Foundation (SQL/Foundation), sauf qu’elle autorise spécialement les conversions de types directes suivantes, que la norme ANSI n’autorise pas :
- NumericType <=> BooleanType
- StringType <=> BinaryType
Les combinaisons valides de types de données source et cible dans une expression CAST
sont présentées dans le tableau suivant.
« O » indique que la combinaison est syntaxiquement valide sans restriction, et « N » qu’elle ne l’est pas.
SourceTarget | Numérique | String | Date | Timestamp | Intervalle | Boolean | Binary | Array | Mappage | Struct |
---|---|---|---|---|---|---|---|---|---|---|
Numérique | O | O | N | N | N | Y | N | N | N | N |
String | O | O | O | O | O | O | O | N | N | N |
Date | N | O | O | O | N | N | N | N | N | N |
Timestamp | N | O | O | O | N | N | N | N | N | N |
Intervalle | N | Y | N | N | Y | N | N | N | N | N |
Boolean | O | O | N | N | N | Y | N | N | N | N |
Binary | O | N | N | N | N | N | Y | N | N | N |
Array | N | N | N | N | N | N | N | Y | N | N |
Mappage | N | N | N | N | N | N | N | N | Y | N |
Struct | N | N | N | N | N | N | N | N | N | O |
-- 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
Affectation de magasin
Le paramètre spark.sql.storeAssignmentPolicy
par défaut est ANSI
. Avec ce paramètre, lorsque les types de données des valeurs sources ne correspondent pas aux types de colonnes cibles, Spark SQL ajoute automatiquement des clauses ANSI CAST à l’instruction INSERT.
Lors de l’insertion d’une table dans le cadre de cette stratégie, Spark vérifie et rejette les casts invalides, en levant une exception pour garantir la qualité des données. Cela signifie que si une tentative d’insertion échoue en raison d’une incompatibilité de type, aucune donnée n’est partiellement écrite dans la table.
Exemples :
-- 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
Ces exemples montrent que Spark SQL empêche l’insertion de données incompatibles, ce qui maintient l’intégrité des données.
Lorsque le spark.sql.storeAssignmentPolicy
est défini sur LEGACY
, Spark SQL rétablit le comportement répandu jusqu’à Spark 2.x. Dans ce mode, au lieu d’utiliser ANSI CAST, il applique des opérations CAST héritées. Dans cette stratégie, les casts non valides pendant les insertions de table entraînent l’insertion de valeurs NULL ou de valeurs incorrectes au lieu de lever une exception.
Exemples :
-- 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)
Forçage de type
Promotion et priorité de type
Lorsque spark.sql.ansi.enabled
est défini sur true
, Spark SQL utilise plusieurs règles qui régissent le mode de résolution des conflits entre les types de données.
Au cœur de cette résolution des conflits se trouve la liste des priorités des types qui définit si les valeurs d’un type de données peuvent être promues de manière implicite vers un autre type de données.
Type de données | Liste des priorités (du plus étroit au plus large) |
---|---|
Byte | Byte -> Short -> Int -> Long -> Decimal -> Float* -> Double |
Court | 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 |
Intervalle | Intervalle |
Mappage | Map** |
Array | Array** |
Struct | Struct** |
- Pour la résolution du type le moins courant, le type float est ignoré pour éviter la perte de précision.
** Pour un type complexe, la règle de priorité s’applique de manière récursive à ses éléments constitutifs.
Des règles spéciales s’appliquent au type chaîne (String) et aux valeurs NULL non typées. Une valeur NULL peut être promue vers n’importe quel autre type, tandis qu’une chaîne peut être promue vers tout type de données simple.
Voici une représentation graphique de la liste des priorités sous la forme d’une arborescence dirigée:
Résolution du type le moins courant
Le type le moins courant d’un ensemble de types est le type le plus étroit accessible à partir de la liste des priorités par tous les éléments de l’ensemble de types.
La résolution du type le moins courant est utilisée pour :
- Décider si une fonction qui attend un paramètre d’un type donné peut être appelée à l’aide d’un argument d’un type plus étroit.
- Déduire le type d’argument pour des fonctions qui attendent un type d’argument partagé pour plusieurs paramètres, tels que coalesce, least ou greatest.
- Déduire les types d’opérandes pour des opérateurs tels que des opérations arithmétiques ou des comparaisons.
- Déterminer le type de résultat pour des expressions telles que l’expression case.
- Déduire les types d’élément, de clé ou de valeur pour des constructeurs de tableau et de mappage.
Des règles spéciales sont appliquées si le type le moins courant se résout en FLOAT. Avec des valeurs de type float, si l’un des types est INT, BIGINT ou DECIMAL, le type le moins courant est poussé vers le type DOUBLE pour éviter toute perte potentielle de chiffres.
-- 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.
Fonctions SQL
Le comportement de certaines fonctions SQL peut différer en mode ANSI (spark.sql.ansi.enabled=true
).
size
: cette fonction retourne null pour une entrée null en mode ANSI.element_at
:- Cette fonction lève une exception
ArrayIndexOutOfBoundsException
en cas d’utilisation d’index non valides. - Cette fonction lève une exception
NoSuchElementException
si la clé n’existe pas dans le mappage.
- Cette fonction lève une exception
elt
: cette fonction lève une exceptionArrayIndexOutOfBoundsException
en cas d’utilisation d’index non valides.make_date
: cette fonction échoue avec une exception si la date du résultat n’est pas valide.make_timestamp
: cette fonction échoue avec une exception si le timestamp du résultat n’est pas valide.make_interval
: cette fonction échoue avec une exception si l’intervalle du résultat n’est pas valide.next_day
: cette fonction lève une exceptionIllegalArgumentException
si l’entrée n’est pas un jour de la semaine valide.parse_url
: cette fonction lève une exceptionIllegalArgumentException
si une chaîne d’entrée n’est pas une URL valide.to_date
: cette fonction échoue avec une exception si la chaîne d’entrée ne peut pas être analysée ou si la chaîne de modèle n’est pas valide.to_timestamp
: cette fonction échoue avec une exception si la chaîne d’entrée ne peut pas être analysée ou si la chaîne de modèle n’est pas valide.to_unix_timestamp
: cette fonction échoue avec une exception si la chaîne d’entrée ne peut pas être analysée ou si la chaîne de modèle n’est pas valide.unix_timestamp
: cette fonction échoue avec une exception si la chaîne d’entrée ne peut pas être analysée ou si la chaîne de modèle n’est pas valide.
Opérateurs SQL
Le comportement de certains opérateurs SQL peut différer en mode ANSI (spark.sql.ansi.enabled=true
).
array_col[index]
: cet opérateur lève une exceptionArrayIndexOutOfBoundsException
en cas d’utilisation d’index non valides.map_col[key]
: cet opérateur lève une exceptionNoSuchElementException
si la clé n’existe pas dans le mappage.CAST(string_col AS TIMESTAMP)
: cet opérateur échoue avec une exception si la chaîne d’entrée ne peut pas être analysée.CAST(string_col AS DATE)
: cet opérateur échoue avec une exception si la chaîne d’entrée ne peut pas être analysée.
Fonctions utiles pour le mode ANSI
Lorsque le mode ANSI est activé, il lève des exceptions pour les opérations non valides. Vous pouvez utiliser les fonctions SQL suivantes pour supprimer de telles exceptions.
try_cast
: fonction identique àCAST
, sauf qu’elle retourne le résultatNULL
au lieu de lever une exception sur une erreur de runtime.try_add
: fonction identique à l’opérateur d’ajout+
, sauf qu’elle retourne le résultatNULL
au lieu de lever une exception sur un dépassement de valeur intégrale.try_divide
: fonction identique à l’opérateur de division/
, sauf qu’elle retourne le résultatNULL
au lieu de lever une exception sur une division de 0.
Mots clés SQL
Lorsque spark.sql.ansi.enabled
a la valeur true, Spark SQL utilise l’analyseur en mode ANSI.
Dans ce mode, Spark SQL possède deux types de mots clés :
- Mots clés réservés : ne peuvent pas être utilisés en tant qu’identificateurs pour une table, un affichage, une colonne, une fonction, un alias, etc.
- Mots clés non réservés : ont une signification spéciale uniquement dans des contextes particuliers, et peuvent être utilisés comme identificateurs dans d’autres contextes. Par exemple,
EXPLAIN SELECT ...
est une commande, mais EXPLAIN peut être utilisé comme identificateur dans d’autres emplacements.
Lorsque le mode ANSI est désactivé, Spark SQL possède deux types de mots clés :
- Mots clés non réservés : même définition que lorsque le mode ANSI est activé.
- Mots clés non réservés stricts : version stricte des mots clés non réservés, qui ne peut pas être utilisée en tant qu’alias de table.
Par défaut, spark.sql.ansi.enabled
a la valeur false.
Vous trouverez ci-dessous une liste de tous les mots clés dans Spark SQL.
Mot clé | Mode ANSI de Spark SQL | Mode par défaut de Spark SQL | SQL-2016 |
---|---|---|---|
ADD | non réservé | non réservé | non réservé |
AFTER | non réservé | non réservé | non réservé |
ALL | réservé | non réservé | réservé |
ALTER | non réservé | non réservé | réservé |
ALWAYS | non réservé | non réservé | non réservé |
ANALYSE | non réservé | non réservé | non réservé |
AND | réservé | non réservé | réservé |
ANTI | non réservé | non réservé strict | non réservé |
ANY | réservé | non réservé | réservé |
ARCHIVE | non réservé | non réservé | non réservé |
ARRAY | non réservé | non réservé | réservé |
AS | réservé | non réservé | réservé |
ASC | non réservé | non réservé | non réservé |
AT | non réservé | non réservé | réservé |
AUTHORIZATION | réservé | non réservé | réservé |
BETWEEN | non réservé | non réservé | réservé |
BOTH | réservé | non réservé | réservé |
BUCKET | non réservé | non réservé | non réservé |
BUCKETS | non réservé | non réservé | non réservé |
BY | non réservé | non réservé | réservé |
CACHE | non réservé | non réservé | non réservé |
CASCADE | non réservé | non réservé | non réservé |
CASE | réservé | non réservé | réservé |
CAST | réservé | non réservé | réservé |
MODIFIER | non réservé | non réservé | non réservé |
CHECK | réservé | non réservé | réservé |
CLEAR | non réservé | non réservé | non réservé |
CLUSTER | non réservé | non réservé | non réservé |
CLUSTERED | non réservé | non réservé | non réservé |
CODEGEN | non réservé | non réservé | non réservé |
COLLATE | réservé | non réservé | réservé |
COLLECTION | non réservé | non réservé | non réservé |
COLUMN | réservé | non réservé | réservé |
COLUMNS | non réservé | non réservé | non réservé |
COMMENTAIRE | non réservé | non réservé | non réservé |
COMMIT | non réservé | non réservé | réservé |
COMPACT | non réservé | non réservé | non réservé |
COMPACTIONS | non réservé | non réservé | non réservé |
COMPUTE | non réservé | non réservé | non réservé |
CONCATENATE | non réservé | non réservé | non réservé |
CONSTRAINT | réservé | non réservé | réservé |
COST | non réservé | non réservé | non réservé |
CREATE | réservé | non réservé | réservé |
CROSS | réservé | non réservé strict | réservé |
CUBE | non réservé | non réservé | réservé |
CURRENT | non réservé | non réservé | réservé |
CURRENT_DATE | réservé | non réservé | réservé |
CURRENT_TIME | réservé | non réservé | réservé |
CURRENT_TIMESTAMP | réservé | non réservé | réservé |
CURRENT_USER | réservé | non réservé | réservé |
DATA | non réservé | non réservé | non réservé |
DATABASE | non réservé | non réservé | non réservé |
DATABASES | non réservé | non réservé | non réservé |
DAY | non réservé | non réservé | non réservé |
DBPROPERTIES | non réservé | non réservé | non réservé |
DEFINED | non réservé | non réservé | non réservé |
Suppression | non réservé | non réservé | réservé |
DELIMITED | non réservé | non réservé | non réservé |
DESC | non réservé | non réservé | non réservé |
DESCRIBE | non réservé | non réservé | réservé |
DFS | non réservé | non réservé | non réservé |
DIRECTORIES | non réservé | non réservé | non réservé |
DIRECTORY | non réservé | non réservé | non réservé |
DISTINCT | réservé | non réservé | réservé |
DISTRIBUTE | non réservé | non réservé | non réservé |
DIV | non réservé | non réservé | pas un mot clé |
DROP | non réservé | non réservé | réservé |
ELSE | réservé | non réservé | réservé |
END | réservé | non réservé | réservé |
ESCAPE | réservé | non réservé | réservé |
ESCAPED | non réservé | non réservé | non réservé |
EXCEPT | réservé | non réservé strict | réservé |
EXCHANGE | non réservé | non réservé | non réservé |
EXISTS | non réservé | non réservé | réservé |
EXPLAIN | non réservé | non réservé | non réservé |
EXPORT | non réservé | non réservé | non réservé |
EXTENDED | non réservé | non réservé | non réservé |
EXTERNAL | non réservé | non réservé | réservé |
EXTRACT | non réservé | non réservé | réservé |
false | réservé | non réservé | réservé |
FETCH | réservé | non réservé | réservé |
FIELDS | non réservé | non réservé | non réservé |
FILTER | réservé | non réservé | réservé |
FILEFORMAT | non réservé | non réservé | non réservé |
FIRST | non réservé | non réservé | non réservé |
FN | non réservé | non réservé | non réservé |
FOLLOWING | non réservé | non réservé | non réservé |
FOR | réservé | non réservé | réservé |
FOREIGN | réservé | non réservé | réservé |
FORMAT | non réservé | non réservé | non réservé |
FORMATTED | non réservé | non réservé | non réservé |
FROM | réservé | non réservé | réservé |
FULL | réservé | non réservé strict | réservé |
FUNCTION | non réservé | non réservé | réservé |
FONCTIONS | non réservé | non réservé | non réservé |
GÉNÉRÉ | non réservé | non réservé | non réservé |
GLOBAL | non réservé | non réservé | réservé |
GRANT | réservé | non réservé | réservé |
GRANTS | non réservé | non réservé | non réservé |
GROUP | réservé | non réservé | réservé |
GROUPING | non réservé | non réservé | réservé |
HAVING | réservé | non réservé | réservé |
HOUR | non réservé | non réservé | non réservé |
IF | non réservé | non réservé | pas un mot clé |
IGNORE | non réservé | non réservé | non réservé |
IMPORT | non réservé | non réservé | non réservé |
IN | réservé | non réservé | réservé |
INDEX | non réservé | non réservé | non réservé |
INDEXES | non réservé | non réservé | non réservé |
INNER | réservé | non réservé strict | réservé |
INPATH | non réservé | non réservé | non réservé |
INPUTFORMAT | non réservé | non réservé | non réservé |
INSERT | non réservé | non réservé | réservé |
INTERSECT | réservé | non réservé strict | réservé |
INTERVAL | non réservé | non réservé | réservé |
INTO | réservé | non réservé | réservé |
IS | réservé | non réservé | réservé |
ÉLÉMENTS | non réservé | non réservé | non réservé |
JOIN | réservé | non réservé strict | réservé |
KEY | non réservé | non réservé | non réservé |
KEYS | non réservé | non réservé | non réservé |
LAST | non réservé | non réservé | non réservé |
LATERAL | réservé | non réservé strict | réservé |
LAZY | non réservé | non réservé | non réservé |
LEADING | réservé | non réservé | réservé |
LEFT | réservé | non réservé strict | réservé |
LIKE | non réservé | non réservé | réservé |
ILIKE | non réservé | non réservé | non réservé |
LIMIT | non réservé | non réservé | non réservé |
LINES | non réservé | non réservé | non réservé |
Liste | non réservé | non réservé | non réservé |
LOAD | non réservé | non réservé | non réservé |
LOCAL | non réservé | non réservé | réservé |
LOCATION | non réservé | non réservé | non réservé |
LOCK | non réservé | non réservé | non réservé |
LOCKS | non réservé | non réservé | non réservé |
LOGICAL | non réservé | non réservé | non réservé |
MACRO | non réservé | non réservé | non réservé |
MAP | non réservé | non réservé | non réservé |
MATCHED | non réservé | non réservé | non réservé |
MERGE | non réservé | non réservé | non réservé |
MINUTE | non réservé | non réservé | non réservé |
MINUS | non réservé | non réservé strict | non réservé |
MONTH | non réservé | non réservé | non réservé |
MSCK | non réservé | non réservé | non réservé |
ESPACE DE NOMS | non réservé | non réservé | non réservé |
ESPACES DE NOMS | non réservé | non réservé | non réservé |
NATURAL | réservé | non réservé strict | réservé |
Non | non réservé | non réservé | réservé |
NOT | réservé | non réservé | réservé |
NULL | réservé | non réservé | réservé |
NULLS | non réservé | non réservé | non réservé |
OF | non réservé | non réservé | réservé |
ACTIVÉ | réservé | non réservé strict | réservé |
ONLY | réservé | non réservé | réservé |
OPTION | non réservé | non réservé | non réservé |
OPTIONS | non réservé | non réservé | non réservé |
OR | réservé | non réservé | réservé |
ORDER | réservé | non réservé | réservé |
OUT | non réservé | non réservé | réservé |
OUTER | réservé | non réservé | réservé |
OUTPUTFORMAT | non réservé | non réservé | non réservé |
OVER | non réservé | non réservé | non réservé |
OVERLAPS | réservé | non réservé | réservé |
OVERLAY | non réservé | non réservé | non réservé |
OVERWRITE | non réservé | non réservé | non réservé |
PARTITION | non réservé | non réservé | réservé |
PARTITIONNÉ | non réservé | non réservé | non réservé |
PARTITIONS | non réservé | non réservé | non réservé |
PERCENT | non réservé | non réservé | non réservé |
PIVOT | non réservé | non réservé | non réservé |
PLACING | non réservé | non réservé | non réservé |
POSITION | non réservé | non réservé | réservé |
PRECEDING | non réservé | non réservé | non réservé |
PRIMARY | réservé | non réservé | réservé |
PRINCIPALS | non réservé | non réservé | non réservé |
PROPERTIES | non réservé | non réservé | non réservé |
PURGE | non réservé | non réservé | non réservé |
QUALIFY | réservé | non réservé | réservé |
QUERY | non réservé | non réservé | non réservé |
RANGE | non réservé | non réservé | réservé |
RECIPIENT | non réservé | non réservé | non réservé |
RECIPIENTS | non réservé | non réservé | non réservé |
RECORDREADER | non réservé | non réservé | non réservé |
RECORDWRITER | non réservé | non réservé | non réservé |
RECOVER | non réservé | non réservé | non réservé |
REDUCE | non réservé | non réservé | non réservé |
REFERENCES | réservé | non réservé | réservé |
REFRESH | non réservé | non réservé | non réservé |
REGEXP | non réservé | non réservé | pas un mot clé |
REMOVE | non réservé | non réservé | non réservé |
RENAME | non réservé | non réservé | non réservé |
RÉPARER | non réservé | non réservé | non réservé |
REPLACE | non réservé | non réservé | non réservé |
RESET | non réservé | non réservé | non réservé |
RESPECT | non réservé | non réservé | non réservé |
RESTRICT | non réservé | non réservé | non réservé |
REVOKE | non réservé | non réservé | réservé |
RIGHT | réservé | non réservé strict | réservé |
RLIKE | non réservé | non réservé | non réservé |
ROLE | non réservé | non réservé | non réservé |
ROLES | non réservé | non réservé | non réservé |
ROLLBACK | non réservé | non réservé | réservé |
ROLLUP | non réservé | non réservé | réservé |
ROW | non réservé | non réservé | réservé |
ROWS | non réservé | non réservé | réservé |
SCHEMA | non réservé | non réservé | non réservé |
SCHEMAS | non réservé | non réservé | pas un mot clé |
SECOND | non réservé | non réservé | non réservé |
SELECT | réservé | non réservé | réservé |
SEMI | non réservé | non réservé strict | non réservé |
SEPARATED | non réservé | non réservé | non réservé |
SERDE | non réservé | non réservé | non réservé |
SERDEPROPERTIES | non réservé | non réservé | non réservé |
SESSION_USER | réservé | non réservé | réservé |
SET | non réservé | non réservé | réservé |
SETS | non réservé | non réservé | non réservé |
PARTAGER | non réservé | non réservé | non réservé |
SHARES | non réservé | non réservé | non réservé |
SHOW | non réservé | non réservé | non réservé |
SKEWED | non réservé | non réservé | non réservé |
SOME | réservé | non réservé | réservé |
SORT | non réservé | non réservé | non réservé |
SORTED | non réservé | non réservé | non réservé |
START | non réservé | non réservé | réservé |
STATISTICS | non réservé | non réservé | non réservé |
STORED | non réservé | non réservé | non réservé |
STRATIFY | non réservé | non réservé | non réservé |
STRUCT | non réservé | non réservé | non réservé |
SUBSTR | non réservé | non réservé | non réservé |
SUBSTRING | non réservé | non réservé | non réservé |
SYNC | non réservé | non réservé | non réservé |
TABLE | réservé | non réservé | réservé |
TABLES | non réservé | non réservé | non réservé |
TABLESAMPLE | non réservé | non réservé | réservé |
TBLPROPERTIES | non réservé | non réservé | non réservé |
TEMP | non réservé | non réservé | pas un mot clé |
TEMPORARY | non réservé | non réservé | non réservé |
TERMINÉ | non réservé | non réservé | non réservé |
THEN | réservé | non réservé | réservé |
TEMPS | réservé | non réservé | réservé |
TO | réservé | non réservé | réservé |
TOUCH | non réservé | non réservé | non réservé |
TRAILING | réservé | non réservé | réservé |
TRANSACTION | non réservé | non réservé | non réservé |
TRANSACTIONS | non réservé | non réservé | non réservé |
TRANSFORM | non réservé | non réservé | non réservé |
TRIM | non réservé | non réservé | non réservé |
true | non réservé | non réservé | réservé |
TRUNCATE | non réservé | non réservé | réservé |
TRY_CAST | non réservé | non réservé | non réservé |
TYPE | non réservé | non réservé | non réservé |
UNARCHIVE | non réservé | non réservé | non réservé |
UNBOUNDED | non réservé | non réservé | non réservé |
UNCACHE | non réservé | non réservé | non réservé |
UNION | réservé | non réservé strict | réservé |
UNIQUE | réservé | non réservé | réservé |
UNKNOWN | réservé | non réservé | réservé |
UNLOCK | non réservé | non réservé | non réservé |
UNSET | non réservé | non réservé | non réservé |
UPDATE | non réservé | non réservé | réservé |
USE | non réservé | non réservé | non réservé |
Utilisateur | réservé | non réservé | réservé |
USING | réservé | non réservé strict | réservé |
VALUES | non réservé | non réservé | réservé |
VIEW | non réservé | non réservé | non réservé |
VIEWS | non réservé | non réservé | non réservé |
WHEN | réservé | non réservé | réservé |
WHERE | réservé | non réservé | réservé |
WINDOW | non réservé | non réservé | réservé |
WITH | réservé | non réservé | réservé |
YEAR | non réservé | non réservé | non réservé |
ZONE | non réservé | non réservé | non réservé |