Partilhar via


Conformidade com ANSI no Databricks Runtime

Aplica-se a: Marque Sim Databricks Runtime

Este artigo descreve a conformidade ANSI no Databricks Runtime. Para o modo ANSI no Databricks SQL, consulte ANSI_MODE.

O Spark SQL tem duas opções para dar suporte à conformidade com o padrão ANSI SQL: spark.sql.ansi.enabled e spark.sql.storeAssignmentPolicy.

Quando spark.sql.ansi.enabled é definido como true, o Spark SQL usa um dialeto compatível com ANSI em vez de ser compatível com Hive. Por exemplo, o Spark lançará uma exceção no tempo de execução em vez de retornar resultados nulos se as entradas para um operador/função SQL forem inválidas. Alguns recursos do dialeto ANSI podem não ser diretamente do padrão ANSI SQL, mas seus comportamentos se alinham com o estilo do ANSI SQL.

Além disso, o Spark SQL tem uma opção independente para controlar comportamentos de transmissão implícitos ao armazenar linhas em uma tabela. Os comportamentos de transmissão são definidos como regras de atribuição de armazenamento no padrão.

Quando spark.sql.storeAssignmentPolicy definido como ANSI, o Spark SQL está em conformidade com as regras de atribuição de armazenamento ANSI. Esta é uma configuração separada porque seu valor padrão é ANSI, enquanto a configuração spark.sql.ansi.enabled está desabilitada por padrão.

A tabela a seguir resume o comportamento:

Nome de Propriedade Predefinido Significado
spark.sql.ansi.enabled false Quando verdadeiro, o Spark tenta estar em conformidade com a especificação ANSI SQL:

* Lança uma exceção de tempo de execução se ocorrer um estouro em qualquer operação em um campo inteiro ou decimal.
* Proíbe o uso das palavras-chave reservadas do ANSI SQL como identificadores no analisador SQL.
spark.sql.storeAssignmentPolicy ANSI Ao armazenar um valor em uma coluna com um tipo de dados diferente, o Spark executa a conversão de tipo. Existem três políticas para o tipo de regras de coerção: ANSI, legacy, e strict.

* ANSI: O Spark executa a coerção de tipo de acordo com ANSI SQL. Na prática, o comportamento é basicamente o mesmo do PostgreSQL. Ele não permite certas conversões de tipo irracionais, como a conversão de string para int ou double para booleano.
* legacy: Spark permite o tipo de coerção, desde que seja um Cast válido, que é muito solto. Por exemplo, a conversão de string em int ou double em boolean é permitida. É também o único comportamento no Spark 2.x e é compatível com o Hive.
* strict: O Spark não permite qualquer possível perda de precisão ou truncamento de dados na coerção de tipo, por exemplo, a conversão de duplo para int ou decimal para duplo não é permitida.

As subseções a seguir apresentam alterações de comportamento em operações aritméticas, conversões de tipo e análise SQL quando o modo ANSI está habilitado. Para conversões de tipo no Spark SQL, existem três tipos deles e este artigo irá apresentá-los um a um: cast, atribuição de armazenamento e coerção de tipo.

Operações aritméticas

No Spark SQL, as operações aritméticas executadas em tipos numéricos (com exceção do decimal) não são verificadas quanto a estouros por padrão. Isso significa que, no caso de uma operação causar estouros, o resultado é o mesmo com a operação correspondente em um programa Java ou Scala (Por exemplo, se a soma de 2 inteiros for maior do que o valor máximo representável, o resultado é um número negativo). Por outro lado, o Spark SQL retorna null para estouros decimais. Quando spark.sql.ansi.enabled é definido como true e ocorre um estouro em operações aritméticas numéricas e intervalares, ele lança uma exceção aritmética no tempo de execução.

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

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

Cost

Quando spark.sql.ansi.enabled definido como true, a conversão explícita por CAST sintaxe lança uma exceção de tempo de execução para padrões de conversão ilegais definidos no padrão, como transmissões de uma cadeia de caracteres para um inteiro.

A CAST cláusula do modo Spark ANSI segue as regras de sintaxe da seção 6.13 "cast specification" na ISO/IEC 9075-2:2011 Tecnologia da informação — Linguagens de banco de dados - SQL — Parte 2: Foundation (SQL/Foundation), exceto que permite especialmente as seguintes conversões de tipo diretas que não são permitidas de acordo com o padrão ANSI:

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

