[pgsql-jp: 28783] Re: 空文字列を含むテーブルの\copy/pg_dump が失敗する

Tatsuo Ishii t-ishii @ sra.co.jp
2003年 1月 26日 (日) 20:03:51 JST


石井です.

> 新しくUNICODEデータベースを作ってみて
> test=# create table t1(t text);
> test=# insert into t1 values('');
> test=# \copy t1 to /tmp/aaa;
> としてみても再現しました。
> euc-jpデータベースの場合再現しませんでした。

もしかしてクライアント側のエンコーディングをUNICODE以外にしていますか?

> > 何か特別な要因があるかもしれないのでバックエンドが落ちたときのバック
> > トレースを見せていただけませんか?
> 
> すみません、バックトレースの見方がわかりません。
> よろしければ教えていただけませんか?

見方と言うか,まあ地道にソースコードと照らし合わせるだけなんですけどね:-)
その原因が結果わかるかもしれないし,わからないかもしれません.

念のためにバックとレースの取り方を説明しておきます.

まずPostgreSQLを-gオプション付でコンパイル,インストールしておきます.
configureからやるなら--enable-debugを付けますが,すでにコンパイル済の
ソースツリーが残っているのなら,configureをやり直さなくても,
src/Makefile.globalの

CFLAGS = -O2

を

CFLAGS = -g

に変更し,make cleanしてからmakeしなおせばよいです.インストールが終わっ
たら,psqlで問題のデータベースに接続してからpsコマンドでバックエンドプ
ロセスを探します.

20632 ?        S      0:00 postgres: ユーザ名 データベース名 [local] idle

のような行が見つかるはずですから,

cd ソースをコンパイルしたディレクトリ/src/backend

してから 

gdb ./postgres プロセス番号

でバックエンドプロセスにアタッチできます.後は,gdbから

cont

を入力してバックエンドプロセスの実行を再開し,psqlから問題のSQL文を入
力します.もしバックエンドが落ちる現象が再現できればgdbに制御が移って
いるはずですから,そこで

where

と入力してバックトレースを取ります.
--
Tatsuo Ishii



pgsql-jp メーリングリストの案内