版本 8.0.0

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 附录 E. 版本说明 | 下一页

# E.188. 版本 8.0.0

> 发布日期: 2005-01-19

## E.188.1. 概述

在这个版本中主要的修改是：

Microsoft Windows 本地服务器

  这是第一个作为一个服务器在Microsoft Windows® 上本地运行的PostgreSQL版本。 它可以作为一个Windows服务运行。这个版本支持基于NT的Windows版本， 像Windows 2000 SP4、Windows XP 和Windows 2003。老的版本像Windows 95、 Windows 98和Windows ME是不支持的， 因为这些操作系统没有支持PostgreSQL的基础结构。 已经创建了一个单独的安装项目简化在Windows上的安装— 参阅http://www.postgresql.org/ftp/win32/。

  尽管测试贯穿了我们的发布周期，但是Windows端口并没有得到多年在生产环境中使用的益处， PostgreSQL在Unix平台上所拥有的。 因此它应该和一个新产品一样被看做相同级别的警告。

  以前的版本需要Unix仿真工具箱Cygwin， 以便在Windows操作系统上运行服务器。PostgreSQL 在Windows上支持本地客户端已经很多年了。

检查点

  检查点允许一个事务的特定部分在不影响该事务剩余部分的情况下中止。 以前的版本没有这种能力；没有办法从事务中的语句失败中恢复， 除了中止整个事务。这个特性对于需要从复杂事务中错误恢复的应用程序写是有价值的。

时间点恢复

  在以前的版本中，没有办法从磁盘驱动的失败中恢复， 除了从一个以前的备份中还原或者使用一个备用应用服务器。 时间点恢复允许服务器的继续备份。你可以恢复到失败点或者到以前的一些事物。

表空间

  表空间允许管理员为单独表、索引和数据库的存储选择不同的文件系统。 这提高了性能并且控制了磁盘空间的使用。 以前的版本为这样的任务使用initlocation和人工符号连接管理。

改进了缓冲区管理、`CHECKPOINT`、`VACUUM`

  这个版本有一个更加智能的缓冲区替代策略，这将更好的利用可用的共享缓冲区和提高性能。 vacuum和检查点的性能影响也将减少。

更改字段类型

  字段的数据类型现在可以使用`ALTER TABLE`来更改。

新增Perl服务器端语言

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

`COPY`支持逗号分隔的值(CSV)

  `COPY`现在可以读取和写入逗号分隔的值的文件。 它也能灵活的解释非标准的引用和单独的字符。

## E.188.2. 迁移到版本 8.0.0

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

观察下面的不兼容性：

- 在`READ COMMITTED`序列化模式中， 不稳定的函数现在看到并发事务提交的结果一直到该函数中每个语句的开始， 而不是一直到调用该函数的交互命令的开始。

- 声明`STABLE`或`IMMUTABLE`的函数总是使用调用查询的快照， 并且因此看不到在该调用查询开始之后采取的动作的影响， 不管是在它们自己的事务中还是其他事务中。这样一个函数也必须是只读的， 意味着它不能使用任何SQL命令除了`SELECT`。

- 非延迟的`AFTER`触发器现在在触发器查询完成之后立即触发， 而不是基于当前交互命令的完成。这使得触发器查询发生在一个函数内部时有所不同： 触发器在函数继续它的下一个操作之前被调用。

- 服务器配置参数`virtual_host`和`tcpip_socket` 已经用一个更加一般的参数`listen_addresses`替代了。另外， 服务器现在缺省监听`localhost`， 消除了在很多情节中对`-i`参数开关的需要。

- 服务器配置参数`SortMem`和`VacuumMem` 已经被重命名为`work_mem`和`maintenance_work_mem`， 以更好的反映它们的使用。原始的名字在`SET`和 `SHOW`中仍然支持。

- 服务器配置参数`log_pid`、`log_timestamp`和 `log_source_port`已经用一个更加一般的参数`log_line_prefix`替代。

- 服务器配置参数`syslog`已经用一个更加合理的`log_destination` 变量替代，以控制日志输出目的地。

