选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.0 已于 2015 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页

E.146. 版本 8.0 #

发行日期

2005-01-19

E.146.1. 概述

此发行版的主要变更:

Microsoft Windows Native Server

这是第一个作为服务器原生运行于 Microsoft Windows® 上的 PostgreSQL 版本。它可以作为 Windows 服务运行。此版本支持基于 NT 的 Windows 版本,如 Windows 2000 SP4Windows XPWindows 2003。更老的版本如 Windows 95Windows 98Windows ME 不受支持,因为这些操作系统没有支持 PostgreSQL 的基础设施。已创建单独的安装程序项目以简化在 Windows 上的安装——参见 http://www.postgresql.org/ftp/win32/

虽然在整个发布周期中都做了测试,但 Windows 移植没有 PostgreSQL 在 Unix 平台上多年生产环境使用的积累。因此应像对待新产品一样谨慎对待它。

以前的版本需要 Unix 仿真工具包 Cygwin 才能在 Windows 操作系统上运行服务器。PostgreSQL 在 Windows 上的本机客户端支持已有多年。

Savepoints

保存点允许中止事务的特定部分而不影响事务的其余部分。以前的版本没有这种能力;事务内的语句失败除了中止整个事务外无法恢复。此特性对需要在复杂事务内进行错误恢复的应用程序作者很有价值。

Point-In-Time Recovery

在以前的版本中,除了从以前的备份恢复或使用备用复制服务器外,无法从磁盘驱动器故障中恢复。时间点恢复允许对服务器做连续备份。你可以恢复到故障点或过去的某个事务。

Tablespaces

表空间允许管理员为各个表、索引和数据库的存储选择不同的文件系统。这改进了性能和对磁盘空间使用的控制。以前的版本使用 initlocation 和手工符号链接管理来完成此类任务。

Improved Buffer Management, CHECKPOINT, VACUUM

此版本有更智能的缓冲区替换策略,能更好地利用可用共享缓冲区并改进性能。清理和检查点的性能影响也减轻了。

Change Column Types

现在可以用 ALTER TABLE 更改列的数据类型。

New Perl Server-Side Language

新版本的 plperl 服务器端语言现在支持持久共享存储区、触发器、返回记录和记录数组以及访问数据库的 SPI 调用。

Comma-separated-value (CSV) support in COPY

COPY 现在可以读写逗号分隔值文件。它还能灵活解释非标准的引号和分隔字符。

E.146.2. 迁移到版本 8.0

希望从任何以前的版本迁移数据的用户,需要使用 pg_dump 进行转储/恢复。

