SnowConvert AI – Diferenças funcionais do PostgreSQL

Nota

O SnowConvert AI para PostgreSQL atualmente oferece suporte à avaliação e tradução para TABLES e VIEWS. Embora o SnowConvert AI possa reconhecer outros tipos de instruções, elas não são totalmente compatíveis.

Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-PG0001

FOUND pode ter um comportamento diferente no Snowflake em alguns cenários.

Gravidade

Low

Descrição

A propriedade FOUND no PostgreSQL é baseada na última consulta executada e pode ser afetada por algumas instruções, como loops de INSERT, UPDATE, DELETE, MERGE, SELECT, INTO, PERFORM, FETCH e FOR. Para obter mais detalhes sobre essa propriedade, consulte a documentação do PostgreSQL.

No Snowflake, não existe uma tradução direta para essa propriedade nos seguintes cenários:

  • INSERT

  • UPDATE

  • DELETE

  • MERGE

O código convertido será a propriedade SQLFOUND do Snowflake ([consulte a documentação aqui] https://docs.snowflake.com/en/developer-guide/snowflake-scripting/dml-status), pois se comporta como a propriedadeFOUND do PostgreSQL.

Para os outros casos, como:

  • SELECT INTO

  • PERFORM

  • FETCH

O código convertido será um UDF (IS_FOUND_UDF) personalizado que se comporta como a propriedadeFOUND do PostgreSQL.

Isso ocorre porque SQLFOUND só altera o valor quando pelo menos uma linha é afetada pela última consulta executada; se a última consulta não alterar nenhuma linha, o valor não será alterado.

IS_FOUND_UDF só funciona para instruções que retornam linhas; se nenhuma linha for retornada, o valor será FALSE.

Exemplo de SQLFOUND
INSERT INTO SampleTable (SampleColumn1)
VALUES ('SampleValue0.1');
Copy

A última consulta afeta uma tabela; portanto, SQLFOUND é o mais próximo da funcionalidade do PostgreSQL.

Exemplo UDF IS_FOUND_
SELECT SampleColumn FROM SampleTable;
Copy

A última consulta retornará uma linha, mas não alterará nada; portanto, IS_FOUND_UDF() é o mais próximo da funcionalidade do PostgreSQL.

Código-fonte UDF IS_FOUND_
CREATE OR REPLACE FUNCTION FOUND_UDF() 
RETURNS BOOLEAN
LANGUAGE SQL
IMMUTABLE
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "udf",  "convertedOn": "09/09/2024" }}'
AS
$$
SELECT (count(*) != 0) FROM TABLE(result_scan(last_query_id()))
$$;
Copy

Exemplo de código

Instrução Insert:
PostgreSQL
-- Found property used with INSERT statement.
CREATE OR REPLACE PROCEDURE FoundUsingInsertProcedure()
LANGUAGE plpgsql
AS $$
BEGIN
    -- Insert into SampleTable
    INSERT INTO SampleTable (SampleColumn1)
    VALUES ('SampleValue0.1');

    SELECT FOUND;
END;
$$;
Copy
Snowflake
-- Found property used with INSERT statement.
CREATE OR REPLACE PROCEDURE FoundUsingInsertProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
AS $$
BEGIN
    -- Insert into SampleTable
    INSERT INTO SampleTable (SampleColumn1)
    VALUES ('SampleValue0.1');

    SELECT
        SQLFOUND /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
END;
$$;
Copy
Instrução de atualização:
PostgreSQL
 -- Found property used with UPDATE statement.
CREATE OR REPLACE PROCEDURE FoundUsingUpdateProcedure()
LANGUAGE plpgsql
AS
$$
    BEGIN
        UPDATE SampleTable 
        SET SampleColumn1 = 'SampleValue0.1' 
        WHERE SampleColumn1 = 'SampleValue0.1';
        SELECT FOUND;        
    END;
$$;
Copy
Snowflake
 -- Found property used with UPDATE statement.
CREATE OR REPLACE PROCEDURE FoundUsingUpdateProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
    BEGIN
        UPDATE SampleTable
        SET SampleColumn1 = 'SampleValue0.1'
        WHERE SampleColumn1 = 'SampleValue0.1';
        SELECT
        SQLFOUND /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
    END;
$$;
Copy
Instrução de exclusão:
PostgreSQL
 -- Found property used with DELETE statement.
