E.258. 版本 7.0

发布日期: 2000-05-08

这个版本包含许多方面的改进,表现了 PostgreSQL 的不断成长。在7.0中有比任意以前版本更多的改进和修复。开发人员相信这是目前最好的版本; 我们尽力做到只发布稳固的版本,这个版本也不例外。

这个版本中的主要变化:

外键

现在我们已经实现了Foreign keys(外键),只有 PARTIAL MATCH 外键没有实现。 许多用户要求增加这个特性,而我们很高兴现在我们能提供这个特性.

优化器检修

继续一年前开始的工作,优化器现在已经进步多了,允许更好的查询规划选择和更好的性能,而且内存用得更少。

升级了psql

psql,是我们的交互终端监控器,升级并增加了许多新特性。 参阅 psql 手册页获取细节。

连接语法

我们现在支持 SQL92 连接(JOIN)语法了,尽管目前的版本只支持 INNER JOINJOINNATURAL JOINJOIN/USINGJOIN/ON 都可用,这些是字段集合名称.

E.258.1. 迁移到版本 7.0

那些从任何以前版本的 PostgreSQL 移植的人都需要用 pg_dump 做一次转储/恢复工作。对于从 6.5.* 升级的用户, 你可以使用 pg_upgrade 升级到这个版本;不过, 升级最稳固的方法还是一次完整的转储/重载安装。

这个新版本要考虑的接口和兼容性问题包括:

E.258.2. 修改列表

 Bug 修复
---------
阻止函数调用超出参数的最大数目 (Tom)
改善 CASE 构造 (Tom)
修复 SELECT coalesce(f1,0) FROM int4_tbl GROUP BY f1 (Tom)
修复 SELECT sentence.words[0] FROM sentence GROUP BY sentence.words[0] (Tom)
修复 GROUP BY 扫描 bug (Tom)
改进 SQL 语法处理 (Tom)
修复包含在 INSERT ... SELECT ... 里的视图 (Tom)
修复 SELECT a/2, a/2 FROM test_missing_target GROUP BY a/2 (Tom)
修复 subselects in INSERT ... SELECT (Tom)
阻止 INSERT ... SELECT ... ORDER BY (Tom) 
修复大于 2GB 的关系,包括 vacuum
提高传播系统表更改为其他后端 (Tom)
提高传播用户表更改为其他后端 (Tom)
修复在复杂的环境中处理临时表 (Bruce, Tom)
在表打开时允许表锁,提高并发可靠性 (Tom)
在 pg_dump 中适当的引用序列名 (Ross J. Reedstrom)
在有其他访问时阻止 DROP DATABASE
如果没有行被处理那么阻止 GROUP BY 返回任何行 (Tom)
如果没有行匹配 WHERE 那么修复 SELECT COUNT(1) FROM table WHERE ...' (Tom)
修复 pg_upgrade 使其为 MVCC 工作 (Tom)
修复 SELECT ... WHERE x IN (SELECT ... HAVING SUM(x) > 1) (Tom)
修复 "f1 datetime DEFAULT 'now'"  (Tom)
修复 DEFAULT 中使用的 CURRENT_DATE 的问题 (Tom)
允许只有注释的行,也允许 ;;; 行 (Tom)
改进在磁盘满写入磁盘失败之后的恢复 (Hiroshi)
修复在 FROM 中提到表而没有连接该表的情况 (Tom)
允许 HAVING 子句不带有聚合函数 (Tom)
修复 "--" 注释和没有尾随的新行,就像在 Perl 接口中看到的那样 
改善 pg_dump 失败错误报告 (Bruce)
允许排序和哈希超过 2GB 文件大小 (Tom) 
修复 pg_dump 转储非继承的规则 (Tom)
修复 NULL 处理比较 (Tom)
修复由于 CREATE/DROP 命令失败引起的不一致的状态 (Hiroshi)
修复带有破折号的 dbname
阻止 DROP INDEX 干扰其他后端 (Tom)
修复 verify_password() 中的文件描述符泄露
修复 "Unable to identify an operator =$" 问题
修复 ODBC,这样如果启用了 CommLog 和 Debug 不会有 segfault  (Dirk Niggemann)
修复递归的退出调用 (Massimo)
修复超长的时区 (Jeroen van Vianen) 
使 pg_dump 保存主键信息 (Peter E)
阻止带有单引号的数据库 (Peter E)
阻止在事务内部 DROP DATABASE (Peter E)
ecpg 内存泄露修复 (Stephen Birch)
修复 SELECT null::text, SELECT int4fac(null) and SELECT 2 + (null) (Tom)
Y2K 时间戳修复 (Massimo)
修复 VACUUM 'HEAP_MOVED_IN 不是预期的的错误 (Tom)
修复带有包含空格的表/字段的视图 (Tom)
阻止在索引上的权限 (Peter E)
修复产生错误时自旋锁卡住的问题 (Hiroshi) 
修复 Linux 上的 ipcclean
修复 NULL 约束条件的处理 (Tom)
修复 odbc 驱动中的内存泄露 (Nick Gorham)
修复 UNION 表上的权限检查 (Tom)
修复以允许 SELECT 'a' LIKE 'a' (Tom)
修复 SELECT 1 + NULL (Tom)
修复 CHAR
修复数值类型上的 log() (Tom)
反对 ':' 和 ';' 操作符
允许 vacuum 临时表 
不允许继承的字段和新字段的名字相同
当磁盘空间被耗尽时恢复或强制失败 (Hiroshi)
修复 AS 字段匹配结果字段的 INSERT INTO ... SELECT 
修复 INSERT ... SELECT ... GROUP BY 以目标字段分组而不是以源字段分组 (Tom)
修复 CREATE TABLE test (a char(5) DEFAULT text '', b int4) with INSERT (Tom)
修复带有 LIMIT 的 UNION 
修复 CREATE TABLE x AS SELECT 1 UNION SELECT 2 
修复 CREATE TABLE test(col char(2) DEFAULT user)
修复 CREATE TABLE ... DEFAULT 中不匹配的类型
修复 SELECT * FROM pg_class where oid in (0,-1)
修复 SELECT COUNT('asdf') FROM pg_class WHERE oid=12