请注意以下不兼容之处:

  • READ COMMITTED 序列化模式下,易变函数现在能看到并发事务提交到函数内每条语句开始处为止的结果,而不是到调用函数的交互命令开始处为止。

  • 声明为 STABLEIMMUTABLE 的函数总是使用调用查询的快照,因此看不到调用查询开始之后采取的动作的效果,无论在其自身事务还是其他事务中。这样的函数也必须是只读的,即它不能使用 SELECT 之外的任何 SQL 命令。

  • 非延迟的 AFTER 触发器现在在触发查询完成后立即触发,而不是在当前交互命令完成时。当触发查询发生在函数内时这就有区别:触发器在函数继续其下一个操作之前被调用。

  • 服务器配置参数 virtual_hosttcpip_socket 已被更通用的参数 listen_addresses 取代。此外,服务器现在默认监听 localhost,这在许多场景中消除了对 -i postmaster 开关的需要。

  • 服务器配置参数 SortMemVacuumMem 已改名为 work_memmaintenance_work_mem,以更好地反映其用途。原名在 SETSHOW 中仍受支持。

  • 服务器配置参数 log_pidlog_timestamplog_source_port 已被更通用的参数 log_line_prefix 取代。

  • 服务器配置参数 syslog 已被更合逻辑的 log_destination 变量取代,以控制日志输出目的地。

  • 服务器配置参数 log_statement 已更改,可以有选择地只记录数据库修改或数据定义语句。服务器配置参数 log_duration 现在只在 log_statement 打印查询时打印。

  • 服务器配置参数 max_expr_depth 已被 max_stack_depth 取代,后者测量物理栈大小而不是表达式嵌套深度。这有助于防止因递归函数导致的栈溢出造成的会话终止。

  • length() 函数不再统计 CHAR(n) 值中的尾随空格。

  • 把整数转换为 BIT(N) 现在选取整数最右边的 N 位,而不是像以前那样最左边 N 位。

  • 更新 NULL 数组值的元素或切片现在产生非空数组结果,即只包含被赋值位置的数组。

  • 数组输入值的语法检查已大幅收紧。以前在奇怪位置被允许并产生奇怪结果的垃圾现在会导致错误。空字符串元素值现在必须写成 "",而不是什么也不写。还更改了数组元素周围空白的行为:尾随空白现在被忽略,与前导空白(一直被忽略)对称。

  • 整数算术运算中的溢出现在被检测并报告为错误。

  • 与单字节 "char" 数据类型相关的算术操作符已被移除。

  • extract() 函数(也称 date_part)现在为 BC 日期返回正确的年份。此前它返回比正确年份小一的值。该函数现在还为千年和世纪返回正确的值。

  • CIDR 值现在必须使其未掩码的位为零。例如,我们不再允许 204.248.199.1/31 作为 CIDR 值。这类值本就不应被 PostgreSQL 接受,现在将被拒绝。

  • EXECUTE 现在返回与被执行语句匹配的完成标签。

  • psql\copy 命令现在读写查询的 stdin/stdout,而不是 psqlstdin/stdout。以前的行为可通过新的 pstdin/pstdout 参数访问。

  • JDBC 客户端接口已从核心发行版中移除,现托管于 http://jdbc.postgresql.org

  • Tcl 客户端接口也被移除。现在有几个 Tcl 接口托管于 http://gborg.postgresql.org

  • 服务器现在使用自己的时区数据库,而不是操作系统提供的。这将在所有平台上提供一致的行为。在大多数情况下,时区行为应没有明显差异,只是 SET/SHOW TimeZone 使用的时区名可能与你的平台提供的不同。

  • Configure 的线程选项不再要求用户运行测试或编辑配置文件;线程选项现在自动检测。'

  • 既然表空间已经实现,initlocation 已被移除。

  • 用户定义 GiST 索引的 API 已更改。Union 和 PickSplit 方法现在传递指向特殊 GistEntryVector 结构的指针,而不是 bytea

E.146.3. 废弃特性

PostgreSQL 行为的某些方面已被确定为次优。为了向后兼容,它们在 8.0 中没有被移除,但被认为已废弃,将在下一个主版本中移除。

  • 8.1 版本将移除 interval 的 to_char() 函数。

  • 服务器现在对传递给 oid/float4/float8 数据类型的空字符串发出警告,但仍像以前一样把它们解释为零。在下一个主版本中,空字符串将被视为这些数据类型的无效输入。

  • 默认情况下,PostgreSQL 8.0 及更早版本中的表创建时带 OID。在下一个版本中,情况将再如此:要创建包含 OID 的表,必须指定 WITH OIDS 子句或设置 default_with_oids 配置参数。鼓励用户在表需要 OID 时显式指定 WITH OIDS,以与 PostgreSQL 的未来版本兼容。

E.146.4. 变更

下面你将找到 8.0 版本与上一个主版本之间变更的详细说明。

