E.96. 版本 8.3 #
发行日期
2008-02-04
E.96.1. 概述
凭借重要的新功能和性能增强,此发行版代表了 PostgreSQL 的重大飞跃。这得益于一个不断壮大的社区,它显著加快了开发步伐。此发行版增加了以下主要特性:
全文搜索被集成到核心数据库系统中
支持 SQL/XML 标准,包括新操作符和
XML数据类型枚举数据类型(
ENUM)组合类型的数组
通用唯一标识符(
UUID)数据类型新增对
NULL排在最前还是最后的控制可更新游标
服务器配置参数现在可以逐函数设置
用户定义类型现在可以带类型修饰符
当表定义更改或统计信息更新时自动重新规划缓存查询
日志和统计信息收集的大量改进
支持在 Windows 上使用安全服务提供程序接口(SSPI)进行认证
支持多个并发 autovacuum 进程及其他 autovacuum 改进
允许整个 PostgreSQL 发行版用 Microsoft Visual C++ 编译
主要性能改进如下所列。这些增强大多是自动的,不需要用户更改或调优:
异步提交延迟事务提交期间对 WAL 的写入
检查点写入可以分散到更长的时间段,以平滑每个检查点期间的 I/O 峰值
仅堆元组(HOT)加速大多数
UPDATE和DELETE的空间复用即时后台写入器策略改进磁盘写入效率
对只读事务使用非持久事务 ID 减少开销和
VACUUM需求逐字段和逐行的存储开销已被降低
大型顺序扫描不再驱逐频繁使用的缓存页
并发的大型顺序扫描现在可以共享磁盘读取
ORDER BY ... LIMIT可以不排序完成
上述各项在下面的章节中有更详细的说明。
E.96.2. 迁移到版本 8.3
希望从任何以前的版本迁移数据的用户,需要使用 pg_dump 进行转储/恢复。
请注意以下不兼容之处:
E.96.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 ... USINGoperator现在必须使用 btree 操作符类中定义的小于或大于operator添加此限制是为了防止不一致的结果。
SET LOCAL的更改现在持续到最外层事务结束,除非回滚(Tom)此前
SET LOCAL的效果在子事务提交(RELEASE SAVEPOINT或退出 PL/pgSQL 异常块)后丢失。在事务块中被拒绝的命令现在在多语句查询字符串中也被拒绝(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权限,或者如果该表空间是数据库的默认表空间则允许。移除未记录的
!!=(not in)操作符(Tom)NOT IN (SELECT ...)是执行此操作的正确方式。内部哈希函数现在分布更均匀(Tom)
如果应用程序代码使用 PostgreSQL 内部哈希函数计算并存储哈希值,必须重新生成这些哈希值。
处理变长数据值的 C 代码约定已更改(Greg Stark、Tom)
必须使用新的
SET_VARSIZE()宏来设置生成的varlena值的长度。此外,可能需要在更多情形下展开(“去 TOAST”)输入值。连续归档不再把每个成功的归档操作报告给服务器日志,除非使用
DEBUG级别(Simon)
E.96.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.96.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——给出第一个参数按指定编码的字符长度
移除
convert(argument USING conversion_name)(Andrew)其行为不符合 SQL 标准。
把 JOHAB 编码改为仅客户端(Tatsuo)
JOHAB 作为服务器端编码不安全。
E.96.3. 变更
下面你将找到 PostgreSQL 8.3 与上一个主版本之间变更的详细说明。
E.96.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能回收死元组占用的空间。有了 HOT,如果没有对索引列做更改,死元组空间可以在INSERT或UPDATE时自动回收。这带来更一致的性能。此外,HOT 避免添加重复的索引条目。即时后台写入器策略改进磁盘写入效率(Greg Smith、Itagaki Takahiro)
这大幅减少了对后台写入器的手动调优需求。
逐字段和逐行的存储开销已被降低(Greg Stark、Heikki Linnakangas)
数据值短于 128 字节的变长数据类型的存储将减少 3 到 6 字节。例如,两个相邻的
char(1)字段现在用 4 字节而不是 16 字节。行头也比以前短 4 字节。对只读事务使用非持久事务 ID 减少开销和
VACUUM需求(Florian Pflug)非持久事务 ID 不递增全局事务计数器。因此,它们降低了
pg_clog的负载,并延长了为防止事务 ID 回卷而强制清理之间的时间间隔。还做了其他应能改进并发性的性能改进。避免在只读命令之后递增命令计数器(Tom)
此前每个事务有 232(40 亿)条命令的硬限制。现在只有实际更改数据库的命令才计数,因此虽然该限制仍存在,但应该明显不那么碍事了。
创建专门的 WAL 写入器进程来分担后端的工作(Simon)
跳过
CLUSTER和COPY不必要的 WAL 写入(Simon)除非启用了 WAL 归档,系统现在避免为
CLUSTER写 WAL,只是在命令结束时对表执行fsync()。如果表在同一事务中创建,COPY也同样处理。大型顺序扫描不再驱逐频繁使用的缓存页(Simon、Heikki、Tom)
并发的大型顺序扫描现在可以共享磁盘读取(Jeff Davis)
这是通过在表中间(另一个顺序扫描已在进行的地方)开始新的顺序扫描并回绕到开头来完成来实现的。这会影响未指定
ORDER BY的查询返回行的顺序。必要时可以用synchronize_seqscans配置参数禁用它。ORDER BY ... LIMIT可以不排序完成(Greg Stark)这是通过顺序扫描表并只跟踪“前 N”候选行而不是对整表做完全排序来完成的。这在没有匹配索引且
LIMIT不大时很有用。对后端发送给统计收集器的消息设置速率限制(Tom)
这降低了短事务的开销,但有时可能增加统计汇总前的延迟。
改进有许多 NULL 情形下的哈希连接性能(Tom)
加快非精确数据类型匹配情形下的操作符查找(Tom)
E.96.3.2. 服务器
Autovacuum 现在默认启用(Alvaro)
做了若干更改以消除启用 autovacuum 的缺点,从而证明默认值变更的合理性。还修改了几个其他 autovacuum 参数的默认值。
支持多个并发 autovacuum 进程(Alvaro、Itagaki Takahiro)
这允许多个清理并发运行。这防止大表的清理延迟较小表的清理。
当表定义更改或统计信息更新时自动重新规划缓存查询(Tom)
此前,引用临时表的 PL/pgSQL 函数在临时表于函数调用之间被删除并重建时会失败,除非使用
EXECUTE。此改进修复了该问题及许多相关问题。新增
temp_tablespaces参数,控制临时表和文件的表空间(Jaime Casanova、Albert Cervera、Bernd Helmle)此参数定义要使用的表空间列表。这使 I/O 负载可以分散到多个表空间。每次创建临时对象时随机选择一个表空间。临时文件不再存储在逐数据库的
pgsql_tmp/目录中,而是存储在逐表空间的目录中。把临时表的 TOAST 表放在名为
pg_toast_temp_的特殊模式中(Tom)nnn这使低层代码能把这些表识别为临时的,从而支持各种优化,例如不写 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.96.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)为
pg_stat_activity新增xact_start(事务开始时间)列(Neil)这使识别长运行事务更容易。
为
pg_stat_all_tables及相关视图新增n_live_tuples和n_dead_tuples列(Glen Parker)把
stats_block_level和stats_row_level参数合并为单一参数track_counts,它控制发送给统计收集器进程的所有消息(Tom)把
stats_command_string参数改名为track_activities(Tom)修复活元组和死元组的统计计数,使其认识到已提交和中止的事务有不同的影响(Tom)
E.96.3.4. 认证
支持在 Windows 上使用安全服务提供程序接口(SSPI)进行认证(Magnus)
支持 GSSAPI 认证(Henry Hotz、Magnus)
应优先于本机 Kerberos 认证使用它,因为 GSSAPI 是行业标准。
支持全局 SSL 配置文件(Victor Wagner)
新增
ssl_ciphers参数,控制接受的 SSL 密码(Victor Wagner)新增 Kerberos realm 参数
krb_realm(Magnus)
E.96.3.5. Write-Ahead Log (WAL) and Continuous Archiving
把事务 WAL 记录中记录的时间戳从 time_t 改为 TimestampTz 表示(Tom)
这为 WAL 提供了亚秒分辨率,对时间点恢复很有用。
减少热备服务器所需的 WAL 磁盘空间(Simon)
此变更允许热备服务器把最早仍需要的 WAL 文件名传递给恢复脚本,从而自动删除不再需要的 WAL 文件。这是通过
recovery.conf的restore_command参数中的%r完成的。新的布尔配置参数
archive_mode控制归档(Simon)此前把
archive_command设为空字符串会关闭归档。现在archive_mode独立于archive_command控制归档的开关。这对临时停止归档很有用。
E.96.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)创建一个通用机制,通过调用数据类型的 I/O 函数,支持每个数据类型与标准字符串类型(
TEXT、VARCHAR、CHAR)之间的转换(Tom)此前,这类转换只对有专门函数的类型可用。这些新转换在转字符串方向只允许赋值转换,另一方向只允许显式转换,因此不应产生令人惊讶的行为。
当所有输入都是同一域类型时,允许
UNION及相关构造返回域类型(Tom)此前,输出会被认为属于域的基本类型。
允许在使用两种不同数据类型时进行有限哈希(Tom)
如果数据类型有兼容的哈希函数,这允许在涉及跨数据类型比较的情形中使用哈希连接、哈希索引、哈希子计划和哈希聚合。目前,跨数据类型哈希支持存在于
smallint/integer/bigint以及float4/float8。改进优化器检测
WHERE子句中变量何时相等的逻辑(Tom)这允许归并连接以降序排序工作,并改进对冗余排序列的识别。
在大多数表被约束排除的大继承树情形下改进规划性能(Tom)
E.96.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.96.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)这些命令简化了把数据库会话重置为初始状态,对连接池软件特别有用。
使
CLUSTERMVCC 安全(Heikki Linnakangas)此前,
CLUSTER会丢弃所有已提交为死的元组,即使按照 MVCC 可见性规则仍有事务应当能看到它们。新增
CLUSTER语法:CLUSTER(Holger Schurig)tableUSINGindex旧的
CLUSTER语法仍受支持,但新形式被认为更合逻辑。修复
EXPLAIN,使其能更准确地显示复杂计划(Tom)对子计划输出的引用现在总是正确显示,而不是在复杂情形使用
?column。N?限制删除用户时报告的信息量(Alvaro)
此前,删除(或试图删除)拥有许多对象的用户会产生列出所有这些对象的大型
NOTICE或ERROR消息;这给一些客户端应用程序带来问题。现在消息长度受限,但完整列表仍会发送到服务器日志。
E.96.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.96.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 函数特别有用。
为
EXTRACT()和date_part()新增isodow选项(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()返回 void,而不是无用的整数值(Neil)为
NUMERIC新增哈希函数(Neil)这允许
NUMERIC列使用哈希索引和基于哈希的计划。改进
LIKE/ILIKE的效率,特别是对 UTF-8 等多字节字符集(Andrew、Itagaki Takahiro)让
currtid()函数要求目标表上的SELECT权限(Tom)新增若干
txid_*()函数来查询活动事务 ID(Jan)这对各种复制解决方案很有用。
E.96.3.11. PL/pgSQL 服务器端语言
新增可滚动游标支持,包括
FETCH中的方向控制(Pavel Stehule)为了与后端的
FETCH命令一致,允许在 PL/pgSQL 的FETCH语句中用IN替代FROM(Pavel Stehule)为 PL/pgSQL 新增
MOVE(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.96.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.96.3.13. psql
在
\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.96.3.14. pg_dump
为 pg_dumpall 新增
--tablespaces-only和--roles-only选项(Dave Page)为 pg_dumpall 新增输出文件选项(Dave Page)
这主要在 Windows 上有用,在那里子 pg_dump 进程的输出重定向不起作用。
允许 pg_dumpall 接受初始连接数据库名而不是默认的
template1(Dave Page)在
-n和-t开关中,始终按字面匹配$(Tom)改进数据库有数千个对象时的性能(Tom)
移除
-u选项(此选项早已废弃)(Tom)
E.96.3.15. 其他客户端应用程序
在 initdb 中,允许指定
pg_xlog目录的位置(Euler Taveira de Oliveira)在支持的操作系统上启用 pg_regress 中的服务器核心转储生成(Andrew)
为 pg_ctl 新增
-t(超时)参数(Bruce)这控制 pg_ctl 等待服务器启动或关闭的时间。此前超时被硬编码为 60 秒。
新增 pg_ctl 选项来控制服务器核心转储的生成(Andrew)
允许用 Control-C 取消 clusterdb、reindexdb 和 vacuumdb(Itagaki Takahiro、Magnus)
抑制 createdb、createuser、dropdb 和 dropuser 的命令标签输出(Peter)
--quiet选项被忽略并将在 8.4 中移除。对所有数据库操作时的进度消息现在发送到 stdout 而不是 stderr,因为它们实际上不是错误。
E.96.3.16. libpq
如果
PQsetdbLogin()的dbName参数包含等号,把它解释为conninfo字符串(Andrew)这允许仍在使用
PQsetdbLogin()的客户端程序使用conninfo字符串。支持全局 SSL 配置文件(Victor Wagner)
新增环境变量
PGSSLKEY来控制 SSL 硬件密钥(Victor Wagner)新增用于大对象截断的
lo_truncate()(Kris Jurka)新增
PQconnectionNeedsPassword(),如果服务器要求口令但未提供则返回真(Joe Conway、Tom)如果在连接尝试失败后它返回真,客户端应用程序应提示用户输入口令。过去应用程序必须检查特定的错误消息字符串来决定是否需要口令;该方法现已废弃。
新增
PQconnectionUsedPassword(),如果提供的口令确实被使用则返回真(Joe Conway、Tom)这在某些需要知道用户提供的口令是否确实有效的安全上下文中很有用。
E.96.3.17. ecpg
使用 V3 前端/后端协议(Michael)
这新增了对服务器端预备语句的支持。
在 Windows 上使用本机线程而不是 pthreads(Magnus)
改进 ecpglib 的线程安全(Itagaki Takahiro)
让 ecpg 库只导出必要的 API 符号(Michael)
E.96.3.18. Windows Port
允许整个 PostgreSQL 发行版用 Microsoft Visual C++ 编译(Magnus 等)
这使基于 Windows 的开发者可以使用熟悉的开发和调试工具。用 Visual C++ 制作的 Windows 可执行文件也可能比用其他工具集制作的具有更好的稳定性和性能。仅客户端的 Visual C++ 构建脚本已被移除。
大幅降低 postmaster 有许多子进程时的内存使用(Magnus)
允许由管理用户启动回归测试(Magnus)
新增本机共享内存实现(Magnus)
E.96.3.19. Server Programming Interface (SPI)
在 SPI 中新增游标相关功能(Pavel Stehule)
允许访问与游标相关的规划选项,并新增
FETCH/MOVE例程。允许通过
SPI_execute执行游标命令(Tom)宏
SPI_ERROR_CURSOR仍然存在但永远不会被返回。SPI 计划指针现在声明为
SPIPlanPtr而不是void *(Tom)这不会破坏应用程序代码,但建议切换以帮助捕获简单的编程错误。
E.96.3.20. 构建选项
新增 configure 选项
--enable-profiling以启用代码剖析(只与 gcc 一起工作)(Korry Douglas 和 Nikhil Sontakke)新增 configure 选项
--with-system-tzdata以使用操作系统的时区数据库(Peter)修复 PGXS,使扩展可以针对 pg_config 程序不在
PATH最前面的 PostgreSQL 安装构建(Tom)构建 SGML 文档时支持
gmake draft(Bruce)除非使用
draft,文档构建现在会在必要时重复进行以确保索引是最新的。
E.96.3.21. 源代码
把宏
DLLIMPORT改名为PGDLLIMPORT,以避免与定义DLLIMPORT的第三方包含(如 Tcl)冲突(Magnus)创建“操作符族”以改进涉及跨数据类型比较的查询的规划(Tom)
更新 GIN
extractQuery()API,允许发出没有任何东西能满足查询的信号(Teodor)把
NAMEDATALEN定义从postgres_ext.h移到pg_config_manual.h(Peter)在所有平台上提供
strlcpy()和strlcat(),并替换易出错的strncpy()、strncat()等用法(Peter)创建钩子,让外部插件监控(甚至替换)规划器并为假想情形创建计划(Gurjeet Singh、Tom)
创建函数变量
join_search_hook,让插件覆盖规划器的连接搜索顺序部分(Julius Stroffek)为 Renesas 的 M32R 处理器新增
tas()支持(Kazuhiro Inaoka)quote_identifier()和 pg_dump 不再对按语法属于非保留的关键字加引号(Tom)更改
NUMERIC数据类型的磁盘表示,使sign_dscale字位于权重之前(Tom)在 Darwin >= 6.0(即 OS X 10.2 及以上)上使用 SYSV 信号量而不是 POSIX 信号量(Chris Marcellino)
文档现在记录 "Postgres" 是 "PostgreSQL" 的可接受别名(Peter)
新增关于在服务器停机时防止数据库服务器欺骗的文档(Bruce)
E.96.3.22. 附加模块
把
contrib的README内容移入 PostgreSQL 主文档(Albert Cervera i Areny)新增用于低层页检查的
contrib/pageinspect模块(Simon、Heikki)新增用于控制热备操作的
contrib/pg_standby模块(Simon)新增
contrib/uuid-ossp模块,用 OSSP UUID 库生成UUID值(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 支持取代了此模块。