E.131. 版本 9.0

E.131.1. 概述
E.131.2. 迁移到版本 9.0
E.131.3. 修改列表

发布日期:. 2010-09-20

E.131.1. 概述

这个PostgreSQL版本添加了请求多年的特性,例如易于使用的复制, 大规模权限改变设施,和匿名代码块。而以前的主版本在这些范围是保守的, 这个版本显示了一个大胆的新的渴望提供的设施,新的和现有的PostgreSQL 用户将包含在内。这些都做到了,只是有少许的不兼容。主要的增强功能包括:

  • 内建复制基于日志传送。这个发展包括两个特点:流复制,允许持续归档(WAL) 文件,在网络连接上流出到备用服务器;热备份,允许持续归档备用服务器以执行只读的查询。 有效效应是支持一个主服务器带有多个只读从服务器。

  • 更简单的数据库对象权限管理。GRANT/REVOKE IN SCHEMA支持在现有的对象上的大量的权限更改,而 ALTER DEFAULT PRIVILEGES允许控制将来创建的对象的权限。 大对象(BLOBs)现在也支持权限管理。

  • 明显提高存储过程支持。DO 语句支持ad-hoc或anonymous代码块。函数现在可以用命名的参数来调用。 PL/pgSQL现在是缺省安装的, PL/PerlPL/Python 已经从几个方面增强了,包括对Python3的支持。

  • 全面支持64位Windows

  • 更高级的报告查询,包括附加的窗口选项(PRECEDINGFOLLOWING) 和控制值以什么顺序供应给聚合函数的能力。

  • 新增触发特征,包括SQL标准兼容每字段触发器 和条件触发器执行。

  • 可延期的唯一约束。 大量的更新到唯一键现在不带有欺骗是可能的了。

  • 排除约束。 这些提供了一个唯一约束的广义版本,允许执行复杂的条件。

  • 新增和加强的安全特性,包括RADIUS认证,LDAP认证改进,和一个新的贡献模块 passwordcheck测试密码强度。

  • 新增高性能实现LISTEN/ NOTIFY特性。 等待发生的事件现在存储在一个基于内存的队列中,而不是一个表中。 还有,payload字符串可以被每个事件发送,而不是和以前一样只能是一个事件名传送。

  • 新增VACUUM FULL的实现。 这个命令现在改写全部的表和索引,而不是移动个别的行到紧密空间。 它实质上在大多数情况下更快,并且不再导致索引膨胀。

  • 新增贡献模块pg_upgrade, 支持从8.3或8.4到9.0的就地升级。

  • 对于特定类型的查询的多种性能增强,包括删除不需要的连接。 这帮助优化了一些自动生成的查询,比如由对象关系映射(ORMs)产生的那些。

  • EXPLAIN增强。 该输出现在可以用在JSON, XML, 或YAML格式中, 并且包括缓冲区利用和以前不可用的其他数据。

  • hstore增强,包括新功能和更大的数据容量。

以上的条目在下面的章节中有更详细的介绍。

E.131.2. 迁移到版本 9.0

使用pg_dump或使用pg_upgrade 的转储/恢复,对于那些想要从任何以前的版本迁移数据的人来说是必须的。

版本9.0包含若干有选择的突破向后兼容的改变,为了支持新特性和编码质量改善。 特别的,使得PL/pgSQL、Point-In-Time Recovery (PITR)、或Warm Standby广泛应用的用户, 应该测试他们的应用,因为在这些地方有轻微的用户可见的改变。 观察下面的不兼容:

E.131.2.1. 服务器设置

  • 删除服务器参数add_missing_from,该参数缺省为off已经很多年了 (Tom Lane)

  • 删除服务器参数regex_flavor,该参数缺省为 advanced已经很多年了 (Tom Lane)

  • archive_mode 现在只影响archive_command; 一个新的设置,wal_level, 影响预写式日志的内容 (Heikki Linnakangas)

  • log_temp_files 现在使用缺省文件尺寸单位kilobytes (Robert Haas)

E.131.2.2. 查询

  • 当查询一个parent table时, 不要在作为查询一部分扫描的子表上做任何单独的权限检查 (Peter Eisentraut)

    SQL标准声明这个行为,并且它在实际上比以前在每个子表上和父表一样检查权限的行为更加方便。

E.131.2.3. 数据类型

  • bytea输出现在缺省以十六进制格式显示 (Peter Eisentraut)

    服务器参数bytea_output 可以用来选择传统的输出格式,如果为了兼容需要。

  • 数组输入现在只考虑纯ASCII空白字符潜在的忽略;它将永不忽略非ASCII字符, 即使它们根据某些语言环境是空白 (Tom Lane)

    这避免了根据服务器本地设置,数组值会被不同的解释的某些极端情况。

  • 改善标准兼容SIMILAR TO 模式和SQL风格substring()模式 (Tom Lane)

    这包括将?{...}处理为模式元字符, 而它们以前只是简单的文字字符;这相当于在SQL:2008中添加的新特性。 还有,^$现在视为简单的文字字符; 以前它们视为元字符,好像模式遵从POSIX而不是SQL规则。 还有,SQL标准的substring(),使用圆括号以嵌套, 不再干扰子字符串的捕获。还有,括号表达式(字符类)的处理现在更加标准兼容了。

  • 根据SQL标准,在为位字符串的3参数substring() 中拒绝负的长度值 (Tom Lane)

  • 当减少分数秒精度时使date_trunc截断而不是圆整 (Tom Lane)

    代码对于基于整型的日期/时间总是这样动作。现在基于浮点数的日期/时间行为相似。

E.131.2.4. 对象重命名

  • 当一个子表从多个无关的父表中继承相同的字段时,在RENAME 期间严格执行字段名的一致性 (KaiGai Kohei)

  • 当基础表字段重命名时不再自动重命名索引和索引字段 (Tom Lane)

    超级管理员仍然可以手动重命名这样的索引和字段。这个改变将需要更新JDBC驱动, 和可能的其他驱动,以便唯一索引在重命名之后正确的重组。

  • CREATE OR REPLACE FUNCTION可以不再改变函数参数声明的名字 (Pavel Stehule)

    为了避免在命名的参数调用中创建歧义,不再允许在一个现有函数的声明中改变输入参数的别名 (尽管名字仍然可以分配给以前未命名的参数)。要那样做,你现在必须DROP 并重新创建该函数。