E.146.4.1. 性能改进

  • 支持跨数据类型的索引使用(Tom)

    在此变更之前,如果数据类型不完全匹配,许多查询不会使用索引。此改进使索引使用更直观一致。

  • 改进缓存的新缓冲区替换策略(Jan)

    以前的版本使用最近最少使用(LRU)缓存把最近引用的页保留在内存中。LRU 算法不考虑特定缓存条目被访问的次数,因此大表扫描可能驱逐有用的缓存页。新缓存算法使用四个独立的列表来跟踪最近使用和最常使用的缓存页,并根据负载动态优化其替换。这应能带来对共享缓冲区缓存高效得多的利用。过去测试过共享缓冲区大小的管理员应使用此新缓存替换策略重新测试。

  • 新增周期性写脏缓冲区的子进程以减少检查点写入(Jan)

    在以前的版本中,每隔几分钟运行一次的检查点进程会把所有脏缓冲区写入操作系统的缓冲区缓存,然后把所有脏的操作系统缓冲区刷到磁盘。这导致周期性的磁盘使用尖峰,常常损害性能。新代码使用后台写入器以稳定的节奏细流式写磁盘,因此检查点要写到磁盘的脏页少得多。此外,新代码不发出全局 sync() 调用,而是只对自上次检查点以来写入的文件执行 fsync()。这应能改进性能并使检查点期间的退化最小化。

  • 新增延长清理时间以降低性能影响的能力(Jan)

    在繁忙系统上,VACUUM 执行许多 I/O 请求,可能损害其他用户的性能。此版本允许放慢 VACUUM 以降低对其他用户的影响,尽管这会增加 VACUUM 的总时长。

  • 改进重复键的 B-tree 索引性能(Dmitry Tkach、Tom)

    这改进了索引中存在许多重复值时扫描索引的方式。

  • 规划时使用动态生成的表大小估计(Tom)

    此前规划器使用最后一次 VACUUMANALYZE 看到的值来估计表大小,包括物理表大小(页数)和行数。现在,当前物理表大小从内核获得,行数通过把表大小乘以最后一次 VACUUMANALYZE 看到的行密度(每页行数)来估计。在表大小自上次维护命令以来变化显著的情形下,这应能产生更可靠的估计。

  • 改进 OR 子句的索引使用(Tom)

    这允许优化器在有许多 OR 子句的语句中使用索引,这些语句过去不会被索引。它还可以使用多列索引,其中第一列被指定而第二列是 OR 子句的一部分。

  • 改进部分索引子句的匹配(Tom)

    服务器现在更善于在涉及复杂 WHERE 子句的查询中使用部分索引。

  • 改进 GEQO 优化器的性能(Tom)

    GEQO 优化器用于规划涉及许多表的查询(默认十二个或更多)。此版本加快了查询分析方式,以减少花在优化上的时间。

  • 其他优化器改进

    这里没有篇幅列出所做的所有小改进,但许多特殊情形比以前的版本工作得更好。

  • 改进 C 函数的查找速度(Tom)

    此版本使用哈希表查找动态装载的 C 函数的信息。这改进了它们的速度,使其几乎与内建在服务器可执行文件中的函数一样快。

  • 新增类型特定的 ANALYZE 统计能力(Mark Cave-Ayland)

    此特性允许为非标准数据类型生成统计信息时有更多灵活性。

  • ANALYZE 现在收集表达式索引的统计信息(Tom)

    表达式索引(也称函数索引)允许用户不仅索引列,还索引表达式和函数调用的结果。有了此版本,优化器可以收集和使用有关表达式索引内容的统计信息。这将大幅改进表达式索引相关查询的规划质量。

  • ANALYZE 的新两阶段采样方法(Manfred Koizar)

    当表中不同区域有效行的密度差异很大时,这给出更好的统计信息。

  • 加快 TRUNCATE(Tom)

    这挽回了一些 7.4 中观察到的性能损失,同时仍保持 TRUNCATE 事务安全。

E.146.4.2. 服务器变更

  • 新增 WAL 文件归档和时间点恢复(Simon Riggs)

  • 新增表空间,使管理员能控制磁盘布局(Gavin)

  • 新增内建日志轮转程序(Andreas Pflug)

    现在可以方便地记录服务器消息,而不依赖 syslog 或外部日志轮转程序。

  • 新增只读服务器配置参数以显示服务器编译期设置:block_sizeinteger_datetimesmax_function_argsmax_identifier_lengthmax_index_keys(Joe)

  • 使 sameusersamegroupall 的加引号能移除这些词在 pg_hba.conf 中的特殊含义(Andrew)

  • 在默认 pg_hba.conf 中为 localhost 使用更清晰的 IPv6 名称 ::1/128(Andrew)

  • pg_hba.conf 示例中使用 CIDR 格式(Andrew)

  • 把服务器配置参数 SortMemVacuumMem 改名为 work_memmaintenance_work_mem(旧名仍受支持)(Tom)

    此变更是为了澄清索引和外键创建等批量操作使用 maintenance_work_mem,而 work_mem 用于查询执行期间使用的工作区。

  • 允许用服务器配置 log_disconnections 记录会话断开(Andrew)

  • 新增服务器配置参数 log_line_prefix,允许控制每行日志中发出的信息(Andrew)

    可用信息包括用户名、数据库名、远程 IP 地址和会话开始时间。

  • 移除服务器配置参数 log_pidlog_timestamplog_source_port;功能被 log_line_prefix 取代(Andrew)

  • 用统一的 listen_addresses 参数取代 virtual_hosttcpip_socket 参数(Andrew、Tom)

    virtual_host 只能指定监听单个 IP 地址。listen_addresses 允许指定多个地址。

  • 默认监听 localhost,这在许多场景中消除了对 -i postmaster 开关的需要(Andrew)

    监听 localhost(127.0.0.1)不会打开新的安全漏洞,但允许 Windows 和 JDBC 等不支持本地套接字的配置无需特殊调整即可工作。

  • 移除 syslog 服务器配置参数,并新增更合逻辑的 log_destination 变量来控制日志输出位置(Magnus)

  • 更改服务器配置参数 log_statement,取值 allmodddlnone,以选择记录哪些查询(Bruce)

    这允许管理员只记录数据定义更改或只记录数据修改语句。

  • 一些与日志相关的配置参数以前可由普通用户调整,但只能向更详细方向。现在对它们的处理更严格:只有超级用户能设置。但超级用户可以用 ALTER USER 为非超级用户提供这些值的逐用户设置。此外,超级用户现在还可以通过 PGOPTIONS 设置仅超级用户配置参数的值。

  • 允许把配置文件放在数据目录之外(mlw)

    默认情况下,配置文件保存在集群的顶级目录。有了此新增,配置文件可以放在数据目录之外,便于管理。

  • 只在首次执行时规划预备查询,使常数可用于统计(Oliver Jowett)

    预备语句一次规划查询并多次执行。虽然预备查询避免了每次使用时重新规划的开销,但计划质量因不知道查询中将使用的确切参数而受损。在此版本中,未命名预备语句的规划推迟到首次执行,并把该执行的实际参数值用作优化提示。这允许使用外线参数传递而不带来性能损失。

  • 允许 DECLARE CURSOR 接受参数(Oliver Jowett)

    现在在带参数的 Parse 消息中发出 DECLARE CURSOR 是有用的。Bind 时发送的参数值将被代入游标查询的执行。

  • 修复 inetcidr 数据类型的哈希连接和聚合(Tom)

    7.4 版本对混合 inetcidr 值的哈希处理不正确。(此缺陷在以前的版本中不存在,因为它们不会尝试哈希这两种数据类型。)

  • log_duration 只在 log_statement 打印查询时打印(Ed L.)

