版本8.4

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 附录 E. 版本说明 | 下一页

# E.89. 版本8.4

> 发布日期: 2009-07-01

## E.89.1. 概要

经过多年研发后，PostgreSQL已经在许多领域特性比较完整。 该发布显示一个针对性方法来添加特性（比如，认证，监测，空间重利用）， 并且添加在以后SQL标准中定义的能力。增强的主要方面是：

- 窗口函数

- 通用表表达式和递归查询

- 函数缺省和可变参数

- 并行恢复

- 列权限

- 每个数据库本地设置

- 改进的哈希索引

- 改进`EXISTS`和`NOT EXISTS`查询连接性能

- 容易使用热备份

- 空闲空间映射的自动大小

- 可见映射（大大降低了缓慢变化表的清理开销）

- 版本感知psql(旧服务器之前使用反斜杠命令)

- 支持用户认证的SSL证书

- 每个函数运行时统计

- psql中函数简单编辑

- 新的contrib模块：pg_stat_statements, auto_explain, citext, btree_gin

在下面章节中将详细解释以上所列项。

## E.89.2. 迁移到版本8.4

对于那些希望从任何以前发布中迁移数据是需要使用pg_dump备份/恢复。

观察下面的不兼容：

### E.89.2.1. 普遍的

- 缺省使用64位整数日期时间(Neil Conway)

  以前通过configure的`--enable-integer-datetimes`选项进行选择。为保留旧操作， 与`--disable-integer-datetimes`一起编译。

- 删除ipcclean实用命令(Bruce)

  该功能仅仅工作于几个平台上。用户应该使用他们的操作系统工具。

### E.89.2.2. 服务器设置

- 为`log_min_messages`更改缺省设置为`warning`（以前为`notice`） 以减少日志文件数量(Tom)

- 为`max_prepared_transactions`改变缺省设置为零（以前为5）(Tom)

- 使得`debug_print_parse`, `debug_print_rewritten`, 和`debug_print_plan`在`LOG`消息级别输出，而不是像从前的`DEBUG1`(Tom)

- `debug_pretty_print`缺省为`on` (Tom)

- 删除`explain_pretty_print`参数（不再需要的）(Tom)

- 通过超级用户使得`log_temp_files`可定位，像其它日志选项(Simon Riggs)

- 当没有`%`转义出现在`log_filename`中的时候，删除epoch时间戳的自动追加(Robert Haas)

  该变化是因为有些用户想要一个已修复的日志文件名，用于外部日志轮换工具。

- 从`recovery.conf`删除中删除`log_restartpoints`； 代替使用`log_checkpoints` (Simon)

- 删除`krb_realm`和`krb_server_hostname`; 而是在`pg_hba.conf`中设置(Magnus)

- 在`pg_hba.conf`中有显著变化，如下所述。

### E.89.2.3. 查询

- 改变`TRUNCATE`和`LOCK`以适用于指定表的子表(Peter)

  这些命令现在接受避免处理子表的`ONLY`选项；如果需要旧操作，必须使用该选项。

- `SELECT DISTINCT`和`UNION`/`INTERSECT`/`EXCEPT` 不再总是产生有序输出(Tom)

  之前，这些类型的查询总是通过排序/唯一的处理方式（即排序然后删除相邻重复）去除重复行。 现在，他们可以通过哈希来实现，这不会生成有序输出。如果应用程序依赖于按照排序顺序的输出， ??????那么推荐解决方法是添加一个`ORDER BY`子句。作为一个短期解决方法， 之前的操作可以通过禁用`enable_hashagg`被恢复，但是这是一个性能昂贵的修复。 `SELECT DISTINCT ON`从不使用散列，然而，因此，其操作不改变。

- 强迫子表继承父表`CHECK`约束(Alex Hunsaker, Nikhil Sontakke, Tom)

  以前可能从子表中删除该约束，当扫描父表的时候，允许违背该约束的行可见。 这被认为是不一致的，也违背了SQL标准。

- 禁止负的`LIMIT`或者`OFFSET`值，而不是将它们视为零(Simon)

- 禁止事务块外的`LOCK TABLE`(Tom)

  这样的操作是无效的，因为该锁将被立即释放。

- 现在序列包含一个额外的`start_value`列(Zoltan Boszormenyi)

  支持`ALTER SEQUENCE ... RESTART`。

### E.89.2.4. 函数和操作符

- 采用`numeric`零放到分数幂上返回`0`，而不是抛出错误， 并且采用`numeric`零放到零幂上返回`1`，而不是错误(Bruce)

  这匹配长期的`float8`操作。

- 允许浮点值的一元负号产生负零(Tom)

  修改后操作更加遵循IEEE-标准。

- 如果转义字符是`LIKE`模式中的最后一个字符，抛出一个错误（即它没有任何转义）(Tom)

  此前，这样的转义字符被默默忽略掉，从而可能掩盖应用程序逻辑错误。

- 删除以前用于`LIKE`索引比较的`~=~` and `~<>~`操作符(Tom)

  模式索引目前使用规则平等操作符。

- `xpath()`现在将参数传递给libxml没有任何变化(Andrew)

  这意味着XML参数必须是一个良好的XML文档。先前编码试图允许XML片段， 但它并没有很好地工作。

- 让`xmlelement()`格式属性值就好像目录值(Peter)

  此前，属性值是按照正常的SQL输出操作被格式化，有时不符合XML规则。

- 为libxml-使用函数重写内存管理(Tom)

  这种变化应该避免在PL/Perl中使用libxml和其他附加代码的一些兼容性问题。

- 为哈希函数采取更快速算法(Kenneth Marshall,依据Bob Jenkins的工作)

  许多内置哈希函数现在在小端和大端平台上提供不同的结果。

#### E.89.2.4.1. 时间函数和操作符

