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

Statement#executeUpdate()やStatement#getUpdateCount()でINSERTやUPDATEやDELETEの更新件数がバックエンドでどうつくられフロントエンドに渡ってくるかみてみた。

バックエンド

バックエンドは、フロントエンドからのクエリ実行要求を受け付けるexec_execute_message()でcompletionTagという名前のchar配列をつくる。completionTagは下位の関数へずっと引数で渡されていく。そして、ProcessQuery()で

snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
  "INSERT %u %u", lastOid, queryDesc->estate->es_processed);

のように値がセットされる(INSERTの場合)。queryDesc->estate->es_processedは更新件数をもっている。queryDesc->estate->es_processedは、例えば、heap_insert()やheap_update()やheap_delete()といった関数の実行直後にカウントアップされている。

最終的には、CommandCompleteのメッセージとしてフロントエンドに「INSERT 0 1」のような文字列が渡される。

フロントエンド

フロントエンドは、クエリの実行要求の返信としてCommandCompleteのメッセージをバックエンドから受け取る。そして、ストリームから「INSERT 0 1」を文字列として取り出す。さらに、最後の「1」を抜き出す。結局この1が更新件数としてStatement#executeUpdate()やStatement#getUpdateCount()で返される。