E.146.4.3. 查询变更

  • 新增保存点(嵌套事务)(Alvaro)

  • 不支持的隔离级别现在被接受并提升到最接近的受支持级别(Peter)

    SQL 规范规定,如果数据库不支持特定隔离级别,应使用下一个更严格的级别。此变更遵循该建议。

  • 允许 BEGIN WORKSTART TRANSACTION 那样指定事务隔离级别(Bruce)

  • 修复规则生成的查询类型与最初提交的查询不同情形下的表权限检查(Tom)

  • 实现美元引用以简化单引号的使用(Andrew、Tom、David Fetter)

    在以前的版本中,由于必须用单引号引用函数体,函数文本中单引号的使用需要用两个单引号或其他易错的记法。有了此版本,我们新增了用"美元引用"引用文本块的能力。在不同嵌套级别使用不同引用定界符的能力大幅简化了正确引用的任务,特别是在复杂函数中。美元引用可用于任何需要引用文本的地方。

  • CASE val WHEN compval1 THEN ... 只求值 val 一次(Tom)

    CASE 不再多次求值被测试的表达式。当表达式复杂或易变时这有好处。

  • 在计算聚合查询的目标列表之前先测试 HAVING(Tom)

    修复诸如 SELECT SUM(win)/SUM(lose) ... GROUP BY ... HAVING SUM(lose) > 0 之类情形的不当失败。这本应工作,但此前可能因除以零而失败。

  • max_stack_depth 参数(以栈大小千字节计)取代 max_expr_depth 参数(Tom)

    这为防止因失控递归函数而崩溃提供了相当可靠的防御。我们现在直接测量执行栈的大小,而不是测量表达式嵌套的深度。

  • 允许任意行表达式(Tom)

    此版本允许 SQL 表达式包含任意组合类型,即行值。它还允许函数更容易地接受行作为参数并返回行值。

  • 允许 LIKE/ILIKE 用作行和子查询比较中的操作符(Fabien Coelho)

  • 避免标识符和关键字中的基本 ASCII 字母的区域特定大小写转换(Tom)

    这解决了包含 Ii 的词被破坏的土耳其问题。7 位 ASCII 集之外字符的折叠仍是区域感知的。

  • 改进语法错误报告(Fabien、Tom)

    语法错误报告比以前更有用。

  • 更改 EXECUTE,使其返回与被执行语句匹配的完成标签(Kris Jurka)

    以前的版本对任何 EXECUTE 调用都返回 EXECUTE 标签。在此版本中,返回的标签将反映被执行的命令。

  • 避免在规则列表中发出 NATURAL CROSS JOIN(Tom)

    这样的子句在逻辑上没有意义,但在某些情形下规则反编译器以前会产生这种语法。

