SnowConvert: Problemas do Postgres

SSC-EWI-PG0003

Gravidade

Low

Descrição

O PostgreSQL suporta herança de tabela, mas esse recurso não está disponível no Snowflake. Para saber mais sobre a herança de tabela do PostgreSQL, veja aqui.

Exemplo de código

Código de entrada:

ALTER TABLE Table1
ADD CONSTRAINT const3 UNIQUE (zip);
Copy

Código de saída:

!!!RESOLVE EWI!!! /*** SSC-EWI-PG0003 - TABLE INHERITANCE IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
ALTER TABLE Table1
ADD CONSTRAINT const3 UNIQUE (zip);
Copy

Recomendações

SSC-EWI-PG0013

Gravidade

Medium

Descrição

Esse erro ocorre ao converter uma exceção Raise em um procedimento armazenado personalizado.

Observe que a criação de exceções fora de um bloco de exceções não é compatível com o Snowflake. Isso ocorre porque o Snowflake só permite a criação de novas exceções com mensagens literais e não oferece suporte à criação de exceções personalizadas com base em dados dinâmicos.

Exemplo de código

Código de entrada:

CREATE FUNCTION FunctionName1() RETURNS void
AS
$$
DECLARE
	v_var1        	character varying(50);
	v_var2        	character varying(50);
BEGIN
	v_var1 := 'exception1';
	v_var2 := 'exception2';
	RAISE EXCEPTION 'Exception %',v_var1;
    EXCEPTION
      WHEN OTHERS THEN
         RAISE EXCEPTION '%',v_var2;
         RETURN;
END;
$$
    LANGUAGE plpgsql NO SQL;
Copy

Código de saída:

!!!RESOLVE EWI!!! /*** SSC-EWI-GP0002 - NON-RETURNING FUNCTION TRANSLATED TO STORED PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE FunctionName1 () RETURNS STRING
    LANGUAGE SQL
AS
$$
DECLARE
	v_var1        	character varying(50);
	v_var2        	character varying(50);
BEGIN
	v_var1 := 'exception1';
	v_var2 := 'exception2';
	LET SC_RAISE_MESSAGE VARCHAR;
	SC_RAISE_MESSAGE := STRING_FORMAT_UDF('Exception %', array_construct(:v_var1));
	!!!RESOLVE EWI!!! /*** SSC-EWI-PG0013 - RAISE EXCEPTION TRANSLATED TO USER-DEFINED STORED PROCEDURE CALL. ***/!!!
	CALL RAISE_MESSAGE_UDF('EXCEPTION', :SC_RAISE_MESSAGE);
	RETURN 'SUCCESS';
    EXCEPTION
      WHEN OTHER THEN
		SC_RAISE_MESSAGE := STRING_FORMAT_UDF('%', array_construct(:v_var2));
		!!!RESOLVE EWI!!! /*** SSC-EWI-PG0013 - RAISE EXCEPTION TRANSLATED TO USER-DEFINED STORED PROCEDURE CALL. ***/!!!
		CALL RAISE_MESSAGE_UDF('EXCEPTION', :SC_RAISE_MESSAGE);
		RAISE;
         RETURN;
END;
$$;
Copy

As seguintes funções definidas pelo usuário (UDFs) são usadas durante o processo de transformação:

CREATE OR REPLACE FUNCTION STRING_FORMAT_UDF(PATTERN VARCHAR, ARGS VARIANT)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "udf",  "convertedOn": "09/09/2024" }}'
AS
$$
	var placeholder_str = "{%}";
	var result = PATTERN.replace(/(?<!%)%(?!%)/g, placeholder_str).replace("%%","%");
	for (var i = 0; i < ARGS.length; i++)
	{
		result = result.replace(placeholder_str, ARGS[i]);
	}
	return result;
$$;
Copy
CREATE OR REPLACE PROCEDURE RAISE_MESSAGE_UDF(LEVEL VARCHAR, MESSAGE VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "udf",  "convertedOn": "09/09/2024" }}'
AS
$$
  BEGIN
    RETURN 'Logged message: ' || LEVEL || ' - ' || MESSAGE;
  END;
$$;
Copy

Recomendações

SSC-EWI-PG0006

Gravidade

Medium

Descrição

Esse erro ocorre quando uma variável em um loop FOR é referenciada usando um nome de rótulo. O Snowflake não permite que as variáveis sejam referenciadas usando nomes qualificados nos loops FOR.

