SnowConvert AI - Différences fonctionnelles PostgreSQL

Note

SnowConvert AI pour PostgreSQL prend actuellement en charge l’évaluation et la traduction pour les TABLES et les VIEWS. Bien que SnowConvert AI puisse reconnaître d’autres types d’instructions, ces derniers ne sont pas complètement pris en charge.

Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-FDM-PG0001

FOUND pourrait avoir un comportement différent dans Snowflake dans certains scénarios.

Gravité

Faible

Description

La propriété FOUND dans PostgreSQL est une propriété basée sur la dernière requête exécutée. Elle peut être affectée par certaines instructions telles que les boucles INSERT, UPDATE, DELETE, MERGE, SELECTINTO, PERFORM, FETCH et FOR. Pour obtenir plus de détails sur cette propriété, consultez la documentation PostgreSQL.

Dans Snowflake, il n’existe pas de traduction directe pour cette propriété pour les scénarios suivants :

  • INSERT

  • UPDATE

  • DELETE

  • MERGE

Le code converti correspondra à la propriété SQLFOUND de Snowflake (Voici la documentation), car elle se comporte comme la propriété FOUND de PostgreSQL.

Pour les autres cas tels que :

  • SELECT INTO

  • PERFORM

  • FETCH

Le code converti correspondra à un UDF personnalisé (IS_FOUND_UDF) qui se comporte comme la propriété FOUND de PostgreSQL.

Cela se produit, car SQLFOUND modifie sa valeur uniquement si au moins une ligne est affectée par la dernière requête exécutée. Si la dernière requête ne modifie aucune ligne, elle ne change pas.

Alors que l’IS_FOUND_UDF ne fonctionne que pour les instructions qui renvoient des lignes, si aucune ligne n’est renvoyée, il renverra FALSE.

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

La dernière requête affecte une table, de sorte que SQLFOUND est le plus proche de la fonctionnalité PostgreSQL.

Exemple IS_FOUND_UDF
SELECT SampleColumn FROM SampleTable;
Copy

La dernière requête renverra une ligne mais ne modifiera rien, de sorte que l’IS_FOUND_UDF() est le plus proche de la fonctionnalité PostgreSQL.

Code source IS_FOUND_UDF
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

Exemple de code

Instruction 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
Instruction Update :
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
Instruction Delete :
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
Instruction Merge :
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
Instruction 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
Instruction Perform :
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
Instruction 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 converti en varchar.

Description

Cet avertissement est ajouté, car le type bpchar (« blank-padded char ») peut présenter une certaine différence d’équivalence fonctionnelle par rapport au type de données varchar dans Snowflake. Cependant, les deux types de données peuvent stocker les valeurs jusqu’à la longueur « n » de caractères et ne consommer le stockage que pour la quantité de données réellement stockées. La principale différence apparaît lorsqu’il y a des espaces vides à la fin des données : bpchar ne les stocke pas, contrairement à Snowflake.

C’est pourquoi nous pouvons utiliser la fonction RTRIM pour que ces espaces vides ne soient pas stockés. Cependant, il peut y avoir des cas où la fonctionnalité n’est pas complètement équivalente.

Exemple de code

Code d’entrée :
Définition des colonnes
CREATE TABLE table1 (
    col1 BPCHAR, 
    col2 BPCHAR(20)
);
Copy
Conversion explicite
SELECT 'Y'::BPCHAR;
SELECT 'Y   '::BPCHAR(20);
SELECT COL1::BPCHAR(20) FROM tbl;
Copy
Code généré :
Définition des colonnes
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
Conversion explicite
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

Meilleures pratiques

  • La fonction rtrim peut résoudre les différences de stockage si vous ne souhaitez pas que ces espaces vides soient stockés. Ce cas est géré dans la conversion explicite. Cependant, il peut y avoir d’autres scénarios où il doit être géré manuellement. Pour plus d’informations, référez-vous à la documentation de Snowflake sur RTRIM.

SSC-FDM-PG0003

Bytea converti en binary

Description

Cet avertissement est ajouté, car lorsque le type de données bytea est converti en binary, la limite de taille est considérablement réduite, de 1GB à 8MB.

Exemple de code

Code d’entrée :
CREATE TABLE tbl(
    col BYTEA
);
Copy
Code généré :
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

Meilleures pratiques

SSC-FDM-PG0004

Le format de sortie de la date peut varier.

Description

Le format de sortie de la date peut varier en fonction du type Timestamp et du timestamp_output_format utilisés. Consultez la documentation ici.

Exemple de code

Code d’entrée :
PostgreSQL
CREATE TABLE table1 (
    dt_update timestamp without time zone DEFAULT clock_timestamp()
);
Copy
Code généré :
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

Exemples

Exemple avec CREATE TABLE.

Code d’entrée :

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
Résultats

platform_id

dt_update

clock_timestamp

1

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

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

Code généré :
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
Résultats

PLATFORM_ID

DT_UPDATE

CURRENT_TIMESTAMP(3)

1

2023-02-05 20:52:30.082000000

2023-02-05 21:20:31.593

Exemple avec SELECT avec clock_timestamp().