E.131.2.5. PL/pgSQL

  • 如果变量名与查询中使用的字段名冲突,PL/pgSQL现在抛出一个错误 (Tom Lane)

    以前的行为是绑定歧义名为PL/pgSQL变量优先于查询字段,这经常导致令人吃惊的错误行为。 抛出一个错误允许简单的检测引起歧义的情景。虽然建议函数遇到这种类型的错误时修改为移除该冲突, 但是如果需要,旧的行为可以被修复,通过配置参数plpgsql.variable_conflict, 或通过每个函数的选项#variable_conflict

  • PL/pgSQL不再允许匹配特定SQL保留字的变量名 (Tom Lane)

    这是校正PL/pgSQL分析器更密切的匹配内核SQL分析器的一个后果。如果需要, 变量名可以用双引号引起来以避免这种限制。

  • PL/pgSQL现在要求复合结果的字段和基础类型一样匹配预期的类型修饰符 (Pavel Stehule, Tom Lane)

    例如,如果结果类型的字段声明为NUMERIC(30,2),那么它不再适用于在该字段中返回一个 其他精度的NUMERIC。以前的版本忽略了检查类型修饰符, 并且因此允许结果行实际上并不符合声明的限制。

  • PL/pgSQL现在对待选择到复合字段更加一致 (Tom Lane)

    以前,像SELECT ... INTO rec.fld FROM ... 这样的声明被当做是标量赋值,即使记录字段fld是复合类型。 现在,它被当做记录赋值,当INTO目标是一个复合类型的规则变量时也是一样的。 所以被赋予到字段的子字段的值应该被写为SELECT列表的单独的列, 不是在以前版本中ROW(...)构造那样。

    如果你需要一个在9.0和以前版本中都能运行的方式来做这点,你可以像这样来写: rec.fld := ROW(...) FROM ...

  • 删除PL/pgSQL的RENAME声明 (Tom Lane)

    取代RENAME,使用ALIAS, 现在可以为任意变量创建一个别名,不只是和以前一样的美元符号参数名称(如$1)。

E.131.2.6. 其他的不兼容

  • 不赞成使用=>作为一个操作符名称 (Robert Haas)

    将来版本的PostgreSQL可能完全拒绝这种操作符名, 为了支持命名函数参数的SQL标准符号。目前,仍然是允许的, 但是定义这样的一个操作符时会发出警告。

  • 删除对没有64位整数数据类型工作的平台的支持 (Tom Lane)

    认为所有仍然支持的平台有64位整数数据类型工作。

E.131.3. 修改列表

版本9.0有一个前所未有的新主版本特性的数量,超过200个增强、 改善、新增命令、新增函数和其他修改。

E.131.3.1. 服务器

E.131.3.1.1. 连续存档和流复制

PostgreSQL的现有备用服务器性能已经扩展为支持在备用服务器上只读查询和大大减少主从服务器之间的延迟。 对于很多用户,这将是流复制的一个有用和低管理的形式,要么为了高可用性,要么为了水平伸缩性。

  • 允许备用服务器接受只读查询 (Simon Riggs, Heikki Linnakangas)

    这个特性称为热备份。有新的postgresql.confrecovery.conf 设置控制这个特性,还有大量的文档

  • 允许预写式日志(WAL)数据流到备用服务器 (Fujii Masao, Heikki Linnakangas)

    这个特性称为流复制。以前的WAL数据只能以整个WAL 文件(通常每个16百万字节)为基本单位被送到备用服务器。 流复制消除低效,并且允许在主服务器上的更新以非常小的延迟传送到备用服务器上。 有新的postgresql.confrecovery.conf设置控制这个特性, 还有大量的文档

  • 添加pg_last_xlog_receive_location()pg_last_xlog_replay_location(),可以用来监控备用服务器的 WAL活动 (Simon Riggs, Fujii Masao, Heikki Linnakangas)

E.131.3.1.2. 性能
  • 允许通过ALTER TABLESPACE ... SET/RESET 为连续的和随机的页面成本估算(seq_page_cost/random_page_cost) 设置每个表空间的值 (Robert Haas)

  • 提高性能和连接查询中的EvalPlanQual再核查 (Tom Lane)

    包含连接的UPDATE, DELETE, 和 SELECT FOR UPDATE/SHARE 查询现在在遇到最近更新的行时表现的更好。

  • 当表早些时候在同一个事务中被创建或截断时,改善 TRUNCATE的性能 (Tom Lane)

  • 提高找到继承子表的性能 (Tom Lane)

E.131.3.1.3. 优化
  • 删除不需要的外连接 (Robert Haas)

    内侧的外连接是唯一的,并且不被连接的上级引用,因此现在删除了。 这将加速许多自动生成的查询,如那些通过对象关系映射(ORMs)创建的查询。

  • 允许IS NOT NULL限制使用索引 (Tom Lane)

    这对于在包含许多空值的索引中发现MAX()/MIN() 值是尤其有用的。

  • 改善优化器为DISTINCT选择何时使用物化节点,何时使用排序和散列 (Tom Lane)

  • 改善优化器为包含boolean <>操作符的表达式的等价性检测 (Tom Lane)

E.131.3.1.4. GEQO
  • 每次GEQO规划一个查询时使用相同的随机种子 (Andres Freund)

    Genetic Query Optimizer (GEQO)仍然选择随机规划,它现在总是为相同的查询选择相同的随机规划, 从而给出更加一致的性能。可以修改geqo_seed 试验可选择的规划。

  • 改善GEQO规划选择 (Tom Lane)

    这避免了少有的错误failed to make a valid plan, 并且应该提升了规划速度。

