# E.125\. 版本 8.1
> **发布日期:** 2005-11-08
## E.125.1\. 概要
这个版本中的主要修改:
改善到共享缓冲区缓存的并发访问 (Tom)
访问共享缓冲区缓存被认定为是一个重要的可扩展性问题,尤其是在多个CPU的系统上。 在这个版本中,锁定的方式是以缓冲区管理器已经被检查以减少锁征用和提高可扩展性来完成的。 缓冲区管理器也已经被修改为使用一个"时钟扫描"替换机制。
允许索引扫描使用一个中间内存位图 (Tom)
在以前的版本中,只有单个索引可以用来在表上查找。有了这个特性,如果一个查询有 `WHERE tab.col1 = 4 and tab.col2 = 9`,并且在`col1` 和`col2`上没有多字段索引,但是在`col1`上有一个索引, 并且在`col2`上有另一个索引,那么有可能搜索两个索引并在内存中组合结果, 然后为同时匹配`col1`和`col2`限制条件的行执行堆栈获取。 这在有许多非结构化的查询,可能创建匹配所有访问条件的索引的环境中是非常有用的。 即使是单个索引,位图扫描也是有用的,因为他们减少了所需要的随机访问的数量; 位图索引扫描对于检索完整表的相当大的分数是高效的,而普通索引扫描则不行。
添加了两阶段提交 (Heikki Linnakangas, Alvaro, Tom)
两阶段提交允许事务在几个计算机上"准备",并且一旦所有计算机都成功的准备了它们的事务 (没有失败),那么所有事务都可以提交。即使一个机器在准备之后崩溃了, 准备的事务也可以在该机器重启之后提交。新的语法包括`PREPARE TRANSACTION` 和`COMMIT/ROLLBACK PREPARED`。还添加了一个新的系统视图 `pg_prepared_xacts`。
创建一个新的替换用户和组的角色系统
角色是用户和组的一个组合。像用户,它们可以有登陆功能,像组, 一个角色可以拥有其他角色作为成员。角色基本上删除了用户和组之间的不同。 例如,一个角色可以:
* 有登陆功能 (可选)
* 拥有对象
* 持有数据库对象的访问权限
* 从它作为成员的其他角色上继承权限
一旦用户登陆到一个角色,她获得了登陆角色加上任何继承的角色的能力, 并且可以使用`SET ROLE`来切换到其他角色(她在其中是一个成员)。 这个特性是SQL标准角色的概念的一个概括。这个修改还用新的角色能力目录 `pg_authid`和`pg_auth_members`替换了 `pg_shadow`和`pg_group`。 老的表被重新定义为新角色表上的只读视图。
为`MIN()`和`MAX()`自动使用索引 (Tom)
在以前的版本中,为`MIN()`或`MAX()` 使用索引的唯一方式是重写查询`SELECT col FROM tab ORDER BY col LIMIT 1`。 索引使用现在是自动发生的。
移动`/contrib/pg_autovacuum`到主服务器 (Alvaro)
整合自动清理到服务器,允许它在数据库服务器的同步中自动启动和停止, 并允许自动清理在`postgresql.conf`中配置。
使用`SELECT ... FOR SHARE`添加共享的行级别锁 (Alvaro)
然而PostgreSQL的MVCC锁允许`SELECT` 永不被写入锁定,并且因此不需要为典型的操作共享行锁, 共享的锁对于请求共享的行锁的应用是有用的。 特别是它减少了由于参照完整性检查增加的锁请求。
在共享的对象上添加依赖性,尤其是角色 (Alvaro)
依赖性机制的扩展阻止了角色仍然拥有数据库对象时被删除。 以前有可能意外的"孤儿"对象被删除它们的所有者。 虽然这可以被恢复,但是它是杂乱的并且会使人不愉快。
为分区表提升性能 (Simon)
新的`constraint_exclusion` 配置参数避免了在约束表示没有匹配行存在的子表上查找。
这允许表分区的基本类型。如果子表存储独立的键范围,并且强制使用适当的`CHECK` 约束,那么优化器将在约束保证在子表中没有匹配的行存在时跳过子表访问。
## E.125.2\. 迁移到版本 8.1
对于那些想要从任何以前的版本中迁移数据的用户来说, 使用pg_dump的一个转储/恢复是必需的。
8.0版本宣布间隔的`to_char()`函数将在8.1中删除。不过, 因为没有更好的API被推荐,`to_char(interval)`已经在8.1中被加强, 并且将保留在服务器中。
观察下列的不兼容性:
* `add_missing_from`现在缺省是假 (Neil)
缺省的,如果表用在一个没有`FROM`引用的查询中,我们现在产生一个错误。 老的行为仍然可用,但是参数必须设置为'true'。
为了加载一个现有的转储文件,如果转储包含任何使用隐式`FROM` 语法创建的视图或规则,那么将`add_missing_from`设置为true是必须的。 这应该是一个一次性的烦恼,因为PostgreSQL 8.1 将转换这样的视图和规则到标准的显式`FROM`语法。 随后的转储将因此不会有这个问题。
* 让`float4`/`float8`/`oid` 零长度字符串(`''`)的输入抛出一个错误, 而不是将它看做零 (Neil)
这个修改与当前整数的零长度字符串的处理是一致的。 这个修改计划在8.0中宣布。
* `default_with_oids`现在缺省为假 (Neil)
这个选项设置为假,用户创建的表不再有一个OID字段,除非在`CREATE TABLE` 中指定了`WITH OIDS`。尽管OID已经存在于PostgreSQL 的所有版本中,但是因为它们只有四字节长度并且计数器是基于所有安装的数据库共享的, 所以它们的使用是受限制的。唯一标识行的首选方式是通过序列和`SERIAL`类型, 这个自从PostgreSQL 6.4开始就已经支持了。
* 添加`E''`语法,这样最后普通字符串可以正确的对待反斜杠 (Bruce)
目前PostgreSQL作为引入一个特殊的逃逸序列来处理字符串文本中的反斜杠, 比如`\n`或`\010`。虽然这允许特殊值的简单入口, 但是它是不标准的并且使得从其他数据库中移植应用更加困难。因为这个原因, PostgreSQL工程计划删除反斜杠在字符串中的特殊含义。 为了向后兼容和想要特殊处理反斜杠的用户,创建了一个新的字符串语法。 这个新的字符串语法的格式是在开始字符串的单引号之前写一个`E`, 例如`E'hi\n'`。虽然这个版本没有改变反斜杠在字符串中的处理, 但是它确实添加了新的配置参数来帮助用户迁移应用到未来的版本:
* `standard_conforming_strings` —这个版本正确的对待反斜杠为普通字符串?
* `escape_string_warning` —在普通的字符串(非E)中警告反斜杠
`standard_conforming_strings`值是只读的。应用可以检索该值来知道反斜杠是如何处理的。 (参数的存在也可以作为一个支持`E''`字符串语法的指示。)在未来的版本中, `standard_conforming_strings`将为真,意味着反斜杠在非E字符串中将按照字面值对待。 为了准备这个修改,在需要特殊处理反斜杠的地方使用`E''`字符串, 并且打开`escape_string_warning`来找到需要使用`E''` 转换的额外的字符串。另外,使用两个单引号(`''`)在一个字符串中嵌入一个字面的单引号, 而不是PostgreSQL支持的反斜杠单引号(`\'`)语法。 前者是符合标准的,并且不需要使用`E''`字符串语法。你也可以使用`$$` 字符串语法,它不特殊对待反斜杠。
* 让`REINDEX DATABASE`重新索引数据库中的所有索引 (Tom)
以前,`REINDEX DATABASE`只重建系统表的索引。 这个新的行为看起来更加直观。一个新的命令`REINDEX SYSTEM` 提供只重建系统表的老的功能。
* 只读大对象描述符现在服从MVCC快照语义
当一个大对象是用`INV_READ`(不是`INV_WRITE`)打开的时, 来自描述符的数据读取现在将反应调用`lo_open()` 的查询使用了事务快照时大对象的状态的"快照"。 要获取总是返回最后提交的数据的老的行为,在`lo_open()` 的模式标志中包含`INV_WRITE`。
* 为序列函数的参数添加适当的依赖 (Tom)
在以前的版本中,传递到`nextval()`、`currval()` 和`setval()`的序列名是作为简单文本字符串存储的, 意味着重命名或删除一个在`DEFAULT`子句中使用的序列会使子句无效。 这个版本将所有新建的序列函数参数作为内部OID存储,允许它们追踪序列重命名, 并且添加阻止不正确的序列删除的依赖关系信息。这也使得`DEFAULT` 子句免疫模式重命名和搜索路径改变。
一些应用可能依赖于运行时查找序列名的老的行为。这通过明确的转换参数为 `text`仍然可以实现,例如`nextval('myseq'::text)`。
8.1之前的数据库转储加载到8.1将使用老的基于文本的表示, 并且因此没有OID存储参数的特性。不过,更新包含基于文本的`DEFAULT` 子句的数据库是可能的。首先,保存这个查询到一个文件中,比如`fixseq.sql`:
```
SELECT 'ALTER TABLE ' ||
pg_catalog.quote_ident(n.nspname) || '.' ||
pg_catalog.quote_ident(c.relname) ||
' ALTER COLUMN ' || pg_catalog.quote_ident(a.attname) ||
' SET DEFAULT ' ||
regexp_replace(d.adsrc,
$$val\(\(('[^']*')::text\)::regclass$$,
$$val(\1$$,
'g') ||
';'
FROM pg_namespace n, pg_class c, pg_attribute a, pg_attrdef d
WHERE n.oid = c.relnamespace AND
c.oid = a.attrelid AND
a.attrelid = d.adrelid AND
a.attnum = d.adnum AND
d.adsrc ~ $$val\(\('[^']*'::text\)::regclass$$;
```
然后,在一个数据库中运行该查询,找到需要哪个调整,例如对于数据库`db1`:
```
psql -t -f fixseq.sql db1
```
这将显示`ALTER TABLE`命令需要转换数据库到新的基于OID的表示。 如果命令看起来合理,运行这个来更新该数据库:
```
psql -t -f fixseq.sql db1 | psql -e db1
```
这个过程必须在每个要更新的数据库中重复进行。
* 在psql中,将未加引号的`\{digit}+` 序列看做是八进制的 (Bruce)
在以前的版本中,`\{digit}+`序列被看做是小数点,并且只有`\0{digit}+` 被看做是八进制的。这个修改是为了一致性。
* 为前缀和后缀`%`和`^`操作符删除语法生产
这些从未记录和复杂的负数的模数操作符(`%`)的使用。
* 让多边形的`&<`和`&>` 与盒子的"over"操作符一致 (Tom)
* `CREATE LANGUAGE`可以忽略提供的参数,为了支持来自 `pg_pltemplate`的信息
定义了一个新的系统目录`pg_pltemplate`, 携带关于过程语言首选定义的信息(比如它们是否有验证器函数)。 当一个条目存在于创建语言的目录中时,`CREATE LANGUAGE` 将忽略所有它的参数除了语言名并使用目录信息。 采取这个措施是因为废弃的语言定义被老的转储文件加载而增加问题。 截止到8.1,pg_dump将只是作为 `CREATE LANGUAGE` `_name_` 转储过程语言定义,依赖于加载时模板条目的存在。 我们期待这将成为一个更加不会过时的表示。
* 让`pg_cancel_backend(int)`返回一个`boolean` 而不是一个`integer` (Neil)
* 一些用户在加载UTF-8数据到8.1.X时遇到问题。这是因为以前的版本允许无效的UTF-8 字节序列输入到数据库中,而这个版本只接受有效的UTF-8序列。 纠正转储文件的一个方式是运行命令`iconv -c -f UTF-8 -t UTF-8 -o cleanfile.sql dumpfile.sql`。`-c`选项删除无效的字符序列。 两个文件的差异将显示无效的序列。`iconv`读取整个输入文件到内存中, 这样它可能为了处理需要使用split将转储分成多个较小的文件。
## E.125.3\. 额外的修改
下面你将发现PostgreSQL 8.1和以前的主版本间详细的额外的修改。
### E.125.3.1\. 性能改善
* 提高GiST和R-tree索引性能(Neil)
* 改善优化器,包括自动调整哈希连接的大小 (Tom)
* 彻底检查几个方面的内部API
* 修改WAL记录CRC从64位到32位 (Tom)
我们觉得计算64位CRC的额外开销非常大,并且获得的可靠性并不足以为它辩解。
* 阻止在WAL页面中写入大的空间隙 (Tom)
* 改善SMP机器上的自旋锁行为,尤其是Opterons (Tom)
* 允许非连续的索引字段在多字段索引上使用 (Tom)
例如,这允许一个在字段a、b、c上的索引在一个带有 `WHERE a = 4 and c = 10` 的查询中使用。
* 为`CREATE TABLE AS` / `SELECT INTO` 跳过WAL日志 (Simon)
因为`CREATE TABLE AS`期间的崩溃会导致表在恢复期间被删除, 没有理由WAL记录该表被加载了。(不过,如果启用了WAL归档,记录仍然会发生。)
* 允许并发的GiST索引访问 (Teodor, Oleg)
* 添加配置参数`full_page_writes`控制写入全部页面到WAL (Bruce)
为了阻止部分磁盘写入损坏数据库,PostgreSQL 写了每个数据库磁盘页面的完整拷贝来WAL它在一个检查点之后被修改的第一个时间。 这个选项为了更快的速度关闭了该功能。这对于使用电池后备的磁盘缓存来说是安全的, 这种情况下部分页面写入不会发生。
* 当为`wal_sync_method`使用`O_SYNC`时, 如果可用则使用`O_DIRECT` (Itagaki Takahiro)
`O_DIRECT`导致磁盘写入绕过内核缓存,对于WAL写入来说,这提高了性能。
* 提高`COPY FROM`性能 (Alon Goldshuv)
这是通过在更大的语块中读取`COPY`输入完成的,而不是挨个读取字符。
* 提高了`COUNT()`、`SUM`、 `AVG()`、`STDDEV()`和 `VARIANCE()`的性能 (Neil, Tom)
### E.125.3.2\. 服务器的变化
* 阻止由于事务ID (XID)环绕式处理引起的问题 (Tom)
当事务计数器达到环绕的点时,服务器现在将发出警告。如果计数器即将达到环绕的点时, 服务器将停止接受查询。这保证了数据在需要的清理执行之前不会丢失。
* 修复OID计数器已经环绕式处理之后,对象IDs (OIDs)与现有系统对象冲突的问题 (Tom)
* 添加`VACUUM`期间需要增加`max_fsm_relations`和 `max_fsm_pages`的警告 (Ron Mayer)
* 添加`temp_buffers`配置参数, 允许用户为临时表访问确定本地缓存区域的大小 (Tom)
* 添加会话启动时间和客户端IP地址到`pg_stat_activity` (Magnus)
* 为位图扫描调整`pg_stat`视图 (Tom)
一些字段的含义发生了微妙的变化。
* 加强了`pg_locks`视图 (Tom)
* 客户端侧`PREPARE`和`EXECUTE`的日志查询 (Simon)
* 允许Kerberos名字和用户名在`postgresql.conf`的规定中大小写敏感 (Magnus)
* 添加配置参数`krb_server_hostname`, 这样服务器主机名可以作为服务主体的一部分指定 (Todd Kover)
如果没有设置,任何服务主体匹配keytab中的任意条目都有可能被使用。 这是这个版本中的新的Kerberos匹配行为。
* 为毫秒时间戳(`%m`)和远程主机(`%h`)添加 `log_line_prefix`选项 (Ed L.)
* 为GiST索引添加WAL日志 (Teodor, Oleg)
GiST索引现在对于崩溃和时间点恢复来说是安全的。
* 当我们执行`pg_stop_backup()`时,删除老的`*.backup`文件 (Bruce)
这阻止了大量的`*.backup`文件存在于`pg_xlog/`中。
* 添加配置参数为闲置、间隔和计数控制TCP/IP保持活动的时间 (Oliver Jowett)
这些值可以修改来允许对丢失的客户端连接更快速的检测。
* 添加每用户和每数据库连接限制 (Petr Jelinek)
使用`ALTER USER`和`ALTER DATABASE`, 现在可以强制限制作为一个特殊用户或作为一个特殊数据库并发连接的最大会话数量。 设置限制为0禁用用户或数据库连接。
* 在64位的机器上允许超过两千兆字节的共享内存和每后端的工作内存 (Koichi Suzuki)
* 新增系统目录`pg_pltemplate`,允许在转储文件中重写废弃的过程语言定义 (Tom)
### E.125.3.3\. 查询修改
* 添加临时视图 (Koju Iijima, Neil)
* 修复`HAVING`没有任何聚集函数或`GROUP BY`, 这样查询返回一个组 (Tom)
以前,这样的情况会将`HAVING`子句看做和`WHERE`子句相同。 这是不规范的。
* 添加`USING`子句允许额外的表指定为`DELETE` (Euler Taveira de Oliveira, Neil)
在以前的版本中,没有明确的方法指定用于`DELETE`语句中的连接的额外的表。 对于这个目的,`UPDATE`早已有了一个`FROM`子句。
* 在后端和ecpg字符串中添加对`\x`十六进制逃逸的支持 (Bruce)
这正像标准C `\x`逃逸语法。八进制逃逸早就支持了。
* 添加`BETWEEN SYMMETRIC`查询语法 (Pavel Stehule)
这个特征允许`BETWEEN`比较不请求第一个值小于第二个值。 例如,`2 BETWEEN [ASYMMETRIC] 3 AND 1`返回假, 而`2 BETWEEN SYMMETRIC 3 AND 1`返回真。 `BETWEEN ASYMMETRIC`早就支持了。
* 添加`NOWAIT`选项到`SELECT ... FOR UPDATE/SHARE` (Hans-Juergen Schoenig)
当`statement_timeout`配置参数允许一个查询接受超过一定数量的时间被取消, `NOWAIT`选项允许查询在`SELECT ... FOR UPDATE/SHARE` 命令不能立即获得一个行锁时尽快被取消。
### E.125.3.4\. 对象操作的改变
* 追踪共享对象的依赖性 (Alvaro)
PostgreSQL允许全局表(用户、数据库、表空间) 引用多个数据库中的信息。这为全局表额外的添加了依赖关系信息,这样,例如, 用户所有权可以跨数据库追踪,一个在任意数据库中拥有某些东西的用户不再被删除。 依赖关系追踪早已为数据库本地对象存在了。
* 允许受限制的`ALTER OWNER`命令被对象所有者执行 (Stephen Frost)
以前的版本只允许超级用户修改对象所有者。现在,如果执行该命令的用户拥有该对象, 并且可以作为新的所有者创建它,那么所有权就可以转移(也就是说, 该用户是新的拥有角色的一员,并且该角色拥有重新创建该对象所需要的CREATE权限)。
* 为某些对象类型(表、函数、类型)添加`ALTER`对象 `SET SCHEMA`能力 (Bernd Helmle)
这允许对象迁移到不同的模式中。
* 添加`ALTER TABLE ENABLE/DISABLE TRIGGER`禁用触发器 (Satoshi Nagayasu)
### E.125.3.5\. 工具命令的变化
* 允许`TRUNCATE`在一个命令中截断多个表 (Alvaro)
由于参照完整性检查,不允许截断是参照完整性约束的一部分的表。 使用这个新功能,`TRUNCATE`可以用来截断这个样的表, 如果两个表都包含在一个参照完整性约束中,那么会在一个 `TRUNCATE`命令中都被截断。
* 在`COPY CSV`模式中正确的处理回车和换行 (Andrew)
在版本8.0中,`CSV COPY TO`中的回车和换行是以一种不一致的方式处理的。 (这在TODO列表中记录了。)
* 添加`COPY WITH CSV HEADER`,允许标题作为`COPY` 中的第一行 (Andrew)
这允许处理公共`CSV`在数据文件的第一行放置字段名的用法。 对于`COPY TO`,第一行包含该字段名,对于`COPY FROM`, 忽略第一行。
* 在Windows上,在`EXPLAIN ANALYZE`中显示更好的次秒级精度 (Magnus)
* 添加触发时间显示到`EXPLAIN ANALYZE`
以前的版本包含触发器的执行时间作为总的执行时间的一部分, 但是没有单独显示它。现在有可能看到在每个触发器中花费了多少时间。
* 在`COPY`中添加对`\x`十六进制逃逸的支持 (Sergey Ten)
以前的版本只支持八进制逃逸。
* 让`SHOW ALL`包括变量描述 (Matthias Schmidt)
`SHOW`变量名仍然只显示变量的值,不包括变量描述。
* 让initdb创建一个新的称为`postgres`的标准数据库, 并转变工具为标准查询使用`postgres`而不是`template1` (Dave)
在以前的版本中,`template1`作为工具(像createuser) 的缺省连接使用,也作为新数据库的模板。这导致`CREATE DATABASE` 有时会失败,因为如果任何人连接了模板数据库,那么新的数据库就不能创建。 有了这个改变,缺省连接数据库现在是`postgres`, 意味着在`CREATE DATABASE`期间,极少可能有人正在使用`template1`。
* 通过移动`/contrib/reindexdb`到服务器, 创建新的reindexdb命令行工具 (Euler Taveira de Oliveira)
### E.125.3.6\. 数据类型和函数的变化
* 为数组类型添加`MAX()`和`MIN()`聚集 (Koju Iijima)
* 修复`CC`和`YY`字段都被使用了时,`to_date()` 和`to_timestamp()`合理的行为 (Karel Zak)
如果格式声明包含`CC`并且年的声明是`YYY`或更长, 那么忽略`CC`。如果年的声明是`YY`或更短, 那么解释`CC`为上个世纪。
* 添加`md5(bytea)` (Abhijit Menon-Sen)
`md5(text)`早已存在了。
* 添加对基于`power(numeric, numeric)`的 `numeric ^ numeric`的支持
该函数早就存在了,但是没有分配操作符给他。
* 通过正确的在计算时截断商,修复`NUMERIC`的模数 (Bruce)
在以前的版本中,大值的模数有时会因为商的圆整返回负的结果。
* 添加了一个函数`lastval()` (Dennis Björklund)
`lastval()`是`currval()`的一个简化版本。 它根据当前会话执行的最后一个`nextval()`或`setval()` 调用,自动的确定正确的序列名。
* 添加了`to_timestamp(DOUBLE PRECISION)` (Michael Glaesemann)
转换自1970年以来的Unix秒到一个`TIMESTAMP WITH TIMEZONE`。
* 添加了`pg_postmaster_start_time()`函数 (Euler Taveira de Oliveira, Matthias Schmidt)
* 允许在`AT TIME ZONE`中充分使用时区名字, 不只是以前可用的短列表 (Magnus)
以前,`AT TIME ZONE`只支持时区名的一个预定义的列表。 现在任何支持的时区名都可以使用,例如:
```
SELECT CURRENT_TIMESTAMP AT TIME ZONE 'Europe/London';
```
在上面的查询中,使用的时区基于实际上影响提供的日期的夏令时规则调整。
* 添加`GREATEST()`和`LEAST()` variadic函数 (Pavel Stehule)
这些函数接受可变数量的参数并返回这些参数的最大或最小值。
* 添加了`pg_column_size()` (Mark Kirkwood)
这返回一个字段的存储尺寸,可能是被压缩的。
* 添加了`regexp_replace()` (Atsushi Ogawa)
这允许正则表达式替换,像sed。一个可选的标识参数允许全局选择(替换所有) 和大小写敏感模式。
* 修复间隔除法和乘法 (Bruce)
以前的版本有时返回不正当的结果,像`'4 months'::interval / 5` 返回`'1 mon -6 days'`。
* 修复时间戳、时间和间隔输出中的舍入行为 (Tom)
这修复了秒字段显示为`60`而不是增长高阶字段的一些情况。
* 添加一个单独的天字段到类型`interval`, 这样一天的间隔可以不同于24小时的间隔 (Michael Glaesemann)
包含夏令时调整的天不是24小时长,通常是23或25小时。这个修改创建了一个 "这么多天"的间隔和"这么多小时"的间隔之间概念上的不同。 添加`1 day`到一个时间戳现在给出和下一天相同的本地时间, 即使两天之间有一个夏令时调整,而添加`24 hours` 将给出一个不同的本地时间。例如,在US DST规则下:
```
'2005-04-03 00:00:00-05' + '1 day' = '2005-04-04 00:00:00-04'
'2005-04-03 00:00:00-05' + '24 hours' = '2005-04-04 01:00:00-04'
```
* 添加了`justify_days()`和`justify_hours()` (Michael Glaesemann)
这些函数,分别的,调整天到一个合适数量的全月和日, 调整小时到一个合适数量的全天和小时。
* 移动`/contrib/dbsize`到后端,并重命名一些函数 (Dave Page, Andreas Pflug)
* `pg_tablespace_size()`
* `pg_database_size()`
* `pg_relation_size()`
* `pg_total_relation_size()`
* `pg_size_pretty()`
`pg_total_relation_size()`包括索引和TOAST表。
* 为访问集群目录的只读文件添加函数 (Dave Page, Andreas Pflug)
* `pg_stat_file()`
* `pg_read_file()`
* `pg_ls_dir()`
* 添加`pg_reload_conf()`强制配置文件的重载 (Dave Page, Andreas Pflug)
* 添加`pg_rotate_logfile()`强制服务器日志文件的循环 (Dave Page, Andreas Pflug)
* 修改`pg_stat_*`视图包含TOAST表 (Tom)
### E.125.3.7\. 编码和环境的变化
* 重命名一些编码使其更加一致和遵守国际标准 (Bruce)
* `UNICODE`现在是`UTF8`
* `ALT`现在是`WIN866`
* `WIN`现在是`WIN1251`
* `TCVN`现在是`WIN1258`
原先的名字仍然工作。
* 添加对`WIN1252`编码的支持 (Roland Volkmann)
* 添加对四字节`UTF8`字符的支持 (John Hansen)
以前只支持一、二、三字节`UTF8`字符。这对于支持一些汉字字符设置尤其重要。
* 允许`EUC_JP`和`SJIS`之间的直接转换,以提高性能 (Atsushi Ogawa)
* 允许UTF8编码在Windows上工作 (Magnus)
这是通过映射UTF8到Windows本地的UTF16实现做到的。
### E.125.3.8\. 一般服务器端语言的变化
* 修复`ALTER LANGUAGE RENAME` (Sergey Yatskevich)
* 允许函数特征,像严格和活泼,通过`ALTER FUNCTION`来修改 (Neil)
* 增加函数参数的最大数量到100 (Tom)
* 允许SQL和PL/pgSQL函数使用`OUT`和`INOUT`参数 (Tom)
`OUT`是函数返回值的一个可替换的方式。取代使用`RETURN`, 可以通过分配参数声明为`OUT`或`INOUT`来返回值。 这在一些情况下通常更简单,尤其是需要返回多个值时。 从一个函数中返回多个值在以前的版本中是可能的,这大大的简化了该过程。 (该特性在未来的版本中将扩展为其他服务器端语言。)
* 移动语言处理器函数到`pg_catalog`模式
如果要求,这使得它更容易删除公共模式。
* 添加`SPI_getnspname()`到SPI (Neil)
### E.125.3.9\. PL/pgSQL服务器端语言的变化
* 彻底检查PL/pgSQL函数的内存管理 (Neil)
每个函数的分析树现在存储在一个单独的内存空间中。 当不再需要它时,这允许这个内存很容易的回收利用。
* 在`CREATE FUNCTION`时检查函数语法,而不是在运行时 (Neil)
以前,大多数语法错误只在该函数被执行时报告。
* 允许`OPEN`打开非`SELECT`查询,像`EXPLAIN` 和`SHOW` (Tom)
* 不再要求函数发出`RETURN`语句 (Tom)
这是新添加的`OUT`和`INOUT`功能的副产品。 当不需要提供函数的返回值时,可以省略`RETURN`。
* 添加对可选`INTO`子句到PL/pgSQL的`EXECUTE` 语句的支持 (Pavel Stehule, Neil)
* 让`CREATE TABLE AS`设置`ROW_COUNT` (Tom)
* 定义`SQLSTATE`和`SQLERRM`返回当前异常的 `SQLSTATE`和错误消息 (Pavel Stehule, Neil)
这些变量只在异常块中定义。
* 允许到`RAISE`语句的参数为表达式 (Pavel Stehule, Neil)
* 添加一个循环的`CONTINUE`语句 (Pavel Stehule, Neil)
* 允许块和循环标签 (Pavel Stehule)
### E.125.3.10\. PL/Perl服务器端语言的变化
* 允许大的结果集有效的返回 (Abhijit Menon-Sen)
这允许函数使用`return_next()`来避免在内存中建立整个结果集。
* 允许一次一行检索查询结果 (Abhijit Menon-Sen)
这允许函数使用`spi_query()`和`spi_fetchrow()` 避免在内存中累加整个结果集。
* 如果服务器编码是`UTF8`,那么强制PL/Perl将字符串作为`UTF8`处理 (David Kamholz)
* 为PL/Perl添加一个验证器函数 (Andrew)
这允许语法错误在定义时被报告,而不是在执行时报告。
* 当函数返回一个数组类型时,允许PL/Perl返回一个Perl数组 (Andrew)
这主要是映射PostgreSQL数组到Perl数组。
* 允许Perl非致命的警告产生`NOTICE`消息 (Andrew)
* 允许启用Perl的`strict`模式 (Andrew)
### E.125.3.11\. psql的变化
* 添加`\set ON_ERROR_ROLLBACK`以允许事务中的语句发生错误而不影响剩余的事务 (Greg Sabino Mullane)
这基本上是通过包裹每个语句在一个子事务中实现的。
* 在psql变量中添加对`\x`十六进制字符串的支持 (Bruce)
八进制逃逸早就支持了。
* 添加对`troff -ms`输出格式的支持 (Roger Leigh)
* 允许历史文件位置通过`HISTFILE`控制 (Andreas Seltenreich)
这允许存储每个数据库历史的配置。
* 阻止`\x`(扩展模式)影响`\d tablename`的输出 (Neil)
* 添加`-L`选项到psql以记录会话 (Lorne Sunley)
添加这个选项是因为一些操作系统没有简单的命令行活动记录功能。
* 让`\d`显示索引的表空间 (Qingqing Zhou)
* 允许psql帮助(`\h`) 基于正确的帮助信息做一个更好的猜测 (Greg Sabino Mullane)
这允许用户仅仅添加`\h`到语法错误查询的前面,获得支持的语法的帮助。 以前任何超出命令名的额外的查询文本都必须使用`\h`删除。
* 添加`\pset numericlocale`以允许数字在识别环境的格式中输出 (Eugen Nedelcu)
例如,使用`C`环境`100000`将被输出为`100,000.0`, 而欧洲环境可能输出这个值为`100.000,0`。
* 当服务器版本号和psql的版本号不同时,让启动标语显示两者 (Bruce)
还有,如果服务器和psql来自不同的主版本,那么将会显示一个警告。
### E.125.3.12\. pg_dump的变化
* 添加`-n` / `--schema`开关到pg_restore (Richard van den Berg)
这允许只恢复指定模式中的对象。
* 允许pg_dump转储大对象,即使是在文本模式中 (Tom)
有了这个变化,大对象现在总是被转储了;前者`-b`开关是一个空操作。
* 允许pg_dump转储大对象的一个一致的快照 (Tom)
* 为大对象转储的评论 (Tom)
* 添加`--encoding`到pg_dump (Magnus Hagander)
这允许数据库以一个不同于服务器编码的编码转储。 这在传递转储到一个有不同编码的机器时是有价值的。
* 依赖`pg_pltemplate`过程语言 (Tom)
如果过程语言的调用处理器在`pg_catalog`模式中,那么pg_dump 不转储该处理器。相反的,它使用 `CREATE LANGUAGE` `_name_` 转储该语言,依赖于`pg_pltemplate`目录提供语言的创建参数和加载时间。
### E.125.3.13\. libpq的变化
* 添加一个`PGPASSFILE`环境变量指定口令文件的文件名 (Andrew)
* 添加`lo_create()`,类似于`lo_creat()`, 但是允许指定大对象的OID (Tom)
* 让libpq在`malloc()`失败时, 一致的返回一个错误到客户端应用 (Neil)
### E.125.3.14\. 源代码的变化
* 修复pgxs,以支持重定位安装的建立
* 为使用Intel编译器的Itanium处理器添加自旋锁支持 (Vikram Kalsi)
* 为Windows添加Kerberos 5支持 (Magnus)
* 添加了Chinese FAQ (laser@pgsqldb.com)
* 重命名Rendezvous为Bonjour以匹配OS/X特性重命名 (Bruce)
* 在Darwin上添加对`fsync_writethrough`的支持 (Chris Campbell)
* 流线化信息在服务器、优化器和锁系统中的路径 (Tom)
* 允许pg_config使用MSVC编译 (Andrew)
这在使用MSVC编译DBD::Pg时是需要的。
* 删除对Kerberos V4的支持 (Magnus)
Kerberos 4有安全缺陷并且不再维护了。
* 代码清理(EnterpriseDB执行Coverity静态分析)
* 修改`postgresql.conf`使用文档缺省`on`/`off`, 而不是`true`/`false` (Bruce)
* 增强pg_config,能够报告更多的构建时的值 (Tom)
* 允许libpq在Windows上的建立是线程安全的 (Dave Page)
* 允许IPv6连接在Windows上使用 (Andrew)
* 添加关于I/O子系统可靠性的服务器管理文档 (Bruce)
* 从`gist.h`中移动私有的声明到`gist_private.h` (Neil)
在以前的版本中,`gist.h`包含公共的GiST API (用来被GiST索引实现的作者使用)和一些被GiST本身的实现使用的私有声明。 后者已经被移动到一个独立的文件,`gist_private.h`。 大多数GiST索引实现应该是不受影响的。
* 彻底检查GiST内存管理 (Neil)
GiST方法现在总是在一个短期存活的内存空间中调用。因此,通过`palloc()` 的内存分配将被自动回收利用,所以GiST索引实现不需要通过`pfree()` 手动释放分配的内存。
### E.125.3.15\. 贡献版的变化
* 添加了`/contrib/pg_buffercache`贡献版模板 (Mark Kirkwood)
这显示了缓冲区缓存的内容,为了调试和性能调优的目的。
* 删除了`/contrib/array`,因为它是废弃的 (Tom)
* 清理`/contrib/lo`模块 (Tom)
* 移动`/contrib/findoidjoins`到`/src/tools` (Tom)
* 从`/contrib/cube`中删除了`<<`、`>>`、 `&<`和`&>`操作符
这些操作没什么用处。
* 改善`/contrib/btree_gist` (Janko Richter)
* 改善`/contrib/pgbench` (Tomoaki Sato, Tatsuo)
现在有一个设施测试用户给出的SQL命令脚本,而不是只有一个硬线连接的命令序列。
* 改善`/contrib/pgcrypto` (Marko Kreen)
* OpenPGP对称秘钥和公共秘钥加密的实现
RSA和Elgamal公共秘钥算法都支持。
* 独立构建:包括SHA256/384/512 hashes, Fortuna PRNG
* OpenSSL构建:支持3DES,使用内部的AES带有OpenSSL < 0.9.7
* 从`configure`的结果中获取构建参数(OpenSSL, zlib)
不再需要编辑`Makefile`。
* 删除对`libmhash`和`libmcrypt`的支持
- 前言
- 何为PostgreSQL?
- PostgreSQL简史
- 格式约定
- 更多信息
- 臭虫汇报指导
- I. 教程
- Chapter 1. 从头开始
- 1.1. 安装
- 1.2. 体系基本概念
- 1.3. 创建一个数据库
- 1.4. 访问数据库
- Chapter 2. SQL语言
- 2.1. 介绍
- 2.2. 概念
- 2.3. 创建新表
- 2.4. 向表中添加行
- 2.5. 查询一个表
- 2.6. 在表间连接
- 2.7. 聚集函数
- 2.8. 更新
- 2.9. 删除
- Chapter 3. 高级特性
- 3.1. 介绍
- 3.2. 视图
- 3.3. 外键
- 3.4. 事务
- 3.5. 窗口函数
- 3.6. 继承
- 3.7. 结论
- II. SQL 语言
- Chapter 4. SQL语法
- 4.1. 词法结构
- 4.2. 值表达式
- 4.3. 调用函数
- Chapter 5. 数据定义
- 5.1. 表的基本概念
- 5.2. 缺省值
- 5.3. 约束
- 5.4. 系统字段
- 5.5. 修改表
- 5.6. 权限
- 5.7. 模式
- 5.8. 继承
- 5.9. 分区
- 5.10. 外部数据
- 5.11. 其它数据库对象
- 5.12. 依赖性跟踪
- Chapter 6. 数据操作
- 6.1. 插入数据
- 6.2. 更新数据
- 6.3. 删除数据
- Chapter 7. 查询
- 7.1. 概述
- 7.2. 表表达式
- 7.3. 选择列表
- 7.4. 组合查询
- 7.5. 行排序
- 7.6. LIMIT和OFFSET
- 7.7. VALUES列表
- 7.8. WITH 查询 (通用表表达式)
- Chapter 8. 数据类型
- 8.1. 数值类型
- 8.2. 货币类型
- 8.3. 字符类型
- 8.4. 二进制数据类型
- 8.5. 日期/时间类型
- 8.6. 布尔类型
- 8.7. 枚举类型
- 8.8. 几何类型
- 8.9. 网络地址类型
- 8.10. 位串类型
- 8.11. 文本搜索类型
- 8.12. UUID 类型
- 8.13. XML 类型
- 8.14. JSON 类型
- 8.15. Arrays
- 8.16. 复合类型
- 8.17. 范围类型
- 8.18. 对象标识符类型
- 8.19. 伪类型
- Chapter 9. 函数和操作符
- 9.1. 逻辑操作符
- 9.2. 比较操作符
- 9.3. 数学函数和操作符
- 9.4. 字符串函数和操作符
- 9.5. 二进制字符串函数和操作符
- 9.6. 位串函数和操作符
- 9.7. 模式匹配
- 9.8. 数据类型格式化函数
- 9.9. 时间/日期函数和操作符
- 9.10. 支持枚举函数
- 9.11. 几何函数和操作符
- 9.12. 网络地址函数和操作符
- 9.13. 文本检索函数和操作符
- 9.14. XML 函数
- 9.15. JSON 函数和操作符
- 9.16. 序列操作函数
- 9.17. 条件表达式
- 9.18. 数组函数和操作符
- 9.19. 范围函数和操作符
- 9.20. 聚集函数
- 9.21. 窗口函数
- 9.22. 子查询表达式
- 9.23. 行和数组比较
- 9.24. 返回集合的函数
- 9.25. 系统信息函数
- 9.26. 系统管理函数
- 9.27. 触发器函数
- 9.28. 事件触发函数
- Chapter 10. 类型转换
- 10.1. 概述
- 10.2. 操作符
- 10.3. 函数
- 10.4. 值存储
- 10.5. UNION, CASE 和相关构造
- Chapter 11. 索引
- 11.1. 介绍
- 11.2. 索引类型
- 11.3. 多字段索引
- 11.4. 索引和ORDER BY
- 11.5. 组合多个索引
- 11.6. 唯一索引
- 11.7. 表达式上的索引
- 11.8. 部分索引
- 11.9. 操作符类和操作符族
- 11.10. 索引和排序
- 11.11. 检查索引的使用
- Chapter 12. 全文检索
- 12.1. 介绍
- 12.2. 表和索引
- 12.3. 控制文本搜索
- 12.4. 附加功能
- 12.5. 解析器
- 12.6. 词典
- 12.7. 配置实例
- 12.8. 测试和调试文本搜索
- 12.9. GiST和GIN索引类型
- 12.10. psql支持
- 12.11. 限制
- 12.12. 来自8.3之前文本搜索的迁移
- Chapter 13. 并发控制
- 13.1. 介绍
- 13.2. 事务隔离
- 13.3. 明确锁定
- 13.4. 应用层数据完整性检查
- 13.5. 锁和索引
- Chapter 14. 性能提升技巧
- 14.1. 使用EXPLAIN
- 14.2. 规划器使用的统计信息
- 14.3. 用明确的JOIN控制规划器
- 14.4. 向数据库中添加记录
- 14.5. 非持久性设置
- III. 服务器管理
- Chapter 15. 源码安装
- 15.1. 简版
- 15.2. 要求
- 15.3. 获取源码
- 15.4. 安装过程
- 15.5. 安装后设置
- 15.6. 支持平台
- 15.7. 特定平台注意事项
- Chapter 16. Windows下用源代码安装
- 16.1. 用Visual C++或Microsoft Windows SDK编译
- 16.2. 用Visual C++或 Borland C++编译 libpq
- Chapter 17. 服务器设置和操作
- 17.1. PostgreSQL用户账户
- 17.2. 创建数据库集群
- 17.3. 启动数据库服务器
- 17.4. 管理内核资源
- 17.5. 关闭服务器
- 17.6. 升级一个 PostgreSQL 集群
- 17.7. 防止服务器欺骗
- 17.8. 加密选项
- 17.9. 用 SSL 进行安全的 TCP/IP 连接
- 17.10. 用SSH隧道进行安全 TCP/IP 连接
- 17.11. 在Windows上注册事件日志
- Chapter 18. 服务器配置
- 18.1. 设置参数
- 18.2. 文件位置
- 18.3. 连接和认证
- 18.4. 资源消耗
- 18.5. 预写式日志
- 18.6. 复制
- 18.7. 查询规划
- 18.8. 错误报告和日志
- 18.9. 运行时统计
- 18.10. 自动清理
- 18.11. 客户端连接缺省
- 18.12. 锁管理
- 18.13. 版本和平台兼容性
- 18.14. Error Handling
- 18.15. 预置选项
- 18.16. 自定义选项
- 18.17. 开发人员选项
- 18.18. 短选项
- Chapter 19. 用户认证
- 19.1. pg_hba.conf文件
- 19.2. 用户名映射
- 19.3. 认证方法
- 19.4. 用户认证
- Chapter 20. 数据库角色
- 20.1. 数据库角色
- 20.2. 角色属性
- 20.3. 角色成员
- 20.4. 函数和触发器安全
- Chapter 21. 管理数据库
- 21.1. 概述
- 21.2. 创建一个数据库
- 21.3. 模板数据库
- 21.4. 数据库配置
- 21.5. 删除数据库
- 21.6. 表空间
- Chapter 22. 区域
- 22.1. 区域支持
- 22.2. 排序规则支持
- 22.3. 字符集支持
- Chapter 23. 日常数据库维护工作
- 23.1. 日常清理
- 23.2. 经常重建索引
- 23.3. 日志文件维护
- Chapter 24. 备份与恢复
- 24.1. SQL转储
- 24.2. 文件系统级别备份
- 24.3. 在线备份以及即时恢复(PITR)
- Chapter 25. 高可用性与负载均衡,复制
- 25.1. 不同解决方案的比较
- 25.2. 日志传送备份服务器
- 25.3. 失效切换
- 25.4. 日志传送的替代方法
- 25.5. 热备
- Chapter 26. 恢复配置
- 26.1. 归档恢复设置
- 26.2. 恢复目标设置
- 26.3. 备用服务器设置
- Chapter 27. 监控数据库的活动
- 27.1. 标准Unix工具
- 27.2. 统计收集器
- 27.3. 查看锁
- 27.4. 动态跟踪
- Chapter 28. 监控磁盘使用情况
- 28.1. 判断磁盘的使用量
- 28.2. 磁盘满导致的失效
- Chapter 29. 可靠性和预写式日志
- 29.1. 可靠性
- 29.2. 预写式日志(WAL)
- 29.3. 异步提交
- 29.4. WAL 配置
- 29.5. WAL 内部
- Chapter 30. 回归测试
- 30.1. 运行测试
- 30.2. 测试评估
- 30.3. 平台相关的比较文件
- 30.4. 测试覆盖率检查
- IV. 客户端接口
- Chapter 31. libpq - C 库
- 31.1. 数据库连接控制函数
- 31.2. 连接状态函数
- 31.3. 命令执行函数
- 31.4. 异步命令处理
- 31.5. 逐行检索查询结果
- 31.6. 取消正在处理的查询
- 31.7. 捷径接口
- 31.8. 异步通知
- 31.9. 与COPY命令相关的函数
- 31.10. 控制函数
- 31.11. 各种函数
- 31.12. 注意信息处理
- 31.13. 事件系统
- 31.14. 环境变量
- 31.15. 口令文件
- 31.16. 连接服务的文件
- 31.17. LDAP查找连接参数
- 31.18. SSL 支持
- 31.19. 在多线程程序里的行为
- 31.20. 制作libpq程序
- 31.21. 例子程序
- Chapter 32. 大对象
- 32.1. 介绍
- 32.2. 实现特点
- 32.3. 客户端接口
- 32.4. 服务器端函数
- 32.5. 例子程序
- Chapter 33. ECPG - 在C中嵌入SQL
- 33.1. 概念
- 33.2. 管理数据库连接
- 33.3. 运行SQL命令
- 33.4. 使用宿主变量
- 33.5. 动态SQL
- 33.6. pgtypes 库
- 33.7. 使用描述符范围
- 33.8. 错误处理
- 33.9. 预处理器指令
- 33.10. 处理嵌入的SQL程序
- 33.11. 库函数
- 33.12. 大对象
- 33.13. C++应用程序
- 33.14. 嵌入的SQL命令
- ALLOCATE DESCRIPTOR
- CONNECT
- DEALLOCATE DESCRIPTOR
- DECLARE
- DESCRIBE
- DISCONNECT
- EXECUTE IMMEDIATE
- GET DESCRIPTOR
- OPEN
- PREPARE
- SET AUTOCOMMIT
- SET CONNECTION
- SET DESCRIPTOR
- TYPE
- VAR
- WHENEVER
- 33.15. Informix兼容模式
- 33.16. 内部
- Chapter 34. 信息模式
- 34.1. 关于这个模式
- 34.2. 数据类型
- 34.3. information_schema_catalog_name
- 34.4. administrable_role_authorizations
- 34.5. applicable_roles
- 34.6. attributes
- 34.7. character_sets
- 34.8. check_constraint_routine_usage
- 34.9. check_constraints
- 34.10. collations
- 34.11. collation_character_set_applicability
- 34.12. column_domain_usage
- 34.13. column_options
- 34.14. column_privileges
- 34.15. column_udt_usage
- 34.16. columns
- 34.17. constraint_column_usage
- 34.18. constraint_table_usage
- 34.19. data_type_privileges
- 34.20. domain_constraints
- 34.21. domain_udt_usage
- 34.22. domains
- 34.23. element_types
- 34.24. enabled_roles
- 34.25. foreign_data_wrapper_options
- 34.26. foreign_data_wrappers
- 34.27. foreign_server_options
- 34.28. foreign_servers
- 34.29. foreign_table_options
- 34.30. foreign_tables
- 34.31. key_column_usage
- 34.32. parameters
- 34.33. referential_constraints
- 34.34. role_column_grants
- 34.35. role_routine_grants
- 34.36. role_table_grants
- 34.37. role_udt_grants
- 34.38. role_usage_grants
- 34.39. routine_privileges
- 34.40. routines
- 34.41. schemata
- 34.42. sequences
- 34.43. sql_features
- 34.44. sql_implementation_info
- 34.45. sql_languages
- 34.46. sql_packages
- 34.47. sql_parts
- 34.48. sql_sizing
- 34.49. sql_sizing_profiles
- 34.50. table_constraints
- 34.51. table_privileges
- 34.52. tables
- 34.53. triggered_update_columns
- 34.54. triggers
- 34.55. udt_privileges
- 34.56. usage_privileges
- 34.57. user_defined_types
- 34.58. user_mapping_options
- 34.59. user_mappings
- 34.60. view_column_usage
- 34.61. view_routine_usage
- 34.62. view_table_usage
- 34.63. views
- V. 服务器端编程
- Chapter 35. 扩展SQL
- 35.1. 扩展性是如何实现的
- 35.2. PostgreSQL类型系统
- 35.3. 用户定义的函数
- 35.4. 查询语言(SQL)函数
- 35.5. 函数重载
- 35.6. 函数易失性范畴
- 35.7. 过程语言函数
- 35.8. 内部函数
- 35.9. C-语言函数
- 35.10. 用户定义聚集
- 35.11. 用户定义类型
- 35.12. 用户定义操作符
- 35.13. 操作符优化信息
- 35.14. 扩展索引接口
- 35.15. 包装相关对象到一个扩展
- 35.16. 扩展基础设施建设
- Chapter 36. 触发器
- 36.1. 触发器行为概述
- 36.2. 数据改变的可视性
- 36.3. 用C写触发器
- 36.4. 一个完整的触发器例子
- Chapter 37. 事件触发器
- 37.1. 事件触发器行为的概述
- 37.2. 事件触发器触发矩阵
- 37.3. 用C编写事件触发器函数
- 37.4. 一个完整的事件触发器的例子
- Chapter 38. 规则系统
- 38.1. 查询树
- 38.2. 视图和规则系统
- 38.3. 物化视图
- 38.4. 在 INSERT, UPDATE, 和 DELETE上的规则
- 38.5. 规则和权限
- 38.6. 规则和命令状态
- 38.7. 规则与触发器的比较
- Chapter 39. 过程语言
- 39.1. 安装过程语言
- Chapter 40. PL/pgSQL - SQL过程语言
- 40.1. 概述
- 40.2. PL/pgSQL的结构
- 40.3. 声明
- 40.4. 表达式
- 40.5. 基本语句
- 40.6. 控制结构
- 40.7. 游标
- 40.8. 错误和消息
- 40.9. 触发器过程
- 40.10. 在后台下的PL/pgSQL
- 40.11. 开发PL/pgSQL的一些提示
- 40.12. 从Oracle PL/SQL进行移植
- Chapter 41. PL/Tcl - Tcl 过程语言
- 41.1. 概述
- 41.2. PL/Tcl 函数和参数
- 41.3. PL/Tcl里的数据值
- 41.4. PL/Tcl里的全局量
- 41.5. 在PL/Tcl里访问数据库
- 41.6. PL/Tcl里的触发器过程
- 41.7. 模块和unknown的命令
- 41.8. Tcl 过程名字
- Chapter 42. PL/Perl - Perl 过程语言
- 42.1. PL/Perl 函数和参数
- 42.2. PL/Perl里的数据值
- 42.3. 内置函数
- 42.4. PL/Perl里的全局变量
- 42.5. 可信的和不可信的 PL/Perl
- 42.6. PL/Perl 触发器
- 42.7. 后台PL/Perl
- Chapter 43. PL/Python - Python 过程语言
- 43.1. Python 2 vs. Python 3
- 43.2. PL/Python Functions
- 43.3. Data Values
- 43.4. Sharing Data
- 43.5. Anonymous Code Blocks
- 43.6. Trigger Functions
- 43.7. Database Access
- 43.8. Explicit Subtransactions
- 43.9. Utility Functions
- 43.10. Environment Variables
- Chapter 44. 服务器编程接口
- 44.1. 接口函数
- SPI_connect
- SPI_finish
- SPI_push
- SPI_pop
- SPI_execute
- SPI_exec
- SPI_execute_with_args
- SPI_prepare
- SPI_prepare_cursor
- SPI_prepare_params
- SPI_getargcount
- SPI_getargtypeid
- SPI_is_cursor_plan
- SPI_execute_plan
- SPI_execute_plan_with_paramlist
- SPI_execp
- SPI_cursor_open
- SPI_cursor_open_with_args
- SPI_cursor_open_with_paramlist
- SPI_cursor_find
- SPI_cursor_fetch
- SPI_cursor_move
- SPI_scroll_cursor_fetch
- SPI_scroll_cursor_move
- SPI_cursor_close
- SPI_keepplan
- SPI_saveplan
- 44.2. 接口支持函数
- SPI_fname
- SPI_fnumber
- SPI_getvalue
- SPI_getbinval
- SPI_gettype
- SPI_gettypeid
- SPI_getrelname
- SPI_getnspname
- 44.3. 内存管理
- SPI_palloc
- SPI_repalloc
- SPI_pfree
- SPI_copytuple
- SPI_returntuple
- SPI_modifytuple
- SPI_freetuple
- SPI_freetuptable
- SPI_freeplan
- 44.4. 数据改变的可视性
- 44.5. 例子
- Chapter 45. 后台工作进程
- VI. 参考手册
- I. SQL 命令
- ABORT
- ALTER AGGREGATE
- ALTER COLLATION
- ALTER CONVERSION
- ALTER DATABASE
- ALTER DEFAULT PRIVILEGES
- ALTER DOMAIN
- ALTER EXTENSION
- ALTER EVENT TRIGGER
- ALTER FOREIGN DATA WRAPPER
- ALTER FOREIGN TABLE
- ALTER FUNCTION
- ALTER GROUP
- ALTER INDEX
- ALTER LANGUAGE
- ALTER LARGE OBJECT
- ALTER MATERIALIZED VIEW
- ALTER OPERATOR
- ALTER OPERATOR CLASS
- ALTER OPERATOR FAMILY
- ALTER ROLE
- ALTER RULE
- ALTER SCHEMA
- ALTER SEQUENCE
- ALTER SERVER
- ALTER TABLE
- ALTER TABLESPACE
- ALTER TEXT SEARCH CONFIGURATION
- ALTER TEXT SEARCH DICTIONARY
- ALTER TEXT SEARCH PARSER
- ALTER TEXT SEARCH TEMPLATE
- ALTER TRIGGER
- ALTER TYPE
- ALTER USER
- ALTER USER MAPPING
- ALTER VIEW
- ANALYZE
- BEGIN
- CHECKPOINT
- CLOSE
- CLUSTER
- COMMENT
- COMMIT
- COMMIT PREPARED
- COPY
- CREATE AGGREGATE
- CREATE CAST
- CREATE COLLATION
- CREATE CONVERSION
- CREATE DATABASE
- CREATE DOMAIN
- CREATE EXTENSION
- CREATE EVENT TRIGGER
- CREATE FOREIGN DATA WRAPPER
- CREATE FOREIGN TABLE
- CREATE FUNCTION
- CREATE GROUP
- CREATE INDEX
- CREATE LANGUAGE
- CREATE MATERIALIZED VIEW
- CREATE OPERATOR
- CREATE OPERATOR CLASS
- CREATE OPERATOR FAMILY
- CREATE ROLE
- CREATE RULE
- CREATE SCHEMA
- CREATE SEQUENCE
- CREATE SERVER
- CREATE TABLE
- CREATE TABLE AS
- CREATE TABLESPACE
- CREATE TEXT SEARCH CONFIGURATION
- CREATE TEXT SEARCH DICTIONARY
- CREATE TEXT SEARCH PARSER
- CREATE TEXT SEARCH TEMPLATE
- CREATE TRIGGER
- CREATE TYPE
- CREATE USER
- CREATE USER MAPPING
- CREATE VIEW
- DEALLOCATE
- DECLARE
- DELETE
- DISCARD
- DO
- DROP AGGREGATE
- DROP CAST
- DROP COLLATION
- DROP CONVERSION
- DROP DATABASE
- DROP DOMAIN
- DROP EXTENSION
- DROP EVENT TRIGGER
- DROP FOREIGN DATA WRAPPER
- DROP FOREIGN TABLE
- DROP FUNCTION
- DROP GROUP
- DROP INDEX
- DROP LANGUAGE
- DROP MATERIALIZED VIEW
- DROP OPERATOR
- DROP OPERATOR CLASS
- DROP OPERATOR FAMILY
- DROP OWNED
- DROP ROLE
- DROP RULE
- DROP SCHEMA
- DROP SEQUENCE
- DROP SERVER
- DROP TABLE
- DROP TABLESPACE
- DROP TEXT SEARCH CONFIGURATION
- DROP TEXT SEARCH DICTIONARY
- DROP TEXT SEARCH PARSER
- DROP TEXT SEARCH TEMPLATE
- DROP TRIGGER
- DROP TYPE
- DROP USER
- DROP USER MAPPING
- DROP VIEW
- END
- EXECUTE
- EXPLAIN
- FETCH
- GRANT
- INSERT
- LISTEN
- LOAD
- LOCK
- MOVE
- NOTIFY
- PREPARE
- PREPARE TRANSACTION
- REASSIGN OWNED
- REFRESH MATERIALIZED VIEW
- REINDEX
- RELEASE SAVEPOINT
- RESET
- REVOKE
- ROLLBACK
- ROLLBACK PREPARED
- ROLLBACK TO SAVEPOINT
- SAVEPOINT
- SECURITY LABEL
- SELECT
- SELECT INTO
- SET
- SET CONSTRAINTS
- SET ROLE
- SET SESSION AUTHORIZATION
- SET TRANSACTION
- SHOW
- START TRANSACTION
- TRUNCATE
- UNLISTEN
- UPDATE
- VACUUM
- VALUES
- II. PostgreSQL 客户端应用程序
- clusterdb
- createdb
- createlang
- createuser
- dropdb
- droplang
- dropuser
- ecpg
- pg_basebackup
- pg_config
- pg_dump
- pg_dumpall
- pg_isready
- pg_receivexlog
- pg_restore
- psql
- reindexdb
- vacuumdb
- III. PostgreSQL 服务器应用程序
- initdb
- pg_controldata
- pg_ctl
- pg_resetxlog
- postgres
- postmaster
- VII. 内部
- Chapter 46. PostgreSQL内部概述
- 46.1. 查询经过的路径
- 46.2. 连接是如何建立起来的
- 46.3. 分析器阶段
- 46.4. PostgreSQL规则系统
- 46.5. 规划器/优化器
- 46.6. 执行器
- Chapter 47. 系统表
- 47.1. 概述
- 47.2. pg_aggregate
- 47.3. pg_am
- 47.4. pg_amop
- 47.5. pg_amproc
- 47.6. pg_attrdef
- 47.7. pg_attribute
- 47.8. pg_authid
- 47.9. pg_auth_members
- 47.10. pg_cast
- 47.11. pg_class
- 47.12. pg_event_trigger
- 47.13. pg_constraint
- 47.14. pg_collation
- 47.15. pg_conversion
- 47.16. pg_database
- 47.17. pg_db_role_setting
- 47.18. pg_default_acl
- 47.19. pg_depend
- 47.20. pg_description
- 47.21. pg_enum
- 47.22. pg_extension
- 47.23. pg_foreign_data_wrapper
- 47.24. pg_foreign_server
- 47.25. pg_foreign_table
- 47.26. pg_index
- 47.27. pg_inherits
- 47.28. pg_language
- 47.29. pg_largeobject
- 47.30. pg_largeobject_metadata
- 47.31. pg_namespace
- 47.32. pg_opclass
- 47.33. pg_operator
- 47.34. pg_opfamily
- 47.35. pg_pltemplate
- 47.36. pg_proc
- 47.37. pg_range
- 47.38. pg_rewrite
- 47.39. pg_seclabel
- 47.40. pg_shdepend
- 47.41. pg_shdescription
- 47.42. pg_shseclabel
- 47.43. pg_statistic
- 47.44. pg_tablespace
- 47.45. pg_trigger
- 47.46. pg_ts_config
- 47.47. pg_ts_config_map
- 47.48. pg_ts_dict
- 47.49. pg_ts_parser
- 47.50. pg_ts_template
- 47.51. pg_type
- 47.52. pg_user_mapping
- 47.53. 系统视图
- 47.54. pg_available_extensions
- 47.55. pg_available_extension_versions
- 47.56. pg_cursors
- 47.57. pg_group
- 47.58. pg_indexes
- 47.59. pg_locks
- 47.60. pg_matviews
- 47.61. pg_prepared_statements
- 47.62. pg_prepared_xacts
- 47.63. pg_roles
- 47.64. pg_rules
- 47.65. pg_seclabels
- 47.66. pg_settings
- 47.67. pg_shadow
- 47.68. pg_stats
- 47.69. pg_tables
- 47.70. pg_timezone_abbrevs
- 47.71. pg_timezone_names
- 47.72. pg_user
- 47.73. pg_user_mappings
- 47.74. pg_views
- Chapter 48. 前/后端协议
- 48.1. 概要
- 48.2. 消息流
- 48.3. 流复制协议
- 48.4. 消息数据类型
- 48.5. 消息格式
- 48.6. 错误和通知消息字段
- 48.7. 自协议 2.0 以来的变化的概述
- Chapter 49. PostgreSQL 编码约定
- 49.1. 格式
- 49.2. 报告服务器里的错误
- 49.3. 错误消息风格指导
- Chapter 50. 本地语言支持
- 50.1. 寄语翻译家
- 50.2. 寄语程序员
- Chapter 51. 书写一个过程语言处理器
- Chapter 52. 写一个外数据包
- 52.1. 外数据封装函数
- 52.2. 外数据封装回调程序
- 52.3. 外数据封装辅助函数
- 52.4. 外数据封装查询规划
- Chapter 53. 基因查询优化器
- 53.1. 作为复杂优化问题的查询处理
- 53.2. 基因算法
- 53.3. PostgreSQL 里的基因查询优化(GEQO)
- 53.4. 进一步阅读
- Chapter 54. 索引访问方法接口定义
- 54.1. 索引的系统表记录
- 54.2. 索引访问方法函数
- 54.3. 索引扫描
- 54.4. 索引锁的考量
- 54.5. 索引唯一性检查
- 54.6. 索引开销估计函数
- Chapter 55. GiST索引
- 55.1. 介绍
- 55.2. 扩展性
- 55.3. 实现
- 55.4. 例
- Chapter 56. SP-GiST索引
- 56.1. 介绍
- 56.2. 扩展性
- 56.3. 实现
- 56.4. 例
- Chapter 57. GIN索引
- 57.1. 介绍
- 57.2. 扩展性
- 57.3. 实现
- 57.4. GIN提示与技巧
- 57.5. 限制
- 57.6. 例子
- Chapter 58. 数据库物理存储
- 58.1. 数据库文件布局
- 58.2. TOAST
- 58.3. 自由空间映射
- 58.4. 可见映射
- 58.5. 初始化分支
- 58.6. 数据库分页文件
- Chapter 59. BKI后端接口
- 59.1. BKI 文件格式
- 59.2. BKI 命令
- 59.3. 系统初始化的BKI文件的结构
- 59.4. 例子
- Chapter 60. 规划器如何使用统计信息
- 60.1. 行预期的例子
- VIII. 附录
- Appendix A. PostgreSQL 错误代码
- Appendix B. 日期/时间支持
- B.1. 日期/时间输入解析
- B.2. 日期/时间关键字
- B.3. 日期/时间配置文件
- B.4. 单位历史
- Appendix C. SQL关键字
- Appendix D. SQL兼容性
- D.1. 支持的特性
- D.2. 不支持的特性
- Appendix E. 版本说明
- E.1. 版本 9.3.1
- E.2. 版本 9.3
- E.3. 版本9.2.5
- E.4. 版本9.2.4
- E.5. 版本9.2.3
- E.6. 版本9.2.2
- E.7. 版本9.2.1
- E.8. 版本9.2
- E.9. 发布9.1.10
- E.10. 发布9.1.9
- E.11. 发布9.1.8
- E.12. 发布9.1.7
- E.13. 发布9.1.6
- E.14. 发布9.1.5
- E.15. 发布9.1.4
- E.16. 发布9.1.3
- E.17. 发布9.1.2
- E.18. 发布9.1.1
- E.19. 发布9.1
- E.20. 版本 9.0.14
- E.21. 版本 9.0.13
- E.22. 版本 9.0.12
- E.23. 版本 9.0.11
- E.24. 版本 9.0.10
- E.25. 版本 9.0.9
- E.26. 版本 9.0.8
- E.27. 版本 9.0.7
- E.28. 版本 9.0.6
- E.29. 版本 9.0.5
- E.30. 版本 9.0.4
- E.31. 版本 9.0.3
- E.32. 版本 9.0.2
- E.33. 版本 9.0.1
- E.34. 版本 9.0
- E.35. 发布8.4.18
- E.36. 发布8.4.17
- E.37. 发布8.4.16
- E.38. 发布8.4.15
- E.39. 发布8.4.14
- E.40. 发布8.4.13
- E.41. 发布8.4.12
- E.42. 发布8.4.11
- E.43. 发布8.4.10
- E.44. 发布8.4.9
- E.45. 发布8.4.8
- E.46. 发布8.4.7
- E.47. 发布8.4.6
- E.48. 发布8.4.5
- E.49. 发布8.4.4
- E.50. 发布8.4.3
- E.51. 发布8.4.2
- E.52. 发布8.4.1
- E.53. 发布8.4
- E.54. 发布8.3.23
- E.55. 发布8.3.22
- E.56. 发布8.3.21
- E.57. 发布8.3.20
- E.58. 发布8.3.19
- E.59. 发布8.3.18
- E.60. 发布8.3.17
- E.61. 发布8.3.16
- E.62. 发布8.3.15
- E.63. 发布8.3.14
- E.64. 发布8.3.13
- E.65. 发布8.3.12
- E.66. 发布8.3.11
- E.67. 发布8.3.10
- E.68. 发布8.3.9
- E.69. 发布8.3.8
- E.70. 发布8.3.7
- E.71. 发布8.3.6
- E.72. 发布8.3.5
- E.73. 发布8.3.4
- E.74. 发布8.3.3
- E.75. 发布8.3.2
- E.76. 发布8.3.1
- E.77. 发布8.3
- E.78. 版本 8.2.23
- E.79. 版本 8.2.22
- E.80. 版本 8.2.21
- E.81. 版本 8.2.20
- E.82. 版本 8.2.19
- E.83. 版本 8.2.18
- E.84. 版本 8.2.17
- E.85. 版本 8.2.16
- E.86. 版本 8.2.15
- E.87. 版本 8.2.14
- E.88. 版本 8.2.13
- E.89. 版本 8.2.12
- E.90. 版本 8.2.11
- E.91. 版本 8.2.10
- E.92. 版本 8.2.9
- E.93. 版本 8.2.8
- E.94. 版本 8.2.7
- E.95. 版本 8.2.6
- E.96. 版本 8.2.5
- E.97. 版本 8.2.4
- E.98. 版本 8.2.3
- E.99. 版本 8.2.2
- E.100. 版本 8.2.1
- E.101. 版本 8.2
- E.102. 版本 8.1.23
- E.103. 版本 8.1.22
- E.104. 版本 8.1.21
- E.105. 版本 8.1.20
- E.106. 版本 8.1.19
- E.107. 版本 8.1.18
- E.108. 版本 8.1.17
- E.109. 版本 8.1.16
- E.110. 版本 8.1.5
- E.111. 版本 8.1.14
- E.112. 版本 8.1.13
- E.113. 版本 8.1.12
- E.114. 版本 8.1.11
- E.115. 版本 8.1.10
- E.116. 版本 8.1.9
- E.117. 版本 8.1.8
- E.118. 版本 8.1.7
- E.119. 版本 8.1.6
- E.120. 版本 8.1.5
- E.121. 版本 8.1.4
- E.122. 版本 8.1.3
- E.123. 版本 8.1.2
- E.124. 版本 8.1.1
- E.125. 版本 8.1
- E.126. 版本 8.0.26
- E.127. 版本 8.0.25
- E.128. 版本 8.0.24
- E.129. 版本 8.0.23
- E.130. 版本 8.0.22
- E.131. 版本 8.0.21
- E.132. 版本 8.0.20
- E.133. 版本 8.0.19
- E.134. 版本 8.0.18
- E.135. 版本 8.0.17
- E.136. 版本 8.0.16
- E.137. 版本 8.0.15
- E.138. 版本 8.0.14
- E.139. 版本 8.0.13
- E.140. 版本 8.0.12
- E.141. 版本 8.0.11
- E.142. 版本 8.0.10
- E.143. 版本 8.0.9
- E.144. 版本 8.0.8
- E.145. 版本 8.0.7
- E.146. 版本 8.0.6
- E.147. 版本 8.0.5
- E.148. 版本 8.0.4
- E.149. 版本 8.0.3
- E.150. 版本 8.0.2
- E.151. 版本 8.0.1
- E.152. 版本 8.0.0
- E.153. 版本 7.4.30
- E.154. 版本 7.4.29
- E.155. 版本 7.4.28
- E.156. 版本 7.4.27
- E.157. 版本 7.4.26
- E.158. 版本 7.4.25
- E.159. 版本 7.4.24
- E.160. 版本 7.4.23
- E.161. 版本 7.4.22
- E.162. 版本 7.4.21
- E.163. 版本 7.4.20
- E.164. 版本 7.4.19
- E.165. 版本 7.4.18
- E.166. 版本 7.4.17
- E.167. 版本 7.4.16
- E.168. 版本 7.4.15
- E.169. 版本 7.4.14
- E.170. 版本 7.4.13
- E.171. 版本 7.4.12
- E.172. 版本 7.4.11
- E.173. 版本 7.4.10
- E.174. 版本 7.4.9
- E.175. 版本 7.4.8
- E.176. 版本 7.4.7
- E.177. 版本 7.4.6
- E.178. 版本 7.4.3
- E.179. 版本 7.4.4
- E.180. 版本 7.4.3
- E.181. 版本 7.4.2
- E.182. 版本 7.4.1
- E.183. 版本 7.4
- E.184. 版本 7.3.21
- E.185. 版本 7.3.20
- E.186. 版本 7.3.19
- E.187. 版本 7.3.18
- E.188. 版本 7.3.17
- E.189. 版本 7.3.16
- E.190. 版本 7.3.15
- E.191. 版本 7.3.14
- E.192. 版本 7.3.13
- E.193. 版本 7.3.12
- E.194. 版本 7.3.11
- E.195. 版本 7.3.10
- E.196. 版本 7.3.9
- E.197. 版本 7.3.8
- E.198. 版本 7.3.7
- E.199. 版本 7.3.6
- E.200. 版本 7.3.5
- E.201. 版本 7.3.4
- E.202. 版本 7.3.3
- E.203. 版本 7.3.2
- E.204. 版本 7.3.1
- E.205. 版本 7.3
- E.206. 版本 7.2.8
- E.207. 版本 7.2.7
- E.208. 版本 7.2.6
- E.209. 版本 7.2.5
- E.210. 版本 7.2.4
- E.211. 版本 7.2.3
- E.212. 版本 7.2.2
- E.213. 版本 7.2.1
- E.214. 版本 7.2
- E.215. 版本 7.1.3
- E.216. 版本 7.1.2
- E.217. 版本 7.1.1
- E.218. 版本 7.1
- E.219. 版本 7.0.3
- E.220. 版本 7.0.2
- E.221. 版本 7.0.1
- E.222. 版本 7.0
- E.223. 版本 6.5.3
- E.224. 版本 6.5.2
- E.225. 版本 6.5.1
- E.226. 版本 6.5
- E.227. 版本 6.4.2
- E.228. 版本 6.4.1
- E.229. 版本 6.4
- E.230. 版本 6.3.2
- E.231. 版本 6.3.1
- E.232. 版本 6.3
- E.233. 版本 6.2.1
- E.234. 版本 6.2
- E.235. 版本 6.1.1
- E.236. 版本 6.1
- E.237. 版本 6.0
- E.238. 版本 1.09
- E.239. 版本 1.02
- E.240. 版本 1.01
- E.241. 版本 1.0
- E.242. Postgres95 版本 0.03
- E.243. Postgres95 版本 0.02
- E.244. Postgres95 版本 0.01
- Appendix F. 额外提供的模块
- F.1. adminpack
- F.2. auth_delay
- F.3. auto_explain
- F.4. btree_gin
- F.5. btree_gist
- F.6. chkpass
- F.7. citext
- F.8. cube
- F.9. dblink
- dblink_connect
- dblink_connect_u
- dblink_disconnect
- dblink
- dblink_exec
- dblink_open
- dblink_fetch
- dblink_close
- dblink_get_connections
- dblink_error_message
- dblink_send_query
- dblink_is_busy
- dblink_get_notify
- dblink_get_result
- dblink_cancel_query
- dblink_get_pkey
- dblink_build_sql_insert
- dblink_build_sql_delete
- dblink_build_sql_update
- F.10. dict_int
- F.11. dict_xsyn
- F.12. dummy_seclabel
- F.13. earthdistance
- F.14. file_fdw
- F.15. fuzzystrmatch
- F.16. hstore
- F.17. intagg
- F.18. intarray
- F.19. isn
- F.20. lo
- F.21. ltree
- F.22. pageinspect
- F.23. passwordcheck
- F.24. pg_buffercache
- F.25. pgcrypto
- F.26. pg_freespacemap
- F.27. pgrowlocks
- F.28. pg_stat_statements
- F.29. pgstattuple
- F.30. pg_trgm
- F.31. postgres_fdw
- F.32. seg
- F.33. sepgsql
- F.34. spi
- F.35. sslinfo
- F.36. tablefunc
- F.37. tcn
- F.38. test_parser
- F.39. tsearch2
- F.40. unaccent
- F.41. uuid-ossp
- F.42. xml2
- Appendix G. 额外提供的程序
- G.1. 客户端应用程序
- oid2name
- pgbench
- vacuumlo
- G.2. 服务器端应用程序
- pg_archivecleanup
- pg_standby
- pg_test_fsync
- pg_test_timing
- pg_upgrade
- pg_xlogdump
- Appendix H. 外部项目
- H.1. 客户端接口
- H.2. 管理工具
- H.3. 过程语言
- H.4. 扩展
- Appendix I. 源代码库
- I.1. 获得源代码通过Git
- Appendix J. 文档
- J.1. DocBook
- J.2. 工具集
- J.3. 制作文档
- J.4. 文档写作
- J.5. 风格指导
- Appendix K. 首字母缩略词
- 参考书目
- Index