本附錄把前面各章的概念對應到 PostgreSQL 18 原始碼樹中的位置。閱讀原始碼最有效的順序是: 先讀該目錄的 (PostgreSQL 的 README 是一流的設計文件),再讀標頭檔中的結構定義(),最後才讀 。
取得與建置
git clone https://git.postgresql.org/git/postgresql.git && cd postgresql
git checkout REL_18_STABLE
# Meson(推薦)或傳統 configure;--enable-cassert 開啟內部斷言,-O0 方便 gdb
meson setup build -Dcassert=true -Ddebug=true -Doptimization=0 --prefix=$HOME/pgdev
ninja -C build && ninja -C build install
$HOME/pgdev/bin/initdb -D $HOME/pgdata && $HOME/pgdev/bin/pg_ctl -D $HOME/pgdata -l logfile start
# 跑迴歸測試
meson test -C build --suite setup --suite regress
# 對某個 backend 除錯:先取得 pid,再 gdb attach
psql -c 'SELECT pg_backend_pid()'
gdb -p <pid> # break heap_insert ... continue,然後在 psql 執行 INSERT
常用的導覽工具:、、以及線上的 https://doxygen.postgresql.org/(可點擊的交叉參照)。 說明程式碼風格; 是所有 GUC 參數的清單。
目錄總覽
P5.0cmP9.0cm 路徑 & 內容
& 伺服器端全部程式碼(下表細分)
& 所有標頭檔;結構定義與巨集在這裡(如 、)
& 客戶端工具:、、、、、、
& 客戶端函式庫; 是協定的客戶端實作
、 & 前後端共用程式碼與可攜性層
& (SQL 迴歸測試)、(並行交錯測試,第 7–10 章的異常都有對應的 spec)、(複寫與復原的 TAP 測試)
& 隨附擴充套件:、、、、、、、
& 官方文件原始碼
概念對應表
P1.0cmP3.6cmP5.4cmP4.4cm 章 & 概念 & 路徑 & 入口與必讀
章 & 概念 & 路徑 & 入口與必讀
& 系統目錄 & 、、 & ; 是初始內容
1 & 關聯代數 \(\to\) 計畫節點 & 、、 & 每種運算子一個 struct
2 & 頁面佈局、slotted page & 、 & 、
2 & Heap tuple 與 heap AM & 、、 & ;、;、
2 & 檔案與 fork、FSM、VM & 、、 & (1 GB 分段)、
2 & TOAST & 、、 &
3 & B-Tree 索引 & & (Lehman–Yao、刪除、去重);、、
3 & 索引存取方法介面 & 、 & ;GIN/GiST/BRIN/Hash/SP-GiST 各在 下有 README
4 & Buffer pool & & ;(、 clock sweep)、(ring buffer)、、
4 & 非同步 I/O(PG 18) & & ;、、
5 & Parser / Analyzer / Rewriter & 、、; & 、;
5 & Executor & & ;、、、、、、、、、、
5 & 排序與 tuplestore & 、 & 外部合併排序、top-N heapsort
5 & 表達式求值與 JIT & 、、 & in
6 & Planner / Optimizer & & ;、、、、、
6 & 成本與選擇率 & 、 & 、、、
6 & 統計資訊 & 、(擴充統計)、 & in
7 & 交易狀態機、子交易 & & 、; in
7, 9 & XID、clog、MultiXact & 、、、、 & 、
8 & WAL 寫入與格式 & 、、、 & 、; 是 的描述函數
8 & Checkpoint、walwriter & 、、 & in
9 & 快照與可見性 & 、、 & 、
9 & HOT 與 pruning & 、 &
9 & VACUUM、凍結、autovacuum & 、、 & ;
9 & SSI & & (含理論推導)
10 & 鎖管理器、死結 & 、、、 & ;、;衝突表
10 & LWLock、spinlock、latch & 、、 & in ;wait event 名稱表
11 & 當機復原、PITR、timeline & 、、() & ;、
11 & 兩階段提交(prepared) & & 目錄格式
14 & 串流複寫 & 、、、 & in ;
14 & 邏輯解碼與邏輯複寫 & 、 & in ;、、、
17 & 前後端協定 & (主迴圈 )、、、、 & 、、
17 & Postmaster 與程序模型 & 、 & 、
18 & 認證、SCRAM、OAuth、TLS & 、、、、 &
18 & 權限與 RLS & 、、 & ;RLS 在 rewriter 階段加入條件
建議的閱讀路徑
一週入門: \(\to\) \(\to\) \(\to\) 的 ,搭配 觀察效果。
索引: 全文(約一小時),再跟著 與 走一次插入。
交易: \(\to\) 的 \(\to\) \(\to\) 。
查詢處理: 與 ,然後用 比對實際輸出。
並行與復原:、、。
動手改:加一個 GUC、在某個執行節點加計數器、寫一個小擴充套件( 有範本)——這是理解建置系統與程式碼風格最快的方法。
目錄值得特別一提:每個檔案都是一個並行交錯情境(如 、、), 是本教材第 7–10 章所有異常的可執行版本。