E.131.3.1.5. 优化器统计信息
  • 改善ANALYZE以支持继承树统计信息 (Tom Lane)

    这对于分区表特别有用。不过,当子表改变时autovacuum目前还没有自动重新分析父表。

  • 当需要重新分析时,改善autovacuum 的检测 (Tom Lane)

  • 改善优化器对于大于/小于比较的估计 (Tom Lane)

    当查阅对于大于/小于比较的统计信息时,如果比较值是直方图的第一个或最后一个, 使用一个索引(如果可用)抓全当前实际字段的最小或最大值。 这大大的提高了估算接近数据范围结尾的比较值的精确度, 尤其是当范围由于新数据的添加而持续变化时。

  • 允许不同值数量统计的设置使用ALTER TABLE (Robert Haas)

    这允许用户重载一个字段的不同值的估计数量或百分比。这个统计通常通过ANALYZE 计算,但是估计可能会差些,尤其是在有非常多的行的表上。

E.131.3.1.6. 认证
  • 添加对RADIUS (Remote Authentication Dial In User Service)认证的支持 (Magnus Hagander)

  • 允许LDAP(Lightweight Directory Access Protocol) 认证在search/bind模式下操作 (Robert Fleming, Magnus Hagander)

    这允许用户先查找,然后系统使用DN (Distinguished Name) 返回给那个用户。

  • 添加samehostsamenet指定到pg_hba.conf (Stef Walter)

    这些分别匹配服务器的IP地址和子网地址。

  • 传递信任的SSL根证书名字到客户端,这样客户端可以返回一个合适的客户端证书 (Craig Ringer)

E.131.3.1.7. 监控
  • 添加客户端设置应用名 的能力,在pg_stat_activity中显示 (Dave Page)

    这允许管理员表现数据流量和通过源应用寻找故障问题。

  • 添加SQLSTATE选项(%e)到 log_line_prefix (Guillaume Smet)

    这允许用户通过错误代码数量编制错误和消息的统计数据。

  • UTF16编码写入Windows事件记录 (Itagaki Takahiro)

    现在在Windows上的PostgreSQL记录消息支持多种语言。

E.131.3.1.8. 统计计数器
E.131.3.1.9. 服务器设置
  • 允许配置参数的设置基于database/role combinations (Alvaro Herrera)

    以前,只有每个数据库和每个角色的设置是可能的,组合是不行的。 所有角色和数据库设置现在存储在新的pg_db_role_setting 系统目录中。新的psql命令\drds显示了这些设置。 遗留系统视图pg_roles, pg_shadow, 和 pg_user 不显示组合设置,并且因此不再完全的代表一个用户或数据库的配置。

  • 添加服务器参数bonjour, 控制启用Bonjour的服务器是否通过Bonjour通知它自己 (Tom Lane)

    缺省为off,意味着它不做通知。 这允许包装程序分配启用Bonjour的建立时不用担心个别用户可能不想要这个特性。

  • 添加服务器参数enable_material, 控制在优化器中物化节点的使用 (Robert Haas)

    缺省为on。为off时,优化器将不是纯粹的为性能原因添加物化节点, 尽管他们在为了正确性的需要时仍然被使用。

  • 修改服务器参数log_temp_files 使用千字节为缺省文件大小单位 (Robert Haas)

    以前,如果没有声明单位,这种设置解释为字节计。

  • postgresql.conf重新加载时日志参数值的变化 (Peter Eisentraut)

    这使得管理员和安保员审计数据库设置的修改,并且也非常方便检查 postgresql.conf编辑的效果。

  • 正确执行自定义服务器参数的超级用户权限 (Tom Lane)

    非超级用户不能再为服务器目前不知道的参数发出ALTER ROLE/DATABASE SET 这允许服务器正确的检查仅超级用户的参数只有通过超级用户设置。以前, 允许SET并且在会话开始的时候忽略, 使得仅超级用户的自定义参数比其应该有的作用要小的多。

E.131.3.2. 查询

  • 在应用LIMIT之后执行SELECT FOR UPDATE/SHARE处理, 这样返回的行数总是可预见的 (Tom Lane)

    以前,并发事务所做的改变会导致SELECT FOR UPDATE 返回的行数出乎意料的少于它的LIMIT声明的行数。 FOR UPDATEORDER BY的组合也会产生令人惊讶的结果, 但是可以通过在子句中放置FOR UPDATE来纠正。

  • 允许传统的和SQL标准的LIMIT/OFFSET 语法混合 (Tom Lane)

  • 窗口函数中扩展支持的框架选项 (Hitoshi Harada)

    框架现在可以以CURRENT ROW开始,并且现在支持 ROWS n PRECEDING/FOLLOWING选项。

  • 使得SELECT INTOCREATE TABLE AS 在它们的命令标签中返回行计数到客户端 (Boszormenyi Zoltan)

    这可以节省到客户端的整个往返,允许结果计数和页码的计算不带有附加的COUNT查询。

E.131.3.2.1. Unicode 字符串
  • U& 字符串和标识符中支持Unicode代理对(段16位表现) (Peter Eisentraut)

  • E'...' 字符串中支持Unicode转义 (Marko Kreen)

E.131.3.3. 对象操作

  • 通过定义冲刷到磁盘加速CREATE DATABASE (Andres Freund, Greg Stark)

  • 只允许注释在表、视图和复合类型的字段上, 不允许在其他关系类型如索引和TOAST表上 (Tom Lane)

  • 允许枚举类型 的创建不包含值 (Bruce Momjian)

  • 使有存储类型MAIN的字段的值保留在主堆页上, 除了不适合在一个页面上的行 (Kevin Grittner)

    以前,MAIN值被迫离开到TOAST表, 直到行的大小小于页面大小的四分之一。

E.131.3.3.1. ALTER TABLE
  • ALTER TABLE DROP COLUMNALTER TABLE DROP CONSTRAINT 实现了IF EXISTS (Andres Freund)

  • 允许ALTER TABLE命令重写表以跳过WAL记录 (Itagaki Takahiro)

    这样的操作要么生成一个该表的新的拷贝,要么回滚,所以可以跳过WAL归档, 除非运行在连续归档模式。这样减少了I/O开支,并且提高了性能。

  • 修复不是表的所有者执行ALTER TABLE table ADD COLUMN col serial时的失败 (Tom Lane)