Code d’entrée
PostgreSQL
select clock_timestamp();
Copy
Résultats

clock_timestamp

2023-02-05 23:24:13.740

Code généré
Snowflake
ALTER SESSION SET timestamp_output_format = 'YYYY-MM-DD HH24:MI:SS.FF';
select
    CURRENT_TIMESTAMP(3);
Copy
Résultats

CURRENT_TIMESTAMP(3)

2023-02-05 21:29:24.258

SSC-FDM-PG0005

La table UNLOGGED n’est pas prise en charge dans Snowflake. Les données écrites peuvent avoir des performances différentes.

Description

Les tables UNLOGGED de PostgreSQL offrent un avantage significatif en matière de vitesse en ignorant la journalisation anticipée (WAL). Cependant, leurs données ne sont pas répliquées vers des instances en miroir. Snowflake ne prend pas en charge cette fonctionnalité, de sorte que la clause UNLOGGED sera commentée.

Exemple de code

Code d’entrée :
PostgreSQL
CREATE UNLOGGED TABLE TABLE1 (
   COL1 integer 
);
Copy
Code généré :
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

Définir un chemin de recherche avec plusieurs schémas

Description

La définition d’un chemin de recherche avec plusieurs schémas n’est pas prise en charge dans Snowflake. Vous pouvez consulter la documentation ici.

Exemple de code

Code d’entrée :
PostgreSQL
 SET SEARCH_PATH TO schema1, schema2, schema3;
Copy
Code généré :
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 est converti en “” et peut avoir un comportement différent dans Snowflake.

Gravité

Faible

Description

Dans PostgreSQL, la suppression d’un commentaire est gérée en utilisant le terme NULL. Cependant, dans Snowflake, une méthode similaire pour supprimer un commentaire consiste à attribuer la valeur d’une chaîne vide '' pour fournir le même résultat. Cette approche garantit que le commentaire est effectivement mappé à une chaîne vide avec un comportement similaire.

Exemple de code

Code d’entrée :
PostgreSQL
 COMMENT ON TABLE mytable IS NULL;
Copy
Code généré :
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

Les sélections dans des tables non journalisées ne sont pas prises en charge par Snowflake.

Description

Select Into n’est pas pris en charge par Snowflake. Cette fonctionnalité a été émulée avec CREATE TABLE AS. En outre, Snowflake utilise toujours les journaux des transactions pour protéger les tables et garantir l’intégrité et la récupération des données. Par conséquent, les tables avec l’option UNLOGGED ne sont pas prises en charge par Snowflake.

Exemple de code

Code d’entrée :
PostgreSQL
select column1
      into UNLOGGED NewTable
      from oldTable;
Copy
Code généré :
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

La propriété de séquence nextval ne garantit pas la génération de numéros de séquence sans espaces.

Description

Snowflake ne garantit pas la génération de numéros de séquence sans espaces. Les nombres générés augmentent systématiquement en valeur (ou diminuent en valeur si la taille de l’étape est négative), mais ne sont pas nécessairement contigus.

Exemple de code

Code d’entrée :
PostgreSQL
 SELECT nextval('seq1');
Copy
Code généré :
Snowflake
 SELECT seq1.nextval /*** SSC-FDM-PG0009 - THE SEQUENCE NEXTVAL PROPERTY SNOWFLAKE DOES NOT GUARANTEE GENERATING SEQUENCE NUMBERS WITHOUT GAPS. ***/;
Copy

SSC-FDM-PG0010

Les résultats peuvent varier selon le comportement de la fonction bitwise de Snowflake.

Description

Les opérateurs bitwise << and >> sont convertis en fonctions Snowflake BITSHIFTLEFT et BITSHIFTRIGHT correspondantes. Toutefois, en raison des différences dans la manière dont ces fonctions gèrent les expressions, les résultats peuvent différer de ceux dans PostgreSQL.

Exemple de code

Code d’entrée :
PostgreSql
 SELECT 1 << 127 AS resultShiftedLeft, 16 >> 32 AS resultShiftedRight;
Copy
Résultat

resultShiftedLeft

resultShiftedRight

-2147483648

16

Code généré :
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
Résultat

resultShiftedLeft

resultShiftedRight

-170141183460469231731687303715884105728

0

SSC-FDM-PG0011

L’utilisation de la contrainte de colonne COLLATE a été désactivée pour cette condition de correspondance de modèles.

Description

Ce message est ajouté lorsqu’une condition de correspondance de modèles utilise des arguments avec des spécifications COLLATE, car elles ne sont pas actuellement prises en charge dans la fonction d’expression régulière de Snowflake. Par conséquent, la clause COLLATE doit être désactivée pour utiliser cette fonction, ce qui peut entraîner des différences dans les résultats.

Exemple de code

Code d’entrée :
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
Résultats

CI

CS

TRUE

FALSE

Code de sortie :

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
Résultats

CI

CS

FALSE

FALSE