CREATE OR REPLACE PROCEDURE FoundUsingDeleteProcedure()
LANGUAGE plpgsql
AS
$$
    BEGIN
        DELETE FROM SampleTable 
        WHERE SampleColumn1 = 'SampleValue0.1';
        SELECT FOUND;
    END;
$$;
Copy
Snowflake
 -- Found property used with DELETE statement.
CREATE OR REPLACE PROCEDURE FoundUsingDeleteProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
    BEGIN
        DELETE FROM
            SampleTable
        WHERE SampleColumn1 = 'SampleValue0.1';
        SELECT
        SQLFOUND /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
    END;
$$;
Copy
Instrução de fusão:
PostgreSQL
 -- Found property used with MERGE statement.
CREATE OR REPLACE PROCEDURE FoundUsingMergeProcedure()
LANGUAGE plpgsql
AS
$$
    BEGIN
        MERGE INTO SampleTableB B
        USING (SELECT * FROM SampleTableA) A
        ON B.SampleColumn1 = A.SampleColumn2
        WHEN MATCHED THEN DELETE;
        SELECT FOUND;
    END;
$$;
Copy
Snowflake
 -- Found property used with MERGE statement.
CREATE OR REPLACE PROCEDURE FoundUsingMergeProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
    BEGIN
        MERGE INTO SampleTableB B
        USING (SELECT * FROM SampleTableA) A
        ON B.SampleColumn1 = A.SampleColumn2
        WHEN MATCHED THEN DELETE !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'MergeStatement' NODE ***/!!!;
        SELECT
        SQLFOUND /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
    END;
$$;
Copy
Instrução Select Into
PostgreSQL
 -- Found property used with SELECT INTO statement.
CREATE OR REPLACE PROCEDURE FoundUsingSelectIntoProcedure()
LANGUAGE plpgsql
AS
$$
    DECLARE 
        SampleNumber INTEGER;
    BEGIN
        SELECT 1 INTO SampleNumber;
        SELECT FOUND;
    END;
$$;
Copy
Snowflake
 -- Found property used with SELECT INTO statement.
CREATE OR REPLACE PROCEDURE FoundUsingSelectIntoProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
    DECLARE
        SampleNumber INTEGER;
    BEGIN
        SELECT 1 INTO
        : SampleNumber;
        SELECT
        FOUND_UDF() /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
    END;
$$;
Copy
Instrução de execução:
PostgreSQL
 -- Found property used with PERFORM statement.
CREATE OR REPLACE PROCEDURE FoundUsingPerformProcedure()
LANGUAGE plpgsql
AS
$$
    BEGIN
        PERFORM 1;
        RETURN FOUND;
    END;
$$;
Copy
Snowflake
 -- Found property used with PERFORM statement.
CREATE OR REPLACE PROCEDURE FoundUsingPerformProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
    BEGIN
    SELECT
        1;
    RETURN FOUND_UDF() /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
    END;
$$;
Copy
Instrução Fetch:
PostgreSQL
 -- Found property used with FETCH statement.
CREATE OR REPLACE PROCEDURE FoundUsingFetchProcedure ()
LANGUAGE plpgsql
AS
$$
    DECLARE
        SampleRow VARCHAR;
        SampleCursor CURSOR FOR SELECT EmptyColumn FROM EmptyTable;
    BEGIN
        OPEN SampleCursor;
        FETCH SampleCursor;
        CLOSE SampleCursor;
        SELECT FOUND;
    END;
$$;
Copy
Snowflake
 -- Found property used with FETCH statement.
