企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# E.77\. 发布8.3 > **发布日期:** 2008-02-04 ## E.77.1\. 概述 随着显著的新功能和性能增强,此版本对于PostgreSQL是一个重大的飞跃。 通过越来越多的社区已经大大加快了发展的步伐成为可能。此版本增加了以下主要特性: * 全文搜索被集合到核心数据库系统中 * 支持SQL/XML标准,包含新的操作以及`XML`数据类型 * 枚举数据类型(`ENUM`) * 复合类型数组 * 通用唯一标识符(`UUID`)数据类型 * 添加控制是否`NULL`首先排序还是最后排序 * 可更新游标 * 服务器配置参数可以基于每个函数被设置 * 用户定义类型可以有类型修饰符 * 当更新表定义变化或者统计的时候,自动重新规划缓存查询 * 记录和统计收集中大量优化 * 为Windows上认证支持安全服务提供者接口(SSPI) * 支持多个并发autovacuum进程,和其它autovacuum优化 * 允许使用Microsoft Visual C++编译整个PostgreSQL发布 主要性能改进如下。大部分这些功能是自动的,不需要用户改变或者调整: * 在事务提交期间异步提交延迟写入WAL * 检查点写操作被分散在一个较长时间周期内用来平滑每个检查点中I/O剧增 * 堆元组(HOT)加快了大部分`UPDATE`和`DELETE`的 空间复用 * 及时后端写策略提高了磁盘写效率 * 为只读事务使用非持久事务ID减少开销和`VACUUM`需求 * 减少每个字段和每行存储开销 * 大顺序扫描不再频繁删除已使用缓存页 * 并发大顺序扫描可以共享磁盘读取 * `ORDER BY ... LIMIT`无需排序 在下面章节更详细解释了上面每一项。 ## E.77.2\. 迁移到版本8.3 使用pg_dump的备份/恢复为了那些希望从任何其它版本 迁移数据。 观察下面的不兼容性: ### E.77.2.1\. 普遍的 * 非字符数据类型不再自动转换为`TEXT` (Peter, Tom) 之前,如果一个非字符值被提供给要求`text`输入的操作者或函数, 它会自动转换为`text`,针对大多数(但不是全部)内置的数据类型。 这不再发生:为了所有非字符串类型需要显式转换为`text`。例如,这些 表达式曾执行: ``` substr(current_date, 1, 4) 23 LIKE '2%' ``` 但是现在分别导致 "函数不存在"和"操作符不存在"错误。 使用显式转换而不是: ``` substr(current_date::text, 1, 4) 23::text LIKE '2%' ``` (当然,你也可以使用更详细的`CAST()`语法了。) 该变化的原因是这些自动强制转换过于频繁引起令人惊讶操作。 一个例子是在以前的版本中,接受这个表达式,但并没有执行预期的内容: ``` current_date < 2017-11-17 ``` 这实际上比较日期为整数,这应该被(现在是)拒绝— 但双方自动转换都被转换为`text`并且执行文本比较, 因为当没有其他的`<`操作符的时候, `text < text`操作符可以匹配表达式。 类型`char(``_n_`)和 `varchar(``_n_`)仍然自动转换为`text`。 另外,自动转换到`text`仍然为输入级联(`||`)操作符执行, 只要至少一个输入是字符串类型。 * 来自`contrib/tsearch2`全文搜索特性已经被移动到核心服务器中,有一些小的语法变化 `contrib/tsearch2`包含一个兼容接口。 * `ARRAY(SELECT ...)`,其中`SELECT`没有返回行,现在返回 一个空数组,而不是NULL(Tom) * 基本数据类型的数组类型名不再是带有下划线前缀的基础类型名 当有可能时,旧的命名约定仍然采用, 但应用程序代码不应该再依赖于它。 代替使用新的`pg_type.typarray`列, 以确定与给定的类型相关联的数组数据类型。 * `ORDER BY ... USING` `_operator_`必须使用小于或者大于在btree操作符类中 定义的`_operator_` 为防止不一致结果添加该限制。 * `SET LOCAL`变化持续直到最外层事务截止,除非回滚(Tom) 之前在子事务提交后(`RELEASE SAVEPOINT`或者从PL/pgSQL异常块中退出) 丢失`SET LOCAL`的影响 * 在事务块中拒绝的命令在多语句查询字符串中被拒绝(Tom) 比如,`"BEGIN; DROP DATABASE; COMMIT"`被拒绝即使作为单一查询消息被提交。 * 事务块外部`ROLLBACK`发出`NOTICE`而不是`WARNING` (Bruce) * 阻止`NOTIFY`/`LISTEN`/`UNLISTEN`接受 模式限定名称(Bruce) 之前,这些命令接受`schema.relation`但是忽略模式部分,这是令人困惑的。 * `ALTER SEQUENCE`不再影响序列的`currval()`状态(Tom) * 外键必须匹配交叉数据类型引用的可索引条件(Tom) 这改善了语义一致性并且可以避免性能问题。 * 限制对象大小函数到拥有合理权限可以查看该信息的用户(Tom) 比如,`pg_database_size()`需要`CONNECT`权限, 这缺省授权给每一个人。`pg_tablespace_size()`在表空间上需要 `CREATE`权限,如果表空间是数据库缺省表空间,则允许。 * 删除非法的`!!=` (非in)操作符(Tom) `NOT IN (SELECT ...)`是执行该操作的正确方式。 * 内部哈希函数更加一致分布(Tom) 如果应用程序代码正使用内部PostgreSQL哈希函数计算并且存储哈希值, 那么哈希值必须被再生。 * 改变处理可变长度数据值C代码约定(Greg Stark, Tom) 新的`SET_VARSIZE()`宏_必须_用于设置生成`varlena`值的长度。 另外,它在更多情况中有必要扩展("de-TOAST")的输入值。 * 连续归档不再报告每个成功归档操作到服务器日志,除非使用`DEBUG`级别(Simon) ### E.77.2.2\. 配置参数 * 管理服务器参数中许多变化 删除`bgwriter_lru_percent`, `bgwriter_all_percent`, `bgwriter_all_maxpages`, `stats_start_collector`和 `stats_reset_on_server_start`。 `redirect_stderr`重命名为 `logging_collector`。 `stats_command_string`重命名为 `track_activities`。 `stats_block_level`和`stats_row_level` 被合并为`track_counts`。 一个新的布尔配置参数`archive_mode`控制归档。Autovacuum的缺省设置已改变。 * 删除`stats_start_collector`参数(Tom) 我们现在总是启动收集器处理过程,除非UDP套接创建失败。 * 删除`stats_reset_on_server_start`参数(Tom) 这被删除,因为`pg_stat_reset()`用于这一目的。 * `postgresql.conf`中注释参数导致它恢复到缺省值(Joachim Wieland) 之前,注释项留下参数的值未改变直到下次服务器重新启动。 ### E.77.2.3\. 字符编码 * 添加对无效编码数据的更多检查(Andrew) 该变化插入反斜杠逃逸字符串处理和`COPY`逃逸处理中存在的一些漏洞。 目前检查脱转义字符串看是否其结果创建了一个无效的多字节字符。 * 不允许与服务器的区域设置不一致的数据库编码(Tom) 在大多数平台上,`C`区域是与任何数据库编码执行的唯一区域。 其它区域设置说明了一个特定的编码,并且如果数据库编码不同,则错误操作(典型的症状包括虚假文本 排序顺序和来自`upper()`或者`lower()`的错误结果) 现在服务器拒绝尝试创建有一个不兼容编码的数据库。 * 确保`chr()`不能创建无效编码值(Andrew) 在UTF8编码数据库中`chr()`参数被认为Unicode代码点。 在其它多字节编码中`chr()`的参数必须指定7位ASCII字符。 不再接受零。调整`ascii()`以达到匹配。 * 调整`convert()`操作用来确保编码有效性(Andrew) `convert()`的两个参数形式已被删除。 这三个参数的形式现在需要`bytea`第一个参数,并返回一个`bytea`。 为了代替函数缺失,三个新的函数被添加: * `convert_from(bytea, name)`返回`text` — 从指定编码的第一个参数转化到数据库编码 * `convert_to(text, name)`返回`bytea` —; 转换数据库编码的第一个参数到指定编码 * `length(bytea, name)`返回`integer` — 给定指定编码字符中第一个参数长度 * 删除`转换(参数使用conversion_name)` (Andrew) 其操作不符合SQL标准。 * 客户端JOHAB编码(Tatsuo) JOHAB作为服务器端编码不安全。 ## E.77.3\. 变化 下面你将发现在PostgreSQL 8.3和之前主要发布版本之间变化的详细说明。 ### E.77.3.1\. 性能 * 在事务提交期间异步提交延迟写入WAL(Simon) 此功能极大地提高了短期数据修改事务性能。 缺点是由于磁盘写入延迟, 如果数据被写入到磁盘之前该数据库或操作系统崩溃, 那么提交的数据将会丢失。此功能对可以接受一些数据丢失的应用程序是有益处的。 不像关闭`fsync`, 使用异步提交不会把数据库一致性放在危险的处境中; 最坏的情况是崩溃后最后几个据称已提交的事务可能不会被提交。 此功能通过关闭`synchronous_commit`被启用 (由每个会话或每个事务来完成,如果一些事务是关键的,而另一些则不是)。 `wal_writer_delay`在事务实际到达磁盘之前可以被调整以控制最大延迟。 * 检查点写操作被分散在一个较长时间周期内用来平滑每个检查点中I/O剧增 (Itagaki Takahiro和Heikki Linnakangas) 以前所有修改过的缓冲区在检查点期间尽可能快地被强制到磁盘中, 造成I/O剧增,降低服务器的性能。 这种新方法在检查点中向外扩散到磁盘写入, 降低最大I/O使用。(尽可能快的写入用户请求和关闭检查点)。 * 堆元组(HOT)为`UPDATE`和`DELETE` 加速空间再利用(Pavan Deolasee, 还有许多其他的想法) `UPDATE`和`DELETE`舍弃死元组, 因为执行失败的`INSERT`。之前仅仅 `VACUUM`可以回收通过死元组采取的空间。 如果没有变化到索引列,那么在`INSERT`或者`UPDATE`的时候HOT死元组空间可以被自动回收。 这允许更加一致的性能。此外,HOT避免添加重复索引项。 * 实时后台写策略提高磁盘写入效率(Greg Smith, Itagaki Takahiro) 这极大降低了后台写入的手动调整需要。 * 降低每个字段和每行存储开销(Greg Stark, Heikki Linnakangas) 数据值小于128字节的可变长度数据类型将看到3至6个字节的存储减少。 例如,两个相邻的`char(1)`字段现在使用4个字节,而不是16。 行标头是比以前更短的4个字节。 * 为只读事务使用非持久事务ID减少开销和`VACUUM`需求(Florian Pflug) 非持久性事务ID不会增加全局事务计数器。因此,它能减少`pg_clog`上负载 并且增加强制vacuum以防止事务ID重叠期间的时间。 采取的其它性能改进提高了并发性。 * 在只读命令后避免增加命令计数器(Tom) 之前每个事务2<sup class="calibre28">32</sup>(4十亿)命令的硬性限制。 现在唯一的命令实际上改变了数据库计数, 因此,虽然这一限制仍然存在,它应该很少令人讨厌。 * 创建专用WAL写进程从后台卸载操作(Simon) * 为`CLUSTER`和`COPY`忽略不必要的WAL写进程(Simon) 除非启用WAL归档,那么在命令结尾为`CLUSTER`和`fsync()`表系统避免WAL写操作。 如果在同一个事务中创建该表,那么与`COPY`是一样的。 * 大顺序扫描不再频繁删除已使用缓存页(Simon, Heikki, Tom) * 并发大顺序扫描可以共享磁盘读取(Jeff Davis) 通过在表的中间开始新的顺序扫描被完成 (其中另一个顺序扫描在进行中),并返回开始以完成。 这会影响没有指定`ORDER BY`的查询中返回行的顺序。 如果有必要的话,`synchronize_seqscans`配置参数可以用来禁用它。 * `ORDER BY ... LIMIT`无需排序(Greg Stark) 这是通过顺序扫描表并且跟踪"top N"候选行执行, 而非执行全排序整个表。 当没有匹配索引并且`LIMIT`不大的时候,这是很有用的。 * 将信息上速度限制发送到后台统计收集器上(Tom) 这降低了短事务开销,但是可能有时在统计之前增加延迟。 * 完善许多空值情况下哈希连接性能(Tom) * 加快非精确数据类型匹配操作符查找情况(Tom) ### E.77.3.2\. 服务器 * 缺省启用Autovacuum (Alvaro) 进行了几处修改以消除启用自动清理的缺点, 从而证明缺省变化。一些其他自动清理参数缺省也被修改。 * 支持多个并发自动清理进程(Alvaro, Itagaki Takahiro) 这允许同时运行多个清理。这可以阻止大表清理延迟小表清理。 * 当表定义变化或者统计被更新的时候,自动重新规划缓存查询(Tom) 如果临时表在函数调用之间被删除并且重新创建, 之前引用临时表的PL/pgSQL函数可能会失败, 除非使用`EXECUTE`。 这个改进解决了该问题和许多相关的问题。 * 添加`temp_tablespaces`参数 以控制临时表和文件的表空间(Jaime Casanova,Albert Cervera, Bernd Helmle) 该参数定义了要使用的表空间列表。 启用在多个表空间上分散I/O负载。 随机表空间在创建一个临时对象时被选择。 临时文件不再存储在每个数据库`pgsql_tmp/`目录中, 而在每个表空间目录中。 * 将临时表的TOAST表放在`pg_toast_temp_``_nnn_`命名的特殊模式中(Tom) 这使得低级别的代码将这些表看作临时的, 这可以启动各种优化比如没有WAL日志记录更改 并且使用本地而不是共享缓存的访问。这也修复了一个错误, 其中后端意外保持打开的文件引用到临时TOAST表。 * 修复新连接请求恒流可能无限延迟postmaster完成关机或者死机重启的问题(Tom) * 警惕非常低概率的数据丢失情况,防止 重新使用已删除表的relfilenode,直到下一个检查点之后(Heikki) * 修复`CREATE CONSTRAINT TRIGGER`用来转换旧形式外键触发器定义 到规则外键约束(Tom) 这将缓解来自7.3之前数据库外键约束移植,如果它们从来没使用`contrib/adddepend`被转移。 * 修复`DEFAULT NULL`重写继承的缺省值(Tom) `DEFAULT NULL`之前被认为噪声短语,但是它应该(并且现在)覆盖非零缺省 否则从父表或者域中被继承。 * 添加新的编码EUC_JIS_2004和SHIFT_JIS_2004 (Tatsuo) 这些新编码可以从UTF-8被转换。 * 从"数据库系统准备就绪"到"数据库系统准备接受连接" 改变服务器启动日志信息,并且调整其定时 仅仅当postmaster准备好接受连接的时候出现该信息。 ### E.77.3.3\. 监控 * 添加`log_autovacuum_min_duration`参数以支持autovacuum活动可配置记录(Simon, Alvaro) * 添加`log_lock_waits`记录锁等待(Simon) * 添加`log_temp_files`记录临时文件用法(Bill Moran) * 添加`log_checkpoints`参数完善检查点记录(Greg Smith, Heikki) * `log_line_prefix`目前支持所有过程中 `%s`和`%c`逃逸(Andrew) 之前这些逃逸只用于用户会话中,而不是后台数据库过程。 * 添加`log_restartpoints`控制即时恢复重启点记录(Simon) * 最后事务结束时间被记录到恢复结束和每个记录重启点(Simon) * Autovacuum报告`pg_stat_activity`中活动启动时间(Tom) * 允许逗号分隔值(CSV)形式的服务器日志输出(Arul Shaji, Greg Smith, Andrew Dunstan) CSV格式日志文件可以很容易为后续分析被加载到数据库表中。 * 使用PostgreSQL提供的时区支持服务器日志中显示的格式时间戳(Tom) 这避免了提供错误编码中本地化时区名称Windows特定问题。 有一个新的`log_timezone`参数控制用于日志消息中的时区, 独立于客户端可见`timezone`参数。 * 新系统视图`pg_stat_bgwriter`显示关于后台写活动统计(Magnus) * 为数据库端元组统计添加新列到`pg_stat_database` (Magnus) * 添加`xact_start` (事务启动时间)列到 `pg_stat_activity` (Neil) 这使得很容易识别长期存在的事务。 * 添加`n_live_tuples`和`n_dead_tuples`列到 `pg_stat_all_tables`和相关视图中(Glen Parker) * 合并`stats_block_level`和`stats_row_level` 参数到单一参数`track_counts`,这控制着发送到统计收集器过程的所有信息(Tom) * 重命名`stats_command_string`参数为 `track_activities` (Tom) * 修复活的和死的元组统计计数以意识到已提交的和终止的事务有不同效果(Tom) ### E.77.3.4\. 认证 * 为Windows上认证支持安全服务提供者接口(SSPI) (Magnus) * 支持GSSAPI 认证(Henry Hotz, Magnus) 这是首先的本地Kerberos认证,因为GSSAPI是行业标准。 * 支持全球SSL配置文件(Victor Wagner) * 添加`ssl_ciphers`参数控制可接受SSL加密(Victor Wagner) * 添加Kerberos范围参数,`krb_realm` (Magnus) ### E.77.3.5\. 预写日志(WAL)和连续归档 * 改变来自time_t到TimestampTz表示形式的事务WAL记录中的时间戳记录(Tom) 在WAL中提供了列居第二位解决方法。这对于点即时恢复有益处。 * 减少热备份服务器需要的WAL磁盘空间(Simon) 这种变化允许热备用服务器传递最早仍然需要WAL文件名字到恢复脚本, 允许不再需要的WAL文件自动清除。 使用`recovery.conf`中`restore_command`参数 `%r`的执行。 * 新的布尔配置参数,`archive_mode`,控制归档(Simon) 之前设置`archive_command`为空字符串关闭归档。现在`archive_mode` 使归档开启和关闭,独立于`archive_command`。 这用于暂时停止归档。 ### E.77.3.6\. 查询 * 全文搜索被集合到核心数据库系统中(Teodor, Oleg) 文本搜索已被改进,移动到核心代码中,并且缺省安装。 `contrib/tsearch2`包含兼容接口。 * 添加控制是否`NULL`首先排序还是最后排序(Teodor, Tom) 语法是`ORDER BY ... NULLS FIRST/LAST`。 * 允许每列升序/降序(`ASC`/`DESC`)索引排序选项(Teodor, Tom) 之前使用带有混合`ASC`/`DESC`说明符`ORDER BY`的查询 不能完全使用索引。如果使用匹配的`ASC`/`DESC`说明符创建索引, 那么现在在这种情况中可以完全使用索引。可以控制索引中`NULL`排序顺序。 * 允许`col IS NULL`使用索引(Teodor) * 可更新游标(Arul Shaji, Tom) 这消除了参考主键到游标返回的`UPDATE`或者`DELETE`行的需要。 语法为`UPDATE/DELETE WHERE CURRENT OF`。 * 允许游标中`FOR UPDATE` (Arul Shaji, Tom) * 创建通用机制为_每个_数据类型支持来自标准字符串类型(`TEXT`, `VARCHAR`, `CHAR`)转换,通过调用数据类型的I/O函数(Tom) 之前,这样的转换只适用于此目的具有专门函数的类型。 这些新的类型转换只在字符串方向被分配,显式仅在其他方向, 因此应该创建不令人惊讶的操作。 * 当所有输入是域类型时,允许`UNION`和相关结构返回域类型(Tom) 之前,输出可能被认为是域的基本类型。 * 当使用两种不同数据类型的时候,允许有限的散列(Tom) 这允许哈希连接,哈希索引,散列子规划,以及 在涉及跨数据类型比较的情况下使用的散列聚合, 如果该数据类型具有兼容的散列函数。 目前,跨数据类型散列支持存在于`smallint`/`integer`/`bigint`, 以及`float4`/`float8`中。 * 当`WHERE`子句中变量相等时,改善优化逻辑检测(Tom) 这允许降序排序顺序合并连接,并且改进识别冗余排序列。 * 在大多数表通过约束被排除的情况下规划大继承树时,提高性能(Tom) ### E.77.3.7\. 对象操作 * 复合类型数组(David Fetter, Andrew, Tom) 除了显式声明的复合类型的数组外, 目前支持常规表和视图行类型数组,除了系统目录行类型,序列和TOAST表。 * 每个函数基础上设置服务器配置参数(Tom) 比如,如果在运行时存在不同的`search_path`,函数可以设置自身的`search_path` 避免意外操作。安全定义函数可以设置`search_path`以避免安全漏洞。 * `CREATE/ALTER FUNCTION`现在可以支持 `COST`和`ROWS`选项(Tom) `COST`允许函数调用成本的说明。 `ROWS`允许平均数或者设置返回函数返回的行的说明。 在选择最佳规划中通过优化器使用这些值。 * 实现`CREATE TABLE LIKE ... INCLUDING INDEXES` (Trevor Hardcastle, Nikhil Sontakke, Neil) * 允许`CREATE INDEX CONCURRENTLY`忽略其它数据库中事务(Simon) * 添加`ALTER VIEW ... RENAME TO`和 `ALTER SEQUENCE ... RENAME TO` (David Fetter, Neil) 之前这可能通过`ALTER TABLE ... RENAME TO`执行。 * 使得`CREATE/DROP/RENAME DATABASE`短暂等待冲突后端在失败之前退出(Tom) 这增加了这些命令成功的可能性。 * 允许触发器和规则出于复制目的在使用配置参数组中无效(Jan) 这允许复制系统禁用触发器并且重写规则作为无需直接修改系统目录组。 该操作通过`ALTER TABLE`和新参数`session_replication_role`被 控制。 * 用户定义类型可以有类型修饰符(Teodor, Tom) 这允许用户定义类型采取修饰符,像`ssnum(7)`。 之前只有内置数据类型可以有修饰符。 ### E.77.3.8\. 实用命令 * 非超级用户数据库所有者可以添加可信任程序语言到缺省数据库中(Jeremy Drake) 虽然这是相当安全的,一些管理员可能希望撤销该权限。 通过`pg_pltemplate`.`tmpldbacreate`控制。 * 允许会话的当前参数设置作为将来会话缺省使用(Tom) 在`CREATE/ALTER FUNCTION`, `ALTER DATABASE`, 或者`ALTER ROLE`中使用`SET ... FROM CURRENT`执行。 * 实现新的命令`DISCARD ALL`, `DISCARD PLANS`, `DISCARD TEMPORARY`, `CLOSE ALL`和 `DEALLOCATE ALL` (Marko Kreen, Neil) 这些命令简化重置数据库会话到它的初始状态,并且特别有利于连接池软件。 * 使得`CLUSTER` MVCC-安全(Heikki Linnakangas) 之前,`CLUSTER`可能丢弃所有已提交为死的元组, 即使仍然有事务可以在MVCC可见规则下看到它们。 * 添加`CLUSTER`语法: `CLUSTER` `_table_` USING `_index_` (Holger Schurig) 仍然支持旧的`CLUSTER`语法,但是新形式更加合理。 * 修复`EXPLAIN`以致于它可以更加准确显示复杂规划(Tom) 参考子规划输出总是正确被显示,而不是为复杂情况使用`?column``_N_`?。 * 当删除用户的时候,限制报导信息量(Alvaro) 之前,删除(或尝试删除)拥有很多对象的用户 可能导致列出所有这些对象的大的`NOTICE`或者 `ERROR`信息; 这造成一些客户端应用程序问题。信息长度是有限的, 但一个完整列表仍被发送到服务器日志。 ### E.77.3.9\. 数据类型 * 支持SQL/XML标准,包含新的操作以及`XML`数据类型(Nikolay Samokhvalov, Pavel Stehule, Peter) * 枚举数据类型(`ENUM`) (Tom Dunstan) 这个特性提供了方便支持小的,不变设置允许值的字段。 创建`ENUM`类型的例子是`CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy')`。 * 通用唯一标识符(`UUID`)数据类型(Gevik Babakhani, Neil) 这紧密匹配RFC 4122。 * 加宽`MONEY`数据类型到64位(D'Arcy Cain) 这大大增加了支持`MONEY`的范围 * 修复`float4`/`float8`以不断地处理 `Infinity`和`NAN`(非数字)(Bruce) 之前代码关于从溢出条件中识别`Infinity`是不一致的。 * 在`boolean`值的输入中允许前导和尾随空格(Neil) * 阻止`COPY`使用数字和大小写字母作为分隔符(Tom) ### E.77.3.10\. 函数 * 添加新规则表达式函数 `regexp_matches()`, `regexp_split_to_array()`和 `regexp_split_to_table()` (Jeremy Drake, Neil) 这些函数提供了正则表达式子表达式的提取,并且允许使用POSIX正则表达式分裂字符串。 * 为大对象截断添加`lo_truncate()`(Kris Jurka) * 为`float8`数据类型实现`width_bucket()`(Neil) * 添加`pg_stat_clear_snapshot()`用来丢弃当前事务中收集的统计快照(Tom) 事务中统计的第一个请求需要事务期间不发生变化的统计快照。 此函数允许快照被丢弃,并且在接下来的统计查询中加载一个新的快照。 这对PL/pgSQL函数特别有用, 这些函数被限制在一个单一事务中。 * 添加`isodow`选项`EXTRACT()`和`date_part()` (Bruce) 这返回一周中一天,星期日为七。(`dow`返回星期日为零) * 为`to_char()`,`to_date()`和`to_timestamp()`添加 `ID` (一周中ISO天)和`IDDD` (一年中ISO天)格式代码(Brendan Jurd) * 采用`to_timestamp()`和`to_date()`为潜在的可变宽度字段假设 `TM` (修剪)选项(Bruce) 这匹配Oracle的操作。 * 修复 `to_date()`/`to_timestamp()``D` (一周中非ISO天)字段中偏移一个单位转换错误(Bruce) * `setseed()`返回空,而不是无效整数值(Neil) * 为`NUMERIC`添加哈希函数(Neil) 这允许哈希索引和基于哈希规划用于`NUMERIC` 列。 * 提高`LIKE`/`ILIKE`的效率,尤其是 多字节字符集设置像UTF-8 (Andrew, Itagaki Takahiro) * 使用`currtid()`函数需要目标表上`SELECT`权限(Tom) * 添加几个`txid_*()`函数以查询活跃事务ID(Jan) 这对于各种复制方法是有用的。 ### E.77.3.11\. PL/pgSQL服务器端语言 * 添加可滚动游标支持,包含`FETCH`中方向控制(Pavel Stehule) * 允许`IN`作为PL/pgSQL的`FETCH`语句中 `FROM`的选择,与后端的`FETCH`命令一致(Pavel Stehule) * 添加`MOVE`到PL/pgSQL (Magnus, Pavel Stehule,Neil) * 实现`RETURN QUERY` (Pavel Stehule, Neil) 这添加了想要返回查询结果的PL/pgSQL设置返回函数的便捷语法。 `RETURN QUERY`比环绕`RETURN NEXT`更容易而且更有效。 * 允许函数参数名字符合函数的名字(Tom) 比如`myfunc.myvar`。 在变量名可能匹配列名的查询中声明变量非常有用。 * 使得块标签变量正常执行(Tom) 之前,外部级别块标签可能意外干扰内部级别记录或者行引用的识别。 * 严格控制`FOR`循环`STEP`值的需求(Tom) 防止非负`STEP`值,并且处理循环溢出。 * 当报告语法错误位置的时候,提高精度(Tom) ### E.77.3.12\. 其它服务器端语言 * 允许类型名参数到PL/Perl `spi_prepare()`成为数据类型别名, 除了`pg_type`中发现的名字(Andrew) * 允许类型名参数到PL/Python `plpy.prepare()`成为数据类型别名, 除了在`pg_type`中发现的名字(Andrew) * 允许类型名参数到PL/Tcl `spi_prepare`成为数据类型别名, 除了在`pg_type`中发现的名字(Andrew) * 启动PL/PythonU在Python 2.5上编译(Marko Kreen) * 支持在兼容的Python版本中(Python 2.3和之后版本)真正的PL/Python布尔类型 (Marko Kreen) * 修复后台中线程启用`libtcl`产生大量线程的PL/Tcl问题 (Steve Marshall, Paul Bayer,Doug Knight) 这导致了种种不愉快。 ### E.77.3.13\. [psql](#calibre_link-23) * 分别列出`\d`输出中禁用触发器(Brendan Jurd) * 在`\d`模式中,总是逐字匹配`$`(Tom) * 显示`\da`输出中聚合返回类型(Greg Sabino Mullane) * 添加函数的波动状态到`\df+`的输出中(Neil) * 添加`\prompt`性能(Chad Wagner) * 添加`\pset`, `\t`和 `\x`用来声明`on`或者`off`, 而不仅仅是切换(Chad Wagner) * 添加`\sleep`能力(Jan) * 为`\copy`启用`\timing`输出(Andrew) * 提高Windows上`\timing`方法(Itagaki Takahiro) * 在每个反斜杠命令后冲洗`\o`输出(Tom) * 当读取`-f`输入文件的时候,正确地检测和报告错误(Peter) * 删除`-u`选项(该选项已经很长时间不使用)(Tom) ### E.77.3.14\. [pg_dump](#calibre_link-437) * 添加`--tablespaces-only`和`--roles-only` 选项到pg_dumpall (Dave Page) * 添加输出文件选项到pg_dumpall (Dave Page) 这在Windows上有用,子pg_dump进程输出重定向不执行。 * 允许pg_dumpall接受初始连接数据库名而不是缺省`template1` (Dave Page) * 在`-n`和`-t`切换中,总是逐字匹配`$`(Tom) * 当数据库中有成千上万对象时提高性能(Tom) * 删除`-u`选项(该选项已经很长时间不使用)(Tom) ### E.77.3.15\. 其它客户端应用程序 * 在initdb中,允许指定`pg_xlog`目录位置(Euler Taveira de Oliveira) * pg_regress中支持的操作系统上启用服务器核心转储生成(Andrew) * 添加`-t` (超时)参数到pg_ctl(Bruce) 当等待服务器启动或者关闭的时候,这将控制pg_ctl等待的多长时间。 之前超时被硬连线为60秒。 * 添加pg_ctl选项来控制服务器核心转储生成(Andrew) * 允许控制C取消clusterdb,reindexdb和vacuumdb (Itagaki Takahiro, Magnus) * 为createdb,createuser,dropdb和 dropuser抑制命令标签输出(Peter) 忽略`--quiet`选项,并且在8.4中删除。 当在数据库上操作定位到标准输出上而非标准错误上时,促进信息,因为它们并不是真正错误。 ### E.77.3.16\. [libpq](#calibre_link-496) * 如果它包含一个等号,那么解析`PQsetdbLogin()`的`dbName`参数作为`conninfo`字符串(Andrew) 这允许客户端程序中`conninfo`字符串的使用仍然使用`PQsetdbLogin()`。 * 支持全局SSL配置文件(Victor Wagner) * 添加环境变量`PGSSLKEY`支持SSL硬件密钥(Victor Wagner) * 为大对象截断添加`lo_truncate()` (Kris Jurka) * 如果服务器需要密码但是没有提供,那么添加`PQconnectionNeedsPassword()`返回真(Joe Conway, Tom) 如果失败连接尝试后返回真,那么客户端应用程序应该提示用户输入密码。 以往应用程序不得不检查一个特定的错误消息字符串 以决定是否需要密码;这种方法现在已经弃用。 * 如果提供的密码已经被使用,那么添加`PQconnectionUsedPassword()`返回真(Joe Conway, Tom) 这在一些安全的地方是有用的,知道用户提供的密码是否有效非常重要。 ### E.77.3.17\. [ecpg](#calibre_link-620) * 使用V3 前端/后端协议(Michael) 这添加了对服务器端预备语句的支持。 * 使用本地支持,而不是Windows上pthreads(Magnus) * 提高ecpglib的线程安全(Itagaki Takahiro) * 使得ecpg库输出必要的API符号(Michael) ### E.77.3.18\. Windows端口 * 允许使用Microsoft Visual C++编译整个PostgreSQL发布(Magnus 和其他人) 这允许基于Windows的开发人员可以使用熟悉的开发和调试工具。 用Visual C++制作的Windows可执行文件比用其他工具集制作的可能有更好的稳定性和性能。 已经删除仅仅客户端的Visual C++编译脚本。 * 当有许多子进程的时候,大大减少postmaster的内存使用(Magnus) * 允许通过管理用户启动回归测试(Magnus) * 添加本地共享内存实现(Magnus) ### E.77.3.19\. 服务器编程接口(SPI) * 在SPI中添加游标相关功能(Pavel Stehule) 允许访问游标相关规划选项,并且添加`FETCH`/`MOVE`程序。 * 允许通过`SPI_execute`执行游标命令(Tom) 宏`SPI_ERROR_CURSOR`仍然存在但永远不会被返回。 * SPI规划指针被声明为`SPIPlanPtr`而不是`void *` (Tom) 这不会破坏应用程序代码,但是推荐切换来帮助捕获简单程序错误。 ### E.77.3.20\. 编译选项 * 添加configure选项`--enable-profiling` 用来启动代码分析(使用gcc执行)(Korry Douglas和Nikhil Sontakke) * 添加configure选项`--with-system-tzdata`用来 使用操作系统的时区数据库(Peter) * 修复PGXS,以致于扩展会不利于PostgreSQL的安装,其中 pg_config程序没有首先出现在`PATH`中(Tom) * 当构建SGML文档的时候,支持`gmake draft` (Bruce) 除非使用`draft`,如果确保索引是最新的,那么文档建立将被重复。 ### E.77.3.21\. 源代码 * 重命名宏`DLLIMPORT`到 `PGDLLIMPORT`以避免与包含(像Tcl)定义`DLLIMPORT`的第三方冲突 (Magnus) * 创建"操作符类"用来改善涉及交叉数据类型比较的查询规划(Tom) * 更新GIN `extractQuery()` API允许发送信号没什么可以满足查询(Teodor) * 删除从`postgres_ext.h`到`pg_config_manual.h`的`NAMEDATALEN`定义(Peter) * 在所有平台上提供`strlcpy()`和`strlcat()`, 并且替换`strncpy()`,`strncat()`的易出错的用法,等(Peter) * 创建钩子以便使外部插件监听(或者甚至替换)规划器并且为假设情况创建规划(Gurjeet Singh, Tom) * 创建函数变量`join_search_hook`让插件覆盖规划器的连接搜索顺序部分(Julius Stroffek) * 添加`tas()`支持Renesas的M32R处理器(Kazuhiro Inaoka) * `quote_identifier()`和pg_dump 不再引用依据语法未保留的关键字(Tom) * 改变`NUMERIC`数据类型的磁盘上的表示,以致于`sign_dscale`词在权重之前(Tom) * 使用SYSV信号而不是SYSV >= 6.0,即OS X 10.2及以上的POSIX(Chris Marcellino) * 添加[acronym](#calibre_link-424)和 [NFS](#calibre_link-1654)文档部分(Bruce) * "Postgres"作为"PostgreSQL"的公认别名(Peter) * 当服务器关闭的时候,添加关于避免数据库服务器欺骗的文档(Bruce) ### E.77.3.22\. Contrib * 移动`contrib` `README`内容到主PostgreSQL文档 (Albert Cervera i Areny) * 为低级别页面检查添加`contrib/pageinspect`(Simon, Heikki) * 为控制热备份操作添加`contrib/pg_standby`模块(Simon) * 为使用OSSP UUID库生成`UUID`值添加`contrib/uuid-ossp`模块(Peter) 使用configure`--with-ossp-uuid`激活, 这利用新的`UUID`内置类型。 * 添加`contrib/dict_int`,`contrib/dict_xsyn`和 `contrib/test_parser`模块提供样本的附加文本搜索词典模板和解析器(Sergey Karpov) * 允许contrib/pgbench设置填充因子(Pavan Deolasee) * 添加时间戳到contrib/pgbench `-l`(Greg Smith) * 添加使用次数统计到`contrib/pgbuffercache` (Greg Smith) * 为`contrib/hstore`添加GIN支持(Teodor) * 为`contrib/pg_trgm`添加GIN支持(Guillaume Smet, Teodor) * 在`contrib/start-scripts`中更新OS/X启动脚本(Mark Cotner, David Fetter) * 限制`pgrowlocks()`和 `dblink_get_pkey()`到在目标表上拥有`SELECT`权限的用户中(Tom) * 限制`contrib/pgstattuple`函数到超级用户(Tom) * `contrib/xml2`过时了,计划在8.4中删除(Peter) 核心PostgreSQL中新的XML支持取代该模块。