Cumplimiento de ANSI en Databricks Runtime

Se aplica a:check marked yes Databricks Runtime

En este artículo se describe el cumplimiento de ANSI en Databricks Runtime. Para el modo ANSI en Databricks SQL, consulte ANSI_MODE.

Spark SQL tiene dos opciones para admitir el cumplimiento con el estándar ANSI SQL: spark.sql.ansi.enabled y spark.sql.storeAssignmentPolicy.

Cuando spark.sql.ansi.enabled se establece en true, Spark SQL usa un dialecto compatible con ANSI en lugar de compatible con Hive. Por ejemplo, Spark producirá una excepción en tiempo de ejecución en lugar de devolver resultados null si las entradas a una función u operador SQL no son válidas. Es posible que algunas características del dialecto ANSI no sean del estándar ANSI SQL directamente, pero sus comportamientos se alinearán con el estilo de ANSI SQL.

Además, Spark SQL tiene una opción independiente para controlar los comportamientos de conversión implícita al almacenar filas en una tabla. Los comportamientos de conversión se definen como reglas de asignación de almacén en el estándar.

Cuando spark.sql.storeAssignmentPolicy se establece en ANSI, Spark SQL cumple las reglas de asignación de almacén ANSI. Se trata de una configuración independiente porque su valor predeterminado es ANSI, mientras que la configuración spark.sql.ansi.enabled está deshabilitada de forma predeterminada.

En la tabla siguiente se resume este comportamiento:

Nombre de propiedad Valor predeterminado Significado
spark.sql.ansi.enabled false Cuando el valor sea true, Spark intentará cumplir con la especificación ANSI SQL:

* Spark iniciará una excepción en tiempo de ejecución si se produce un desbordamiento en cualquier operación del campo integral o decimal.
* Spark prohibirá el uso de las palabras clave reservadas de ANSI SQL como identificadores en el analizador de SQL.
spark.sql.storeAssignmentPolicy ANSI Al almacenar un valor en una columna con un tipo de datos diferente, Spark realizará la conversión de tipo. Actualmente, se admiten 3 directivas para el tipo de reglas de coerción: ANSI, legacy y strict.

* ANSI: con la directiva ANSI, Spark realiza la coerción de tipo según ANSI SQL. En la práctica, el comportamiento es en su mayoría el mismo que PostgreSQL. No permite ciertas conversiones de tipos irrazonables, como convertir "string" a "int" o "double" a "boolean".
* legacy: con la directiva heredada, Spark permite la coerción de tipo siempre que sea un "Cast" válido, que es muy flexible. Por ejemplo, se permite convertir "string" a "int" o "double" a "boolean". También es el único comportamiento en Spark 2.x y es compatible con Hive.
* strict: Spark no permite ninguna posible pérdida de precisión o truncamiento de datos en la coerción de tipo, por ejemplo, no se permite convertir "double" a "int" o "decimal" a "double".

Las subsecciones siguientes presentan cambios de comportamiento en operaciones aritméticas, conversiones de tipo y análisis SQL cuando el modo ANSI está habilitado. Existen tres conversiones de tipo en Spark SQL, que se presentan en este artículo una por una: conversión, asignación de almacén y coerción de tipo.

Operaciones aritméticas

En Spark SQL, las operaciones aritméticas realizadas en tipos numéricos (a excepción del decimal) no se comprueban de forma predeterminada para detectar desbordamientos. Esto significa que, en caso de que una operación cause desbordamientos, el resultado es el mismo con la operación correspondiente en un programa de Java o Scala (por ejemplo, si la suma de 2 enteros es mayor que el valor máximo que se puede representar, el resultado es un número negativo). Por otro lado, Spark SQL devuelve null para los desbordamientos decimales. Cuando spark.sql.ansi.enabled se establece en true y se produce un desbordamiento en operaciones aritméticas numéricas y de intervalo, produce una excepción aritmética en tiempo de ejecución.

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

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

Conversión

Cuando spark.sql.ansi.enabled se establece en true, la conversión explícita de la sintaxis CAST produce una excepción en tiempo de ejecución para los patrones de conversión no válidos definidos en el estándar, como las conversiones de una cadena a un entero.

