ユーザ用ツール

サイト用ツール


it技術:データベース:postgresql:pg_repack

文書の過去の版を表示しています。


pg_repack

ビルドできても例外エラー

2021年の質問:Windowsでpg_repackをビルドしても例外エラーになってしまう。
pg_repack binaries under windows

下記サイトは2018年のもので静的なpostgres.libを作成して動作したとの報告があったが、現在は postgres.lib が提供されており、上記サイトでも postgres.lib をリンクしても、例外エラーで動作しないことから問題は別物と考える。

調査

pg_repack のデバッグでは、set_pglocale_pgservice(argv[0], “pgscripts”); を実行すると例外エラーとなる。
vaccumedb のデバッグでは、set_pglocale_pgservice(argv[0], “pgscripts”); を使用していても正常に動作する。違いとしてvaccumedb では、postgres.lib をリンクしていない。

pg_repack以外で exe形式で postgres.lib をリンクしたものは他にない。

関数モジュールソース元
set_pglocale_pgservicelibpgcommon.lib
setlocale(pgwin32_setlocale)libpgport.lib
select(pgwin32_select)postgres.libbackend¥port¥win32¥socket.c
pgwin32_dispatch_queued_signalspostgres.libbackend¥port¥win32¥signal.c
errstartpostgres.libbackend\utils\error\elog.c

pg_repack を pgwin32_selectで検索しても見つからないが、select で検索すると見つかる。
ret = select(max_fd + 1, &input_mask, NULL, NULL, &timeout);

win32.port.h
#define setlocale(a,b) pgwin32_setlocale(a,b)
#define select(n, r, w, e, timeout) pgwin32_select(n, r, w, e, timeout)

pg_hello を作成して postgres.lib をリンクしないで pg_repack.c のソースコードに徐々に近づけた。
そして、rebuild_indexes で pgwin32_select が参照している旨のLINKエラーのみになった。

そこで、pg_repack.c を、pg_hello.c に名前を変更してビルド、同様に rebuild_indexes で、pgwin32_select が参照している旨のLINKエラーのみになった。

下記のコードをコメントアウトすると、LINKエラーは出なくなる。

ret = select(max_fd + 1, &input_mask, NULL, NULL, &timeout);

select関数の参照先の違い

pg_repack の select関数 は、win32_port.h → socket.c の pgwin32_select関数 を参照している。
pgbench や pg_recvlogical の select関数 は、winSock2.h の select関数 を参照している。

select関数 を win32_port.h か winSock2.h を参照させる違いはどこにあるのか?

必要なobjファイルだけをリンク

socket.c、singal.c、elog.c

関数名モジュール名
ExceptionalConditionasset.c
pg_codepage_to_encodingchklocale.c
it技術/データベース/postgresql/pg_repack.1751677111.txt.gz · 最終更新: 2025/07/05 09:58 by yajuadmin