catcache

Low-level catalog cache definitions.
カタログキャッシュは、次の4種類の構造体で構成される。

・catcacheheader: 全てのキャッシュデータを管理する
・catcache: 1つのキャッシュの情報
・catctup: キャッシュ上のタプル
・catclist: キャッシュの検索結果(catctupのリスト)

catcacheが、1つのキャッシュの情報を管理する。catcacheにはキャッシュのキーカラムの情報、ハッシュ関数、catctupのハッシュデータなどを持つ。
catcacheheaderは全てのcatcacheのリスト、全てのcatctupのLRUリストなどを保持する。1つのbackendが保持できるcatctupの数は、catcacheheaderのch_maxtupに設定される。この値はcatcache.cのMAXCCTUPLESで定義されており、デフォルト値は5000である。
catctupが、カタログキャッシュのエントリになる。
catclistは、キャッシュの検索結果のリストを保持する。例えば、あるキャッシュのキーが2つあるとき、最初のキーのみ指定してキャッシュを検索したときの結果(複数エントリある)が保持される。

キャッシュの検索は、catcache.cのSearchCatCache()やSearchCatCacheList()で実行する。
SearchCatCache()は、すべてのキーを指定して検索する。検索結果は一意になり戻り値はcatctupになる。
SearchCatCacheList()は、キーの一部を指定して検索する。検索結果は複数あり、戻り値はcatclistになる。

SearchCatCache()では、CatalogCacheComputeHashValue()で指定されたキーのハッシュ値を計算し、catcache構造体のccbucketを検索する。キャッシュにエントリが見つかった場合は、そのtupleを返す。ただし、エントリのnagativeフラグがtrueのときは、データが見つからなかったことになり、NULLを返す。
ccbucketに見つからない場合は、heap_openでリレーションをopenして、データを検索する。リレーションから見つかった場合、CatalogCacheCreateEntry()で、キャッシュにエントリを登録する。
リレーションに見つからない場合、build_dummy_tuple()でダミータプルを生成し、CatalogCacheCreateEntry()で、キャッシュにエントリを登録する。このときエントリのnegativeフラグをtrueにする。リレーションに存在しないデータをnagativeデータとして登録しておくことで、毎回リレーションを検索しないようにしている。