- 服务器配置参数`log_statement`已经被改变了， 所以它可以有选择的只记录数据库修改或数据定义语句。 服务器配置参数`log_duration`现在只在`log_statement` 输出该查询时输出。

- 服务器配置参数`max_expr_depth`已经用`max_stack_depth`替换了， `max_stack_depth`测量物理堆栈大小，而不是表达式嵌套深度。 这帮助了防止会话由于递归函数引起堆栈溢出而终止。

- `length()`函数不再计数`CHAR(n)`值中的尾随空白。

- 转换一个整数到`BIT(N)`，选取该整数的最右边的N位，不是像以前那样选择最左边的N位。

- 更新一个NULL数组值的元素或部分现在产生非空的数组结果， 也就是一个数组只包含分配到的位置。

- 数组输入值的语法检查已经被大大的收紧了。以前允许垃圾在一些奇怪的地方带有奇怪的结果， 现在导致一个错误。空字符串元素值现在必须被写为`""`，而不是什么都不写。 还改变了关于围绕着数组元素的空格的行为：现在忽略尾随的空白， 为了对称带有前导的空白（也总是被忽略）。

- 现在检测整数算术操作符的溢出并且报告为一个错误。

- 与单字节`"char"`数据类型有关的算术操作符已经被删除了。

- `extract()`函数（也称为`date_part`） 现在为BC日期返回适当的年份，它以前的返回比正确的年份少一。 该函数现在也为千年和世纪返回适当的值。

- `CIDR`值现在必须有它们的非标记位为0。例如，我们不再允许 `204.248.199.1/31`作为`CIDR`值。 这样的值应该决不被PostgreSQL接受并且将是拒绝的。

- `EXECUTE`现在返回一个完成标签匹配执行的语句。