E.131.3.3.2. CREATE TABLE
  • 添加在CREATE TABLE ... LIKE命令中拷贝COMMENTSSTORAGE字符串的支持 (Itagaki Takahiro)

  • 添加拷贝CREATE TABLE ... LIKE命令中所有属性的快捷方式 (Itagaki Takahiro)

  • 添加SQL标准的CREATE TABLE ... OF type命令 (Peter Eisentraut)

    这允许表的创建匹配一个现有的复合类型。附加约束和默认值可以在该命令中指定。

E.131.3.3.3. 约束
  • 添加可推迟的唯一约束 (Dean Rasheed)

    这允许大量的更新,如UPDATE tab SET col = col + 1, 可靠的运行在有唯一索引或标记为主键的字段上。如果约束被指定为DEFERRABLE, 那么它将在语句的最后被检查,而不是在每行被更新之后。该约束检查也可以被推迟到当前事务的结尾, 允许这样的更新在多个SQL命令中传播。

  • 增加了排除约束 (Jeff Davis)

    排除约束通过允许任意的比较操作符(不只是相等)概括唯一约束。 它们是用CREATE TABLE CONSTRAINT ... EXCLUDE子句创建的。 排除约束最常见的使用是声明字段记录不能重复,而不只是简单的不能相等。 这对于时间阶段和其他范围还有数组是有用的。 这个特性为许多日程、时间管理和科学应用加强了数据完整性的检查。

  • 改善唯一约束违反的错误消息以报告导致该失败的值 (Itagaki Takahiro)

    例如,唯一约束违反现在可以报告Key (x)=(2) already exists

E.131.3.3.4. 对象权限
  • 添加使用新的GRANT/REVOKE IN SCHEMA 子句在整个模式中改变大量权限的能力 (Petr Jelinek)

    这简化了对象权限的管理,并且使得应用数据安全更容易的利用数据库角色。

  • 添加ALTER DEFAULT PRIVILEGES 命令以控制稍后创建的对象的权限 (Petr Jelinek)

    这大大的简化了复杂数据库应用中对象权限的分配。可以为表、视图、序列和函数设置缺省权限。 缺省可以在每个模式的基础上或者数据库范围内分配。

  • 添加用GRANT/REVOKE控制大对象(BLOB)权限的能力 (KaiGai Kohei)

    以前,任意数据库用户可以读取或者修改任何大对象。 现在可以赋予和撤销每个大对象的读取和写入权限, 并且追踪大对象的所有者关系。

E.131.3.4. 实用操作

  • 使得LISTEN/ NOTIFY 存储在一个内存序列中等待事件,而不是在一个系统表中 (Joachim Wieland)

    这在保留事务支持和保证交付的现有特性时大幅度的提升了性能。

  • 允许NOTIFY 传送一个可选的payload字符串到监听器 (Joachim Wieland)

    这大大的提升了LISTEN/NOTIFY作为一个通用的事件队列系统的有用性。

  • 允许在所有的数据库系统目录上CLUSTER (Tom Lane)

    共享的目录仍然不能集群。

E.131.3.4.1. COPY
  • 接受COPY ... CSV FORCE QUOTE * (Itagaki Takahiro)

    现在*FORCE QUOTE子句中可以用作所有字段的简写。

  • 添加新的COPY语法,允许选项在圆括号内部指定 (Robert Haas, Emmanuel Cecchet)

    这允许未来的COPY选项有更大的灵活性。仍然支持旧的语法, 但是只对已经存在的选项。

E.131.3.4.2. EXPLAIN
  • 允许EXPLAINXMLJSONYAML 格式输出(Robert Haas, Greg Sabino Mullane)

    新的输出格式是容易机器可读的,支持分析EXPLAIN输出的新工具的发展。

  • 添加新的BUFFERS选项报告EXPLAIN ANALYZE 期间查询缓冲区的使用 (Itagaki Takahiro)

    这允许为单个查询更好的查询分析。缓冲区的使用不再在 log_statement_stats 和相关设置的输出中报告。

  • 添加散列使用信息到EXPLAIN输出 (Robert Haas)

  • 添加新的EXPLAIN语法,允许选项在圆括号内部指定 (Robert Haas)

    这允许未来的EXPLAIN选项有更大的灵活性。仍然支持旧的语法, 但是只对已经存在的选项。

E.131.3.4.3. VACUUM
  • 改变VACUUM FULL重写整个表和重建它的索引, 而不是围绕紧致的空间移动个别的行 (Itagaki Takahiro, Tom Lane)

    以前的方法通常较慢,并且导致索引膨胀。请注意, 新的方法将在VACUUM FULL期间瞬间使用更多磁盘空间; 可能是正常被该表和它的索引占用的空间的两倍。

  • 添加新的VACUUM语法,允许选项在圆括号内部指定 (Itagaki Takahiro)

    这允许未来的VACUUM选项有更大的灵活性。仍然支持旧的语法, 但是只对已经存在的选项。

E.131.3.4.4. 索引
  • 允许索引在CREATE INDEX 中通过省略索引名自动命名 (Tom Lane)

  • 缺省的,多字段索引现在以所有它们的字段命名; 索引表达式字段现在基于它们的表达式命名 (Tom Lane)

  • 重建共享系统目录索引现在是完全事务性并且崩溃安全了 (Tom Lane)

    以前,重建共享索引只允许在单机模式,并且在操作期间崩溃会使索引在一个比之前更糟糕的状态。

  • GiST添加point_ops运算符类 (Teodor Sigaev)

    这个特性许可GiST索引point字段。 该索引可以用于查询的几个类型,如point <@ polygon (点在多边形中)。这应该使得许多PostGIS查询快很多。

  • GIN索引创建使用红黑二叉树 (Teodor Sigaev)

    红黑树是自动平衡的。避免了非随机的输入顺序情况下的减速。

E.131.3.5. 数据类型

  • 允许bytea 值以十六进制符号书写 (Peter Eisentraut)

    服务器参数bytea_output 控制十六进制还是传统格式用于bytea输出。当连接到 PostgreSQL 9.0或更新的服务器时,Libpq的 PQescapeByteaConn()函数自动使用十六进制格式。 不过,9.0以前的libpq版本将不能为更新的服务器处理十六进制格式。

    新的十六进制格式将直接兼容更多使用二进制数据的应用,允许它们存储和检索, 而不用额外的转换。它比传统的格式的读取和写入也要快得多。

  • 允许服务器参数extra_float_digits 增加到3 (Tom Lane)

    以前extra_float_digits的最大值设置是2。 在某些情况下,需要3位数准确的转储和恢复float4值。 pg_dump现在在从允许设置为3的服务器转储时将使用3的设置。

  • 加强int2vector值的输入检查 (Caleb Welton)