- `DateStyle`不再控制`interval`输出格式； 反而有一个新变量`IntervalStyle`(Ron Mayer)

- 提高`timestamp`和`interval`输出中小数秒处理的一致性(Ron Mayer)

  这可能导致比以前显示不同数量的小数位，或者四舍五入而不是截断。

- 使得`to_char()`的本地的月份/日期名字依赖于`LC_TIME`， 而不是`LC_MESSAGES` (Euler Taveira de Oliveira)

- 导致`to_date()`和`to_timestamp()`更加一致报告无效输入错误(Brendan Jurd)

  以前的版本中会常常忽略或默默地误读不匹配格式字符串的输入。 这种情况下将导致错误。

- 为了子午线(`AM`/`PM`)和纪元 (`BC`/`AD`)格式名称修复`to_timestamp()`而不需要大写/小写匹配(Brendan Jurd)

  比如，输入值`ad`匹配格式字符串`AD`。

## E.89.3. 变化

下面你会发现在PostgreSQL 8.4和之前主要发布之间变化的详细说明。

### E.89.3.1. 性能

- 完善优化统计计算(Jan Urbanski, Tom)

  尤其是，估计全文搜索操作符被大幅度提高。

- 允许`SELECT DISTINCT`和`UNION`/`INTERSECT`/`EXCEPT`可以使用哈希(Tom)

  这意味着这些类型的查询不再自动生成有序输出。

- 创建半连接和反连接明确概念(Tom)

  这项工作正规化`IN(SELECT ...)`子句之前的点对点处理， 并延伸到`EXISTS`和`NOT EXISTS`子句中。 它可能导致`EXISTS`和`NOT EXISTS`查询更好地规划。 一般情况下，逻辑上相同的`IN`和`EXISTS`子句有类似性能， 而此前的`IN`获胜。

- 提高外部链接下子选择优化(Tom)

  以前，一个子选择或视图不能被很好的优化， 如果它出现在外连接可空端并且在结果列中包含非严格表达式（比如，常量）。

- 通过使用Boyer-Moore-Horspool搜索提高`text_position()`和相关函数的性能(David Rowley)

  这对长期搜索模式特别有帮助。

- 当需要的时候，通过写文件降低写入统计收集文件I/O负载(Martin Pihlak)

- 提高批量插入性能(Robert Haas, Simon)

- 从`10`到`100`增加`default_statistics_target`缺省值(Greg Sabino Mullane,Tom)

  最大值从`1000`增加到`10000`。

- 在涉及继承或者`UNION ALL`的查询中缺省执行`constraint_exclusion`检查(Tom)

  新的`constraint_exclusion`设置，`分区`被添加以指定该操作。

- 允许I/O预读取位图索引扫描(Greg Stark)

  通过`effective_io_concurrency`控制预读数量。 只有内核有`posix_fadvise()`支持时该功能可用。

- 内置`FROM`子句中简单集合返回SQL函数(Richard Rowell)

- 通过为连接密钥值提供一种特殊情况来优化多批次哈希连接性能， 这种情况在外部关系中特别常见(Bryce Cutt, Ramon Lawrence)

- 通过抑制"physical tlist"优化减少多批次哈希连接中临时数据量 (Michael Henderson, Ramon Lawrence)

- 避免`CREATE INDEX CONCURRENTLY`中等待空闲事务会话(Simon)

- 改进共享缓存无效性能(Tom)

### E.89.3.2. 服务器

#### E.89.3.2.1. 设置

- 转换许多`postgresql.conf`设置以枚举值，使得`pg_settings` 可以显示有效值(Magnus)

- 添加`cursor_tuple_fraction`参数以控制规划器假设被抓取的游标行(Robert Hell)

- 允许`postgresql.conf`中自定义变量类下的下划线(Tom)

#### E.89.3.2.2. 身份验证和安全

- 删除支持(不安全) `crypt`认证方法(Magnus)

  这有效地淘汰了先前PostgreSQL7.2客户端库， 因为不再有他们可以使用的任何非明文口令方法。

- 支持`pg_ident.conf`中正则表达式(Magnus)

- 允许无需重启postmaster改变Kerberos/GSSAPI参数(Magnus)

- 支持服务器证书文件中SSL证书链(Andrew Gierth)

  包括完整证书链使客户能够验证证书， 而不需要存在于本地存储中的所有中间CA证书，这是商业CA的常见情况。

- 报告连接`MD5`认证和`db_user_namespace`启动的相应错误消息(Bruce)

#### E.89.3.2.3. `pg_hba.conf`

- 改变所有身份验证选项使用`name=value`语法(Magnus)

  这使得不兼容变化到`ldap`,`pam`和`ident`身份验证方法。 所有使用这些方法的`pg_hba.conf`项需要使用新的格式被重写。

- 删除`ident sameuser`选项，如果没有指定usermap，而不是使得该操作缺省(Magnus)

- 允许为所有外部身份验证方法的usermap参数(Magnus)

  之前usermap只支持`ident`认证。

- 添加`clientcert`选项以控制客户端证书请求(Magnus)

  以前这是通过服务器的数据目录中根证书文件被控制。

- 添加`cert`认证方法以允许user认证通过SSL证书(Magnus)

  此前SSL证书只能验证客户端可以使用一个证书，而不是验证用户。

- 允许在`pg_hba.conf`中指定`krb5`, `gssapi`和`sspi` 字段和`krb5`主机设置(Magnus)

  这些覆盖了`postgresql.conf`中设置。

- 为`krb5`，`gssapi`和`sspi`方法添加`include_realm`参数(Magnus)

  这允许来自不同领域的相同用户名被认证为使用用户映射的不同数据库用户。

- 当它被加载的时候，完整解析`pg_hba.conf`，以致于 可以立即报告错误(Magnus)

  此前，文件中的大多数错误直到客户端试图连接时才会被检测到，所以一个错误的文件可能导致系统 无法使用。随着新的操作，如果在重载时检测到错误，那么坏文件被拒绝，并且postmaster继续使用其旧副本。