La cláusula CAST del modo ANSI de Spark sigue las reglas de sintaxis de la sección 6.13 "Especificación de conversión" de ISO/IEC 9075-2:2011 Tecnología de la información — Lenguajes de bases de datos - SQL — Parte 2: Foundation (SQL/Foundation), con la salvedad de que permite especialmente las siguientes conversiones de tipos sencillas que no se permiten según el estándar ANSI:

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

La tabla siguiente ofrece las combinaciones válidas del tipo de datos de origen y de destino en una expresión CAST. "Y" indica que la combinación es sintácticamente válida sin restricciones y "N" indica que la combinación no es válida.

SourceTarget Numeric String Date Timestamp Intervalo Boolean Binary Array Map Estructura
Numeric Y Y N N N Y N N N N
String Y Y Y Y Y Y Y N N N
Date N Y Y Y N N N N N N
Timestamp N Y Y Y N N N N N N
Intervalo N Y N N Y N N N N N
Boolean Y Y N N N Y N N N N
Binary Y 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
Estructura N N N N N N N N N Y
-- 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

Asignación de almacén

El valor spark.sql.storeAssignmentPolicy predeterminado es ANSI. Con esta configuración, cuando los tipos de datos de valores de origen no coinciden con los tipos de columna de destino, Spark SQL agrega automáticamente cláusulas ANSI CAST a la instrucción INSERT. Durante la inserción de tablas en esta directiva, Spark comprueba y rechaza conversiones no válidas, iniciando una excepción para garantizar la calidad de los datos. Esto significa que si se produce un error en un intento de inserción debido a un error de coincidencia de tipos, no se producirá que los datos se escriban parcialmente en la tabla.

Ejemplos:

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

En estos ejemplos se muestra Spark SQL que impide que se inserten datos incompatibles, lo que mantiene la integridad de los datos.

Cuando se establece el spark.sql.storeAssignmentPolicy en LEGACY, Spark SQL revierte al comportamiento frecuente hasta Spark 2.x. En este modo, en lugar de usar ANSI CAST, aplica operaciones CAST heredadas. En esta directiva, las conversiones no válidas durante las inserciones de tabla producen valores NULL o valores incorrectos que se insertan, en lugar de producir una excepción. Ejemplos:

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

Conversión de tipos

Promoción y prioridad de tipos

Cuando spark.sql.ansi.enabled se establece en true, Spark SQL usa varias reglas que rigen cómo se resuelven los conflictos entre tipos de datos. En la base de esta resolución de conflictos se encuentra la lista de prioridad de tipos que define si los valores de un tipo de datos determinado se pueden promover a otro tipo de datos implícitamente.

Tipo de datos Lista de prioridad (de más estrecha a más amplia)
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 Date -> Timestamp
Timestamp Timestamp
String String
Binary Binary
Boolean Boolean
Intervalo Intervalo
Map Map**
Array Array**
Estructura Struct**
  • Para una resolución de tipo menos común, float se omite para evitar la pérdida de precisión.

** Para un tipo complejo, la regla de prioridad se aplica de forma recursiva a sus elementos de componente.

Se aplican reglas especiales para el tipo String y los valores NULL sin tipo. Un valor NULL se puede promover a cualquier otro tipo, mientras que un objeto String se puede promover a cualquier tipo de datos simple.

Esta es una representación gráfica de la lista de prioridad como un árbol dirigido: Graphical representation of precedence rules

Resolución de los tipos menos comunes

El tipo menos común de un conjunto de tipos es el tipo más estrecho accesible desde la lista de prioridad por todos los elementos del conjunto de tipos.

La resolución de tipos menos común se usa para:

  • Decidir si se puede invocar una función que espera un parámetro de un tipo mediante un argumento de un tipo más estrecho.
  • Derivar el tipo de argumento para funciones que esperan un tipo de argumento compartido para varios parámetros, como coalesce, least o greatest.
  • Derivar los tipos de operando para operadores como operaciones aritméticas o comparaciones.
  • Derivar el tipo de resultado para expresiones como case.
  • Derivar los tipos de elemento, clave o valor para constructores de matriz y mapa.