Meilleures pratiques

  • Si vous avez besoin d’une équivalence pour ces scénarios, vous pouvez ajouter manuellement les paramètres suivants à la fonction pour obtenir l’équivalence fonctionnelle :

    Paramètre

    Description

    c

    Correspondance sensible à la casse

    i

    Correspondance non sensible à la casse

  • Pour plus d’informations, veuillez vous référer au [lien] suivant(https://docs.snowflake.com/fr/sql-reference/functions-regexp#specifying-the-parameters-for-the-regular-expression).

SSC-FDM-PG0012

La contrainte NOT NULL a été supprimée. Attribuer NULL à cette variable ne provoquera plus d’échec.

Description

Dans PostgreSql, spécifier la contrainte NOT NULL garantit que l’attribution d’une valeur nulle à une variable entraîne une erreur d’exécution. Comme cette clause n’existe pas dans Snowflake, elle est supprimée lors de la transformation, et l’attribution de NULL à cette variable ne provoquera plus d’échec à l’exécution.

Exemple de code

Code d’entrée :
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
Résultat

[22004] ERROR: NULL ne peut pas être attribué à la variable « v_notnull » déclarée 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

Remarque

Cette attribution n’échouera pas dans Snowflake.

Meilleures pratiques

  • Examinez la logique de la procédure pour vous assurer qu’aucune valeur NULL n’est attribuée à cette variable.

SSC-FDM-PG0013

Fonction syntaxiquement prise en charge par Snowflake, mais pouvant présenter des différences fonctionnelles

Description

Ce message de différence fonctionnelle indique que si Snowflake prend en charge la syntaxe de la fonction (directement ou via un mappage équivalent), son comportement peut être différent du comportement d’origine dans certaines situations.

Exemple de code

Code d’entrée :
PostgreSql
SELECT
    LISTAGG(skill) WITHIN GROUP (ORDER BY skill) OVER (PARTITION BY
    employee_name) AS employee_skills
FROM
    employees;
Copy
Code généré :
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

Meilleures pratiques

  • Évaluez soigneusement le comportement fonctionnel pour les résultats inattendus, car les différences ne peuvent se produire que dans des scénarios spécifiques.

SSC-FDM-PG0014

Unknown Pseudo Type transformé en Text Type

Description

Ce message de différence fonctionnelle indique que UNKNOWN Pseudo Type utilisé dans PostgreSQL n’est pas pris en charge dans Snowflake et est transformé en Text Type.

Exemple de code

Code d’entrée :
PostgreSql
CREATE TABLE PSEUDOTYPES
(
  COL1 UNKNOWN
)
Copy
Code généré :
Snowflake
CREATE TABLE PSEUDOTYPES (
  COL1 TEXT /*** SSC-FDM-PG0014 -  UNKNOWN PSEUDOTYPE TRANSFORMED TO TEXT TYPE ***/
)
Copy

Meilleures pratiques

  • Évaluez soigneusement les utilisations des colonnes avec Unknown Data Types, car des différences peuvent se produire dans des scénarios spécifiques.

SSC-FDM-PG0015

La commande PSQL n’est pas applicable dans Snowflake.

Description

Dans Snowflake, les commandes PSQL ne sont pas applicables. Bien que n’étant plus nécessaire pour l’exécution, SnowConvert AI conserve la commande PSQL d’origine sous forme de commentaire.

Exemple de code

Code d’entrée:�
 \set ON_ERROR_STOP TRUE
Copy
Code généré:
 ----** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. COMMAND OPTION **
--\set ON_ERROR_STOP TRUE
Copy

SSC-FDM-PG0016

Tableau fortement typé transformé en ARRAY sans vérification de type.

Description

SnowConvert AI ajoutera cet avertissement, car PostgreSQL prend en charge les tableaux de tout type base, type enum, type composite, type plage ou domaine intégré ou défini par l’utilisateur, tandis que Snowflake ne le fait pas. Dans Snowflake, chaque valeur d’un tableau semi-structuré est de type VARIANT.

Exemple de code

Code d’entrée:�
CREATE TABLE sal_emp (
    name            text,
    pay_by_quarter  integer[],
    schedule        text[][]
);
Copy
Code généré:
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

La fonction définie par l’utilisateur qui renvoie void a été transformée en procédure Snowflake.

Description

SnowConvert AI génère un avertissement pour toute fonction qui renvoie void. En effet, les fonctions renvoyant void indiquent généralement une procédure plutôt qu’une opération produisant une valeur, ce qui peut parfois nécessiter un traitement spécial lors de la conversion.

Exemple de code

Code d’entrée:�
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
Code généré:
--** 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

L’instruction d’analyse est commentée, ce qui n’est pas applicable dans Snowflake.

Description

SnowConvert AI signale les instructions ANALYZE avec un avertissement et les commentent. Alors que ANALYZE est utilisé dans PostgreSQL pour collecter des statistiques de table, Snowflake gère automatiquement ce processus, rendant l’instruction redondante et généralement inutile après la conversion.

Exemple de code

Code d’entrée:�
ANALYZE customers (first_name, last_name)
Copy
Code généré:
----** SSC-FDM-PG0018 - ANALYZE STATEMENT IS COMMENTED OUT, WHICH IS NOT APPLICABLE IN SNOWFLAKE. **
--ANALYZE customers (first_name, last_name)
Copy

Meilleures pratiques