SnowConvert: Postgres 문제

SSC-EWI-PG0003

심각도

낮음

설명

PostgreSQL 는 테이블 상속을 지원하지만 이 기능은 Snowflake에서 사용할 수 없습니다. PostgreSQL 테이블 상속에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.

코드 예제

입력 코드:

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

출력 코드:

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

권장 사항

SSC-EWI-PG0013

심각도

Medium

설명

이 오류는 Raise 예외를 사용자 지정 저장 프로시저로 변환할 때 발생합니다.

예외 블록 외부에서 예외를 발생시키는 것은 Snowflake에서 지원되지 않는다는 점에 유의하십시오. 이는 Snowflake가 리터럴 메시지로만 새 예외를 생성할 수 있고 동적 데이터를 기반으로 사용자 지정 예외를 생성하는 것은 지원하지 않기 때문입니다.

코드 예제

입력 코드:

CREATE FUNCTION FunctionName1() RETURNS void
AS
$$
DECLARE
	v_var1        	character varying(50);
	v_var2        	character varying(50);
BEGIN
	v_var1 := 'exception1';
	v_var2 := 'exception2';
	RAISE EXCEPTION 'Exception %',v_var1;
    EXCEPTION
      WHEN OTHERS THEN
         RAISE EXCEPTION '%',v_var2;
         RETURN;
END;
$$
    LANGUAGE plpgsql NO SQL;
Copy

출력 코드:

!!!RESOLVE EWI!!! /*** SSC-EWI-GP0002 - NON-RETURNING FUNCTION TRANSLATED TO STORED PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE FunctionName1 () RETURNS STRING
    LANGUAGE SQL
AS
$$
DECLARE
	v_var1        	character varying(50);
	v_var2        	character varying(50);
BEGIN
	v_var1 := 'exception1';
	v_var2 := 'exception2';
	LET SC_RAISE_MESSAGE VARCHAR;
	SC_RAISE_MESSAGE := STRING_FORMAT_UDF('Exception %', array_construct(:v_var1));
	!!!RESOLVE EWI!!! /*** SSC-EWI-PG0013 - RAISE EXCEPTION TRANSLATED TO USER-DEFINED STORED PROCEDURE CALL. ***/!!!
	CALL RAISE_MESSAGE_UDF('EXCEPTION', :SC_RAISE_MESSAGE);
	RETURN 'SUCCESS';
    EXCEPTION
      WHEN OTHER THEN
		SC_RAISE_MESSAGE := STRING_FORMAT_UDF('%', array_construct(:v_var2));
		!!!RESOLVE EWI!!! /*** SSC-EWI-PG0013 - RAISE EXCEPTION TRANSLATED TO USER-DEFINED STORED PROCEDURE CALL. ***/!!!
		CALL RAISE_MESSAGE_UDF('EXCEPTION', :SC_RAISE_MESSAGE);
		RAISE;
         RETURN;
END;
$$;
Copy

변환 프로세스 중에 다음 사용자 정의 함수(UDFs)가 사용됩니다.

CREATE OR REPLACE FUNCTION STRING_FORMAT_UDF(PATTERN VARCHAR, ARGS VARIANT)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "udf",  "convertedOn": "09/09/2024" }}'
AS
$$
	var placeholder_str = "{%}";
	var result = PATTERN.replace(/(?<!%)%(?!%)/g, placeholder_str).replace("%%","%");
	for (var i = 0; i < ARGS.length; i++)
	{
		result = result.replace(placeholder_str, ARGS[i]);
	}
	return result;
$$;
Copy
CREATE OR REPLACE PROCEDURE RAISE_MESSAGE_UDF(LEVEL VARCHAR, MESSAGE VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "udf",  "convertedOn": "09/09/2024" }}'
AS
$$
  BEGIN
    RETURN 'Logged message: ' || LEVEL || ' - ' || MESSAGE;
  END;
$$;
Copy

권장 사항

SSC-EWI-PG0006

심각도

Medium

설명

이 오류는 FOR 루프에서 레이블 이름을 사용하여 변수를 참조할 때 발생합니다. Snowflake는 FOR 루프 내에서 정규화된 이름을 사용하여 변수를 참조하는 기능을 허용하지 않습니다.

코드 예제

입력 코드:

