お問い合わせ
03-5979-2701
PowerGres
不具合情報

PowerGres Plus 障害情報 (2007 年 3 月 7 日公開)

初出
2007 年 3 月 7 日
最終更新
2007 年 3 月 8 日
====================================================================
【管理番号】
 PG54658

【概要】
 SELECTでの集計、ソート、結合、重複行の排除処理の実行による検索結果異常や 
 CLUSTERでの行数の増加または不当な一意性制約違反が発生する場合がある。

【現象】
 以下の条件のとき、次のような検索結果異常や処理結果異常が発生する場合がある。
 ・本来よりも件数が多い結果
 ・GROUP BYにより正しくグループに分割されない結果
 ・ORDER BYにより正しく整列されない結果
 ・DISTINCTまたはDISTINCT ONにより正しく重複行が排除されない結果
 ・CLUSTERコマンドの実行によるテーブルの行数の不当な増加
 ・CLUSTERコマンドの実行による不当な一意性制約違反

 [発生条件]
 1) 以下のいずれかの処理を実行する。
  1-1) NULL値が格納されたテーブルの列に対し、インデックスを定義する。
    または、
  1-2) NULL値が格納されたテーブルの列に定義されたインデックスを再構築する。
    または、
  1-3) インデックスが定義されたテーブルの列に対し、高速コピー機能により
    NULL値を格納する。または、
  1-4) NULL値が格納されたテーブルの列にインデックスが定義されている場合に、
    高速コピー機能により、当該テーブルに任意のデータを格納する。
  かつ、
 2) 1)の実行後、以下のいずれかの処理を実行する。
  2-1) DELETEコマンドにより、当該テーブルの当該インデックスが定義されて
    いる列にNULL値が格納されている行を削除する。または、
  2-2) UPDATEコマンドにより、当該テーブルの当該インデックスが定義されて
    いる列にNULL値が格納されている行を更新する。
  かつ、
 3) 2)の実行後、以下のいずれかの処理を実行する。
  3-1) INSERTコマンドにより、当該テーブルに行を挿入する。または、
  3-2) 高速コピーでない通常のCOPYコマンドにより、当該テーブルに行を格納する。
    または、
  3-3) UPDATEコマンドにより、当該テーブルの行を更新する。
  かつ、
 4) 3)の実行後、以下のいずれかの処理を実行する。
  4-1) 当該インデックスが定義された列をGROUP BY句に指定した問合せを実行する。
    または、
  4-2) 当該インデックスが定義された列をORDER BY句に指定した問合せを実行する。
    または、
  4-3) 当該インデックスが定義された列を結合条件として指定し、テーブルの
    結合処理を伴う問合せを実行する。または、
  4-4) DISTINCT句またはDISTINCT ON句に当該インデックスが定義された列を
    指定した問合せを実行する。または、
  4-5) 当該インデックスを使用してCLUSTERコマンドを実行する。

【原因】
 インデックス作成処理またはインデックス再構築処理または高速コピー処理に
 おいて、NULL値に対するインデックスキーの生成処理に誤りがあり、インデックス
 が不当な状態となる場合があった。

【回避方法】
 本障害の発生条件に合致するテーブルに対し、以下の手順を実行する。

 1) COPYコマンドにより、当該テーブルの内容をファイルにコピーする。
 2) TRUNCATEコマンドにより、当該テーブルのデータを削除する。
 3) 高速コピーでない通常のCOPYコマンドにより、1)でファイルに退避した
  データを当該テーブルにコピーする。

 上記手順の実施後、当該テーブルに対し、インデックスの作成処理、インデックス
 の再構築処理、高速コピー処理を実行した場合、本手順を再度実行する必要がある。

 発生条件に該当する可能性のあるインデックスは、以下のSQL文の実行により、
 取得できます。

 下記のSQL文は 全てのバージョンで有効です。

 SELECT t2.nspname, t2.indexname FROM
     ( SELECT n.nspname AS nspname,
              c.relname AS tablename,
              a.attname AS attname
         FROM pg_namespace n, pg_class c, pg_attribute a
        WHERE n.oid = c.relnamespace
          AND c.relkind = 'r'
          AND c.oid = a.attrelid
          AND a.attnotnull = false) t1
 JOIN
     ( SELECT n.nspname AS nspname,
              c.relname AS tablename,
              ci.relname AS indexname,
              a.attname AS attname
         FROM pg_namespace n, pg_class c, pg_class ci, pg_index i,
              pg_attribute a
        WHERE n.oid = c.relnamespace
          AND c.oid = i.indrelid
          AND ci.oid = i.indexrelid
          AND i.indexrelid = a.attrelid) t2
 ON  t1.nspname = t2.nspname
 AND t1.tablename = t2.tablename
 AND t1.attname = t2.attname;

【発生環境】
 Linux/Windows版のすべてのバージョンで発生。

【修正予定】
 Windows版V1.0  PGPLUS10-09
 Windows版V2.0  PGPLUS20-06
 Linux版 V1.0  PGPLUS10-13
 Linux版 V1.1  PGPLUS11x-10
 Linux版 V2.0  PGPLUS20x-08
 Linux版 V2.1  PGPLUS21x-02
================================================================================