E.131.3.5.1. 全文检索
  • 同义词字典中添加前缀支持 (Teodor Sigaev)

  • 添加过滤字典 (Teodor Sigaev)

    过滤字典允许符号被修改后传送到随后的字典。

  • 在邮件地址符号中允许下划线 (Teodor Sigaev)

  • 为解析URL符号使用更符合标准的规则 (Tom Lane)

E.131.3.6. 函数

  • 允许函数调用提供参数名,并且匹配它们到函数定义中命名的参数 (Pavel Stehule)

    例如,如果一个函数定义为接受参数ab, 它可以用func(a := 7, b := 12)func(b := 12, a := 7)调用。

  • 支持本地特定的正则表达式 处理UTF-8服务器编码 (Tom Lane)

    本地特定的正则表达式功能包括大小写敏感匹配和本地特定的字符类。 以前,这些特性只在数据库使用一个单字节服务器编码(如LATIN1)时, 可以为非ASCII字符正确的工作。它们将仍然在多字节编码下错误行为, 除了UTF-8

  • to_char() (EEEE规范) 中添加对科学计数法的支持 (Pavel Stehule, Brendan Jurd)

  • 使得to_char()遵守FM(填充模式)按照YYYYYY规格 (Bruce Momjian, Tom Lane)

    它早已遵从YYYY

  • 修复to_char()Windows 上以正确的编码输出本地化的数值和货币字符串 (Hiroshi Inoue, Itagaki Takahiro, Bruce Momjian)

  • 为多边形正确计算重叠包含 (Teodor Sigaev)

    多边形&&(重叠)运算符以前选中只是为了查看两个多边形的边界框是否重叠。 现在它做一个更正确的检查。多边形@><@(包含/包含于) 运算符以前选中是为了查看一个多边形顶点是否都包含在另一个中; 这对于一些非凸多边形会错误的报告true。 现在它们检查一个多边形的所有线段都包含在另一个中。

E.131.3.6.1. 聚合
  • 允许聚合函数使用 ORDER BY (Andrew Gierth)

    例如,现在支持:array_agg(a ORDER BY b)。 这对于输入值顺序很重要的聚合是有用的,并且消除了使用非标准的子查询确定顺序的需要。

  • 多参数聚合函数现在可以使用DISTINCT (Andrew Gierth)

  • 添加string_agg() 函数,组合值到一个字符串 (Pavel Stehule)

  • DISTINCT调用的聚合函数,如果聚合转换函数没有被标记为STRICT, 那么现在传递NULL值 (Andrew Gierth)

    例如,agg(DISTINCT x)可能传递一个NULL x值到agg()。 这和非DISTINCT情况的行为更加一致。

E.131.3.6.2. 位字符串
  • bit字符串添加get_bit()set_bit()函数,为bytea映射这两个函数 (Leonardo F)

  • bit字符串和bytea实现OVERLAY()(替换) (Leonardo F)

E.131.3.6.3. 对象信息函数
  • 添加pg_table_size()pg_indexes_size(),提供一个更加用户友好的界面到 pg_relation_size()函数 (Bernd Helmle)

  • 为序列权限检查添加has_sequence_privilege() (Abhijit Menon-Sen)

  • 更新information_schema 视图以符合SQL:2008 (Peter Eisentraut)

  • 使得information_schema视图为charvarchar 字段正确的显示最大的八位字节长度 (Peter Eisentraut)

  • 加速information_schema权限视图 (Joachim Wieland)

E.131.3.6.4. 函数和触发器创建
  • 支持使用DO 声明执行匿名代码块 (Petr Jelinek, Joshua Tolley, Hannu Valtonen)

    这允许服务器端代码的执行不需要创建和删除临时函数定义。 代码可以以任意用户有权限定义函数的语言执行。

  • 实现服从SQL标准的每字段触发 (Itagaki Takahiro)

    这样的触发器只有在指定的字段受到查询的影响时触发,如: 出现在UPDATESET列表中。

  • 添加WHEN子句到CREATE TRIGGER, 允许控制触发器是否触发 (Itagaki Takahiro)

    虽然相同类型的检查总是可以在触发器内部执行,但是在外部的WHEN 子句中做检查会有性能优势。

E.131.3.7. 服务器端语言

  • 添加OR REPLACE子句到 CREATE LANGUAGE (Tom Lane)

    这对于可选择的安装一个并非早已存在的语言是有帮助的, 并且对于现在PL/pgSQL是默认安装的尤其有帮助。

E.131.3.7.1. PL/pgSQL服务器端语言
  • 缺省安装PL/pgSQL (Bruce Momjian)

    如果管理员担心启用它会有安全或性能问题,该语言仍然可以从个别的数据库中删除。

  • 改善PL/pgSQL变量名与函数的查询中使用的标识符冲突时的处理 (Tom Lane)

    缺省行为是有冲突时抛出一个错误,以便避免意外的行为。这个可以修改, 通过配置参数plpgsql.variable_conflict 或者每个函数的选项#variable_conflict,允许使用变量或者查询提供的字段。 在任何情况下,PL/pgSQL将不再尝试替换不符合语法规范的变量。

  • 使PL/pgSQL使用主要的词法分析程序,而不是它自己的版本 (Tom Lane)

    这确保了精确的追踪主系统的细节行为,如字符串转义。一些用户变量细节, 如考虑保留在PL/pgSQL中的关键字的设置,已经因此而改变了。

  • 避免为无效的记录引用抛出不必要的错误 (Tom Lane)

    现在只有引用实际抓取到时才抛出一个错误,而不是每当到达封闭的表达式时。 例如,许多人尝试在触发器中这样做:

    if TG_OP = 'INSERT' and NEW.col1 = ... then

    现在这实际上将如预期一样工作。

  • 提高PL/pgSQL处理包含了删除字段的行类型的能力 (Pavel Stehule)

  • 允许输入参数在PL/pgSQL函数内部分配值 (Steve Prentice)

    以前,输入参数被当做声明了CONST来看,所以函数的代码不能改变它们的值。 这个限制已被删除,以简化函数从其他没有利用该等价限制的DBMSes中移植。 输入参数现在像本地变量初始化为传入的值一样动作。

  • 改进PL/pgSQL中的错误位置报告 (Tom Lane)

  • 在PL/pgSQL中添加countALL选项到 MOVE FORWARD/BACKWARD (Pavel Stehule)

  • 允许PL/pgSQL的WHERE CURRENT OF使用游标变量 (Tom Lane)

  • 允许PL/pgSQL的OPEN cursor FOR EXECUTE 使用参数 (Pavel Stehule, Itagaki Takahiro)

    这用一个新的USING子句完成了。