Exemplo de código

Código de entrada:

CREATE OR REPLACE PROCEDURE procedure1(out result VARCHAR(100))
LANGUAGE plpgsql
AS $$
BEGIN
result := '<';
<<outer_loop>>
for i in 1..3 loop
  <<inner_loop>>
  for i in 4..6 loop
  result := result || '(' || outer_loop.i || ', ' || i || ')';
  end loop inner_loop;
end loop outer_loop;
result := result || '>';
END;
$$;
Copy

Código de saída:

CREATE OR REPLACE PROCEDURE procedure1 (result VARCHAR(100))
RETURNS VARIANT
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "02/16/2025",  "domain": "test" }}'
AS $$
BEGIN
result := '<';
for i in 1 TO 3 loop
  for i in 4 TO 6 loop
  result := result || '(' ||
                             !!!RESOLVE EWI!!! /*** SSC-EWI-PG0006 - REFERENCE TO A VARIABLE USING THE LABEL IS NOT SUPPORTED BY SNOWFLAKE. ***/!!! outer_loop.i || ', ' || i || ')';
  end loop inner_loop;
end loop outer_loop;
result := result || '>';
  RETURN OBJECT_CONSTRUCT('result', :result);
END;
$$;
Copy

Recomendações

SSC-EWI-PG0002

Gravidade

Low

Descrição

Os seguintes parâmetros de índice em restrições não são compatíveis com o Snowflake.

  • INCLUDE: Adiciona dados ou objetos adicionais à operação atual

  • WITH: Especifica propriedades ou condições adicionais

  • USING INDEX TABLESPACE: Define o espaço de tabela onde os índices serão armazenados

Exemplo de código

Código de entrada:

CREATE TABLE Table1 (
    code        char(5),
    date_prod   date,
    CONSTRAINT production UNIQUE(date_prod) INCLUDE(code)
);

CREATE TABLE Table2 (
    name    varchar(40),
    UNIQUE(name) WITH (fillfactor=70)
);

CREATE TABLE Table3 (
    name    varchar(40),
    PRIMARY KEY(name) USING INDEX TABLESPACE tablespace_name
);
Copy

Código de saída:

