てきとうなさいと べぇたばん

PostgreSQLのソース読みたい

PostgreSQLのソースを

読んでみるか。と思った。

参考サイト

PostgreSQL の構造とソースツリー(1)—Let's Postgresから参考。

PosgreSQL9.1.xを読んでみるか。

方法

configure

とりあえずconfigure。--enable-debugをつけるのと同時に、--prefixオプションもつける。

$ ./configure --prefix=$HOME/postgresql/ --enable-debug

src/Makefile.globalを編集。-O2を削除、代わりに-gをつける。

$ vi src/Makefile.global

Makefile.globalがない、と思ったら、configureが生成することに気が付かなかった。

$ make
$ make instal
$ export PGPORT=14333l
$ postgresql/bin/pg_ctl init -D postgresql/data
$ postgresql/bin/pg_ctl start -D postgresql/data

とりあえず、インストールが完了した。psqlを呼びだそう。

$ postgresql/bin/psql postgres
psql (9.1.5)
Type "help" for help.

postgres=# SELECT 1;
 ?column?
----------
        1
(1 row)

psqlを呼び出したら、別のシェルでgdbを呼び出す。

$ ps ax | grep postgres
16863 ?        Ss     0:00 postgres: writer process
16864 ?        Ss     0:00 postgres: wal writer process
16865 ?        Ss     0:00 postgres: autovacuum launcher process
16866 ?        Ss     0:00 postgres: stats collector process
16877 pts/1    S+     0:00 postgresql/bin/psql postgres
16878 ?        Ss     0:00 postgres: tekitoh postgres [local] idle
17016 pts/2    S+     0:00 grep postgres
$ gdb postgres 16878

ブレークポイントを設定する。b 関数名

(gdb) b ExecResult
Breakpoint 1 at 0x8204f46: file nodeResult.c, line 75.

psqlに戻って、SELECT 1;を実行する。SELECT 1;の結果が出ない。

postgres=# SELECT 1;

またgdbに戻ってcを入力すると、ExecResultで止まっているのが分かる。

(gdb) c
Continuing.

Breakpoint 1, ExecResult (node=0xa5cab48) at nodeResult.c:75
75              econtext = node->ps.ps_ExprContext;
(gdb) list
70              TupleTableSlot *resultSlot;
71              PlanState  *outerPlan;
72              ExprContext *econtext;
73              ExprDoneCond isDone;
74
75              econtext = node->ps.ps_ExprContext;
76
77              /*
78               * check constant qualifications like (2 > 1), if not already done
79               */

btと入力してそこまでの過程が表示される。

(gdb) bt
#0  0xb764927c in recv () from /lib/libc.so.6
#1  0x08213ebd in secure_read (port=0xa54c758, ptr=0x855a8c0, len=8192) at be-secure.c:304
#2  0x0821da66 in pq_recvbuf () at pqcomm.c:816
#3  0x0821db03 in pq_getbyte () at pqcomm.c:857
#4  0x082df549 in SocketBackend (inBuf=0xbfa54894) at postgres.c:345
#5  0x082df8b4 in ReadCommand (inBuf=0xbfa54894) at postgres.c:467
#6  0x082e3e87 in PostgresMain (argc=2, argv=0xa52fe28, username=0xa52fd48 "tekitoh") at postgres.c:3932
#7  0x0829b336 in BackendRun (port=0xa54c758) at postmaster.c:3617
#8  0x0829a9fb in BackendStartup (port=0xa54c758) at postmaster.c:3302
#9  0x08297c9f in ServerLoop () at postmaster.c:1466
#10 0x08297442 in PostmasterMain (argc=3, argv=0xa52ed58) at postmaster.c:1127
#11 0x0821fc64 in main (argc=3, argv=0xa52ed58) at main.c:199

PostgreSQLのソースディレクトリに戻って、ctagsを作る。ソースコードを追っかけやすくするため。ちなみにvim版。

$ tools/make_ctags

疲れたのでもう寝る。おやすみなさい。

これが1週間前の話。

ついつい、何もしていなかった。