A.22. 版本 7.3 #
发行日期
2002-11-27
A.22.1. 概述
此发行版的主要变更:
- 模式
模式允许用户在独立的命名空间中创建对象,因此两个人或应用程序可以拥有同名的表。还提供了一个用于共享表的公共模式。可以通过移除公共模式上的权限来限制表/索引的创建。
- 删除列
PostgreSQL 现在支持
ALTER TABLE ... DROP COLUMN功能。- 表函数
返回多行和/或多列的函数现在比以前容易使用得多。你可以在
SELECT的FROM子句中调用这样的“表函数”,把它的输出当作表来处理。此外, PL/pgSQL 函数现在可以返回集合。- 预备查询
PostgreSQL 现在支持预备查询,以改进性能。
- 依赖跟踪
PostgreSQL 现在记录对象依赖关系,这带来了诸多方面的改进。
DROP语句现在接受CASCADE或RESTRICT,以控制依赖对象是否也被删除。- 权限
函数和过程语言现在有了权限,并且函数可以定义为以其创建者的权限运行。
- 国际化
多字节和区域设置支持现在总是启用。
- 日志
多种日志选项得到了增强。
- 接口
大量接口已迁移到 http://gborg.postgresql.org,在那里它们可以独立地开发和发布。
- 函数/标识符
默认情况下,函数现在最多可以有 32 个参数,标识符最长可达 63 字节。此外,
OPAQUE现已废弃:有特定的“伪数据类型”来表示OPAQUE在函数参数和结果类型中的各种旧有含义。
A.22.2. 迁移到版本 7.3
希望从任何以前的发行版迁移数据的用户,需要使用 pg_dump 进行转储/恢复。如果你的应用程序检查系统目录,由于 7.3 引入了模式,还需要额外的变更;更多信息请参见:http://developer.postgresql.org/~momjian/upgrade_tips_7.3。
注意以下不兼容之处:
不再支持 6.3 之前的客户端。
pg_hba.conf现在有一个用于用户名的列以及一些附加功能。现有文件需要调整。若干
postgresql.conf日志参数已被重命名。LIMIT #,#已被禁用;请使用LIMIT # OFFSET #。带列列表的
INSERT语句必须为每个指定的列提供值。例如,INSERT INTO tab (col1, col2) VALUES ('val1')现在是无效的。如果INSERT没有列列表,仍然允许提供比预期少的列。serial列不再自动UNIQUE;因此不会自动创建索引。已中止事务中的
SET命令现在会被回滚。COPY不再把缺失的尾部列视为空值。所有列都需指定。(不过,可以通过在COPY命令中指定列列表来实现类似效果。)数据类型
timestamp现在等价于timestamp without time zone,而不是timestamp with time zone。加载到 7.3 中的 7.3 之前的数据库不会拥有
serial列、唯一约束和外键的新对象依赖。目录contrib/adddepend/中有详细的说明以及一个添加此类依赖的脚本。不再允许空字符串(
'')作为整数字段的输入。以前它被静默地解释为 0。
A.22.3. 变更
A.22.3.1. 服务器操作
添加 pg_locks 视图以显示锁(Neil)
口令协商内存分配的安全修复(Neil)
移除对版本 0 FE/BE 协议(PostgreSQL 6.2 及更早版本)的支持(Tom)
为超级用户保留最后几个后端槽位,并添加参数 superuser_reserved_connections 来控制(Nigel J. Andrews)
A.22.3.2. 性能
只调用一次 localtime() 以改进启动(Tom)
将系统目录信息缓存到平面文件中以加快启动(Tom)
改进索引信息的缓存(Tom)
优化器改进(Tom、Fernando Nasser)
目录缓存现在会存储失败的查找(Tom)
哈希函数改进(Neil)
改进查询词法分析和网络处理的性能(Peter)
大对象恢复的速度改进(Mario Weilguni)
在第一次查找时标记已失效的索引条目,省去之后的堆取值(Tom)
避免过度的 NULL 位图填充(Manfred Koizar)
为 Solaris 添加 BSD 许可的 qsort() 以提升性能(Bruce)
将每行开销减少四字节(Manfred Koizar)
修复 GEQO 优化器缺陷(Neil Conway)
使 WITHOUT OID 真正做到每行节省四字节(Manfred Koizar)
添加 default_statistics_target 变量以指定 ANALYZE 桶数(Neil)
临时表使用本地缓冲区缓存,因此没有 WAL 开销(Tom)
改进大表上空闲空间映射的性能(Stephen Marshall、Tom)
改进的 WAL 写入并发(Tom)
A.22.3.3. 权限
为函数和过程语言添加权限(Peter)
为 CREATE DATABASE 添加 OWNER,使超级用户可以代表无特权用户创建数据库(Gavin Sherry、Tom)
添加新的对象权限位 EXECUTE 和 USAGE(Tom)
添加 SET SESSION AUTHORIZATION DEFAULT 和 RESET SESSION AUTHORIZATION(Tom)
允许函数以函数所有者的权限执行(Peter)
A.22.3.4. 服务器配置
服务器日志消息现在标记为 LOG 而不是 DEBUG(Bruce)
为 pg_hba.conf 添加 user 列(Bruce)
log_connections 在日志文件中输出两行(Tom)
从 postgresql.conf 移除 debug_level,现在是 server_min_messages(Bruce)
新的 ALTER DATABASE/USER ... SET 命令用于每用户/数据库初始化(Peter)
新参数 server_min_messages 和 client_min_messages,控制哪些消息发送到服务器日志或客户端应用程序(Bruce)
允许 pg_hba.conf 指定以逗号分隔的用户/数据库列表、以 + 前缀的组名、以 @ 前缀的文件名(Bruce)
移除辅助口令文件能力和 pg_password 工具(Bruce)
为数据库本地的用户名添加变量 db_user_namespace(Bruce)
SSL 改进(Bear Giles)
使存储口令的加密成为默认(Bruce)
允许通过调用 pg_stat_reset() 重置 pg_statistics(Christopher)
添加 log_duration 参数(Bruce)
将 debug_print_query 重命名为 log_statement(Bruce)
将 show_query_stats 重命名为 show_statement_stats(Bruce)
添加参数 log_min_error_statement,在出错时将命令打印到日志(Gavin)
A.22.3.5. 查询
使游标不敏感,即其内容不发生变化(Tom)
禁用 LIMIT #,# 语法;现在只支持 LIMIT # OFFSET #(Bruce)
将标识符长度增加到 63(Neil、Bruce)
修复合并 >= 3 个不同长度列的 UNION 问题(Tom)
为 INSERT 添加 DEFAULT 关键字,例如 INSERT ... (..., DEFAULT, ...)(Rod)
允许视图使用 ALTER COLUMN ... SET DEFAULT 拥有默认值(Neil)
带列列表但不为所有列提供值的 INSERT 现在失败,例如 INSERT INTO tab (col1, col2) VALUES ('val1');(Rod)
修复连接别名(Tom)
修复 FULL OUTER JOIN(Tom)
改进无效标识符及位置的报告(Tom、Gavin)
修复 OPEN cursor(args)(Tom)
允许在视图和 currtid(viewname) 中使用 'ctid'(Hiroshi)
修复带 UNION 的 CREATE TABLE AS(Tom)
SQL99 语法改进(Thomas)
添加 statement_timeout 变量以取消查询(Bruce)
允许使用 PREPARE/EXECUTE 进行预备查询(Neil)
允许 FOR UPDATE 出现在 LIMIT/OFFSET 之后(Bruce)
添加变量 autocommit(Tom、David Van Wie)
A.22.3.6. 对象操作
使 CREATE DATABASE 中的等号变为可选(Gavin Sherry)
使 ALTER TABLE OWNER 也更改索引所有权(Neil)
新的 ALTER TABLE tabname ALTER COLUMN colname SET STORAGE 控制 TOAST 存储和压缩(John Gray)
添加模式支持,CREATE/DROP SCHEMA(Tom)
为临时表创建模式(Tom)
为模式搜索添加变量 search_path(Tom)
添加 ALTER TABLE SET/DROP NOT NULL(Christopher)
新的 CREATE FUNCTION 易变性级别(Tom)
使规则名只在每表内唯一(Tom)
为 DROP RULE 和 COMMENT ON RULE 添加 'ON tablename' 子句(Tom)
添加 ALTER TRIGGER RENAME(Joe)
新的 current_schema() 和 current_schemas() 查询函数(Tom)
允许函数返回多行(表函数)(Joe)
为一致性,使 CREATE DATABASE 中的 WITH 变为可选(Bruce)
添加对象依赖跟踪(Rod、Tom)
为 DROP 命令添加 RESTRICT/CASCADE(Rod)
为非 CHECK 约束添加 ALTER TABLE DROP(Rod)
删除带 SERIAL 的表时自动销毁序列(Rod)
防止删除被外键使用的列(Rod)
对象被删除时自动删除依赖的约束/函数(Rod)
添加 CREATE/DROP OPERATOR CLASS(Bill Studenmund、Tom)
添加 ALTER TABLE DROP COLUMN(Christopher、Tom、Hiroshi)
防止继承列被删除或重命名(Alvaro Herrera)
修复外键约束在中间数据库状态下出错的问题(Stephan)
将列或表的重命名传播到外键约束
添加 CREATE OR REPLACE VIEW(Gavin、Neil、Tom)
添加 CREATE OR REPLACE RULE(Gavin、Neil、Tom)
使规则按字母顺序执行,返回更可预测的值(Tom)
触发器现在按字母顺序触发(Tom)
添加 /contrib/adddepend 以处理 7.3 之前的对象依赖(Rod)
允许在插入/更新值时进行更好的类型转换(Tom)
A.22.3.7. 实用命令
使 COPY TO 将嵌入的回车和换行输出为 \r 和 \n(Tom)
允许 COPY FROM 中的 DELIMITER 为 8 位干净(Tatsuo)
为提升性能,使 pg_dump 使用 ALTER TABLE ADD PRIMARY KEY(Neil)
禁用多语句规则中的方括号(Bruce)
禁止在函数内调用 VACUUM(Bruce)
允许 dropdb 和其他脚本使用带空格的标识符(Bruce)
将数据库注释的更改限制在当前数据库
允许对操作符进行注释,独立于底层函数(Rod)
回滚已中止事务中的 SET 命令(Tom)
EXPLAIN 现在以查询形式输出(Tom)
在 EXPLAIN 中显示条件表达式和排序键(Tom)
添加 'SET LOCAL var = value',为单个事务设置配置变量(Tom)
允许 ANALYZE 在事务中运行(Bruce)
使用新的 WITH 子句改进 COPY 语法,保持向后兼容(Bruce)
修复 pg_dump 在非 ASCII 转储中一致地输出标签(Bruce)
使转储文件中的外键约束更清晰(Rod)
添加 COMMENT ON CONSTRAINT(Rod)
允许 COPY TO/FROM 指定列名(Brent Verner)
将 UNIQUE 和 PRIMARY KEY 约束转储为 ALTER TABLE(Rod)
使 SHOW 输出查询结果(Joe)
COPY 行过短时产生失败而不是填充 NULL(Neil)
修复 CLUSTER 以保留所有表属性(Alvaro Herrera)
新的 pg_settings 表用于查看/修改 GUC 设置(Joe)
为 pg_dump 输出添加智能引号和可移植性改进(Peter)
将序列列转储为 SERIAL(Tom)
启用大文件支持,pg_dump 支持 >2G(Peter、Philip Warner、Bruce)
禁止对参与引用约束的表执行 TRUNCATE(Rod)
使 TRUNCATE 也自动截断关系的 toast 表(Tom)
添加 clusterdb 工具,可基于先前的 CLUSTER 操作自动聚簇整个数据库(Alvaro Herrera)
全面翻修 pg_dumpall(Peter)
允许对 TOAST 表执行 REINDEX(Tom)
按 SQL99 实现 START TRANSACTION(Neil)
修复页分割影响批量删除时的罕见索引损坏(Tom)
修复继承情况下的 ALTER TABLE ... ADD COLUMN(Alvaro Herrera)
A.22.3.8. 数据类型和函数
修复 factorial(0) 使其返回 1(Bruce)
日期/时间/时区改进(Thomas)
修复数组切片提取(Tom)
修复 extract/date_part 对 timestamp 报告正确微秒(Tatsuo)
允许 text_substr() 和 bytea_substr() 更高效地读取 TOAST 值(John Gray)
添加域支持(Rod)
使 TIMESTAMP 和 TIME 数据类型默认为 WITHOUT TIME ZONE(Thomas)
允许日期/时间类型在 configure 中使用 --enable-integer-datetimes 时采用 64 位整数的备选存储方案(Thomas)
使 timezone(timestamptz) 返回 timestamp 而不是字符串(Thomas)
允许日期/时间类型在公元前 1 年之前的日期中有小数秒(Thomas)
将 timestamp 数据类型的精度限制为 6 位小数(Thomas)
将时区转换函数从 timetz() 更名为 timezone()(Thomas)
添加配置变量 datestyle 和 timezone(Tom)
添加 OVERLAY(),允许替换字符串中的子串(Thomas)
添加 SIMILAR TO(Thomas、Tom)
添加正则表达式 SUBSTRING(string FROM pat FOR escape)(Thomas)
添加 LOCALTIME 和 LOCALTIMESTAMP 函数(Thomas)
使用 CREATE TYPE typename AS (column) 添加命名复合类型(Joe)
允许在表别名子句中定义复合类型(Joe)
添加新的 API 以简化 C 语言表函数的创建(Joe)
对与标准不匹配的 SQL99 函数,移除调用中 ODBC 兼容的空圆括号(Thomas)
允许 macaddr 数据类型接受无分隔符的 12 位十六进制数字(Mike Wyer)
添加 CREATE/DROP CAST(Peter)
添加 IS DISTINCT FROM 操作符(Thomas)
添加 SQL99 TREAT() 函数,CAST() 的同义词(Thomas)
添加 pg_backend_pid() 以输出后端 pid(Bruce)
添加 IS OF / IS NOT OF 类型谓词(Thomas)
允许未完全指定长度的位串常量(Thomas)
允许 8 字节整数与位串之间的转换(Thomas)
实现十六进制字面量到位串字面量的转换(Thomas)
允许表函数出现在 FROM 子句中(Joe)
将函数参数的最大数量增加到 32(Bruce)
不再为 SERIAL 列自动创建索引(Tom)
添加 current_database()(Rod)
修复 cash_words() 缓冲区溢出(Tom)
添加函数 replace()、split_part()、to_hex()(Joe)
修复 bytea 作为右侧参数的 LIKE(Joe)
防止 SELECT cash_out(2) 导致的崩溃(Tom)
修复 to_char(1,'FM999.99') 使其返回句点(Karel)
修复返回 OPAQUE 的触发器/类型/语言函数使其返回正确类型(Tom)
A.22.3.9. 国际化
添加更多编码:韩语(JOHAB)、泰语(WIN874)、越南语(TCVN)、阿拉伯语(WIN1256)、简体中文(GBK)、韩语(UHC)(Eiji Tokuya)
默认启用区域设置支持(Peter)
添加区域设置变量(Peter)
在 PQescapeBytea/PQunescapeBytea 中为多字节转义 >= 0x7f 的字节(Tatsuo)
为正则表达式字符类添加区域设置感知
默认启用多字节支持(Tatsuo)
添加 GB18030 多字节支持(Bill Huang)
添加 CREATE/DROP CONVERSION,允许可加载编码(Tatsuo、Kaori)
添加 pg_conversion 表(Tatsuo)
添加 SQL99 CONVERT() 函数(Tatsuo)
pg_dumpall、pg_controldata 和 pg_resetxlog 现在支持国家语言(Peter)
新增和更新的翻译
A.22.3.10. 服务器端语言
允许递归 SQL 函数(Peter)
更改 PL/Tcl 构建以使用配置的编译器和 Makefile.shlib(Peter)
全面翻修 PL/pgSQL 的 FOUND 变量以更兼容 Oracle(Neil、Tom)
允许 PL/pgSQL 处理带引号的标识符(Tom)
允许返回集合的 PL/pgSQL 函数(Neil)
使 PL/pgSQL 感知模式(Joe)
移除一些内存泄漏(Nigel J. Andrews、Tom)
A.22.3.11. psql
为兼容 7.2.0,psql \connect 不再将数据库名转换为小写(Tom)
添加 psql \timing 以对用户查询计时(Greg Sabino Mullane)
使 psql \d 显示索引信息(Greg Sabino Mullane)
新的 psql \dD 显示域(Jonathan Eisler)
允许 psql 显示视图上的规则(Paul ?)
修复 psql 变量替换(Tom)
允许 psql \d 显示临时表结构(Tom)
允许 psql \d 显示外键(Rod)
修复 \? 以遵守 \pset pager(Bruce)
使 psql 在启动时报告其版本号(Tom)
允许 \copy 指定列名(Tom)
A.22.3.12. libpq
添加 ~/.pgpass 以存储主机/用户口令组合(Alvaro Herrera)
为 libpq 添加 PQunescapeBytea() 函数(Patrick Welche)
修复通过非阻塞连接发送大查询的问题(Bernhard Herzog)
修复 libpq 在 Win9X 上使用计时器的问题(David Ford)
允许 libpq notify 处理标识符长度不同的服务器(Tom)
将 libpq 的 PQescapeString() 和 PQescapeBytea() 添加到 Windows(Bruce)
修复非阻塞连接的 SSL 问题(Jack Bates)
添加 libpq 连接超时参数(Denis A Ustimenko)
A.22.3.13. JDBC
允许 JDBC 用 JDK 1.4 编译(Dave)
添加 JDBC 3 支持(Barry)
允许 JDBC 通过在连接 URL 中添加 ?loglevel=X 来设置日志级别(Barry)
添加打印版本号的 Driver.info() 消息(Barry)
添加可更新结果集(Raghu Nidagal、Dave)
添加对可调用语句的支持(Paul Bethe)
添加查询取消能力
添加刷新行(Dave)
修复多字节服务器的 MD5 加密处理(Jun Kawai)
添加对预备语句的支持(Barry)
A.22.3.14. 其他接口
修复 ECPG 关于单引号中八进制数的缺陷(Michael)
将 src/interfaces/libpgeasy 迁移到 http://gborg.postgresql.org(Marc、Bruce)
改进 Python 接口(Elliot Lee、Andrew Johnson、Greg Copeland)
添加 libpgtcl 连接关闭事件(Gerhard Hintermayer)
将 src/interfaces/libpq++ 迁移到 http://gborg.postgresql.org(Marc、Bruce)
将 src/interfaces/odbc 迁移到 http://gborg.postgresql.org(Marc)
将 src/interfaces/libpgeasy 迁移到 http://gborg.postgresql.org(Marc、Bruce)
将 src/interfaces/perl5 迁移到 http://gborg.postgresql.org(Marc、Bruce)
从主树移除 src/bin/pgaccess,现位于 http://www.pgaccess.org(Bruce)
为 libpgtcl 添加 pg_on_connection_loss 命令(Gerhard Hintermayer、Tom)
A.22.3.15. 源代码
修复并行 make(Peter)
AIX 链接 Tcl 的修复(Andreas Zeugswetter)
允许 PL/Perl 在 Cygwin 下构建(Jason Tishler)
改进 MIPS 编译(Peter、Oliver Elphick)
要求 Autoconf 版本 2.53(Peter)
configure 默认要求 readline 和 zlib(Peter)
允许 Solaris 使用紧密共享内存(ISM)以提升性能(Scott Brunza、P.J. Josh Rovero)
编译时总是启用 syslog,移除 --enable-syslog 选项(Tatsuo)
编译时总是启用多字节,移除 --enable-multibyte 选项(Tatsuo)
编译时总是启用区域设置,移除 --enable-locale 选项(Peter)
修复 Win9x DLL 创建(Magnus Naeslund)
修复 WAL 代码在 Windows、BeOS 上使用 link() 的问题(Jason Tishler)
将 sys/types.h 添加到 c.h,从主文件中移除(Peter、Bruce)
修复 SMP 机器上的 AIX 挂起(Tomoyuki Niijima)
AIX SMP 挂起修复(Tomoyuki Niijima)
修复较新 glibc 库上 1970 年之前日期的处理(Tom)
修复 PowerPC SMP 锁定(Tom)
防止使用 gcc -ffast-math(Peter、Tom)
开发者构建现在要求 Bison >= 1.50
Kerberos 5 支持现在可用 Heimdal 构建(Peter)
在用户指南中添加列出 SQL 特性的附录(Thomas)
改进可加载模块链接以使用 RTLD_NOW(Tom)
新的错误级别 WARNING、INFO、LOG、DEBUG[1-5](Bruce)
新的 src/port 目录存放替代的 libc 函数(Peter、Bruce)
用于模式的新 pg_namespace 系统目录(Tom)
为模式添加 pg_class.relnamespace(Tom)
为模式添加 pg_type.typnamespace(Tom)
为模式添加 pg_proc.pronamespace(Tom)
重构聚合以拥有 pg_proc 项(Tom)
系统关系现在拥有自己的命名空间,不再要求 pg_* 测试(Fernando Nasser)
将 TOAST 索引名从 *_idx 重命名为 *_index(Neil)
为操作符、操作符类添加命名空间(Tom)
为服务器控制文件添加更多检查(Thomas)
新的波兰语 FAQ(Marcin Mazurek)
添加 Posix 信号量支持(Tom)
记录 reindex 的需要(Bruce)
重命名一些内部标识符以简化 Windows 编译(Jan、Katherine Ward)
添加关于计算磁盘空间的文档(Bruce)
从 GUC 移除 KSQO(Bruce)
修复 rtree 中的内存泄漏(Kenneth Been)
为一致性修改一些错误消息(Bruce)
移除未使用的系统表列(Peter)
在适当处使系统列为 NOT NULL(Tom)
清理 sprintf 的使用,改用 snprintf()(Neil、Jukka Holappa)
移除 OPAQUE 并创建特定的子类型(Tom)
数组内部处理的清理(Joe、Tom)
禁止 pg_atoi('')(Bruce)
移除参数 wal_files,因为 WAL 文件现在会被回收(Bruce)
为堆页面添加版本号(Tom)
A.22.3.16. Contrib
允许 /contrib/array 中的 inet 数组(Neil)
GiST 修复(Teodor Sigaev、Neil)
升级 /contrib/mysql
添加 /contrib/dbsize,无需 vacuum 即可显示表大小(Peter)
添加 /contrib/intagg,整数聚合例程(mlw)
改进 /contrib/oid2name(Neil、Bruce)
改进 /contrib/tsearch(Oleg、Teodor Sigaev)
/contrib/rserver 的清理(Alexey V. Borzov)
更新 /contrib/oracle 转换工具(Gilles Darold)
更新 /contrib/dblink(Joe)
改进 /contrib/vacuumlo 支持的选项(Mario Weilguni)
/contrib/intarray 的改进(Oleg、Teodor Sigaev、Andrey Oktyabrski)
添加 /contrib/reindexdb 工具(Shaun Thomas)
为 /contrib/isbn_issn 添加索引(Dan Weston)
添加 /contrib/dbmirror(Steven Singer)
改进 /contrib/pgbench(Neil)
添加 /contrib/tablefunc 表函数示例(Joe)
添加 /contrib/ltree 树结构数据类型(Teodor Sigaev、Oleg Bartunov)
将 /contrib/pg_controldata、pg_resetxlog 移入主树(Bruce)
/contrib/cube 的修复(Bruno Wolff)
改进 /contrib/fulltextindex(Christopher)