As combinações válidas de tipo de dados de origem e destino em uma CAST expressão são dadas pela tabela a seguir. "Y" indica que a combinação é sintaticamente válida sem restrições e "N" indica que a combinação não é válida.

SourceTarget Numérico String Date Carimbo de Data/Hora Intervalo Boolean Binário Matriz Mapa Estrutura
Numérico 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
Carimbo de Data/Hora 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
Binário Y N N N N N Y N N N
Matriz N N N N N N N Y N N
Mapa N N N N N N N N Y N
Estrutura 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

Atribuição de loja

O padrão da configuração spark.sql.storeAssignmentPolicy é .ANSI Com essa configuração, quando os tipos de dados de valores de origem não correspondem aos tipos de coluna de destino, o Spark SQL adiciona automaticamente cláusulas ANSI CAST à instrução INSERT. Durante a inserção da tabela sob essa política, o Spark verifica e rejeita transmissões inválidas, lançando uma exceção para garantir a qualidade dos dados. Isso significa que, se uma tentativa de inserção falhar devido a uma incompatibilidade de tipo, isso não resultará em nenhum dado sendo parcialmente gravado na tabela.

Exemplos:

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

Estes exemplos mostram o Spark SQL impedindo que dados incompatíveis sejam inseridos, mantendo assim a integridade dos dados.

Quando o é definido como LEGACY, o spark.sql.storeAssignmentPolicy Spark SQL reverte para o comportamento predominante até o Spark 2.x. Neste modo, em vez de usar ANSI CAST, ele aplica operações CAST herdadas. Sob essa política, conversões inválidas durante inserções de tabela resultam em valores NULL ou valores incorretos sendo inseridos, em vez de lançar uma exceção. Exemplos:

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

Tipo de coerção

Promoção de tipo e precedência

Quando spark.sql.ansi.enabled definido como true, o Spark SQL usa várias regras que regem como os conflitos entre tipos de dados são resolvidos. No centro dessa resolução de conflitos está a Lista de Precedência de Tipo, que define se os valores de um determinado tipo de dados podem ser promovidos para outro tipo de dados implicitamente.

Tipo de dados lista de precedências (da mais estreita para a mais larga)
Byte Byte - Curto -> Int -> Longo -> Decimal -> Float* -> Duplo>
Curto Curto -> Int -> Longo -> Decimal-> Float* -> Duplo
Int Int -> Longo -> Decimal -> Float* -> Duplo
Longo Longo -> Decimal -> Float* -> Duplo
Decimal Decimal -> Float* -> Duplo
Float Flutuador -> Duplo
Duplo Duplo
Date Data -> Carimbo de data/hora
Carimbo de Data/Hora Carimbo de Data/Hora
String String
Binário Binário
Boolean Boolean
Intervalo Intervalo
Mapa Mapa**
Matriz Matriz**
Estrutura Estrutura**
  • Para o tipo menos comum, o flutuador de resolução é ignorado para evitar perda de precisão.

** Para um tipo complexo, a regra de precedência aplica-se recursivamente aos seus elementos componentes.

Aplicam-se regras especiais para o tipo String e NULL não tipado. Um NULL pode ser promovido para qualquer outro tipo, enquanto um String pode ser promovido para qualquer tipo de dados simples.

Esta é uma representação gráfica da lista de precedências como uma árvore direcionada: Representação gráfica das regras de precedência

Resolução de tipo menos comum

O tipo menos comum de um conjunto de tipos é o tipo mais estreito acessível a partir da lista de precedência por todos os elementos do conjunto de tipos.

A resolução de tipo menos comum é usada para:

  • Decida se uma função que espera um parâmetro de um tipo pode ser invocada usando um argumento de um tipo mais restrito.
  • Derive o tipo de argumento para funções que esperam um tipo de argumento compartilhado para vários parâmetros, como coalesce, menor ou maior.
  • Derive os tipos de operando para operadores, como operações aritméticas ou comparações.
  • Derive o tipo de resultado para expressões como a expressão de maiúsculas e minúsculas.
  • Derive os tipos de elemento, chave ou valor para construtores de matriz e mapa.

Regras especiais são aplicadas se o tipo menos comum resolver para FLOAT. Com valores de tipo float, se qualquer um dos tipos for INT, BIGINT ou DECIMAL, o tipo menos comum é empurrado para DOUBLE para evitar a perda potencial 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.