E.146.4.4. 对象操作变更

  • 为转换、编码转换、语言、操作符类和大对象新增 COMMENT ON(Christopher)

  • 新增服务器配置参数 default_with_oids,控制表默认是否带 OID 创建(Neil)

    这允许管理员控制 CREATE TABLE 命令默认创建带或不带 OID 列的表。(注意:default_with_oids 当前的出厂默认设置为 TRUE,但未来版本中默认将变为 FALSE。)

  • CREATE TABLE AS 新增 WITH / WITHOUT OIDS 子句(Neil)

  • 允许 ALTER TABLE DROP COLUMN 删除 OID 列(ALTER TABLE SET WITHOUT OIDS 仍有效)(Tom)

  • 允许组合类型作为表列(Tom)

  • 允许带默认值和 NOT NULL 约束的 ALTER ... ADD COLUMN;按 SQL 规范工作(Rod)

    现在 ADD COLUMN 可以创建初始不用 NULL 填充而是用指定默认值填充的列。

  • 新增 ALTER COLUMN TYPE 来更改列的类型(Rod)

    现在可以在不删除并重新添加列的情况下更改列的数据类型。

  • 允许在单条 ALTER TABLE 命令中有多个 ALTER 动作(Rod)

    这对重写表的 ALTER 命令(包括 ALTER COLUMN TYPE 和带默认值的 ADD COLUMN)特别有用。通过把 ALTER 命令分组,表只需重写一次。

  • 允许 ALTER TABLE 添加 SERIAL 列(Tom)

    这是新列可指定默认值这一新能力的自然结果。

  • 允许更改聚合、编码转换、数据库、函数、操作符、操作符类、模式、类型和表空间的所有者(Christopher、Euler Taveira de Oliveira)

    此前这需要直接修改系统表。

  • 允许把临时对象创建限制为 SECURITY DEFINER 函数(Sean Chittenden)

  • 新增 ALTER TABLE ... SET WITHOUT CLUSTER(Christopher)

    在此版本之前,除了修改系统表外没有办法清除自动聚簇规格。

  • 约束/索引/SERIAL 名称现在为 table_column_type 并附加数字以保证在模式内唯一(Tom)

    SQL 规范规定此类名称应在模式内唯一。

  • 新增 pg_get_serial_sequence(),返回 SERIAL 列的序列名(Christopher)

    这使自动脚本能可靠地找到 SERIAL 序列名。

  • 当主/外键数据类型不匹配需要昂贵查找时发出警告

  • ALTER INDEX 命令,允许在表空间之间移动索引(Gavin)

  • ALTER TABLE OWNER 也更改依赖序列的所有权(Alvaro)

E.146.4.5. 工具命令变更

  • 允许 CREATE SCHEMA 创建触发器、索引和序列(Neil)

  • CREATE RULE 新增 ALSO 关键字(Fabien Coelho)

    这允许在创建规则时添加 ALSO,与 INSTEAD 规则相对。

  • LOCK 新增 NOWAIT 选项(Tatsuo)

    这允许 LOCK 命令在必须等待所请求的锁时失败。

  • 允许 COPY 读写逗号分隔值(CSV)文件(Andrew、Bruce)

  • COPY 分隔符与 NULL 字符串冲突时报错(Bruce)

  • GRANT/REVOKE 行为更贴近 SQL 规范

  • 避免 CREATE INDEXCHECKPOINT 之间的锁定冲突(Tom)

    在 7.3 和 7.4 中,长时间运行的 B-tree 索引构建可能阻塞并发 CHECKPOINT 完成,从而因 WAL 日志无法回收导致 WAL 膨胀。

  • 数据库范围的 ANALYZE 不再跨表持有锁(Tom)

    这降低了与其他想独占锁定表的后端发生死锁的可能性。要获得此变更的好处,不要在事务块(BEGIN 块)内执行数据库范围的 ANALYZE;它必须能为每个表提交并开始新事务。

  • REINDEX 不再独占锁定索引的父表

    索引本身仍被独占锁定,但如果表的读者不使用正被重建的特定索引,他们可以继续。

  • 用户被重命名时擦除 MD5 用户口令(Bruce)

    PostgreSQL 用 MD5 加密口令时把用户名用作盐。当用户名被更改时,盐将不再与存储的 MD5 口令匹配,因此存储的口令变得无用。在此版本中会生成通知并清除口令。之后如果用户要能用口令登录,必须分配新口令。

  • pg_ctl 新增用于 Windows 的 kill 选项(Andrew)

    Windows 没有向后端发送信号的 kill 命令,因此把此能力添加到了 pg_ctl

  • 信息模式改进

  • initdb 新增 --pwfile 选项,使初始口令可由 GUI 工具设置(Magnus)

  • initdb 中检测区域设置/编码不匹配(Peter)

  • pg_ctl 新增 register 命令来注册 Windows 操作系统服务(Dave Page)