- 显示`pg_hba.conf`中所有解析错误 而不是在第一个之后终止(Selena Deckelmann)

- 支持Solaris上Unix域套接字上的`ident`认证(Garick Hamlin)

#### E.89.3.2.4. 连续归档

- 提供一个选项到`pg_start_backup()`以强制尽快完成的隐含检查点(Tom)

  缺省操作避免过多I/O消耗，但是如果没有并发查询活动，这是毫无意义的。

- 让`pg_stop_backup()`等待修改的WAL文件被归档(Simon)

  这保证备份在`pg_stop_backup()`完成时是有效的。

- 当启用归档时，在关闭时交替最后WAL段以致于所有事务可以立即被归档(Guillaume Smet, Heikki)

- 当连续归档基础备份在进展中时，延迟"smart"关机(Laurenz Albe)

- 如果请求"fast"关机，那么取消连续归档基础备份(Laurenz Albe)

- 允许`recovery.conf`布尔变量采取同一范围字符串值作为`postgresql.conf`布尔值(Bruce)

#### E.89.3.2.5. 监控

- 当最后加载PostgreSQL配置文件的时候，添加`pg_conf_load_time()`以报告(George Gensure)

- 添加`pg_terminate_backend()`以安全终止后台（`SIGTERM`信号也如此）(Tom, Bruce)

  虽然它一直可能`SIGTERM`单一后端， 这个以前被认为是不支持的； 并且测试的情况下发现了一些被修复的错误。

- 添加跟踪用户定义函数的调用计数以及运行时间能力(Martin Pihlak)

  函数统计出现在新的系统视图，`pg_stat_user_functions`中。 通过新的参数`track_functions`控制跟踪。

- 在`pg_stat_activity`中通过新的`track_activity_query_size`参数 允许声明最大查询字符串大小(Thomas Lee)

- 增大最大线长度发送到syslog，希望优化性能(Tom)

- 添加只读配置变量`segment_size`,`wal_block_size`和`wal_segment_size` (Bernd Helmle)

- 当报告死锁时，报告死锁服务器日志中涉及的所有查询文本(Itagaki Takahiro)

- 添加`pg_stat_get_activity(pid)`函数以返回关于指定进程id的信息(Magnus)

- 允许通过`stats_temp_directory`指定服务器的统计文件的位置(Magnus)

  这允许统计文件被放置在RAM固有目录中以减少I/O需求。 在启动/关闭时，文件被拷贝到它的传统位置(`$PGDATA/global/`)下， 所以重新启动时被保留。

### E.89.3.3. 查询

- 添加支持`WINDOW`函数(Hitoshi Harada)

- 添加支持`WITH`子句(CTEs)，包含`WITH RECURSIVE` (Yoshiyuki Asaba, Tatsuo Ishii, Tom)

- 添加`TABLE`命令(Peter)

  `TABLE tablename`是`SELECT * FROM tablename`的一个SQL标准简写。

- 当声明`SELECT` (或者`RETURNING`)列输出标签的时候，允许 `AS`为可选的(Hiroshi Saito)

  该操作只要列标签没有任何PostgreSQL关键字，否则仍然需要`AS`。

- 支持在`SELECT`结果列表中设置返回函数， 即使对于通过tuplestore返回其结果的函数(Tom)

  特别是，这意味着用PL/pgSQL和其它PL/pgSQL语言书写的函数可以这样被调用。

- 在聚合和分组查询输出中支持设置返回函数(Tom)

- 允许`SELECT FOR UPDATE`/`SHARE`在继承树上进行操作(Tom)

- 为SQL/MED添加基础设施(Martin Pihlak, Peter)

  然而没有远程或外部SQL/MED功能， 但这种变化提供了一个标准化的，面向未来系统， 用于管理类似模块`dblink`和`plproxy`连接信息。

- 当引用的模式，函数，操作符或者操作符类被修改的时候，使缓存计划无效(Martin Pihlak, Tom)

  这提高了系统对反应传输中DDL变化的能力。

- 允许复合类型比较以及匿名复合类型的数组(Tom)

  这允许构造比如`row(1, 1.1) = any (array[row(7, 7.7), row(1, 1.0)])`。 在递归查询中特别有用。

- 添加使用代码点支持Unicode字符串文本和标识符规范， 比如`U&'d\0061t\+000061'`(Peter)

- 拒绝字符串文本中`\000`和`COPY`数据(Tom)

  之前，这被接受但是有终止字符串内容的影响。

- 提高解析器报告错误位置的能力(Tom)

  为许多语义错误报道一个错误位置， 比如不匹配的数据类型，这在以前不可能被本地化。

#### E.89.3.3.1. `TRUNCATE`

- 支持语句级别`ON TRUNCATE`触发器(Simon)

- 为了`TRUNCATE TABLE`添加`RESTART`/`CONTINUE IDENTITY`选项(Zoltan Boszormenyi)

  序列的起始值可以通过`ALTER SEQUENCE START WITH`被改变。

- 允许`TRUNCATE tab1, tab1`成功(Bruce)

- 添加单独`TRUNCATE`许可(Robert Haas)

#### E.89.3.3.2. `EXPLAIN`

- 采用`EXPLAIN VERBOSE`显示每个规划节点的输出列(Tom)

  此前`EXPLAIN VERBOSE`输出查询规划的内部表示。 （该操作通过`debug_print_plan`是可用的。）

- 采用`EXPLAIN`标识子计划以及单一标签的初始计划(Tom)

- 为了`debug_print_plan`采用`EXPLAIN`(Tom)

- 允许在`CREATE TABLE AS`上进行`EXPLAIN`(Peter)

#### E.89.3.3.3. `LIMIT`/`OFFSET`

