regexp_replaceを実装したときのメモ

1.backend/regex/regexec.cのpg_regexec()で,検索開始位置を設定できるように拡張する。
(これがないと,2箇所目以降の置換開始位置を決められない)

○backend/regex/regexec.c
・pg_regexecに検索開始位置を指定する引数を増やす(size_t search_start)。
・pg_regexec()を使っているところで,search_startに0を渡すようにする。
・struct varsに,chr *search_startを追加する。
・find()で,最初にshortest()を呼んでいるところで,以下のようにする。
close = shortest(v, s, v->search_start, v->search_start,
v->stop, &cold, (int *) NULL);
・cfindloop()で,close = v->start;を,close = v->search_start;にする。

ここまでの作業では,動作に何も影響でないはず。
regression testで確認する。


2.replace処理を実装
・RE_compilie_and_execute()では,以下の処理を行っている。
- 正規表現コンパイル結果のcacheを検索する
- cacheから見つかったら,それを実行
- cacheに見つからないときは,コンパイルして,それをcacheに保存してから実行
このうち,正規表現コンパイルしてキャッシュする処理はregexp_replaceでも共有したいので,コンパイル&キャッシュと実行の関数に分割する。
・backend/utils/adt/regexp.cに,replace関数(textregexreplace)を実装する
ここでは正規表現コンパイルを行い,あとはvarlena.cに実装。
(varlena.cに文字列操作のstatic関数がたくさんあるから)
・backend/utils/adt/varlena.cに,replaceのメインルーチン(replace_text_regexp)を 実装する。replace_text()が参考になる。


3.sqlから実行できるようにする
pg_proc.hに追加すればOKか?