SnowConvert AI - PostgreSQL 기능적 차이

참고

PostgreSQL용 SnowConvert AI는 현재 TABLES 및 VIEWS에 대한 평가 및 변환을 지원합니다. SnowConvert AI는 다른 유형의 문을 인식할 수 있지만, 이러한 문 유형이 완전히 지원되지는 않습니다.

추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-FDM-PG0001

일부 상황에서 FOUND는 Snowflake에서 다르게 동작할 수 있습니다.

심각도

낮음

설명

PostgreSQL의 FOUND 속성은 마지막으로 실행된 쿼리를 기반으로 하는 속성으로, INSERT, UPDATE, DELETE, MERGE, SELECT INTO, PERFORM, FETCH, FOR 루프와 같은 일부 문의 영향을 받을 수 있습니다. 이 속성에 대한 자세한 내용은 PostgreSQL 설명서를 참조하세요.

다음과 같은 경우 Snowflake에서는 이 속성이 직접 변환되지 않습니다.

  • INSERT

  • UPDATE

  • DELETE

  • MERGE

변환된 코드는 PostgreSQL FOUND 속성과 같이 동작하므로 SQLFOUND Snowflake 속성이 됩니다(여기에서 설명서 참조).

다음과 같은 경우도 있습니다.

  • SELECT INTO

  • PERFORM

  • FETCH

변환된 코드는 PostgreSQL FOUND 속성과 같이 동작하는 사용자 지정 UDF(IS_FOUND_UDF)가 됩니다.

이는 SQLFOUND가 마지막으로 실행된 쿼리의 영향을 받는 행이 하나 이상 있는 경우에만 값을 변경하기 때문입니다. 마지막 쿼리가 행을 변경하지 않으면 값이 변경되지 않습니다.

IS_FOUND_UDF는 행을 반환하는 문에서만 작동하지만 행이 반환되지 않으면 FALSE를 반환합니다.

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

마지막 쿼리는 테이블에 영향을 미치므로 SQLFOUND는 PostgreSQL 기능과 가장 유사합니다.

IS_FOUND_UDF 예제
SELECT SampleColumn FROM SampleTable;
Copy

마지막 쿼리는 행을 반환하지만 아무 것도 변경하지 않으므로 IS_FOUND_UDF()는 PostgreSQL 기능과 가장 유사합니다.

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

코드 예제

문 삽입:
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 문:
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
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
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
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
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
문 가져오기:
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가 varchar로 변환되었습니다.

설명

이 경고가 추가되는 이유는 bpchar 데이터 타입(“공백이 채워진 문자”)이 Snowflake의 varchar 데이터 타입과 기능적 동등성 측면에서 차이가 있을 수 있기 때문입니다. 그러나 두 데이터 타입 모두 최대 “n”자 길이의 값을 저장할 수 있으며 저장된 실제 데이터의 양만큼만 저장소를 사용할 수 있습니다. 주요 차이는 데이터 끝에 공백이 있는 경우에 발생하며, 여기서 bpchar는 공백을 저장하지 않지만 snowflake는 공백을 저장합니다.

이러한 이유로 RTRIM 함수를 사용하여 공백이 저장되지 않도록 합니다. 그러나 기능이 완전히 동등하지 않은 경우가 있을 수 있습니다.

코드 예제

입력 코드:
열 정의
CREATE TABLE table1 (
    col1 BPCHAR, 
    col2 BPCHAR(20)
);
Copy
명시적 캐스팅
SELECT 'Y'::BPCHAR;
SELECT 'Y   '::BPCHAR(20);
SELECT COL1::BPCHAR(20) FROM tbl;
Copy
생성된 코드:
열 정의
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
명시적 캐스팅
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

모범 사례

  • 공백을 저장하지 않으려는 경우 rtrim 함수를 사용하여 저장 방식 차이를 해결할 수 있습니다. 이 경우 명시적 캐스팅으로 처리되지만, 수동으로 처리해야 하는 다른 경우가 있을 수 있습니다. 자세한 내용은 RTRIM에 대한 Snowflake 설명서를 참조하세요.

