2009-03-01から1ヶ月間の記事一覧

カーソル(ポータル)。フロントエンド/バックエンドプロトコル経由

PostgreSQLでカーソルというと、ドキュメントにあるように次の3つで定義可能らしい。 DECLARE文経由 フロントエンド/バックエンドプロトコルからBindメッセージ経由 サーバプログラミングインタフェース(SPI)経由 カーソルはポータルとも呼ばれる(プログ…

キャストしないでサプタイプの型に変換する

ジェネリクスねた。 Java Generics and Collections: Speed Up the Java Development Process の9.4 Strategy に出てくる話です。 @Test public void test() throws Exception { Aaa<Bbb> hoge = new Bbb(); Bbb bbb = hoge.asSubtype(); Aaa<Ccc> foo = new Ccc(); Cc</ccc></bbb>…

B-Treeインデックス。btbulkdelete()。削除対象のItemを特定するまで

前回のつづき。btbulkdelete()を呼び出す前に、テーブルから削除対象のタプルをスキャンしそのポインタを記憶しておき、後でそれを参照することで削除すべきインデックスのItemを特定していることがわかった。 lazy_scan_heap() VACUUM対象リレーション(イ…

B-Treeインデックス。btbulkdelete()。PageからItemを削除するところ

インデックスの削除のときに呼ばれるbtbulkdelete()を見てみる。削除はSQLのDELETE実行時ではなくVACUUMのときに行われる。概要はインタフェースであるambulkdeleteのところをみるとわかる。インデックスアクセスメソッド関数。GDBでbtしたときの呼び出しシ…

ジェネリクスのMultiple Boundsを使ったコードをデコンパイルしてみた

Multiple Boundsを日本語にするとなんだろう?多重境界?Java Generics and Collections: Speed Up the Java Development Processの「3.6 Multiple Bounds」の章に次のコードがあります。 public static <S extends Readable & Closeable, T extends Appendable & Closeable> void copy( S src, T trg, int size) throws IOExcep</s>…

上限境界を持つジェネリック型の実型パラメータに下限境界のワイルドカードを指定したとき

下のエントリにつづいてもう1つジェネリクスねた。上限境界と下限境界を持つワイルドカードはおもしろいなぁと思いました。 ? super を使ってパラメータ化された型はObjectしか返せないと思っていたのですが、その型の上限があらかじめ決まっているならその…

B-Treeインデックス。btinsert()。ページの分割が必要な場合

前回の続き。_bt_insertonpg() から呼び出される次の3つの関数を中心にインデックス追加時のページ分割の処理を見てみた。 _bt_findsplitloc() : どのタプル以降を新しく作成する右側のページに移動するかを決める pageがright mostのときはFILLFACTORに応じ…

B-Treeインデックス。btinsert()。ページの分割が不要な場合

インデックスの追加のときに呼ばれるbtinsert()を見てみる。btinsert()はINSERTやUPDATEやCOPYの処理で呼ばれることがある。概要はインタフェースであるaminsertのところをみるとわかる。インデックスアクセスメソッド関数。呼び出しシーケンス(抜粋)はこん…

B-Treeインデックス。btbuild()。インデックスのページを書き出すまで

インデックスの構築のときに呼ばれるbtbuild()について前回のつづき。_bt_leafbuild()から。 _bt_leafbuild() BTWriteStateを作成する。BTWriteStateはどれだけページを割り当てたかとか何番目のページまで書き込んだかを管理する。 tuplesort_performsort()…

B-Treeインデックス。btbuild()。インデックスのタプルを一時領域に格納するまで

インデックスの構築のときに呼ばれるbtbuild()を見てみる。btbuild()はCREATE INDEXとかインデックスの再構築で呼ばれる。概要はインタフェースであるambuildのところをみるとわかる。インデックスアクセスメソッド関数。今回は、CREATE INDEXしたときを確か…

B-Treeインデックス。btbeginscan()

インデックスアクセスメソッドのインタフェース定義というものがあり、インデックスの実装を抽象化している。「select * from pg_am」とすれば、インデックスの種類ごとのインタフェースを実装した関数の名前がわかる。 B-Treeインデックスの場合、次のもの…

JDBCドライバ。更新件数の取得

Statement#executeUpdate()やStatement#getUpdateCount()でINSERTやUPDATEやDELETEの更新件数がバックエンドでどうつくられフロントエンドに渡ってくるかみてみた。 バックエンド バックエンドは、フロントエンドからのクエリ実行要求を受け付けるexec_execu…

B-Treeインデックス。btgettuple()。検索時に使われる関数のざっくりとした概要

backend/access/nbtree/READMEを読んでもよくわからなかったので先にコードを追うことにした。bt_first()の前半部分はとりあえずとばして後半部分を眺めていたら最初よりはずいぶん見通しが良くなってきた。 index_getnext() IndexScanDesc.xs_ctup.t_self …