CREATE OR REPLACE PROCEDURE FoundUsingFetchProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
    DECLARE
        SampleRow VARCHAR;
        SampleCursor CURSOR FOR SELECT EmptyColumn FROM
        EmptyTable;
    BEGIN
        OPEN SampleCursor;
    !!!RESOLVE EWI!!! /*** SSC-EWI-PG0015 - FETCH CURSOR WITHOUT TARGET VARIABLES IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
        FETCH SampleCursor;
        CLOSE SampleCursor;
        SELECT
        FOUND_UDF() /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
    END;
$$;
Copy

SSC-FDM-PG0002

Bpchar convertido para varchar.

Descrição

Este aviso é adicionado porque o tipo bpchar («caractere com espaço em branco») pode ter alguma diferença de equivalência funcional em comparação com o tipo de dados varchar no Snowflake. No entanto, ambos os tipos de dados podem armazenar valores de até «n» caracteres e consomem armazenamento apenas pela quantidade de dados realmente armazenados. A principal diferença ocorre quando há espaços em branco no fim dos dados, em que o bpchar não os armazena, mas o Snowflake sim.

Por esse motivo, podemos usar a função RTRIM para que esses espaços em branco não sejam armazenados. Mas pode haver casos em que a funcionalidade não seja completamente equivalente.

Exemplo de código

Código de entrada:
Definição da coluna
CREATE TABLE table1 (
    col1 BPCHAR, 
    col2 BPCHAR(20)
);
Copy
Conversão explícita
SELECT 'Y'::BPCHAR;
SELECT 'Y   '::BPCHAR(20);
SELECT COL1::BPCHAR(20) FROM tbl;
Copy
Código gerado:
Definição da coluna
CREATE TABLE table1 (
    col1 VARCHAR /*** SSC-FDM-PG0002 - BPCHAR CONVERTED TO VARCHAR. THESE TYPES MAY HAVE SOME FUNCTIONAL DIFFERENCES. ***/,
    col2 VARCHAR(20) /*** SSC-FDM-PG0002 - BPCHAR CONVERTED TO VARCHAR. THESE TYPES MAY HAVE SOME FUNCTIONAL DIFFERENCES. ***/
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';
Copy
Conversão explícita
SELECT 'Y':: VARCHAR /*** SSC-FDM-PG0002 - BPCHAR CONVERTED TO VARCHAR. THESE TYPES MAY HAVE SOME FUNCTIONAL DIFFERENCES. ***/;

SELECT
    RTRIM( 'Y   ') :: VARCHAR(20) /*** SSC-FDM-PG0002 - BPCHAR CONVERTED TO VARCHAR. THESE TYPES MAY HAVE SOME FUNCTIONAL DIFFERENCES. ***/;

SELECT
    RTRIM( COL1) :: VARCHAR(20) /*** SSC-FDM-PG0002 - BPCHAR CONVERTED TO VARCHAR. THESE TYPES MAY HAVE SOME FUNCTIONAL DIFFERENCES. ***/
FROM
    tbl;
Copy

Práticas recomendadas

  • A função rtrim pode resolver diferenças de armazenamento caso você não queira que os valores em branco sejam armazenados. Esse caso é tratado na conversão explícita. No entanto, pode haver outros cenários em que isso precise ser tratado manualmente. Para mais informações, consulte a documentação do Snowflake sobre RTRIM.

SSC-FDM-PG0003

Bytea convertido em binário

Descrição

Este aviso é adicionado porque, quando o tipo de dados bytea é convertido para binário, o limite de tamanho é bastante reduzido de 1GB para 8MB.

Exemplo de código