E.131.3.7.2. PL/Perl服务器端语言
  • 添加新的PL/Perl函数:quote_literal(), quote_nullable(), quote_ident(), encode_bytea(), decode_bytea(), looks_like_number(), encode_array_literal(), encode_array_constructor() (Tim Bunce)

  • 添加服务器参数plperl.on_init, 指定一个PL/Perl初始化函数 (Tim Bunce)

    plperl.on_plperl_initplperl.on_plperlu_init 都可以用于初始化,分别针对信任的和不信任的语言。

  • 在PL/Perl中支持END块 (Tim Bunce)

    END块目前不允许数据库访问。

  • 在PL/Perl中允许use strict (Tim Bunce)

    Perl strict检查也可以用新的服务器参数 plperl.use_strict 来全局启用。

  • 在PL/Perl中允许require (Tim Bunce)

    这主要是测试看看该模块是否加载上了,如果没有,产生一个错误。 不允许加载管理员没有通过初始化参数预加载的模块。

  • 如果使用了Perl版本5.10或更新,则在PL/Perl中允许use feature (Tim Bunce)

  • 验证了PL/Perl返回值在服务器编码中可用 (Andrew Dunstan)

E.131.3.7.3. PL/Python 服务器端语言
  • 在PL/Python中添加Unicode支持 (Peter Eisentraut)

    如果需要,字符串自动转换从/到服务器编码。

  • 在PL/Python中改善bytea支持 (Caleb Welton)

    传递到PL/Python中的Bytea值现在表示为二进制, 而不是PostgreSQL bytea文本格式。包含空字节的Bytea 值现在也从PL/Python中适当的输出。也改善了布尔值、整数值和浮点值的传送。

  • 在PL/Python中支持arrays作为参数并且返回值 (Peter Eisentraut)

  • 改善SQL域的映射为Python类型 (Peter Eisentraut)

  • 添加Python 3支持到PL/Python (Peter Eisentraut)

    新的服务器端语言称作plpython3u。 不能用于Python 2服务器端语言的相同会话中。

  • 改善PL/Python中的错误位置和异常报告 (Peter Eisentraut)

E.131.3.8. 客户应用程序

  • 添加--analyze-only选项到vacuumdb, 不带有清理的分析 (Bruce Momjian)

E.131.3.8.1. psql
  • 添加支持引用/转义psql 变量 的值作为SQL字符串或标识符 (Pavel Stehule, Robert Haas)

    例如,:'var'将产生值var,引用并适当的转义为字符串常量, 而:"var"将产生它的值,引用并且转义为一个标识符。

  • 在通过psql读取的脚本文件中, 忽略前导的UTF-8编码的Unicode字节顺序标记 (Itagaki Takahiro)

    这在客户端编码是UTF-8的时候启用。它改善了与某些编辑器的兼容性, 主要是在Windows上,坚持插入这样的标记的那些。

  • 修复psql --file -以适当的遵从 --single-transaction (Bruce Momjian)

  • 当两个psql会话并行运行时,避免psql 的命令行历史重写 (Tom Lane)

  • 改善psql的选项卡实现支持 (Itagaki Takahiro)

  • 当启用\timing时显示它的输出,不管quiet模式 (Peter Eisentraut)

E.131.3.8.1.1. psql 显示
  • 改善psql中封装字段的显示 (Roger Leigh)

    这个行为现在是缺省的。以前的格式通过使用\pset linestyle old-ascii可用。

  • 允许psql通过\pset linestyle unicode 使用喜好的Unicode线条特性 (Roger Leigh)

E.131.3.8.1.2. psql \d 命令
  • 使\d显示从指定父表继承而来的子表 (Damien Clochard)

    \d只显示子表的数量,而\d+显示所有子表的名字。

  • \d index_name中显示索引字段的定义 (Khee Chin)

    定义对于表达式索引是有用的。

  • 只在\d+中显示视图的定义查询,在\d中不显示 (Peter Eisentraut)

    总是包括认为过度冗长的查询。

E.131.3.8.2. pg_dump
  • 使pg_dump/pg_restore --clean 总是删除大对象 (Itagaki Takahiro)

  • 修复pg_dump,使其在启用standard_conforming_strings 时适当的转储大对象 (Tom Lane)

    当转储到一个归档文件,并且然后从pg_restore生成脚本输出时, 以前的编码可能会失败。

  • pg_restore现在在生成脚本输出时以十六进制格式发出大对象数据 (Tom Lane)

    如果该脚本然后输入到一个9.0以前的服务器,那么这可能会导致兼容性问题。 要绕开这个问题,直接恢复到该服务器。

  • 允许pg_dump转储附加到复合类型字段的注释 (Taro Minowa (Higepon))

  • 使pg_dump --verbose 在文本输出模式输出pg_dump和服务器版本 (Jim Cox, Tom Lane)

    这些在自定义输出模式中早已提供。

  • pg_restore现在抱怨是否在开关和选项文件名后面残存任何命令行参数 (Tom Lane)

    以前,它默默地无视任何这样的参数。

E.131.3.8.3. pg_ctl
  • 在系统重新启动该期间允许使用pg_ctl 安全的启动postmaster (Tom Lane)

    以前,pg_ctl的父进程错误的认为是基于旧的postmaster 锁文件运行postmaster,导致瞬间的不能启动数据库。

  • 给予pg_ctl初始化数据库的能力(通过调用initdb) (Zdenek Kotala)