- psql的`\copy`命令现在读取或写入到查询的 `stdin/stdout`，而不是psql的`stdin/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.188.3. 废弃的特性

PostgreSQL行为的一些方面已经被认定为是次优的。 为了向后兼容，这些在8.0中还没有被删除，但是他们已经被认为是废弃的， 并且将在下一个主版本中删除。

- 8.1版本将为间隔删除`to_char()`函数。

- 服务器现在警告传递到`oid`/`float4`/`float8` 数据类型的空字符串，但是仍然像以前一样将它们解释为0。 在下一个主版本中，这些数据类型的空字符串将被认为是无效的输入。

- 缺省的，在PostgreSQL 8.0和以前的版本中表是带有 `OID`创建的。在下一个版本中，将不会是这样情况了： 要创建一个包含`OID`的表，必须指定`WITH OIDS`子句， 或者必须设置`default_with_oids`配置参数。 如果用户的表需要OID与PostgreSQL的未来版本兼容， 那么鼓励用户明确的指定`WITH OIDS`。

## E.188.4. 修改列表

下面你将看到一个版本8.0和以前的主版本之间的修改的清单。

### E.188.4.1. 性能提升

- 支持交叉数据类型索引的使用 (Tom)

  在这个修改以前，如果数据类型不正好匹配那么许多查询不使用索引。 这次改进使得索引的使用更加直观和一致。

- 新的提高缓存的缓冲区置换策略 (Jan)

  以前的版本使用一个最近最少使用的(LRU)缓存在内存中保存最近引用的页面。 LRU算法不考虑一个特定缓存条目被访问的次数，所以大表扫描可能会占用有用的缓存页面。 新的缓存算法使用四个单独的列表追踪最近使用的和最频繁使用的缓存页面， 并且动态的基于工作负载优化他们的替换。这会导致更加有效的使用共享的缓冲区缓存。 在以前测试过共享缓冲区大小的管理员应该用这个新的缓存替换策略重新测试。

- 添加子进程定期的写脏的缓冲区，以减少检查点的写入 (Jan)

  在以前的版本中，检查点进程，每几分钟运行一次， 将所有的脏缓冲区写到操作系统的缓冲区缓存，然后刷新所有脏的操作系统缓冲区到磁盘。 这导致磁盘使用的一个定期的高峰经常伤害性能。 新的代码使用一个后端书写器以一个平稳的速度慢慢的磁盘写入， 这样检查点有少得多的脏页面写入到磁盘。另外，新的代码不发出一个全局的 `sync()`调用，但是只`fsync()`自最后一个检查点以来的文件写入。 这会提高性能并最小化检查点期间的降级。

- 添加延长vacuum以减少性能影响的能力 (Jan)

  在忙碌的系统上，`VACUUM`执行许多I/O请求， 这会影响其他用户的性能。这个版本允许你放缓`VACUUM` 的速度以减少它对其他用户的影响，虽然这样会增加`VACUUM` 的总的存续时间。

- 为重复的键提高B-tree索引性能 (Dmitry Tkach, Tom)

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

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

  以前规划器估算表的大小使用最后一个`VACUUM`或 `ANALYZE`看到的值，都是关于物理表大小（页数）和行数。 现在，当前物理表大小从内核中获得，行数是通过表大小乘以最后一个 `VACUUM`或`ANALYZE`看到的行密度 （每页的行数）估计的。这会产生更加可靠的估计， 以防表大小自最后一个内务工作命令之后发生了重大的变化。

- 用`OR`子句提高索引的使用 (Tom)

  这允许优化器在语句中使用索引，带有许多过去没有被索引的OR子句。 也可以在第一个字段是指定的、第二个字段是一个`OR` 子句的一部分的地方使用多字段索引。

- 提高部分索引子句的匹配 (Tom)

  服务器现在在包含复杂`WHERE`子句的查询中使用部分索引更加智能。

- 提高GEQO优化器的性能 (Tom)

  GEQO优化器用来规划包含许多表（缺省的，12个或更多）的查询。 这个版本加速了分析查询的方式，以减少花费在优化上的时间。

- 其他优化器改进

  这里没有列出所有小的改进，但是很多特殊情况比以前的版本运行的更好了。

- 提高C函数的查找速度 (Tom)

  这个版本为动态加载的C函数使用一个哈希表查找信息。 这提高了它们的速度，所以它们执行起来就和服务器可执行的内建函数一样快。

- 添加类型特定的`ANALYZE`统计能力 (Mark Cave-Ayland)

  这个特性允许在为非标准的数据类型产生统计信息时有更大的灵活性。

- `ANALYZE`现在为表达式索引收集统计信息 (Tom)

  表达式索引（也称作功能性索引）允许用户不只是索引字段，还有表达式的结果和函数调用。 用这个版本，优化器可以收集和使用关于表达式索引内容的统计信息。 这可以大大的提高表达式索引相关的查询的规划的质量。

- 为`ANALYZE`新增两阶段抽样方法 (Manfred Koizar)

  当有效行的密度与表的不同区域的密度非常不同时，这给出了更好的统计。

- 加速`TRUNCATE` (Tom)

  这找回了一些在7.4中观察到的性能丢失，而仍然保持`TRUNCATE`事务安全。

### E.188.4.2. 服务器的变化

- 添加WAL文件归档和时间点恢复 (Simon Riggs)

- 添加表空间，这样管理员可以控制磁盘布局 (Gavin)

- 添加一个内建的日志循环程序 (Andreas Pflug)

  现在可以不用依赖于syslog或外部日志循环程序就可以方便的记录服务器信息了。

- 添加新的只读服务器配置参数以显示服务器兼容的时间设置： `block_size`、`integer_datetimes`、`max_function_args`、 `max_identifier_length`、`max_index_keys` (Joe)

- 让`sameuser`、`samegroup`和`all` 的引用删除`pg_hba.conf`中这些术语的特殊含义 (Andrew)

- 在缺省的`pg_hba.conf`中为`localhost` 使用更加清楚的IPv6名字`::1/128` (Andrew)

- 在`pg_hba.conf`示例中使用CIDR格式 (Andrew)

- 重命名服务器配置参数`SortMem`和`VacuumMem` 为`work_mem`和`maintenance_work_mem`（仍然支持老的名字） (Tom)

  这个修改是用来弄清楚批量操作，比如用`maintenance_work_mem`创建的索引和外键， 而`work_mem`是在查询执行期间使用的工作空间。

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

- 添加新的服务器配置参数`log_line_prefix`， 以允许控制在每个日志行里发出的信息 (Andrew)

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

- 删除服务器配置参数`log_pid`、`log_timestamp`、 `log_source_port`；功能性上被`log_line_prefix`取代 (Andrew)

- 用一个统一的`listen_addresses`参数替代`virtual_host` 和`tcpip_socket`参数 (Andrew, Tom)

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

- 默认监听localhost，减少了在很多情况下对`-i`主进程开关的需要 (Andrew)

  监听localhost (`127.0.0.1`)不会打开新的安全漏洞， 但是允许像Windows和JDBC那样配置，不支持本地套接字，不用特殊的调整就能工作。

- 删除`syslog`服务器配置参数，并且添加更多逻辑的`log_destination` 变量来控制日志输出位置 (Magnus)

- 修改服务器配置参数`log_statement`接受值`all`、 `mod`、`ddl`或`none`，以便选择记录哪条查询 (Bruce)

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

- 一些日志相关的配置参数以前可以通过普通用户调整，但是只能是在"更详细的"方向。 现在对待它们更加严格了：只有超级用户可以设置它们。不过， 超级用户可以使用`ALTER USER`为非超级用户提供这些值的每用户设置。 还有，现在超级用户可以通过`PGOPTIONS`设置仅超级用户的配置参数值了。

- 允许配置文件放在数据目录的外面 (mlw)

  缺省的，配置文件保存在集群的顶级目录中。有了这个添加， 配置文件可以放置在该数据目录的外面，宽松了管理。

- 只有在第一次执行常量可以用于统计时计划预备查询 (Oliver Jowett)

  预备语句规划查询一次执行多次。虽然预备查询避免了每次使用时重新规划的开支， 但是规划的质量不知道在该查询中要使用的准确参数。在这个版本中， 未命名的预备语句的规划被推迟直到第一次执行，执行的实际参数值用作优化提示。 这允许使用行外传递参数，而不会导致性能损失。

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

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

- 修复`inet`和`cidr`数据类型的哈希连接和聚合 (Tom)

  版本7.4正确的处理了混合`inet`和`cidr`值的哈希。 （这个bug在以前的版本中不存在，因为他们不会尝试哈希任何一个数据类型。）

- 让`log_duration`只在`log_statement`输出查询时输出 (Ed L.)

### E.188.4.3. 查询的变化

- 添加了保存点（嵌套的事务） (Alvaro)

- 现在接受不支持的隔离级别了并且提升为最近支持的级别 (Peter)

  SQL规范声明如果一个数据库不支持一个特定的隔离级别，它应该使用下一个更加限制的级别。 这个修改符合那个建议。

- 允许`BEGIN WORK`像`START 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)

  这解决了单词包含`I`和`i`的识别编码的"Turkish 问题"。 在7位ASCII设置之外折叠字符仍然是环境敏感的。