E.146.4.6. 数据类型和函数变更

  • 更完整的组合类型(行类型)支持(Tom)

    组合值可以用在许多以前只有标量值可用的地方。

  • 把非矩形数组值作为错误拒绝(Joe)

    此前 array_in 会静默构建令人惊讶的结果。

  • 整数算术运算中的溢出现在被检测(Tom)

  • 与单字节 "char" 数据类型相关的算术操作符已被移除。

    此前,解析器会在许多情形下选择这些操作符,而无法选择操作符错误会更合适,例如 null * null。如果确实想对 "char" 列做算术,可以显式把它转换为整数。

  • 数组输入值的语法检查大幅收紧(Joe)

    以前在奇怪位置被允许并产生奇怪结果的垃圾现在导致 ERROR,例如右花括号之后的非空白。

  • 空字符串数组元素值现在必须写成 "",而不是什么也不写(Joe)

    此前两种写空字符串元素值的方式都被允许,但现在要求带引号的空字符串。完全什么都不出现的情形在未来某个版本中可能会被视为 NULL 元素值。

  • 数组元素的尾随空白现在被忽略(Joe)

    此前前导空白被忽略,但元素值与分隔符或右花括号之间的尾随空白是有意义的。现在尾随空白也被忽略。

  • 当下界不为一时以显式数组界限输出数组值(Joe)

  • 接受 YYYY-monthname-DD 作为日期字符串(Tom)

  • netmaskhostmask 函数返回最大长度的掩码长度(Tom)

  • 更改阶乘函数使其返回 numeric(Gavin)

    返回 numeric 使阶乘函数能用于更大范围的输入值。

  • to_char/to_date() 日期转换改进(Kurt Roeckx、Fabien Coelho)

  • length() 无视 CHAR(n) 中的尾随空格(Gavin)

    此变更是为了改进一致性:尾随空格在 CHAR(n) 数据中语义上无关紧要,因此不应被 length() 统计。

  • 对传递给 OID/float4/float8 数据类型的空字符串发出警告(Neil)

    8.1 将改为抛出错误。

  • 允许 int2/int4/int8/float4/float8 输入例程中的前导或尾随空白(Neil)

  • 更好地支持 float4/float8 中的 IEEE InfinityNaN 值(Neil)

    它们现在应在所有支持 IEEE 兼容浮点运算的平台上工作。

  • date_trunc() 新增 week 选项(Robert Creager)

  • 修复 to_char1 BC 的处理(此前它返回 1 AD)(Bruce)

  • 修复 BC 日期的 date_part(year)(此前它返回比正确年份小一的值)(Bruce)

  • 修复 date_part(),使其返回正确的千年和世纪(Fabien Coelho)

    与这类事物的标准推算相比,以前的版本中世纪和千年的结果数字错误且起始年份错误。

  • 为符合标准,新增 ceiling() 作为 ceil() 的别名,power() 作为 pow() 的别名(Neil)

  • 更改 ln()log()power()sqrt(),使其按 SQL:2003 的规定在某些错误条件下发出正确的 SQLSTATE 错误码(Neil)

  • 新增 SQL:2003 定义的 width_bucket() 函数(Neil)

  • 新增 generate_series() 函数以简化数字集合的处理(Joe)

  • 修复 upper/lower/initcap() 函数使其支持多字节编码(Tom)

  • 新增布尔和按位整数 AND/OR 聚合(Fabien Coelho)

  • 新增返回客户端和服务器网络地址的会话信息函数(Sean Chittenden)

  • 新增确定闭合路径面积的函数(Sean Chittenden)

  • 新增向其他后端发送取消请求的函数(Magnus)

  • 新增 intervaldatetime 操作符(Tom)

    相反的顺序(datetimeinterval)此前已支持,但两者都是 SQL 标准要求的。

  • 把整数转换为 BIT(N) 选取整数最右边的 N 位(Tom)

    在以前的版本中选取的是最左边 N 位,但这被认为没有用处,更不用说与从 bit 到 int 的转换不一致了。

  • 要求 CIDR 值的所有未掩码位为零(Kevin Brintnall)