SSC-FDM-PG0003

bytea가 Binary로 변환되었습니다

설명

이 경고가 추가되는 이유는 bytea 데이터 타입이 binary로 변환될 때 크기 제한이 1GB에서 8MB크게 감소하기 때문입니다.

코드 예제

입력 코드:
CREATE TABLE tbl(
    col BYTEA
);
Copy
생성된 코드:
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

모범 사례

SSC-FDM-PG0004

날짜 출력 형식이 다를 수 있습니다

설명

날짜 출력 형식은 타임스탬프 유형과 사용 중인 timestamp_output_format에 따라 다를 수 있으며, 자세한 내용은 여기를 참조하세요.

코드 예제

입력 코드:
PostgreSQL
CREATE TABLE table1 (
    dt_update timestamp without time zone DEFAULT clock_timestamp()
);
Copy
생성된 코드:
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

샘플

CREATE TABLE 예제.

입력 코드:

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
결과

platform_id

dt_update

clock_timestamp

1

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

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

생성된 코드:
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
결과

PLATFORM_ID

DT_UPDATE

CURRENT_TIMESTAMP(3)

1

2023-02-05 20:52:30.082000000

2023-02-05 21:20:31.593

clock_timestamp()가 포함된 SELECT 예제

입력 코드
PostgreSQL
select clock_timestamp();
Copy
결과

clock_timestamp

2023-02-05 23:24:13.740

생성된 코드
Snowflake
ALTER SESSION SET timestamp_output_format = 'YYYY-MM-DD HH24:MI:SS.FF';
select
    CURRENT_TIMESTAMP(3);
Copy
결과

CURRENT_TIMESTAMP(3)

2023-02-05 21:29:24.258

SSC-FDM-PG0005

UNLOGGED 테이블은 Snowflake에서 지원되지 않습니다. 작성된 데이터마다 성능이 다를 수 있습니다.

설명

PostgreSQL의 UNLOGGED 테이블은 WAL(Write-Ahead Logging)을 건너뛰어 속도를 크게 향상합니다. 그러나 해당 데이터는 미러 인스턴스에 복제되지 않습니다. Snowflake는 이 기능을 지원하지 않으므로 UNLOGGED 절은 주석 처리됩니다.

코드 예제

입력 코드:
PostgreSQL
CREATE UNLOGGED TABLE TABLE1 (
   COL1 integer 
);
Copy
생성된 코드:
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

여러 스키마로 검색 경로를 설정합니다.

설명

Snowflake에서는 여러 스키마로 검색 경로를 설정하는 기능이 지원되지 않습니다. 여기를 참조하세요.

코드 예제

입력 코드:
PostgreSQL
 SET SEARCH_PATH TO schema1, schema2, schema3;
Copy
생성된 코드:
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은 ‘’로 변환되며 Snowflake에서 다르게 동작할 수 있습니다.

심각도

낮음

설명

PostgreSQL에서 주석은 NULL 용어를 사용하여 제거됩니다. 그러나 Snowflake에서 주석을 제거하는 유사한 방법은 빈 문자열 ''의 값을 할당하여 동일한 결과를 내는 것입니다. 이 접근 방식을 사용하면 주석이 유사한 동작으로 빈 문자열에 효과적으로 매핑됩니다.

코드 예제

입력 코드:
PostgreSQL
 COMMENT ON TABLE mytable IS NULL;
Copy
생성된 코드:
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 Unlogged 테이블은 Snowflake에서 지원되지 않습니다.

설명

Select into는 Snowflake에서 지원되지 않으며, 이 기능은 CREATE TABLE AS로 에뮬레이트되었습니다. 또한, Snowflake는 항상 트랜잭션 로그를 사용하여 테이블을 보호하고 데이터 무결성과 복구 가능성을 보장합니다. 결과적으로, UNLOGGED 옵션이 있는 테이블은 Snowflake에서 지원되지 않습니다.

코드 예제

