如何為 PostgreSQL 增加系統資料表欄位

來源:互聯網
上載者:User

標籤:

1、BKI介紹:http://www.postgresql.org/docs/9.4/static/bki.html

    可以不瞭解,也不影響我們繼續,因為有很多現成例子參考;

2、為pg_database增加一個欄位 datdummy,開啟 /src/include/catalog/pg_database.h:

CATALOG(pg_database,1262) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248) BKI_SCHEMA_MACRO{NameDatadatname;/* database name */Oiddatdba;/* owner of database */int32encoding;/* character encoding */NameDatadatcollate;/* LC_COLLATE setting */NameDatadatctype;/* LC_CTYPE setting */booldatistemplate;/* allowed as CREATE DATABASE template? */booldatallowconn;/* new connections allowed? */int32datconnlimit;/* max connections allowed (-1=no limit) */Oiddatlastsysoid;/* highest OID to consider a system OID */TransactionId datfrozenxid; /* all Xids < this are frozen in this DB */TransactionId datminmxid;/* all multixacts in the DB are >= this */Oiddattablespace;/* default table space for this DB */#ifdef CATALOG_VARLEN/* variable-length fields start here */aclitemdatacl[1];/* access permissions */#endif} FormData_pg_database;/* ---------------- *Form_pg_database corresponds to a pointer to a tuple with *the format of pg_database relation. * ---------------- */typedef FormData_pg_database *Form_pg_database;/* ---------------- *compiler constants for pg_database * ---------------- */#define Natts_pg_database13#define Anum_pg_database_datname1#define Anum_pg_database_datdba2#define Anum_pg_database_encoding3#define Anum_pg_database_datcollate4#define Anum_pg_database_datctype5#define Anum_pg_database_datistemplate6#define Anum_pg_database_datallowconn7#define Anum_pg_database_datconnlimit8#define Anum_pg_database_datlastsysoid9#define Anum_pg_database_datfrozenxid10#define Anum_pg_database_datminmxid11#define Anum_pg_database_dattablespace12#define Anum_pg_database_datacl13

它們最終會被指令碼 genbki.pl 利用產生 postgresql.bki檔案,用在 initdb 初始化 data cluster 時,有興趣可以自己學習一下,PG編譯系統也是一個充分展示強大 perl 語言的系統;

3、在 dattablespace 下增加新定義:

int8datdummy;/* dummy column */

  後邊欄位序號的定義也是很重要的,必須按順序修改,也要記得屬性數相應修改:

#define Natts_pg_database14...#define Anum_pg_database_dattablespace12#define Anum_pg_database_datdummy13#define Anum_pg_database_datacl14

預定義的資料庫必須也要修改,_null_ 前邊增加 100的欄位為 datdummy 資料:

DATA(insert OID = 1 (  template1 PGUID ENCODING "LC_COLLATE" "LC_CTYPE" t t -1 0 0 1 1663 100 _null_));

4、編譯運行,會發生什麼,編譯正常,然後 initdb,竟然也神奇的通過了,難道這就好了嗎?

    Tip:Linux 下不停在一個目錄下改代碼,可能會遇到莫名的程式問題,試試 make clean

5、那麼建立一個資料庫試試看:CREATE DATABASE quanzl; 成功了,是不是感覺似乎還缺點什嗎?

    datdummy的賦值,總不能 UPDATE pg_database SET datdummy = xxx 吧?

    預訂義的資料庫比如template1,我們可以在catalog裡邊定義 BKI 指令碼,比如上邊的例子,給它一個初始值。程式裡也必須有所改動才能成為可操作屬性;

6、參照文法修改,建立一個 CREATE DATABASE xxx DUMMY nnn文法,修改結構體 CreatedbStmt 增加新屬性,文法分析階段將此值讀入,建立資料庫時將它寫入屬性;

new_record[Anum_pg_database_datdummy - 1] = 1234;

此部分代碼在 src/backend/commands/dbcommands.c 中,自行閱讀好了,寫程式就這麼簡單。:)


如何為 PostgreSQL 增加系統資料表欄位

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.