E.131.3.9. 开发工具

E.131.3.9.1. libpq
  • 添加新的libpq函数 PQconnectdbParams()PQconnectStartParams() (Guillaume Lelarge)

    这些函数类似于PQconnectdb()PQconnectStart(), 除了它们接受连接选项的数组以null结尾,而不是请求在一个字符串中提供所有选项。

  • 添加libpq函数 PQescapeLiteral()PQescapeIdentifier() (Robert Haas)

    这些函数返回适当引用和转义的SQL字符串字面值和标识符。 调用者不需要预先分配字符串结果,如PQescapeStringConn()要求。

  • 添加每用户服务文件的支持(.pg_service.conf), 在站点范围的服务文件之前检查 (Peter Eisentraut)

  • 如果不能找到指定的libpq服务,那么适当的报告一个错误 (Peter Eisentraut)

  • 在libpq中添加TCP keepalive 设置 (Tollef Fog Heen, Fujii Masao, Robert Haas)

    Keepalive设置早已在TCP连接的服务器端支持。

  • 在提供可替代方式的平台上,避免额外的系统调用在libpq 中阻塞或疏通SIGPIPE (Jeremy Kerr)

  • .pgpass提供的口令未通过时, 在错误消息中提到口令的来源 (Bruce Momjian)

  • 加载所有客户端认证文件中给出的SSL认证 (Tom Lane)

    改善了对间接签署的SSL认证的支持。

E.131.3.9.2. ecpg
  • 添加SQLDA (SQL Descriptor Area)支持到 ecpg (Boszormenyi Zoltan)

  • 添加DESCRIBE OUTPUT ] 声明到ecpg (Boszormenyi Zoltan)

  • 添加一个ECPGtransactionStatus 函数以返回当前事务状态 (Bernd Helmle)

  • ecpg Informix兼容模式中添加string数据类型 (Boszormenyi Zoltan)

  • 允许ecpg没有限制的使用newold 变量名 (Michael Meskes)

  • 允许ecpgfree()中使用变量名 (Michael Meskes)

  • 使ecpg_dynamic_type()为非SQL3数据类型返回零 (Michael Meskes)

    以前,它返回该数据类型OID的负值。然而,这可能会与有效类型的OID混淆。

  • 在早已有64位long类型的平台上支持long long类型 (Michael Meskes)

E.131.3.9.2.1. ecpg 游标
  • ecpg的原始模式中添加超出范围游标支持 (Boszormenyi Zoltan)

    当调用了OPEN时,这允许DECLARE使用范围之外的变量。 这个工具早已存在于ecpg的Informix兼容模式中。

  • ecpg中允许动态游标名 (Boszormenyi Zoltan)

  • 允许ecpgFETCHMOVE中使用噪声字 FROMIN (Boszormenyi Zoltan)

E.131.3.10. 构建选项

  • 默认启用客户端线程安全性 (Bruce Momjian)

    线程安全性选项可以用configure --disable-thread-safety禁用。

  • 添加控制Linux内存不足杀手的支持 (Alex Hunsaker, Tom Lane)

    现在/proc/self/oom_adj允许禁用Linux 内存不足(OOM)杀手,推荐为postmaster禁用OOM杀手。 然后为postmaster的子进程重新启用OOM杀手就能满足需要了。 新的编译阶段选项LINUX_OOM_ADJ 允许为子进程重新启用杀手。

E.131.3.10.1. Makefiles
  • 新增Makefile指标worldinstall-worldinstallcheck-world (Andrew Dunstan)

    这类似于现有的allinstallinstallcheck指标, 但是它们也构建HTML文档,构建并测试contrib, 和测试服务器端语言和ecpg

  • 添加数据和文档安装位置控制到PGXS Makefiles (Mark Cave-Ayland)

  • 添加Makefile规则,作为一个HTML文件或者作为一个纯文本文件构建 PostgreSQL文档 (Peter Eisentraut, Bruce Momjian)

E.131.3.10.2. Windows
  • 支持在64位Windows 上编译和在64位模式中运行 (Tsutomu Yamada, Magnus Hagander)

    这允许Windows上大的共享内存大小。

  • 支持服务器构建使用Visual Studio 2008 (Magnus Hagander)

E.131.3.11. 源代码

  • 在子目录树中发布预建的文档,而不是作为发布的原始码中的tar归档文件 (Peter Eisentraut)

    例如,预建的HTML文档现在在doc/src/sgml/html/中; 手册页同样的方式打包。

  • 使服务器的词法分析器可重入 (Tom Lane)

    PL/pgSQL使用词法分析器需要这点。

  • 提升内存分配的速度 (Tom Lane, Greg Stark)

  • 用户定义的约束触发器现在在pg_constraintpg_trigger中都有记录了 (Tom Lane)

    因为这个改变,pg_constraint.pgconstrname 现在是多余的,并且已经删除了。

  • 添加系统目录字段pg_constraint.conindidpg_trigger.tgconstrindid, 以便更好的为约束执行记录索引的使用 (Tom Lane)

  • 允许使用单个操作系统信号传递多个条件到后端 (Fujii Masao)

    这允许添加新的特性,不用管平台特定的信号条件的个数的约束。

  • 提高源代码的测试覆盖率,包括contrib、PL/Python和PL/Perl (Peter Eisentraut, Andrew Dunstan)

  • 删除系统表引导对平面文件的使用 (Tom Lane, Alvaro Herrera)

    这提高了使用许多规则和数据库时的性能,并且消除了一些可能的故障条件。

  • 引导目录自动生成pg_attribute的初始内容 (John Naylor)

    这大大的简化了到这些目录的更改。

  • 分裂INSERT/UPDATE/DELETE操作 execMain.c的进程 (Marko Tiikkaja)

    现在在单独的ModifyTable节点中执行更新。这个更改对于未来的发展是必要的基础。

  • 简化psql的SQL帮助文本的翻译 (Peter Eisentraut)

  • 减少某些文件名的长度,以便在发布的原始码中的所有文件路径都小于100个字符 (Tom Lane)

    一些解压程序在长的文件路径上有问题。

  • 添加新的ERRCODE_INVALID_PASSWORD SQLSTATE错误代码 (Bruce Momjian)

  • 经过作者的许可,删除少量剩余的个人源码版权声明 (Bruce Momjian)

    个人版权声明是无关紧要的,但是社区偶尔不得不回答关于他们的问题。

  • 添加新的关于在非持久模式中运行PostgreSQL以提升性能的文档 章节 (Bruce Momjian)

  • 重新构造HTML文档Makefile规则, 以使它们的依赖性检查正确的工作,避免不必要的重建 (Peter Eisentraut)

  • 为手册页的建立使用DocBook XSL样式表, 而不是Docbook2X (Peter Eisentraut)

    这改变了建立手册页需要的工具集。

  • 改善PL/Perl代码结构 (Tim Bunce)

  • 改进PL/Perl中的错误环境报告 (Alexey Klyukin)