Funções SQL

O comportamento de algumas funções SQL pode ser diferente no modo ANSI (spark.sql.ansi.enabled=true).

  • size: Esta função retorna null para entrada nula no modo ANSI.
  • element_at:
    • Esta função lança ArrayIndexOutOfBoundsException se estiver usando índices inválidos.
    • Esta função lança se a NoSuchElementException chave não existir no mapa.
  • elt: Esta função lança ArrayIndexOutOfBoundsException se estiver usando índices inválidos.
  • make_date: Esta função falha com uma exceção se a data do resultado for inválida.
  • make_timestamp: Esta função falhará com uma exceção se o carimbo de data/hora do resultado for inválido.
  • make_interval: Esta função falha com uma exceção se o intervalo de resultados for inválido.
  • next_day: Esta função é lançada se a IllegalArgumentException entrada não for um dia válido da semana.
  • parse_url: Esta função é lançada se uma string de IllegalArgumentException entrada não for uma url válida.
  • to_date: Esta função falhará com uma exceção se a cadeia de caracteres de entrada não puder ser analisada ou se a cadeia de caracteres de padrão for inválida.
  • to_timestamp: Esta função falhará com uma exceção se a cadeia de caracteres de entrada não puder ser analisada ou se a cadeia de caracteres de padrão for inválida.
  • to_unix_timestamp: Esta função falhará com uma exceção se a cadeia de caracteres de entrada não puder ser analisada ou se a cadeia de caracteres de padrão for inválida.
  • unix_timestamp: Esta função falhará com uma exceção se a cadeia de caracteres de entrada não puder ser analisada ou se a cadeia de caracteres de padrão for inválida.

Operadores SQL

O comportamento de alguns operadores SQL pode ser diferente no modo ANSI (spark.sql.ansi.enabled=true).

  • array_col[index]: Este operador lança ArrayIndexOutOfBoundsException se estiver usando índices inválidos.
  • map_col[key]: Este operador lança se a NoSuchElementException chave não existir no mapa.
  • CAST(string_col AS TIMESTAMP): Este operador falha com uma exceção se a cadeia de caracteres de entrada não puder ser analisada.
  • CAST(string_col AS DATE): Este operador falha com uma exceção se a cadeia de caracteres de entrada não puder ser analisada.

Funções úteis para o modo ANSI

Quando o modo ANSI está ativado, ele lança exceções para operações inválidas. Você pode usar as seguintes funções SQL para suprimir essas exceções.

  • try_cast: idêntico ao CAST, exceto que ele retorna NULL resultado em vez de lançar uma exceção no erro de tempo de execução.
  • try_add: idêntico ao operador +add , exceto que ele retorna NULL resultado em vez de lançar uma exceção no estouro de valor integral.
  • try_divide: idêntico ao operador /de divisão, exceto que ele retorna NULL resultado em vez de lançar uma exceção na divisão 0.

Palavras-chave SQL

Quando spark.sql.ansi.enabled for true, o Spark SQL usará o analisador de modo ANSI. Neste modo, o Spark SQL tem dois tipos de palavras-chave:

  • Palavras-chave reservadas: palavras-chave que são reservadas e não podem ser usadas como identificadores para tabela, visualização, coluna, função, alias, etc.
  • Palavras-chave não reservadas: Palavras-chave que têm um significado especial apenas em contextos particulares e podem ser usadas como identificadores em outros contextos. Por exemplo, EXPLAIN SELECT ... é um comando, mas EXPLAIN pode ser usado como identificadores em outros lugares.

Quando o modo ANSI está desativado, o Spark SQL tem dois tipos de palavras-chave:

  • Palavras-chave não reservadas: mesma definição que aquela em que o modo ANSI foi ativado.
  • Palavras-chave estritas não reservadas: uma versão estrita de palavras-chave não reservadas, que não podem ser usadas como alias de tabela.

Por padrão spark.sql.ansi.enabled , é false.

Abaixo está uma lista de todas as palavras-chave no Spark SQL.