- 改进语法错误报告 (Fabien, Tom)

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

- 修改`EXECUTE`，返回一个完成标签匹配执行语句 (Kris Jurka)

  以前的版本为任何`EXECUTE`调用返回一个`EXECUTE`标签。 在这个版本中，返回的标签将反应执行的命令。

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

  这样一个条款在逻辑上说不通，但是在某些情况下该规则反编译以前生成的这种语法。

### E.188.4.4. 对象操作的变化

- 为cast、转换、语言、操作符类和大对象添加`COMMENT ON` (Christopher)

- 添加新的服务器配置参数`default_with_oids`， 控制表缺省是不是带有`OID`创建 (Neil)

  这允许管理员控制`CREATE TABLE`命令缺省是否带有`OID` 字段创建表。（注意：目前`default_with_oids`的出厂默认设置是`TRUE`， 但是该缺省将在将来的版本中变成`FALSE`。）

- 添加`WITH` / `WITHOUT OIDS`子句到`CREATE TABLE AS` (Neil)

- 允许`ALTER TABLE DROP COLUMN`删除`OID`字段 （`ALTER TABLE SET WITHOUT OIDS`仍然工作） (Tom)

- 允许复合类型作为表字段 (Tom)

- 允许`ALTER ... ADD COLUMN`带有缺省和`NOT NULL`约束； 在每个SQL规范上工作 (Rod)

  `ADD COLUMN`创建一个最初不是填充为NULL的字段现在是可能的了， 但是会带有一个指定的缺省值。

