Tipos de dados SQL: Alterações no comprimento máximo, saída e mensagens de erro (pendente)¶
Atenção
Essa mudança de comportamento está no pacote 2024_08.
Para saber o status atual do pacote, consulte Histórico do pacote.
Com essa mudança de comportamento, expressões SQL compiladas e algumas mensagens de erro se comportam da seguinte forma:
- Antes da mudança:
Em expressões SQL compiladas e mensagens de erro, o Snowflake especificou explicitamente o comprimento do tipo de dados (por exemplo,
VARCHAR(16777216)
).Ao carregar objetos maiores que 16 MB, um erro relacionado à análise ou processamento de uma cadeia de caracteres ou arquivo grande é retornado (por exemplo,
100069 (22P02): Error parsing JSON: document is too large, max size 16777216 bytes
).
- Após a mudança:
Em expressões SQL compiladas e mensagens de erro, o Snowflake omite o comprimento do tipo de dados (por exemplo,
VARCHAR
).Ao carregar objetos maiores que 16 MB, um erro relacionado ao armazenamento de um objeto grande é retornado (por exemplo,
100082 (22000): Max LOB size (16777216) exceeded, actual size of parsed column is <actual_size>
).
No passado, ocorria um erro quando você tentava consultar um objeto maior que 16 MB (8 MB para BINARY, GEOMETRY e GEOGRAPHY) em um estágio. Agora você pode ler e processar objetos de até 128 MB. Embora ainda não seja possível carregar objetos maiores que 16 MB em uma coluna ou exibi-los em um conjunto de resultados, é possível consultar objetos de até 128 MB (64 MB para BINARY, GEOMETRY e GEOGRAPHY) em arquivos em um estágio e reduzir o tamanho dos objetos antes de armazená-los em colunas.
Para obter mais informações, consulte Reduzir o tamanho de objetos maiores que 16 MB antes de carregar.
O novo limite de tamanho não é exposto explicitamente na saída da consulta SQL ou nos metadados. No entanto, você pode observar implicitamente o novo comprimento aumentado criando ou lendo objetos de tamanho maior, mas não armazenando-os. Habilitar esse recurso introduz as seguintes alterações de comportamento:
Os tipos VARCHAR e BINARY aparecem sem comprimento na saída dos comandos GET_DDL, SHOW e DESCRIBE para expressões de coluna, UDFs e procedimentos armazenados.
Por exemplo,
VARCHAR
é mostrado em vez deVARCHAR(16777216)
. Essa alteração se aplica somente a objetos recém-criados cujo comprimento você não especificou explicitamente na instrução DDL. A alteração não se aplica a objetos existentes.Algumas instruções que falharam antes com um erro
maximum size exceeded
(ou similar) agora serão bem-sucedidas.Instruções que apenas carregam ou criam, mas nunca armazenam ou retornam um valor grande, agora serão bem-sucedidas.
Algumas instruções que antes falhavam com um erro
maximum size exceeded
(ou similar) continuarão falhando, no entanto, com um código de erro ou mensagem diferente.O novo código de erro e mensagem ainda estão relacionados à ultrapassagem do limite de 16 MB, mas o erro pode ter origem em uma parte diferente do plano de execução. Por exemplo,
cannot load value
pode mudar paracannot store value
oucannot output value
.
A primeira mudança afeta todos os clientes. A segunda e terceira alterações afetam clientes que tentam carregar ou gerar objetos maiores que 16 MB.
Importante
Recomendamos fortemente não criar lógica que dependa de mensagens de erro associadas a objetos maiores que 16 MB. Em vez disso, você pode criar uma lógica que use a função BIT_LENGTH para verificar o tamanho do valor.
Alterações nos metadados¶
Há mudanças de comportamento que afetam os seguintes tipos de operações:
Para esses tipos de operações, há alterações nos metadados no conjunto de resultados.
Nota
Esta lista não é exaustiva.
Retornando metadados para UDFs¶
Para novas funções definidas pelo usuário (UDFs) que usam valores VARCHAR ou BINARY como entrada ou saída, as alterações nos metadados para instruções DDL relacionadas a UDFs afetam a saída retornada quando você chama a função GET_DDL, executa a instrução DESCRIBE FUNCTION ou consulta a tabela de evento. O exemplo a seguir cria uma UDF:
CREATE OR REPLACE FUNCTION udf_varchar(g1 VARCHAR)
RETURNS VARCHAR
AS $$
'Hello' || g1
$$;
GET_DDL¶
Os metadados retornados de uma chamada de função GET_DDL mudam da seguinte forma:
SELECT GET_DDL('function', 'udf_varchar(VARCHAR)');
- Metadados antes da mudança:
CREATE OR REPLACE FUNCTION "UDF_VARCHAR"("G1" VARCHAR(16777216)) RETURNS VARCHAR(16777216) LANGUAGE SQL AS ' ''Hello'' || g1 ';
- Metadados depois da mudança:
CREATE OR REPLACE FUNCTION "UDF_VARCHAR"("G1" VARCHAR) RETURNS VARCHAR LANGUAGE SQL AS ' ''Hello'' || g1 ';
DESCRIBE FUNCTION¶
Os metadados retornados para uma instrução DESCRIBE FUNCTION mudam da seguinte forma:
DESCRIBE FUNCTION udf_varchar(VARCHAR);
- Metadados antes da mudança:
+-----------+-------------------+ | property | value | |-----------+-------------------| | signature | (G1 VARCHAR) | | returns | VARCHAR(16777216) | | language | SQL | | body | | | | 'Hello' || g1 | | | | +-----------+-------------------+
- Metadados depois da mudança:
+-----------+-------------------+ | property | value | |-----------+-------------------| | signature | (G1 VARCHAR) | | returns | VARCHAR | | language | SQL | | body | | | | 'Hello' || g1 | | | | +-----------+-------------------+
Tabela de eventos¶
Para novas funções definidas pelo usuário que retornam valores VARCHAR ou BINARY como saída, o atributo snow.executable.name
na coluna RESOURCE_ATTRIBUTES da tabela de evento muda da seguinte forma:
- Metadados antes da mudança:
{ "db.user": "MYUSERNAME", "snow.database.id": 13, "snow.database.name": "MY_DB", "snow.executable.id": 197, "snow.executable.name": "UDF_VARCHAR(X VARCHAR):VARCHAR(16777216)", "snow.executable.type": "FUNCTION", "snow.owner.id": 2, "snow.owner.name": "MY_ROLE", "snow.query.id": "01ab0f07-0000-15c8-0000-0129000592c2", "snow.schema.id": 16, "snow.schema.name": "PUBLIC", "snow.session.id": 1275605667850, "snow.session.role.primary.id": 2, "snow.session.role.primary.name": "MY_ROLE", "snow.user.id": 25, "snow.warehouse.id": 5, "snow.warehouse.name": "MYWH", "telemetry.sdk.language": "python" }
- Metadados depois da mudança:
{ "db.user": "MYUSERNAME", "snow.database.id": 13, "snow.database.name": "MY_DB", "snow.executable.id": 197, "snow.executable.name": "UDF_VARCHAR(X VARCHAR):VARCHAR", "snow.executable.type": "FUNCTION", "snow.owner.id": 2, "snow.owner.name": "MY_ROLE", "snow.query.id": "01ab0f07-0000-15c8-0000-0129000592c2", "snow.schema.id": 16, "snow.schema.name": "PUBLIC", "snow.session.id": 1275605667850, "snow.session.role.primary.id": 2, "snow.session.role.primary.name": "MY_ROLE", "snow.user.id": 25, "snow.warehouse.id": 5, "snow.warehouse.name": "MYWH", "telemetry.sdk.language": "python" }
Retorno de metadados para tabelas com expressões de coluna¶
Para novas tabelas que usam VARCHAR ou BINARY em expressões de coluna, as alterações nos metadados para instruções DDL relacionadas a essas colunas afetam a saída retornada quando você chama a função GET_DDL.
O exemplo a seguir cria uma tabela com expressão de coluna:
CREATE OR REPLACE TABLE table_with_default(x INT, v TEXT DEFAULT x::VARCHAR);
Os metadados retornados de uma chamada de função GET_DDL mudam da seguinte forma:
SELECT GET_DDL('table', 'table_with_default');
- Metadados antes da mudança:
create or replace TABLE TABLE_WITH_DEFAULT ( | X NUMBER(38,0), V VARCHAR(16777216) DEFAULT CAST(TABLE_WITH_DEFAULT.X AS VARCHAR(16777216)) );
- Metadados depois da mudança:
create or replace TABLE TABLE_WITH_DEFAULT ( | X NUMBER(38,0), V VARCHAR(16777216) DEFAULT CAST(TABLE_WITH_DEFAULT.X AS VARCHAR) );
Tabelas externas¶
O exemplo a seguir cria uma tabela externa:
CREATE OR REPLACE EXTERNAL TABLE ext_table(
data_str VARCHAR AS (value:c1::TEXT))
LOCATION = @csv_stage
AUTO_REFRESH = false
FILE_FORMAT =(type = csv);
Os metadados retornados de uma chamada de função GET_DDL mudam da seguinte forma:
SELECT GET_DDL('table', 'ext_table');
- Metadados antes da mudança:
create or replace external table EXT_TABLE( DATA_STR VARCHAR(16777216) AS (CAST(GET(VALUE, 'c1') AS VARCHAR(16777216)))) location=@CSV_STAGE/ auto_refresh=false file_format=(TYPE=csv) ;
- Metadados depois da mudança:
create or replace external table EXT_TABLE( DATA_STR VARCHAR(16777216) AS (CAST(GET(VALUE, 'c1') AS VARCHAR))) location=@CSV_STAGE/ auto_refresh=false file_format=(TYPE=csv) ;
Retorno de metadados para SYSTEM$TYPEOF¶
Os metadados retornados para uma chamada à função SYSTEM$TYPEOF mudam da seguinte forma:
SELECT SYSTEM$TYPEOF(REPEAT('a',10));
- Metadados antes da mudança:
VARCHAR(16777216)[LOB]
- Metadados depois da mudança:
VARCHAR[LOB]
Retorno de metadados para SHOW COLUMNS¶
Essa alteração afeta tabelas novas e existentes. Os metadados retornados para uma instrução SHOW COLUMNS mudam da seguinte forma:
CREATE OR REPLACE TABLE t AS
SELECT TO_VARIANT('abc') AS col;
SHOW COLUMNS IN t;
- Metadados antes da mudança:
{ "type":"VARIANT", "length":16777216, "byteLength":16777216, "nullable":true, "fixed":false }
- Metadados depois da mudança:
{ "type":"VARIANT", "nullable":true, "fixed":false }
Alterações no carregamento e processamento de objetos maiores que 16 MB¶
Há alterações de comportamento que afetam os casos em que você tenta carregar ou processar objetos maiores que 16 MB usando os seguintes tipos de operação:
Nota
Esta lista não é exaustiva.
Carregamento de dados verificando arquivos em um estágio¶
Quando você tenta carregar dados maiores que 16 MB verificando arquivos em um estágio, uma mensagem de erro é retornada.
Carregamento de um objeto grande inteiro usando CREATE TABLE AS SELECT
Carregamento de um objeto grande inteiro usando COPY INTO <table_name> … FROM SELECT
Carregamento de um objeto grande inteiro usando COPY INTO <table_name> … FROM <stage_or_location>
Carregamento de um objeto grande inteiro usando CREATE TABLE AS SELECT¶
Uma mensagem de erro diferente aparece quando você tenta usar uma instrução CREATE TABLE AS SELECT para carregar objetos maiores que 16 MB para VARCHARVARIANT, OBJECT e ARRAY (ou maiores que 8 MB para BINARY, GEOMETRY ou GEOGRAPHY). O erro depende do tipo da fonte. A mesma alteração de mensagem se aplica quando uma instrução INSERT INTO SELECT é usada para este cenário.
Carregamento de um objeto grande inteiro de uma fonte JSON¶
O exemplo a seguir tenta carregar um objeto inteiro maior que 16 MB de uma fonte JSON usando CREATE TABLE AS SELECT:
CREATE OR REPLACE FILE FORMAT json_format TYPE = JSON;
CREATE OR REPLACE TABLE table_varchar (lob_column VARCHAR) AS
SELECT $1::VARCHAR
FROM @lob_int_stage/driver_status.json.gz (FILE_FORMAT => 'json_format');
- Mensagem de erro antes da alteração:
100069 (22P02): Error parsing JSON: document is too large, max size 16777216 bytes
- Mensagem de erro depois da alteração:
100082 (22000): Max LOB size (16777216) exceeded, actual size of parsed column is <actual_size>
Carregamento de um objeto grande inteiro de uma fonte XML¶
O exemplo a seguir tenta carregar um objeto inteiro maior que 16 MB de uma fonte XML usando CREATE TABLE AS SELECT:
CREATE or REPLACE FILE FORMAT xml_format TYPE = XML;
CREATE OR REPLACE TABLE table_varchar (lob_column VARCHAR) AS
SELECT $1 AS XML
FROM @lob_int_stage/large_xml.xte (FILE_FORMAT => 'xml_format');
- Mensagem de erro antes da alteração:
100100 (22P02): Error parsing XML: document is too large, max size 16777216 bytes
- Mensagem de erro depois da alteração:
100078 (22000): String '<string_preview>' is too long and would be truncated
Carregamento de um objeto grande inteiro usando COPY INTO <table_name> … FROM SELECT¶
Uma mensagem de erro diferente aparece quando você tenta usar uma instrução COPY INTO <table_name> … FROM SELECT para carregar objetos maiores que 16 MB para VARCHAR, VARIANT, OBJECT e ARRAY (ou maiores que 8 MB para BINARY, GEOMETRY ou GEOGRAPHY). O erro depende do tipo da fonte.
Importante
Se você tentar carregar dados que contenham objetos maiores que 16 MB usando o comando COPY INTO com ON_ERROR=CONTINUE
e confiar nas mensagens de erro escritas no log de erro, a alteração na mensagem de erro poderá causar problemas na lógica que depende da mensagem de erro.
Carregamento de um objeto grande inteiro de uma fonte JSON¶
O exemplo a seguir tenta carregar um objeto inteiro maior que 16 MB de uma fonte JSON usando COPY INTO <table_name> … FROM SELECT:
CREATE OR REPLACE TABLE table_varchar (lob_column VARCHAR);
COPY INTO table_varchar FROM (
SELECT $1::VARCHAR
FROM @lob_int_stage/driver_status.json.gz (FILE_FORMAT => 'json_format'));
- Mensagem de erro antes da alteração:
100069 (22P02): Error parsing JSON: document is too large, max size 16777216 bytes
- Mensagem de erro depois da alteração:
100082 (22000): Max LOB size (16777216) exceeded, actual size of parsed column is <actual_size>
Carregamento de objetos grandes aninhados de uma fonte JSON¶
O exemplo a seguir tenta carregar dados JSON ao acessar objetos grandes aninhados:
CREATE OR REPLACE TABLE table_varchar (lob_column VARCHAR);
COPY INTO table_varchar FROM (
SELECT $1:"Driver_Status"
FROM @lob_int_stage/driver_status.json.gz (FILE_FORMAT => 'json_format'));
- Mensagem de erro antes da alteração:
100069 (22P02): Max LOB size (16777216) exceeded, actual size of parsed column is <object_size>
- Mensagem de erro depois da alteração:
100082 (22000): Max LOB size (16777216) exceeded, actual size of parsed column is <actual_size>
Carregamento de um objeto grande inteiro de uma fonte XML¶
O exemplo a seguir tenta carregar um objeto inteiro maior que 16 MB de uma fonte XML usando COPY INTO <table_name> … FROM SELECT:
CREATE OR REPLACE TABLE table_varchar (lob_column VARCHAR);
COPY INTO table_varchar FROM (
SELECT $1::VARCHAR AS lob_column
FROM @lob_int_stage/large_xml.xte (FILE_FORMAT => 'xml_format'));
- Mensagem de erro antes da alteração:
100100 (22P02): Error parsing XML: document is too large, max size 16777216 bytes
- Mensagem de erro depois da alteração:
100082 (22000): Max LOB size (16777216) exceeded, actual size of parsed column is <object_size>
Carregamento de um objeto grande inteiro usando COPY INTO <table_name> … FROM <stage_or_location>¶
Uma mensagem de erro diferente aparece quando você tenta usar uma instrução COPY INTO <table_name> … FROM <stage_or_location> para carregar objetos maiores que 16 MB para VARCHAR, VARIANT, OBJECT e ARRAY (ou maiores que 8 MB para BINARY, GEOMETRY ou GEOGRAPHY). O erro depende do tipo da fonte.
Se você usar o comando COPY com objetos grandes, as consultas poderão falhar mesmo quando o parâmetro ON_ERROR
estiver definido como CONTINUE
. Para mais informações, consulte as notas de uso do comando COPY.
Importante
Se você tentar carregar dados que contenham objetos maiores que 16 MB usando o comando COPY INTO com ON_ERROR=CONTINUE
e confiar nas mensagens de erro escritas no log de erro, a alteração na mensagem de erro poderá causar problemas na lógica que depende da mensagem.
Carregamento de um objeto grande inteiro de uma fonte JSON¶
O exemplo a seguir tenta carregar um objeto inteiro maior que 16 MB de uma fonte JSON usando COPY INTO <table_name> … FROM <stage_or_location>:
CREATE OR REPLACE TABLE table_varchar (lob_column VARCHAR);
COPY INTO table_varchar (lob_column)
FROM @lob_int_stage/driver_status.json.gz
FILE_FORMAT = (FORMAT_NAME = json_format);
- Mensagem de erro antes da alteração:
100069 (22P02): Error parsing JSON: document is too large, max size 16777216 bytes
- Mensagem de erro depois da alteração:
100082 (22000): Max LOB size (16777216) exceeded, actual size of parsed column is <actual_size>
Carregamento de um objeto grande inteiro de uma fonte XML¶
O exemplo a seguir tenta carregar um objeto inteiro maior que 16 MB de uma fonte XML usando COPY INTO <table_name> … FROM <stage_or_location>:
CREATE OR REPLACE TABLE table_varchar (lob_column VARCHAR);
COPY INTO table_varchar (lob_column)
FROM @lob_int_stage/large_xml.xte
FILE_FORMAT = (FORMAT_NAME = xml_format);
- Mensagem de erro antes da alteração:
100100 (22P02): Error parsing XML: document is too large, max size 16777216 bytes
- Mensagem de erro depois da alteração:
100082 (22000): Max LOB size (16777216) exceeded, actual size of parsed column is <actual_size>
Consulta de um objeto grande inteiro de um arquivo de origem¶
Como objetos maiores que 16 MB atualmente não são permitidos em um conjunto de resultados, uma mensagem de erro diferente aparece quando você tenta consulta objetos de um arquivo de origem maiores que 16 MB para VARCHAR, VARIANT, OBJECT e ARRAY (ou maiores que 8 MB para BINARY, GEOMETRY ou GEOGRAPHY). O erro depende do tipo da fonte.
Consulta de um objeto grande inteiro de uma fonte JSON¶
O exemplo a seguir tenta consultar um objeto inteiro maior que 16 MB de uma fonte JSON:
SELECT $1
FROM @lob_int_stage/driver_status.json.gz (FILE_FORMAT => 'json_format');
- Mensagem de erro antes da alteração:
100069 (22P02): Error parsing JSON: document is too large, max size 16777216 bytes
- Mensagem de erro depois da alteração:
100082 (22000): The data length in result column $1 is not supported by this version of the client. Actual length <actual_length> exceeds supported length of 16777216.
Consulta de um objeto grande inteiro de uma fonte XML¶
O exemplo a seguir tenta consultar um objeto inteiro maior que 16 MB de uma fonte XML:
SELECT $1 as lob_column
FROM @lob_int_stage/large_xml.xte (FILE_FORMAT => 'xml_format');
- Mensagem de erro antes da alteração:
100100 (22P02): Error parsing XML: document is too large, max size 16777216 bytes
- Mensagem de erro depois da alteração:
100082 (22000): The data length in result column $1 is not supported by this version of the client. Actual length <actual_length> exceeds supported length of 16777216.
Consulta de um objeto grande inteiro de uma fonte CSV¶
O exemplo a seguir tenta consultar um objeto inteiro maior que 16 MB de uma fonte CSV:
SELECT $1
FROM @lob_int_stage/driver_status.csv.gz (FILE_FORMAT => 'csv_format');
- Mensagem de erro antes da alteração:
100082 (22000): Max LOB size (16777216) exceeded, actual size of parsed column is <object_size>
- Mensagem de erro depois da alteração:
100082 (22000): The data length in result column $1 is not supported by this version of the client. Actual length <actual_length> exceeds supported length of 16777216.
Consulta de um objeto grande inteiro de uma fonte Parquet¶
O exemplo a seguir tenta consultar um objeto inteiro maior que 16 MB de uma fonte Parquet:
SELECT $1
FROM @lob_int_stage/driver_status.parquet (FILE_FORMAT => 'parquet_format');
- Mensagem de erro antes da alteração:
100082 (22000): Max LOB size (16777216) exceeded, actual size of parsed column is <object_size>
- Mensagem de erro depois da alteração:
100082 (22000): The data length in result column $1 is not supported by this version of the client. Actual length <actual_length> exceeds supported length of 16777216.
Inclusão de objetos grandes nos resultados de consulta¶
Agora você pode criar objetos maiores que 16 MB na memória. Entretanto, você não é possível incluir esses objetos nos resultados de consulta nem os armazenar em uma tabela. Ao tentar fazer isso, uma mensagem de erro é retornada.
Tentativa de inclusão de um objeto maior que 16 MB nos resultados de consulta
Tentativa de armazenamento de um objeto maior que 16 MB em uma tabela
Tentativa de inclusão de um objeto maior que 16 MB nos resultados de consulta¶
A consulta a seguir tenta concatenar duas cadeias de caracteres grandes:
SELECT large_str || large_str FROM lob_strings;
- Mensagem de erro antes da alteração:
100078 (22000): String '<preview_of_string>' is too long and would be truncated in 'CONCAT'
- Mensagem de erro depois da alteração:
100067 (54000): The data length in result column <column_name> is not supported by this version of the client. Actual length <actual_size> exceeds supported length of 16777216.
Tentativa de armazenamento de um objeto maior que 16 MB em uma tabela¶
A instrução CREATE TABLE AS SELECT a seguir tenta concatenar duas grandes cadeias de caracteres:
CREATE OR REPLACE TABLE table_varchar
AS SELECT large_str || large_str as LOB_column
FROM lob_strings;
- Mensagem de erro antes da alteração:
100078 (22000): String '<preview_of_string>' is too long and would be truncated in 'CONCAT'
- Mensagem de erro depois da alteração:
100067 (54000): The data length in result column <column_name> is not supported by this version of the client. Actual length <actual_size> exceeds supported length of 16777216.
Criação de um objeto grande usando agregação¶
Ao tentar criar um objeto maior que 16 MB e retornar uma saída para ele, uma mensagem de erro é retornada.
O exemplo a seguir usa a função ARRAY_AGG em uma consulta de uma coluna de objeto grande:
SELECT ARRAY_AGG(status) FROM lob_object;
- Mensagem de erro antes da alteração:
100082 (22000): Max LOB size (16777216) exceeded, actual size of parsed column is <actual_size>
- Mensagem de erro depois da alteração:
100067 (54000): The data length in result column <column_name> is not supported by this version of the client. Actual length <actual_size> exceeds supported length of 16777216.
Ref.: 1779