CREATE OR REPLACE PROCEDURE procedure1(out result VARCHAR(100))
LANGUAGE plpgsql
AS $$
BEGIN
result := '<';
<<outer_loop>>
for i in 1..3 loop
  <<inner_loop>>
  for i in 4..6 loop
  result := result || '(' || outer_loop.i || ', ' || i || ')';
  end loop inner_loop;
end loop outer_loop;
result := result || '>';
END;
$$;
Copy

출력 코드:

CREATE OR REPLACE PROCEDURE procedure1 (result VARCHAR(100))
RETURNS VARIANT
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "02/16/2025",  "domain": "test" }}'
AS $$
BEGIN
result := '<';
for i in 1 TO 3 loop
  for i in 4 TO 6 loop
  result := result || '(' ||
                             !!!RESOLVE EWI!!! /*** SSC-EWI-PG0006 - REFERENCE TO A VARIABLE USING THE LABEL IS NOT SUPPORTED BY SNOWFLAKE. ***/!!! outer_loop.i || ', ' || i || ')';
  end loop inner_loop;
end loop outer_loop;
result := result || '>';
  RETURN OBJECT_CONSTRUCT('result', :result);
END;
$$;
Copy

권장 사항

SSC-EWI-PG0002

심각도

낮음

설명

제약 조건의 다음 인덱스 매개 변수는 Snowflake와 호환되지 않습니다.

  • INCLUDE: 현재 작업에 데이터 또는 오브젝트를 추가합니다

  • WITH: 추가 속성 또는 조건을 지정합니다

  • USING INDEX TABLESPACE: 인덱스가 저장될 테이블 스페이스를 정의합니다

코드 예제

입력 코드:

CREATE TABLE Table1 (
    code        char(5),
    date_prod   date,
    CONSTRAINT production UNIQUE(date_prod) INCLUDE(code)
);

CREATE TABLE Table2 (
    name    varchar(40),
    UNIQUE(name) WITH (fillfactor=70)
);

CREATE TABLE Table3 (
    name    varchar(40),
    PRIMARY KEY(name) USING INDEX TABLESPACE tablespace_name
);
Copy

출력 코드:

CREATE TABLE Table1 (
    code        char(5),
    date_prod   date,
    CONSTRAINT production UNIQUE(date_prod)
                                            !!!RESOLVE EWI!!! /*** SSC-EWI-PG0002 - INCLUDE PARAMETER NOT APPLICABLE. CONSTRAINT INDEX PARAMETERS ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!! INCLUDE(code)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';

CREATE TABLE Table2 (
    name    varchar(40),
    UNIQUE(name)
                 !!!RESOLVE EWI!!! /*** SSC-EWI-PG0002 - WITH PARAMETER NOT APPLICABLE. CONSTRAINT INDEX PARAMETERS ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!! WITH (fillfactor=70)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';

CREATE TABLE Table3 (
    name    varchar(40),
    PRIMARY KEY(name)
                      !!!RESOLVE EWI!!! /*** SSC-EWI-PG0002 - USING PARAMETER NOT APPLICABLE. CONSTRAINT INDEX PARAMETERS ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!! USING INDEX TABLESPACE tablespace_name
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';
Copy

권장 사항

SSC-EWI-PG0012

설명

기존 데이터의 유효성 검사 없이 제약 조건을 추가하거나 수정할 수 있는 NOT VALID 옵션은 Snowflake에서 사용할 수 없습니다. 이 PostgreSQL 기능을 사용하면 기존 레코드의 유효성 검사를 건너뛰면서 제약 조건을 추가할 수 있습니다.

코드 예제

입력 코드:

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

출력 코드:

ALTER TABLE Table1
ADD CONSTRAINT const UNIQUE (zip)
                                  !!!RESOLVE EWI!!! /*** SSC-EWI-PG0012 - NOT VALID CONSTRAINT OPTION IS NOT SUPPORTED BY SNOWFLAKE. ***/!!! NOT VALID;
Copy

권장 사항

SSC-EWI-PG0009

심각도

낮음

설명

설명은 원본 코드의 다른 오브젝트에 추가할 수 있습니다. 그러나 이러한 오브젝트 중 일부는 Snowflake에 존재하지 않으므로 설명을 추가하는 기능을 사용할 수 없습니다. 오류를 방지하기 위해 이러한 지원되지 않는 설명 시나리오를 처리하는 코드가 비활성화되었습니다.

코드 예제

입력 코드:

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

출력 코드:

!!!RESOLVE EWI!!! /*** SSC-EWI-PG0009 - COMMENT ON 'RULE' IS NOT SUPPORTED BY SNOWFLAKE. ***/!!!
COMMENT ON RULE rule_name on TABLE_NAME IS 'this is a comment';
Copy

권장 사항

SSC-EWI-PG0008

심각도

높음

설명

Snowflake의 to_char 함수는 날짜 및 시간 데이터 타입을 텍스트 형식으로 변환할 때 interval 매개 변수를 지원하지 않습니다.

코드 예제

입력 코드:

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

출력 코드:

SELECT to_char(INTERVAL '15h, 2m, 12s', 'HH24:MI:SS') !!!RESOLVE EWI!!! /*** SSC-EWI-PG0008 - THE USE OF INTERVAL WITHIN TO_CHAR IS NOT SUPPORTED BY SNOWFLAKE. ***/!!!;
Copy

자세한 내용은 다음을 참조하십시오

  • PostgreSQL to_char 함수 설명서를 참조하십시오.

  • Snowflake to_char 함수 설명서.

권장 사항

SSC-EWI-PG0005

심각도

Medium

설명

이 오류는 특정 함수의 날짜 및 숫자 형식 요구 사항이 소스 언어와 Snowflake가 다르기 때문에 발생합니다.

다음 날짜 및 시간 형식 요소는 다른 데이터베이스와 비교하여 Snowflake 에서 다르게 작동할 수 있습니다.

날짜/시간

Format ElementDescription
HHHour of day (01–12).
MSMillisecond (000–999).
USMicrosecond (000000–999999).
SSSS, SSSSSSeconds past midnight (0–86399).
Y,YYYYear (4 or more digits) with comma.
YYYLast 3 digits of year.
YLast digit of year.
IYYYISO 8601 week-numbering year(4 or more digits).
IYYLast 3 digits of ISO 8601 week-numbering year.
IYLast 2 digits of ISO 8601 week-numbering year.
ILast digit of ISO 8601 week-numbering year.
BC, bc, AD or adEra indicator (without periods).
B.C., b.c., A.D. or a.d.Era indicator (with periods).
MONTHFull upper case month name (blank-padded to 9 chars).
MonthFull capitalized month name (blank-padded to 9 chars).
monthFull lower case month name (blank-padded to 9 chars).
DAYFull upper case day name (blank-padded to 9 chars).
DayFull capitalized day name (blank-padded to 9 chars).
dayFull lower case day name (blank-padded to 9 chars).
DDDDay of year (001–366).
IDDDDay of ISO 8601 week-numbering year (001–371; day 1 of the year is Monday of the first ISO week).
DDay of the week, Sunday (1) to Saturday (7).
IDISO 8601 day of the week, Monday (1) to Sunday (7).
WWeek of month (1–5) (the first week starts on the first day of the month).
WWWeek number of year (1–53) (the first week starts on the first day of the year).
IWWeek number of ISO 8601 week-numbering year (01–53; the first Thursday of the year is in week 1).
CCCentury (2 digits) (the twenty-first century starts on 2001-01-01).
JJulian Date.
QQuarter.
RMMonth in upper case Roman numerals (I–XII; I=January).
rmMonth in lower case Roman numerals (i–xii; i=January).
TZUpper case time-zone abbreviation (only supported in to_char).
tzLower case time-zone abbreviation (only supported in to_char).
TZHTime-zone hours.
TZMTime-zone minutes.
OFTime-zone offset from UTC (only supported in to_char).
FM prefixFill mode (suppress leading zeroes and padding blanks).
TH suffixUpper case ordinal number suffix.
th suffixLower case ordinal number suffix.
FX prefixFixed format global option (see usage notes).
TM prefixTranslation mode (use localized day and month names based on lc_time).
SP suffixSpell mode.

자세한 내용은 PostgreSQL 날짜/시간 형식 설명서를 참조하십시오.

TO_CHAR 함수 변환은 대부분의 형식 요소를 지원합니다. 지원되는 형식 요소와 해당 매핑의 전체 목록은 변환 사양을 참조하십시오

숫자

패턴

설명

PR

꺾쇠 괄호 안의 음수 값

RN

로마자 숫자(1~3999 사이 입력)

TH 또는 th

서수 접미사

V

지정된 자릿수를 이동(참고 참조)

EEEE

과학적 표기법을 위한 지수

자세한 내용은 PostgreSQL 숫자 형식 설명서를 참조하십시오.

코드 예제

입력 코드:

SELECT
   DATE_TRUNC('decade', TIMESTAMP '2017-03-17 02:09:30'),
   DATE_TRUNC('century', TIMESTAMP '2017-03-17 02:09:30'),
   DATE_TRUNC('millennium', TIMESTAMP '2017-03-17 02:09:30');
Copy

출력 코드:

SELECT
      !!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - DECADE FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
      DATE_TRUNC('decade', TIMESTAMP '2017-03-17 02:09:30'),
      !!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - CENTURY FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
      DATE_TRUNC('century', TIMESTAMP '2017-03-17 02:09:30'),
      !!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - MILLENNIUM FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
      DATE_TRUNC('millennium', TIMESTAMP '2017-03-17 02:09:30');
Copy

권장 사항

SSC-EWI-PG0015

심각도

Medium

설명

PostgreSQL 에서는 FETCH 문 을 사용하여 INTO 절을 사용하지 않고도 가져온 행의 값을 콘솔에 직접 표시할 수 있습니다. 그러나 Snowflake를 사용하는 경우 FETCH 문 에 INTO 절을 포함하여 가져온 값을 저장할 변수를 지정해야 합니다.

SnowConvert 에서 INTO 절이 없는 FETCH 문을 발견하면 오류, 경고 또는 정보(EWI) 메시지를 생성하여 사용자에게 이 FETCH 구문이 지원되지 않음을 알립니다.

코드 예제

입력 코드:

FETCH PRIOR FROM cursor1;
Copy

출력 코드:

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

권장 사항

SSC-EWI-PG0001

심각도

Medium

설명

이 오류는 SnowConvert 에서 age() 함수를 지원하지 않기 때문에 발생합니다.

코드 예제

입력 코드:

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

출력 코드:

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

권장 사항

  • Datediff 함수는 날짜 간의 시차를 계산하는 데 도움이 됩니다. 특정 날짜 범위를 가져오는 데 사용할 수 있지만 각 사용 케이스에 맞게 구현을 사용자 지정해야 합니다. 자세한 내용은 Datediff 에 대한 Snowflake 설명서를 참조하십시오.

  • 추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.

SSC-EWI-PG0011

심각도

낮음

설명

PostgreSQL 시퀀스 문에는 Snowflake의 기능과 호환되지 않는 특정 옵션이 있습니다.

현재 지원되지 않는 기능은 다음과 같습니다.

  • 기록되지 않음: 시퀀스가 미리 쓰기 로그(WAL)에 기록되지 않습니다

  • AS <data_type>: 시퀀스의 데이터 타입을 지정합니다

  • MinValue: 시퀀스의 최소값을 설정합니다

  • MaxValue: 시퀀스의 최대값을 설정합니다

  • MinValue 수: 최소값 제한을 제거합니다

  • MaxValue 수: 최대값 제한을 제거합니다

  • 캐시: 메모리에 미리 할당할 시퀀스 번호의 수를 지정합니다

  • 사이클: 제한에 도달하면 시퀀스를 다시 시작하도록 허용합니다

  • 소유자 기준: 특정 사용자에게 시퀀스의 소유권을 할당합니다

코드 예제

입력 코드:

CREATE UNLOGGED SEQUENCE sequence_name;
Copy

출력 코드:

--** SSC-FDM-PG0009 - THE SEQUENCE NEXTVAL PROPERTY SNOWFLAKE DOES NOT GUARANTEE GENERATING SEQUENCE NUMBERS WITHOUT GAPS. **
CREATE UNLOGGED !!!RESOLVE EWI!!! /*** SSC-EWI-PG0011 - 'UNLOGGED' IS NOT SUPPORTED BY SNOWFLAKE. ***/!!! SEQUENCE sequence_name;
Copy

권장 사항

SSC-EWI-PG0010

심각도

낮음

설명

PostgreSQL 에서 임시 시퀀스를 생성하면 현재 세션 중에만 있으며 세션이 종료되면 자동으로 제거됩니다. Snowflake는 임시 시퀀스를 지원하지 않으므로 SC 에서는 일반 시퀀스로 변환합니다. 같은 이름의 시퀀스가 Snowflake에 이미 존재하는 경우 명명 충돌이 발생하여 오류가 발생할 수 있습니다.

코드 예제

입력 코드:

CREATE TEMPORARY SEQUENCE sequence1;
CREATE TEMP SEQUENCE sequence2;
Copy

출력 코드:

--** SSC-FDM-PG0009 - THE SEQUENCE NEXTVAL PROPERTY SNOWFLAKE DOES NOT GUARANTEE GENERATING SEQUENCE NUMBERS WITHOUT GAPS. **
CREATE TEMPORARY !!!RESOLVE EWI!!! /*** SSC-EWI-PG0010 - CREATE TEMPORARY SEQUENCE IS NOT SUPPORTED BY SNOWFLAKE. ***/!!! SEQUENCE sequence1;


--** SSC-FDM-PG0009 - THE SEQUENCE NEXTVAL PROPERTY SNOWFLAKE DOES NOT GUARANTEE GENERATING SEQUENCE NUMBERS WITHOUT GAPS. **
 CREATE TEMP !!!RESOLVE EWI!!! /*** SSC-EWI-PG0010 - CREATE TEMPORARY SEQUENCE IS NOT SUPPORTED BY SNOWFLAKE. ***/!!! SEQUENCE sequence2;
Copy

권장 사항

  • 생성 중에 문제가 발생하면 시퀀스 이름을 변경하여 이름 충돌을 방지하십시오.

  • 추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.

SSC-EWI-PG0004

심각도

Medium

설명

PostgreSQL 에서 사용할 수 있는 EXCLUDE 제약 조건은 현재 Snowflake에서 지원되지 않습니다.

코드 예제

입력 코드:

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

출력 코드:

CREATE TABLE Table1 (
    id      int,
    !!!RESOLVE EWI!!! /*** SSC-EWI-PG0004 - EXCLUDE CONSTRAINT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
    EXCLUDE USING gist (id WITH &&)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';
Copy

권장 사항

SSC-EWI-PG0014

심각도

보통

설명

Snowflake에서 FETCH cursor 문은 커서의 다음 행을 검색합니다. 코드를 변환할 때 SnowConvert 는 커서 탐색 명령을 FETCH NEXT 와 동일한 성능으로 변환하므로 Snowflake에서 동일한 함수를 수행합니다.

  • FETCH NEXT: 결과 세트에서 다음 행을 검색합니다

  • FETCH FORWARD: 다음 행을 검색하기 위해 앞으로 이동합니다

  • FETCH RELATIVE 1 : 현재 위치에서 한 행을 앞으로 이동합니다

  • FETCH (방향 없음): 기본 앞으로 이동을 사용하여 다음 행을 가져옵니다

기본 방향 이외의 방향은 지원되지 않습니다. 사용하는 경우 FETCH 문은 오류, 경고 또는 정보(EWI) 메시지로 표시됩니다.

코드 예제

입력 코드:

CREATE OR REPLACE PROCEDURE cursor_test()
AS $$
BEGIN
   FETCH FORWARD FROM cursor1 INTO my_var;
   FETCH FIRST FROM cursor1 INTO my_var;
   FETCH LAST FROM cursor1 INTO my_var;
END;
$$;
Copy

출력 코드:

CREATE OR REPLACE PROCEDURE cursor_test ()
RETURNS VARCHAR
AS $$
BEGIN
   FETCH
   	cursor1 INTO my_var;
   !!!RESOLVE EWI!!! /*** SSC-EWI-PG0014 - SNOWFLAKE SCRIPTING CURSORS DO NOT SUPPORT FETCH ORIENTATION. ***/!!!
   FETCH FIRST FROM cursor1 INTO my_var;
   !!!RESOLVE EWI!!! /*** SSC-EWI-PG0014 - SNOWFLAKE SCRIPTING CURSORS DO NOT SUPPORT FETCH ORIENTATION. ***/!!!
   FETCH LAST FROM cursor1 INTO my_var;
END;
$$;
Copy

권장 사항