Código de entrada:
CREATE TABLE tbl(
    col BYTEA
);
Copy
Código gerado:
CREATE TABLE tbl (
    col BINARY /*** SSC-FDM-PG0003 - BYTEA CONVERTED TO BINARY. SIZE LIMIT REDUCED FROM 1GB TO 8MB ***/
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';
Copy

Práticas recomendadas

SSC-FDM-PG0004

O formato de saída da data pode variar.

Descrição

O formato de saída da data pode variar dependendo do tipo de carimbo de data/hora e do timestamp_output_format que está sendo utilizado. Você pode consultar isso aqui.

Exemplo de código

Código de entrada:
PostgreSQL
CREATE TABLE table1 (
    dt_update timestamp without time zone DEFAULT clock_timestamp()
);
Copy
Código gerado:
Snowflake
CREATE TABLE table1 (
    dt_update TIMESTAMP_NTZ DEFAULT CAST(
    --** SSC-FDM-PG0004 - THE DATE OUTPUT FORMAT MAY VARY DEPENDING ON THE TIMESTAMP TYPE AND THE TIMESTAMP_OUTPUT_FORMAT BEING USED. **
    CURRENT_TIMESTAMP() AS TIMESTAMP_NTZ)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';
Copy

Amostras

Exemplo com CREATE TABLE.

Código de entrada:

PostgreSQL
CREATE TABLE sample2 (
    platform_id integer NOT NULL,
    dt_update timestamp with time zone DEFAULT clock_timestamp()
);
    
insert into postgres.public.sample2 (platform_id) values (1);
   
select *, clock_timestamp() from postgres.public.sample2;
Copy
Resultados

platform_id

dt_update

clock_timestamp

1

2023-02-05 22:47:34.275 -0600

2023-02-05 23:16:15.754 -0600

Código gerado:
Snowflake
CREATE TABLE sample2 (
    platform_id integer NOT NULL,
    dt_update TIMESTAMP_TZ DEFAULT CAST(
--** SSC-FDM-PG0004 - THE DATE OUTPUT FORMAT MAY VARY DEPENDING ON THE TIMESTAMP TYPE AND THE TIMESTAMP_OUTPUT_FORMAT BEING USED. **
CURRENT_TIMESTAMP() AS TIMESTAMP_TZ)
);

insert into postgres.public.sample2 (platform_id) values (1);
ALTER SESSION SET timestamp_output_format = 'YYYY-MM-DD HH24:MI:SS.FF';

select *,
CURRENT_TIMESTAMP(3)
from
postgres.public.sample2;
Copy
Resultados

PLATFORM_ID

DT_UPDATE

CURRENT_TIMESTAMP(3)

1

2023-02-05 20:52:30.082000000

2023-02-05 21:20:31.593

Exemplo com SELECT com clock_timestamp().

Código de entrada
PostgreSQL
select clock_timestamp();
Copy
Resultados

clock_timestamp

2023-02-05 23:24:13.740

Código gerado
Snowflake
ALTER SESSION SET timestamp_output_format = 'YYYY-MM-DD HH24:MI:SS.FF';
select
    CURRENT_TIMESTAMP(3);
Copy
Resultados

CURRENT_TIMESTAMP(3)

2023-02-05 21:29:24.258

SSC-FDM-PG0005

A tabela UNLOGGED não é compatível com o Snowflake; os dados gravados podem ter desempenho diferente.

Descrição

As tabelas UNLOGGED de PostgreSQL oferecem uma vantagem de velocidade significativa ao ignorar o registro de gravação antecipada (WAL). No entanto, os dados delas não são replicados para instâncias espelhadas. O Snowflake não oferece suporte a essa funcionalidade; portanto, a cláusula UNLOGGED será transformada em comentário.

Exemplo de código

Código de entrada:
PostgreSQL
CREATE UNLOGGED TABLE TABLE1 (
   COL1 integer 
);
Copy
Código gerado:
Snowflake
CREATE
--       --** SSC-FDM-PG0005 - UNLOGGED TABLE IS NOT SUPPORTED IN SNOWFLAKE, DATA WRITTEN MAY HAVE DIFFERENT PERFORMANCE. **
--       UNLOGGED
                TABLE TABLE1 (
COL1 integer
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "greenplum",  "convertedOn": "04/21/2025",  "domain": "test" }}';
Copy

SSC-FDM-PG0006

Caminho de pesquisa definido com vários esquemas.

Descrição

A definição do caminho de pesquisa com vários esquemas não é compatível com o Snowflake. Você pode consultar aqui.

Exemplo de código

Código de entrada:
PostgreSQL
 SET SEARCH_PATH TO schema1, schema2, schema3;
Copy
Código gerado:
Snowflake
 --** SSC-FDM-PG0006 - SET SEARCH PATH WITH MULTIPLE SCHEMAS IS NOT SUPPORTED IN SNOWFLAKE **
USE SCHEMA schema1 /*, schema2, schema3*/;
Copy

SSC-FDM-PG0007

NULL é convertido para “” e pode ter um comportamento diferente no Snowflake.

Gravidade

Low

Descrição

No PostgreSQL, a remoção de um comentário é tratada usando o termo NULL. No entanto, no Snowflake, um método semelhante para remover um comentário é atribuir o valor de uma cadeia de caracteres vazia '' para fornecer o mesmo resultado. Essa abordagem garante que o comentário seja efetivamente mapeado para uma cadeia de caracteres vazia com um comportamento semelhante.

Exemplo de código

Código de entrada:
PostgreSQL
 COMMENT ON TABLE mytable IS NULL;
Copy
Código gerado:
Snowflake
 COMMENT ON TABLE mytable IS '' /*** SSC-FDM-PG0007 - NULL IS CONVERTED TO '' AND MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/;
Copy

SSC-FDM-PG0008

Tabelas Select into unlogged não são compatíveis com o Snowflake.

Descrição

Select Into não é compatível com o Snowflake; essa funcionalidade foi emulada com CREATE TABLE AS. Além disso, o Snowflake sempre usa logs de transações para proteger as tabelas e garantir a integridade e a capacidade de recuperação dos dados. Consequentemente, tabelas com a opção UNLOGGED não são compatíveis com o Snowflake.

Exemplo de código

Código de entrada:
PostgreSQL
select column1
      into UNLOGGED NewTable
      from oldTable;
Copy
Código gerado:
Snowflake
CREATE TABLE IF NOT EXISTS NewTable AS
      select column1
--      --** SSC-FDM-PG0008 - SELECT INTO UNLOGGED TABLES ARE NOT SUPPORTED BY SNOWFLAKE. **
--            into UNLOGGED NewTable
            from
            oldTable;
Copy

SSC-FDM-PG0009

A propriedade sequence nextval do Snowflake não garante a geração de números sequenciais sem lacunas.

Descrição

O Snowflake não garante a geração de números sequenciais sem lacunas. Os números gerados aumentam consistentemente em valor (ou diminuem em valor se o tamanho da etapa for negativo), mas não são necessariamente contíguos.

Exemplo de código

Código de entrada:
PostgreSQL
 SELECT nextval('seq1');
Copy
Código gerado:
Snowflake
 SELECT seq1.nextval /*** SSC-FDM-PG0009 - THE SEQUENCE NEXTVAL PROPERTY SNOWFLAKE DOES NOT GUARANTEE GENERATING SEQUENCE NUMBERS WITHOUT GAPS. ***/;
Copy

SSC-FDM-PG0010

Os resultados podem variar devido ao comportamento da função bitwise do Snowflake.

Descrição

Os operadores bitwise << and >> são convertidos para as funções correspondentes do Snowflake BITSHIFTLEFT e BITSHIFTRIGHT. No entanto, devido às diferenças na forma como essas funções lidam com expressões, os resultados podem diferir daqueles no PostgreSQL.

Exemplo de código

Código de entrada:
PostgreSql
 SELECT 1 << 127 AS resultShiftedLeft, 16 >> 32 AS resultShiftedRight;
Copy
Resultado

resultShiftedLeft

resultShiftedRight

-2147483648

16

Código gerado:
Snowflake
 SELECT
--** SSC-FDM-PG0010 - RESULTS MAY VARY DUE TO THE BEHAVIOR OF SNOWFLAKE'S BITSHIFTLEFT BITWISE FUNCTION **
BITSHIFTLEFT( 1, 127) AS resultShiftedLeft,
--** SSC-FDM-PG0010 - RESULTS MAY VARY DUE TO THE BEHAVIOR OF SNOWFLAKE'S BITSHIFTRIGHT BITWISE FUNCTION **
BITSHIFTRIGHT( 16, 32) AS resultShiftedRight;
Copy
Resultado

resultShiftedLeft

resultShiftedRight

-170141183460469231731687303715884105728

0

SSC-FDM-PG0011

O uso da restrição de coluna COLLATE foi desativado para esta condição de correspondência de padrões.

Descrição

Esta mensagem é adicionada quando uma condição de correspondência de padrões usa argumentos com especificações COLLATE, pois eles não são compatíveis atualmente na função de expressão regular do Snowflake. Consequentemente, a cláusula COLLATE deve ser desativada para usar esta função, o que pode resultar em diferenças nos resultados.

Exemplo de código

Código de entrada:
PostgreSql
 CREATE TABLE collateTable (
col1 VARCHAR(20) COLLATE CASE_INSENSITIVE,
col2 VARCHAR(30) COLLATE CASE_SENSITIVE);

INSERT INTO collateTable values ('HELLO WORLD!', 'HELLO WORLD!');

SELECT
col1 SIMILAR TO 'Hello%' as ci,
col2 SIMILAR TO 'Hello%' as cs
FROM collateTable;
Copy
Resultados

CI

CS

TRUE

FALSE

Código de saída:

Snowflake
 CREATE TABLE collateTable (
col1 VARCHAR(20) COLLATE 'en-ci',
col2 VARCHAR(30) COLLATE 'en-cs'
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "01/16/2025",  "domain": "test" }}';