- 添加`ALTER COLUMN TYPE`改变字段的类型 (Rod)

  现在不用删除然后重新添加该字段来修改一个字段的数据类型是可能的了。

- 允许多个`ALTER`在一个`ALTER TABLE`命令中动作 (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.188.4.5. 工具命令的变化

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

- 添加`ALSO`关键字到`CREATE RULE` (Fabien Coelho)

  这允许`ALSO`被添加到规则创建，与`INSTEAD`规则对比。

- 添加`NOWAIT`选项到`LOCK` (Tatsuo)

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

- 允许`COPY`读写逗号分隔值(CSV)的文件 (Andrew, Bruce)

- 如果`COPY`分隔符和NULL字符串冲突则产生错误 (Bruce)

- `GRANT`/`REVOKE`行为更加符合SQL规范

- 避免`CREATE INDEX`和`CHECKPOINT` 之间的锁冲突 (Tom)

  在7.3和7.4中，一个长期运行的B-tree索引建立会阻止并发的`CHECKPOINT`完成， 因此导致WAL膨胀，因为WAL日志不能重复利用。

- 数据库范围的`ANALYZE`不在表上持有锁 (Tom)

  这减少了其他后端想要在表上的排他锁时死锁的可能性。要获取这个修改的益处， 不要在一个事务块(`BEGIN` 块)中执行数据库范围的`ANALYZE`； 必须能够为每个表提交和启动一个新事务。

- `REINDEX`不再完全锁住索引的父表

  索引本身仍然是完全锁住的，但是该表的读者可以继续，如果他们不使用被重建的特定索引。

- 当一个用户重命名了时，擦除MD5用户口令 (Bruce)

  当通过MD5解密口令时，PostgreSQL 使用用户的名字作为盐。当改变了一个用户的名字时，盐将不再匹配存储的MD5口令， 所以存储的口令变得无用了。在这个版本中生成一个通知并且清除口令。 如果该用户能够使用一个口令登录，那么一个新的口令必须被分配。

- 为Windows新建pg_ctl `kill`选项 (Andrew)

  Windows没有`kill`命令发送信号到后端，所以这个能力添加到了pg_ctl。

- 信息模式改善

- 添加`--pwfile`选项到initdb， 这样初始口令可以通过GUI工具设置 (Magnus)

- 检测initdb中的本地环境/编码错误匹配 (Peter)

- 添加`register`命令到pg_ctl， 以注册Windows操作系统服务 (Dave Page)

### E.188.4.6. 数据类型和函数的变化

- 对复合类型（行类型）更加完整的支持 (Tom)

  复合值可以用在以前只能是标量值的许多地方。

- 作为错误拒绝非矩形的数组值 (Joe)

  以前，`array_in`将默默地建立一个令人惊讶的结果。

- 现在检测到了整数算术运算符的溢出 (Tom)

- 与单字节`"char"`数据类型相关的算术操作符已经删除了。

  以前，解析器将在许多情况下选择这些操作符，而一个"不能选择一个操作符" 错误应该更加合适，比如`null * null`。如果你真的想要在一个`"char"` 字段上做算术，你可以将它明确的转换为整型。

- 数组输入值的语法检查明显的严格了 (Joe)

  以前允许在旧的位置的带有旧的结果的垃圾现在导致一个`ERROR`， 例如，紧跟着右括号后面的非空白。

- 空字符串数组元素值现在必须写为`""`，而不是什么都不写 (Joe)

  以前，两种书写空字符串元素值的方法都是允许的，但是现在要求用带有引号的空字符串。 在一些未来的版本中，什么都不出现的情况可以考虑为一个NULL元素值。

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

  以前忽略前导的空白，但是元素值和分隔符或右括号之间的尾随的空白是有效的。 现在尾随的空白也忽略了。

- 当下界不是1时，用明确的数组界限发出数组值 (Joe)

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

- 让`netmask`和`hostmask`函数返回最大长度标记的长度 (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 `Infinity` 和`NaN`值 (Neil)

  这些应该在所有支持IEEE兼容浮点运算的平台上工作。

- 添加`week`选项到`date_trunc()` (Robert Creager)

- 为`1 BC`修复`to_char`（以前它返回`1 AD`）(Bruce)

- 为BC日期修复`date_part(year)`（以前它返回的比正确的年份少1） (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)

- 添加`datetime`加`datetime`操作符 (Tom)

  相反的顺序，`datetime`加`interval`，早已支持了， 但是SQL标准两种都需要。

- 转换一个整数到`BIT(N)`，选取该整数的最右侧的N位 (Tom)

  在以前的版本中，选择最左侧的N位，但是这被认为是没有帮助的， 更不用说与从位转换到整数的不一致。

- 需要`CIDR`值让所有非标记的位为0 (Kevin Brintnall)

### E.188.4.7. 服务器端语言的变化

- 在`READ COMMITTED`序列化模式中， 不稳定的函数现在看到并发事务提交的结果直到该函数中每个语句的开始， 而不是直到调用该函数的交互命令的开始。

- 声明为`STABLE`或`IMMUTABLE`的函数总是使用调用查询的快照， 并且因此不能看到调用查询开始之后采取的动作的影响， 不管是在它们自己的事务中还是在其他事务中。这样一个函数必须也是只读的， 意味着它不能使用任何SQL命令，除了`SELECT`。 声明一个函数`STABLE`或`IMMUTABLE`而不是`VOLATILE` 有相当大的性能增益。

- 非延迟的`AFTER`触发器现在在触发器查询完成之后立即触发， 而不是根据当前交互命令的完成。这在触发查询发生在一个函数中时有所不同： 触发器在该函数进行它的下一个操作之前被调用。例如， 如果一个函数插入了一个新行到一个表中，任何非延迟的外键检查在处理该函数之前发生。

- 允许函数参数用名字声明 (Dennis Björklund)

  这允许更好的记录函数。名字实际上是否做任何事情依赖于使用的特定的函数语言。

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

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

- 在创建时做最少的PL/pgSQL函数的语法检查 (Tom)

  这允许我们快速的捕捉简单的语法错误。

- 在PL/pgSQL中更加支持复合类型（行和记录变量）

  例如，现在可以将行类型变量作为单个变量传递到另一个函数了。

- PL/pgSQL变量的缺省变量现在可以引用以前声明的变量。

- 为循环改善PL/pgSQL的解析 (Tom)

  解析现在是通过`".."`的存在来驱动的，而不是`FOR`变量的数据类型。 这对于正确的函数来说没什么差别，但是当有一个错误时，会导致更容易理解的错误消息。

- 主要检修了PL/Perl服务器端语言 (Command Prompt, Andrew Dunstan)

- 在PL/Tcl中，SPI命令现在在子事务中运行。如果发生了一个错误， 该子事务被清理并且该错误被作为一个普通Tcl错误报告， 可以使用`catch`捕获。以前，捕获这样的错误是没有可能的。

- 在PL/pgSQL中接受`ELSEIF` (Neil)

  以前PL/pgSQL只允许`ELSIF`，但是许多人习惯拼写`ELSEIF`关键字。

### E.188.4.8. psql 的变化

- 改善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)

- 添加`CLUSTER`信息到psql `\d`显示 (Bruce)

- 修改psql `\copy stdin/stdout`， 以便从命令输入/输出中读取 (Bruce)

- 添加`pstdin`/`pstdout`，以便从psql 的`stdin`/`stdout`读取 (Mark Feit)

- 添加全局psql配置文件，`psqlrc.sample` (Bruce)

  这允许一个可以存储全局psql启动命令的中心文档。

- 让psql `\d+`表明表是否有一个`OID`字段 (Neil)

- 在Windows上，当读取文件时使用二进制模式，这样control-Z不会被看做文件的结尾。

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

- 提高选项卡完成支持 (Stefan Kaltenbrunn, Greg Sabino Mullane)

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

### E.188.4.9. pg_dump 的变化

- 使用依赖关系信息提高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.188.4.10. libpq的变化

- 让libpq的`SIGPIPE`处理线程安全 (Bruce)

- 添加`PQmbdsplen()`，返回一个字符的显示长度 (Tatsuo)

- 添加线程锁到SSL和Kerberos连接 (Manfred Spraul)

- 允许`PQoidValue()`、`PQcmdTuples()`和`PQoidStatus()` 在`EXECUTE`命令上工作 (Neil)

- 添加`PQserverVersion()`，添加更多到服务器版本号的方便的访问 (Greg Sabino Mullane)

- 添加`PQprepare/PQsendPrepared()`函数支持预备语句， 没有必要指定它们的参数的数据类型 (Abhijit Menon-Sen)

- 许多ECPG改善，包括`SET DESCRIPTOR` (Michael)

### E.188.4.11. 源代码的变化

- 允许数据库服务器在Windows上本地运行 (Claudio, Magnus, Andrew)

- 为了Windows支持，Shell脚本命令转换为C版本 (Andrew)

- 创建一个扩展makefile框架 (Fabien Coelho, Peter)

  这简化了在源代码树的外面建立扩展的任务。

- 支持重新定位安装 (Bruce)

  安装文件的目录路径（比如`/share`目录）现在是和可执行文件的实际位置相关的， 所以一个安装树可以移动到另外一个地方而不用重新配置和重新建立。

- 使用`--with-docdir`选择文档的安装位置；也允许`--infodir` (Peter)

- 添加`--without-docdir`，阻止文档的安装 (Peter)

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

- 新增`PostgreSQL` CVS标签 (Marc)

  这样做是为了使它更简单的组织管理它们自己的PostgreSQL CVS仓库。主仓库的文件版本邮票将不会通过检查进出一个复制的存储库而加上参数。 （File version stamps from the master repository will not get munged by checking into or out of a copied repository.）

- 明确锁定代码 (Manfred Koizar)

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

- 从CPU自旋锁代码解耦平台测试 (Bruce, Tom)

- 在PA-RISC上为gcc添加在线测试和设置代码 (ViSolve, Tom)

- 改善i386自旋锁代码 (Manfred Spraul)

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

- 从源码树中删除JDBC；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的Brazilian版本 (Euler Taveira de Oliveira)

- 添加French FAQ (Guillaume Lelarge)

- 为Windows登陆新增pgevent

- 让libpq和ECPG在OS X上作为适当共享的库建立 (Tom)

### E.188.4.12. 贡献版的变化

- 彻底检查`contrib/dblink` (Joe)

- `contrib/dbmirror`改善 (Steven Singer)

- 新增`contrib/xml2` (John Gray, Torchbox)

- 升级了`contrib/mysql`

- 新增`contrib/btree_gist`的版本 (Teodor)

- 新增`contrib/trgm`，为PostgreSQL的三元模型匹配 (Teodor)

- 许多`contrib/tsearch2`的改善 (Teodor)

- 添加两倍metaphone到`contrib/fuzzystrmatch` (Andrew)

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

- 添加函数到`contrib/dbsize` (Andreas Pflug)

- 删除`contrib/pg_logger`:被完整的登陆子进程代替了

- 删除`contrib/rserv`:被各种独立的项目代替了

上一页 | 起始页 | 下一页
版本 8.0.1 | 上一级 | 版本 7.4.30