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

重大性

説明

このエラーは、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

重大性

説明

このエラーは、 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

推奨事項

  • ユーザー側からのアクションは必要ありません。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

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 関数は、日付と時刻のデータ型をテキスト形式に変換する際の 間隔 パラメーターをサポートしていません。

コード例

入力コード:

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

重大性

説明

このエラーは、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

重大性

説明

PostgreSQL では、 INTO 句を使用せずに、 FETCH ステートメント を使用して、取得した行値を直接コンソールに表示することができます。ただし、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

重大性

説明

このエラーは、 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の関数と互換性のないオプションがあります。

以下の機能は現在サポートされていません。

  • Unlogged: シーケンスは先書きログ(WAL)に書き込まれません

  • AS <data_type>: シーケンスのデータ型を指定します

  • MinValue: シーケンスの最小値を設定します

  • MaxValue: シーケンスの最大値を設定します

  • No MinValue: 最小値制限を解除します

  • No MaxValue: 最大値制限を解除します

  • Cashe: メモリに事前に割り当てるシーケンス番号の数を指定します

  • Cycle: シークエンスが制限に達したときに再スタートできるようにします

  • Owner By: シーケンスの所有権を特定のユーザーに割り当てます

コード例

入力コード:

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

重大性

説明

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 カーソル ステートメントは、カーソルから次の行を取得します。コードを変換する際、 SnowConvert はカーソルナビゲーションコマンドを変換します。これらのコマンドはSnowflakeで同じ関数を実行するため、 FETCH NEXT と同等です。

  • FETCH NEXT: 結果セットから次の行を取得します。

  • FETCH FORWARD: 次の行を取得するために前進します。

  • FETCH RELATIVE 1: 現在の位置から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

推奨事項