SnowConvert AI – Funktionale Unterschiede bei PostgreSQL

Bemerkung

SnowConvert AI für PostgreSQL unterstützt derzeit die Bewertung und Übersetzung für TABLES und VIEWS. Obwohl SnowConvert AI andere Arten von Anweisungen erkennen kann, werden diese nicht vollständig unterstützt.

Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-PG0001

FOUND könnte sich in einigen Szenarien in Snowflake anders verhalten.

Schweregrad

Niedrig

Beschreibung

Die FOUND-Eigenschaft in PostgreSQL basiert auf der zuletzt ausgeführten Abfrage und kann durch bestimmte Anweisungen beeinflusst werden, wie z. B. INSERT, UPDATE, DELETE, MERGE, SELECT INTO, PERFORM, FETCH und FOR-Loops. Weitere Details zu dieser Eigenschaft finden Sie in PostgreSQL-Dokumentation.

In Snowflake gibt es für die folgenden Szenarien keine direkte Übersetzung für diese Eigenschaft:

  • INSERT

  • UPDATE

  • DELETE

  • MERGE

Der konvertierte Code verwendet die Snowflake-Eigenschaft SQLFOUND (siehe Dokumentation), da sie sich wie die PostgreSQL FOUND-Eigenschaft verhält.

Sonstige Fälle:

  • SELECT INTO

  • PERFORM

  • FETCH

Der konvertierte Code ist ein kundenspezifischer UDF (IS_FOUND_UDF), der sich wie die PostgreSQL FOUND-Eigenschaft verhält.

Dies geschieht, weil SQLFOUND seinen Wert nur dann ändert, wenn mindestens eine Zeile von der zuletzt ausgeführten Abfrage betroffen ist. Wenn die letzte Abfrage keine Zeile ändert, ändert sie sich nicht.

Der IS_FOUND_UDF funktioniert nur bei Anweisungen, die Zeilen zurückgeben. Wenn keine Zeile zurückgegeben wird, wird FALSE zurückgegeben.

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

Die letzte Abfrage betrifft eine Tabelle. SQLFOUND ist der Funktion PostgreSQL am nächsten.

Beispiel für IS_FOUND\_UDF
SELECT SampleColumn FROM SampleTable;
Copy

Die letzte Abfrage gibt eine Zeile zurück, ändert aber nichts, sodass die IS_FOUND_UDF() der PostgreSQL-Funktion am nächsten kommt.

Quellcode von 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

Codebeispiel

INSERT-Anweisung:
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
Update-Anweisung:
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
Anweisung löschen:
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
Merge-Anweisung:
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
SELECT INTO-Anweisung
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
Anweisungen ausführen:
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
FETCH-Anweisung:
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 in varchar konvertiert.

Beschreibung

Diese Warnung wurde hinzugefügt, da der Typ bpchar („blank-padded char“) möglicherweise einen Unterschied zwischen der funktionalen Äquivalenz und dem Datentyp varchar in Snowflake aufweist. Beide Datentypen können jedoch die Werte bis zur Länge von „n“ Zeichen speichern und verbrauchen nur Speicherplatz für die Menge der tatsächlich gespeicherten Daten. Der Hauptunterschied tritt auf, wenn am Ende der Daten Leerzeichen stehen, die nicht von bpchar gespeichert werden, sondern von Snowflake.

Aus diesem Grund können wir die RTRIM-Funktion verwenden, sodass diese Leerzeichen nicht gespeichert werden. Allerdings kann es Fälle geben, in denen die Funktionalität nicht vollständig übereinstimmt.

Codebeispiel

Eingabecode:
Spaltendefinition
CREATE TABLE table1 (
    col1 BPCHAR, 
    col2 BPCHAR(20)
);
Copy
Explizite Umwandlung
SELECT 'Y'::BPCHAR;
SELECT 'Y   '::BPCHAR(20);
SELECT COL1::BPCHAR(20) FROM tbl;
Copy
Generierter Code:
Spaltendefinition
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
Explizite Umwandlung
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

Best Practices

  • Die rtrim-Funktion kann Speicherunterschiede auflösen, falls Sie nicht möchten, dass diese Leerzeichen gespeichert werden. Dieser Fall wird in der expliziten Umwandlung behandelt, jedoch kann es andere Szenarien geben, in denen er manuell behandelt werden muss. Weitere Informationen dazu finden Sie in der Snowflake-Dokumentation zu RTRIM.

