SnowConvert : problèmes liés à Postgres

SSC-EWI-PG0003

Gravité

Faible

Description

PostgreSQL prend en charge l’héritage de tables, mais cette fonction n’est pas disponible dans Snowflake. Pour en savoir plus sur l’héritage de la table PostgreSQL, rendez-vous ici.

Exemple de code

Code d’entrée :

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

Code de sortie :

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

Recommandations

SSC-EWI-PG0013

Gravité

Medium

Description

Cette erreur se produit lors de la conversion d’une exception Raise en une procédure stockée personnalisée.

Veuillez noter que lever des exceptions en dehors d’un bloc d’exception n’est pas pris en charge dans Snowflake. En effet, Snowflake n’autorise que la création de nouvelles exceptions avec des messages littéraux et ne prend pas en charge la création d’exceptions personnalisées basées sur des données dynamiques.

Exemple de code

Code d’entrée :

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

Code de sortie :

!!!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

Les fonctions définies par l’utilisateur (UDFs) suivantes sont utilisées au cours du processus de transformation :

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

Recommandations

SSC-EWI-PG0006

Gravité

Medium

Description

Cette erreur se produit lorsqu’une variable dans une boucle FOR est référencée à l’aide d’un nom d’étiquette. Snowflake ne permet pas de faire référence à des variables en utilisant des noms qualifiés dans les FOR loops.

Exemple de code

Code d’entrée :

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

Code de sortie :

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

Recommandations

SSC-EWI-PG0002

Gravité

Faible

Description

Les paramètres d’index suivants dans les contraintes ne sont pas compatibles avec Snowflake.

  • INCLUDE : ajoute des données ou des objets supplémentaires à l’opération en cours

  • WITH : spécifie des propriétés ou des conditions supplémentaires

  • USING INDEX TABLESPACE : définit le tablespace dans lequel les index seront stockés

Exemple de code

Code d’entrée :

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

Code de sortie :

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

Recommandations

SSC-EWI-PG0012

Description

L’option NOT VALID, qui permet d’ajouter ou de modifier des contraintes sans valider les données existantes, n’est pas disponible dans Snowflake. Cette fonction PostgreSQL vous permet d’ajouter des contraintes tout en ignorant la validation des enregistrements existants.

Exemple de code

Code d’entrée :

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

Code de sortie :

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

Recommandations

  • Aucune action n’est requise de votre part.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-PG0009

Gravité

Faible

Description

Des commentaires peuvent être ajoutés à différents objets du code original. Cependant, comme certains de ces objets n’existent pas dans Snowflake, la possibilité d’y ajouter des commentaires n’est pas disponible. Pour éviter les erreurs, le code qui gère ces scénarios de commentaires non pris en charge a été désactivé.

Exemple de code

Code d’entrée :

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

Code de sortie :

!!!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

Recommandations

SSC-EWI-PG0008

Gravité

Élevé

Description

La fonction to_char de Snowflake ne prend pas en charge le paramètre interval lors de la conversion des types de données date et heure au format texte.

Exemple de code

Code d’entrée :

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

Code de sortie :

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

Pour de plus amples informations, veuillez vous référer à

  • Documentation de la fonction PostgreSQL to_char.

  • Documentation de la fonction Snowflake to_char.

Recommandations

SSC-EWI-PG0005

Gravité

Medium

Description

Cette erreur se produit parce que Snowflake a des exigences différentes en matière de format de date et de format numérique dans certaines fonctions par rapport à la langue source.

Les éléments suivants du format de la date et de l’heure peuvent fonctionner différemment dans Snowflake par rapport à d’autres bases de données :

Date / Heure

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.

Pour plus de détails, veuillez consulter la documentation sur les formats de date et d’heure de PostgreSQL.

La transformation de la fonction TO_CHAR prend en charge la plupart des éléments de format. Pour une liste complète des éléments de format pris en charge et de leurs mappages correspondants, veuillez consulter la spécification de traduction SnowConvert for Redshift : une spécification de traduction

Numérique

Modèle

Description

PR

valeur négative entre crochets d’angle

RN

Chiffre romain (entrée entre 1 et 3999)

TH ou th

suffixe du nombre ordinal

V

décaler le nombre de chiffres spécifié (voir notes)

EEEE

exposant pour la notation scientifique

Pour plus de détails, veuillez consulter la documentation sur les formats numériques PostgreSQL.

Exemple de code

Code d’entrée :

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

Code de sortie :

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