- 允许`LIMIT`和`OFFSET`中子选择(Tom)

- 为了`LIMIT`/`OFFSET`性能添加SQL标准语法(Peter)

  也就是说，`OFFSET num {ROW|ROWS} FETCH {FIRST|NEXT} [num] {ROW|ROWS} ONLY`。

### E.89.3.4. 对象操作

- 添加列级权限支持(Stephen Frost, KaiGai Kohei)

- 重构多目标`DROP`操作以减少`CASCADE`的需要(Alex Hunsaker)

  比如，如果表`B`在表`A`上有依赖物，那么 命令`DROP TABLE A, B`不再需要`CASCADE`选项。

- 通过确保在开始删除对象依赖之前采取锁定，修复各种并发`DROP`命令问题(Tom)

- 改善`DROP`命令中依赖性报告(Tom)

- 添加`WITH [NO] DATA`子句给`CREATE TABLE AS`，按照SQL标准(Peter, Tom)

- 添加支持用户自定义I/O转换模型(Heikki)

- 允许`CREATE AGGREGATE`使用`internal`转换数据类型(Tom)

- 添加`LIKE`子句到`CREATE TYPE` (Tom)

  这简化了使用作为已存在类型同一内部表示形式的数据类型的创建。

- 允许类型类别指定以及用户定义的基础类型"首选"状态(Tom)

  这允许控制用户定义类型的强制操作。

- 允许`CREATE OR REPLACE VIEW`添加列到视图结尾(Robert Haas)

#### E.89.3.4.1. `ALTER`

- 添加`ALTER TYPE RENAME` (Petr Jelinek)

- 添加`ALTER SEQUENCE ... RESTART`（无参数）以重置序列到其初始值(Zoltan Boszormenyi)

- 修改`ALTER TABLE`语法以允许表，索引，序列以及视图合理组合(Tom)

  这种变化允许下面新语法：

  - `ALTER SEQUENCE OWNER TO`

  - `ALTER VIEW ALTER COLUMN SET/DROP DEFAULT`

  - `ALTER VIEW OWNER TO`

  - `ALTER VIEW SET SCHEMA`

  这里没有实际的新功能， 但之前你不得不表明`ALTER TABLE`可以做这些事情，使其混淆。

- 添加支持语法`ALTER TABLE ... ALTER COLUMN... SET DATA TYPE` (Peter)

  这是已经支持的功能性SQL标准语法。

- 采用`ALTER TABLE SET WITHOUT OIDS`重写表以物理删除`OID`值(Tom)

  同时添加`ALTER TABLE SET WITH OIDS`重写表添加`OID`。

#### E.89.3.4.2. 数据库操作

- 当未提交预备事务的时候，改善`CREATE`/`DROP`/`RENAME DATABASE`错误报告(Tom)

- 每个数据库设置采用`LC_COLLATE`和`LC_CTYPE`(Radek Strnad, Heikki)

  整理类似编码，总是配置每个数据库。

- 完善检查数据库编码，整理(`LC_COLLATE`), 以及字符类(`LC_CTYPE`)匹配(Heikki, Tom)

  特别注意，当从`template0`拷贝的时候，一个新的数据库编码和语言环境设置被改变。 这避免了可能拷贝的数据不匹配该设置。

- 添加`ALTER DATABASE SET TABLESPACE`移动数据库到一个新的表空间(Guillaume Lelarge, Bernd Helmle)

### E.89.3.5. 实用操作

- 添加`VERBOSE`选项到`CLUSTER`命令和clusterdb中(Jim Cox)

- 为记录待定的触发器事件减少内存需求(Tom)

#### E.89.3.5.1. 索引

- 大幅提高建立并且访问哈希索引速度(Tom Raney, Shreya Bhargava)

  这使得散列索引有时比btree索引的速度更快。 然而，哈希索引仍然没有碰撞安全。

- 使得哈希索引只存储哈希码，而不是索引列的完整值(Xiao Meng)

  这大大减少了为长索引值的散列索引的大小，从而提高了性能。

- 实现GIN索引的快速更新选项(Teodor, Oleg)

  此选项大大提高了在搜索速度中小的不利后果上的更新速度。

- `xxx_pattern_ops`索引可以用于简单平等比较，而不仅仅为`LIKE` (Tom)

#### E.89.3.5.2. 全文索引

- 当在全文索引中执行GIN加权查找时，删除该需求而使用`@@@`(Tom, Teodor)

  可以使用正常的`@@`文本搜索操作符。

- 为`@@`文本搜索操作添加优化选择函数(Jan Urbanski)

- 允许全文搜索中前缀匹配(Teodor Sigaev,Oleg Bartunov)

- 支持多列GIN索引(Teodor Sigaev)

- 改善支持Nepali语言和Devanagari字母(Teodor)

#### E.89.3.5.3. `VACUUM`

- 在单独每个关系"fork"文件中跟踪自由空间(Heikki)

  通过`VACUUM`发现的自由空间在`*_fsm`文件中被记录， 而不是在一个固定大小的共享存储器区域中。 `max_fsm_pages`和`max_fsm_relations`设置已被移除， 从而大大简化了自由空间管理。

- 添加可见视图以跟踪不需要清理页面(Heikki)

  这允许`VACUUM`以避免扫描所有表， 只有表中的一部分需要清理的时候。可见视图被存储在每个关系"fork"文件。

- 添加`vacuum_freeze_table_age`参数以控制 当`VACUUM`忽略可见视图并且执行全表扫描以冻结元组。

- 更仔细追踪事务快照(Alvaro)

  这提高了`VACUUM`在长时间运行的事务中回收空间能力。

- 添加指定每个关系autovacuum以及`CREATE TABLE`中TOAST参数的能力(Alvaro, Euler Taveira de Oliveira)

  自动清理选项存储在系统表中。

- 添加`--freeze`选项到vacuumdb(Bruce)

