E.34. 版本 9.0
发布日期: 2010-09-20
E.34.1. 概述
这个PostgreSQL版本添加了请求多年的特性,例如易于使用的复制, 大规模权限改变设施,和匿名代码块。而以前的主版本在这些范围是保守的, 这个版本显示了一个大胆的新的渴望提供的设施,新的和现有的PostgreSQL 用户将包含在内。这些都做到了,只是有少许的不兼容。主要的增强功能包括:
内建复制基于日志传送。这个发展包括两个特点:流复制,允许持续归档(WAL) 文件,在网络连接上流出到备用服务器;热备份,允许持续归档备用服务器以执行只读的查询。 有效效应是支持一个主服务器带有多个只读从服务器。
更简单的数据库对象权限管理。
GRANT
/REVOKE IN SCHEMA
支持在现有的对象上的大量的权限更改,而ALTER DEFAULT PRIVILEGES
允许控制将来创建的对象的权限。 大对象(BLOBs)现在也支持权限管理。明显提高存储过程支持。
DO
语句支持ad-hoc或"anonymous"代码块。函数现在可以用命名的参数来调用。 PL/pgSQL现在是缺省安装的, PL/Perl和PL/Python 已经从几个方面增强了,包括对Python3的支持。全面支持64位Windows
更高级的报告查询,包括附加的窗口选项(
PRECEDING
和FOLLOWING
) 和控制值以什么顺序供应给聚集函数的能力。新增触发特征,包括SQL标准兼容每字段触发器 和条件触发器执行。
可延期的唯一约束。 大量的更新到唯一键现在不带有欺骗是可能的了。
排除约束。 这些提供了一个唯一约束的广义版本,允许执行复杂的条件。
新增和加强的安全特性,包括RADIUS认证,LDAP认证改进,和一个新的贡献模块
passwordcheck
测试密码强度。新增高性能实现
LISTEN
/NOTIFY
特性。 等待发生的事件现在存储在一个基于内存的队列中,而不是一个表中。 还有,"payload"字符串可以被每个事件发送,而不是和以前一样只能是一个事件名传送。新增
VACUUM FULL
的实现。 这个命令现在改写全部的表和索引,而不是移动个别的行到紧密空间。 它实质上在大多数情况下更快,并且不再导致索引膨胀。新增贡献模块
pg_upgrade
, 支持从8.3或8.4到9.0的就地升级。对于特定类型的查询的多种性能增强,包括删除不需要的连接。 这帮助优化了一些自动生成的查询,比如由对象关系映射(ORMs)产生的那些。
EXPLAIN
增强。 该输出现在可以用在JSON, XML, 或YAML格式中, 并且包括缓冲区利用和以前不可用的其他数据。hstore
增强,包括新功能和更大的数据容量。
以上的条目在下面的章节中有更详细的介绍。
E.34.2. 迁移到版本 9.0
使用pg_dump或使用pg_upgrade 的转储/恢复,对于那些想要从任何以前的版本迁移数据的人来说是必须的。
版本9.0包含若干有选择的突破向后兼容的改变,为了支持新特性和编码质量改善。 特别的,使得PL/pgSQL、Point-In-Time Recovery (PITR)、或Warm Standby广泛应用的用户, 应该测试他们的应用,因为在这些地方有轻微的用户可见的改变。 观察下面的不兼容:
E.34.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.34.2.2. 查询
当查询一个parent table时, 不要在作为查询一部分扫描的子表上做任何单独的权限检查 (Peter Eisentraut)
SQL标准声明这个行为,并且它在实际上比以前在每个子表上和父表一样检查权限的行为更加方便。
E.34.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.34.2.4. 对象重命名
当一个子表从多个无关的父表中继承相同的字段时,在
RENAME
期间严格执行字段名的一致性 (KaiGai Kohei)当基础表字段重命名时不再自动重命名索引和索引字段 (Tom Lane)
超级管理员仍然可以手动重命名这样的索引和字段。这个改变将需要更新JDBC驱动, 和可能的其他驱动,以便唯一索引在重命名之后正确的重组。
CREATE OR REPLACE FUNCTION
可以不再改变函数参数声明的名字 (Pavel Stehule)为了避免在命名的参数调用中创建歧义,不再允许在一个现有函数的声明中改变输入参数的别名 (尽管名字仍然可以分配给以前未命名的参数)。要那样做,你现在必须
DROP
并重新创建该函数。
E.34.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.34.2.6. 其他的不兼容
不赞成使用
=>
作为一个操作符名称 (Robert Haas)将来版本的PostgreSQL可能完全拒绝这种操作符名, 为了支持命名函数参数的SQL标准符号。目前,仍然是允许的, 但是定义这样的一个操作符时会发出警告。
删除对没有64位整数数据类型工作的平台的支持 (Tom Lane)
认为所有仍然支持的平台有64位整数数据类型工作。
E.34.3. 修改列表
版本9.0有一个前所未有的新主版本特性的数量,超过200个增强、 改善、新增命令、新增函数和其他修改。
E.34.3.1. 服务器
E.34.3.1.1. 连续存档和流复制
PostgreSQL的现有备用服务器性能已经扩展为支持在备用服务器上只读查询和大大减少主从服务器之间的延迟。 对于很多用户,这将是流复制的一个有用和低管理的形式,要么为了高可用性,要么为了水平伸缩性。
允许备用服务器接受只读查询 (Simon Riggs, Heikki Linnakangas)
这个特性称为热备份。有新的
postgresql.conf
和recovery.conf
设置控制这个特性,还有大量的文档允许预写式日志(WAL)数据流到备用服务器 (Fujii Masao, Heikki Linnakangas)
这个特性称为流复制。以前的WAL数据只能以整个WAL 文件(通常每个16百万字节)为基本单位被送到备用服务器。 流复制消除低效,并且允许在主服务器上的更新以非常小的延迟传送到备用服务器上。 有新的
postgresql.conf
和recovery.conf
设置控制这个特性, 还有大量的文档。添加
pg_last_xlog_receive_location()
和pg_last_xlog_replay_location()
,可以用来监控备用服务器的 WAL活动 (Simon Riggs, Fujii Masao, Heikki Linnakangas)
E.34.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.34.3.1.3. 优化
删除不需要的外连接 (Robert Haas)
内侧的外连接是唯一的,并且不被连接的上级引用,因此现在删除了。 这将加速许多自动生成的查询,如那些通过对象关系映射(ORMs)创建的查询。
允许
IS NOT NULL
限制使用索引 (Tom Lane)这对于在包含许多空值的索引中发现
MAX()
/MIN()
值是尤其有用的。改善优化器为
DISTINCT
选择何时使用物化节点,何时使用排序和散列 (Tom Lane)改善优化器为包含
boolean
<>
操作符的表达式的等价性检测 (Tom Lane)
E.34.3.1.4. GEQO
每次GEQO规划一个查询时使用相同的随机种子 (Andres Freund)
Genetic Query Optimizer (GEQO)仍然选择随机规划,它现在总是为相同的查询选择相同的随机规划, 从而给出更加一致的性能。可以修改
geqo_seed
试验可选择的规划。改善GEQO规划选择 (Tom Lane)
这避免了少有的错误"failed to make a valid plan", 并且应该提升了规划速度。
E.34.3.1.5. 优化器统计信息
改善
ANALYZE
以支持继承树统计信息 (Tom Lane)这对于分区表特别有用。不过,当子表改变时autovacuum目前还没有自动重新分析父表。
当需要重新分析时,改善autovacuum 的检测 (Tom Lane)
改善优化器对于大于/小于比较的估计 (Tom Lane)
当查阅对于大于/小于比较的统计信息时,如果比较值是直方图的第一个或最后一个, 使用一个索引(如果可用)抓全当前实际字段的最小或最大值。 这大大的提高了估算接近数据范围结尾的比较值的精确度, 尤其是当范围由于新数据的添加而持续变化时。
允许不同值数量统计的设置使用
ALTER TABLE
(Robert Haas)这允许用户重载一个字段的不同值的估计数量或百分比。这个统计通常通过
ANALYZE
计算,但是估计可能会差些,尤其是在有非常多的行的表上。
E.34.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) 返回给那个用户。
添加
samehost
和samenet
指定到pg_hba.conf
(Stef Walter)这些分别匹配服务器的IP地址和子网地址。
传递信任的SSL根证书名字到客户端,这样客户端可以返回一个合适的客户端证书 (Craig Ringer)
E.34.3.1.7. 监控
添加客户端设置应用名 的能力,在
pg_stat_activity
中显示 (Dave Page)这允许管理员表现数据流量和通过源应用寻找故障问题。
添加SQLSTATE选项(
%e
)到log_line_prefix
(Guillaume Smet)这允许用户通过错误代码数量编制错误和消息的统计数据。
以UTF16编码写入Windows事件记录 (Itagaki Takahiro)
现在在Windows上的PostgreSQL记录消息支持多种语言。
E.34.3.1.8. 统计计数器
添加
pg_stat_reset_shared('bgwriter')
为后端写入重置集群范围的共享统计数据 (Greg Smith)添加
pg_stat_reset_single_table_counters()
和pg_stat_reset_single_function_counters()
, 允许为单独的表和函数重置统计计数器(Magnus Hagander)
E.34.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.34.3.2. 查询
在应用
LIMIT
之后执行SELECT FOR UPDATE
/SHARE
处理, 这样返回的行数总是可预见的 (Tom Lane)以前,并发事务所做的改变会导致
SELECT FOR UPDATE
返回的行数出乎意料的少于它的LIMIT
声明的行数。FOR UPDATE
和ORDER BY
的组合也会产生令人惊讶的结果, 但是可以通过在子句中放置FOR UPDATE
来纠正。允许传统的和SQL标准的
LIMIT
/OFFSET
语法混合 (Tom Lane)在窗口函数中扩展支持的框架选项 (Hitoshi Harada)
框架现在可以以
CURRENT ROW
开始,并且现在支持ROWS
_n_
PRECEDING/FOLLOWING
选项。使得
SELECT INTO
和CREATE TABLE AS
在它们的命令标签中返回行计数到客户端 (Boszormenyi Zoltan)这可以节省到客户端的整个往返,允许结果计数和页码的计算不带有附加的
COUNT
查询。
E.34.3.2.1. Unicode 字符串
E.34.3.3. 对象操作
通过定义冲刷到磁盘加速
CREATE DATABASE
(Andres Freund, Greg Stark)只允许注释在表、视图和复合类型的字段上, 不允许在其他关系类型如索引和TOAST表上 (Tom Lane)
允许枚举类型 的创建不包含值 (Bruce Momjian)
使有存储类型
MAIN
的字段的值保留在主堆页上, 除了不适合在一个页面上的行 (Kevin Grittner)以前,
MAIN
值被迫离开到TOAST表, 直到行的大小小于页面大小的四分之一。
E.34.3.3.1. ALTER TABLE
为
ALTER TABLE DROP COLUMN
和ALTER 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.34.3.3.2. CREATE TABLE
添加在
CREATE TABLE ... LIKE
命令中拷贝COMMENTS
和STORAGE
字符串的支持 (Itagaki Takahiro)添加拷贝
CREATE TABLE ... LIKE
命令中所有属性的快捷方式 (Itagaki Takahiro)添加SQL标准的
CREATE TABLE ... OF
_type_
命令 (Peter Eisentraut)这允许表的创建匹配一个现有的复合类型。附加约束和默认值可以在该命令中指定。
E.34.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.34.3.3.4. 对象权限
添加使用新的
GRANT
/REVOKE IN SCHEMA
子句在整个模式中改变大量权限的能力 (Petr Jelinek)这简化了对象权限的管理,并且使得应用数据安全更容易的利用数据库角色。
添加
ALTER DEFAULT PRIVILEGES
命令以控制稍后创建的对象的权限 (Petr Jelinek)这大大的简化了复杂数据库应用中对象权限的分配。可以为表、视图、序列和函数设置缺省权限。 缺省可以在每个模式的基础上或者数据库范围内分配。
添加用
GRANT
/REVOKE
控制大对象(BLOB)权限的能力 (KaiGai Kohei)以前,任意数据库用户可以读取或者修改任何大对象。 现在可以赋予和撤销每个大对象的读取和写入权限, 并且追踪大对象的所有者关系。
E.34.3.4. 实用操作
使得
LISTEN
/NOTIFY
存储在一个内存序列中等待事件,而不是在一个系统表中 (Joachim Wieland)这在保留事务支持和保证交付的现有特性时大幅度的提升了性能。
允许
NOTIFY
传送一个可选的"payload"字符串到监听器 (Joachim Wieland)这大大的提升了
LISTEN
/NOTIFY
作为一个通用的事件队列系统的有用性。允许在所有的数据库系统目录上
CLUSTER
(Tom Lane)共享的目录仍然不能集群。
E.34.3.4.1. COPY
接受
COPY ... CSV FORCE QUOTE *
(Itagaki Takahiro)现在
*
在FORCE QUOTE
子句中可以用作"所有字段"的简写。添加新的
COPY
语法,允许选项在圆括号内部指定 (Robert Haas, Emmanuel Cecchet)这允许未来的
COPY
选项有更大的灵活性。仍然支持旧的语法, 但是只对已经存在的选项。
E.34.3.4.2. EXPLAIN
允许
EXPLAIN
以XML、JSON或YAML 格式输出(Robert Haas, Greg Sabino Mullane)新的输出格式是容易机器可读的,支持分析
EXPLAIN
输出的新工具的发展。添加新的
BUFFERS
选项报告EXPLAIN ANALYZE
期间查询缓冲区的使用 (Itagaki Takahiro)这允许为单个查询更好的查询分析。缓冲区的使用不再在 log_statement_stats 和相关设置的输出中报告。
添加散列使用信息到
EXPLAIN
输出 (Robert Haas)添加新的
EXPLAIN
语法,允许选项在圆括号内部指定 (Robert Haas)这允许未来的
EXPLAIN
选项有更大的灵活性。仍然支持旧的语法, 但是只对已经存在的选项。
E.34.3.4.3. VACUUM
改变
VACUUM FULL
重写整个表和重建它的索引, 而不是围绕紧致的空间移动个别的行 (Itagaki Takahiro, Tom Lane)以前的方法通常较慢,并且导致索引膨胀。请注意, 新的方法将在
VACUUM FULL
期间瞬间使用更多磁盘空间; 可能是正常被该表和它的索引占用的空间的两倍。添加新的
VACUUM
语法,允许选项在圆括号内部指定 (Itagaki Takahiro)这允许未来的
VACUUM
选项有更大的灵活性。仍然支持旧的语法, 但是只对已经存在的选项。
E.34.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.34.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.34.3.5.1. 全文检索
在
同义词
字典中添加前缀支持 (Teodor Sigaev)添加过滤字典 (Teodor Sigaev)
过滤字典允许符号被修改后传送到随后的字典。
在邮件地址符号中允许下划线 (Teodor Sigaev)
为解析URL符号使用更符合标准的规则 (Tom Lane)
E.34.3.6. 函数
允许函数调用提供参数名,并且匹配它们到函数定义中命名的参数 (Pavel Stehule)
例如,如果一个函数定义为接受参数
a
和b
, 它可以用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
(填充模式)按照Y
、YY
和YYY
规格 (Bruce Momjian, Tom Lane)它早已遵从
YYYY
。修复
to_char()
在Windows 上以正确的编码输出本地化的数值和货币字符串 (Hiroshi Inoue, Itagaki Takahiro, Bruce Momjian)为多边形正确计算"重叠" 和"包含" (Teodor Sigaev)
多边形
&&
(重叠)运算符以前选中只是为了查看两个多边形的边界框是否重叠。 现在它做一个更正确的检查。多边形@>
和<@
(包含/包含于) 运算符以前选中是为了查看一个多边形顶点是否都包含在另一个中; 这对于一些非凸多边形会错误的报告"true"。 现在它们检查一个多边形的所有线段都包含在另一个中。
E.34.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)
可能传递一个NULLx
值到agg()
。 这和非DISTINCT
情况的行为更加一致。
E.34.3.6.2. 位字符串
为
bit
字符串添加get_bit()
和set_bit()
函数,为bytea
映射这两个函数 (Leonardo F)为
bit
字符串和bytea
实现OVERLAY()
(替换) (Leonardo F)
E.34.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
视图为char
和varchar
字段正确的显示最大的八位字节长度 (Peter Eisentraut)加速
information_schema
权限视图 (Joachim Wieland)
E.34.3.6.4. 函数和触发器创建
支持使用
DO
声明执行匿名代码块 (Petr Jelinek, Joshua Tolley, Hannu Valtonen)这允许服务器端代码的执行不需要创建和删除临时函数定义。 代码可以以任意用户有权限定义函数的语言执行。
实现服从SQL标准的每字段触发 (Itagaki Takahiro)
这样的触发器只有在指定的字段受到查询的影响时触发,如: 出现在
UPDATE
的SET
列表中。添加
WHEN
子句到CREATE TRIGGER
, 允许控制触发器是否触发 (Itagaki Takahiro)虽然相同类型的检查总是可以在触发器内部执行,但是在外部的
WHEN
子句中做检查会有性能优势。
E.34.3.7. 服务器端语言
添加
OR REPLACE
子句到CREATE LANGUAGE
(Tom Lane)这对于可选择的安装一个并非早已存在的语言是有帮助的, 并且对于现在PL/pgSQL是默认安装的尤其有帮助。
E.34.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中添加
_count_
和ALL
选项到MOVE FORWARD
/BACKWARD
(Pavel Stehule)允许PL/pgSQL的
WHERE CURRENT OF
使用游标变量 (Tom Lane)允许PL/pgSQL的
OPEN
_cursor_
FOR EXECUTE 使用参数 (Pavel Stehule, Itagaki Takahiro)这用一个新的
USING
子句完成了。
E.34.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_init
和plperl.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.34.3.7.3. PL/Python 服务器端语言
在PL/Python中添加Unicode支持 (Peter Eisentraut)
如果需要,字符串自动转换从/到服务器编码。
在PL/Python中改善
bytea
支持 (Caleb Welton)传递到PL/Python中的
Bytea
值现在表示为二进制, 而不是PostgreSQLbytea
文本格式。包含空字节的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.34.3.8. 客户应用程序
- 添加
--analyze-only
选项到vacuumdb
, 不带有清理的分析 (Bruce Momjian)
E.34.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.34.3.8.1.1. psql 显示
改善psql中封装字段的显示 (Roger Leigh)
这个行为现在是缺省的。以前的格式通过使用
\pset linestyle old-ascii
可用。允许psql通过
\pset linestyle unicode
使用喜好的Unicode线条特性 (Roger Leigh)
E.34.3.8.1.2. psql \d
命令
使
\d
显示从指定父表继承而来的子表 (Damien Clochard)\d
只显示子表的数量,而\d+
显示所有子表的名字。在
\d index_name
中显示索引字段的定义 (Khee Chin)定义对于表达式索引是有用的。
只在
\d+
中显示视图的定义查询,在\d
中不显示 (Peter Eisentraut)总是包括认为过度冗长的查询。
E.34.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.34.3.8.3. pg_ctl
在系统重新启动该期间允许使用pg_ctl 安全的启动postmaster (Tom Lane)
以前,pg_ctl的父进程错误的认为是基于旧的postmaster 锁文件运行postmaster,导致瞬间的不能启动数据库。
给予pg_ctl初始化数据库的能力(通过调用initdb) (Zdenek Kotala)
E.34.3.9. 开发工具
E.34.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.34.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没有限制的使用
new
和old
变量名 (Michael Meskes)允许ecpg在
free()
中使用变量名 (Michael Meskes)使
ecpg_dynamic_type()
为非SQL3数据类型返回零 (Michael Meskes)以前,它返回该数据类型OID的负值。然而,这可能会与有效类型的OID混淆。
在早已有64位
long
类型的平台上支持long long
类型 (Michael Meskes)
E.34.3.9.2.1. ecpg 游标
在ecpg的原始模式中添加超出范围游标支持 (Boszormenyi Zoltan)
当调用了
OPEN
时,这允许DECLARE
使用范围之外的变量。 这个工具早已存在于ecpg的Informix兼容模式中。在ecpg中允许动态游标名 (Boszormenyi Zoltan)
允许ecpg在
FETCH
和MOVE
中使用噪声字FROM
和IN
(Boszormenyi Zoltan)
E.34.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.34.3.10.1. Makefiles
新增
Makefile
指标world
、install-world
和installcheck-world
(Andrew Dunstan)这类似于现有的
all
、install
和installcheck
指标, 但是它们也构建HTML文档,构建并测试contrib
, 和测试服务器端语言和ecpg。添加数据和文档安装位置控制到PGXS Makefiles (Mark Cave-Ayland)
添加Makefile规则,作为一个HTML文件或者作为一个纯文本文件构建 PostgreSQL文档 (Peter Eisentraut, Bruce Momjian)
E.34.3.10.2. Windows
支持在64位Windows 上编译和在64位模式中运行 (Tsutomu Yamada, Magnus Hagander)
这允许Windows上大的共享内存大小。
支持服务器构建使用Visual Studio 2008 (Magnus Hagander)
E.34.3.11. 源代码
在子目录树中发布预建的文档,而不是作为发布的原始码中的tar归档文件 (Peter Eisentraut)
例如,预建的HTML文档现在在
doc/src/sgml/html/
中; 手册页同样的方式打包。使服务器的词法分析器可重入 (Tom Lane)
PL/pgSQL使用词法分析器需要这点。
提升内存分配的速度 (Tom Lane, Greg Stark)
用户定义的约束触发器现在在
pg_constraint
和pg_trigger
中都有记录了 (Tom Lane)因为这个改变,
pg_constraint
.pgconstrname
现在是多余的,并且已经删除了。添加系统目录字段
pg_constraint
.conindid
和pg_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.34.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.34.3.11.2. 移植性
为Bonjour使用更现代的API (Tom Lane)
Bonjour支持现在需要OS X 10.3或更新版本。 老的API已经被Apple弃用了。
为SuperH体系结构添加自旋锁支持 (Nobuhiro Iwamatsu)
如果支持,则允许非GCC编译器使用内联函数 (Kurt Harriman)
删除对没有运行64位整数数据类型的平台的支持 (Tom Lane)
调整
LDFLAGS
的使用,使其在平台间更加的一致 (Tom Lane)LDFLAGS
现在用于连接可执行文件和共享库,我们在连接可执行文件时添加LDFLAGS_EX
,在连接共享库时添加LDFLAGS_SL
。
E.34.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.34.3.11.4. 服务器 Hook
添加解析器hook处理ColumnRef和ParamRef节点 (Tom Lane)
添加处理实用程序hook,这样可加载的模块可以控制实用程序命令 (Itagaki Takahiro)
E.34.3.11.5. 二进制升级支持
添加
contrib/pg_upgrade
支持在线升级 (Bruce Momjian)这避免了升级到一个新的PostgreSQL主版本时转储/重载数据库的需要, 因此,通过数量级减少了停机时间。支持从PostgreSQL 8.3或8.4升级到9.0。
添加支持在二进制升级期间保存关系
relfilenode
值 (Bruce Momjian)添加支持在二进制升级期间保存
pg_type
和pg_enum
OIDs (Bruce Momjian)移动表空间中的数据文件到PostgreSQL版本特定的子目录中 (Bruce Momjian)
这简化了二进制升级。
E.34.3.12. 普通发布版
添加多线程选项(
-j
)到contrib/pgbench
(Itagaki Takahiro)这允许pgbench使用多个CPU,降低pgbench本省成为测试障碍的风险。
添加
\shell
和\setshell
元命令到contrib/pgbench
(Michael Paquier)为
contrib/dict_xsyn
新增特性 (Sergey Karpov)新选项是
matchorig
,matchsynonyms
和keepsynonyms
。添加全文本字典
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 BY
和DISTINCT
操作成为可能 (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)