本ドキュメントでは、AnalyticDB for PostgreSQL V4.3 と V6.0 の間で発生する非互換変更および動作の違いについて説明します。アップグレードを実行する前に、各セクションを確認し、影響範囲を評価したうえで必要な修正を行ってください。
アップグレード前のチェックリスト
アップグレードを実行する前に、以下の項目を確認してください。各項目は、詳細および対応手順が記載された該当セクションへのリンクになっています。
[ ] クエリ オプテマイザー — デフォルトのオプテマイザーが Legacy から ORCA に変更されます。クエリのテストを実施してください。
[ ] エスケープ文字 — 文字列内のバックスラッシュ (\) は、エスケープ文字として機能しなくなります。
[ ] データの型変換 — V6.0 では、数値型を TEXT 型へ暗黙的に変換しなくなります。影響を受ける SQL を書き換えてください。
[ ] 外部テーブルのエラーログ —
INTO error_table句が削除されました。ビルトイン関数に切り替えてください。[ ] データの型 — 5 種類のデータの型が、分散キーとして使用できなくなります。
[ ] キーワード — 一部のキーワードのカテゴリが変更されます。オブジェクト名との衝突にご注意ください。
[ ] システムテーブル — 6 つのシステムテーブルのカラムが名称変更または削除されます。これらのカラムを参照するコードを更新してください。
[ ] 組み込み関数のパラメーター —
int4_avg_accumとstring_aggのシグネチャが変更されました。
クエリ オプテマイザー
| 項目 | V4.3 | V6.0 |
|---|---|---|
| デフォルトのクエリ オプテマイザー | Legacy | ORCA |
両バージョンとも Legacy および ORCA のクエリ オプテマイザーをサポートしています。V6.0 では、デフォルトのオプテマイザーが Legacy から ORCA に変更されます。「クエリ オプテマイザーの選択」については、「クエリ オプテマイザーの選択」をご参照ください。
対応策: アップグレード前に、ORCA オプテマイザーを使用してワークロードのテストを実施してください。問題が発生した場合は、セッションレベルで Legacy に切り替えてください。
エスケープ文字
V6.0 では、文字列内のバックスラッシュ (\) は、リテラル文字として扱われ、エスケープ文字としては機能しません(デフォルトで standard_conforming_strings = on)。
セッションレベルでバックスラッシュによるエスケープを再有効化するには、次のコマンドを実行します:
SET standard_conforming_strings = off;この設定は、現在のセッションのみに適用されます。インスタンスレベルで設定する場合は、チケットを送信してサポートをご依頼ください。
対応策: SQL 内のバックスラッシュによるエスケープシーケンスを確認し、SQL 標準に準拠したエスケープ(例:リテラルのシングルクォートを表す '')に更新してください。
データの型変換
V6.0 では、V4.3 でサポートされていた以下の 2 つの暗黙的な型変換が削除されます:
1. `YYYYMMDDHH24MISS` 形式の文字列はタイムスタンプへ自動変換されません。
to_timestamp または to_char を明示的に使用してください:
-- YYYYMMDDHH24MISS 形式の文字列をタイムスタンプに変換
SELECT to_timestamp('20240101123045', 'YYYYMMDDHH24MISS');2. 数値型は TEXT 型へ暗黙的に変換されません。
影響を受ける SQL ステートメントの互換性を復元するために、ラッパー関数を追加してください:
CREATE OR REPLACE FUNCTION substr(numeric, integer, integer) RETURNS text AS $$
SELECT substr($1::text, $2, $3);
$$ LANGUAGE sql IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION pg_catalog.btrim(str numeric) RETURNS text AS $$
RETURN $_[0];
$$ LANGUAGE plperl IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION to_date(timestamp, text) RETURNS date AS $$
SELECT to_date($1::text, $2);
$$ LANGUAGE sql IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION to_date(integer, text) RETURNS date AS $$
SELECT to_date($1::text, $2);
$$ LANGUAGE sql IMMUTABLE STRICT;対応策: 暗黙的な数値型 → TEXT 型変換に依存する SQL ステートメントおよび関数を特定してください。上記のラッパー関数を追加するか、明示的なキャスト(value::text)を使用するよう SQL を書き換えてください。
外部テーブルのエラーログ
V6.0 では、INTO error_table 句が、CREATE EXTERNAL TABLE および COPY ステートメントから削除されます。
代わりに、以下のビルトイン関数を使用してください:
-- 外部テーブルのエラーログを読み取る
SELECT * FROM gp_read_error_log('<external_table_name>');
-- 外部テーブルのエラーログをクリアする
SELECT gp_truncate_error_log('<external_table_name>');対応策: すべての CREATE EXTERNAL TABLE および COPY ステートメントから INTO error_table を削除してください。エラー処理ロジックを更新し、gp_read_error_log および gp_truncate_error_log を使用するようにしてください。
データの型
2 つのストレージレベルの変更により、アップグレード後のディスク領域に影響があります:
NUMERIC 型のストレージ形式が変更されるため、この型のカラムのディスク領域に影響があります。
MONEY 型が 32 ビットから 64 ビットに変更されるため、これもディスク領域に影響があります。
さらに、V6.0 では以下のデータの型を分散キーとして使用できなくなります:
abstimereltimetintervalmoneyanyarray
対応策: 上記のいずれかの型を分散キーとして使用しているテーブルがある場合、アップグレード前に分散キーを再定義してください。NUMERIC 型および MONEY 型のカラムについては、アップグレード後の増加するディスク領域を考慮してください。
キーワード
V6.0 では、複数のキーワードのカテゴリが変更されます。新たに予約キーワードとなったキーワードと一致するオブジェクト名(テーブル、ビュー、関数、インデックス、カラム、型など)を使用すると、エラーが発生します。
現在のインスタンスですべてのキーワードとそのカテゴリを表示するには:
SELECT * FROM pg_get_keywords();キーワードのカテゴリコード
| コード | カテゴリ | オブジェクト名として使用可能 |
|---|---|---|
| U | 未予約 | すべてのオブジェクト |
| C | 未予約(関数および型名には使用不可) | 関数および型を除くすべてのオブジェクト |
| T | 予約(関数および型名には使用可能) | 関数および型のみ |
| R | 予約 | 使用不可 |
V4.3 から V6.0 へのカテゴリ変更
| キーワード | V4.3 | V6.0 |
|---|---|---|
| between | R | C |
| collation | なし | T |
| concurrently | U | T |
| convert | C | なし |
| filter | R | U |
| lateral | 該当なし | R |
| new | R | なし |
| off | R | U |
| old | R | なし |
| percentile_cont | C | なし |
| percentile_disc | C | なし |
| range | R | U |
| reindex | U | R |
| rows | R | U |
| sort | R | T |
| variadic | なし | R |
対応策: V6.0 で予約キーワードとなったキーワード(collation、concurrently、lateral、reindex、variadic)と同名のデータベースオブジェクトがないか確認してください。リスクのあるオブジェクトを検出するには、次のクエリを実行してください:
-- 新たに予約キーワードと衝突するテーブルおよびカラム名を検索
SELECT n.nspname AS schema, c.relname AS table_name, a.attname AS column_name
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid
WHERE c.relkind IN ('r', 'v', 'm')
AND NOT a.attisdropped
AND a.attname IN ('collation', 'concurrently', 'lateral', 'reindex', 'variadic')
ORDER BY schema, table_name, column_name;衝突するオブジェクトは、アップグレード前に名前を変更するか、SQL ステートメント内で引用符で囲んでください。
システムテーブル
V6.0 では、複数のシステムテーブルのカラムが名称変更または削除されます。以下のカラムを参照するアプリケーションコードまたはクエリを更新してください:
| V4.3 | V6.0 | 変更内容 |
|---|---|---|
pg_class.reltoastidxid | — | 削除 |
pg_stat_activity.procpid | pg_stat_activity.pid | カラム名変更 |
pg_stat_activity.current_query | pg_stat_activity.state、pg_stat_activity.query | 2 つのカラムに分割:state(バックエンド状態)、query(現在実行中のステートメント) |
gp_distribution_policy.attrnums | gp_distribution_policy.distkey | カラム名変更;データの型が int2vector |
sesion_level_memory_consumption.__gp_localid、sesion_level_memory_consumption.__gp_masterid | — | 削除 |
pg_filespace、pg_filespace_entry | — | 削除 |
対応策: コードベース内で、左側の V4.3 のカラム名を検索し、右側の V6.0 の等価なカラム名に更新してください。
ビルトイン関数のパラメーター
V6.0 では、2 つのビルトイン関数のシグネチャが変更されています:
| V4.3 | V6.0 | 変更内容 |
|---|---|---|
int4_avg_accum(bytea, integer) | int4_avg_accum(bigint[], integer) | 第 1 パラメーターの型が bytea から bigint[] |
string_agg(expression) | string_agg(expression, delimiter) | delimiter パラメーターが必須化 |
対応策: string_agg の呼び出しすべてに delimiter 引数を追加してください。int4_avg_accum がカスタム集約関数で参照されている場合は、関数シグネチャを適宜更新してください。
V6.0 の新機能
V6.0 では、V4.3 では利用できなかった以下の機能が追加されています:
| 機能 | V4.3 | V6.0 |
|---|---|---|
LEFT() 関数 | 未サポート | サポート |
| 分散キーのカラムに対する UPDATE 操作 | 未サポート | サポート |
アップグレード後の手順
アップグレード後に、すべてのデータベースに対して ANALYZE を実行し、統計情報を再生成してください。クエリ オプテマイザーは最新の統計情報に依存しており、メジャーバージョンアップ時に統計情報は継承されません。
ANALYZE VERBOSE;アップグレードプロセスに関するお問い合わせは、「AnalyticDB for PostgreSQL のアップグレードガイド」をご参照いただくか、チケットを送信してテクニカルサポートをご依頼ください。