### E.89.3.6. 数据类型

- 为文本搜索同义词词典添加`CaseSensitive`选项(Simon)

- 完善`NUMERIC`划分精度(Tom)

- 为`int2`与`int8`添加基础算术操作符(Tom)

  这消除了在某些情况中显式投射需求。

- 允许`UUID`输入在每四位后面接受可选的连字符(Robert Haas)

- 允许`on`/`off`作为布尔数据类型的输入(Itagaki Takahiro)

- 为类型`numeric`在输入字符串中`NaN`周围允许空格(Sam Mason)

#### E.89.3.6.1. 时间数据类型

- 拒绝年`0 BC`以及`000`和`0000`(Tom)

  以前这些被解释为`1 BC`。（注意：年`0`和`00`仍然假定为2000。）

- 在已知时区缩写缺省列表中包含`SGT` (Singapore时间)

- 支持`infinity`和`-infinity`作为类型`date`的值(Tom)

- 使得`interval`文本解析更加遵循标准(Tom, Ron Mayer)

  比如，`INTERVAL '1' YEAR`目前执行应该做的内容。

- 在`second`关键字之后，按照SQL标准允许指定`interval`分数秒精度(Tom)

  之前在关键字`interval`之后指定精度。（为了向后兼容，这种语法仍 支持，但不建议使用。）数据类型定义现在使用标准格式被输出。

- 支持 IS0 8601 `interval`语法(Ron Mayer, Kevin Grittner)

  比如，现在支持`INTERVAL 'P1Y2M3DT4H5M6.7S'`。

- 添加`IntervalStyle`参数以控制`interval`值如何输出(Ron Mayer)

  有效值是：`postgres`, `postgres_verbose`, `sql_standard`, `iso_8601`。 只有当一些字段有正/负名称的时候，该设置也控制负`interval`输入的处理。

- 在`timestamp`和`interval`输入中优化小数秒处理的一致性(Ron Mayer)

#### E.89.3.6.2. 数组

- 优化适用于`ARRAY[]`结构映射处理， 比如`ARRAY[...]::integer[]`(Brendan Jurd)

  之前PostgreSQL试图为`ARRAY[]`结构而不引用随后计算确定一个数据类型。 这在许多情况下可能失败，特别是当`ARRAY[]`构造是空的或仅包含不明确项如`NULL`的时候。 现在协商该计算以确定该数组元素类型。

- 使得SQL语法`ARRAY`尺寸可选以匹配SQL标准(Peter)

- 添加`array_ndims()`以返回数组维数(Robert Haas)

- 添加`array_length()`以返回指定维数数组长度(Jim Nasby, Robert Haas, Peter Eisentraut)

- 添加聚合函数`array_agg()`作为一个数组返回所有聚合值(Robert Haas,Jeff Davis, Peter)

- 添加`unnest()`将一个数组转换为各行值(Tom)

  这是`array_agg()`的反面。

- 添加`array_fill()`以创建初始化值数组(Pavel Stehule)

- 添加`generate_subscripts()`以简化生成数组下标范围(Pavel Stehule)

#### E.89.3.6.3. 宽值存储(TOAST)

- 认为TOAST压缩值和32字节一样短（之前256字节）(Greg Stark)

- 使用TOAST压缩之前要求最低25％的空间节省，（之前20％为小值并且任何存储为大值）(Greg)

- 优化具有较大和较小toastable字段混合行的TOAST启发式， 使我们更愿意使得较大值超出范围并且不压缩较小值(Greg, Tom)

### E.89.3.7. 函数

- `setseed()`文件允许从`-1`到`1`的值（不只是`0`到`1`）， 并且执行有效范围(Kris Jurka)

- 添加服务器端函数`lo_import(filename, oid)`(Tatsuo)

- 添加`quote_nullable()`其操作类似于 `quote_literal()`但为空参数返回字符串`NULL`(Brendan Jurd)

- 优化全文本搜索`headline()`函数以允许提取文本若干片段(Sushant Sinha)

- 添加`suppress_redundant_updates_trigger()`触发器函数以避免 无数据变化更新开销(Andrew)

- 添加`div(numeric, numeric)`执行`numeric`除法而没有四舍五入(Tom)

- 添加`generate_series()`的`timestamp`和`timestamptz`版本(Hitoshi Harada)

#### E.89.3.7.1. 对象信息函数

- 通过需要知道当前正在运行的查询的函数实现`current_query()`的使用(Tomas Doran)

- 添加`pg_get_keywords()`返回解析关键字列表(Dave Page)

- 添加`pg_get_functiondef()`查看函数的定义(Abhijit Menon-Sen)

- 当解析不包含变量的表达式时，允许`pg_get_expr()`第二个参数为零(Tom)

- 修改`pg_relation_size()`以使用`regclass`(Heikki)

  `pg_relation_size(data_type_name)`不再起作用。

- 添加`boot_val`和`reset_val`列到`pg_settings`输出(Greg Smith)

- 为配置文件中变量设置添加源文件名和行号列到`pg_settings`输出(Magnus, Alvaro)

  出于安全原因，这些列只对超级用户可见。

- 添加支持`CURRENT_CATALOG`,`CURRENT_SCHEMA`, `SET CATALOG`, `SET SCHEMA`(Peter)

  为存在特性提供SQL标准语法。

- 添加`pg_typeof()`返回任何值的数据类型(Brendan Jurd)

- 采取`version()`返回有关服务器是否是32或者64位二进制信息(Bruce)

- 修复信息模式列`is_insertable_into`和`is_updatable`操作是一致的(Peter)

- 改善信息模式`datetime_precision`列的操作(Peter)

  这些列为`date`列显示为零并且`time`，`timestamp`以及 没有声明精度的`interval`显示为6（默认精度），而不如以前一样显示为空。