입력 코드:
PostgreSQL
select column1
      into UNLOGGED NewTable
      from oldTable;
Copy
생성된 코드:
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의 시퀀스 nextval 속성은 간격이 없는 시퀀스 번호 생성을 보장하지 않습니다

설명

Snowflake는 간격이 없는 시퀀스 번호가 생성됨을 보장하지 않습니다. 생성된 숫자는 값이 지속적으로 증가하지만(또는 단계 크기가 음수인 경우에는 값이 감소함), 반드시 연속적일 필요는 없습니다.

코드 예제

입력 코드:
PostgreSQL
 SELECT nextval('seq1');
Copy
생성된 코드:
Snowflake
 SELECT seq1.nextval /*** SSC-FDM-PG0009 - THE SEQUENCE NEXTVAL PROPERTY SNOWFLAKE DOES NOT GUARANTEE GENERATING SEQUENCE NUMBERS WITHOUT GAPS. ***/;
Copy

SSC-FDM-PG0010

Snowflake의 비트 함수 동작으로 인해 결과가 다를 수 있습니다.

설명

비트 연산자 << and >>는 해당하는 Snowflake 함수 BITSHIFTLEFTBITSHIFTRIGHT로 변환됩니다. 그러나 이러한 함수가 식을 처리하는 방식의 차이로 인해 결과는 PostgreSQL의 결과와 다를 수 있습니다.

코드 예제

입력 코드:
PostgreSql
 SELECT 1 << 127 AS resultShiftedLeft, 16 >> 32 AS resultShiftedRight;
Copy
결과

resultShiftedLeft

resultShiftedRight

-2147483648

16

생성된 코드:
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
결과

resultShiftedLeft

resultShiftedRight

-170141183460469231731687303715884105728

0

SSC-FDM-PG0011

이 패턴 일치 조건으로 인해 COLLATE 열 제약 조건 사용이 비활성화되었습니다

설명

이 메시지는 COLLATE 사양이 현재 Snowflake의 정규식 함수에서 지원되지 않아 패턴 일치 조건이 해당 사양이 포함된 인자를 사용하는 경우에 추가됩니다. 결과적으로, 이 함수를 사용하려면 COLLATE 절을 비활성화해야 하며, 이로 인해 결과가 다를 수 있습니다.

코드 예제

입력 코드:
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
결과

CI

CS

TRUE

FALSE

출력 코드:

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
결과

CI

CS

FALSE

FALSE

모범 사례

  • 다음 시나리오에 대해 기능적 동등성이 필요한 경우 함수에 다음 매개 변수를 수동으로 추가하여 기능적 동등성을 달성할 수 있습니다.

    매개 변수

    설명

    c

    대/소문자를 구분하는 일치

    i

    대/소문자를 구분하지 않는 일치

  • 자세한 내용은 다음 링크를 참조하세요.

SSC-FDM-PG0012

NOT NULL 제약 조건이 제거되었습니다. 이 변수에 NULL을 할당해도 더 이상 오류가 발생하지 않습니다.

설명

PostgreSql에서 NOT NULL 제약 조건을 지정하면 변수에 null 값을 할당할 때 런타임 오류가 발생합니다. 이 절은 Snowflake에 존재하지 않으므로 변환 중에 제거되며, 이 변수에 NULL을 할당해도 더 이상 실행에 실패하지 않습니다.

코드 예제

입력 코드:
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
결과

[22004] ERROR: NULL cannot be assigned to variable “v_notnull” declared 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

참고

이 할당은 Snowflake에서 실패하지 않습니다.

모범 사례

  • 프로시저 논리를 검토하여 이 변수가 NULL 값에 할당되지 않았는지 확인합니다.

SSC-FDM-PG0013

Snowflake에서 구문적으로 지원되는 함수이지만 기능적 차이가 있을 수 있습니다

설명

이 기능적 차이 메시지는 Snowflake가 함수의 구문(직접 또는 동등한 매핑을 통해)을 지원하지만, 일부 상황에서는 함수의 동작이 원래와 다를 수 있음을 나타냅니다.

