E.23. 版本 8.4 #
发行日期
2009-07-01
E.23.1. 概述
经过多年开发,PostgreSQL 在许多领域已经功能完备。此发行版展示了添加特性的针对性方法(例如认证、监控、空间复用),并增加了后续 SQL 标准中定义的能力。主要的增强领域是:
窗口函数
公共表表达式和递归查询
函数的默认参数和可变参数
并行恢复
列权限
逐数据库的区域设置
改进的哈希索引
改进
EXISTS和NOT EXISTS查询的连接性能更易用的热备
自动调整空闲空间映射的大小
可见性映射(大幅降低变化缓慢的表的清理开销)
版本感知的 psql(反斜杠命令可针对较旧的服务器工作)
支持用 SSL 证书进行用户认证
逐函数的运行时统计
在 psql 中轻松编辑函数
新增 contrib 模块:pg_stat_statements、auto_explain、citext、btree_gin
上述各项在下面的章节中有更详细的说明。
E.23.2. 迁移到版本 8.4
希望从任何以前的版本迁移数据的用户,需要使用 pg_dump 进行转储/恢复。
请注意以下不兼容之处:
E.23.2.1. 常规
默认使用 64 位整数日期时间(Neil Conway)
此前这由 configure 的
--enable-integer-datetimes选项选择。要保留旧行为,请用--disable-integer-datetimes构建。移除 ipcclean 工具命令(Bruce)
该工具只在少数平台上有效。用户应改用其操作系统的工具。
E.23.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中没有%转义时自动追加纪元时间戳的行为(Robert Haas)此变更是因为一些用户想要固定的日志文件名,以便与外部日志轮转工具配合使用。
从
recovery.conf中移除log_restartpoints;改用log_checkpoints(Simon)移除
krb_realm和krb_server_hostname;它们现在改在pg_hba.conf中设置(Magnus)pg_hba.conf中也有重大变更,如下所述。
E.23.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.23.2.4. 函数和操作符
让
numeric零的分数次幂返回0而不是抛出错误,并让numeric零的零次幂返回1而不是出错(Bruce)这与
float8长期的行为一致。允许浮点值的一元减产生负零(Tom)
更改后的行为更符合 IEEE 标准。
如果转义字符是
LIKE模式的最后一个字符(即它没有可转义的内容),抛出错误(Tom)此前这样的转义字符被静默忽略,因此可能掩盖应用程序逻辑错误。
移除以前用于
LIKE索引比较的~=~和~<>~操作符(Tom)模式索引现在使用常规的相等操作符。
xpath()现在把它的参数不做任何更改地传递给 libxml(Andrew)这意味着 XML 参数必须是格式良好的 XML 文档。以前的编码试图允许 XML 片段,但效果不好。
让
xmlelement()像格式化内容值一样格式化属性值(Peter)此前属性值按照常规 SQL 输出行为格式化,这有时与 XML 规则相悖。
重写使用 libxml 的函数的内存管理(Tom)
此变更应能避免在 PL/Perl 和其他附加代码中使用 libxml 的一些兼容性问题。
为哈希函数采用更快的算法(Kenneth Marshall,基于 Bob Jenkins 的工作)
许多内建哈希函数现在在小端和大端平台上产生不同的结果。
E.23.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)以前的版本常常忽略或静默误读与格式字符串不匹配的输入。这类情形现在将导致错误。
修复
to_timestamp(),使其不要求上/下午(AM/PM)和纪元(BC/AD)格式标志的大/小写匹配(Brendan Jurd)例如,输入值
ad现在匹配格式字符串AD。
E.23.3. 变更
下面你将找到 PostgreSQL 8.4 与上一个主版本之间变更的详细说明。
E.23.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)
把
default_statistics_target的默认值从10提高到100(Greg Sabino Mullane、Tom)最大值也从
1000提高到10000。在涉及继承或
UNION ALL的查询中默认执行constraint_exclusion检查(Tom)新增了
constraint_exclusion设置partition来指定此行为。允许位图索引扫描的 I/O 预读(Greg Stark)
预读量由
effective_io_concurrency控制。此特性仅在内核支持posix_fadvise()时可用。在
FROM子句中内联简单的返回集合的 SQL 函数(Richard Rowell)通过为外部关系中特别常见的连接键值提供特殊情形,改进多批哈希连接的性能(Bryce Cutt、Ramon Lawrence)
通过抑制“物理 tlist”优化减少多批哈希连接中的临时数据量(Michael Henderson、Ramon Lawrence)
避免
CREATE INDEX CONCURRENTLY期间等待空闲在事务中的会话(Simon)改进共享缓存失效的性能(Tom)
E.23.3.2. 服务器
E.23.3.2.1. 设置
把许多
postgresql.conf设置转换为枚举值,使pg_settings能显示有效值(Magnus)新增
cursor_tuple_fraction参数,控制规划器假定会被获取的游标行的比例(Robert Hell)允许
postgresql.conf中自定义变量类名称包含下划线(Tom)
E.23.3.2.2. 认证与安全
移除对(不安全的)
crypt认证方法的支持(Magnus)这实际上使 PostgreSQL 7.2 之前的客户端库过时,因为它们不再有任何可用的非明文口令方法。
支持
pg_ident.conf中的正则表达式(Magnus)允许不重启 postmaster 即可更改 Kerberos/GSSAPI 参数(Magnus)
支持服务器证书文件中的 SSL 证书链(Andrew Gierth)
包含完整证书链使客户端能够验证证书,而无需在本地存储中拥有所有中间 CA 证书——商业 CA 常是这种情形。
对
MD5认证与db_user_namespace同时启用的组合报告适当的错误消息(Bruce)
E.23.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认证方法,允许通过 SSL 证书进行用户认证(Magnus)此前 SSL 证书只能验证客户端拥有某证书的访问权,而不能认证用户。
允许在
pg_hba.conf中指定krb5、gssapi和sspi的 realm 以及krb5主机设置(Magnus)它们覆盖
postgresql.conf中的设置。为
krb5、gssapi和sspi方法新增include_realm参数(Magnus)这允许使用 usermap 把来自不同 realm 的相同用户名认证为不同的数据库用户。
装载时完整解析
pg_hba.conf,以便立即报告错误(Magnus)此前,文件中的大多数错误直到客户端尝试连接时才会被发现,因此一个有错误的文件可能使系统不可用。按照新行为,如果重载期间检测到错误,则拒绝坏文件,postmaster 继续使用其旧副本。
显示
pg_hba.conf中的所有解析错误,而不是在第一个之后中止(Selena Deckelmann)支持在 Solaris 上通过 Unix 域套接字进行
ident认证(Garick Hamlin)
E.23.3.2.4. 连续归档
为
pg_start_backup()提供一个选项,强制其隐含的检查点尽快完成(Tom)默认行为避免过多的 I/O 消耗,但如果没有并发查询活动在进行,那就没有意义。
让
pg_stop_backup()等待已修改的 WAL 文件被归档(Simon)这保证备份在
pg_stop_backup()完成时是有效的。启用归档时,在关闭时轮转最后一个 WAL 段,使所有事务可以立即归档(Guillaume Smet、Heikki)
当连续归档基础备份正在进行时,延迟“智能”关闭(Laurenz Albe)
如果请求“快速”关闭,则取消正在进行的连续归档基础备份(Laurenz Albe)
允许
recovery.conf布尔变量接受与postgresql.conf布尔变量相同的字符串值范围(Bruce)
E.23.3.2.5. 监控
新增
pg_conf_load_time(),报告 PostgreSQL 配置文件上次装载的时间(George Gensure)新增
pg_terminate_backend()以安全地终止后端(SIGTERM信号也可行)(Tom、Bruce)虽然一直可以用
SIGTERM终止单个后端,但这此前被认为不受支持;对该情形的测试发现了一些现已修复的缺陷。新增跟踪用户定义函数调用次数和运行时间的能力(Martin Pihlak)
函数统计信息出现在新系统视图
pg_stat_user_functions中。跟踪由新参数track_functions控制。通过新参数
track_activity_query_size允许指定pg_stat_activity中查询字符串的最大大小(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.23.3.3. 查询
新增对
WINDOW函数的支持(Hitoshi Harada)新增对
WITH子句(CTE)的支持,包括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 语言编写的函数现在可以这样调用。
支持聚合和分组查询输出中的返回集合的函数(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)拒绝字符串字面量和
COPY数据中的\000(Tom)此前这被接受,但效果是终止字符串内容。
改进解析器报告错误位置的能力(Tom)
现在许多此前无法定位的语义错误(如数据类型不匹配)也会报告错误位置。
E.23.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.23.3.3.2. EXPLAIN
让
EXPLAIN VERBOSE显示每个计划节点的输出列(Tom)此前
EXPLAIN VERBOSE输出查询计划的内部表示。(该行为现在可通过debug_print_plan获得。)让
EXPLAIN用各自的标签标识子计划和 initplan(Tom)让
EXPLAIN遵循debug_print_plan(Tom)允许对
CREATE TABLE AS使用EXPLAIN(Peter)
E.23.3.3.3. LIMIT/OFFSET
允许
LIMIT和OFFSET中的子查询(Tom)为
LIMIT/OFFSET能力新增 SQL 标准语法(Peter)即
OFFSET num {ROW|ROWS} FETCH {FIRST|NEXT} [num] {ROW|ROWS} ONLY。
E.23.3.4. 对象操作
新增对列级权限的支持(Stephen Frost、KaiGai Kohei)
重构多对象
DROP操作以减少对CASCADE的需要(Alex Hunsaker)例如,如果表
B依赖于表A,命令DROP TABLE A, B不再需要CASCADE选项。通过确保在开始删除对象依赖之前获取锁,修复并发
DROP命令的各种问题(Tom)改进
DROP命令期间依赖的报告(Tom)按照 SQL 标准为
CREATE TABLE AS新增WITH [NO] DATA子句(Peter、Tom)新增对用户定义 I/O 转换转换的支持(Heikki)
允许
CREATE AGGREGATE使用internal转换数据类型(Tom)为
CREATE TYPE新增LIKE子句(Tom)这简化了创建与现有类型使用相同内部表示的数据类型。
允许为用户定义基本类型指定类型类别和“首选”状态(Tom)
这允许对用户定义类型的强制转换行为有更多控制。
允许
CREATE OR REPLACE VIEW向视图末尾添加列(Robert Haas)
E.23.3.4.1. ALTER
新增
ALTER TYPE RENAME(Petr Jelinek)新增
ALTER SEQUENCE ... RESTART(不带参数),把序列重置为其初始值(Zoltan Boszormenyi)修改
ALTER TABLE语法,允许对表、索引、序列和视图的所有合理组合(Tom)此变更允许以下新语法:
ALTER SEQUENCE OWNER TOALTER VIEW ALTER COLUMN SET/DROP DEFAULTALTER VIEW OWNER TOALTER 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.23.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.23.3.5. 工具操作
为
CLUSTER命令和 clusterdb 新增VERBOSE选项(Jim Cox)降低记录待处理触发器事件的内存需求(Tom)
E.23.3.5.1. 索引
显著改进构建和访问哈希索引的速度(Tom Raney、Shreya Bhargava)
这使哈希索引有时可以比 btree 索引更快。但哈希索引仍然不是崩溃安全的。
让哈希索引只存储哈希码,而不是被索引列的完整值(Xiao Meng)
这大幅减小长索引值下哈希索引的大小,改进了性能。
实现 GIN 索引的快速更新选项(Teodor、Oleg)
此选项以搜索速度的小幅损失大幅改进更新速度。
xxx_pattern_ops索引现在可用于简单相等比较,而不仅用于LIKE(Tom)
E.23.3.5.2. 全文索引
移除在全文本索引上进行 GIN 加权查找时必须使用
@@@的要求(Tom、Teodor)可以改用常规的
@@文本搜索操作符。为
@@文本搜索操作新增优化器选择率函数(Jan Urbanski)允许全文搜索中的前缀匹配(Teodor Sigaev、Oleg Bartunov)
支持多列 GIN 索引(Teodor Sigaev)
改进对尼泊尔语和天城文的支持(Teodor)
E.23.3.5.3. VACUUM
在单独的逐关系“分叉”文件中跟踪空闲空间(Heikki)
VACUUM发现的空闲空间现在记录在*_fsm文件中,而不是固定大小的共享内存区域。max_fsm_pages和max_fsm_relations设置已被移除,大幅简化了空闲空间管理。新增可见性映射来跟踪不需要清理的页(Heikki)
这允许
VACUUM在只有表的一部分需要清理时避免扫描整表。可见性映射存储在逐关系的“分叉”文件中。新增
vacuum_freeze_table_age参数,控制VACUUM何时应忽略可见性映射并做全表扫描以冻结元组(Heikki)更仔细地跟踪事务快照(Alvaro)
这改进了
VACUUM在存在长运行事务时回收空间的能力。新增在
CREATE TABLE中指定逐关系 autovacuum 和 TOAST 参数的能力(Alvaro、Euler Taveira de Oliveira)Autovacuum 选项以前存储在系统表中。
为 vacuumdb 新增
--freeze选项(Bruce)
E.23.3.6. 数据类型
为文本搜索同义词词典新增
CaseSensitive选项(Simon)改进
NUMERIC除法的精度(Tom)新增
int2与int8的基本算术操作符(Tom)这消除了某些情况下显式转换的需要。
允许
UUID输入在每四个数字后接受可选的连字符(Robert Haas)允许
on/off作为布尔数据类型的输入(Itagaki Takahiro)允许
numeric类型输入字符串中NaN周围有空格(Sam Mason)
E.23.3.6.1. 时间数据类型
拒绝年份
0 BC以及000和0000(Tom)此前它们被解释为
1 BC。(注意:年份0和00仍被假定为 2000 年。)把
SGT(新加坡时间)加入已知时区缩写的默认列表(Tom)支持
infinity和-infinity作为date类型的值(Tom)使
interval字面量的解析更符合标准(Tom、Ron Mayer)例如,
INTERVAL '1' YEAR现在做它本应做的事。允许
interval的小数秒精度指定在second关键字之后,以符合 SQL 标准(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.23.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.23.3.6.3. 宽值存储(TOAST)
对短至 32 字节的值考虑 TOAST 压缩(以前是 256 字节)(Greg Stark)
要求至少 25% 的空间节省才使用 TOAST 压缩(以前小值为 20%,大值为有任何节省即可)(Greg)
改进对混合大小可 TOAST 字段的行的 TOAST 启发式,使我们倾向于把大值推出行外并且不必要地压缩小值(Greg、Tom)
E.23.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.23.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)不再有效。向
pg_settings输出新增boot_val和reset_val列(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.23.3.7.2. 函数创建
支持可变参数函数(参数数量可变的函数)(Pavel Stehule)
只有尾部参数可以是可选的,且它们必须都是同一数据类型。
支持函数参数的默认值(Pavel Stehule)
新增
CREATE FUNCTION ... RETURNS TABLE子句(Pavel Stehule)允许 SQL 语言函数返回
INSERT/UPDATE/DELETE的RETURNING子句的输出(Tom)
E.23.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开启时有效命令会失败的其他情形。避免同一函数在不同异常块嵌套深度被调用时的内存泄漏(Tom)
E.23.3.8. 客户端应用程序
修复
pg_ctl restart以保留命令行参数(Bruce)新增
-w/--no-password选项,在所有具有-W/--password选项的工具中阻止口令提示(Peter)移除 createdb、createuser、dropdb、dropuser 的
-q(安静)选项(Peter)这些选项自 PostgreSQL 8.3 起就没有效果。
E.23.3.8.1. psql
移除冗长的启动横幅;现在只建议
help(Joshua Drake)让
help显示常用反斜杠命令(Greg Sabino Mullane)新增
\pset format wrapped模式,把输出折行到屏幕宽度,或者在设置了\pset columns时也适用于文件/管道输出(Bryce Nesbitt)允许
\pset中布尔值的所有受支持拼法,而不只是on和off(Bruce)此前,除 “off” 外的任何字符串都被静默地当作
true。psql 现在会对无法识别的拼法抱怨(但仍把它们当作true)。对宽输出使用分页器(Bruce)
要求单字母反斜杠命令与其第一个参数之间有一个空格(Bernd Helmle)
这消除了一个历史性的歧义来源。
改进对模式限定和带引号标识符的 Tab 补全支持(Greg Sabino Mullane)
为
\timing新增可选的on/off参数(David Fetter)在多行上显示访问控制权限(Brendan Jurd、Andreas Scherbaum)
让
\l显示数据库访问权限(Andrew Gilligan)让
\l+显示数据库大小(如果权限允许)(Andrew Gilligan)新增
\ef命令来编辑函数定义(Abhijit Menon-Sen)
E.23.3.8.2. psql \d* 命令
让没有模式参数的
\d*命令只在指定S修饰符时显示系统对象(Greg Sabino Mullane、Bruce)以前的行为在不同的
\d变体之间不一致,而且在大多数情况下没有提供只查看用户对象的简便方法。改进
\d*命令,使其能用于较旧的 PostgreSQL 服务器版本(可追溯到 7.4),而不仅是当前服务器版本(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.23.3.8.3. pg_dump
为 pg_dump/pg_dumpall/pg_restore 新增
--no-tablespaces选项,使转储可以恢复到表空间布局不匹配的集群(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.23.3.9. 编程工具
E.23.3.9.1. libpq
允许在导入大对象时指定
OID,通过新函数lo_import_with_oid()(Tatsuo)新增“事件”支持(Andrew Chernow、Merlin Moncure)
这新增了注册回调来管理与
PGconn和PGresult对象关联的私有数据的能力。改进错误处理,允许多条错误消息作为多行错误报告返回(Magnus)
让
PQexecParams()及相关函数对空查询返回PGRES_EMPTY_QUERY(Tom)它们以前返回
PGRES_COMMAND_OK。记录如何避免 Windows 上
WSACleanup()的开销(Andrew Chernow)不依赖 Kerberos 票据来确定默认数据库用户名(Magnus)
此前,支持 Kerberos 的 libpq 构建会把任何可用 Kerberos 票据中的主体名用作默认数据库用户名,即使连接没有使用 Kerberos 认证。这被认为不一致且令人困惑。现在默认用户名的确定方式在有或没有 Kerberos 时相同。但注意,使用 Kerberos 认证时数据库用户名仍必须与票据匹配。
E.23.3.9.2. libpq SSL(安全套接字层)支持
修复 SSL 连接的证书验证(Magnus)
libpq 现在支持在建立 SSL 连接时同时验证证书和服务器名称。如果没有可用于验证的根证书,SSL 连接将失败。
sslmode参数用于启用证书验证并设置检查级别。默认仍是不做任何验证,允许连接到启用 SSL 的服务器而不要求客户端上有根证书。支持通配符服务器证书(Magnus)
如果证书 CN 以
*开头,匹配主机名时它将被视为通配符,允许同一证书用于多个服务器。允许指定客户端证书的文件位置(Mark Woodward、Alvaro、Magnus)
新增
PQinitOpenSSL函数,允许对 OpenSSL/libcrypto 初始化有更多控制(Andrew Chernow)当没有数据库连接保持打开时,让 libpq 注销其 OpenSSL 回调(Bruce、Magnus、Russell Smith)
这对卸载 libpq 库的应用程序是必需的,否则无效的 OpenSSL 回调将残留。
E.23.3.9.3. ecpg
新增消息的本地化支持(Euler Taveira de Oliveira)
ecpg 解析器现在从服务器解析器自动生成(Michael)
此前 ecpg 解析器是手工维护的。
E.23.3.9.4. 服务器编程接口(SPI)
新增对外线参数的单次使用计划的支持(Tom)
为
SPI_execute()新增SPI_OK_REWRITTEN返回码(Heikki)这在命令被重写为另一种类型的命令时使用。
从
executor/spi.h中移除不必要的包含(Tom)使用 SPI 的模块如果依赖
spi.h替它们包含内容,可能需要添加一些#include行。
E.23.3.10. 构建选项
更新构建系统以使用 Autoconf 2.61(Peter)
源代码构建需要 GNU bison(Peter)
这实际上多年来已是必需,但现在不再有声称支持其他解析器工具的基础设施。
新增 pg_config 的
--htmldir选项(Peter)在服务器内部按值传递
float4(Zoltan Boszormenyi)新增 configure 选项
--disable-float4-byval以使用旧行为。使用旧式(版本 0)调用约定并传递或返回float4值的外部 C 函数将被此变更破坏,因此如果有这样的函数且不想更新它们,可能需要该 configure 选项。在 64 位平台上,服务器内部按值传递
float8、int8及相关数据类型(Zoltan Boszormenyi)新增 configure 选项
--disable-float8-byval以使用旧行为。如上所述,此变更可能破坏旧式外部 C 函数。新增 configure 选项
--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.23.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 字符串与
textdatum 之间的转换(Brendan Jurd、Tom)清理
include/catalog/头文件,使前端程序可以包含它们而不必包含postgres.h(Zdenek Kotala)让
name按 char 对齐,并抑制索引中name条目的零填充(Tom)如果动态装载的代码执行
exit(),更好地恢复(Tom)新增钩子让插件监控执行器(Itagaki Takahiro)
新增钩子,允许覆盖规划器的统计信息查找行为(Simon Riggs)
为自定义共享内存需求新增
shmem_startup_hook()(Tom)把索引访问方法
amgetmulti入口点替换为amgetbitmap,并扩展amgettuple的 API 以支持运行时确定操作符有损性(Heikki、Tom、Teodor)GIN 和 GiST 操作符类
consistent函数的 API 也被扩展了。新增 GIN 索引中部分匹配搜索的支持(Teodor Sigaev、Oleg Bartunov)
把
pg_class列reltriggers替换为布尔relhastriggers(Simon)同时移除未使用的
pg_class列relukeys、relfkeys和relrefs。向
pg_class新增relistemp列,便于识别临时表(Tom)把平台 FAQ 移入主文档(Peter)
防止解析器输入文件在有冲突的状态下构建(Peter)
新增对
KOI8U(乌克兰语)编码的支持(Peter)新增日语消息翻译(Japan PostgreSQL Users Group)
这以前作为独立项目维护。
修复在 MSVC 构建的系统上设置
LC_MESSAGES的问题(Hiroshi Inoue、Hiroshi Saito、Magnus)
E.23.3.12. 附加模块
新增
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)这是一个小的安全增强。
为
contrib/pageinspect新增fsm_page_contents()(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)