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

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

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

E.195. 版本 8.1 #

发行日期:. 2005-11-08

E.195.1. 概述

此发行版的主要变更:

Improve concurrent access to the shared buffer cache (Tom)

对共享缓冲区缓存的访问被认定为显著的可伸缩性问题,特别是在多 CPU 系统上。在此版本中,缓冲区管理器中加锁的方式被彻底改造,以减少锁争用并改进可伸缩性。缓冲区管理器还被改为使用时钟扫描替换策略。

Allow index scans to use an intermediate in-memory bitmap (Tom)

在以前的版本中,对表做查找只能使用单个索引。有了此特性,如果查询有 WHERE tab.col1 = 4 and tab.col2 = 9,而 col1col2 上没有多列索引,但 col1 上有一个索引、col2 上有另一个索引,则可以搜索两个索引并在内存中合并结果,然后只对同时匹配 col1col2 限制的行做堆获取。这在有大量非结构化查询、不可能创建匹配所有可能访问条件的索引的环境中非常有用。位图扫描即使对单个索引也有用,因为它减少了所需的随机访问量;位图索引扫描对于检索整表中相当大的部分是高效的,而普通索引扫描则不是。

Add two-phase commit (Heikki Linnakangas, Alvaro, Tom)

两阶段提交允许在多台计算机上"预备"事务,一旦所有计算机都成功预备了各自的事务(无一失败),所有事务就可以提交。即使机器在预备后崩溃,预备的事务也可以在机器重启后提交。新语法包括 PREPARE TRANSACTIONCOMMIT/ROLLBACK PREPARED。还新增了系统视图 pg_prepared_xacts

Create a new role system that replaces users and groups (Stephen Frost)

角色是用户和组的组合。像用户一样,它们可以有登录能力;像组一样,角色可以拥有其他角色作为成员。角色基本上消除了用户和组的区别。例如,角色可以:

  • (可选地)拥有登录能力

  • 拥有对象

  • 持有数据库对象的访问权限

  • 从它是成员的其他角色继承权限

用户登录到角色后,就获得该登录角色加上任何继承角色的能力,并可以用 SET ROLE 切换到她是成员的其他角色。此特性是 SQL 标准角色概念的推广。此变更还用支持角色的新目录 pg_authidpg_auth_members 取代了 pg_shadowpg_group。旧表被重新定义为新角色表上的只读视图。

Automatically use indexes for MIN() and MAX() (Tom)

在以前的版本中,让 MIN()MAX() 使用索引的唯一方法是把查询改写为 SELECT col FROM tab ORDER BY col LIMIT 1。现在索引的使用自动发生。

Move /contrib/pg_autovacuum into the main server (Alvaro)

把 autovacuum 集成到服务器中使其可以随数据库服务器同步自动启动和停止,并允许从 postgresql.conf 配置 autovacuum。

Add shared row level locks using SELECT ... FOR SHARE (Alvaro)

虽然 PostgreSQL 的 MVCC 锁定使 SELECT 从不被写入者阻塞,因此典型操作不需要共享行锁,但共享锁对需要共享行锁定的应用程序很有用。特别是这降低了参照完整性检查施加的锁定要求。

Add dependencies on shared objects, specifically roles (Alvaro)

依赖机制的这一扩展防止角色在其仍拥有数据库对象时被删除。此前可能通过删除所有者而意外地使对象孤立。虽然这可以恢复,但既混乱又令人不快。

Improve performance for partitioned tables (Simon)

新的 constraint_exclusion 配置参数避免在约束表明子表中不存在匹配行时查找子表。

这支持一种基本的表分区。如果子表存储独立的键范围并用适当的 CHECK 约束强制执行,当约束保证子表中不存在匹配行时,优化器将跳过对子表的访问。

E.195.2. 迁移到版本 8.1

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

8.0 发行版宣布 interval 的 to_char() 函数将在 8.1 中移除。但由于没有提出更好的 API,to_char(interval) 在 8.1 中得到增强并将保留在服务器中。