코드 예제

입력 코드:
PostgreSql
SELECT
    LISTAGG(skill) WITHIN GROUP (ORDER BY skill) OVER (PARTITION BY
    employee_name) AS employee_skills
FROM
    employees;
Copy
생성된 코드:
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

모범 사례

  • 기능적 차이는 특정 경우에만 발생할 수 있으므로, 예기치 않은 결과를 유발할 수 있는 기능적 동작을 신중하게 평가합니다.

SSC-FDM-PG0014

Unknown Pseudotype이 텍스트 유형으로 변환되었습니다

설명

이 기능적 차이 메시지는 PostgreSQL에서 사용되는 UNKNOWN Pseudotype이 Snowflake에서 지원되지 않으며 텍스트 유형으로 변환됨을 나타냅니다.

코드 예제

입력 코드:
PostgreSql
CREATE TABLE PSEUDOTYPES
(
  COL1 UNKNOWN
)
Copy
생성된 코드:
Snowflake
CREATE TABLE PSEUDOTYPES (
  COL1 TEXT /*** SSC-FDM-PG0014 -  UNKNOWN PSEUDOTYPE TRANSFORMED TO TEXT TYPE ***/
)
Copy

모범 사례

  • 기능적 차이는 특정 경우에 발생할 수 있으므로, Unknown 데이터 타입이 있는 열의 사용을 신중하게 평가합니다.

SSC-FDM-PG0015

PSQL 명령은 Snowflake에서 적용할 수 없습니다

설명

Snowflake에서 PSQL 명령을 적용할 수 없습니다. 실행에는 더 이상 필요하지 않지만, SnowConvert AI는 원본 PSQL 명령을 주석으로 유지합니다.

코드 예시

입력 코드:
 \set ON_ERROR_STOP TRUE
Copy
생성된 코드:
 ----** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. COMMAND OPTION **
--\set ON_ERROR_STOP TRUE
Copy

SSC-FDM-PG0016

유형 검사 없이 강력한 형식의 배열이 ARRAY로 변환되었습니다.

설명

SnowConvert AI가 이 경고를 추가하는 이유는 PostgreSQL가 기본 제공 또는 사용자 정의 기본 유형, 열거형 유형, 복합 유형, 범위 유형 또는 도메인의 배열을 지원지만, Snowflake는 지원하지 않기 때문입니다. Snowflake에서 반정형 배열의 각 값은 VARIANT 유형입니다.

코드 예시

입력 코드:
CREATE TABLE sal_emp (
    name            text,
    pay_by_quarter  integer[],
    schedule        text[][]
);
Copy
생성된 코드:
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

void를 반환하는 사용자 정의 함수가 Snowflake 프로시저로 변환되었습니다.

설명

SnowConvert AI는 void를 반환하는 모든 함수에 대해 경고를 생성합니다. 이는 void 를 반환하는 함수가 일반적으로 값을 생성하는 작업이 아닌 프로시저를 나타내기 때문입니다. 따라서 때로는 변환 중에 특별한 처리가 필요할 수 있습니다.

코드 예시

입력 코드:
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
생성된 코드:
--** 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

Analyze 문이 주석 처리되었으며, Snowflake에서 적용되지 않습니다.

설명

SnowConvert AI는 ANALYZE 문에 경고를 표시하고 주석으로 처리합니다. ANALYZE는 테이블 통계를 수집하기 위해 PostgreSQL에서 사용되지만, Snowflake는 이 프로세스를 자동으로 관리합니다. 따라서 문이 중복되므로 일반적으로 변환 후에는 필요하지 않습니다.

코드 예시

입력 코드:
ANALYZE customers (first_name, last_name)
Copy
생성된 코드:
----** SSC-FDM-PG0018 - ANALYZE STATEMENT IS COMMENTED OUT, WHICH IS NOT APPLICABLE IN SNOWFLAKE. **
--ANALYZE customers (first_name, last_name)
Copy

모범 사례