E.53. 发布8.4

发布日期: 2009-07-01

E.53.1. 概要

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

  • 窗口函数

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

  • 函数缺省和可变参数

  • 并行恢复

  • 列权限

  • 每个数据库本地设置

  • 改进的哈希索引

  • 改进EXISTSNOT EXISTS查询连接性能

  • 容易使用热备份

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

  • 可见映射(大大降低了缓慢变化表的清理开销)

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

  • 支持用户认证的SSL证书

  • 每个函数运行时统计

  • psql中函数简单编辑

  • 新的contrib模块:pg_stat_statements, auto_explain, citext, btree_gin

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

E.53.2. 迁移到版本8.4

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

观察下面的不兼容:

E.53.2.1. 普遍的

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

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

  • 删除ipcclean实用命令(Bruce)

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

E.53.2.2. 服务器设置

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

  • max_prepared_transactions改变缺省设置为零(以前为5)(Tom)

  • 使得debug_print_parse, debug_print_rewritten, 和debug_print_planLOG消息级别输出,而不是像从前的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_realmkrb_server_hostname; 而是在pg_hba.conf中设置(Magnus)

  • pg_hba.conf中有显著变化,如下所述。

E.53.2.3. 查询

  • 改变TRUNCATELOCK以适用于指定表的子表(Peter)

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

  • SELECT DISTINCTUNION/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.53.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.53.2.4.1. 时间函数和操作符

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

  • 提高timestampinterval输出中小数秒处理的一致性(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.53.3. 变化

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

E.53.3.1. 性能

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

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

  • 允许SELECT DISTINCTUNION/INTERSECT/EXCEPT可以使用哈希(Tom)

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

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

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

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

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

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

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

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

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

  • 10100增加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.53.3.2. 服务器

E.53.3.2.1. 设置

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

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

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

E.53.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.53.3.2.3. pg_hba.conf

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

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

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

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

    之前usermap只支持ident认证。

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

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

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

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

  • 允许在pg_hba.conf中指定krb5, gssapisspi 字段和krb5主机设置(Magnus)

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

  • krb5gssapisspi方法添加include_realm参数(Magnus)

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

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

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

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

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

E.53.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.53.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_sizewal_segment_size (Bernd Helmle)

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

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

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

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

E.53.3.3. 查询

  • 添加支持WINDOW函数(Hitoshi Harada)

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

  • 添加TABLE命令(Peter)

    TABLE tablenameSELECT * 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功能, 但这种变化提供了一个标准化的,面向未来系统, 用于管理类似模块dblinkplproxy连接信息。

  • 当引用的模式,函数,操作符或者操作符类被修改的时候,使缓存计划无效(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)

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

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

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

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

E.53.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.53.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.53.3.3.3. LIMIT/OFFSET

  • 允许LIMITOFFSET中子选择(Tom)

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

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

E.53.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.53.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.53.3.4.2. 数据库操作

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

  • 每个数据库设置采用LC_COLLATELC_CTYPE(Radek Strnad, Heikki)

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

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

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

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

E.53.3.5. 实用操作

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

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

E.53.3.5.1. 索引

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

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

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

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

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

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

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

E.53.3.5.2. 全文索引

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

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

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

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

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

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

E.53.3.5.3. VACUUM

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

    通过VACUUM发现的自由空间在*_fsm文件中被记录, 而不是在一个固定大小的共享存储器区域中。 max_fsm_pagesmax_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.53.3.6. 数据类型

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

  • 完善NUMERIC划分精度(Tom)

  • int2int8添加基础算术操作符(Tom)

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

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

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

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

E.53.3.6.1. 时间数据类型

  • 拒绝年0 BC以及0000000(Tom)

    以前这些被解释为1 BC。(注意:年000仍然假定为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输入的处理。

  • timestampinterval输入中优化小数秒处理的一致性(Ron Mayer)

E.53.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.53.3.6.3. 宽值存储(TOAST)

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

  • 使用TOAST压缩之前要求最低25%的空间节省,(之前20%为小值并且任何存储为大值)(Greg)

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

E.53.3.7. 函数

  • setseed()文件允许从-11的值(不只是01), 并且执行有效范围(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()timestamptimestamptz版本(Hitoshi Harada)

E.53.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_valreset_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_intois_updatable操作是一致的(Peter)

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

    这些列为date列显示为零并且timetimestamp以及 没有声明精度的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.53.3.7.2. 函数创建

  • 支持可变参数的函数(带有参数可变数量的函数)(Pavel Stehule)

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

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

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

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

E.53.3.7.3. PL/pgSQL服务器端语言

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

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

  • 支持RETURN QUERY EXECUTE (Pavel Stehule)

  • 优化RAISE命令(Pavel Stehule)

    • 支持DETAILHINT字段

    • 支持SQLSTATE错误代码规范

    • 支持异常名字参数

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

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

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

  • 支持CASE语句(Pavel Stehule)

  • 使用RETURN QUERY设置特殊的FOUNDGET DIAGNOSTICS ROW_COUNT变量(Pavel Stehule)

  • 使用FETCHMOVE设置 GET DIAGNOSTICS ROW_COUNT变量(Andrew Gierth)

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

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

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

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

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

E.53.3.8. 客户端应用

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

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

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

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

E.53.3.8.1. psql

  • 删除详细的启动标志,目前建议help(Joshua Drake)

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

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

  • 允许\pset中布尔值的所有支持的拼写,而不仅仅onoff (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.53.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.53.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.53.3.9. 编程工具

E.53.3.9.1. libpq

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

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

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

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

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

    之前返回PGRES_COMMAND_OK

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

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

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

E.53.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.53.3.9.3. ecpg

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

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

    之前ecpg解析器手动维护。

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

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

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

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

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

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

E.53.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.53.3.11. 源代码

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

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

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

    有些平台已经迁移到64位time_t, 有些不能,Windows无法下定决心它在做什么。 定义pg_time_ttime_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_classreltriggers(Simon)

    同时删除未使用的pg_classrelukeys, relfkeysrelrefs

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

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

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

  • 添加KOI8U (Ukrainian)编码(Peter)

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

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

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

E.53.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_historypgbench_tellers, 而不仅仅accounts, branches, historytellers (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)