Partilhar via


ANSI_MODE

Aplica-se a:Sim marcado Databricks SQL

O ANSI_MODE parâmetro de configuração controla os principais comportamentos de funções incorporadas e operações de conversão.

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

Definições

  • VERDADEIRO

    Segue o padrão SQL em como ele lida com certas operações aritméticas e conversões de tipo, semelhante à maioria dos bancos de dados e data warehouses. Seguir esse padrão promove melhor qualidade, integridade e portabilidade dos dados.

  • FALSO

    O Databricks SQL usa um comportamento compatível com o Hive.

Você pode definir esse parâmetro no nível da sessão usando a instrução SET e no nível global usando parâmetros de configuração do SQL ou a API do SQL Warehouse.

Predefinição do sistema

Para contas criadas em ou após 19 de outubro de 2022, o padrão do sistema é TRUE.

Descrição detalhada

A documentação de referência do Databricks SQL descreve o comportamento padrão do SQL.

As seções a seguir descrevem as diferenças entre ANSI_MODETRUE (modo ANSI) e FALSE (modo não-ANSI).

Operadores

No modo não-ANSI, as operações aritméticas executadas em tipos numéricos podem retornar valores com transbordo ou NULL, enquanto no modo ANSI essas operações desencadeiam um erro.

Operador Descrição Exemplo ANSI_MODE = verdadeiro ANSI_MODE = falso
dividendo / divisor Retorna o dividendo dividido pelo divisor. 1/0 Erro NULL
- EXPR Devolve o valor negado da expressão. -(-128y) Erro -128y (Transbordamento)
EXPR1 - EXPR2 Devolve a subtração de expr2 de expr1. -128y - 1y Erro 127y (Transbordamento)
expr1 + expr2 Devolve a soma de expr1 e expr2. 127y + 1y Erro -128y (Transbordamento)
dividendo % divisor Devolve o restante após dividendo/divisor. 1 % 0 Erro NULL
multiplicador * multiplicando Devolve o multiplicador multiplicado pelo multiplicando. 100y * 100y Erro 16y (Transbordamento)
arrayExpr[índice] Retorna o elemento de uma variável arrayExpr no índice. Índice de matriz inválido Erro NULL
mapExpr[chave] Retorna o valor de mapExpr para chave. Chave de mapa inválida Erro NULL
divisor div dividendo Devolve a parte inteira da divisão do divisor pelo dividendo. 1 div 0 Erro NULL

Funções

O comportamento de algumas funções internas pode ser diferente no modo ANSI vs modo não-ANSI sob as condições especificadas abaixo.

Operador Descrição Condição ANSI_MODE = verdadeiro ANSI_MODE = falso
abs(expr) Devolve o valor absoluto do valor numérico da expressão expr. abs(-128y) Erro -128y (Transbordamento)
element_at(mapExpr, chave) Retorna o valor de mapExpr para chave. Chave de mapa inválida Erro NULL
element_at(arrayExpr, índice) Retorna o elemento de uma variável arrayExpr no índice. Índice de matriz inválido Erro NULL
elt(índice, expr1 [, ...] ) Retorna a enésima expressão. Índice inválido Erro NULL
make_date(y,m,d) Cria uma data dos campos ano, mês e dia. Data de resultado inválida Erro NULL
make_timestamp(y,m,d,h,mi,s[,tz]) Cria um carimbo de data/hora dos campos. Carimbo de data/hora inválido do resultado Erro NULL
make_interval(y,m,w,d,h,mi,s) Cria um intervalo a partir de campos. Intervalo de resultados inválido Erro NULL
mod(dividendo, divisor) Devolve o restante após dividendo/divisor. mod(1, 0) Erro NULL
next_day(expr,dayOfWeek) Devolve a primeira data posterior a expr e nomeada como em dayOfWeek. Dia da semana inválido Erro NULL
parse_url(url, partToExtract[, chave]) Extrai uma parte da URL. URL Inválido Erro NULL
pmod(dividendo, divisor) Devolve o restante positivo após dividendo/divisor. pmod(1, 0) Erro NULL
tamanho(expr) Devolve a cardinalidade da expressão 'expr'. size(NULL) NULL -1
to_date(expr[,fmt]) Converte a expressão para uma data usando uma formatação opcional. Expressão ou cadeia de formato inválida Erro NULL
to_timestamp(expr[,fmt]) Retorna a conversão expr para um carimbo de data/hora usando uma formatação opcional. Expressão ou cadeia de formato inválida Erro NULL
to_unix_timestamp(expr[,fmt]) Retorna o carimbo de data/hora em 'expr' como um carimbo de data/hora UNIX. Expressão ou cadeia de formato inválida Erro NULL
unix_timestamp([expr[, fmt]]) Devolve o timestamp UNIX da hora atual ou de uma hora especificada. Expressão ou cadeia de formato inválida Erro NULL