增强
------------
新增 CLI 接口包括文件 sqlcli.h,基于 SQL3/SQL98
删除所有在查询长度上的限制,行的长度限制仍然存在 (Tom)
更新 jdbc 协议到 2.0 (Jens Glaser )
添加 TRUNCATE 到快速截断关系 (Mike Mascari)
修复以给予超级用户和 createdb 用户适当更新目录的权限 (Peter E)
允许 ecpg 布尔变量有 NULL 值 (Christof)
如果变量的 NULL 值带有非 NULL 指示符那么发出 ecpg 错误 (Christof)
允许 ^C 取消 COPY 命令 (Massimo)
添加 SET FSYNC 和 SHOW PG_OPTIONS 命令(Massimo)
为动态加载的 C 函数重载函数名 (Frankpitt) 
添加 CmdTuples() 到 libpq++(Vince)
新增 CREATE CONSTRAINT TRIGGER 和 SET CONSTRAINTS 命令(Jan)
允许 CREATE FUNCTION/WITH 子句用于所有的语言类型
configure --enable-debug 添加 -g (Peter E)
configure --disable-debug 删除 -g (Peter E)
允许更复杂的缺省表达式 (Tom)
第一个真正的 FOREIGN KEY 约束触发器功能 (Jan)
添加 FOREIGN KEY ... MATCH FULL ... ON DELETE CASCADE (Jan)
添加 FOREIGN KEY ... MATCH <unspecified> 参照操作 (Don Baccus)
允许在 ctid(堆的物理位置) 上的 WHERE 约束 (Hiroshi) 
从贡献包中移动 pginterface 到接口目录,重命名为 pgeasy (Bruce)
改变 pgeasy connectdb() 参数顺序 (Bruce)
要求 SELECT DISTINCT 目标列表拥有所有 ORDER BY 字段 (Tom)
添加 Oracle 的 COMMENT ON 命令 (Mike Mascari )
libpq 的 PQsetNoticeProcessor 函数现在返回先前的 hook(Peter E)
阻止 PQsetNoticeProcessor 被设置为 NULL (Peter E)
在 COPY 选项中使 USING 可选 (Bruce)
允许在目标列表中有子查询 (Tom)
允许子查询在比较操作符的左边 (Tom)
新增并行回归测试 (Jan) 
改变后端的 COPY 写入文件权限为 644 而不是 666 (Tom)
强制 PGDATA 目录上的权限为安全的,即使它仍然存在 (Tom)
添加 psql LASTOID 变量以返回最后继承的 oid (Peter E)
允许并发的 vacuum 和删除 pg_vlock vacuum 锁文件 (Tom)
为 vacuum 添加权限检查 (Peter E)
新增 libpq 函数以允许异步的连接:PQconnectStart(),
  PQconnectPoll(), PQresetStart(), PQresetPoll(), PQsetenvStart(),
  PQsetenvPoll(), PQsetenvAbort (Ewan Mellor)
