Partilhar via


Conformidade com ANSI no Databricks Runtime

Aplica-se a:seleção marcada sim Databricks SQL seleção marcada 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.

  • spark.sql.ansi.enabled (Modo ANSI)

    • Utiliza um dialeto SQL compatível com ANSI em vez do dialeto compatível com Hive.
    • Gera exceções de runtime para entradas inválidas em vez de devolver null.
    • Ativado por defeito no Apache Spark 4.0 e Databricks Runtime 17.0 e superiores.
  • spark.sql.storeAssignmentPolicy (política de atribuição de loja)

    • Controla o casting implícito durante as inserções de tabelas.
    • Por defeito, é ANSI e é independente de spark.sql.ansi.enabled.

A tabela a seguir resume o comportamento:

Nome de Propriedade Predefinido Significado
spark.sql.ansi.enabled true Quando é verdade, o Spark tenta conformar-se à especificação ANSI SQL:
  • O Spark SQL vai gerar exceções em tempo de execução para operações inválidas, incluindo erros de overflow inteiro, erros de análise de strings, etc.
  • O Spark irá utilizar diferentes regras de coerção de tipos para resolver conflitos entre tipos de dados. As regras baseiam-se consistentemente na precedência dos tipos de dados.
spark.sql.storeAssignmentPolicy ANSI (Instituto Nacional Americano de Normalização) 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 o 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 double para int ou decimal para double 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 excessos de decimais. Quando spark.sql.ansi.enabled é definido como true e ocorre um overflow em operações aritméticas numéricas e de intervalo, lança-se uma exceção aritmética em tempo de execução.

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

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

Elenco

Quando spark.sql.ansi.enabled é definido como true, a conversão explícita pela sintaxe CAST lança uma exceção em tempo de execução para padrões de conversão ilegais definidos no padrão, como conversõ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:

  • TipoNumérico <=> TipoBooleano
  • TipoString <=> TipoBinário