Recommandations

SSC-EWI-PG0015

Gravité

Medium

Description

Dans PostgreSQL, vous pouvez utiliser une instruction FETCH pour afficher les valeurs des lignes récupérées directement dans la console sans utiliser de clause INTO. Cependant, lorsque vous utilisez Snowflake, l’instruction FETCH doit inclure une clause INTO pour spécifier les variables dans lesquelles les valeurs récupérées seront stockées.

Lorsque SnowConvert rencontre une instruction FETCH sans clause INTO, il génère un message d’erreur, d’avertissement ou d’information (EWI) pour informer les utilisateurs que cette syntaxe FETCH n’est pas prise en charge.

Exemple de code

Code d’entrée :

FETCH PRIOR FROM cursor1;
Copy

Code de sortie :

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

Recommandations

SSC-EWI-PG0001

Gravité

Medium

Description

Cette erreur se produit parce que SnowConvert ne prend pas en charge la fonction age().

Exemple de code

Code d’entrée :

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

Code de sortie :

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

Recommandations

  • La fonction Datediff permet de calculer les différences de temps entre les dates. Bien qu’elle puisse être utilisée pour obtenir des plages de dates spécifiques, vous devrez personnaliser la mise en œuvre pour chaque cas d’utilisation. Pour plus d’informations, consultez la documentation de Snowflake sur Datediff.

  • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-PG0011

Gravité

Faible

Description

Les instructions de séquence PostgreSQL ont certaines options qui ne sont pas compatibles avec la fonctionnalité de Snowflake.

Les fonctions suivantes ne sont pas prises en charge actuellement :

  • Unlogged : les séquences ne sont pas écrites dans le Write-Ahead Log (WAL)

  • AS <data_type> : spécifie le type de données de la séquence

  • MinValue : définit la valeur minimale de la séquence

  • MaxValue : définit la valeur maximale de la séquence

  • No MinValue : supprime la limite de la valeur minimale

  • No MaxValue : supprime la limite de la valeur maximale

  • Cache : spécifie le nombre de numéros de séquence à pré-allouer en mémoire

  • Cycle : permet à la séquence de redémarrer lorsqu’elle atteint sa limite

  • Owner by : attribue la propriété de la séquence à un utilisateur spécifique

Exemple de code

Code d’entrée :

CREATE UNLOGGED SEQUENCE sequence_name;
Copy

Code de sortie :

--** 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

Recommandations

SSC-EWI-PG0010

Gravité

Faible

Description

Lorsque PostgreSQL crée une séquence temporaire, celle-ci n’existe que pendant la session en cours et est automatiquement supprimée à la fin de la session. Comme Snowflake ne prend pas en charge es séquences temporaires, SC les convertit en séquences régulières. Cela peut entraîner des conflits de noms si une séquence portant le même nom existe déjà dans Snowflake, ce qui provoque une erreur.

Exemple de code

Code d’entrée :

CREATE TEMPORARY SEQUENCE sequence1;
CREATE TEMP SEQUENCE sequence2;
Copy

Code de sortie :

--** 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

Recommandations

  • Si vous rencontrez des problèmes lors de la création, essayez de renommer la séquence pour éviter les conflits de noms.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com.

SSC-EWI-PG0004

Gravité

Medium

Description

La contrainte EXCLUDE, qui est disponible dans PostgreSQL, n’est pas prise en charge actuellement par Snowflake.

Exemple de code

Code d’entrée :

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

Code de sortie :

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

Recommandations

SSC-EWI-PG0014

Gravité

Modéré

Description

Dans Snowflake, l’instruction du curseur FETCH récupère la ligne suivante d’un curseur. Lors de la conversion du code, SnowConvert transforme les commandes de navigation du curseur qui sont équivalentes à FETCH NEXT puisqu’elles remplissent la même fonction dans Snowflake.

  • FETCH NEXT : récupère la ligne suivante dans le jeu de résultats

  • FETCH FORWARD : permet de récupérer la ligne suivante

  • FETCH RELATIVE 1 : avance d’une ligne à partir de la position actuelle

  • FETCH (sans direction) : utilise le mouvement vers l’avant par défaut pour obtenir la ligne suivante

Toute orientation autre que celle par défaut n’est pas prise en charge. Si elle est utilisée, l’instruction FETCH sera accompagnée d’un message d’erreur, d’avertissement ou d’information (EWI).

Exemple de code

Code d’entrée :

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

Code de sortie :

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

Recommandations