PostgreSQL 8.3.3 に関する技術情報

このリリースは 8.3.2 からの修正リリース(2008/06/12リリース)です。
本ドキュメントは PostgreSQL のリリースノートを基に作成しています。
8.3.x からのアップデートではダンプ、リストアは不要です。

しかし、8.3.1 より前のバージョンからアップグレードする場合は、8.3.1 に関する技術情報を参照してください。

PostgreSQL 8.3.2 から 8.3.3 への変更点


    1. WindowsでデータベースエンコーディングにUTF-8を使用し、かつ、それと異なるクライアントエンコーディングを使用しているときに生じる、ERRORDATA_STACK_SIZE exceededクラッシュを修正しました (Tom)
    2. restore_command パラメータの%rマクロにおける間違ったアーカイブ削除ポイント計算を修正しました (Simon)ウォームスタンバイスクリプトが、WALセグメントファイルをいつ捨てるかの決定に%rを利用している場合、データ損失が生じる恐れがありました。
    3. 新しい列が非NULLで初期化されているかどうか正しく検査されるようにALTER TABLE ADD COLUMN … PRIMARY KEYを修正しました (Brendan Jurd)以前のバージョンでは、まったくこの必要条件を検査していませんでした。

PostgreSQL 8.3.1

release=> CREATE TABLE test (a TEXT);
CREATE TABLE
release=> INSERT INTO test VALUES ('test');
INSERT 0 1
release=> ALTER TABLE test ADD COLUMN id INT PRIMARY KEY;
NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "test_pkey" for table "test"
ALTER TABLE
release=> d test
     Table "public.test"
 Column |  Type   | Modifiers
--------+---------+-----------
 a      | text    |
 id     | integer | not null
Indexes:
    "test_pkey" PRIMARY KEY, btree (id)
release=> SELECT * FROM test WHERE id IS NULL;
  a   | id
------+----
 test |
(1 row)

PRIMARY KEY制約を付けたにもかかわらず、NULLで初期化されたid列が追加されます。

PostgreSQL 8.3.3

release=> CREATE TABLE test (a TEXT);
CREATE TABLE
release=> INSERT INTO test VALUES ('test');
INSERT 0 1
release=> ALTER TABLE test ADD COLUMN id INT PRIMARY KEY;
NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "test_pkey" for table "test"
ERROR:  column "id" contains null values
release=> d test
    Table "public.test"
 Column | Type | Modifiers
--------+------+-----------
 a      | text |

PRIMARY KEY制約を付けるとid列が検査され、エラーが発生します。
従って、PRIMARY KEY制約をつける場合、対象列はSERIAL型やデフォルト値を使用するなどして、NULLを防ぐ必要があります。

    1. 手続き言語でも動作するようにREASSIGN OWNEDを修正しました (Alvaro)

PostgreSQL 8.3.1

release=# CREATE USER old_user SUPERUSER;
CREATE ROLE
release=# CREATE USER new_user SUPERUSER;
CREATE ROLE
release=# CREATE LANGUAGE plpgsql;
CREATE LANGUAGE
release=# ALTER LANGUAGE plpgsql OWNER TO old_user;
ALTER LANGUAGE
release=# REASSIGN OWNED BY old_user TO new_user;
ERROR:  unexpected classid 2612

PostgreSQL 8.3.3

release=# CREATE USER old_user SUPERUSER;
CREATE ROLE
release=# CREATE USER new_user SUPERUSER;
CREATE ROLE
release=# CREATE LANGUAGE plpgsql;
CREATE LANGUAGE
release=# ALTER LANGUAGE plpgsql OWNER TO old_user;
ALTER LANGUAGE
release=# REASSIGN OWNED BY old_user TO new_user;
REASSIGN OWNED
    1. 最上位の操作がSELECTではない問い合わせで、サブクエリとしてSELECT FOR UPDATE/SHAREを用いると起きる問題を修正しました (Tom)
    2. 共通の先祖から制約を継承した親リレーションから、”同じ”制約を継承しているときにCREATE TABLEが失敗する可能性を修正しました (Tom)
    3. UPDATEやDELETEの対象テーブルに別名が付いている場合、それを表示するようにpg_get_ruledef()を修正しました (Tom)
    4. TidScan プランで使われる TID が範囲外のブロック番号だった場合には一致する行がないという結果を返す、という8.3以前の挙動に戻しました (Tom)8.3.0と8.3.1は代わりにエラーが発生します。
    5. too many LWLocks taken failureという結果になるGINのバグを修正しました (Teodor)
    6. tsqueryのための壊れたGiST比較関数を修正しました (Teodor)
    7. 動作する見込みのある型のドメインを受け入れるようにtsvector_update_trigger()とts_stat()を修正しました (Tom)
    8. 列挙型に対する外部キー制約が正しく動作しない不具合を修正しました (Tom)

