企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# E.8\. 版本9.2 > **发布日期:** 2012-09-10 ## E.8.1\. 概述 此版本主要集中在性能上的改进,但新的SQL功能不缺乏。工作在备份支持领域继续进行。主要功能包括: * 允许查询从索引中检索数据,避免堆访问(_索引扫描_) * 即使当使用预备语句时,允许规划器为特定参数值产生自定义规划 * 提高规划器使用嵌套循环内部索引扫描的能力 * 允许流复制转发数据到其他从属([_级联复制_](#calibre_link-1438)) * 允许[pg_basebackup](#calibre_link-471)执行来自备用服务器的基础备份 * 添加[pg_receivexlog](#calibre_link-464)工具以归档作为他们写入的WAL文件 * 添加[SP-GiST](#calibre_link-550) (空间划分GiST)索引访问方法 * 添加[range data types](#calibre_link-1153)支持 * 添加[`JSON`](#calibre_link-1753)数据类型 * 为视图增加[`security_barrier`](#calibre_link-473)选项 * 允许libpq连接字符串有[URI](#calibre_link-458)的格式 * 添加[单行处理模式](#calibre_link-626)到libpq 更好的处理大的结果集 以上项的更多详情在下面的章节有介绍。 ## E.8.2\. 迁移到版本9.2 使用pg_dump转储/恢复,或者使用pg_upgrade 从任何以前版本中迁移数据。 版本9.2包含可能影响与先前版本的兼容性的一些变化。 观察下面的不兼容: ### E.8.2.1\. 系统目录 * 从[`pg_tablespace`](#calibre_link-523)中删除`spclocation`字段(Magnus Hagander) 该字段实际上定义表空间位置的符号链接的复制,从而当移动表空间时,可能有遗漏错误风险。 在服务器关闭时,通过手动调节符号链接,这种变化允许删除表空间目录。 为了替换该字段,我们添加[`pg_tablespace_location()`](#calibre_link-2243) 允许符号链接查询。 * 移动`tsvector`最常见元素统计到新的[`pg_stats`](#calibre_link-771)列(Alexander Korotkov) 为了在`most_common_vals` 和`most_common_freqs`的`tsvector`列中可用的原先的数据 查询`most_common_elems`和`most_common_elem_freqs`。 ### E.8.2.2\. 函数 * 删除[hstore](#calibre_link-382)'s `=>`操作符(Robert Haas) 用户应该使用`hstore(text, text)`。 自PostgreSQL 9.0, 当创建命名`=>`的操作符,则发出一个警告信息。 因为SQL标准保留了另一个使用的标记。 * 确保[`xpath()`](#calibre_link-1976)在字符串值中逃逸特殊字符(Florian Pflug) 倘若没有这个,那么对于结果可能不是有效的XML。 * 使用[`pg_relation_size()`](#calibre_link-1933) 并且如果该对象不存在则返回空(Phil Sorber) 这可以防止查询调用这些函数从并发`DROP`后立即返回错误。 * 使用[`EXTRACT(EPOCH FROM `_timestamp without time zone_`)`](#calibre_link-1876)从当地午夜测量时间,而不是UTC午夜(Tom Lane) 这一变化恢复在版本7.3中缺乏考虑的变化。 从UTC午夜测量是不一致的, 因为它使结果依赖于[`timezone`](#calibre_link-793)设置, 这不应该有`timestamp without time zone`的计算。以前的操作仍然可以通过映射输入 值到`timestamp with time zone`可用。 * 正确解析带有尾随`yesterday`,`today`和`tomorrow`的时间字符串(Dean Rasheed) 先前`SELECT '04:00:00 yesterday'::timestamp`返回午夜时yesterday的日期。 * 修复[`to_date()`](#calibre_link-800)和 `to_timestamp()`以封装不完整日期到2020(Bruce Momjian) 先前,提供年以及不一致封装低于四位的年掩码。 ### E.8.2.3\. 对象修改 * 防止[`ALTER DOMAIN`](#calibre_link-568)工作于非域类型上(Peter Eisentraut) 在非域类型上所有者和模式变化是可能的。 * 在[`CREATE FUNCTION`](#calibre_link-4)中 不再强制小写过程语言名字(Robert Haas) 当反引号语言标识符仍然是小写字母时,字符串和带引号的标识符不再强行向下。 因此,例如`CREATE FUNCTION ... LANGUAGE 'C'`将不再工作; 它必须拼写`'c'`,或更好地省略引号。 * 改变外键执行触发器系统产生的名称(Tom Lane) 这一变化确保在涉及自我参照的外键约束的情况下以正确的顺序触发触发器。 ### E.8.2.4\. 命令行工具 * 提供一致的反引号,变量扩张, 以及[psql](#calibre_link-23)元命令参数中的引用子字符串操作(Tom Lane) 以前,当不通过相邻文本空白分隔的时候。奇怪地处理这种引用。 例如`'FOO'BAR`作为`FOO BAR`被输出 (空间意外插入)并且`FOO'BAR'BAZ`输出不变(不删除期望的引用)。 * 不再将[clusterdb](#calibre_link-1612)表名看作双引号; 不再将[reindexdb](#calibre_link-1029)表和索引名看作双引号(Bruce Momjian) 如果希望引用,那么用户现在必须在命令参数中包含双引号。 * [createuser](#calibre_link-22)缺省不再提示选项设置(Peter Eisentraut) 使用`--interactive`获得旧的操作。 * 禁用[dropuser](#calibre_link-45)中的用户名提示, 除非指定`--interactive`(Peter Eisentraut) ### E.8.2.5\. 服务器设置 * 添加服务器参数以指定[服务器端SSL文件位置](#calibre_link-1389) 这允许改变名字和文件位置,该文件先前作为`server.crt`, `server.key`, `root.crt`和数据目录中 `root.crl`的硬编码。_缺省时服务器将不再检查`root.crt`或者 `root.crl`_;加载这些文件,相关参数必须设置为非缺省值。 * 删除`silent_mode`参数(Heikki Linnakangas) 可以使用`pg_ctl start -l postmaster.log`获得类似操作。 * 删除不再需要的`wal_sender_delay`参数(Tom Lane) * 删除`custom_variable_classes`参数(Tom Lane) 通过该设置提供的检查是含糊的。现在可以以任何类名作为任何设置前缀。 ### E.8.2.6\. 监控 * 重命名[`pg_stat_activity`](#calibre_link-1440)`.procpid` 到`pid`,匹配其他系统表(Magnus Hagander) * 创建一个单一的`pg_stat_activity`列以报告进程状态(Scott Mead, Magnus Hagander) 先前的`query`和`query_start`值现在仍然可用于空闲会话, 允许增强分析。 * 当查询完成时,重命名`pg_stat_activity`.`current_query`到 `query`,因为它是不清楚的(Magnus Hagander) * 改变所有SQL级别统计时序值到以毫秒计的`float8`列 这种变化消除设计假设该值精确到微秒,没有更多的(因为`float8`值可以是分数)。 受影响的列:`pg_stat_user_functions`.`total_time`,`pg_stat_user_functions`.`self_time`,`pg_stat_xact_user_functions`.`total_time`, 和`pg_stat_xact_user_functions`.`self_time`。 潜在这些列的统计函数现在返回`float8`毫秒,而不是`bigint` 微秒。现在以毫秒测量`contrib/pg_stat_statements`的`total_time`列。 ## E.8.3\. 变化 下面你将发现在PostgreSQL 9.2和先前主要版本之间变化的详细情况。 ### E.8.3.1\. 服务器 #### E.8.3.1.1\. 性能 * 允许查询只从索引中检索数据,避免堆访问(Robert Haas, Ibrar Ahmed, Heikki Linnakangas, Tom Lane) 此功能通常被称为_只索引扫描_。 为了只包含对所有会话可见的元组堆页可以忽略堆访问, 正如可见视图报道的;因此该效益主要适用于大多数静态数据。可见视图将损坏安全作为 执行该功能的必要组成部分。 * 增加[SP-GiST](#calibre_link-550)(空间划分GiST)索引访问方法(Teodor Sigaev, Oleg Bartunov, Tom Lane) SP-GiST与GIST的灵活性相比较,但支持不平衡分段搜索结构而不是平衡树。 为了适当的问题,SP-GiST在索引编译时间和搜索时间上比GiST更快。 * 允许组提交在重负载下有效工作(Peter Geoghegan, Simon Riggs, Heikki Linnakangas) 此前,批量提交无效作为已增加的写入工作量,由于内部锁争用。 * 允许使用一个新的快速路径锁定机制管理未竞争锁(Robert Haas) * 减少创建虚拟事务ID锁的开销(Robert Haas) * 减少串行化隔离级别锁的开销(Dan Ports) * 提高PowerPC和Itanium spinlock性能(Manabu Ori, Robert Haas, Tom Lane) * 减少共享的无效缓存消息开销(Robert Haas) * 移动`PGPROC`共享内存数组频繁访问的成员到一个单独数组中(Pavan Deolasee, Heikki Linnakangas, Robert Haas) * 通过成批地添加元组到堆中提高`COPY`性能(Heikki Linnakangas) * 通过产生内存分配开销少的树的几何数据类型提高GiST索引性能。 * 提高GiST索引编译时间(Alexander Korotkov, Heikki Linnakangas) * 允许提示位被迅速设置为临时的和未标记表(Robert Haas) * 允许通过内联进行排序,非SQL可调用比较函数(Peter Geoghegan, Robert Haas, Tom Lane) * 增大基于[`shared_buffers`](#calibre_link-1370)的CLOG缓冲区规模数量(Robert Haas, Simon Riggs, Tom Lane) * 当删除表或者数据库时,提高发生的缓冲池扫描性能(Jeff Janes, Simon Riggs) * 当许多表被删除或截断时,提高检查点的fsync请求阵列性能(Tom Lane) * Windows上传递文件描述符安全码到子进程(Heikki Linnakangas) 这允许Windows会话使用比以前更多的打开文件描述符。 #### E.8.3.1.2\. 进程管理 * 创建一个执行检查点的专门后台进程(Simon Riggs) 原先后端写进程执行脏页写入和检查点。分离成两个过程允许每个目标可预见地完成。 * 通过快速唤醒walwriter提高异步提交操作(Simon Riggs) 以前,[`wal_writer_delay`](#calibre_link-1433)触发WAL冲洗磁盘; 现在填充WAL缓冲区也触发WAL写入。 * 在不活跃期间让bgwriter, walwriter,检查点,数据采集器,日志收集器和归档日志后端进程更有效睡眠(Peter Geoghegan, Tom Lane) 当没什么事可做的时候,这一系列的变化会降低进程唤醒频率,大幅降低空闲服务器上的功耗。 #### E.8.3.1.3\. 优化器 * 允许规划器生成特定参数的自定义规划,即使当使用预处理语句的时候(Tom Lane) 以往,一个预备语句总是有一个单一的"通用"计划被用于所有的参数值, 通常远不如用于包含显式恒定值的非预备语句规划。现在,规划器 试图生成特定参数值的自定义规划。 一个通用计划将只能用在自定义规划多次证明没有任何好处的情况。 这种变化应该消除原先从预备语句使用中见到过的性能损失(包括PL/pgSQL中的非动态语句)。 * 提高规划器使用嵌套循环内部索引扫描的能力(Tom Lane) 新的"参数化路径"机制允许内部索引扫描使用超过扫描中一个连接水平的关系值。 这可以大大提高语义限制(如外连接)允许的连接顺序的情况下的性能。 * 提高对外部数据封装器的规划API (Etsuro Fujita, Shigeru Hanada, Tom Lane) 封装器现在可以为表提供多种访问"路径",在连接规划中更加灵活。 * 识别非表关系的自相矛盾限制分句(Tom Lane) 当[`constraint_exclusion`](#calibre_link-1531) `打开`时,执行 这个检查。 * 允许`indexed_col op ANY(ARRAY[...])`条件用于纯索引扫描并且仅仅索引扫描(Tom Lane) 以前这样的条件只能用于位图索引扫描。 * 在`boolean`列上支持`MIN`/`MAX`索引优化(Marti Raudsepp) * 当估计设置行数时,解释了在`SELECT`目标列中设置返回函数的原因(Tom Lane) * 修复规划器更可靠的处理带有重复列索引(Tom Lane) * 收集并且使用数组元素次数统计(Alexander Korotkov, Tom Lane) 这种变化提高了数组`<@`, `&&`和 `@>`操作符(数组容量和重叠部分)的选择性估计。 * 允许收集外表的统计(Etsuro Fujita) * 提高使用部分索引的成本估计(Tom Lane) * 提高在子查询中引用列统计的规划器能力(Tom Lane) * 提高子查询使用`DISTINCT`的统计估计(Tom Lane) #### E.8.3.1.4\. 认证 * 不要把角色名字和 [`pg_hba.conf`](#calibre_link-656)中 声明的`samerole`看作自动包含超级用户的(Andrew Dunstan) 这使得它更容易使用组角色的`reject`行。 * 调节`pg_hba.conf`过程更加一致地处理令牌解析(Brendan Jurd, Álvaro Herrera) * 不允许空`pg_hba.conf`文件(Tom Lane) 这样做是为了更快速检测配置错误。 * 使用超级用户权限意味着复制权限(Noah Misch) 这样避免了需要明确地分配这类权限。 #### E.8.3.1.5\. 监控 * 试图在后端崩溃期间记录当前查询字符串(Marti Raudsepp) * 使得自动清理I/O活动日志更加冗长(Greg Smith, Noah Misch) 这条记录是通过[`log_autovacuum_min_duration`](#calibre_link-2304)触发的。 * 使WAL回放尽快报告错误(Fujii Masao) 一旦服务器到主模式只报告错误的情况。 * 添加[`pg_xlog_location_diff()`](#calibre_link-1794) 以简化WAL位置比较(Euler Taveira de Oliveira) 这对于计算复制滞后是有用的。 * 支持Windows上可配置的事件日志应用程序名称(MauMau, Magnus Hagander) 这允许不同的情况下使用不同的标识符事件日志, 通过设置[`event_source`](#calibre_link-1397)服务器参数, 这类似于[`syslog_ident`](#calibre_link-2305)工作方式。 * 改变"意外的块结束"消息到`DEBUG1`级别,除非有一个已打开事务(Magnus Hagander) 这种变化减少笨拙地关闭数据库连接应用导致的日志振动。 #### E.8.3.1.6\. 统计视图 * 跟踪临时文件大小和[`pg_stat_database`](#calibre_link-1453)系统视图中的文件数(Tomas Vondra) * 添加一个死锁计数器到`pg_stat_database`系统视图(Magnus Hagander) * 添加服务器参数[`track_io_timing`](#calibre_link-1369)跟踪I/O时序(Ants Aasma, Robert Haas) * 报告[`pg_stat_bgwriter`](#calibre_link-1707)中的检查点定时信息(Greg Smith, Peter Geoghegan) #### E.8.3.1.7\. 服务器设置 * 默默忽略[`search_path`](#calibre_link-738)指定的不存在的模式(Tom Lane) 这使得更加方便使用通用路径设置,可能包含一些不存在于数据库中的模式。 * 允许超级用户设置[`deadlock_timeout`](#calibre_link-1451)每个会话, 而不是每个集群(Noah Misch) 这允许为了可能涉及到死锁的事务减少`deadlock_timeout`, 因此更快地检查故障。另外,增加该值可以用于减少由于死锁选择取消会话机会。 * 添加服务器参数[`temp_file_limit`](#calibre_link-2306)限制每个会话临时文件空间使用率(Mark Kirkwood) * 在加载相关扩展之前允许超级用户`SET`扩展的超级用户自定义变量(Tom Lane) 系统现在记得是否`SET`通过超级用户被执行, 因此当加载扩展时,可以执行适当的权限检查。 * 添加[postmaster](#calibre_link-1489) `-C`选项查询配置参数(Bruce Momjian) 允许pg_ctl更好地处理`PGDATA`或者`-D`指向配置目录的情况。 * 以`CREATE DATABASE`中隐含值替换空的区域名(Tom Lane) 这可以防止服务器重启后不同地解释`pg_database`.`datcollate`或者 `datctype`的情况。 ##### E.8.3.1.7.1\. `postgresql.conf` * 允许报告`postgresql.conf`中的多个错误, 而不仅仅是第一个(Alexey Klyukin, Tom Lane) * 允许通过所有会话处理`postgresql.conf`的加载,即使有一些设置对特定会话是无效的(Alexey Klyukin) 以前,这种无效会话值可能导致所有设置变化被该会话忽略。 * 为配置文件添加一个`include_if_exists`功能(Greg Smith) 这个和`include`一样运行,除了如果忽略该文件不会抛出错误外。 * 在initdb期间识别服务器时区,并且相应设置`postgresql.conf`项 [`timezone`](#calibre_link-793)和 [`log_timezone`](#calibre_link-803) 这避免了服务器启动时昂贵的时区探测。 * 修复[`pg_settings`](#calibre_link-967)以 报告Windows上`postgresql.conf`行号(Tom Lane) ### E.8.3.2\. 备份和恢复 * 允许流复制转发数据到其他从属([_级联复制_](#calibre_link-1438))(Fujii Masao) 以前只有主服务器可以提供流复制日志文件到备用服务器。 * 添加新的[`synchronous_commit`](#calibre_link-1216) 模式`remote_write` (Fujii Masao, Simon Riggs) 该模式等待备用服务器写事务数据到它自己的操作系统,但是不等待数据被刷新到备用磁盘。 * 添加[pg_receivexlog](#calibre_link-464)工具 归档他们写入的WAL文件变化,而不是等待完成的WAL文件(Magnus Hagander) * 允许[pg_basebackup](#calibre_link-471)从 备用服务器上做基础备份(Jun Ishizuka, Fujii Masao) 该功能允许基础备份工作从主服务器上被卸载。 * 当pg_basebackup在执行备份时,允许WAL文件流(Magnus Hagander) 允许在主库上丢弃之前传递WAL文件到备库。 ### E.8.3.3\. 查询 * 如果断开客户端连接,取消运行的查询(Florian Pflug) 如果在查询中后端监测客户端连接损坏,那么它现在将取消查询而不是尝试完成它。 * 在行表达式运行时保留列名(Andrew Dunstan, Tom Lane) 当行值被转换为`hstore`或者`json`类型时:结果值字段有期望名,那么该变化允许有更好结果。 * 改善用于子-`SELECT`结果的列标签(Marti Raudsepp) 以前使用一般标签`?column?`。 * 提高决定未知值类型的探索法(Tom Lane) 当考虑多态操作符的时候, 长期规则是一个未知常量可能与现在应用它的操作者一端的值有同样类型, 而不仅仅操作符匹配。 * 关于创建映射或者来自域类型的警告(Robert Haas) 这种投射没有影响。 * 当行不能进行`CHECK`或者`NOT NULL`约束时, 显示行内容作为错误详细信息 (Jan Kundrát) 当插入或者更新处理多行时,这将很容易识别哪行是有问题的。 ### E.8.3.4\. 对象操作 * 在并行DDL中提供更可靠操作(Robert Haas, Noah Misch) 该变化增加了锁定,它应该删除多种情况中"高速缓存查找失败"错误。 另外,不再可能添加关系到正在删除的模式中,先前导致不一致系统目录内容的情况。 * 添加`CONCURRENTLY`选项到 [`DROP INDEX`](#calibre_link-602) (Simon Riggs) 允许索引删除不锁定其他会话。 * 允许外数据包有每一列选项(Shigeru Hanada) * 改进视图定义的输出(Andrew Dunstan) #### E.8.3.4.1\. 约束 * 允许[`CHECK`](#calibre_link-1538) 约束被声明为`NOT VALID` (Álvaro Herrera) 添加`NOT VALID`约束不会导致扫描的表可以验证已存在行满足该约束。 随后,检查新添加或者更新的行。当考虑`constraint_exclusion`时, 规划器忽略这些约束。因为它不确定所有行可以满足该约束。 新的`ALTER TABLE VALIDATE`命令允许为已存在 行检查`NOT VALID`限制,之后被转换成普通约束。 * 允许`CHECK`限制被声明为 `NO INHERIT` (Nikhil Sontakke, Alex Hunsaker, Álvaro Herrera) 这使得它们只在父表是可执行的,而不是子表。 * 添加该能力到[rename](#calibre_link-88)约束(Peter Eisentraut) #### E.8.3.4.2\. `ALTER` * 减少重新编译表需要以及 索引某个 [`ALTER TABLE`](#calibre_link-88)... `ALTER COLUMN TYPE`操作(Noah Misch) 增加`varchar`或者`varbit`列长度限制,或者完全删除限制,不再需要表重写。 类似地,增加`numeric`列允许的精度,或者改变约束的`numeric`列到不受约束的`numeric`, 不再需要表重写。 在涉及`interval`, `timestamp`和`timestamptz`类型的相似情况中避免表重写。 * 避免 [`ALTER TABLE`](#calibre_link-88)在 不必要的情况下验证外键约束(Noah Misch) * 增加`IF EXISTS`选项到一些`ALTER`命令中(Pavel Stehule) 比如 `ALTER FOREIGN TABLE IF EXISTS foo RENAME TO bar`。 * 添加 [`ALTER FOREIGN DATA WRAPPER`](#calibre_link-59) ... `RENAME` 和[`ALTER SERVER`](#calibre_link-66) ... `RENAME` (Peter Eisentraut) * 添加 [`ALTER DOMAIN`](#calibre_link-568) ... `RENAME` (Peter Eisentraut) 你可能已经使用 `ALTER TYPE`重命名域。 * 在不存在约束上为 `ALTER DOMAIN` ... `DROP CONSTRAINT`抛出一个错误(Peter Eisentraut) 一个`IF EXISTS`选项已被添加以提供先前操作。 #### E.8.3.4.3\. [`CREATE TABLE`](#calibre_link-7) * 允许`CREATE TABLE (LIKE ...)`来自外表,视图和复合类型(Peter Eisentraut) 比如,模式匹配视图的允许创建表。 * 当拷贝索引注释时,修复`CREATE TABLE (LIKE ...)`以避免索引名冲突(Tom Lane) * 修复`CREATE TABLE` ... `AS EXECUTE` 以处理`WITH NO DATA`和列名称规格(Tom Lane) #### E.8.3.4.4\. 对象权限 * 为视图添加 [`security_barrier`](#calibre_link-473)选项(KaiGai Kohei, Robert Haas) 该选项可以防止优化可能允许视图受保护数据暴露给用户, 比如推动涉及不安全函数的子句到视图的`WHERE`子句。 这种视图预期比普通视图执行更差。 * 添加新的 [`LEAKPROOF`](#calibre_link-4)函数属性以标记函 数可以安全地向下推进到`security_barrier`视图(KaiGai Kohei) * 增加数据类型权限支持(Peter Eisentraut) 在类型和域上添加SQL-一致`USAGE`权限支持。 其意图是可以限制哪个用户在类型上可以创建依赖,因为这种依赖 限制修改该类型的用户能力。 * 检查在 `SELECT INTO` / `CREATE TABLE AS`中的 `INSERT`权限(KaiGai Kohei) 因为通过`SELECT INTO` 或者`CREATE TABLE AS`创建该对象,那么创建者通常有插入权限; 但是有一种不真的困境情况, 比如当`ALTER DEFAULT PRIVILEGES`已经删除该权限时。 ### E.8.3.5\. 实用操作 * 允许[`VACUUM`](#calibre_link-748)更容易忽略不能被锁定的页(Simon Riggs, Robert Haas) 这种变化会大大降低`VACUUM`获得"stuck"等待其他会话的发生率。 * 使得[`EXPLAIN`](#calibre_link-575) `(BUFFERS)`计算脏块和写入的(Robert Haas) * 使得`EXPLAIN ANALYZE`报告通过过滤步骤拒绝的行数(Marko Tiikkaja) * 当时间值是不想要的,允许`EXPLAIN ANALYZE`避免时间开销(Tomas Vondra) 通过设置新的`TIMING`选项到`FALSE`来完成。 ### E.8.3.6\. 数据类型 * 添加支持[range data types](#calibre_link-1153) (Jeff Davis, Tom Lane, Alexander Korotkov) 一系列数据类型存储从属于它的基本数据类型的上限和下限。 它支持类似包含,重叠和交叉的操作。 * 添加[`JSON`](#calibre_link-1753) 数据类型(Robert Haas) 这种类型存储带有适当验证的JSON (JavaScript对象表示法)数据。 * 添加 [`array_to_json()`](#calibre_link-1760) 和`row_to_json()` (Andrew Dunstan) * 添加[`SMALLSERIAL`](#calibre_link-1175) 数据类型(Mike Pultz) 这就像`SERIAL`,除了它以两个字节整数列(`int2`)存储序列之外。 * 允许[domains](#calibre_link-567)被 声明为`NOT VALID` (Álvaro Herrera) 在域创建时间设置该选项,或者通过 `ALTER DOMAIN` ... `ADD CONSTRAINT` ... `NOT VALID`. `ALTER DOMAIN` ... `VALIDATE CONSTRAINT`充分验证该限制。 * 为了[`money`](#calibre_link-696)数据类型支持更多的区域指定格式选项(Tom Lane) 特别的,为了该值顺序,标志,以及货币输出中的货币符号纪念POSIX选项。另外, 确保千位分隔符只被插入到小数点左边,正如POSIX要求的。 * 为`macaddr`数据类型添加按位"and", "or"和"not"操作符(Brendan Jurd) * 当提供一个标量值时, 允许[`xpath()`](#calibre_link-1976)返回 单一元素XML数组(Florian Pflug) 先前,它返回空数组。这种变化也将导致`xpath_exists()`为这种表达式返回真,而不是假。 * 提高XML错误处理以变得更健壮(Florian Pflug) ### E.8.3.7\. 函数 * 允许非超级用户在其他会话从属于同一用户时使用 [`pg_cancel_backend()`](#calibre_link-1566) 和[`pg_terminate_backend()`](#calibre_link-1566) (Magnus Hagander, Josh Kupershmidt, Dan Farina) 以前只有超级用户被允许使用这些函数。 * 允许事务快照的输入和输出(Joachim Wieland, Tom Lane) 这允许多个事务共享数据库状态的同一视图。快照是通过 [`pg_export_snapshot()`](#calibre_link-510)输出,通过 [`SET TRANSACTION SNAPSHOT`](#calibre_link-507)输入。只有当前正在运行的事务快照可以被输入。 * 支持表达式上的[`COLLATION FOR`](#calibre_link-2243)(Peter Eisentraut) 返回表达式排序规则的字符串表示。 * 添加[`pg_opfamily_is_visible()`](#calibre_link-2242) (Josh Kupershmidt) * 添加`numeric` variant of [`pg_size_pretty()`](#calibre_link-1073) 适用于`pg_xlog_location_diff()` (Fujii Masao) * 添加[`pg_trigger_depth()`](#calibre_link-2241)函数(Kevin Grittner) 报告当前触发器调用深度。 * 允许 [`string_agg()`](#calibre_link-1071) 处理`bytea`值(Pavel Stehule) * 在一个较大的量化子表达式中发生后向引用的地方修复正则表达式(Tom Lane) 比如`^(\w+)( \1)+$`。先前版本并不检查后向引用实际匹配第一次出现。 ### E.8.3.8\. [信息模式](#calibre_link-583) * 添加信息模式视图 `role_udt_grants`, `udt_privileges`, 和`user_defined_types` (Peter Eisentraut) * 添加复合类型属性到信息模式`element_types`视图(Peter Eisentraut) * 信息模式中实现`interval_type`列(Peter Eisentraut) 以前这些列读取为空。 * 在信息模式`attributes`, `columns`, `domains`和`element_types`视图中实现排序规则相关列(Peter Eisentraut) * 在信息模式`table_privileges`视图中实现`with_hierarchy`列 (Peter Eisentraut) * 增加序列`USAGE`权限显示到信息模式中(Peter Eisentraut) * 使信息模式显示缺省权限(Peter Eisentraut) 先前,非空缺省权限没有出现在视图中。 ### E.8.3.9\. 服务器端语言 #### E.8.3.9.1\. [PL/pgSQL](#calibre_link-857)服务器端语言 * 允许PL/pgSQL `OPEN`游标命令提供参数名(Yeb Havinga) * 添加`GET STACKED DIAGNOSTICS` PL/pgSQL命令检索异常信息(Pavel Stehule) * 通过缓存类型信息加快PL/pgSQL数组赋值(Pavel Stehule) * 提高性能以及为长连续`ELSIF`子句内存损耗(Tom Lane) * 在PL/pgSQL错误消息中输出函数签名,而不仅仅是名字(Pavel Stehule) #### E.8.3.9.2\. [PL/Python](#calibre_link-882)服务器端语言 * 添加PL/Python SPI游标支持 (Jan Urbanski) 这允许PL/Python读取部分结果集。 * 添加结果元数据函数到PL/Python (Peter Eisentraut) 具体地说,这增加了结果对象函数 `.colnames`, `.coltypes`和 `.coltypmods`。 * 删除支持Python 2.2 (Peter Eisentraut) #### E.8.3.9.3\. [SQL](#calibre_link-831)服务器端语言 * 允许SQL语言函数参照参数名(Matthew Draper) 为了使用这个,仅仅命名函数参数,并且然后参考SQL 函数体中的参数名。 ### E.8.3.10\. 客户端应用 * 添加[initdb](#calibre_link-542) 选项`--auth-local`和`--auth-host` (Peter Eisentraut) 这允许 `local`和`host` `pg_hba.conf`认证设置的分散控制, `--auth`仍然控制着两个。 * 添加`--replication`/`--no-replication`标记到 [createuser](#calibre_link-22)以控制备份权限(Fujii Masao) * 添加`--if-exists`选项到 [dropdb](#calibre_link-35)和 [dropuser](#calibre_link-45) (Josh Kupershmidt) * 给出命令行工具以指定要连接数据库名字, 如果`postgres`数据库连接失败, 那么回退到`template1` (Robert Haas) #### E.8.3.10.1\. [psql](#calibre_link-23) * 添加基于显示宽度的显示模式以自动扩展输出(Peter Eisentraut) 增加`auto`选项到`\x`命令,当正常 输出比屏幕宽的时候,会切换到扩展模式。 * 允许脚本文件的包含是相对于它被调用的文件目录命名的(Gurjeet Singh) 这是执行新的命令`\ir`。 * 在psql变量名中添加支持非ASCII字符(Tom Lane) * 添加支持主要版本特定`.psqlrc`文件(Bruce Momjian) psql支持次要版本特定`.psqlrc`文件。 * 提供环境变量覆盖psql历史并且启动文件位置(Andrew Dunstan) 如果设置,那么`PSQL_HISTORY`和`PSQLRC`决定这些文件名。 * 添加`\setenv`命令修改传递给子进程的环境变量(Andrew Dunstan) * 命名`.sql`扩展的psql的临时编辑文件(Peter Eisentraut) 这允许扩展敏感编辑者选择正确模式。 * 允许psql使用零字节字段并且记录分隔符(Peter Eisentraut) 使用零字节(NUL)分隔符的各种shell工具,比如find。 * 使用`\timing`选项报告查询失败时间(Magnus Hagander) 以前只为成功查询报道时间。 * 统一并固定`\copy`和SQL `COPY`的psql处理(Noah Misch) 这修复错误操作更加可预测并且设置`\set ON_ERROR_ROLLBACK`。 #### E.8.3.10.2\. 信息命令 * 使得`\d`在序列上显示拥有它的表/列名(Magnus Hagander) * 显示`\d+`中列的统计目标(Magnus Hagander) * 显示`\du`中角色密码截止日期(Fabrízio de Royes Mello) * 显示投射,转换,域和语言说明(Josh Kupershmidt) 这些分别包含在`\dC+`, `\dc+`, `\dD+`和`\dL`输出中。 * 显示SQL/MED对象说明(Josh Kupershmidt) 这些分别包括在`\des+`, `\det+`输出,`\dew+`外服务器,外 表,和外数据包装器。 * 改变`\dd`仅显示没有自身反斜杠命令对象类型的说明(Josh Kupershmidt) #### E.8.3.10.3\. Tab实现 * 在psql tab实现中, 在大小写情况下依照新的 [`COMP_KEYWORD_CASE`](#calibre_link-1080)设置 实现SQL关键字 * 添加tab实现支持 `EXECUTE` (Andreas Karlsson) * 在`GRANT`/`REVOKE`中 添加角色引用的tab实现(Peter Eisentraut) * 当必要的时候,允许文件名的tab实现可以提供引用(Noah Misch) * 改变tab实现支持`TABLE`也包含视图(Magnus Hagander) #### E.8.3.10.4\. [pg_dump](#calibre_link-437) * 添加`--exclude-table-data`选项到 pg_dump (Andrew Dunstan) 这允许在每个表基础上备份表的定义而不是它的数据。 * 添加`--section`选项到pg_dump 和pg_restore (Andrew Dunstan) 有效值是`pre-data`, `data`, 和`post-data`。给定的该选项不止一次的选择两个或更多部分。 * 使用 [pg_dumpall](#calibre_link-439)首先备份 所有角色,然后角色上的所有配置设置(Phil Sorber) 这允许角色的配置设置提及其他没有产生错误的角色。 * 如果在新的集群中丢失`postgres`数据库,那么允许 pg_dumpall避免错误(Robert Haas) * 按照用户名顺序备份外服务器用户映射(Peter Eisentraut) 这有助于产生确定性备份文件。 * 以可预见性顺序备份操作符(Peter Eisentraut) * 当扩展配置表通过pg_dump被备份时,收紧规则(Tom Lane) * 使得pg_dump发出更多有用的依赖信息(Tom Lane) 包含在归档格式转储中的依赖关系以前使用非常有限, 因为他们经常引用似乎 不在转储中的对象。 现在他们在转储对象之间 代表实际的依赖关系(可能是间接的)。 * 当备份多个数据库对象时,提高pg_dump的性能(Tom Lane) ### E.8.3.11\. [libpq](#calibre_link-496) * 允许libpq连接 字符串有[URI](#calibre_link-458) 的格式(Alexander Shulgin) 该语法以`postgres://`开头。 这可以允许应用程序为URI表示数据库连接避免实现它们自身解析器。 * 添加[连接选项](#calibre_link-2097) 以禁用SSL压缩 (Laurenz Albe) 这可以用于删除快速网络中SSL压缩的开销。 * 为了更好处理大的结果集添加 [单行处理模式](#calibre_link-626) 此前,libpq将 其返回给应用程序之前总是收集内存中整个查询结果。 * 添加`const`限定符 到函数`PQconnectdbParams`, `PQconnectStartParams`, 和`PQpingParams`的声明(Lionel Elie Mamane) * 允许`.pgpass`文件在密码域中包含转义字符(Robert Haas) * 当必须终止进程时,尝试库函数使用`abort()`代替`exit()`(Peter Eisentraut) 这个选择并不妨碍使用正常退出代码程序, 并产生一个可以由调用者捕捉的信号。 ### E.8.3.12\. 源码 * 删除封闭端口号(Peter Eisentraut) 不再支持下列平台:dgux, nextstep, sunos4, svr4, ultrix4, univel, bsdi。 * 添加使用 [MS Visual Studio 2010](#calibre_link-1035)支持编译(Brar Piening) * 启动使用MinGW-w64 32-位编译器进行编译(Lars Kanis) * 在安装期间安装`plpgsql.h`到`include/server`(Heikki Linnakangas) * 提高闩锁装置以包含postmaster终止的检测(Peter Geoghegan, Heikki Linnakangas, Tom Lane) 后端进程先前必须意识到调查事件,这消除了主要原因之一。 * 支持的地方使用C灵活数组元素(Peter Eisentraut) * 提高并行事务回归测试(isolationtester) (Noah Misch) * 在当前目录中修改thread_test创建它的测试文件,而不是`/tmp` (Bruce Momjian) * 提高flex和bison警告和错误报告(Tom Lane) * 添加内存屏障支持(Robert Haas) 这是目前未使用的。 * 修改pgindent使用typedef文件(Bruce Momjian) * 由于被发送到服务器添加处理消息钩子(Martin Pihlak) * 为`DROP`命令添加对象访问钩(KaiGai Kohei) * 集中`DROP`处理一些对象类型(KaiGai Kohei) * 添加pg_upgrade测试套件(Peter Eisentraut) * 伴随TCL 8.5.11 同步正则表达式代码 并且改善内部处理(Tom Lane) * 移动CRC表到libpgport, 在一个单独的include文件中提供它们(Daniel Farina) * 为了用于主要发布声明 创建添加选项到git_changelog (Bruce Momjian) * 支持Linux的`/proc/self/oom_score_adj` API (Tom Lane) ### E.8.3.13\. 额外模块 * 通过使用libpq的新单行处理模式提高[dblink](#calibre_link-63)的效率 (Kyotaro Horiguchi, Marko Kreen) 这个改进不适用于`dblink_send_query()`/`dblink_get_result()`。 * 在[file_fdw](#calibre_link-380)中支持`force_not_null`选项(Shigeru Hanada) * 为[pg_archivecleanup](#calibre_link-1096)实现 演习模式(Gabriele Bartolini) 这只输出已删除文件名。 * 添加新的[pgbench](#calibre_link-629)切换`--unlogged-tables`, `--tablespace`和`--index-tablespace` (Robert Haas) * 改变[pg_test_fsync](#calibre_link-1619)以测试 一定量的时间,而不是固定周期数(Bruce Momjian) 删除`-o`/周期选项,并且添加`-s`/秒。 * 添加 [pg_test_timing](#calibre_link-1203)功能 以测量时钟一致性和时间开销 (Ants Aasma, Greg Smith) * 添加[tcn](#calibre_link-402)(触发变更通知) 模块在表变更上生成`NOTIFY`事件(Kevin Grittner) #### E.8.3.13.1\. [pg_upgrade](#calibre_link-638) * 调整pg_upgrade环境变量(Bruce Momjian) 重命名data,bin和以`PG`开头的port环境变量, 支持`PGPORTOLD`/`PGPORTNEW`, 取代`PGPORT`。 * 检查pg_upgrade记录和错误报告(Bruce Momjian) 创建四个附加的日志文件,并且成功时删除它们。 添加`-r`/`--retain`选项无条件的保留这些文件。同时 删除不必要的pg_upgrade选项`-g`/`-G`/`-l`选项, 固定日志文件的权限。 * 使pg_upgrade创建一个脚本增量 生成更精确的优化统计(Bruce Momjian) 这降低了升级后产生最小的集群统计所需要的时间。 * 允许pg_upgrade更新没有`postgres`数据库的旧的集群(Bruce Momjian) * 允许pg_upgrade处理新的或旧的数据库丢失情况,只要它们是空的(Bruce Momjian) * 允许pg_upgrade处理配置目录安装(Bruce Momjian) * 在pg_upgrade中,添加`-o`/`-O`选项传递参数到服务器(Bruce Momjian) 对配置目录安装有作用。 * 改变pg_upgrade使用缺省port 50432(Bruce Momjian) 这有助于在更新期间避免意外的客户端连接。 * 减少pg_upgrade集群锁定(Bruce Momjian) 具体来说,如果使用链接模式,那么只锁定旧的集群。 并且在存储模式之后执行。 #### E.8.3.13.2\. [pg_stat_statements](#calibre_link-394) * 允许pg_stat_statements通过SQL文本标准化聚集类似查询(Peter Geoghegan, Tom Lane) 使用非参数化SQL应用程序的用户可以没有详细的日志分析监控查询性能。 * 增加脏块和写入块计算以及读/写时间到pg_stat_statements (Robert Haas, Ants Aasma) * 避免pg_stat_statements来自 `PREPARE`和`EXECUTE`命令的重复计算(Tom Lane) #### E.8.3.13.3\. [sepgsql](#calibre_link-398) * 在全局对象上支持`SECURITY LABEL` (KaiGai Kohei, Robert Haas) 具体来说,添加数据库安全标签,表空间,和角色。 * 允许sepgsql接受数据库标签(KaiGai Kohei) * 在各种对象的创建过程中执行sepgsql权限检查(KaiGai Kohei) * 添加`sepgsql_setcon()`和相关函数以控制sepgsql安全域(KaiGai Kohei) * 添加sepgsql用户空间访问缓存以提高性能(KaiGai Kohei) ### E.8.3.14\. 文档 * 使用网站上的样式表添加规则用以随意编译HTML文档(Magnus Hagander) 使用`gmake STYLE=website draft`. * 改善`EXPLAIN`文档(Tom Lane) * 记录用户/数据库名通过命令行工具如vacuumdb 使用双引号保存(Bruce Momjian) * 记录通过客户端MD5认证返回的实际字符串(Cyan Ogilvie) * 反对在`CREATE TEMP TABLE`中使用`GLOBAL`和`LOCAL` (Noah Misch) PostgreSQL早已把这些关键词看作没有操作, 并且继续这样做;但在未来他们可能意味着SQL标准的内容, 所以应用程序应避免使用它们。