E.131.3.11.1. 新构建的需求

请注意,从发布的原始码建立时没有应用这些需求, 因为原始码包括用于建立的这些程序的文件。

  • 需要Autoconf 2.63建立configure (Peter Eisentraut)

  • 需要Flex 2.5.31或更新版本从CVS检查建立 (Tom Lane)

  • 需要Perl版本5.8或更新版本从CVS检查建立 (John Naylor, Andrew Dunstan)

E.131.3.11.2. 移植性
  • Bonjour使用更现代的API (Tom Lane)

    Bonjour支持现在需要macOS 10.3或更新版本。 老的API已经被Apple弃用了。

  • SuperH体系结构添加自旋锁支持 (Nobuhiro Iwamatsu)

  • 如果支持,则允许非GCC编译器使用内联函数 (Kurt Harriman)

  • 删除对没有运行64位整数数据类型的平台的支持 (Tom Lane)

  • 调整LDFLAGS的使用,使其在平台间更加的一致 (Tom Lane)

    LDFLAGS现在用于连接可执行文件和共享库,我们在连接可执行文件时添加 LDFLAGS_EX,在连接共享库时添加LDFLAGS_SL

E.131.3.11.3. 服务器编程
  • 使后端头文件安全的包含在C++中 (Kurt Harriman, Peter Eisentraut)

    这些改变删除关键字冲突,这些冲突在以前使得C++在后端代码中使用困难。 不过,在为后端功能使用C++时,仍然有其他复杂性。 在适当的地方仍然需要extern "C" { },内存管理和错误处理仍然是有问题的。

  • 添加AggCheckCallContext(), 用于检测是否一个C函数被作为一个聚合调用 (Hitoshi Harada)

  • SearchSysCache()和相关的函数修改调用规范, 以避免硬线连接缓存键的最大数量 (Robert Haas)

    现有的调用目前仍然可以工作,但是如果没有转变到新的风格,预计会在9.1或更新的版本中打断。

  • 需要调用fastgetattr()heap_getattr() 后端宏命令,以提供非NULL第四参数 (Robert Haas)

  • 自定义typanalyze函数应该不再依赖于VacAttrStats.attr 确定他们将要传送的数据的类型 (Tom Lane)

    变为允许收集索引字段上的统计信息,该索引字段的存储类型不同于底层字段的数据类型。 有新的字段告诉我们被分析的实际的数据类型。

E.131.3.11.4. 服务器 Hook
  • 添加解析器hook处理ColumnRef和ParamRef节点 (Tom Lane)

  • 添加处理实用程序hook,这样可加载的模块可以控制实用程序命令 (Itagaki Takahiro)

E.131.3.11.5. 二进制升级支持
  • 添加contrib/pg_upgrade 支持在线升级 (Bruce Momjian)

    这避免了升级到一个新的PostgreSQL主版本时转储/重载数据库的需要, 因此,通过数量级减少了停机时间。支持从PostgreSQL 8.3或8.4升级到9.0。

  • 添加支持在二进制升级期间保存关系 relfilenode 值 (Bruce Momjian)

  • 添加支持在二进制升级期间保存pg_typepg_enum OIDs (Bruce Momjian)

  • 移动表空间中的数据文件到PostgreSQL版本特定的子目录中 (Bruce Momjian)

    这简化了二进制升级。

E.131.3.12. 普通发布版

  • 添加多线程选项(-j)到 contrib/pgbench (Itagaki Takahiro)

    这允许pgbench使用多个CPU,降低pgbench本省成为测试障碍的风险。

  • 添加\shell\setshell元命令到 contrib/pgbench (Michael Paquier)

  • contrib/dict_xsyn 新增特性 (Sergey Karpov)

    新选项是matchorigmatchsynonymskeepsynonyms

  • 添加全文本字典contrib/unaccent (Teodor Sigaev)

    这个过滤的字典删除了字母的重(zhong)读, 使得多种语言上的全文本搜索更加简单。

  • 添加dblink_get_notify()contrib/dblink (Marcus Kempe)

    这允许dblink中的异步通知。

  • 改善contrib/dblink处理删除了的字段 (Tom Lane)

    这影响了dblink_build_sql_insert() 和相关的函数。这些函数现在根据逻辑而不是物理字段编号来编号字段。

  • 大大的增加了contrib/hstore 的数据长度限制,并且增加了B-tree和哈希支持,所以在hstore 字段上GROUP BYDISTINCT操作成为可能 (Andrew Gierth)

    也添加了新的函数和操作符。这些改进使得hstore 一个功能完整键值存储嵌入到PostgreSQL中。

  • 添加contrib/passwordcheck, 支持场地特定密码强度政策 (Laurenz Albe)

    这个模块的源代码应该被修改为实现场地特定密码政策。

  • 添加contrib/pg_archivecleanup 工具 (Simon Riggs)

    目的是用于archive_cleanup_command服务器参数, 以删除不再需要的归档文件。

  • 添加查询文本到contrib/auto_explain 输出 (Andrew Dunstan)

  • 添加缓冲区访问计数到contrib/pg_stat_statements (Itagaki Takahiro)

  • 更新contrib/start-scripts/linux, 以使用/proc/self/oom_adj禁用Linux内存溢出 (OOM)杀手 (Alex Hunsaker, Tom Lane)