E.146.4.7. 服务器端语言变更

  • READ COMMITTED 序列化模式下,易变函数现在能看到并发事务提交到函数内每条语句开始处为止的结果,而不是到调用函数的交互命令开始处为止。

  • 声明为 STABLEIMMUTABLE 的函数总是使用调用查询的快照,因此看不到调用查询开始之后采取动作的效果,无论在其自身事务还是其他事务中。这样的函数也必须是只读的,即不能使用 SELECT 之外的任何 SQL 命令。把函数声明为 STABLEIMMUTABLE 而不是 VOLATILE 有可观的性能收益。

  • 非延迟的 AFTER 触发器现在在触发查询完成后立即触发,而不是在当前交互命令完成时。当触发查询发生在函数内时这就有区别:触发器在函数继续其下一个操作之前被调用。例如,如果函数向表插入新行,任何非延迟外键检查都在函数继续之前进行。

  • 允许函数参数带名称声明(Dennis Björklund)

    这允许对函数做更好的文档记录。名称是否真起作用取决于所用的具体函数语言。

  • 允许在函数中引用 PL/pgSQL 参数名(Dennis Björklund)

    这基本上为每个命名参数创建了自动别名。

  • 在创建时对 PL/pgSQL 函数做最简语法检查(Tom)

    这使我们能更早捕获简单的语法错误。

  • PL/pgSQL 中对组合类型(行和记录变量)的更多支持

    例如,现在可以把行类型变量作为单个变量传递给另一个函数。

  • PL/pgSQL 变量的默认值现在可以引用先前声明的变量

  • 改进 PL/pgSQL FOR 循环的解析(Tom)

    解析现在由 ".." 的存在驱动,而不是 FOR 变量的数据类型。这对正确的函数没有区别,但在出错时应产生更易理解的错误消息。

  • PL/Perl 服务器端语言的重大改造(Command Prompt、Andrew Dunstan)

  • 在 PL/Tcl 中,SPI 命令现在在子事务中运行。如果发生错误,子事务被清理,错误被报告为普通 Tcl 错误,可以用 catch 捕获。此前无法捕获此类错误。

  • PL/pgSQL 接受 ELSEIF(Neil)

    此前 PL/pgSQL 只允许 ELSIF,但许多人习惯把此关键字拼写为 ELSEIF

E.146.4.8. psql Changes

  • 改进 psql 对数据库对象的信息显示(Christopher)

  • 允许 psql\du\dg 中显示组成员身份(Markus Bertheau)

  • 防止 psql\dn 显示临时模式(Bruce)

  • 允许 psql 处理文件名的波浪号用户展开(Zach Irmen)

  • 允许 psql 通过 readline 显示精致提示符,包括颜色(Reece Hart、Chet Ramey)

  • psql\copy 完全匹配 COPY 命令语法(Tom)

  • 显示语法错误的位置(Fabien Coelho、Tom)

  • psql\d 显示中添加 CLUSTER 信息(Bruce)

  • 更改 psql\copy stdin/stdout,使其从命令输入/输出读取(Bruce)

  • 新增 pstdin/pstdout,从 psqlstdin/stdout 读取(Mark Feit)

  • 新增全局 psql 配置文件 psqlrc.sample(Bruce)

    这允许用一个中心文件存储全局 psql 启动命令。

  • psql\d+ 指示表是否有 OID 列(Neil)

  • 在 Windows 上,psql 读取文件时使用二进制模式,使 control-Z 不被视为文件结束

  • \dn+ 显示模式的权限和描述(Dennis Björklund)

  • 改进 Tab 补全支持(Stefan Kaltenbrunn、Greg Sabino Mullane)

  • 允许用大写或小写设置布尔设置(Michael Paesold)

E.146.4.9. pg_dump Changes

  • 使用依赖信息改进 pg_dump 的可靠性(Tom)

    这应能解决相关对象有时以错误顺序转储的长期问题。

  • pg_dump 尽可能按字母顺序输出对象(Tom)

    这应使识别转储文件之间的更改更容易。

  • 允许 pg_restore 忽略某些 SQL 错误(Fabien Coelho)

    这使 pg_restore 的行为类似于把 pg_dump 输出脚本送入 psql 的结果。在大多数情况下,忽略错误继续前进是最有用的做法。还添加了 pg_restore 选项以提供出错即退出的旧行为。

  • pg_restore-l 显示现在包含对象的模式名

  • pg_dump 文本输出中新增开始/结束标记(Bruce)

  • 为详细模式下的 pg_dump/pg_dumpall 新增开始/停止时间(Bruce)

  • 允许在 pg_dumpall 中使用大多数 pg_dump 选项(Christopher)

  • pg_dump 默认使用 ALTER OWNER 而不是 SET SESSION AUTHORIZATION(Christopher)