- 转换剩余内置集合返回函数使用`OUT`参数(Jaime Casanova)

  这使得它可以调用没有指定列表的函数：`pg_show_all_settings()`, `pg_lock_status()`, `pg_prepared_xact()`, `pg_prepared_statement()`, `pg_cursor()`

- 采用`pg_*_is_visible()`和`has_*_privilege()`为无效OID返回`NULL`，而不是抛出错误(Tom)

- 扩展`has_*_privilege()`函数以允许查询一个调用中多特权的OR(Stephen Frost, Tom)

- 添加`has_column_privilege()`和`has_any_column_privilege()`函数(Stephen Frost, Tom)

#### E.89.3.7.2. 函数创建

- 支持可变参数的函数（带有参数可变数量的函数）(Pavel Stehule)

  只有尾随参数是可选的，它们都必须是相同的数据类型。

- 支持函数参数的缺省值(Pavel Stehule)

- 添加`CREATE FUNCTION ... RETURNS TABLE`子句(Pavel Stehule)

- 允许SQL语言函数返回`INSERT`/`UPDATE`/`DELETE` `RETURNING`子句的输出(Tom)

#### E.89.3.7.3. PL/pgSQL服务器端语言

- 为了更容易地将数据值插入到动态查询字符串中支持`EXECUTE USING`(Pavel Stehule)

- 允许循环使用`FOR`循环游标结果(Pavel Stehule)

- 支持`RETURN QUERY EXECUTE` (Pavel Stehule)

- 优化`RAISE`命令(Pavel Stehule)

  - 支持`DETAIL`和`HINT`字段

  - 支持`SQLSTATE`错误代码规范

  - 支持异常名字参数

  - 允许异常块中无参数`RAISE`重新抛出当前错误

- 允许`EXCEPTION`列表中`SQLSTATE`代码规范(Pavel Stehule)

  这对于处理自定义`SQLSTATE`代码非常有用。

- 支持`CASE`语句(Pavel Stehule)

- 使用`RETURN QUERY`设置特殊的`FOUND`和 `GET DIAGNOSTICS` `ROW_COUNT`变量(Pavel Stehule)

- 使用`FETCH`和`MOVE`设置 `GET DIAGNOSTICS` `ROW_COUNT`变量(Andrew Gierth)

- 使用没有标签的`EXIT`总是退出最内层循环(Tom)

  之前，如果有一个`BEGIN`块比任何环路更加紧密的嵌套， 将退出该块。新的操作匹配Oracle(TM)并且也正如通过自身文档所讲述的。

- 使得字符串文本处理和嵌套块注释匹配主SQL解析器的处理(Tom)

  特别是，在`RAISE`中格式字符串执行与任何其他字符串文本一样的操作， 包含从属于`standard_conforming_strings`。当`standard_conforming_strings`为on的时候， 这种变化也修复了有效命令失败的情况。

- 当在不同异常块嵌套深度中调用同一函数的时候，避免内存泄露(Tom)

### E.89.3.8. 客户端应用

- 修复`pg_ctl restart`保存命令行参数(Bruce)

- 添加`-w`/`--no-password`选项防止在具有`-W`/`--password` 选项实用程序中的密码提示(Peter)

- 删除createdb, createuser, dropdb, dropuser中的`-q` (默默的)选项(Peter)

  这些选项不起作用因为PostgreSQL 8.3。

#### E.89.3.8.1. psql

- 删除详细的启动标志，目前建议`help`(Joshua Drake)

- 使用`help`显示常见的反斜杠命令(Greg Sabino Mullane)

- 添加`\pset格式包`模式来包装输出到屏幕宽度， 或者文件/管道输出，如果设置`\pset列`(Bryce Nesbitt)

- 允许`\pset`中布尔值的所有支持的拼写，而不仅仅`on`和`off` (Bruce)

  之前，除了"off"外的任何字符串默默地认为`true`。 psql抱怨无法识别的拼写（但是仍然认为`true`）。

- 使用宽输出分页程序(Bruce)

- 在一个字母反斜杠命令和它的第一个参数之间需要一个空格(Bernd Helmle)

  这消除了有歧义的历史渊源。

- 改善标签完整支持模式修饰以及带引号标识符(Greg Sabino Mullane)

- 为`\timing`添加可选的`on`/`off`参数(David Fetter)

- 显示多行上的访问控制权(Brendan Jurd, Andreas Scherbaum)

- 使用`\l`显示数据库访问权限(Andrew Gilligan)

- 使用`\l+`显示数据库大小，如果权限允许(Andrew Gilligan)

- 添加`\ef`命令编辑函数定义(Abhijit Menon-Sen)

#### E.89.3.8.2. psql \d* 命令

- 使得没有模式参数的`\d*`命令显示系统对象， 只有当指定`S`修饰语的时候(Greg Sabino Mullane, Bruce)

  前者操作与`\d`不同形式不一致，并且在大多数情况下它没有提供简单方法查看 用户对象。

- 完善与旧的PostgreSQL服务器版本一起执行（追溯到7.4）的`\d*`命令， 而不仅仅是当前服务器版本(Guillaume Lelarge)