Regras de elenco

As regras e comportamentos em relação ao CAST são mais rigorosos no modo ANSI. Podem dividir-se nas seguintes três categorias:

Regras de conversão em tempo de compilação

Tipo de fonte Tipo de destino Exemplo ANSI_MODE = verdadeiro ANSI_MODE = falso
booleano Carimbo de Data e Hora cast(TRUE AS TIMESTAMP) Erro 1970-01-01 00:00:00.000001 UTC
Data booleano cast(DATE'2001-08-09' AS BOOLEAN) Erro NULL
Carimbo de Data e Hora booleano cast(TIMESTAMP'1970-01-01 00:00:00Z' AS BOOLEAN) Erro FALSE
Integral numérica Binário cast(15 AS BINARY) Erro representação binária

Erros de tempo de execução

Tipo de fonte Tipo de destino Condição Exemplo ANSI_MODE = verdadeiro ANSI_MODE = falso
Cadeia Não é uma cadeia Entrada inválida cast('a' AS INTEGER) Erro NULL
Matriz, Estrutura, Mapa Matriz, Estrutura, Mapa Entrada inválida cast(ARRAY('1','2','3') AS ARRAY<DATE>) Erro NULL
Numérico Numérico Transbordo cast(12345 AS BYTE) Erro NULL
Numérico Integral numérica Truncamento cast(5.1 AS INTEGER) Erro 5

Nota

Para cada uma dessas conversões, você pode usar try_cast em vez de cast para retornar NULL em vez de gerar um erro.

Regras de coerção de tipo implícito

Em ANSI_MODE = TRUE, o Databricks SQL utiliza regras claras de conversão de tipos de dados SQL para:

Em contrapartida, ANSI_MODE = FALSE é inconsistente e mais indulgente. Por exemplo:

  • Ao usar um STRING tipo com qualquer operador aritmético, a cadeia de caracteres é implicitamente convertida em DOUBLE.
  • Ao comparar um STRING com qualquer tipo numérico, a cadeia de caracteres é implicitamente convertida para o tipo com o qual se compara.
  • Ao executar um UNION, COALESCEou outras operações em que um tipo menos comum deve ser encontrado, todos os tipos são convertidos para STRING se houver algum tipo STRING presente.

O Databricks recomenda o uso da função explícita cast ou try_cast em vez de confiar no ANSI_MODE = FALSE.

Exemplos

> SET ansi_mode = true;

-- Protects against integral numeric overflow
> SELECT cast(12345 AS TINYINT);
  Casting 12345 to tinyint causes overflow

-- For invalid values raises errors instead of returning NULL.
> SELECT cast('a' AS INTEGER);
  Invalid input syntax for type numeric: a.
  To return NULL instead, use 'try_cast'

-- try_cast() is consistent for both modes
> SELECT try_cast('a' AS INTEGER);
  NULL

-- Does not allow ambiguous crosscasting.
> SELECT c1 + c2 FROM VALUES('5', '7.6') AS T(c1, c2);
  Cannot resolve '(T.c1 + T.c2)' due to data type mismatch:
  '(T.c1 + T.c2)' requires (numeric or interval day to second or interval year to month or interval) type, not string

-- Promotes STRING to least common type (STRING, INTEGER --> BIGINT) for arithmetic operation.
> SELECT typeof(5 - '3');
  bigint

-- Promotes STRING to least common type (INTEGER, STRING --> BIGINT) with runtime check
> SELECT c1 = c2 FROM VALUES(10, '10.1') AS T(c1, c2);
  Invalid input syntax for type numeric: 10.1. To return NULL instead, use 'try_cast'.

-- Promotes STRING to least common type (STRING, INTEGER --> BIGINT) for set operation with runtime check.
> SELECT typeof(c1) FROM (SELECT 5 UNION ALL SELECT '6') AS T(c1);
  bigint
  bigint
> SET ansi_mode = false;

-- Silent integral numeric overflow
> SELECT cast(12345 AS TINYINT);
  57

-- Returns NULL instead of an error
> SELECT cast('a' AS INTEGER);
  NULL

-- try_cast() is safe for both modes
> SELECT try_cast('a' AS INTEGER);
  NULL

-- Does allow ambiguous crosscasting using DOUBLE.
> SELECT c1 + c2 FROM VALUES('5', '7.6') AS T(c1, c2);
  12.6

-- Crosscasts STRING to DOUBLE for arithmetic operation.
> SELECT typeof(5 - '3');
  double

-- Implicitly casts STRING to INTEGER equating 10 with 10.1
> SELECT c1 = c2 FROM VALUES(10, '10.1') AS T(c1, c2);
  true

-- Promotes to string for set operations
> SELECT typeof(c1) FROM (SELECT 5 UNION ALL SELECT '6') AS T(c1);
  string
  string