Se aplican reglas especiales si el tipo menos común se resuelve en FLOAT. Con los valores de tipo float, si alguno de los tipos es INT, BIGINT o DECIMAL, el tipo menos común se inserta en DOUBLE para evitar la posible pérdida de dígitos.

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

Funciones de SQL

El comportamiento de algunas funciones SQL puede ser diferente en el modo ANSI (spark.sql.ansi.enabled=true).

  • size: esta función devuelve NULL para la entrada NULL en el modo ANSI.
  • element_at:
    • Esta función produce ArrayIndexOutOfBoundsException si se usan índices no válidos.
    • Esta función produce NoSuchElementException si la clave no existe en el mapa.
  • elt: esta función produce ArrayIndexOutOfBoundsException si se usan índices no válidos.
  • make_date: se produce un error en esta función con una excepción si la fecha del resultado no es válida.
  • make_timestamp: se produce un error en esta función con una excepción si la marca de tiempo del resultado no es válida.
  • make_interval: se produce un error en esta función con una excepción si el intervalo del resultado no es válido.
  • next_day: esta función produce IllegalArgumentException si la entrada no es un día de la semana válido.
  • parse_url: esta función produce IllegalArgumentException si una cadena de entrada no es una dirección URL válida.
  • to_date: esta función produce un error con una excepción si la cadena de entrada no se puede analizar o la cadena de patrón no es válida.
  • to_timestamp: esta función produce un error con una excepción si la cadena de entrada no se puede analizar o la cadena de patrón no es válida.
  • to_unix_timestamp: esta función produce un error con una excepción si la cadena de entrada no se puede analizar o la cadena de patrón no es válida.
  • unix_timestamp: esta función produce un error con una excepción si la cadena de entrada no se puede analizar o la cadena de patrón no es válida.

Operadores SQL

El comportamiento de algunos operadores SQL puede ser diferente en el modo ANSI (spark.sql.ansi.enabled=true).

  • array_col[index]: este operador produce ArrayIndexOutOfBoundsException si se usan índices no válidos.
  • map_col[key]: este operador produce NoSuchElementException si la clave no existe en el mapa.
  • CAST(string_col AS TIMESTAMP): se produce un error en este operador con una excepción si la cadena de entrada no se puede analizar.
  • CAST(string_col AS DATE): se produce un error en este operador con una excepción si la cadena de entrada no se puede analizar.

Funciones útiles para el modo ANSI

Cuando el modo ANSI está activado, produce excepciones para operaciones no válidas. Puede usar las siguientes funciones SQL para suprimir tales excepciones.

  • try_cast: idéntica a CAST, salvo que devuelve el resultado NULL en lugar de producir una excepción en el error en tiempo de ejecución.
  • try_add: idéntica al operador de suma +, salvo que devuelve el resultado NULL en lugar de producir una excepción en el desbordamiento de valores enteros.
  • try_divide: idéntica al operador de división /, salvo que devuelve el resultado NULL en lugar de producir una excepción al dividir 0.

Palabras clave de SQL

Cuando spark.sql.ansi.enabled es true, Spark SQL usará el analizador del modo ANSI. En este modo, Spark SQL tiene dos tipos de palabras clave:

  • Palabras clave reservadas: palabras clave reservadas que no se pueden usar como identificadores de tabla, vista, columna, función, alias, etc.
  • Palabras clave no reservadas: palabras clave que tienen un significado especial solo en contextos concretos y se pueden usar como identificadores en otros contextos. Por ejemplo, EXPLAIN SELECT ... es un comando, pero EXPLAIN se puede usar como identificador en otros lugares.

Cuando el modo ANSI está deshabilitado, Spark SQL tiene dos tipos de palabras clave:

  • Palabras clave no reservadas: la misma definición que con el modo ANSI habilitado.
  • Palabras clave no reservadas estrictas: una versión estricta de palabras clave no reservadas, que no se puede usar como alias de tabla.

De forma predeterminada, spark.sql.ansi.enabled es false.

A continuación se muestra una lista de todas las palabras clave de Spark SQL.

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