E.100. 版本 9.0 #
发行日期:. 2010-09-20
E.100.1. 概述
这个 PostgreSQL 版本添加了人们多年来请求的特性,如易于使用的复制、批量权限修改工具以及匿名代码块。虽然过去的大版本在范围上偏保守,但本版本展现出提供 PostgreSQL 新老用户都会拥抱的功能的大胆新愿望。这一切都是在极少不兼容的情况下完成的。主要增强包括:
基于日志传送的内建复制。这一进步由两个特性组成:流复制(允许通过网络连接把连续归档(WAL)文件流式传输到备库服务器)和热备(允许连续归档备库服务器执行只读查询)。最终效果是支持一主多只读从库。
更简便的数据库对象权限管理。
GRANT/REVOKE IN SCHEMA支持对现有对象批量修改权限,而ALTER DEFAULT PRIVILEGES允许控制未来创建的对象的权限。大对象(BLOB)现在也支持权限管理。广泛增强的存储过程支持。
DO语句支持临时或“匿名”代码块。函数现在可以使用命名参数调用。PL/pgSQL 现在默认安装,PL/Perl 和 PL/Python 在多个方面得到增强,包括对 Python3 的支持。对 64 位 Windows 的完整支持。
更高级的报表查询,包括额外的窗口选项(
PRECEDING和FOLLOWING)以及控制值被馈送给聚合函数的顺序的能力。新的触发器特性,包括符合 SQL 标准的逐列触发器和条件触发器执行。
可延迟的唯一约束。现在无需技巧即可对唯一键做批量更新。
排他约束。它们提供唯一约束的泛化版本,允许强制执行复杂条件。
新增和增强的安全特性,包括 RADIUS 认证、LDAP 认证改进,以及用于测试口令强度的新 contrib 模块
passwordcheck。LISTEN/NOTIFY特性的新高性能实现。未决事件现在存储在基于内存的队列而不是表中。此外,每个事件可以随附一个“载荷”字符串,而不是像以前那样只传递事件名。VACUUM FULL的新实现。该命令现在重写整个表和索引,而不是移动单个行来压缩空间。它在大多数情况下明显更快,而且不再导致索引膨胀。新 contrib 模块
pg_upgrade,支持从 8.3 或 8.4 就地升级到 9.0。针对特定类型查询的多项性能增强,包括消除不必要的连接。这有助于优化一些自动生成的查询,例如对象关系映射器(ORM)生成的查询。
EXPLAIN增强。输出现在可采用 JSON、XML 或 YAML 格式,并包含缓冲区利用情况和其他以前无法获得的数据。hstore改进,包括新函数和更大的数据容量。
上述各项在下面的章节中有更详细的说明。
E.100.2. 迁移到版本 9.0
对于希望从任何早期版本迁移数据的用户,需要使用 pg_dump 进行转储/恢复,或者使用 pg_upgrade。
版本 9.0 包含一些为支持新特性和代码质量改进而有选择地破坏向后兼容性的变更。特别是,大量使用 PL/pgSQL、时间点恢复(PITR)或温备的用户应测试其应用,因为这些领域有轻微的用户可见变化。请注意以下不兼容之处:
E.100.2.1. 服务器设置
移除服务器参数
add_missing_from(多年来默认关闭)(Tom Lane)移除服务器参数
regex_flavor(多年来默认为advanced)(Tom Lane)archive_mode现在只影响archive_command;新设置wal_level影响预写式日志的内容(Heikki Linnakangas)log_temp_files现在默认文件大小单位为千字节(Robert Haas)
E.100.2.2. 查询
查询父表时,不再对作为查询一部分被扫描的子表做单独的权限检查(Peter Eisentraut)
SQL 标准规定了这种行为,而且实践中它也比此前同时检查每个子表和父表权限的行为方便得多。
E.100.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.100.2.4. 对象重命名
当子表从多个不相关的父表继承同一列时,收紧
RENAME期间列名一致性的强制(KaiGai Kohei)不再在底层表列被重命名时自动重命名索引和索引列(Tom Lane)
管理员仍可以手工重命名这类索引和列。此变更需要更新 JDBC 驱动(可能还有其他驱动),以便重命名后仍能正确识别唯一索引。
CREATE OR REPLACE FUNCTION不再能更改函数参数的声明名称(Pavel Stehule)为了避免在命名参数调用中产生歧义,不再允许更改现有函数声明中输入参数的别名(但仍可为此前未命名的参数指定名称)。现在必须
DROP并重建函数才能做到这一点。
E.100.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.fldFROM ...fld是组合类型,也被视为标量赋值。现在它被视为记录赋值,与INTO目标是组合类型的常规变量时相同。因此,要赋给字段各子字段的值应写成SELECT列表的单独列,而不是像以前版本那样写成ROW(...)构造。如果需要以同时适用于 9.0 和以前版本的方式做到这一点,可以写成类似
。rec.fld:= ROW(...) FROM ...移除 PL/pgSQL 的
RENAME声明(Tom Lane)用
ALIAS取代RENAME,它现在可以为任何变量创建别名,而不再像以前那样只能用于美元符号参数名(如$1)。
E.100.2.6. 其他不兼容之处
废弃把
=>用作操作符名(Robert Haas)为了支持 SQL 标准的命名函数参数记法,未来版本的 PostgreSQL 可能会完全拒绝此操作符名。目前它仍被允许,但定义此类操作符时会发出警告。
移除对没有可用 64 位整数数据类型的平台的支持(Tom Lane)
据信所有仍受支持的平台都有可用的 64 位整数数据类型。
E.100.3. 变更
版本 9.0 拥有前所未有的数量的重大新特性,以及 200 多项增强、改进、新命令、新函数和其他变更。
E.100.3.1. 服务器
E.100.3.1.1. 连续归档和流复制
PostgreSQL 现有的备库服务器能力得到扩展,既支持在备库服务器上执行只读查询,又大幅减少主库与备库之间的延迟。对许多用户而言,这将成为一种有用且低管理成本的复制形式,无论用于高可用还是水平扩展。
允许备库服务器接受只读查询(Simon Riggs、Heikki Linnakangas)
此特性称为热备。有新的
postgresql.conf和recovery.conf设置控制此特性,并有详尽的文档。允许把预写式日志(WAL)数据流式传输到备库服务器(Fujii Masao、Heikki Linnakangas)
此特性称为流复制。此前 WAL 数据只能以整个 WAL 文件(通常每个 16 MB)为单位发送到备库服务器。流复制消除了这种低效,使主库上的更新能以极小延迟传播到备库服务器。有新的
postgresql.conf和recovery.conf设置控制此特性,并有详尽的文档。新增
pg_last_xlog_receive_location()和pg_last_xlog_replay_location(),可用于监控备库服务器的 WAL 活动(Simon Riggs、Fujii Masao、Heikki Linnakangas)
E.100.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.100.3.1.3. 优化器
移除不必要的外连接(Robert Haas)
内侧唯一且未被连接以上引用的外连接是不必要的,因此现在会被移除。这将加速许多自动生成的查询,例如对象关系映射器(ORM)创建的查询。
允许
IS NOT NULL限制使用索引(Tom Lane)这在包含大量空值的索引中查找
MAX()/MIN()值时特别有用。改进优化器关于何时使用物化节点、以及
DISTINCT用排序还是哈希的选择(Tom Lane)改进优化器对涉及
boolean<>操作符的表达式的等价检测(Tom Lane)
E.100.3.1.4. GEQO
让 GEQO 每次规划查询时使用相同的随机种子(Andres Freund)
虽然遗传查询优化器(GEQO)仍然随机选择计划,但它现在对相同查询总是选择相同的随机计划,从而给出更一致的性能。可以修改
geqo_seed来试验其他计划。改进 GEQO 计划选择(Tom Lane)
这避免了罕见的 “failed to make a valid plan” 错误,还应能改进规划速度。
E.100.3.1.5. 优化器统计
改进
ANALYZE,使其支持继承树统计信息(Tom Lane)这对分区表特别有用。但自动清理尚不会在子表变化时自动重新分析父表。
改进自动清理对何时需要重新分析的检测(Tom Lane)
改进优化器对大于/小于比较的估计(Tom Lane)
在查找大于/小于比较的统计信息时,如果比较值位于第一个或最后一个直方图桶中,则使用索引(如果可用)获取该列当前的実際最小值或最大值。这大幅改进了对数据范围端点附近比较值的估计准确性,尤其是当范围因新数据的添加而不断变化时。
允许使用
ALTER TABLE设置不同值数量统计信息(Robert Haas)这允许用户覆盖某列不同值的估计数量或百分比。此统计信息通常由
ANALYZE计算,但估计可能不佳,尤其是在行数非常多的表上。
E.100.3.1.6. 认证
E.100.3.1.7. 监控
新增客户端设置应用名的能力,它显示在
pg_stat_activity中(Dave Page)这允许管理员按源应用刻画数据库流量并排查问题。
为
log_line_prefix新增 SQLSTATE 选项(%e)(Guillaume Smet)这允许用户按错误码编号汇总错误和消息的统计信息。
以 UTF16 编码写入 Windows 事件日志(Itagaki Takahiro)
现在 Windows 上的 PostgreSQL 日志消息有了真正的多语言支持。
E.100.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.100.3.1.9. 服务器设置
允许基于数据库/角色组合设置配置参数(Alvaro Herrera)
此前只能按数据库和按角色设置,不能组合。所有角色和数据库设置现在存储在新的
pg_db_role_setting系统目录中。新的 psql 命令\drds显示这些设置。传统系统视图pg_roles、pg_shadow和pg_user不显示组合设置,因此不再完全表示用户或数据库的配置。新增服务器参数
bonjour,控制启用 Bonjour 的服务器是否通过 Bonjour 宣告自身(Tom Lane)默认为关闭,即不宣告。这使打包者可以分发启用 Bonjour 的构建,而不必担心个别用户不想要此特性。
新增服务器参数
enable_material,控制优化器对物化节点的使用(Robert Haas)默认为开启。关闭时,优化器不会纯粹出于性能原因添加物化节点,但在正确性需要时仍会使用。
更改服务器参数
log_temp_files,使其默认文件大小单位为千字节(Robert Haas)此前如果未指定单位,此设置按字节解释。
在重新加载
postgresql.conf时记录参数值的变更(Peter Eisentraut)这使管理员和安全人员可以审计数据库设置的变更,而且对检查
postgresql.conf编辑的效果也非常方便。对自定义服务器参数正确强制超级用户权限(Tom Lane)
非超级用户不再能对服务器当前未知的参数发出
ALTER ROLE/DATABASE SET。这使服务器能够正确检查仅超级用户参数只由超级用户设置。此前,SET会被允许,然后在会话启动时被忽略,使仅超级用户自定义参数远不如应有的有用。
E.100.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/nPRECEDINGFOLLOWING选项。让
SELECT INTO和CREATE TABLE AS在其命令标签中向客户端返回行数(Boszormenyi Zoltan)这可以省去一整次到客户端的往返,允许在不需要额外
COUNT查询的情况下计算结果数和分页。
E.100.3.3. 对象操作
通过推迟刷盘加速
CREATE DATABASE(Andres Freund、Greg Stark)只允许对表、视图和组合类型的列加注释,不允许对索引和 TOAST 表等其他关系类型(Tom Lane)
允许创建不含任何值的枚举类型(Bruce Momjian)
让存储类型为
MAIN的列值保留在主堆页上,除非行放不进一个页面(Kevin Grittner)此前
MAIN值会被强制移出到 TOAST 表,直到行大小小于页面大小的四分之一。
E.100.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时的失败(Tom Lane)tableADD COLUMNcolserial
E.100.3.3.2. CREATE TABLE
为
CREATE TABLE ... LIKE命令新增复制COMMENTS和STORAGE设置的支持(Itagaki Takahiro)为
CREATE TABLE ... LIKE命令新增复制所有属性的快捷方式(Itagaki Takahiro)新增 SQL 标准的
CREATE TABLE ... OF命令(Peter Eisentraut)type这允许创建匹配现有组合类型的表。命令中还可以指定额外的约束和默认值。
E.100.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.100.3.3.4. 对象权限
新增使用新的
GRANT/REVOKE IN SCHEMA子句在整个模式内批量修改权限的能力(Petr Jelinek)这简化了对象权限的管理,并使为应用数据安全利用数据库角色更加容易。
新增
ALTER DEFAULT PRIVILEGES命令,用于控制稍后创建的对象的权限(Petr Jelinek)这大幅简化了复杂数据库应用中对象权限的分配。可以为表、视图、序列和函数设置默认权限。默认值可以按模式分配,也可以数据库范围分配。
新增用
GRANT/REVOKE控制大对象(BLOB)权限的能力(KaiGai Kohei)此前任何数据库用户都可以读取或修改任何大对象。现在可以逐大对象授予和撤销读写权限,并且会跟踪大对象的所有权。
E.100.3.4. 工具操作
E.100.3.4.1. COPY
接受
COPY ... CSV FORCE QUOTE *(Itagaki Takahiro)现在
*可用作FORCE QUOTE子句中“所有列”的简写。新增允许在括号内指定选项的
COPY语法(Robert Haas、Emmanuel Cecchet)这为未来的
COPY选项提供了更大的灵活性。仍支持旧语法,但只用于既有选项。
E.100.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.100.3.4.3. VACUUM
更改
VACUUM FULL,使其重写整个表并重建其索引,而不是移动单个行来压缩空间(Itagaki Takahiro、Tom Lane)以前的方法通常更慢并导致索引膨胀。注意新方法在
VACUUM FULL期间会暂时使用更多磁盘空间;可能多达表及其索引通常占用空间的两倍。新增允许在括号内指定选项的
VACUUM语法(Itagaki Takahiro)这为未来的
VACUUM选项提供了更大的灵活性。仍支持旧语法,但只用于既有选项。
E.100.3.4.4. 索引
允许在
CREATE INDEX中省略索引名以自动命名索引(Tom Lane)默认情况下,多列索引现在以所有列命名;索引表达式列现在基于其表达式命名(Tom Lane)
重建共享系统目录的索引现在完全是事务性且崩溃安全的(Tom Lane)
此前,重建共享索引只允许在独立模式下进行,而且操作期间崩溃可能使索引处于比之前更糟的状态。
为 GiST 新增
point_ops操作符类(Teodor Sigaev)此特性允许对
point列建立 GiST 索引。该索引可用于多种类型的查询,例如point<@polygon(点在多边形内)。这应能使许多 PostGIS 查询更快。在 GIN 索引创建中使用红黑二叉树(Teodor Sigaev)
红黑树是自平衡的。这避免了输入以非随机顺序出现时的变慢。
E.100.3.5. 数据类型
允许
bytea值以十六进制记法书写(Peter Eisentraut)服务器参数
bytea_output控制bytea输出使用十六进制还是传统格式。Libpq 的PQescapeByteaConn()函数在连接 PostgreSQL 9.0 或更新服务器时自动使用十六进制格式。但 9.0 之前的 libpq 版本无法正确处理来自更新服务器的十六进制格式。新的十六进制格式与更多使用二进制数据的应用直接兼容,使它们无需额外转换即可存储和获取。它的读写也明显快于传统格式。
允许把服务器参数 extra_float_digits 增大到
3(Tom Lane)此前
extra_float_digits的最大设置为2。有些情况需要 3 位数字才能精确转储和恢复float4值。pg_dump 现在在从允许它的服务器转储时将使用设置 3。收紧对
int2vector值的输入检查(Caleb Welton)
E.100.3.5.1. Full Text Search
在
synonym词典中新增前缀支持(Teodor Sigaev)新增过滤词典(Teodor Sigaev)
过滤词典允许先修改词元再传递给后续词典。
允许电子邮件地址词元中包含下划线(Teodor Sigaev)
使用更符合标准的规则解析 URL 词元(Tom Lane)
E.100.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()在Y、YY和YYY规范中遵循FM(填充模式)(Bruce Momjian、Tom Lane)YYYY此前已遵循它。修复
to_char(),使其在 Windows 上以正确的编码输出本地化的数字和货币字符串(Hiroshi Inoue、Itagaki Takahiro、Bruce Momjian)修正多边形的“重叠”和“包含”运算的计算(Teodor Sigaev)
多边形
&&(重叠)操作符此前只检查两个多边形的边界框是否重叠。现在它做更正确的检查。多边形@>和<@(包含/被包含)操作符此前检查一个多边形的所有顶点是否都包含在另一个中;这对某些非凸多边形可能错误地报告“真”。现在它们检查一个多边形的所有线段都包含在另一个中。
E.100.3.6.1. 聚合
允许聚合函数使用
ORDER BY(Andrew Gierth)例如,现在支持:
array_agg(a ORDER BY b)。这对输入值顺序很重要的聚合很有用,并消除了使用非标准子查询来确定排序的需要。多参数聚合函数现在可以使用
DISTINCT(Andrew Gierth)新增聚合函数
string_agg(),用于把值组合成单个字符串(Pavel Stehule)如果聚合转换函数未标记为
STRICT,以DISTINCT调用的聚合函数现在会被传递 NULL 值(Andrew Gierth)例如,
agg(DISTINCT x)可能会把 NULL 的x值传递给agg()。这与非DISTINCT情况下的行为更一致。
E.100.3.6.2. 位串
E.100.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.100.3.6.4. 函数和触发器创建
支持使用
DO语句执行匿名代码块(Petr Jelinek、Joshua Tolley、Hannu Valtonen)这允许执行服务器端代码而无需创建和删除临时函数定义。可以用用户有权定义函数的任何语言执行代码。
实现符合 SQL 标准的逐列触发器(Itagaki Takahiro)
这类触发器只在指定列受查询影响(例如出现在
UPDATE的SET列表中)时触发。为
CREATE TRIGGER新增WHEN子句,允许控制触发器是否触发(Itagaki Takahiro)虽然同类检查总是可以在触发器内部执行,但在外部
WHEN子句中执行可能有性能收益。
E.100.3.7. 服务器端语言
为
CREATE LANGUAGE新增OR REPLACE子句(Tom Lane)这有助于在语言尚不存在时选择性地安装它,而且在 PL/pgSQL 默认安装的现在特别有用。
E.100.3.7.1. PL/pgSQL Server-Side Language
默认安装 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,因此函数代码不能更改它们的值。此限制已被移除,以简化从没有等效限制的其他 DBMS 移植函数。输入参数现在就像初始化为传入值的局部变量。改进 PL/pgSQL 的错误位置报告(Tom Lane)
为 PL/pgSQL 的
MOVE FORWARD/BACKWARD新增count和ALL选项(Pavel Stehule)允许 PL/pgSQL 的
WHERE CURRENT OF使用游标变量(Tom Lane)允许 PL/pgSQL 的
OPEN使用参数(Pavel Stehule、Itagaki Takahiro)cursorFOR EXECUTE这通过新的
USING子句实现。
E.100.3.7.2. PL/Perl Server-Side Language
新增 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.100.3.7.3. PL/Python Server-Side Language
在 PL/Python 中新增 Unicode 支持(Peter Eisentraut)
字符串会根据需要自动与服务器编码相互转换。
改进 PL/Python 的
bytea支持(Caleb Welton)传入 PL/Python 的
bytea值现在表示为二进制而不是 PostgreSQL 的bytea文本格式。包含空字节的bytea值现在也能从 PL/Python 正确输出。布尔、整数和浮点值的传递也得到了改进。支持在 PL/Python 中使用数组作为参数和返回值(Peter Eisentraut)
改进 SQL 域到 Python 类型的映射(Peter Eisentraut)
为 PL/Python 新增 Python 3 支持(Peter Eisentraut)
新的服务器端语言名为
plpython3u。它不能与 Python 2 服务器端语言在同一会话中使用。改进 PL/Python 的错误位置和异常报告(Peter Eisentraut)
E.100.3.8. 客户端应用程序
为
vacuumdb新增--analyze-only选项,只分析不清理(Bruce Momjian)
E.100.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 的 Tab 补全支持(Itagaki Takahiro)
只要启用了
\timing就显示其输出,无论是否处于“安静”模式(Peter Eisentraut)
E.100.3.8.1.1. psql Display
改进 psql 中换行列的显示(Roger Leigh)
此行为现在是默认。以前的格式可以通过
\pset linestyle old-ascii使用。允许 psql 通过
\pset linestyle unicode使用精致的 Unicode 画线字符(Roger Leigh)
E.100.3.8.1.2. psql \d
Commands
让
\d显示继承自指定父表的子表(Damien Clochard)\d只显示子表数量,而\d+显示所有子表的名称。在
\d index_name中显示索引列的定义(Khee Chin)该定义对表达式索引很有用。
只在
\d+而不是\d中显示视图的定义查询(Peter Eisentraut)始终包含查询被认为过于冗长。
E.100.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.100.3.8.3. pg_ctl
允许在系统重启期间安全地用 pg_ctl 启动 postmaster(Tom Lane)
此前,pg_ctl 的父进程可能基于过期的 postmaster 锁文件被误识别为运行中的 postmaster,导致数据库瞬时启动失败。
赋予 pg_ctl 初始化数据库的能力(通过调用 initdb)(Zdenek Kotala)
E.100.3.9. Development Tools
E.100.3.9.1. libpq
新增 libpq 函数
PQconnectdbParams()和PQconnectStartParams()(Guillaume Lelarge)这些函数类似于
PQconnectdb()和PQconnectStart(),只是它们接受以空结尾的连接选项数组,而不是要求在单个字符串中提供所有选项。新增 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)
TCP 连接的服务器端此前已支持 keepalive 设置。
在提供替代方法的平台上,避免 libpq 中为阻塞和取消阻塞
SIGPIPE而进行的额外系统调用(Jeremy Kerr)当
.pgpass提供的口令失败时,在错误消息中说明口令来源(Bruce Momjian)加载客户端证书文件中给出的所有 SSL 证书(Tom Lane)
这改进了对间接签名 SSL 证书的支持。
E.100.3.9.2. ecpg
为 ecpg 新增 SQLDA(SQL 描述符区域)支持(Boszormenyi Zoltan)
为 ecpg 新增
DESCRIBE[OUTPUT] 语句(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.100.3.9.2.1. ecpg Cursors
在 ecpg 的本机模式中新增范围外游标支持(Boszormenyi Zoltan)
这允许
DECLARE使用OPEN被调用时不在作用域内的变量。此机制在 ecpg 的 Informix 兼容模式中早已存在。允许 ecpg 中的动态游标名(Boszormenyi Zoltan)
允许 ecpg 在
FETCH和MOVE中使用噪声词FROM和IN(Boszormenyi Zoltan)
E.100.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.100.3.10.1. Makefile
新的
Makefile目标world、install-world和installcheck-world(Andrew Dunstan)它们类似于现有的
all、install和installcheck目标,但它们还构建 HTML 文档、构建并测试contrib,并测试服务器端语言和 ecpg。为 PGXS Makefile 新增数据和文档安装位置控制(Mark Cave-Ayland)
新增 Makefile 规则,把 PostgreSQL 文档构建为单个 HTML 文件或单个纯文本文件(Peter Eisentraut、Bruce Momjian)
E.100.3.10.2. Windows
支持在 64 位 Windows 上编译并以 64 位模式运行(Tsutomu Yamada、Magnus Hagander)
这允许在 Windows 上使用大型共享内存。
支持使用 Visual Studio 2008 构建服务器(Magnus Hagander)
E.100.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_PASSWORDSQLSTATE错误码(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.100.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.100.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.100.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.100.3.11.4. 服务器钩子
新增用于处理 ColumnRef 和 ParamRef 节点的解析器钩子(Tom Lane)
新增 ProcessUtility 钩子,使可加载模块可以控制工具命令(Itagaki Takahiro)
E.100.3.11.5. 二进制升级支持
新增
contrib/pg_upgrade以支持就地升级(Bruce Momjian)这避免了升级到 PostgreSQL 新大版本时转储/重载数据库的要求,从而把停机时间降低了数量级。它支持从 PostgreSQL 8.3 和 8.4 升级到 9.0。
新增在二进制升级期间保留关系
relfilenode值的支持(Bruce Momjian)新增在二进制升级期间保留
pg_type和pg_enumOID 的支持(Bruce Momjian)把表空间内的数据文件移到 PostgreSQL 版本特定的子目录中(Bruce Momjian)
这简化了二进制升级。
E.100.3.12. 附加模块
为
contrib/pgbench新增多线程选项(-j)(Itagaki Takahiro)这允许 pgbench 使用多个 CPU,降低 pgbench 本身成为测试瓶颈的风险。
为
contrib/pgbench新增\shell和\setshell元命令(Michael Paquier)contrib/dict_xsyn的新特性(Sergey Karpov)新选项为
matchorig、matchsynonyms和keepsynonyms。新增全文词典
contrib/unaccent(Teodor Sigaev)这个过滤词典移除字母上的重音符号,使跨多种语言的全文搜索容易得多。
为
contrib/dblink新增dblink_get_notify()(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)