As combinações válidas de tipo de dados de origem e destino em uma expressão CAST são fornecidas 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 Cordão Data Carimbo de Data e Hora Intervalo booleano Binário Matriz Mapa Estrutura
Numérico Y Y N N N Y N N N N
Cordão Y Y Y Y Y Y Y N N N
Data N Y Y Y N N N N N N
Carimbo de Data e Hora N Y Y Y N N N N N N
Intervalo N Y N N Y N N N N N
booleano 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`
> 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 INSERT Spark SQL adiciona automaticamente cláusulas ANSI CAST à instrução. Durante a inserção da tabela de acordo com esta política, o Spark verifica e rejeita conversõ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 spark.sql.storeAssignmentPolicy é definido como LEGACY, o 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. De acordo com esta política, conversões inválidas durante inserções de tabela resultam na inserção de valores NULL ou valores incorretos, 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 -> Pequeno -> Int -> Longo -> Decimal -> Float* -> Double
Curto Curto -> Int -> Longo -> Decimal-> Float* -> Duplo
int Int -> Longo -> Decimal -> Float* -> Duplo
Longo Longo -> Decimal -> Float* -> Duplo
Decimal Decimal -> Float* -> Duplo
Flutuar Flutuador -> Duplo
Duplo Duplo
Data Data -> Carimbo de data/hora
Carimbo de Data e Hora Carimbo de Data e Hora
Cordão Cordão
Binário Binário
booleano booleano
Intervalo Intervalo
Mapa Mapa**
Matriz Matriz**
Estrutura Estrutura**
  • Para a resolução do tipo menos comum, o tipo de dado 'float' é 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 partilhado para vários parâmetros, como coalesce, mínimo ou máximo.
  • Derive os tipos de operandos para operadores, como operações aritméticas ou comparações.
  • Derive o tipo de resultado para expressões como a expressão de caso.
  • Derive os tipos de elemento, chave ou valor para construtores de matriz e mapa.

Regras especiais são aplicadas se o tipo menos comum resultar em 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 NoSuchElementException se a 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ça IllegalArgumentException se a entrada não for um dia da semana válido.
  • parse_url: Esta função lança uma exceção IllegalArgumentException se uma string de 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 a exceção NoSuchElementException se a 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 retorna o NULL resultado em vez de lançar uma exceção no caso de um 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=true e spark.sql.ansi.enforceReservedKeywords=true, o Spark SQL usa o analisador ANSI. Por padrão, spark.sql.ansi.enforceReservedKeywords é false.

No modo analisador ANSI, as palavras-chave dividem-se em duas categorias:

  • Reservado: Não pode ser usado como identificador (tabela, vista, coluna, função, alias, etc.).
  • Não reservadas: Atuam como palavras-chave apenas em contextos específicos; caso contrário, podem ser usados como identificadores. Por exemplo, EXPLAIN SELECT ... é um comando, mas EXPLAIN pode ser usado como identificador noutro local.

Quando o analisador ANSI não está em uso, as palavras-chave enquadram-se em:

  • Não reservado: Mesma definição mencionada acima.
  • Estritamente não reservado: Semelhante ao não reservado, mas não pode ser usado como alias de tabela.

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
E AINDA 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
COMO reservado não reservado reservado
ASC não reservado não reservado não reservado
EM não reservado não reservado reservado
AUTORIZAÇÃO reservado não reservado reservado
ENTRE 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
Por 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
Caso reservado não reservado reservado
elenco 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
COLUMN reservado não reservado reservado
COLUMNS 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
CONSTRAINT reservado não reservado reservado
CUSTO não reservado não reservado não reservado
CRIAR 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
DIA_ATUAL reservado não reservado reservado
HORA_ATUAL reservado não reservado reservado
CURRENT_TIMESTAMP reservado não reservado reservado
UTILIZADOR_ATUAL 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
DIA 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
Eliminar 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
DIRETORIOS não reservado não reservado não reservado
DIRETÓRIO não reservado não reservado não reservado
DISTINTO 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
LARGAR não reservado não reservado reservado
SENÃO 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
Alargado 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
FALSO 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
SEGUINDO 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
DE reservado não reservado reservado
COMPLETO reservado estrito-não reservado reservado
FUNÇÃO não reservado não reservado reservado
FUNÇÕES 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
SE não reservado não reservado não é uma palavra-chave
IGNORAR não reservado não reservado não reservado
IMPORTAÇÃO não reservado não reservado não reservado
EM 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
INTERSECÇÃO reservado estrito-não reservado reservado
INTERVALO não reservado não reservado reservado
EM reservado não reservado reservado
É reservado não reservado reservado
ITENS não reservado não reservado não reservado
JOIN reservado estrito-não reservado reservado
JSON não reservado não reservado não reservado
CHAVE não reservado não reservado não reservado
CHAVES não reservado não reservado não reservado
ÚLTIMO 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
ESQUERDA reservado estrito-não reservado reservado
GOSTAR não reservado não reservado reservado
ILIKE não reservado não reservado não reservado
LIMIT não reservado não reservado não reservado
LINHAS não reservado não reservado não reservado
LIST 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
MÊS 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
NÃO reservado não reservado reservado
NULO reservado não reservado reservado
NULOS não reservado não reservado não reservado
DE não reservado não reservado reservado
LIGADO reservado estrito-não reservado reservado
APENAS reservado não reservado reservado
OPÇÃO não reservado não reservado não reservado
OPÇÕES 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
formato de saída não reservado não reservado não reservado
SOBRE 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
SOBRESCREVER não reservado não reservado não reservado
PARTITION 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
PIVOT 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
QUALIFY 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
RECIPIENTS 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
REMOVE não reservado não reservado não reservado
RENOMEAR não reservado não reservado não reservado
REPARAÇÃO não reservado não reservado não reservado
SUBSTITUIR 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
Certo reservado estrito-não reservado reservado
CORRESPONDE 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
configuração agregada não reservado não reservado reservado
LINHA não reservado não reservado reservado
LINHAS não reservado não reservado reservado
SCHEMA 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
SELECT 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
UTILIZADOR_DA_SESSÃO 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
SHARES não reservado não reservado não reservado
ESPECTÁCULO 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
ARMAZENADO 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
Subsequência não reservado não reservado não reservado
SYNC não reservado não reservado não reservado
TABLE reservado não reservado reservado
TABLES não reservado não reservado não reservado
TABLESAMPLE não reservado não reservado reservado
TBLPROPERTIES não reservado não reservado não reservado
Temperatura 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
TEMPO reservado não reservado reservado
PARA 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
GUARNIÇÃO não reservado não reservado não reservado
VERDADEIRO não reservado não reservado reservado
TRUNCAR 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
DESARQUIVAR 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
UNIÃO 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
UPDATE não reservado não reservado reservado
UTILIZAÇÃO não reservado não reservado não reservado
UTILIZADOR reservado não reservado reservado
UTILIZAÇÃO reservado estrito-não reservado reservado
VALUES não reservado não reservado reservado
VER não reservado não reservado não reservado
VIEWS não reservado não reservado não reservado
Quando reservado não reservado reservado
WHERE reservado não reservado reservado
WINDOW não reservado não reservado reservado
COM reservado não reservado reservado
ANO não reservado não reservado não reservado
ZONA não reservado não reservado não reservado