PostgreSQL 8.3.1

release=> CREATE TYPE xyz AS ENUM ('X', 'Y', 'Z');
CREATE TYPE
release=> CREATE TABLE t1 (a TEXT, b xyz, c INT, PRIMARY KEY(a, b));
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t1_pkey" for table "t1"
CREATE TABLE
release=> CREATE TABLE t2 (a TEXT, b xyz, FOREIGN KEY (a, b) REFERENCES t1 (a, b));
CREATE TABLE
release=> INSERT INTO t1 VALUES ('test', 'X', 1);
INSERT 0 1
release=> UPDATE t1 SET c = 2;
ERROR:  no conversion function from abc to anyenum

PostgreSQL 8.3.3

release=> CREATE TYPE xyz AS ENUM ('X', 'Y', 'Z');
CREATE TYPE
release=> CREATE TABLE t1 (a TEXT, b xyz, c INT, PRIMARY KEY(a, b));
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t1_pkey" for table "t1"
CREATE TABLE
release=> CREATE TABLE t2 (a TEXT, b xyz, FOREIGN KEY (a, b) REFERENCES t1 (a, b));
CREATE TABLE
release=> INSERT INTO t1 VALUES ('test', 'X', 1);
INSERT 0 1
release=> UPDATE t1 SET c = 1;
UPDATE 1
    1. 不正なデータを伸長する時にクラッシュする可能性を回避しました (Zdenek Kotala)
    2. 遅延削除とDROP DATABASEの競合条件を修正しました (Heikki)最悪の場合、直近で削除したテーブルと新規作成したテーブルの OID が同じだった場合に、新しいテーブルが削除されてしまう可能性があります。しかし、これは非常に低い確率です。
    3. SIGTERM によるバックエンドの終了が共有メモリの一部を破壊していた 2 箇所を修正しました (Tom)SIGTERMがデータベースクラスタ全体を同時に終了させるために使用される場合、どちらも特に重要ではありません。しかし、個々のバックエンドに対してSIGTERMを試みる場合には問題があります。
    4. x と y が異なるデータ型を持っているとき、x IN (SELECT y FROM …)節に対して不正な計画が生成されることによるクラッシュの可能性を修正しました(Tom)
    5. 既知のParam値が定数である場合、プランナがそれを代用することを妨げた不注意な誤りを修正しました (Tom)8.3.0と8.3.1において、この誤りは無名の拡張問い合わせ文の最適化を部分的に無効にしました。特に、LIKEのパターンが変数を介している場合、インデックススキャンのLIKE最適化は決して適用されませんでした。また、変>数値に依存した制約による除外も動作しませんでした。
    6. インデックス可能なMINもしくはMAX集約を、DISTINCTまたはORDER BYと一緒に使用したときのプランナの失敗を修正しました (Tom)

PostgreSQL 8.3.1

release=> CREATE TABLE t1 (i INT PRIMARY KEY);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t1_pkey" for table "t1"
CREATE TABLE
release=> INSERT INTO t1 VALUES (1);
INSERT 0 1
release=> SELECT DISTINCT MAX(i) FROM t1;
ERROR:  could not find pathkey item to sort

PostgreSQL 8.3.3

release=> CREATE TABLE t1 (i INT PRIMARY KEY);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t1_pkey" for table "t1"
CREATE TABLE
release=> INSERT INTO t1 VALUES (1);
INSERT 0 1
release=> SELECT DISTINCT MAX(i) FROM t1;
 max
-----
  1
