E.53. 发布8.4
发布日期: 2009-07-01
E.53.1. 概要
经过多年研发后,PostgreSQL已经在许多领域特性比较完整。 该发布显示一个针对性方法来添加特性(比如,认证,监测,空间重利用), 并且添加在以后SQL标准中定义的能力。增强的主要方面是:
窗口函数
通用表表达式和递归查询
函数缺省和可变参数
并行恢复
列权限
每个数据库本地设置
改进的哈希索引
改进
EXISTS
和NOT 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_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.53.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.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)提高
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.53.3. 变化
下面你会发现在PostgreSQL 8.4和之前主要发布之间变化的详细说明。
E.53.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.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
,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.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_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.53.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.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
允许
LIMIT
和OFFSET
中子选择(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_COLLATE
和LC_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_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.53.3.6. 数据类型
为文本搜索同义词词典添加
CaseSensitive
选项(Simon)完善
NUMERIC
划分精度(Tom)为
int2
与int8
添加基础算术操作符(Tom)这消除了在某些情况中显式投射需求。
允许
UUID
输入在每四位后面接受可选的连字符(Robert Haas)允许
on
/off
作为布尔数据类型的输入(Itagaki Takahiro)为类型
numeric
在输入字符串中NaN
周围允许空格(Sam Mason)
E.53.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.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()
文件允许从-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.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_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.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)支持
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.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
中布尔值的所有支持的拼写,而不仅仅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.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)
这添加了注册回调能力来管理联系
PGconn
和PGresult
对象的私有数据。优化错误处理以允许多个错误信息的返回作为多行错误报告(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_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.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_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)