新增 libpq PQsetenv() 函数 (Ewan Mellor)
创建/更改 用户扩展 (Peter E) 
在 $PGDATA 下新增 postmaster.pid 和 postmaster.opts (Tatsuo)
为创建/删除 用户/数据库 新增脚本 (Peter E)
详细检查主要的 psql  (Peter E)
添加常量到 libpq 接口 (Peter E)
新增 libpq 函数 PQoidValue (Peter E)
显示特定的非聚合导致的 GROUP BY 问题 (Tom)
改变 pg_shadow 重新创建 pg_pwd 文件 (Peter E)
添加 aggregate(DISTINCT ...) (Tom)
允许标识控制  NULL 的 COPY 输入/输出 (Peter E)
使 postgres 用户有缺省的口令 (Peter E) 
添加 CREATE/ALTER/DROP GROUP (Peter E)
所有管理脚本现在支持 --long 选项 (Peter E, Karel)
Vacuumdb 脚本现在支持 --all 选项 (Peter E)
ecpg 新增轻便的 FETCH 语法
添加 ecpg EXEC SQL IFDEF, EXEC SQL IFNDEF, EXEC SQL ELSE, EXEC SQL ELIF
       和 EXEC SQL ENDIF 指令
添加 pg_ctl 脚本以控制后端启动 (Tatsuo)
添加 postmaster.opts.default 文件以存储启动标识 (Tatsuo)
允许 --with-mb=SQL_ASCII
增加索引键的最大数量到 16 (Bruce)
增加函数参数的最大数量到 16 (Bruce)
允许配置索引键和参数的最大数量 (Bruce)
允许非特权的用户改变他们的口令 (Peter E)
启用口令认证;新用户需要 (Peter E)
不允许删除用于数据库的用户 (Peter E)
改变 initdb 选项 --with-mb 为 --enable-multibyte
添加 initdb 选项以为超级用户提示口令 (Peter E)
允许像 col::numeric(9,2) 和 col::int2::float8 这样的复杂类型转换 (Tom)
在 initdb, initlocation, pg_dump, ipcclean 上升级用户接口 (Peter E)
新增 pg_char_to_encoding() 和 pg_encoding_to_char() 函数 (Tatsuo) 
libpq 非阻塞模式 (Alfred Perlstein)
改善在没有声明长度的计算中的类型的转换
新增 plperl 内部编程语言 (Mark Hollomon)
允许 COPY IN 读取不以一个新行结束的文件 (Tom)
当长的标识符被截断时提示 (Tom)
允许聚合使用类型等价 (Peter E)
允许 Oracle 的 to_char(), to_date(), to_datetime(), to_timestamp(), to_number() 转换函数 (Karel Zak <zakkr@zf.jcu.cz>)
添加 SELECT DISTINCT ON (expr [, expr ...]) targetlist ... (Tom)
检查以确保 ORDER BY 和 DISTINCT 操作一致 (Tom) 
添加 NUMERIC 和 int8 类型到 ODBC
改善 Append, Group, Agg, Unique 的 EXPLAIN 结果 (Tom)
添加 ALTER TABLE ... ADD FOREIGN KEY (Stephan Szabo)
在 PL/pgSQL 中允许 SELECT .. FOR UPDATE (Hiroshi)
启用后端顺序扫描,即使到达了 EOF (Hiroshi)
添加布尔值的 btree 索引,>= 和 <= (Don Baccus)
当 COPY FROM 失败时打印当前行的编号 (Massimo)
识别出 POSIX 时区,如 "PST+8" 和 "GMT-8" (Thomas)
添加 DEC 作为 DECIMAL 的同义词 (Thomas)
添加 SESSION_USER 作为 SQL92 的关键字,和 CURRENT_USER 相同 (Thomas)
改善 SQL92 字段别名 (aka 相关名字) (Thomas)
改善 SQL92 连接语法 (Thomas)
使 INTERVAL 的保留字作为一个字段标识符被允许 (Thomas)
实现 REINDEX 命令 (Hiroshi)
在聚合函数 SUM(ALL col) 中接受 ALL (Tom)
阻止 GROUP BY 使用字段别名 (Tom)
新增 psql \encoding 选项 (Tatsuo)
当在 waiting-for-lock 状态时允许 PQrequestCancel() 终止 (Hiroshi)
在所有情况下允许负数的否定
添加 ecpg 描述符 (Christof, Michael) 
允许 CREATE VIEW v AS SELECT f1::char(8) FROM tbl
允许带有长度的转换,如 foo::char(8)
新增 libpq 函数 PQsetClientEncoding(), PQclientEncoding() (Tatsuo)
添加 SJIS 用户定义字符支持 (Tatsuo)
大的视图/规则支持
使 libpq 的 PQconndefaults() 线程安全 (Tom)
禁用 // 作为注释以符合 ANSI,应该使用 -- (Tom)
允许在视图的 CREATE VIEW name 上使用字段别名 (collist)
修复带有子查询的视图 (Tom)
允许 UPDATE table SET fld = (SELECT ...) (Tom) 
SET 命令选项不再需要引号
升级 pgaccess 到 0.98.6
新增SET SEED 命令
新增 pg_options.sample 文件
新增 SET FSYNC 命令 (Massimo)
当创建表时允许 pg_descriptions
当创建类型、字段和函数时允许 pg_descriptions
允许 psql \copy 以允许分隔符 (Peter E)
允许 psql 打印 null 以区别 "" [null] (Peter E) 