请注意以下不兼容之处:

  • add_missing_from 现在默认为 false(Neil)

    默认情况下,如果查询中使用的表没有 FROM 引用,我们现在会产生错误。旧行为仍可用,但必须把参数设为 'true' 才能获得。

    如果转储包含用隐式 FROM 语法创建的视图或规则,可能需要把 add_missing_from 设为 true 才能装载现有转储文件。这应当只是一次性的麻烦,因为 PostgreSQL 8.1 会把这样的视图和规则转换为标准的显式 FROM 语法。因此后续转储不会有此问题。

  • 使 float4/float8/oid 输入零长度字符串('')抛出错误,而不是把它当作零(Neil)

    此变更与当前整数的零长度字符串处理一致。此变更的时间表在 8.0 中已宣布。

  • default_with_oids 现在默认为 false(Neil)

    此选项设为 false 后,用户创建的表不再有 OID 列,除非在 CREATE TABLE 中指定 WITH OIDS。虽然 OID 在 PostgreSQL 的所有版本中都存在,但它们的用途有限,因为它们只有四字节长,而且计数器在所有已安装数据库之间共享。唯一标识行的首选方式是通过序列和 SERIAL 类型,它们自 PostgreSQL 6.4 起就受支持。

  • 新增 E'' 语法,使最终普通字符串能按字面处理反斜杠(Bruce)

    目前 PostgreSQL 把字符串字面量中的反斜杠当作引入特殊转义序列(如 \n\010)处理。虽然这便于输入特殊值,但它非标准且使从其他数据库移植应用程序更困难。因此,PostgreSQL 项目计划移除字符串中反斜杠的特殊含义。为了向后兼容和满足想要特殊反斜杠处理的用户,创建了新的字符串语法。新字符串语法的写法是在启动字符串的单引号前紧挨着写 E,例如 E'hi\n'。虽然此版本不改变字符串中反斜杠的处理,但它确实新增了帮助用户为未来版本迁移应用程序的配置参数:

    • standard_conforming_strings——此版本是否按字面处理普通字符串中的反斜杠?

    • escape_string_warning——对普通(非 E)字符串中的反斜杠发出警告

    standard_conforming_strings 的值是只读的。应用程序可以检索该值以了解反斜杠如何被处理。(参数的存在也可被视为支持 E'' 字符串语法的标志。)在未来版本中,standard_conforming_strings 将为 true,意味着非 E 字符串中的反斜杠将按字面处理。为此变更做准备:在需要特殊反斜杠处理的地方使用 E'' 字符串,并打开 escape_string_warning 以找出其他需要转换为使用 E'' 的字符串。此外,用两个单引号('')在字符串中嵌入字面单引号,而不要用 PostgreSQL 支持的反斜杠单引号(\')语法。前者符合标准且不需要使用 E'' 字符串语法。也可以使用 $$ 字符串语法,它不特殊处理反斜杠。

  • REINDEX DATABASE 重新索引数据库中的所有索引(Tom)

    此前 REINDEX DATABASE 只重新索引系统表。新行为看起来更直观。新命令 REINDEX SYSTEM 提供只重新索引系统表的旧功能。

  • 只读大对象描述符现在遵循 MVCC 快照语义

    当大对象以 INV_READ(而非 INV_WRITE)打开时,从描述符读取的数据现在将反映调用 lo_open() 的查询所用事务快照时刻大对象状态的快照。要获得总是返回最新已提交数据的旧行为,请在 lo_open() 的模式标志中包含 INV_WRITE

  • 为序列函数的参数添加适当的依赖(Tom)

    在以前的版本中,传递给 nextval()currval()setval() 的序列名存储为简单文本字符串,这意味着重命名或删除 DEFAULT 子句中使用的序列会使子句无效。此版本把所有新创建的序列函数参数存储为内部 OID,使它们能跟踪序列重命名,并添加防止不当删除序列的依赖信息。它还使这样的 DEFAULT 子句不受模式重命名和搜索路径更改的影响。

    有些应用程序可能依赖旧的运行时查找序列名的行为。仍然可以通过把参数显式转换为 text 来做到,例如 nextval('myseq'::text)

    装载到 8.1 的 8.1 之前数据库转储将使用旧的基于文本的表示,因此不会有 OID 存储 参数的特性。但可以更新包含基于文本的 DEFAULT 子句的数据库。 首先,把下面这个查询保存到文件中,例如 fixseq.sql

    SELECT  'ALTER TABLE ' ||
       pg_catalog.quote_ident(n.nspname) || '.' ||
       pg_catalog.quote_ident(c.relname) ||
       ' ALTER COLUMN ' || pg_catalog.quote_ident(a.attname) ||
       ' SET DEFAULT ' ||
       regexp_replace(d.adsrc,
                      $$val\(\(('[^']*')::text\)::regclass$$,
                      $$val(\1$$,
                      'g') ||
       ';'
    FROM    pg_namespace n, pg_class c, pg_attribute a, pg_attrdef d
    WHERE   n.oid = c.relnamespace AND
       c.oid = a.attrelid AND
       a.attrelid = d.adrelid AND
       a.attnum = d.adnum AND
       d.adsrc ~ $$val\(\('[^']*'::text\)::regclass$$;
    

    然后,对数据库运行该查询以找出需要哪些调整,例如对数据库 db1

    psql -t -f fixseq.sql db1
    

    这会显示把数据库转换为较新的基于 OID 的表示所需的 ALTER TABLE 命令。 如果这些命令看起来合理,运行以下命令更新数据库:

    psql -t -f fixseq.sql db1 | psql -e db1
    

    此过程必须在每个要更新的数据库中重复进行。

  • psql 中,把未加引号的 \{digit}+ 序列当作八进制(Bruce)

    在以前的版本中,\{digit}+ 序列被当作十进制,只有 \0{digit}+ 被当作八进制。此变更是为了保持一致。

  • 移除前缀和后缀 %^ 操作符的语法产生式(Tom)

    它们从未被记录,而且使取模操作符(%)与负数一起使用变得复杂。

  • 让多边形的 &<&> 与 box 的"over"操作符一致(Tom)

  • CREATE LANGUAGE 可以忽略提供的参数而采用 pg_pltemplate 中的信息(Tom)

    定义了新系统目录 pg_pltemplate,携带过程语言首选定义的信息(例如是否有验证器函数)。当该目录中存在正要创建的语言的条目时,CREATE LANGUAGE 将忽略除语言名之外的所有参数而改用目录信息。采取此措施是因为旧转储文件装载过时语言定义的问题日益增多。从 8.1 起,pg_dump 将把过程语言定义只转储为 CREATE LANGUAGE name,依赖装载时存在模板条目。我们预期这将是更面向未来的表示。

  • pg_cancel_backend(int) 返回 boolean 而不是 integer(Neil)

  • 一些用户在向 8.1.X 装载 UTF-8 数据时遇到问题。这是因为以前的版本允许把无效 UTF-8 字节序列输入数据库,而此版本只正确接受有效的 UTF-8 序列。纠正转储文件的一种方法是运行命令 iconv -c -f UTF-8 -t UTF-8 -o cleanfile.sql dumpfile.sql-c 选项移除无效字符序列。两个文件的 diff 会显示无效的序列。iconv 把整个输入文件读入内存,因此可能需要用 split 把转储拆成多个较小的文件处理。

E.195.3. 附加变更

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

E.195.3.1. 性能改进

  • 改进 GiST 和 R-tree 索引性能(Neil)

  • 改进优化器,包括哈希连接的自动调整大小(Tom)

  • 彻底改造若干领域的内部 API

  • 把 WAL 记录的 CRC 从 64 位改为 32 位(Tom)

    我们认定计算 64 位 CRC 的额外代价显著,而可靠性收益太小不值得。

  • 防止在 WAL 页中写入大的空隙(Tom)

  • 改进 SMP 机器(特别是 Opteron)上的自旋锁行为(Tom)

  • 允许多列索引使用非连续的索引列(Tom)

    例如,这允许 a,b,c 列上的索引用于 WHERE a = 4 and c = 10 的查询。

  • 跳过 CREATE TABLE AS / SELECT INTO 的 WAL 日志(Simon)

    由于 CREATE TABLE AS 期间的崩溃会导致表在恢复期间被删除,没有理由在装载表时写 WAL 日志。(但如果启用了 WAL 归档,仍会记录。)

  • 允许并发 GiST 索引访问(Teodor、Oleg)

  • 新增配置参数 full_page_writes,控制向 WAL 写整页(Bruce)

    为防止部分磁盘写损坏数据库,PostgreSQL 在检查点后首次修改每个数据库磁盘页时把它的完整副本写入 WAL。此选项为提高速度关闭该功能。在使用电池供电的磁盘缓存(不会发生部分页写)时可以安全使用。

  • wal_sync_method 使用 O_SYNC 时,如果可用则使用 O_DIRECT(Itagaki Takahiro)

    O_DIRECT 使磁盘写绕过内核缓存,对 WAL 写入而言这改进了性能。

  • 改进 COPY FROM 的性能(Alon Goldshuv)

    这是通过以更大的块读取 COPY 输入而不是逐字符读取实现的。

  • 改进 COUNT()SUMAVG()STDDEV()VARIANCE() 的性能(Neil、Tom)

E.195.3.2. 服务器变更

  • 防止事务 ID(XID)回卷导致的问题(Tom)

    当事务计数器接近回卷点时,服务器现在会发出警告。如果计数器过于接近回卷,服务器将停止接受查询。这确保在执行所需清理之前数据不会丢失。

  • 修复 OID 计数器回卷后对象 ID(OID)与现有系统对象冲突的问题(Tom)

  • 新增关于 VACUUM 期间需要增大 max_fsm_relationsmax_fsm_pages 的警告(Ron Mayer)

  • 新增 temp_buffers 配置参数,允许用户确定临时表访问的本地缓冲区大小(Tom)

  • pg_stat_activity 新增会话开始时间和客户端 IP 地址(Magnus)

  • 为位图扫描调整 pg_stat 视图(Tom)

    某些字段的含义略有变化。

  • 增强 pg_locks 视图(Tom)

  • 记录客户端 PREPAREEXECUTE 的查询(Simon)

  • 允许在 postgresql.conf 中指定 Kerberos 名和用户名的大小写敏感性(Magnus)

  • 新增配置参数 krb_server_hostname,使服务器主机名可以被指定为服务主体的一部分(Todd Kover)

    如果未设置,可以使用与 keytab 中条目匹配的任何服务主体。这是此版本新的 Kerberos 匹配行为。

  • log_line_prefix 新增毫秒时间戳(%m)和远程主机(%h)选项(Ed L.)

  • 为 GiST 索引新增 WAL 日志(Teodor、Oleg)

    GiST 索引现在对崩溃和时间点恢复是安全的。

  • 执行 pg_stop_backup() 时移除旧的 *.backup 文件(Bruce)

    这防止 pg_xlog/ 中存在大量 *.backup 文件。

  • 新增控制 TCP/IP keep-alive 空闲时间、间隔和次数的配置参数(Oliver Jowett)

    可以更改这些值以更快检测丢失的客户端连接。

  • 新增逐用户和逐数据库的连接限制(Petr Jelinek)

    使用 ALTER USERALTER DATABASE,现在可以对以特定用户身份或到特定数据库并发连接的最大会话数施加限制。把限制设为零禁用用户或数据库连接。

  • 允许 64 位机器上超过 2GB 的共享内存和逐后端工作内存(Koichi Suzuki)

  • 新系统目录 pg_pltemplate 允许覆盖转储文件中过时的过程语言定义(Tom)

E.195.3.3. 查询变更

  • 新增临时视图(Koju Iijima、Neil)

  • 修复没有任何聚合函数或 GROUP BYHAVING,使查询返回单个组(Tom)

    此前这种情形会把 HAVING 子句当作 WHERE 子句。这不符合规范。

  • 新增 USING 子句,允许为 DELETE 指定额外的表(Euler Taveira de Oliveira、Neil)

    在以前的版本中,没有明确的方法为 DELETE 语句指定用于连接的额外表。UPDATE 已有用于此目的的 FROM 子句。

  • 新增对后端和 ecpg 字符串中 \x 十六进制转义的支持(Bruce)

    这就像标准的 C \x 转义语法。八进制转义此前已支持。

  • 新增 BETWEEN SYMMETRIC 查询语法(Pavel Stehule)

    此特性允许 BETWEEN 比较而不要求第一个值小于第二个值。例如 2 BETWEEN [ASYMMETRIC] 3 AND 1 返回假,而 2 BETWEEN SYMMETRIC 3 AND 1 返回真。BETWEEN ASYMMETRIC 此前已支持。

  • SELECT ... FOR UPDATE/SHARE 新增 NOWAIT 选项(Hans-Juergen Schoenig)

    虽然 statement_timeout 配置参数允许取消耗时超过一定时间的查询,但 NOWAIT 选项允许在 SELECT ... FOR UPDATE/SHARE 命令不能立即获得行锁时立刻取消查询。

E.195.3.4. 对象操作变更

  • 跟踪共享对象的依赖(Alvaro)

    PostgreSQL 允许全局表(用户、数据库、表空间)引用多个数据库中的信息。此新增为全局表添加了依赖信息,因此例如用户所有权可以跨数据库跟踪,在任何数据库中拥有某些东西的用户不能再被删除。数据库本地对象的依赖跟踪此前已存在。

  • 允许对象所有者执行有限的 ALTER OWNER 命令(Stephen Frost)

    以前的版本只允许超级用户更改对象所有者。现在,如果执行命令的用户拥有该对象并能以新所有者身份创建它(即该用户是新所有角色的成员且该角色具有重新创建对象所需的 CREATE 权限),就可以转移所有权。

  • 为某些对象类型(表、函数、类型)新增 ALTER 对象 SET SCHEMA 能力(Bernd Helmle)

    这允许把对象移到不同的模式。

  • 新增 ALTER TABLE ENABLE/DISABLE TRIGGER 来禁用触发器(Satoshi Nagayasu)

E.195.3.5. 工具命令变更

  • 允许 TRUNCATE 用单条命令截断多个表(Alvaro)

    由于参照完整性检查,不允许截断作为参照完整性约束一部分的表。使用此新功能,如果参照完整性约束涉及的两个表在同一条 TRUNCATE 命令中被截断,就可以用 TRUNCATE 截断这样的表。

  • COPY CSV 模式中正确处理回车和换行(Andrew)

    在 8.0 版本中,CSV COPY TO 中的回车和换行的处理方式不一致。(这记录在 TODO 列表中。)

  • 新增 COPY WITH CSV HEADER,允许 COPY 的第一行为头行(Andrew)

    这允许处理把列名放在数据文件首行的常见 CSV 用法。对 COPY TO,首行包含列名;对 COPY FROM,首行被忽略。

  • 在 Windows 上,EXPLAIN ANALYZE 显示更好的亚秒精度(Magnus)

  • EXPLAIN ANALYZE 新增触发器时长显示(Tom)

    以前的版本把触发器执行时间计入总执行时间,但没有单独显示。现在可以看到每个触发器花费多少时间。

  • 新增对 COPY\x 十六进制转义的支持(Sergey Ten)

    以前的版本只支持八进制转义。

  • SHOW ALL 包含变量描述(Matthias Schmidt)

    SHOW varname 仍然只显示变量的值,不包含描述。

  • initdb 创建名为 postgres 的新标准数据库,并把工具转换为用 postgres 而不是 template1 做标准查找(Dave)

    在以前的版本中,template1 既被用作 createuser 等工具的默认连接,又被用作新数据库的模板。这导致 CREATE DATABASE 有时失败,因为如果其他人在模板数据库中就无法创建新数据库。有了此变更,默认连接数据库现在是 postgres,意味着 CREATE DATABASE 期间有人正在使用 template1 的可能性小得多。

  • 通过把 /contrib/reindexdb 移入服务器来创建新的 reindexdb 命令行工具(Euler Taveira de Oliveira)

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

  • 为数组类型新增 MAX()MIN() 聚合(Koju Iijima)

  • 修复 to_date()to_timestamp() 在同时使用 CCYY 字段时合理行事(Karel Zak)

    如果格式说明包含 CC 而年规格为 YYY 或更长,忽略 CC。如果年规格为 YY 或更短,把 CC 解释为上一个世纪。

  • 新增 md5(bytea)(Abhijit Menon-Sen)

    md5(text) 此前已存在。

  • 新增对 numeric ^ numeric 的支持,基于 power(numeric, numeric)

    该函数此前已存在,但没有为它分配操作符。

  • 修复 NUMERIC 取模,在计算期间正确截断商(Bruce)

    在以前的版本中,大值的取模有时因商的四舍五入而返回负结果。

  • 新增函数 lastval()(Dennis Björklund)

    lastval()currval() 的简化版本。它根据当前会话最近执行的 nextval()setval() 调用自动确定正确的序列名。

  • 新增 to_timestamp(DOUBLE PRECISION)(Michael Glaesemann)

    把自 1970 年以来的 Unix 秒数转换为 TIMESTAMP WITH TIMEZONE

  • 新增 pg_postmaster_start_time() 函数(Euler Taveira de Oliveira、Matthias Schmidt)

  • 允许在 AT TIME ZONE 中完整使用时区名,而不只是以前可用的短列表(Magnus)

    此前 AT TIME ZONE 只支持预定义的时区名列表。现在可以使用任何受支持的时区名,例如:

    SELECT CURRENT_TIMESTAMP AT TIME ZONE 'Europe/London';
    

    在上面的查询中,使用的时区根据所提供日期当时有效的夏令时规则调整。

  • 新增 GREATEST()LEAST() 可变参数函数(Pavel Stehule)

    这些函数接受可变数量的参数,返回参数中的最大或最小值。

  • 新增 pg_column_size()(Mark Kirkwood)

    它返回列的存储大小,该列可能被压缩过。

  • 新增 regexp_replace()(Atsushi Ogawa)

    这允许像 sed 那样做正则表达式替换。可选的标志参数允许选择全局(全部替换)和不区分大小写模式。

  • 修复 interval 的除法和乘法(Bruce)

    以前的版本有时返回没有道理的结果,例如 '4 months'::interval / 5 返回 '1 mon -6 days'

  • 修复 timestamp、time 和 interval 输出的舍入行为(Tom)

    这修复了秒字段会显示为 60 而不是进位到更高字段的一些情形。

  • interval 类型新增单独的天字段,使一天间隔可与 24 小时间隔区分(Michael Glaesemann)

    包含夏令时调整的天不是 24 小时长,而通常是 23 或 25 小时。此变更创建了多少天间隔与多少小时间隔之间的概念区别。向时间戳加 1 day 现在即使中间发生夏令时调整,也在第二天给出相同的本地时间,而加 24 hours 在这种情况下会给出不同的本地时间。例如,按美国 DST 规则:

    '2005-04-03 00:00:00-05' + '1 day' = '2005-04-04 00:00:00-04'
    '2005-04-03 00:00:00-05' + '24 hours' = '2005-04-04 01:00:00-04'
    
  • 新增 justify_days()justify_hours()(Michael Glaesemann)

    这两个函数分别把天调整为适当的整月数加天数,把小时调整为适当的整天数加小时数。

  • /contrib/dbsize 移入后端,并重命名其中一些函数(Dave Page、Andreas Pflug)

    • pg_tablespace_size()

    • pg_database_size()

    • pg_relation_size()

    • pg_total_relation_size()

    • pg_size_pretty()

    pg_total_relation_size() 包括索引和 TOAST 表。

  • 新增对集群目录只读文件访问的函数(Dave Page、Andreas Pflug)

    • pg_stat_file()

    • pg_read_file()

    • pg_ls_dir()

  • 新增 pg_reload_conf(),强制重新装载配置文件(Dave Page、Andreas Pflug)

  • 新增 pg_rotate_logfile(),强制轮转服务器日志文件(Dave Page、Andreas Pflug)

  • 更改 pg_stat_* 视图以包含 TOAST 表(Tom)

E.195.3.7. 编码和区域设置变更

  • 重命名一些编码使其更一致并遵循国际标准(Bruce)

    • UNICODE 现在是 UTF8

    • ALT 现在是 WIN866

    • WIN 现在是 WIN1251

    • TCVN 现在是 WIN1258

    原名仍然有效。

  • 新增对 WIN1252 编码的支持(Roland Volkmann)

  • 新增对四字节 UTF8 字符的支持(John Hansen)

    此前只支持一、二、三字节的 UTF8 字符。这对支持某些中文字符集特别重要。

  • 允许 EUC_JPSJIS 之间的直接转换以改进性能(Atsushi Ogawa)

  • 允许 UTF8 编码在 Windows 上工作(Magnus)

    这是通过把 UTF8 映射到 Windows 本机 UTF16 实现完成的。

E.195.3.8. 常规服务器端语言变更

  • 修复 ALTER LANGUAGE RENAME(Sergey Yatskevich)

  • 允许通过 ALTER FUNCTION 修改函数特性,如严格性和易变性(Neil)

  • 把函数参数的最大数量提高到 100(Tom)

  • 允许 SQL 和 PL/pgSQL 函数使用 OUTINOUT 参数(Tom)

    OUT 是函数返回值的另一种方式。除了使用 RETURN,还可以通过给声明为 OUTINOUT 的参数赋值来返回值。这在某些情形下书写更简单,特别是需要返回多个值时。虽然以前的版本也可以从函数返回多个值,但这大幅简化了该过程。(该特性将在未来版本中扩展到其他服务器端语言。)

  • 把语言处理函数移入 pg_catalog 模式

    这使按需删除 public 模式变得更容易。

  • 为 SPI 新增 SPI_getnspname()(Neil)

E.195.3.9. PL/pgSQL 服务器端语言变更

  • 彻底改造 PL/pgSQL 函数的内存管理(Neil)

    每个函数的分析树现在存储在单独的内存上下文中。这使该内存在不再需要时可以轻松回收。

  • CREATE FUNCTION 时检查函数语法,而不是在运行时(Neil)

    此前,大多数语法错误只在函数执行时才被报告。

  • 允许 OPEN 打开非 SELECT 查询,如 EXPLAINSHOW(Tom)

  • 不再要求函数发出 RETURN 语句(Tom)

    这是新增的 OUTINOUT 功能的副产品。当不需要提供函数返回值时可以省略 RETURN

  • 为 PL/pgSQL 的 EXECUTE 语句新增可选的 INTO 子句(Pavel Stehule、Neil)

  • CREATE TABLE AS 设置 ROW_COUNT(Tom)

  • 定义 SQLSTATESQLERRM,返回当前异常的 SQLSTATE 和错误消息(Pavel Stehule、Neil)

    这些变量只在异常块内定义。

  • 允许 RAISE 语句的参数为表达式(Pavel Stehule、Neil)

  • 新增循环 CONTINUE 语句(Pavel Stehule、Neil)

  • 允许块和循环标签(Pavel Stehule)

E.195.3.10. PL/Perl 服务器端语言变更

  • 允许高效返回大结果集(Abhijit Menon-Sen)

    这允许函数使用 return_next() 来避免在内存中构建整个结果集。

  • 允许逐行获取查询结果(Abhijit Menon-Sen)

    这允许函数使用 spi_query()spi_fetchrow() 来避免在内存中累积整个结果集。

  • 如果服务器编码为 UTF8,强制 PL/Perl 把字符串当作 UTF8 处理(David Kamholz)

  • 为 PL/Perl 新增验证器函数(Andrew)

    这使语法错误可以在定义时而不是执行时报告。

  • 当函数返回数组类型时允许 PL/Perl 返回 Perl 数组(Andrew)

    这基本上把 PostgreSQL 数组映射到 Perl 数组。

  • 允许 Perl 非致命警告生成 NOTICE 消息(Andrew)

  • 允许启用 Perl 的 strict 模式(Andrew)

E.195.3.11. psql Changes

  • 新增 \set ON_ERROR_ROLLBACK,允许事务中的语句出错而不影响事务的其余部分(Greg Sabino Mullane)

    这基本上是通过把每条语句包装在子事务中实现的。

  • 新增对 psql 变量中 \x 十六进制字符串的支持(Bruce)

    八进制转义此前已支持。

  • 新增对 troff -ms 输出格式的支持(Roger Leigh)

  • 允许历史文件的位置由 HISTFILE 控制(Andreas Seltenreich)

    这允许配置逐数据库的历史存储。

  • 防止 \x(扩展模式)影响 \d tablename 的输出(Neil)

  • psql 新增 -L 选项以记录会话(Lorne Sunley)

    添加此选项是因为某些操作系统没有简单的命令行活动记录功能。

  • \d 显示索引的表空间(Qingqing Zhou)

  • 允许 psql 帮助(\h)对正确的帮助信息做最佳猜测(Greg Sabino Mullane)

    这使用户只需在语法错误的查询前加上 \h 就能获得支持语法的帮助。此前必须删除命令名之外的任何附加查询文本才能使用 \h

  • 新增 \pset numericlocale,允许以区域感知的格式输出数字(Eugen Nedelcu)

    例如,使用 C 区域设置时 100000 会输出为 100,000.0,而欧洲区域设置可能输出为 100.000,0

  • 让启动横幅在服务器版本号与 psql 版本号不同时同时显示两者(Bruce)

    此外,如果服务器和 psql 来自不同的主版本,会显示警告。

E.195.3.12. pg_dump Changes

  • pg_restore 新增 -n / --schema 开关(Richard van den Berg)

    这允许只恢复指定模式中的对象。

  • 允许 pg_dump 即使在文本模式也转储大对象(Tom)

    有了此变更,大对象现在总是被转储;以前的 -b 开关是无操作。

  • 允许 pg_dump 转储大对象的一致快照(Tom)

  • 转储大对象的注释(Tom)

  • pg_dump 新增 --encoding(Magnus Hagander)

    这允许以不同于服务器编码的编码转储数据库。当把转储传送到不同编码的机器时这很有价值。

  • 过程语言依靠 pg_pltemplate(Tom)

    如果过程语言的调用处理器在 pg_catalog 模式中,pg_dump 不转储该处理器。而是只用 CREATE LANGUAGE name 转储该语言,依赖 pg_pltemplate 目录在装载时提供该语言的创建参数。

E.195.3.13. libpq Changes

  • 新增 PGPASSFILE 环境变量,指定口令文件的文件名(Andrew)

  • 新增 lo_create(),类似于 lo_creat() 但允许指定大对象的 OID(Tom)

  • libpqmalloc() 失败时一致地向客户端应用程序返回错误(Neil)

E.195.3.14. 源代码变更

  • 修复 pgxs 以支持针对重新定位的安装构建

  • 新增使用 Intel 编译器的 Itanium 处理器自旋锁支持(Vikram Kalsi)

  • 新增 Windows 的 Kerberos 5 支持(Magnus)

  • 新增中文 FAQ(laser@pgsqldb.com)

  • 把 Rendezvous 改名为 Bonjour 以与 OS/X 特性改名一致(Bruce)

  • 新增 Darwin 上对 fsync_writethrough 的支持(Chris Campbell)

  • 精简服务器、优化器和锁系统内部的信息传递(Tom)

  • 允许用 MSVC 编译 pg_config(Andrew)

    这是用 MSVC 构建 DBD::Pg 所必需的。

  • 移除对 Kerberos V4 的支持(Magnus)

    Kerberos 4 有安全漏洞且不再维护。

  • 代码清理(由 EnterpriseDB 执行 Coverity 静态分析)

  • 修改 postgresql.conf,使用文档默认的 on/off 而不是 true/false(Bruce)

  • 增强 pg_config,使其能报告更多构建期值(Tom)

  • 允许在 Windows 上把 libpq 构建为线程安全(Dave Page)

  • 允许在 Windows 上使用 IPv6 连接(Andrew)

  • 新增关于 I/O 子系统可靠性的服务器管理文档(Bruce)

  • 把私有声明从 gist.h 移到 gist_private.h(Neil)

    在以前的版本中,gist.h 既包含公共 GiST API(供 GiST 索引实现的作者使用),也包含 GiST 自身实现使用的一些私有声明。后者已被移到单独的文件 gist_private.h。大多数 GiST 索引实现应不受影响。

  • 彻底改造 GiST 内存管理(Neil)

    GiST 方法现在总是在短生命周期的内存上下文中调用。因此,通过 palloc() 分配的内存将被自动回收,GiST 索引实现不需要通过 pfree() 手动释放分配的内存。

E.195.3.15. 附加模块变更

  • 新增 /contrib/pg_buffercache contrib 模块(Mark Kirkwood)

    它显示缓冲区缓存的内容,用于调试和性能调优。

  • 移除 /contrib/array,因为它已过时(Tom)

  • 清理 /contrib/lo 模块(Tom)

  • /contrib/findoidjoins 移到 /src/tools(Tom)

  • /contrib/cube 移除 <<>>&<&> 操作符

    这些操作符没有用处。

  • 改进 /contrib/btree_gist(Janko Richter)

  • 改进 /contrib/pgbench(Tomoaki Sato、Tatsuo)

    现在有一套用用户提供的 SQL 命令脚本进行测试的设施,而不是只有硬编码的命令序列。

  • 改进 /contrib/pgcrypto(Marko Kreen)

    • 实现 OpenPGP 对称密钥和公钥加密

      支持 RSA 和 Elgamal 两种公钥算法。

    • 独立构建:包含 SHA256/384/512 哈希、Fortuna PRNG

    • OpenSSL 构建:支持 3DES,OpenSSL < 0.9.7 时使用内建 AES

    • configure 结果获取构建参数(OpenSSL、zlib)

      不再需要编辑 Makefile

    • 移除对 libmhashlibmcrypt 的支持

提交更正

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