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에서는 이 속성이 직접 변환되지 않습니다.
INSERTUPDATEDELETEMERGE
변환된 코드는 PostgreSQL FOUND 속성과 같이 동작하므로 SQLFOUND Snowflake 속성이 됩니다(여기에서 설명서 참조).
다음과 같은 경우도 있습니다.
SELECT INTOPERFORMFETCH
변환된 코드는 PostgreSQL FOUND 속성과 같이 동작하는 사용자 지정 UDF(IS_FOUND_UDF)가 됩니다.
이는 SQLFOUND가 마지막으로 실행된 쿼리의 영향을 받는 행이 하나 이상 있는 경우에만 값을 변경하기 때문입니다. 마지막 쿼리가 행을 변경하지 않으면 값이 변경되지 않습니다.
IS_FOUND_UDF는 행을 반환하는 문에서만 작동하지만 행이 반환되지 않으면 FALSE를 반환합니다.
SQLFOUND의 예¶
INSERT INTO SampleTable (SampleColumn1)
VALUES ('SampleValue0.1');
마지막 쿼리는 테이블에 영향을 미치므로 SQLFOUND는 PostgreSQL 기능과 가장 유사합니다.
IS_FOUND_UDF 예제¶
SELECT SampleColumn FROM SampleTable;
마지막 쿼리는 행을 반환하지만 아무 것도 변경하지 않으므로 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()))
$$;
코드 예제¶
문 삽입:¶
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;
$$;
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;
$$;
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;
$$;
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;
$$;
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;
$$;
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;
$$;
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;
$$;
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;
$$;
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;
$$;
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;
$$;
Perform 문:¶
PostgreSQL¶
-- Found property used with PERFORM statement.
CREATE OR REPLACE PROCEDURE FoundUsingPerformProcedure()
LANGUAGE plpgsql
AS
$$
BEGIN
PERFORM 1;
RETURN FOUND;
END;
$$;
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;
$$;
문 가져오기:¶
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;
$$;
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;
$$;
SSC-FDM-PG0002¶
Bpchar가 varchar로 변환되었습니다.
설명¶
이 경고가 추가되는 이유는 bpchar 데이터 타입(“공백이 채워진 문자”)이 Snowflake의 varchar 데이터 타입과 기능적 동등성 측면에서 차이가 있을 수 있기 때문입니다. 그러나 두 데이터 타입 모두 최대 “n”자 길이의 값을 저장할 수 있으며 저장된 실제 데이터의 양만큼만 저장소를 사용할 수 있습니다. 주요 차이는 데이터 끝에 공백이 있는 경우에 발생하며, 여기서 bpchar는 공백을 저장하지 않지만 snowflake는 공백을 저장합니다.
이러한 이유로 RTRIM 함수를 사용하여 공백이 저장되지 않도록 합니다. 그러나 기능이 완전히 동등하지 않은 경우가 있을 수 있습니다.
코드 예제¶
입력 코드:¶
열 정의¶
CREATE TABLE table1 (
col1 BPCHAR,
col2 BPCHAR(20)
);
명시적 캐스팅¶
SELECT 'Y'::BPCHAR;
SELECT 'Y '::BPCHAR(20);
SELECT COL1::BPCHAR(20) FROM tbl;
생성된 코드:¶
열 정의¶
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" }}';
명시적 캐스팅¶
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;
모범 사례¶
SSC-FDM-PG0003¶
bytea가 Binary로 변환되었습니다
설명¶
이 경고가 추가되는 이유는 bytea 데이터 타입이 binary로 변환될 때 크기 제한이 1GB에서 8MB크게 감소하기 때문입니다.
코드 예제¶
입력 코드:¶
CREATE TABLE tbl(
col BYTEA
);
생성된 코드:¶
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" }}';
모범 사례¶
자세한 내용은 Binary 데이터 타입에 대한 Snowflake 설명서를 참조하세요.
SSC-FDM-PG0004¶
날짜 출력 형식이 다를 수 있습니다
설명¶
날짜 출력 형식은 타임스탬프 유형과 사용 중인 timestamp_output_format에 따라 다를 수 있으며, 자세한 내용은 여기를 참조하세요.
코드 예제¶
입력 코드:¶
PostgreSQL¶
CREATE TABLE table1 (
dt_update timestamp without time zone DEFAULT clock_timestamp()
);
생성된 코드:¶
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" }}';
샘플¶
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;
결과¶
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;
결과¶
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();
결과¶
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);
결과¶
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
);
생성된 코드:¶
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" }}';
SSC-FDM-PG0006¶
여러 스키마로 검색 경로를 설정합니다.
설명¶
Snowflake에서는 여러 스키마로 검색 경로를 설정하는 기능이 지원되지 않습니다. 여기를 참조하세요.
코드 예제¶
입력 코드:¶
PostgreSQL¶
SET SEARCH_PATH TO schema1, schema2, schema3;
생성된 코드:¶
Snowflake¶
--** SSC-FDM-PG0006 - SET SEARCH PATH WITH MULTIPLE SCHEMAS IS NOT SUPPORTED IN SNOWFLAKE **
USE SCHEMA schema1 /*, schema2, schema3*/;
SSC-FDM-PG0007¶
NULL은 ‘’로 변환되며 Snowflake에서 다르게 동작할 수 있습니다.
심각도¶
낮음
설명¶
PostgreSQL에서 주석은 NULL 용어를 사용하여 제거됩니다. 그러나 Snowflake에서 주석을 제거하는 유사한 방법은 빈 문자열 ''의 값을 할당하여 동일한 결과를 내는 것입니다. 이 접근 방식을 사용하면 주석이 유사한 동작으로 빈 문자열에 효과적으로 매핑됩니다.
코드 예제¶
입력 코드:¶
PostgreSQL¶
COMMENT ON TABLE mytable IS NULL;
생성된 코드:¶
Snowflake¶
COMMENT ON TABLE mytable IS '' /*** SSC-FDM-PG0007 - NULL IS CONVERTED TO '' AND MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/;
SSC-FDM-PG0008¶
Select into Unlogged 테이블은 Snowflake에서 지원되지 않습니다.
설명¶
Select into는 Snowflake에서 지원되지 않으며, 이 기능은 CREATE TABLE AS로 에뮬레이트되었습니다. 또한, Snowflake는 항상 트랜잭션 로그를 사용하여 테이블을 보호하고 데이터 무결성과 복구 가능성을 보장합니다. 결과적으로, UNLOGGED 옵션이 있는 테이블은 Snowflake에서 지원되지 않습니다.
코드 예제¶
입력 코드:¶
PostgreSQL¶
select column1
into UNLOGGED NewTable
from oldTable;
생성된 코드:¶
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;
SSC-FDM-PG0009¶
Snowflake의 시퀀스 nextval 속성은 간격이 없는 시퀀스 번호 생성을 보장하지 않습니다
설명¶
Snowflake는 간격이 없는 시퀀스 번호가 생성됨을 보장하지 않습니다. 생성된 숫자는 값이 지속적으로 증가하지만(또는 단계 크기가 음수인 경우에는 값이 감소함), 반드시 연속적일 필요는 없습니다.
코드 예제¶
입력 코드:¶
PostgreSQL¶
SELECT nextval('seq1');
생성된 코드:¶
Snowflake¶
SELECT seq1.nextval /*** SSC-FDM-PG0009 - THE SEQUENCE NEXTVAL PROPERTY SNOWFLAKE DOES NOT GUARANTEE GENERATING SEQUENCE NUMBERS WITHOUT GAPS. ***/;
SSC-FDM-PG0010¶
Snowflake의 비트 함수 동작으로 인해 결과가 다를 수 있습니다.
설명¶
비트 연산자 << and >>는 해당하는 Snowflake 함수 BITSHIFTLEFT 및 BITSHIFTRIGHT로 변환됩니다. 그러나 이러한 함수가 식을 처리하는 방식의 차이로 인해 결과는 PostgreSQL의 결과와 다를 수 있습니다.
코드 예제¶
입력 코드:¶
PostgreSql¶
SELECT 1 << 127 AS resultShiftedLeft, 16 >> 32 AS resultShiftedRight;
결과¶
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;
결과¶
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;
결과¶
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;
결과¶
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;
$$;
결과¶
[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;
$$;
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;
생성된 코드:¶
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;
모범 사례¶
기능적 차이는 특정 경우에만 발생할 수 있으므로, 예기치 않은 결과를 유발할 수 있는 기능적 동작을 신중하게 평가합니다.
SSC-FDM-PG0014¶
Unknown Pseudotype이 텍스트 유형으로 변환되었습니다
설명¶
이 기능적 차이 메시지는 PostgreSQL에서 사용되는 UNKNOWN Pseudotype이 Snowflake에서 지원되지 않으며 텍스트 유형으로 변환됨을 나타냅니다.
코드 예제¶
입력 코드:¶
PostgreSql¶
CREATE TABLE PSEUDOTYPES
(
COL1 UNKNOWN
)
생성된 코드:¶
Snowflake¶
CREATE TABLE PSEUDOTYPES (
COL1 TEXT /*** SSC-FDM-PG0014 - UNKNOWN PSEUDOTYPE TRANSFORMED TO TEXT TYPE ***/
)
모범 사례¶
기능적 차이는 특정 경우에 발생할 수 있으므로, Unknown 데이터 타입이 있는 열의 사용을 신중하게 평가합니다.
SSC-FDM-PG0015¶
PSQL 명령은 Snowflake에서 적용할 수 없습니다
설명¶
Snowflake에서 PSQL 명령을 적용할 수 없습니다. 실행에는 더 이상 필요하지 않지만, SnowConvert AI는 원본 PSQL 명령을 주석으로 유지합니다.
코드 예시¶
입력 코드: ¶
\set ON_ERROR_STOP TRUE
생성된 코드: ¶
----** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. COMMAND OPTION **
--\set ON_ERROR_STOP TRUE
SSC-FDM-PG0016¶
유형 검사 없이 강력한 형식의 배열이 ARRAY로 변환되었습니다.
설명¶
SnowConvert AI가 이 경고를 추가하는 이유는 PostgreSQL가 기본 제공 또는 사용자 정의 기본 유형, 열거형 유형, 복합 유형, 범위 유형 또는 도메인의 배열을 지원지만, Snowflake는 지원하지 않기 때문입니다. Snowflake에서 반정형 배열의 각 값은 VARIANT 유형입니다.
코드 예시¶
입력 코드: ¶
CREATE TABLE sal_emp (
name text,
pay_by_quarter integer[],
schedule text[][]
);
생성된 코드: ¶
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" }}';
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;
생성된 코드: ¶
--** 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;
$$;
SSC-FDM-PG0018¶
Analyze 문이 주석 처리되었으며, Snowflake에서 적용되지 않습니다.
설명¶
SnowConvert AI는 ANALYZE 문에 경고를 표시하고 주석으로 처리합니다. ANALYZE는 테이블 통계를 수집하기 위해 PostgreSQL에서 사용되지만, Snowflake는 이 프로세스를 자동으로 관리합니다. 따라서 문이 중복되므로 일반적으로 변환 후에는 필요하지 않습니다.
코드 예시¶
입력 코드: ¶
ANALYZE customers (first_name, last_name)
생성된 코드: ¶
----** SSC-FDM-PG0018 - ANALYZE STATEMENT IS COMMENTED OUT, WHICH IS NOT APPLICABLE IN SNOWFLAKE. **
--ANALYZE customers (first_name, last_name)
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.