INSERT INTO collateTable
values ('HELLO WORLD!', 'HELLO WORLD!');

SELECT
RLIKE(COLLATE(
--** SSC-FDM-PG0011 - THE USE OF THE COLLATE COLUMN CONSTRAINT HAS BEEN DISABLED FOR THIS PATTERN-MATCHING CONDITION. **
col1, ''), 'Hello.*', 's') as ci,
RLIKE(COLLATE(
--** SSC-FDM-PG0011 - THE USE OF THE COLLATE COLUMN CONSTRAINT HAS BEEN DISABLED FOR THIS PATTERN-MATCHING CONDITION. **
col2, ''), 'Hello.*', 's') as cs
FROM
collateTable;
Copy
Resultados

CI

CS

FALSE

FALSE

Práticas recomendadas

  • Se você precisa de equivalência para esses cenários, pode adicionar manualmente os seguintes parâmetros à função para obter equivalência funcional:

    Parâmetro

    Descrição

    c

    Correspondência com distinção entre maiúsculas e minúsculas

    i

    Correspondência sem distinção entre maiúsculas e minúsculas

  • Para obter mais informações, consulte o seguinte link.

SSC-FDM-PG0012

A restrição NOT NULL foi removida. Atribuir NULL a esta variável não causará mais uma falha.

