今回は整数型のプロトタイプを作成する。可変長データ型になると少し面倒。
データタイプ名: h_int4
ヘッダ(世代数、最終更新タイムスタンプ)
エントリ(タイムスタンプ、データ実体)→ 監査目的にするなら、ユーザ情報も格納すべき?
(今回は追加していない)
型に対する入出力関数
世代数 最終更新タイムスタンプ
タイムスタンプ データ実体 (INT)
ヘッダ
エントリ
タイムスタンプ データ実体 (INT)
世代数分、繰り返し
こんな感じ
データ実体が可変長の場合は、各エントリの長さ情報もエントリ内のヘッダに必要になる。ちょい面倒。(ヘッダ部にインデックス的な情報も必要かも)
・世代数取得・全ヒストリの取得・世代番号指定による取り出し・タイムスタンプによる取り出し・タイムスタンプに一番近い過去のもの・タイムスタンプに一番近い未来のもの・世代の消去(最新世代のみを残す)
型に関する操作関数(1)
・タイムスタンプ指定つきの履歴追加 ※未来の時刻と値を事前にセットする
未来のタイムスタンプを指定して、一定時間を過ぎると勝手に値が変わる機能があると嬉しかったりするだろうか?
この場合、デフォルトの評価値が最新世代のもの、ではなくカレントタイムスタンプより過去のものとかいう評価が必要
型に関する操作関数(2)
関数の変動性分類そもそも、こういう型を評価する関数の
変動性分類はどうなるのか。Immutable/Stable とは言えないか・・・。
→ フツーに考えると volatile に分類すべきなんだろかなあ。
最適化や関数インデクスのことを考えると微妙なことになる。→ 検索条件となりうるカラムに使うのは難しいかも
(別にインデクス検索されるカラムがあり、その後の Filter 句として使うくらいか)
h_int4 型を登録h_int4 型カラムを持つテーブルを作成
4 件 INSERTid=2の data を更新( 200→210)id=3 の data を更新( 300→310)id=3 の data を更新( 310→320)id=4 の data を更新( 400→410)
普通に SELECT世代番号指定で SELECT
デモ(1)
id=4 の data を更新( 10 秒後に 410→420)id=4 の data を更新( 20 秒後に 420→430)
普通に SELECT10 秒後に SELECT20 秒後に SELECT
デモ(2)
デモ(図)
100id = 1
200id = 2
300id = 3
400id = 4
INSERT UPDATE
210
310 320
410 420 430
10 秒後 20 秒後
tUPDATE UPDATE UPDATE UPDATE UPDATESELECT SELECT
10 秒後 20 秒後直後現世代 前世代
デモ環境CentOS 6.3
PostgreSQL 9.3.2
トリガ関数更新前の値と更新後の値を入力更新後の値を更新前の値に追記
トリガ設定BEFORE EACH ROWS/列トリガ
トリガとの組み合わせ
UPDATE test SET data = append(data, 100) WHERE …;↓
UPDATE test SET data = 100 WHERE …;