(1 row)
    1. Sortノードを提供している計画ノードで、プランナが”physical tlist”を確実に使用しないように修正しました (Tom)これにより未使用の列の値がソート済みのデータに含まれていたため、本来必要とする以上のデータをソート処理していました。
    2. 問い合わせ文字列の不必要なコピーを回避しました (Tom)これは、8.3.0で入った非常に多数のコマンドが単一の問い合わせ文字列として送信されたときの性能の問題を修正します。
    3. 子トランザクションXIDを検査するとき、TransactionIdIsCurrentTransactionId()が線形探索の代わりに二分探索を使用するようにしました (Heikki)これは、8.3.0において以前のリリースよりもかなり遅くなるいくつかのケースを修正します。
    4. キリル語の”Yo”文字(2つの点を持つeとE)を扱うISO-8859-5とその他のエンコーディング間の変換を修正しました (Sergey Burladyan)
    5. いくつかのデータ型入力関数、特に結果として未初期化、予期できない値を含むを未使用のバイトを許すarray_in()を修正しました (Tom)これは、2つの外見上まったく同じ値が等しく認知されず、一致しなかったORDER BYとDISTINCT式についてパーサエラーとなる可能性がありました。
    6. 正規表現の部分文字列一致での境界問題を修正しました (Tom)この問題は、パターン全体は一致するが、ユーザがカッコに入れた副式を指定し、その副式が一致するときに問題が起きます。たとえば、substring(‘foo’ from ‘foo(bar)?’)です。これは、(bar)が一致しないのでNULLを返すべきですが、誤ってパターン全体が一致(つまりfoo)と返していました。

PostgreSQL 8.3.1

release=> SELECT substring('foo' from 'foo(bar)?');
 substring
-----------
   foo
(1 row)

PostgreSQL 8.3.3

release=> SELECT substring('foo' from 'foo(bar)?');
 substring
-----------

(1 row)
  1. XID周回を回避するために起動されたauto-vacuumの取り消しを防ぎます (Alvaro)
  2. 統計情報コレクタに報告する数値がより正確になるように、ANALYZEでの信用できないタプル(まだコミットされていないトランザクションによって挿入または削除されたタプル)の扱いを改良しました(Pavan Deolasee)
  3. –xlogdir (-X)オプションにおいて相対パスを拒絶するようにinitdbを修正しました (Tom)
  4. psqlがタブ文字を8.3.0と8.3.1で使用されたx09ではなく、適切な数の空白で出力するようにしました (Bruce)タイムゾーンデータファイルをtzdataリリース2008c(モナコ、イラク、チョイバルサン、パキスタン、シリア、キューバ、アルゼンチン/サンルイスにおける昼時間規則の変更)に更新しました。
  5. ecpglibにECPGget_PGconn()関数を追加しました (Michael)
  6. ecpgのPGTYPEStimestamp_sub()関数からの不正な結果を修正しました (Michael)
  7. ecpgでの継続ラインマーカの扱いを修正しました (Michael)
  8. contrib/cube関数でクラッシュする可能性を修正しました (Tom)
  9. 入力問い合わせがNULL値を返すときのcontrib/xml2’s xpath_table()関数のコアダンプを修正しました (Tom)
  10. contrib/xml2のmakefileがCFLAGSを上書きしないように修正し、libxsltの有無を適切に自動構成するようにしました (Tom)
  11. pg_get_ruledef()において、負の定数を括弧でくくるようにしました (Tom)この修正の前は、ビューまたはルールにおいて-42::integerのような微妙に正しくない負の定数がダンプされる可能性がありました。これは、演算子優先規則により(-42)::integerとするべきです。通常、これは大差ありませんが、他の最近のパッチと相互作用して、PostgreSQLが正しいSELECT DISTINCTビューの問い合わせを拒絶する可能性がありました。これは、pg_dumpの出力がリロードに失敗するという結果になる可能性があるため、高い優先度の修正として扱われました。実際にダンプ出力が不正になるリリースバージョンは8.3.1と8.2.7のみです。
  12. ALTER AGGREGATE … OWNER TOがpg_shdependを更新するようにしました (Tom)この不注意な誤りは、集約がのちにDROP OWNEDまたはREASSIGN OWNED操作に関わる場合、問題となる可能性があります。