类型
-----
修复了许多数组 (Tom)
允许空的字段名作为数组的下标 (Tom)
改善 int 和 float 常量的类型转换 (Tom)
清理 int8 输入、范围检查和类型转换 (Tom)
修复 SELECT timespan('21:11:26'::time) (Tom)
netmask('x.x.x.x/0') 是 255.255.255.255 而不是 0.0.0.0 (Oleg Sharoiko)
在 NUMERIC 上添加 btree 索引 (Jan)
含有 NUL 字符的大对象的 perl 修复 (Douglas Thomson)
大对象的 ODBC 修复 (free)
修复 cidr 数据类型的索引
修复以太网 MAC 地址 (macaddr 类型)比较
当在计算中发生溢出时修复日期/时间类型 (Tom)
允许 int8 上的数组 (Peter E)
修复 NUMERIC 类型的舍入/溢出,如 NUMERIC(4,4) (Tom)
允许 NUMERIC 数组
修复 NUMERIC ceil() 和 floor() 函数中的 bug (Tom)
使 char_length()/octet_length 包含结尾空白 (Tom)
使 abstime/reltime 使用 int4 而不是 time_t (Peter E)
为压缩的文本字段新增 lztext 数据类型
修正代码以处理强制的 int 和 float 常量 (Tom) 
在新的代码开始实现 BIT 和 BIT VARYING 类型 (Adriaan Joubert)
NUMERIC 现在接受科学计数法 (Tom)
NUMERIC 到 int4 的圆整 (Tom)
适当的转换 float4/8 到 NUMERIC (Tom)
允许 NUMERIC 的类型转换 (Thomas)
使 ISO 数据类型 (2000-02-16 09:33) 为缺省 (Thomas)
添加 NATIONAL CHAR [ VARYING ] (Thomas)
允许 NUMERIC 圆整和截断以接受负的标度 (Tom)
新增 TIME WITH TIME ZONE 类型 (Thomas)
在时间类型上添加 MAX()/MIN() (Thomas) 
为 int8 添加 abs(), mod(), fac() (Thomas)
为 float8 重命名函数为 round(), sqrt(), cbrt(), pow() (Thomas)
为 float8 添加超越数学函数(如 sin(), acos()) (Thomas)
为 NUMERIC 类型添加 exp() 和 ln()
重命名 NUMERIC power() 为 pow() (Thomas)
改进了 TRANSLATE() 函数 (Edwin Ramirez, Tom)
允许 X=-Y 运算符  (Tom)
允许 SELECT float8(COUNT(*))/(SELECT COUNT(*) FROM t) FROM t GROUP BY f1; (Tom)
允许 LOCALE 在正则表达式搜索中使用索引 (Tom)
允许功能性索引的创建使用缺省的类型