CREATE TABLE Table1 (
    code        char(5),
    date_prod   date,
    CONSTRAINT production UNIQUE(date_prod)
                                            !!!RESOLVE EWI!!! /*** SSC-EWI-PG0002 - INCLUDE PARAMETER NOT APPLICABLE. CONSTRAINT INDEX PARAMETERS ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!! INCLUDE(code)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';

CREATE TABLE Table2 (
    name    varchar(40),
    UNIQUE(name)
                 !!!RESOLVE EWI!!! /*** SSC-EWI-PG0002 - WITH PARAMETER NOT APPLICABLE. CONSTRAINT INDEX PARAMETERS ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!! WITH (fillfactor=70)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';

CREATE TABLE Table3 (
    name    varchar(40),
    PRIMARY KEY(name)
                      !!!RESOLVE EWI!!! /*** SSC-EWI-PG0002 - USING PARAMETER NOT APPLICABLE. CONSTRAINT INDEX PARAMETERS ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!! USING INDEX TABLESPACE tablespace_name
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';
Copy

Recomendações

SSC-EWI-PG0012

Descrição

A opção NOT VALID, que permite adicionar ou modificar restrições sem validar os dados existentes, não está disponível no Snowflake. Esse recurso do PostgreSQL permite adicionar restrições e ignorar a validação dos registros existentes.

Exemplo de código

Código de entrada:

ALTER TABLE Table1 *
ADD CONSTRAINT const UNIQUE (zip) NOT VALID;
Copy

Código de saída:

ALTER TABLE Table1
ADD CONSTRAINT const UNIQUE (zip)
                                  !!!RESOLVE EWI!!! /*** SSC-EWI-PG0012 - NOT VALID CONSTRAINT OPTION IS NOT SUPPORTED BY SNOWFLAKE. ***/!!! NOT VALID;
Copy

Recomendações

SSC-EWI-PG0009

Gravidade

Low

Descrição

Os comentários podem ser adicionados a diferentes objetos no código original. No entanto, como alguns desses objetos não existem no Snowflake, a capacidade de adicionar comentários a eles não está disponível. Para evitar erros, o código que lida com esses cenários de comentários sem suporte foi desativado.

Exemplo de código

Código de entrada:

COMMENT ON RULE rule_name on TABLE_NAME IS 'this is a comment';
Copy

Código de saída:

!!!RESOLVE EWI!!! /*** SSC-EWI-PG0009 - COMMENT ON 'RULE' IS NOT SUPPORTED BY SNOWFLAKE. ***/!!!
COMMENT ON RULE rule_name on TABLE_NAME IS 'this is a comment';
Copy

Recomendações

SSC-EWI-PG0008

Gravidade

High

Descrição

A função to_char do Snowflake não é compatível com o parâmetro interval ao converter tipos de dados de data e hora em formato de texto.

Exemplo de código

Código de entrada:

SELECT to_char(interval '15h 2m 12s', 'HH24:MI:SS');
Copy

Código de saída:

SELECT to_char(INTERVAL '15h, 2m, 12s', 'HH24:MI:SS') !!!RESOLVE EWI!!! /*** SSC-EWI-PG0008 - THE USE OF INTERVAL WITHIN TO_CHAR IS NOT SUPPORTED BY SNOWFLAKE. ***/!!!;
Copy

Para obter informações adicionais, consulte

  • Documentação da função to_char do PostgreSQL.

  • Documentação da função to_char do Snowflake.

Recomendações

SSC-EWI-PG0005

Gravidade

Medium

Descrição

Esse erro ocorre porque o Snowflake tem requisitos de formato numérico e de data diferentes em determinadas funções em comparação com a linguagem de origem.

Os seguintes elementos de formato de data e hora podem funcionar de forma diferente no Snowflake em comparação com outros bancos de dados:

Data / Hora

Format ElementDescription
HHHour of day (01–12).
MSMillisecond (000–999).
USMicrosecond (000000–999999).
SSSS, SSSSSSeconds past midnight (0–86399).
Y,YYYYear (4 or more digits) with comma.
YYYLast 3 digits of year.
YLast digit of year.
IYYYISO 8601 week-numbering year(4 or more digits).
IYYLast 3 digits of ISO 8601 week-numbering year.
IYLast 2 digits of ISO 8601 week-numbering year.
ILast digit of ISO 8601 week-numbering year.
BC, bc, AD or adEra indicator (without periods).
B.C., b.c., A.D. or a.d.Era indicator (with periods).
MONTHFull upper case month name (blank-padded to 9 chars).
MonthFull capitalized month name (blank-padded to 9 chars).
monthFull lower case month name (blank-padded to 9 chars).
DAYFull upper case day name (blank-padded to 9 chars).
DayFull capitalized day name (blank-padded to 9 chars).
dayFull lower case day name (blank-padded to 9 chars).
DDDDay of year (001–366).
IDDDDay of ISO 8601 week-numbering year (001–371; day 1 of the year is Monday of the first ISO week).
DDay of the week, Sunday (1) to Saturday (7).
IDISO 8601 day of the week, Monday (1) to Sunday (7).
WWeek of month (1–5) (the first week starts on the first day of the month).
WWWeek number of year (1–53) (the first week starts on the first day of the year).
IWWeek number of ISO 8601 week-numbering year (01–53; the first Thursday of the year is in week 1).
CCCentury (2 digits) (the twenty-first century starts on 2001-01-01).
JJulian Date.
QQuarter.
RMMonth in upper case Roman numerals (I–XII; I=January).
rmMonth in lower case Roman numerals (i–xii; i=January).
TZUpper case time-zone abbreviation (only supported in to_char).
tzLower case time-zone abbreviation (only supported in to_char).
TZHTime-zone hours.
TZMTime-zone minutes.
OFTime-zone offset from UTC (only supported in to_char).
FM prefixFill mode (suppress leading zeroes and padding blanks).
TH suffixUpper case ordinal number suffix.
th suffixLower case ordinal number suffix.
FX prefixFixed format global option (see usage notes).
TM prefixTranslation mode (use localized day and month names based on lc_time).
SP suffixSpell mode.

Para obter mais detalhes, consulte a documentação sobre formatos de data/hora emPostgreSQL.

A transformação da função TO_CHAR é compatível com a maioria dos elementos de formato. Para obter uma lista completa dos elementos de formato compatíveis e seus mapeamentos correspondentes, consulte a especificação de conversão

Numérico

Padrão

Descrição

PR

valor negativo entre colchetes angulares

RN

Numeral romano (entrada entre 1 e 3999)

TH ou o

sufixo de número ordinal

V

deslocamento do número especificado de dígitos (consulte as observações)

EEEE

expoente para notação científica

Para obter mais detalhes, consulte a documentação sobre formatos numéricos emPostgreSQL.

Exemplo de código

Código de entrada:

SELECT
   DATE_TRUNC('decade', TIMESTAMP '2017-03-17 02:09:30'),
   DATE_TRUNC('century', TIMESTAMP '2017-03-17 02:09:30'),
   DATE_TRUNC('millennium', TIMESTAMP '2017-03-17 02:09:30');
Copy

Código de saída:

SELECT
      !!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - DECADE FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
      DATE_TRUNC('decade', TIMESTAMP '2017-03-17 02:09:30'),
      !!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - CENTURY FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
      DATE_TRUNC('century', TIMESTAMP '2017-03-17 02:09:30'),
      !!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - MILLENNIUM FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
      DATE_TRUNC('millennium', TIMESTAMP '2017-03-17 02:09:30');
Copy

Recomendações

SSC-EWI-PG0015

Gravidade

Medium

Descrição

Em PostgreSQL, é possível usar uma instruçãoFETCH para exibir os valores de linha obtidos diretamente no console sem usar uma cláusula INTO. No entanto, ao usar o Snowflake, a instruçãoFETCH deve incluir uma cláusula INTO para especificar as variáveis em que os valores obtidos serão armazenados.

Quando o SnowConvert encontrar uma instrução FETCH sem uma cláusula INTO, ele gerará uma mensagem de erro, aviso ou informação (EWI) para informar aos usuários que essa sintaxe FETCH não é compatível.

Exemplo de código

Código de entrada:

FETCH PRIOR FROM cursor1;
Copy

Código de saída:

!!!RESOLVE EWI!!! /*** SSC-EWI-PG0015 - FETCH CURSOR WITHOUT TARGET VARIABLES IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FETCH PRIOR FROM cursor1;
Copy

Recomendações

SSC-EWI-PG0001

Gravidade

Medium

Descrição

Esse erro ocorre porque o SnowConvert não é compatível com a função age().

Exemplo de código

Código de entrada:

SELECT
   age(date1::date, date2::date)
FROM
   Table1;
Copy

Código de saída:

SELECT
      !!!RESOLVE EWI!!! /*** SSC-EWI-PG0001 - AGE IS NOT SUPPORTED ON SNOWFLAKE. ***/!!!
      age(date1::date, date2::date)
FROM
      Table1;
Copy

Recomendações

  • A função Datediff ajuda a calcular as diferenças de tempo entre as datas. Embora possa ser usado para obter intervalos de datas específicos, você precisará personalizar a implementação para cada caso de uso. Para obter informações detalhadas, consulte a documentação do Snowflake sobre Datediff.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-PG0011

Gravidade

Low

Descrição

As instruções de sequência PostgreSQL têm determinadas opções que não são compatíveis com a funcionalidade do Snowflake.

Os seguintes recursos não são suportados no momento:

  • Sem registro: As sequências não são gravadas no Write-Ahead Log (WAL)

  • AS <data_type>: Especifica o tipo de dados da sequência

  • MinValue: Define o valor mínimo para a sequência

  • MaxValue: Define o valor máximo para a sequência

  • No MinValue: Remove o limite mínimo de valor

  • No MaxValue: Remove o limite máximo de valor

  • Cache: Especifica quantos números de sequência devem ser pré-alocados na memória

  • Cycle: Permite que a sequência seja reiniciada ao atingir seu limite

  • Owner By: Atribui a propriedade da sequência a um usuário específico

Exemplo de código

Código de entrada:

CREATE UNLOGGED SEQUENCE sequence_name;
Copy

Código de saída:

--** SSC-FDM-PG0009 - THE SEQUENCE NEXTVAL PROPERTY SNOWFLAKE DOES NOT GUARANTEE GENERATING SEQUENCE NUMBERS WITHOUT GAPS. **
CREATE UNLOGGED !!!RESOLVE EWI!!! /*** SSC-EWI-PG0011 - 'UNLOGGED' IS NOT SUPPORTED BY SNOWFLAKE. ***/!!! SEQUENCE sequence_name;
Copy

Recomendações

SSC-EWI-PG0010

Gravidade

Low

Descrição

Quando o PostgreSQL cria uma sequência temporária, ela existe somente durante a sessão atual e é removida automaticamente quando a sessão termina. Como o Snowflake não oferece suporte a sequências temporárias, o SC as converte em sequências regulares. Isso pode causar conflitos de nomenclatura se uma sequência com o mesmo nome já existir no Snowflake, resultando em um erro.

Exemplo de código

Código de entrada:

CREATE TEMPORARY SEQUENCE sequence1;
CREATE TEMP SEQUENCE sequence2;
Copy

Código de saída:

--** SSC-FDM-PG0009 - THE SEQUENCE NEXTVAL PROPERTY SNOWFLAKE DOES NOT GUARANTEE GENERATING SEQUENCE NUMBERS WITHOUT GAPS. **
CREATE TEMPORARY !!!RESOLVE EWI!!! /*** SSC-EWI-PG0010 - CREATE TEMPORARY SEQUENCE IS NOT SUPPORTED BY SNOWFLAKE. ***/!!! SEQUENCE sequence1;


--** SSC-FDM-PG0009 - THE SEQUENCE NEXTVAL PROPERTY SNOWFLAKE DOES NOT GUARANTEE GENERATING SEQUENCE NUMBERS WITHOUT GAPS. **
 CREATE TEMP !!!RESOLVE EWI!!! /*** SSC-EWI-PG0010 - CREATE TEMPORARY SEQUENCE IS NOT SUPPORTED BY SNOWFLAKE. ***/!!! SEQUENCE sequence2;
Copy

Recomendações

  • Se encontrar problemas durante a criação, tente renomear a sequência para evitar conflitos de nomes.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com.

SSC-EWI-PG0004

Gravidade

Medium

Descrição

A restrição EXCLUDE, que está disponível em PostgreSQL, não é compatível com o Snowflake no momento.

Exemplo de código

Código de entrada:

CREATE TABLE Table1 (
    id      int,
    EXCLUDE USING gist (id WITH &&)
);
Copy

Código de saída:

CREATE TABLE Table1 (
    id      int,
    !!!RESOLVE EWI!!! /*** SSC-EWI-PG0004 - EXCLUDE CONSTRAINT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
    EXCLUDE USING gist (id WITH &&)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';
Copy

Recomendações

SSC-EWI-PG0014

Gravidade

Moderado

Descrição

No Snowflake, a instrução do cursorFETCH recupera a próxima linha de um cursor. Ao converter o código, o SnowConvert transforma os comandos de navegação do cursor que são equivalentes ao FETCH NEXT, pois executam a mesma função no Snowflake.

  • FETCH NEXT: Recupera a próxima linha do conjunto de resultados

  • FETCH FORWARD: Avança para recuperar a próxima linha

  • FETCH RELATIVE 1: Avança uma linha a partir da posição atual

  • FETCH (sem direção): Usa o movimento padrão para frente para obter a próxima linha

Não há suporte para qualquer orientação que não seja a padrão. Se usada, a instrução FETCH será marcada com uma mensagem de erro, aviso ou informação (EWI).

Exemplo de código

Código de entrada:

CREATE OR REPLACE PROCEDURE cursor_test()
AS $$
BEGIN
   FETCH FORWARD FROM cursor1 INTO my_var;
   FETCH FIRST FROM cursor1 INTO my_var;
   FETCH LAST FROM cursor1 INTO my_var;
END;
$$;
Copy

Código de saída:

CREATE OR REPLACE PROCEDURE cursor_test ()
RETURNS VARCHAR
AS $$
BEGIN
   FETCH
   	cursor1 INTO my_var;
   !!!RESOLVE EWI!!! /*** SSC-EWI-PG0014 - SNOWFLAKE SCRIPTING CURSORS DO NOT SUPPORT FETCH ORIENTATION. ***/!!!
   FETCH FIRST FROM cursor1 INTO my_var;
   !!!RESOLVE EWI!!! /*** SSC-EWI-PG0014 - SNOWFLAKE SCRIPTING CURSORS DO NOT SUPPORT FETCH ORIENTATION. ***/!!!
   FETCH LAST FROM cursor1 INTO my_var;
END;
$$;
Copy

Recomendações