Descrição

No PostgreSql, especificar a restrição NOT NULL garante que atribuir um valor nulo a uma variável resulte em um erro de tempo de execução. Como essa cláusula não existe no Snowflake, ela é removida durante a transformação, e atribuir NULL a esta variável não causará mais falha na execução.

Exemplo de código

Código de entrada:
PostgreSql
 CREATE OR REPLACE PROCEDURE variable_Not_Null()
LANGUAGE plpgsql
AS $$
DECLARE
    v_notnull VARCHAR NOT NULL DEFAULT 'Test default';
BEGIN
    v_notnull := NULL;
    -- Procedure logic
END;
$$;
Copy
Resultado

[22004] ERROR: NULL não pode ser atribuído à variável «v_notnull» declarada como NOT NULL

Generated Code:
Snowflake
 CREATE OR REPLACE PROCEDURE variable_Not_Null ()
RETURNS VARCHAR
LANGUAGE SQL
AS $$
DECLARE
    --** SSC-FDM-PG0012 - NOT NULL CONSTRAINT HAS BEEN REMOVED. ASSIGNING NULL TO THIS VARIABLE WILL NO LONGER CAUSE A FAILURE. **
    v_notnull VARCHAR DEFAULT 'Test default';
BEGIN
    v_notnull := NULL;
    -- Procedure logic
END;
$$;
Copy
Result

Observação

Esta atribuição não falhará no Snowflake.

Práticas recomendadas

  • Revise a lógica do procedimento para garantir que esta variável não receba um valor NULL.

SSC-FDM-PG0013

Função sintaticamente compatível com o Snowflake, mas pode apresentar diferenças funcionais.

Descrição

Esta mensagem de diferença funcional indica que, embora o Snowflake suporte a sintaxe da função (diretamente ou por meio de um mapeamento equivalente), o comportamento dela pode ser diferente do original em algumas situações.

Exemplo de código

Código de entrada:
PostgreSql
SELECT
    LISTAGG(skill) WITHIN GROUP (ORDER BY skill) OVER (PARTITION BY
    employee_name) AS employee_skills
FROM
    employees;
Copy
Código gerado:
Snowflake
SELECT
--** SSC-FDM-PG0013 - FUNCTION SYNTACTICALLY SUPPORTED BY SNOWFLAKE BUT MAY HAVE FUNCTIONAL DIFFERENCES **
LISTAGG(skill) WITHIN GROUP (ORDER BY skill) OVER (PARTITION BY
employee_name) AS employee_skills
FROM
    employees;
Copy

Práticas recomendadas

  • Avalie com cuidado o comportamento funcional em busca de resultados inesperados, pois podem ocorrer diferenças apenas em cenários específicos.

SSC-FDM-PG0014

Pseudotipo desconhecido transformado em tipo de texto.

Descrição

Esta mensagem de diferença funcional indica que o pseudotipo UNKNOWN utilizado no PostgreSQL não é compatível com o Snowflake e foi transformado em um tipo de texto.

Exemplo de código