- 使用`\d`显示引用已选择表的外键约束(Kenneth D'Souza)

- 在序列上使用`\d`显示列值(Euler Taveira de Oliveira)

- 添加列存储类型和其他关系选项到`\d+`显示中(Gregory Stark, Euler Taveira de Oliveira)

- 显示`\dt+`输出中关系大小(Dickson S. Guedes)

- 显示`\dT+`中`enum`类型可能值(David Fetter)

- 允许`\dC`接受通配符模式，这可以匹配涉及到投射的数据类型(Tom)

- 添加函数类型列到`\df`的输出，并且添加选项只列出函数所选类型(David Fetter)

- `\df`不隐藏使用或者返回类型`cstring`的函数(Tom)

  此前，这种函数被隐藏，因为他们大多是数据类型I/O函数，这被认为是没有意义的。 默认情况下有关隐藏系统函数的新策略使得该缺点不必要的。

#### E.89.3.8.3. pg_dump

- 添加`--no-tablespaces`选项到pg_dump/pg_dumpall/pg_restore 这样转储可以恢复到具有非匹配表空间层次的集群中(Gavin Roy)

- 从pg_dump和pg_dumpall中删除`-d`和`-D`选项(Tom)

  这些选项不应该过于频繁地与在其它PostgreSQL客户端应用程序中选择数据库名称的选项混淆。 该功能仍然可用， 但你现在必须拼写出长选项名称`--inserts`或者`--column-inserts`。

- 从pg_dump和pg_dumpall中删除`-i`/`--ignore-version`选项(Tom)

  使用此选项不会抛出一个错误，但它没有效果。 该选项被移除，因为版本检查对安全性是必要的。

- 在转储和恢复中禁用`statement_timeout`(Joshua Drake)

- 添加pg_dump/pg_dumpall选项`--lock-wait-timeout` (David Gould)

  如果在指定时间内无法获取共享锁，那么转储失败。

- 重新排序pg_dump `--data-only`输出 用来转储在引用表之前通过外键参考的表(Tom)

  当外键存在的时候，允许数据加载。如果循环引用采用一个不可能的安全排序， 发出`NOTICE`。

- 允许pg_dump, pg_dumpall和pg_restore使用指定用户(Benedek László)

- 允许pg_restore使用多个并发连接执行恢复(Andrew)

  通过选项`--jobs`来控制连接数。这仅仅支持自定义格式归档。

### E.89.3.9. 编程工具

#### E.89.3.9.1. libpq

- 当通过新函数`lo_import_with_oid()`导入大对象的时候，允许指定`OID`(Tatsuo)

- 添加"events"支持(Andrew Chernow, Merlin Moncure)

  这添加了注册回调能力来管理联系`PGconn`和`PGresult`对象的私有数据。

- 优化错误处理以允许多个错误消息的返回作为多行错误报告(Magnus)

- 采用`PQexecParams()`和相关函数为空查询返回`PGRES_EMPTY_QUERY`(Tom)

  之前返回`PGRES_COMMAND_OK`。

- 记录Windows上如何避免`WSACleanup()`的开销(Andrew Chernow)

- 不依赖于Kerberos来决定缺省数据库用户名(Magnus)

  之前，libpq的Kerberos编译将使用从任何可用的Kerberos标签作为缺省数据库用户名的主体名称， 即使连接没有使用Kerberos认证。 这被认为是不一致而且混乱的。 有或没有Kerberos同样的方式决定缺省用户名。 然而，当使用Kerberos身份验证的时候，需要注意的是数据库用户名必须匹配该标签。

#### E.89.3.9.2. libpq SSL (安全套接层)支持

- 修复SSL连接的证书验证(Magnus)

  libpq现在支持验证两种证书 和SSL连接时服务器的名称。 如果根证书不可用于验证，那么SSL连接失败。 `sslmode`参数用于启用证书验证，并设置检查水平。 默认值还没有做任何验证，允许连接到不需要客户端根证书的SSL启用服务器中。 ????????

- 支持通配符服务器证书(Magnus)

  如果证书CN以`*`开头，它将被视为一个通配符，当匹配hostname的时候， 允许多个服务器同一证书的使用。

- 允许文件位置指定客户端证书(Mark Woodward, Alvaro, Magnus)

- 增加`PQinitOpenSSL`函数允许更大控制OpenSSL/libcrypto初始化(Andrew Chernow)

- 当没有数据库连接保持打开的时候， 使用libpq注销它的OpenSSL回调(Bruce, Magnus, Russell Smith)

  卸载libpq库的应用程序是必须的，否则无效的OpenSSL回调将保持不变。

#### E.89.3.9.3. ecpg

- 添加信息本地化支持(Euler Taveira de Oliveira)

- 从服务器解析器自动生成ecpg解析器(Michael)

  之前ecpg解析器手动维护。

#### E.89.3.9.4. 服务器编程接口(SPI)

- 添加超出行参数的单一使用规划(Tom)

- 添加新的`SPI_OK_REWRITTEN`返回`SPI_execute()`代码(Heikki)

  当命令被重写为命令的另一种类型的时候使用它。

- 从`executor/spi.h`中删除不必要内含物(Tom)

  如果它们依赖`spi.h`包含它们需要的东西， SPI使用模块可能需要添加一些`#include`行。

### E.89.3.10. 编译选项

- 使用Autoconf 2.61更新编译系统(Peter)

- 源码编译需要GNU bison(Peter)

  这个有效的使用了许多年，但是现在没有基础设施声明支持其它解析工具。

- 添加pg_config `--htmldir`选项(Peter)

- 通过内部服务器传递`float4`值(Zoltan Boszormenyi)

  添加configure选项`--disable-float4-byval`以使用旧操作。 使用旧式（版本0）的外部C函数调用约定 并通过这个改变打破传递或者返回`float4`值， 如果你具有这样的函数，并且不想更新它们， 所以你可能需要configure选项。

- 通过64位平台上内部服务器传递`float8`, `int8`和相关数据类型值(Zoltan Boszormenyi)

  添加configure选项`--disable-float8-byval`用来使用旧的操作。如上所述， 该变化可能打破旧形式外部C函数。

- 添加配置选项`--with-segsize`, `--with-blocksize`, `--with-wal-blocksize`, `--with-wal-segsize` (Zdenek Kotala, Tom)

  这简化了编译时控制之前只能通过编辑`pg_config_manual.h`来改变的几个常数。

- 允许在Solaris 2.5上线程编译(Bruce)

- 在Solaris上使用系统的`getopt_long()`(Zdenek Kotala, Tom)

  这使得选项处理与Solaris用户期望的更加一致。

- 添加Linux上Sun Studio编译器支持(Julius Stroffek)

- 追加主版本号到后端gettext域，而`soname`主版本号 到库的gettext域(Peter)

  这简化了多个版本并行安装。

- 允许支持gcov代码覆盖测试(Michelle Caisse)

- 允许在Mingw和Cygwin上树外编译(Richard Evans)

- 修复作为交叉编译源平台Mingw的使用(Peter)

### E.89.3.11. 源代码

- 支持64位时区数据文件(Heikki)

  这添加支持超出2038年夏令时(DST)计算。

- 不赞成平台的`time_t`数据类型的使用(Tom)

  有些平台已经迁移到64位`time_t`， 有些不能，Windows无法下定决心它在做什么。 定义`pg_time_t`和`time_t`具有相同的含义， 但始终是64位（除非该平台不具有64位整数类型）， 并且使用所有模块API中的类型和磁盘上的数据格式。

- 当交叉编译的时候，修复时区数据库处理中错误(Richard Evans)

- 在一个步骤中连接后端对象文件，而不是一个阶段中(Peter)

- 完善gettext支持以便复数的更好转化(Peter)

- 添加PL语言的信息翻译支持(Alvaro, Peter)

- 添加更多DTrace探测(Robert Lor)

- 启用Mac OS X Leopard以及其它非Solaris平台上的DTrace支持(Robert Lor)

- 简化并且标准化C字符串和`text`数据之间转换，出于此目的提供普通函数(Brendan Jurd, Tom)

- 清理`include/catalog/`头文件以致于前端程序包含它们而不包含`postgres.h`(Zdenek Kotala)

- 采取`name`字符对齐，并且抑制索引中`name`项的零填充(Tom)

- 如果动态加载代码执行`exit()`更好恢复(Tom)

- 添加连接让插件监控执行者(Itagaki Takahiro)

- 添加连接允许规划器的统计查找操作被覆盖(Simon Riggs)

- 为自定义共享内存需求添加`shmem_startup_hook()`(Tom)

- 使用`amgetbitmap`替换索引访问方法`amgetmulti`切入点， 并且为`amgettuple`扩展API可以支持操作符丢失的运行时计算(Heikki, Tom, Teodor)

  为GIN和GiST opclass `consistent`函数的API已经被扩展。

- 添加支持GIN索引中局部匹配搜索(Teodor Sigaev, Oleg Bartunov)

- 使用布尔`relhastriggers`替换`pg_class`列`reltriggers`(Simon)

  同时删除未使用的`pg_class`列 `relukeys`, `relfkeys`和 `relrefs`。

- 添加`relistemp`列到`pg_class`解除临时表识别(Tom)

- 将平台FAQ放到主文档中(Peter)

- 防止解析器输入文件编译冲突(Peter)

- 添加`KOI8U` (Ukrainian)编码(Peter)

- 添加Japanese信息转化(Japan PostgreSQL用户组)

  这用于作为单一项目被维护。

- 当在MSVC编译系统上设置`LC_MESSAGES`的时候， 修复该问题(Hiroshi Inoue, Hiroshi Saito, Magnus)

### E.89.3.12. Contrib

- 添加`contrib/auto_explain`在查询超过指定时间上自动运行`EXPLAIN`(Itagaki Takahiro, Tom)

- 添加`contrib/btree_gin`允许GIN索引处理更多数据类型(Oleg, Teodor)

- 添加`contrib/citext`提供不区分大小写，多字节文本数据类型(David Wheeler)

- 为语句执行统计的服务器范围追踪添加`contrib/pg_stat_statements`(Itagaki Takahiro)

- 添加时间和查询模式选项到`contrib/pgbench`(Itagaki Takahiro)

- `contrib/pgbench`使用表名`pgbench_accounts`, `pgbench_branches`, `pgbench_history`和`pgbench_tellers`, 而不仅仅`accounts`, `branches`, `history`和`tellers` (Tom)

  通过运行pgbench以降低意外破坏真实数据的风险。

- 修复`contrib/pgstattuple`处理表和超过20亿页面的索引(Tatsuhito Kasahara)

- 在`contrib/fuzzystrmatch`中，添加Levenshtein字符串距离函数版本允许 用户声明插入，删除和替换成本(Volkan Yazici)

- 采用`contrib/ltree`支持多字节编码(laser)

- 启用`contrib/dblink`使用存储在SQL/MED目录中的连接信息(Joe Conway)

- 完善来自远程服务器错误的`contrib/dblink`的报告(Joe Conway)

- 使用`contrib/dblink`设置`client_encoding`以 匹配本地数据库的编码(Joe Conway)

  当与使用不同编码的远程数据库通信时，这可以避免编码问题。

- 确保`contrib/dblink`使用用户提供的密码， 并且不是意外地采取服务器的`.pgpass`文件(Joe Conway)

  有一个小的安全增强功能。

- 添加`fsm_page_contents()`到`contrib/pageinspect` (Heikki)

- 修改`get_raw_page()`支持自由空间映射(`*_fsm`)文件。 同时更新`contrib/pg_freespacemap`。

- 添加支持多字节编码到`contrib/pg_trgm`(Teodor)

- 改写`contrib/intagg`使用新的函数`array_agg()`和`unnest()`(Tom)

- 故障转移之前使用`contrib/pg_standby`回收所有可用WAL(Fujii Masao, Simon, Heikki)

  为了使这项工作安全，您现在需要设置`recovery.conf`中新的 `recovery_end_command`选项用来清理故障转移后的触发器文件。 pg_standby将不再删除触发器文件本身。

- `contrib/pg_standby`的`-l`选项现在是一个空操作， 因为它使用符号链接不安全(Simon)

上一页 | 起始页 | 下一页
版本8.4.1 | 上一级 | 发布8.3.23