9.1第55章
后端接口(BKI)文件是一些用特殊语言写的脚本,这些脚本是 PostgreSQL 后端能够理解的,以特殊的 "bootstrap"(引导)模式运行,这种模式允许在不存在系统表的零初始条件下执行数据库函数,而普通的 SQL 命令要求系统表必须存在。因此 BKI 文件可以用于在第一时间创建数据库系统。(可能除此以外也没有其它用处。)
在创建一个新的数据库集群的时候, initdb就是使用 BKI 文件来完成其工作的一部分。 initdb使用的输入的文件是作为制作 PostgreSQL的一部分,由一个叫 genbki.sh 的程序创建的,这个程序读取源代码树目录的 src/include/catalog/ 目录里面的几个特殊格式的 C 头文件。生成的 BKI文件叫 postgres.bki 并且通常安装在安装树里的 share 子目录。
相关的信息可以在有关 initdb 的文档中找到。
55.1. BKI 文件格式
本节描述 PostgreSQL 后端是如何理解 BKI 文件。如果把 postgres.bki 文件拿来做为例子, 这些描述会变得容易理解些。 你还可以学习 initdb 的源程序以便获取后端是如何激活的概念。
BKI输入是由一系列命令组成的。 命令是由一些记号组成的,具体是什么由命令语法决定。记号通常是用空白分隔的,但是如果没有歧义的话可以不要。 没有什么特殊的命令分隔符;语法上无法属于前面命令的记号开始新的一条命令。 (通常你会把一条新的命令放在新的一行上以保持清晰。) 记号可以是某些关键字,特殊字符(圆括弧,逗号等),数字,或者双引号字串。 所有东西都是大小写敏感的。
以 # 开头的行被忽略。
55.2. BKI命令
- create [bootstrap] [shared_relation] [without_oids] tablename tableoid (name1 = type1 [, name2 = type2, ...])
创建一个叫做 tablename,OID 为 tableoid 的表,表字段在圆括弧中给出。
bootstrap.c 直接支持下列字段类型: bool,bytea,char (1 字节), name,int2,int4, regproc,regclass, regtype,text,oid, tid,xid, cid,int2vector,oidvector, _int4 (数组),_text (数组), _aclitem(数组)。尽管我们可以创建包含其它类型字段的表, 但是我们只有在创建完 pg_type 并且填充了合适的记录之后才行。 (这实际上就意味着在系统初始化表中,只能使用这些字段类型,而非系统初始化表可以使用任意内置类型。)
如果声明了 bootstrap,那么改表将只在磁盘上创建; 不会向 pg_class,pg_attribute 等系统表里面输入任何东西。 因此这样的表将无法被普通的 SQL 操作访问,直到那些记录用硬办法(用 insert 命令)填入。 这个选项用于创建 pg_class 等自身。
如果声明了 shared_relation,那么表就作为共享表创建。 除非声明了 without_oids,否则将会有 OID。
- open tablename
打开一个名为 tablename 的表,准备插入数据。任何当前已经打开的表都会被关闭。 - close [tablename]
关闭打开的表。给出的表明是用于交叉检查,但并不是必须的。 - insert [OID = oid_value] (value1 value2 ...)
用 value1, value2, 等作为字段值以及 oid_value 作为其 OID(对象标识)向打开的表插入一条新记录,如果 oid_value 为零(0),否则省略了改子句,而表则拥有 OID,并赋予下一个可用的 OID 数值。NULL 可以用特殊的关键字 _null_声明。包含空白的值必须用双引号栝起。
declare [unique] index indexname indexoid on tablename using amname ( opclass1 name1 [, ...] )
在一个叫 tablename 的表上用 amname 访问方法创建一个 OID 是 indexoid 的叫做 indexname 的索引。 索引的字段叫 name1,name2 等,而使用的操作符表分别是 opclass1,opclass2 等。 将会创建索引文件和恰当的系统表记录,但是索引内容不会被此命令初始化。
- build indices
填充前面声明的索引。
55.3. 系统初始化的 BKI 文件的结构
open 命令打开的表需要系统事先存在另外一些基本的表, 在这些表存在并拥有数据之前,我们不能使用 open 命令。 (这些最低限度必须存在的表是 pg_class,pg_attribute, pg_proc,和 pg_type。) 为了允许这些表自己被填充,带着 bootstrap 选项的 create 隐含打开所创建的表用于插入数据。
因此,postgres.bki 文件的结构必须是这样的:
1.create bootstrap 其中一个关键表 2.insert 数据,这些数据至少描述这些关键表本身 3.close 4.重复创建和填充其它关键表。 5.create (不带 bootstrap)一个非关键表 6.open 7.insert 需要的数据 8.close 9.重复创建其它非关键表。 10.定义索引。 11.build indices
当然,肯定还有其它未记录文档的顺序依赖关系。
55.4. 例子
下面的命令集将创建名为 test_table,有两个字段 cola 和 colb,类型分别为 int4 和 text 的表,表的 OID 为 420, 然后向该表插入两行。
create test_table 420 (cola = int4, colb = text) open test_table insert OID=421 ( 1 "value1" ) insert OID=422 ( 2 _null_ ) close test_table