Código de entrada:
PostgreSql
CREATE TABLE PSEUDOTYPES
(
  COL1 UNKNOWN
)
Copy
Código gerado:
Snowflake
CREATE TABLE PSEUDOTYPES (
  COL1 TEXT /*** SSC-FDM-PG0014 -  UNKNOWN PSEUDOTYPE TRANSFORMED TO TEXT TYPE ***/
)
Copy

Práticas recomendadas

  • Avalie com cuidado os usos das colunas com tipos de dados desconhecidos, pois podem ocorrer diferenças em cenários específicos.

SSC-FDM-PG0015

O comando PSQL não é aplicável no Snowflake.

Descrição

No Snowflake, os comandos PSQL não são aplicáveis. Embora o comando PSQL original não seja mais necessário para a execução, o SnowConvert AI o mantém como comentário.

Código de exemplo

Código de entrada:
 \set ON_ERROR_STOP TRUE
Copy
Código gerado:
 ----** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. COMMAND OPTION **
--\set ON_ERROR_STOP TRUE
Copy

SSC-FDM-PG0016

Matriz fortemente tipada transformada em ARRAY sem verificação de tipo.

Descrição

O SnowConvert AI adicionará este aviso porque o PostgreSQL é compatível com matrizes de qualquer tipo de base integrado ou definido pelo usuário, tipo de enumeração, tipo composto, tipo de intervalo ou domínio, enquanto o Snowflake não tem essa compatibilidade. No Snowflake, cada valor em uma matriz semiestruturada é do tipo VARIANT.

Código de exemplo

Código de entrada:
CREATE TABLE sal_emp (
    name            text,
    pay_by_quarter  integer[],
    schedule        text[][]
);
Copy
Código gerado:
CREATE TABLE sal_emp (
    name            text,
    pay_by_quarter ARRAY /*** SSC-FDM-PG0016 - STRONGLY TYPED ARRAY 'INTEGER[]' TRANSFORMED TO ARRAY WITHOUT TYPE CHECKING ***/,
    schedule ARRAY /*** SSC-FDM-PG0016 - STRONGLY TYPED ARRAY 'TEXT[][]' TRANSFORMED TO ARRAY WITHOUT TYPE CHECKING ***/
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "06/03/2025",  "domain": "no-domain-provided" }}';
Copy

SSC-FDM-PG0017

A função definida pelo usuário que retorna um vazio foi transformada em um procedimento do Snowflake.

Descrição

O SnowConvert AI vai gerar um aviso para qualquer função que retorne um vazio. Isso ocorre porque as funções que retornam um vazio normalmente indicam um procedimento em vez de uma operação que produz valor, o que às vezes pode exigir tratamento especial durante a conversão.

Código de exemplo

Código de entrada:
CREATE OR REPLACE FUNCTION log_user_activity(
    user_id_param INT,
    action_param TEXT
)
RETURNS VOID AS $$
BEGIN
    INSERT INTO user_activity_log (user_id, action, activity_timestamp)
    VALUES (user_id_param, action_param, NOW());
END;
$$ LANGUAGE plpgsql;
Copy
Código gerado:
--** SSC-FDM-PG0017 - USER DEFINED FUNCTION THAT RETURNS VOID WAS TRANSFORMED TO SNOWFLAKE PROCEDURE **
CREATE OR REPLACE PROCEDURE log_user_activity (
user_id_param INT,
    action_param TEXT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "07/23/2025",  "domain": "no-domain-provided" }}'
AS $$
BEGIN
    INSERT INTO user_activity_log (user_id, action, activity_timestamp)
    VALUES (:user_id_param, : action_param, CURRENT_TIMESTAMP());
END;
$$;
Copy

SSC-FDM-PG0018

A instrução Analyze foi transformada em comentário, o que não se aplica ao Snowflake.

Descrição

O SnowConvert AI sinaliza as instruções ANALYZE com um aviso e as transforma em comentário. Embora ANALYZE seja utilizado no PostgreSQL para coletar estatísticas da tabela, o Snowflake gerencia automaticamente esse processo, tornando a instrução redundante e geralmente desnecessária após a conversão.

Código de exemplo

Código de entrada:
ANALYZE customers (first_name, last_name)
Copy
Código gerado:
----** SSC-FDM-PG0018 - ANALYZE STATEMENT IS COMMENTED OUT, WHICH IS NOT APPLICABLE IN SNOWFLAKE. **
--ANALYZE customers (first_name, last_name)
Copy

Práticas recomendadas