SSC-FDM-PG0003

Bytea in Binärwerte konvertiert

Beschreibung

Diese Warnung wurde hinzugefügt, weil bei der Konvertierung des Bytea-Datentyps in Binärwerte die Größenbeschränkung von 1GB auf 8MB erheblich reduziert wird.

Codebeispiel

Eingabecode:
CREATE TABLE tbl(
    col BYTEA
);
Copy
Generierter Code:
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

Best Practices

  • Weitere Informationen dazu finden Sie in der Snowflake-Dokumentation zu [Binärdatentyp] (https://docs.snowflake.com/en/sql-reference/data-types-text.html#binary).

SSC-FDM-PG0004

Das Datumsausgabeformat kann variieren

Beschreibung

Das Datumsausgabeformat kann je nach Zeitstempeltyp und dem verwendeten timestamp_output_format variieren. Weitere Informationen erhalten Sie hier konsultieren. &.#x20;

Codebeispiel

Eingabecode:
PostgreSQL
CREATE TABLE table1 (
    dt_update timestamp without time zone DEFAULT clock_timestamp()
);
Copy
Generierter Code:
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

Beispiele

Beispiel mit CREATE TABLE.

Eingabecode:

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
Ergebnisse

platform_id

dt_update

clock_timestamp

1

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

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

Generierter Code:
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
Ergebnisse

PLATFORM_ID

DT_UPDATE

CURRENT_TIMESTAMP(3)

1

2023-02-05 20:52:30.082000000

2023-02-05 21:20:31.593

Beispiel mit SELECT mit clock_timestamp().

Eingabecode
PostgreSQL
select clock_timestamp();
Copy
Ergebnisse

clock_timestamp

2023-02-05 23:24:13.740

Generierter Code
Snowflake
ALTER SESSION SET timestamp_output_format = 'YYYY-MM-DD HH24:MI:SS.FF';
select
    CURRENT_TIMESTAMP(3);
Copy
Ergebnisse

CURRENT_TIMESTAMP(3)

2023-02-05 21:29:24.258

SSC-FDM-PG0005

Die UNLOGGED-Tabelle wird in Snowflake nicht unterstützt; die geschriebenen Daten können eine andere Leistung aufweisen.

Beschreibung

Die PostgreSQL UNLOGGED-Tabellen bieten einen erheblichen Geschwindigkeitsvorteil, da die Protokollierung vor dem Schreiben (WAL) übersprungen wird. Ihre Daten werden jedoch nicht in Spiegel-Instanzen repliziert. Snowflake unterstützt diese Funktionalität nicht, daher wird die UNLOGGED-Klausel auskommentiert.

Codebeispiel

Eingabecode:
PostgreSQL
CREATE UNLOGGED TABLE TABLE1 (
   COL1 integer 
);
Copy
Generierter Code:
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

Suchpfad mit mehreren Schemas festlegen

Beschreibung

Das Festlegen eines Suchpfads mit mehreren Schemas wird in Snowflake nicht unterstützt. Weitere Informationen erhalten Sie hier.

Codebeispiel

Eingabecode:
PostgreSQL
 SET SEARCH_PATH TO schema1, schema2, schema3;
Copy
Generierter Code:
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 wird in ‚‘ konvertiert und kann in Snowflake ein anderes Verhalten aufweisen.

Schweregrad

Niedrig

Beschreibung

In PostgreSQL wird Entfernen eines Kommentars über den Begriff NULL vorgenommen. In Snowflake besteht eine ähnliche Methode zum Entfernen eines Kommentars darin, den Wert einer leeren Zeichenfolge zuzuweisen '', um das gleiche Ergebnis zu liefern. Dieser Ansatz stellt sicher, dass der Kommentar effektiv einer leeren Zeichenfolge mit einem ähnlichen Verhalten zugeordnet wird.

Codebeispiel

Eingabecode:
PostgreSQL
 COMMENT ON TABLE mytable IS NULL;
Copy
Generierter Code:
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

Select Into-Anweisungen für unprotokollierte Tabellen werden von Snowflake nicht unterstützt.

Beschreibung

Select Into wird von Snowflake nicht unterstützt. Diese Funktion wurde mit CREATE TABLE AS emuliert. Darüber hinaus verwendet Snowflake immer Transaktionsprotokolle, um Tabellen zu schützen und die Datenintegrität und -wiederherstellung sicherzustellen. Folglich werden Tabellen mit der Option UNLOGGED von Snowflake nicht unterstützt.

Codebeispiel

Eingabecode:
PostgreSQL
select column1
      into UNLOGGED NewTable
      from oldTable;
Copy
Generierter Code:
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

Snowflake garantiert nicht, dass die Generierung von Sequenznummern ohne Lücken erfolgt

Beschreibung

Snowflake garantiert nicht, dass die Generierung von Sequenznummern ohne Lücken erfolgt. Die generierten Zahlen steigen im Wert (oder fallen im Wert, wenn die Schrittweite negativ ist), sind aber nicht unbedingt zusammenhängend.

Codebeispiel

Eingabecode:
PostgreSQL
 SELECT nextval('seq1');
Copy
Generierter Code:
Snowflake
 SELECT seq1.nextval /*** SSC-FDM-PG0009 - THE SEQUENCE NEXTVAL PROPERTY SNOWFLAKE DOES NOT GUARANTEE GENERATING SEQUENCE NUMBERS WITHOUT GAPS. ***/;
Copy

SSC-FDM-PG0010

Die Ergebnisse können aufgrund des Verhaltens der bitweisen Funktion von Snowflake variieren.

Beschreibung

Die bitweisen Operatoren << and >> werden in die entsprechenden Snowflake-Funktionen BITSHIFTLEFT und BITSHIFTRIGHT umgewandelt. Aufgrund der Unterschiede in der Art und Weise, wie diese Funktionen Ausdrücke behandeln, können die Ergebnisse jedoch von denen in PostgreSQL abweichen.

Codebeispiel

Eingabecode:
PostgreSql
 SELECT 1 << 127 AS resultShiftedLeft, 16 >> 32 AS resultShiftedRight;
Copy
Ergebnis

resultShiftedLeft

resultShiftedRight

-2147483648

16

Generierter Code:
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
Ergebnis

resultShiftedLeft

resultShiftedRight

-170141183460469231731687303715884105728

0

SSC-FDM-PG0011

Die Verwendung der COLLATE-Spalten-Einschränkung wurde für diese Mustererkennungsbedingung deaktiviert

Beschreibung

Diese Meldung wird hinzugefügt, wenn eine Mustererkennungsbedingung Argumente mit COLLATE-Spezifikationen verwendet, da sie derzeit in der Snowflake-Funktion für reguläre Ausdrücke nicht unterstützt werden. Folglich muss die COLLATE-Klausel deaktiviert werden, um diese Funktion verwenden zu können, was zu unterschiedlichen Ergebnissen führen kann.

Codebeispiel

Eingabecode:
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
Ergebnisse

CI

CS

TRUE

FALSE

Ausgabecode:

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
Ergebnisse

CI

CS

FALSE

FALSE

Best Practices

  • Wenn Sie für diese Szenarien eine Äquivalenz benötigen, können Sie die folgenden Parameter manuell zur Funktion hinzufügen, um eine funktionale Äquivalenz zu erreichen:

    Parameter

    Beschreibung

    c

    Abgleich, bei dem zwischen Groß- und Kleinschreibung unterschieden wird

    i

    Abgleich ohne Berücksichtigung der Groß-/Kleinschreibung

  • Weitere Informationen dazu finden Sie unter dem folgenden Link.

SSC-FDM-PG0012

NOT NULL-Einschränkung wurde entfernt. Zuweisen von NULL zu dieser Variable führt nicht mehr zu einem Fehler.

Beschreibung

In PostgreSql stellt die Angabe der NOT NULL-Einschränkung sicher, dass das Zuweisen eines Nullwerts zu einer Variablen zu einem Laufzeitfehler führt. Da diese Klausel in Snowflake nicht existiert, wird sie während der Umwandlung entfernt, und das Zuweisen eines NULL-Werts zu dieser Variablen führt bei der Ausführung nicht mehr zu einem Fehler.

Codebeispiel

Eingabecode:
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
Ergebnis

[22004] ERROR: NULL-Wert kann nicht der Variablen „v_notnull“ zugewiesen werden, die als NOT NULL deklariert wurde.

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

Hinweis

Diese Zuweisung wird in Snowflake nicht fehlschlagen.

Best Practices

  • Überprüfen Sie die Prozedurlogik, um sicherzustellen, dass dieser Variable kein NULL-Wert zugewiesen ist.

SSC-FDM-PG0013

Funktion, die von Snowflake syntaktisch unterstützt wird, aber Funktionsunterschiede aufweisen kann

Beschreibung

Diese Funktionsunterschiedsmeldung weist darauf hin, dass Snowflake zwar die Syntax der Funktion unterstützt (entweder direkt oder über eine gleichwertige Zuordnung), deren Verhalten in einigen Situationen jedoch vom ursprünglichen Verhalten abweichen kann.

Codebeispiel

Eingabecode:
PostgreSql
SELECT
    LISTAGG(skill) WITHIN GROUP (ORDER BY skill) OVER (PARTITION BY
    employee_name) AS employee_skills
FROM
    employees;
Copy
Generierter Code:
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

Best Practices

  • Prüfen Sie sorgfältig das funktionale Verhalten auf unerwartete Ergebnisse, da Unterschiede nur in bestimmten Szenarien auftreten können.

SSC-FDM-PG0014

Unbekannter Pseudotyp, der in Texttyp umgewandelt wurde

Beschreibung

Diese Functional-Difference-Nachricht weist darauf hin, dass der in PostgreSQL verwendete Pseudo-Typ UNKNOWN in Snowflake nicht unterstützt und in einen Texttyp umgewandelt wird.

Codebeispiel

Eingabecode:
PostgreSql
CREATE TABLE PSEUDOTYPES
(
  COL1 UNKNOWN
)
Copy
Generierter Code:
Snowflake
CREATE TABLE PSEUDOTYPES (
  COL1 TEXT /*** SSC-FDM-PG0014 -  UNKNOWN PSEUDOTYPE TRANSFORMED TO TEXT TYPE ***/
)
Copy

Best Practices

  • Prüfen Sie sorgfältig die Verwendungen für die Spalten mit unbekannten Datentypen, da in bestimmten Szenarien Unterschiede auftreten können.

SSC-FDM-PG0015

PSQL-Befehl ist in Snowflake nicht anwendbar

Beschreibung

In Snowflake sind PSQL-Befehle nicht anwendbar. Obwohl er nicht mehr für die Ausführung benötigt wird, behält SnowConvert AI den ursprünglichen PSQL-Befehl als Kommentar bei.

Beispielcode

Eingabecode:
 \set ON_ERROR_STOP TRUE
Copy
Generierter Code:
 ----** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. COMMAND OPTION **
--\set ON_ERROR_STOP TRUE
Copy

SSC-FDM-PG0016

Fest typisiertes Array ohne Typprüfung in ARRAY transformiert.

Beschreibung

SnowConvert AI fügt diese Warnung hinzu, da PostgreSQL-Arrays von beliebigen eingebauten oder benutzerdefinierten Basistypen, Enum-Typen, zusammengesetzten Typen, Bereichstypen oder Domänen unterstützt – Snowflake jedoch nicht. In Snowflake ist jeder Wert in einem semistrukturierten Array vom Typ VARIANT.

Beispielcode

Eingabecode:
CREATE TABLE sal_emp (
    name            text,
    pay_by_quarter  integer[],
    schedule        text[][]
);
Copy
Generierter Code:
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

Eine benutzerdefinierte Funktion, die „void“ zurückgibt, wurde in eine Snowflake-Prozedur umgewandelt.

Beschreibung

SnowConvert AI generiert eine Warnung für jede Funktion, die „void“ zurückgibt. Dies liegt daran, dass Funktionen, die „void“ zurückgeben, normalerweise auf eine Prozedur und nicht auf eine Werte erzeugende Operation hinweisen, die manchmal eine spezielle Behandlung bei der Konvertierung erfordern kann.

Beispielcode

Eingabecode:
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
Generierter Code:
--** 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

Die zu analysierende Anweisung wird auskommentiert, was in Snowflake nicht möglich ist.

Beschreibung

SnowConvert AI markiert ANALYZE-Anweisungen mit einer Warnung und kommentiert sie aus. Während ANALYZE in PostgreSQL zum Sammeln von Tabellenstatistiken verwendet wird, verwaltet Snowflake diesen Prozess automatisch, wodurch die Anweisung nach der Konvertierung überflüssig und in der Regel nicht erforderlich ist.

Beispielcode

Eingabecode:
ANALYZE customers (first_name, last_name)
Copy
Generierter Code:
----** SSC-FDM-PG0018 - ANALYZE STATEMENT IS COMMENTED OUT, WHICH IS NOT APPLICABLE IN SNOWFLAKE. **
--ANALYZE customers (first_name, last_name)
Copy

Best Practices