性能
-----------
阻止带有许多 AND 和 OR 的指数空间消耗 (Tom)
收集系统字段的属性选择值 (Tom)
减少聚合的内存使用 (Tom)
修复 LIKE 最优化以使用带有多字节编码的索引 (Tom)
修复 r-tree 索引优化器选择性 (Thomas)
改善优化器选择性计算和功能 (Tom)
优化许多相等键存在的 btree 搜索 (Tom)
只在索引存在时启用快速 LIKE 索引进程 (Tom)
再次利用带有多重记录的索引页的自由空间 (Tom)
改善哈希连接进程 (Tom) 
如果结果已经排序,那么阻止降序排序 (Hiroshi)
允许索引扫描查询限制条件的交换 (Tom)
在需要 ORDER BY/GROUP BY 的情况下更喜欢索引扫描 (Tom)
为性能分配大量内存请求固定尺寸的块 (Tom)
通过减少内存分配请求修复 vacuum 的性能 (Tom)
实现常量表达式简化 (Bernard Frankpitt, Tom)
使用使用的第二字段来决定索引扫描的开始  (Hiroshi)
在做内部排序时阻止四倍的使用磁盘空间 (Tom)
通过调用更少的函数快速的排序 (Tom)
创建系统索引匹配所有系统缓存 (Bruce, Hiroshi) 
使系统缓存使用系统索引 (Bruce)
使所有系统索引唯一 (Bruce)
为 vacuum 速度提升改进 pg_statistics 管理 (Tom)
较低频率的刷新后端缓存 (Tom, Hiroshi)
COPY 现在重新使用了先前的内存分配,提高了性能 (Tom)
改善优化成本估算 (Tom)
改善优化器估算  x > lowbound AND x < highbound  的范围查询 (Tom)
在适当的地方使用 DNF 而不是 CNF (Tom, Taral)
进一步清理 OR-of-AND WHERE-clauses (Tom)
在 OR 子句 (x = 1 AND y = 2) OR (x = 2 AND y = 4) 中使用索引 (Tom) 
智能优化器计算随机索引页访问 (Tom)
新增 SET 变量控制优化器开销 (Tom)
优化器查询基于 LIMIT, OFFSET, 和 EXISTS 限制条件 (Tom)
减少优化器链接路径的内部开支以加速 (Tom)
主要的子查询加速 (Tom)
当没有禁用 fsync 时较少的 fsync 写入 (Tom)
改善 LIKE 优化器估算  (Tom)
在只有 SELECT 的查询中阻止 fsync (Tom)
使索引创建使用 psort 代码,因为现在它更快速 (Tom)
允许创建临时表 > 1 Gig 的排序

源代码树的变化
-------------------
修复 linux PPC 编译
新增一般的 expression-tree-walker 子程序 (Tom)
更改 form() 为 varargform() 以阻止可能的问题
为 Alphas 上的大整数改善范围检查
清除 /include 目录中的 #include (Bruce)
为检查包含添加脚本 (Bruce)
从 *.c 文件中删除不需要的 #include (Bruce)
更改 #include 按情况使用 <> 和 "" (Bruce)
启用 Windows 的 libpq 编译
来自 Uncle George  的 Alpha 自旋锁修复
彻底检修优化器数据结构 (Tom)
修复 cygipc 库 (Yutaka Tanida)
允许 pgsql 工作在新的 Cygwin 快照上 (Dan)
新增目录版本号 (Tom)
添加 Linux ARM
重命名 heap_replace 为 heap_update
更新 QNX (Dr. Andreas Kardos)
新增特定于平台的回归处理 (Tom)
重命名 oid8 -> oidvector 和 int28 -> int2vector (Bruce)
包含所有 yacc 和 lex 文件到发布中 (Peter E.) 
删除不再需要的 lextest (Peter E)
修复在 Windows 上的 libpq 和 psql (Magnus)
内部改变 datetime 和 timespan 为 timestamp 和 interval (Thomas)
在 BSD/OS 上修复 plpgsql
添加 SQL_ASCII 测试案例到回归测试 (Tatsuo)
configure --with-mb 现在废弃了 (Tatsuo)
修复了 NT
修复了 NetBSD (Johnny C. Lam )
修复 Alpha 编译
新增多字节编码