Palavra-chave Modo ANSI do Spark SQL Modo padrão do Spark SQL SQL-2016
ADICIONAR não reservado não reservado não reservado
DEPOIS não reservado não reservado não reservado
TODOS reservado não reservado reservado
ALTERAR não reservado não reservado reservado
SEMPRE não reservado não reservado não reservado
ANALISAR não reservado não reservado não reservado
AND reservado não reservado reservado
ANTI não reservado estrito-não reservado não reservado
QUALQUER reservado não reservado reservado
ARQUIVO não reservado não reservado não reservado
MATRIZ não reservado não reservado reservado
AS reservado não reservado reservado
A não reservado não reservado não reservado
AT não reservado não reservado reservado
AUTORIZAÇÃO reservado não reservado reservado
BETWEEN não reservado não reservado reservado
AMBOS reservado não reservado reservado
BALDE não reservado não reservado não reservado
BALDES não reservado não reservado não reservado
BY não reservado não reservado reservado
CACHE não reservado não reservado não reservado
CASCATA não reservado não reservado não reservado
CASE reservado não reservado reservado
CAST reservado não reservado reservado
MUDANÇA não reservado não reservado não reservado
VERIFICAR reservado não reservado reservado
LIMPAR não reservado não reservado não reservado
AGLOMERAÇÃO não reservado não reservado não reservado
AGRUPADOS não reservado não reservado não reservado
CODEGEN não reservado não reservado não reservado
COLISÃO reservado não reservado reservado
COLEÇÃO não reservado não reservado não reservado
COLUNA reservado não reservado reservado
COLUNAS não reservado não reservado não reservado
COMENTAR não reservado não reservado não reservado
COMPROMETER-SE não reservado não reservado reservado
COMPACTO não reservado não reservado não reservado
COMPAÇÕES não reservado não reservado não reservado
COMPUTAÇÃO não reservado não reservado não reservado
CONCATENAR não reservado não reservado não reservado
RESTRIÇÃO reservado não reservado reservado
CUSTO não reservado não reservado não reservado
CREATE reservado não reservado reservado
CRUZAMENTO reservado estrito-não reservado reservado
CUBO não reservado não reservado reservado
ATUAL não reservado não reservado reservado
CURRENT_DATE reservado não reservado reservado
CURRENT_TIME reservado não reservado reservado
CURRENT_TIMESTAMP reservado não reservado reservado
CURRENT_USER reservado não reservado reservado
DADOS não reservado não reservado não reservado
BASE DE DADOS não reservado não reservado não reservado
BASES DE DADOS não reservado não reservado não reservado
DAY não reservado não reservado não reservado
DBPROPERTIES não reservado não reservado não reservado
DEFINIDO não reservado não reservado não reservado
DELETE não reservado não reservado reservado
DELIMITADO não reservado não reservado não reservado
DESC não reservado não reservado não reservado
DESCREVER não reservado não reservado reservado
DFS não reservado não reservado não reservado
DIRETÓRIOS não reservado não reservado não reservado
DIRETÓRIO não reservado não reservado não reservado
DISTINTOS reservado não reservado reservado
DISTRIBUIR não reservado não reservado não reservado
DIV não reservado não reservado não é uma palavra-chave
DROP não reservado não reservado reservado
OUTROS reservado não reservado reservado
FIM reservado não reservado reservado
FUGA reservado não reservado reservado
ESCAPOU não reservado não reservado não reservado
EXCETO reservado estrito-não reservado reservado
CÂMBIO não reservado não reservado não reservado
EXISTE não reservado não reservado reservado
EXPLAIN não reservado não reservado não reservado
EXPORTAÇÃO não reservado não reservado não reservado
EXTENDED não reservado não reservado não reservado
EXTERNA não reservado não reservado reservado
EXTRATO não reservado não reservado reservado
FALSE reservado não reservado reservado
FETCH reservado não reservado reservado
CAMPOS não reservado não reservado não reservado
FILTRAR reservado não reservado reservado
FORMATO DE FICHEIRO não reservado não reservado não reservado
FIRST não reservado não reservado não reservado
FN não reservado não reservado não reservado
SEGUINTES não reservado não reservado não reservado
PARA reservado não reservado reservado
ESTRANGEIROS reservado não reservado reservado
FORMATO não reservado não reservado não reservado
FORMATADO não reservado não reservado não reservado
FROM reservado não reservado reservado
COMPLETO reservado estrito-não reservado reservado
FUNÇÃO não reservado não reservado reservado
FUNCTIONS não reservado não reservado não reservado
GERADO não reservado não reservado não reservado
GLOBAL não reservado não reservado reservado
GRANT reservado não reservado reservado
SUBVENÇÕES não reservado não reservado não reservado
GRUPO reservado não reservado reservado
AGRUPAMENTO não reservado não reservado reservado
HAVING reservado não reservado reservado
HORA não reservado não reservado não reservado
IF não reservado não reservado não é uma palavra-chave
IGNORE não reservado não reservado não reservado
IMPORTAÇÃO não reservado não reservado não reservado
IN reservado não reservado reservado
ÍNDICE não reservado não reservado não reservado
ÍNDICES não reservado não reservado não reservado
INTERIOR reservado estrito-não reservado reservado
INPATH não reservado não reservado não reservado
INPUTFORMAT não reservado não reservado não reservado
INSERT não reservado não reservado reservado
INTERSECT reservado estrito-não reservado reservado
INTERVALO não reservado não reservado reservado
INTO reservado não reservado reservado
IS reservado não reservado reservado
PONTOS não reservado não reservado não reservado
JOIN reservado estrito-não reservado reservado
CHAVE não reservado não reservado não reservado
CHAVES não reservado não reservado não reservado
LAST não reservado não reservado não reservado
LATERAIS reservado estrito-não reservado reservado
Preguiçoso não reservado não reservado não reservado
LIDERANDO reservado não reservado reservado
LEFT reservado estrito-não reservado reservado
GOSTAR não reservado não reservado reservado
ILIKE não reservado não reservado não reservado
LIMITE não reservado não reservado não reservado
LINHAS não reservado não reservado não reservado
LISTA não reservado não reservado não reservado
CARREGAR não reservado não reservado não reservado
LOCAIS não reservado não reservado reservado
LOCALIZAÇÃO não reservado não reservado não reservado
BLOQUEIO não reservado não reservado não reservado
FECHADURAS não reservado não reservado não reservado
LÓGICO não reservado não reservado não reservado
MACRO não reservado não reservado não reservado
MAPA não reservado não reservado não reservado
CORRESPONDIDO não reservado não reservado não reservado
MESCLAR não reservado não reservado não reservado
MINUTO não reservado não reservado não reservado
MENOS não reservado estrito-não reservado não reservado
MONTH não reservado não reservado não reservado
MSCK não reservado não reservado não reservado
ESPAÇO PARA NOMES não reservado não reservado não reservado
ESPAÇOS PARA NOMES não reservado não reservado não reservado
NATURAL reservado estrito-não reservado reservado
Não não reservado não reservado reservado
NOT reservado não reservado reservado
NULL reservado não reservado reservado
NULOS não reservado não reservado não reservado
OF não reservado não reservado reservado
ON reservado estrito-não reservado reservado
APENAS reservado não reservado reservado
OPTION não reservado não reservado não reservado
OPTIONS não reservado não reservado não reservado
OU reservado não reservado reservado
ENCOMENDA reservado não reservado reservado
SAÍDAS não reservado não reservado reservado
EXTERIOR reservado não reservado reservado
OUTPUTFORMAT não reservado não reservado não reservado
MAIS DE não reservado não reservado não reservado
SOBREPOSIÇÕES reservado não reservado reservado
SOBREPOSIÇÃO não reservado não reservado não reservado
SUBSTITUIR não reservado não reservado não reservado
PARTIÇÃO não reservado não reservado reservado
PARTICIONADO não reservado não reservado não reservado
PARTIÇÕES não reservado não reservado não reservado
PERCENTAGEM não reservado não reservado não reservado
PIVÔ não reservado não reservado não reservado
COLOCAÇÃO não reservado não reservado não reservado
POSIÇÃO não reservado não reservado reservado
PRECEDENTES não reservado não reservado não reservado
PRIMÁRIO reservado não reservado reservado
PRINCÍPIOS não reservado não reservado não reservado
PROPRIEDADES não reservado não reservado não reservado
PURGA não reservado não reservado não reservado
QUALIFICAR reservado não reservado reservado
CONSULTA não reservado não reservado não reservado
GAMA não reservado não reservado reservado
DESTINATÁRIO não reservado não reservado não reservado
DESTINATÁRIOS não reservado não reservado não reservado
LEITOR DE REGISTOS não reservado não reservado não reservado
RECORDISTA não reservado não reservado não reservado
RECUPERAR não reservado não reservado não reservado
REDUZIR não reservado não reservado não reservado
REFERÊNCIAS reservado não reservado reservado
REFRESH não reservado não reservado não reservado
REGEXP não reservado não reservado não é uma palavra-chave
REMOVER não reservado não reservado não reservado
RENAME não reservado não reservado não reservado
REPARAÇÃO não reservado não reservado não reservado
REPLACE não reservado não reservado não reservado
RESET não reservado não reservado não reservado
RESPEITO não reservado não reservado não reservado
RESTRINGIR não reservado não reservado não reservado
REVOKE não reservado não reservado reservado
RIGHT reservado estrito-não reservado reservado
SEMELHANTE não reservado não reservado não reservado
FUNÇÃO não reservado não reservado não reservado
FUNÇÕES não reservado não reservado não reservado
REVERSÃO não reservado não reservado reservado
ROLLUP não reservado não reservado reservado
LINHA não reservado não reservado reservado
LINHAS não reservado não reservado reservado
ESQUEMA não reservado não reservado não reservado
ESQUEMAS não reservado não reservado não é uma palavra-chave
SEGUNDO não reservado não reservado não reservado
SELECIONAR reservado não reservado reservado
SEMI não reservado estrito-não reservado não reservado
SEPARADOS não reservado não reservado não reservado
SERDE não reservado não reservado não reservado
SERDEPROPRIEDADES não reservado não reservado não reservado
SESSION_USER reservado não reservado reservado
SET não reservado não reservado reservado
CONJUNTOS não reservado não reservado não reservado
PARTILHAR não reservado não reservado não reservado
AÇÕES não reservado não reservado não reservado
PROGRAMA não reservado não reservado não reservado
ENVIESADO não reservado não reservado não reservado
ALGUNS reservado não reservado reservado
ORDENAR não reservado não reservado não reservado
ORDENADO não reservado não reservado não reservado
INICIAR não reservado não reservado reservado
ESTATÍSTICA não reservado não reservado não reservado
CONSERVADO não reservado não reservado não reservado
ESTRATIFICAR não reservado não reservado não reservado
ESTRUTURA não reservado não reservado não reservado
SUBSTR não reservado não reservado não reservado
SUBSTRING não reservado não reservado não reservado
SINCRONIZAÇÃO não reservado não reservado não reservado
TABELA reservado não reservado reservado
TABELAS não reservado não reservado não reservado
EXEMPLO TABLESAMPLE não reservado não reservado reservado
TBLPROPERTIES não reservado não reservado não reservado
TEMP não reservado não reservado não é uma palavra-chave
TEMPORÁRIO não reservado não reservado não reservado
RESCINDIDO não reservado não reservado não reservado
EM SEGUIDA, reservado não reservado reservado
TIME reservado não reservado reservado
TO reservado não reservado reservado
TOCAR não reservado não reservado não reservado
ATRÁS reservado não reservado reservado
TRANSAÇÃO não reservado não reservado não reservado
TRANSAÇÕES não reservado não reservado não reservado
TRANSFORMAR não reservado não reservado não reservado
TRIM não reservado não reservado não reservado
TRUE não reservado não reservado reservado
TRUNCATE não reservado não reservado reservado
TRY_CAST não reservado não reservado não reservado
TIPO não reservado não reservado não reservado
NÃO ARQUIVAR não reservado não reservado não reservado
ILIMITADO não reservado não reservado não reservado
UNCACHE não reservado não reservado não reservado
UNION reservado estrito-não reservado reservado
ÚNICO reservado não reservado reservado
DESCONHECIDO reservado não reservado reservado
DESBLOQUEAR não reservado não reservado não reservado
NÃO DEFINIDO não reservado não reservado não reservado
ATUALIZAR não reservado não reservado reservado
USE não reservado não reservado não reservado
UTILIZADOR reservado não reservado reservado
UTILIZAÇÃO reservado estrito-não reservado reservado
VALORES não reservado não reservado reservado
VER não reservado não reservado não reservado
MODOS DE EXIBIÇÃO não reservado não reservado não reservado
Quando… reservado não reservado reservado
WHERE reservado não reservado reservado
JANELA não reservado não reservado reservado
WITH reservado não reservado reservado
YEAR não reservado não reservado não reservado
ZONA não reservado não reservado não reservado