E.146.4.10. libpq 变更

  • 使 libpq 的 SIGPIPE 处理线程安全(Bruce)

  • 新增 PQmbdsplen(),返回字符的显示长度(Tatsuo)

  • SSLKerberos 连接添加线程锁定(Manfred Spraul)

  • 允许 PQoidValue()PQcmdTuples()PQoidStatus() 用于 EXECUTE 命令(Neil)

  • 新增 PQserverVersion(),提供对服务器版本号更便捷的访问(Greg Sabino Mullane)

  • 新增 PQprepare/PQsendPrepared() 函数,支持预备语句而不必指定其参数的数据类型(Abhijit Menon-Sen)

  • 许多 ECPG 改进,包括 SET DESCRIPTOR(Michael)

E.146.4.11. 源代码变更

  • 允许数据库服务器原生运行于 Windows(Claudio、Magnus、Andrew)

  • 把 shell 脚本命令转换为 C 版本以支持 Windows(Andrew)

  • 创建扩展 makefile 框架(Fabien Coelho、Peter)

    这简化了在原始源代码树之外构建扩展的任务。

  • 支持可重新定位的安装(Bruce)

    已安装文件(如 /share 目录)的目录路径现在相对于可执行文件的实际位置计算,因此安装树可以移动到其他地方而无需重新配置和重新构建。

  • --with-docdir 选择文档的安装位置;还允许 --infodir(Peter)

  • 新增 --without-docdir 以阻止安装文档(Peter)

  • 升级到 DocBook V4.2 SGML(Peter)

  • 新的 PostgreSQL CVS 标签(Marc)

    这是为了使组织更容易管理自己的 PostgreSQL CVS 仓库副本。来自主仓库的文件版本戳不会因向复制的仓库检入或从中检出而被破坏。

  • 澄清锁定代码(Manfred Koizar)

  • 缓冲区管理器清理(Neil)

  • 把平台测试与 CPU 自旋锁代码解耦(Bruce、Tom)

  • gcc 在 PA-RISC 上新增内联 test-and-set 代码(ViSolve、Tom)

  • 改进 i386 自旋锁代码(Manfred Spraul)

  • 清理自旋锁汇编代码以避免较新 gcc 版本的警告(Tom)

  • 从源代码树移除 JDBC;现为独立项目

  • 移除 libpgtcl 客户端接口;现为独立项目

  • 更准确地估计内存和文件描述符的使用(Tom)

  • Mac OS X 启动脚本的改进(Ray A.)

  • 新的 fsync() 测试程序(Bruce)

  • 重大文档改进(Neil、Peter)

  • 移除 pg_encoding;不再需要

  • 移除 pg_id;不再需要

  • 移除 initlocation;不再需要

  • 自动检测线程标志(不再需要手工测试)(Bruce)

  • 使用 Olson 的公有领域 timezone 库(Magnus)

  • 启用线程时,Unixware 上的后端可执行文件也使用线程标志(Bruce)

    Unixware 不能在同一可执行文件中混用线程化和非线程化目标文件,因此所有内容都必须编译为线程化。

  • psql 现在使用 flex 生成的词法分析器处理命令字符串

  • 重新实现后端各处使用的链表数据结构(Neil)

    这通过使列表追加和长度操作更高效来改进性能。

  • 允许动态装载的模块创建自己的服务器配置参数(Thomas Hallgren)

  • 新的巴西葡萄牙语版 FAQ(Euler Taveira de Oliveira)

  • 新增法语 FAQ(Guillaume Lelarge)

  • 新的用于 Windows 日志的 pgevent

  • 使 libpq 和 ECPG 在 OS X 上构建为正确的共享库(Tom)

E.146.4.12. 附加模块变更

  • contrib/dblink 的彻底改造(Joe)

  • contrib/dbmirror 改进(Steven Singer)

  • 新增 contrib/xml2(John Gray、Torchbox)

  • 更新了 contrib/mysql

  • 新版本的 contrib/btree_gist(Teodor)

  • 新的 contrib/trgmPostgreSQL 的三字母组匹配(Teodor)

  • 许多 contrib/tsearch2 改进(Teodor)

  • contrib/fuzzystrmatch 添加双变音位(Andrew)

  • 允许 contrib/pg_autovacuum 作为 Windows 服务运行(Dave Page)

  • contrib/dbsize 新增函数(Andreas Pflug)

  • 移除 contrib/pg_logger:被集成日志子进程取代

  • 移除 contrib/rserv:被多个独立项目取代

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。