E.226. 版本 8.1

E.226.1. 概要
E.226.2. 迁移到版本 8.1
E.226.3. 额外的修改

发布日期:. 2005-11-08

E.226.1. 概要

这个版本中的主要修改:

改善到共享缓冲区缓存的并发访问 (Tom)

访问共享缓冲区缓存被认定为是一个重要的可扩展性问题,尤其是在多个CPU的系统上。 在这个版本中,锁定的方式是以缓冲区管理器已经被检查以减少锁征用和提高可扩展性来完成的。 缓冲区管理器也已经被修改为使用一个时钟扫描替换机制。

允许索引扫描使用一个中间内存位图 (Tom)

在以前的版本中,只有单个索引可以用来在表上查找。有了这个特性,如果一个查询有 WHERE tab.col1 = 4 and tab.col2 = 9,并且在col1col2上没有多字段索引,但是在col1上有一个索引, 并且在col2上有另一个索引,那么有可能搜索两个索引并在内存中组合结果, 然后为同时匹配col1col2限制条件的行执行堆栈获取。 这在有许多非结构化的查询,可能创建匹配所有访问条件的索引的环境中是非常有用的。 即使是单个索引,位图扫描也是有用的,因为他们减少了所需要的随机访问的数量; 位图索引扫描对于检索完整表的相当大的分数是高效的,而普通索引扫描则不行。

添加了两阶段提交 (Heikki Linnakangas, Alvaro, Tom)

两阶段提交允许事务在几个计算机上"准备",并且一旦所有计算机都成功的准备了它们的事务 (没有失败),那么所有事务都可以提交。即使一个机器在准备之后崩溃了, 准备的事务也可以在该机器重启之后提交。新的语法包括PREPARE TRANSACTIONCOMMIT/ROLLBACK PREPARED。还添加了一个新的系统视图 pg_prepared_xacts

创建一个新的替换用户和组的角色系统

角色是用户和组的一个组合。像用户,它们可以有登录功能,像组, 一个角色可以拥有其他角色作为成员。角色基本上删除了用户和组之间的不同。 例如,一个角色可以:

  • 有登录功能 (可选)

  • 拥有对象

  • 持有数据库对象的访问权限

  • 从它作为成员的其他角色上继承权限

一旦用户登录到一个角色,她获得了登录角色加上任何继承的角色的能力, 并且可以使用SET ROLE来切换到其他角色(她在其中是一个成员)。 这个特性是SQL标准角色的概念的一个概括。这个修改还用新的角色能力目录 pg_authidpg_auth_members替换了 pg_shadowpg_group。 老的表被重新定义为新角色表上的只读视图。

MIN()MAX()自动使用索引 (Tom)

在以前的版本中,为MIN()MAX() 使用索引的唯一方式是重写查询SELECT col FROM tab ORDER BY col LIMIT 1。 索引使用现在是自动发生的。

移动/contrib/pg_autovacuum到主服务器 (Alvaro)

整合自动清理到服务器,允许它在数据库服务器的同步中自动启动和停止, 并允许自动清理在postgresql.conf中配置。

使用SELECT ... FOR SHARE添加共享的行级别锁 (Alvaro)

然而PostgreSQL的MVCC锁允许SELECT 永不被写入锁定,并且因此不需要为典型的操作共享行锁, 共享的锁对于请求共享的行锁的应用是有用的。 特别是它减少了由于参照完整性检查增加的锁请求。

在共享的对象上添加依赖性,尤其是角色 (Alvaro)

依赖性机制的扩展阻止了角色仍然拥有数据库对象时被删除。 以前有可能意外的孤儿对象被删除它们的所有者。 虽然这可以被恢复,但是它是杂乱的并且会使人不愉快。

为分区表提升性能 (Simon)

新的constraint_exclusion 配置参数避免了在约束表示没有匹配行存在的子表上查找。

这允许表分区的基本类型。如果子表存储独立的键范围,并且强制使用适当的CHECK 约束,那么优化器将在约束保证在子表中没有匹配的行存在时跳过子表访问。

E.226.2. 迁移到版本 8.1

对于那些想要从任何以前的版本中迁移数据的用户来说, 使用pg_dump的一个转储/恢复是必需的。

8.0版本宣布间隔的to_char()函数将在8.1中删除。不过, 因为没有更好的API被推荐,to_char(interval)已经在8.1中被加强, 并且将保留在服务器中。

观察下列的不兼容性:

  • add_missing_from现在缺省是假 (Neil)

    缺省的,如果表用在一个没有FROM引用的查询中,我们现在产生一个错误。 老的行为仍然可用,但是参数必须设置为'true'。

    为了加载一个现有的转储文件,如果转储包含任何使用隐式FROM 语法创建的视图或规则,那么将add_missing_from设置为true是必须的。 这应该是一个一次性的烦恼,因为PostgreSQL 8.1 将转换这样的视图和规则到标准的显式FROM语法。 随后的转储将因此不会有这个问题。

  • float4/float8/oid 零长度字符串('')的输入抛出一个错误, 而不是将它看做零 (Neil)

    这个修改与当前整数的零长度字符串的处理是一致的。 这个修改计划在8.0中宣布。

  • default_with_oids现在缺省为假 (Neil)

    这个选项设置为假,用户创建的表不再有一个OID字段,除非在CREATE TABLE 中指定了WITH OIDS。尽管OID已经存在于PostgreSQL 的所有版本中,但是因为它们只有四字节长度并且计数器是基于所有安装的数据库共享的, 所以它们的使用是受限制的。唯一标识行的首选方式是通过序列和SERIAL类型, 这个自从PostgreSQL 6.4开始就已经支持了。

  • 添加E''语法,这样最后普通字符串可以正确的对待反斜杠 (Bruce)

    目前PostgreSQL作为引入一个特殊的转义序列来处理字符串文本中的反斜杠, 比如\n\010。虽然这允许特殊值的简单入口, 但是它是不标准的并且使得从其他数据库中移植应用更加困难。因为这个原因, PostgreSQL工程计划删除反斜杠在字符串中的特殊含义。 为了向后兼容和想要特殊处理反斜杠的用户,创建了一个新的字符串语法。 这个新的字符串语法的格式是在开始字符串的单引号之前写一个E, 例如E'hi\n'。虽然这个版本没有改变反斜杠在字符串中的处理, 但是它确实添加了新的配置参数来帮助用户迁移应用到未来的版本:

    • standard_conforming_strings —这个版本正确的对待反斜杠为普通字符串?

    • escape_string_warning —在普通的字符串(非E)中警告反斜杠

    standard_conforming_strings值是只读的。应用可以检索该值来知道反斜杠是如何处理的。 (参数的存在也可以作为一个支持E''字符串语法的指示。)在未来的版本中, standard_conforming_strings将为真,意味着反斜杠在非E字符串中将按照字面值对待。 为了准备这个修改,在需要特殊处理反斜杠的地方使用E''字符串, 并且打开escape_string_warning来找到需要使用E'' 转换的额外的字符串。另外,使用两个单引号('')在一个字符串中嵌入一个字面的单引号, 而不是PostgreSQL支持的反斜杠单引号(\')语法。 前者是符合标准的,并且不需要使用E''字符串语法。你也可以使用$$ 字符串语法,它不特殊对待反斜杠。

  • REINDEX DATABASE重新索引数据库中的所有索引 (Tom)

    以前,REINDEX DATABASE只重建系统表的索引。 这个新的行为看起来更加直观。一个新的命令REINDEX SYSTEM 提供只重建系统表的老的功能。

  • 只读大对象描述符现在服从MVCC快照语义

    当一个大对象是用INV_READ(不是INV_WRITE)打开的时, 来自描述符的数据读取现在将反应调用lo_open() 的查询使用了事务快照时大对象的状态的快照。 要获取总是返回最后提交的数据的老的行为,在lo_open() 的模式标志中包含INV_WRITE

  • 为序列函数的参数添加适当的依赖 (Tom)

    在以前的版本中,传递到nextval()currval()setval()的序列名是作为简单文本字符串存储的, 意味着重命名或删除一个在DEFAULT子句中使用的序列会使子句无效。 这个版本将所有新建的序列函数参数作为内部OID存储,允许它们追踪序列重命名, 并且添加阻止不正确的序列删除的依赖关系信息。这也使得DEFAULT 子句免疫模式重命名和搜索路径改变。

    一些应用可能依赖于运行时查找序列名的老的行为。这通过明确的转换参数为 text仍然可以实现,例如nextval('myseq'::text)

    8.1之前的数据库转储加载到8.1将使用老的基于文本的表示, 并且因此没有OID存储参数的特性。不过,更新包含基于文本的DEFAULT 子句的数据库是可能的。首先,保存这个查询到一个文件中,比如fixseq.sql

    SELECT  'ALTER TABLE ' ||
       pg_catalog.quote_ident(n.nspname) || '.' ||
       pg_catalog.quote_ident(c.relname) ||
       ' ALTER COLUMN ' || pg_catalog.quote_ident(a.attname) ||
       ' SET DEFAULT ' ||
       regexp_replace(d.adsrc,
                      $$val\(\(('[^']*')::text\)::regclass$$,
                      $$val(\1$$,
                      'g') ||
       ';'
    FROM    pg_namespace n, pg_class c, pg_attribute a, pg_attrdef d
    WHERE   n.oid = c.relnamespace AND
       c.oid = a.attrelid AND
       a.attrelid = d.adrelid AND
       a.attnum = d.adnum AND
       d.adsrc ~ $$val\(\('[^']*'::text\)::regclass$$;

    然后,在一个数据库中运行该查询,找到需要哪个调整,例如对于数据库db1:

    psql -t -f fixseq.sql db1

    这将显示ALTER TABLE命令需要转换数据库到新的基于OID的表示。 如果命令看起来合理,运行这个来更新该数据库:

    psql -t -f fixseq.sql db1 | psql -e db1

    这个过程必须在每个要更新的数据库中重复进行。

  • psql中,将未加引号的\{digit}+ 序列看做是八进制的 (Bruce)

    在以前的版本中,\{digit}+序列被看做是小数点,并且只有\0{digit}+ 被看做是八进制的。这个修改是为了一致性。

  • 为前缀和后缀%^操作符删除语法生产

    这些从未记录和复杂的负数的模数操作符(%)的使用。

  • 让多边形的&<&> 与盒子的"over"操作符一致 (Tom)

  • CREATE LANGUAGE可以忽略提供的参数,为了支持来自 pg_pltemplate的信息

    定义了一个新的系统目录pg_pltemplate, 携带关于过程语言首选定义的信息(比如它们是否有验证器函数)。 当一个条目存在于创建语言的目录中时,CREATE LANGUAGE 将忽略所有它的参数除了语言名并使用目录信息。 采取这个措施是因为废弃的语言定义被老的转储文件加载而增加问题。 截止到8.1,pg_dump将只是作为 CREATE LANGUAGE name 转储过程语言定义,依赖于加载时模板条目的存在。 我们期待这将成为一个更加不会过时的表示。

  • pg_cancel_backend(int)返回一个boolean 而不是一个integer (Neil)

  • 一些用户在加载UTF-8数据到8.1.X时遇到问题。这是因为以前的版本允许无效的UTF-8 字节序列输入到数据库中,而这个版本只接受有效的UTF-8序列。 纠正转储文件的一个方式是运行命令iconv -c -f UTF-8 -t UTF-8 -o cleanfile.sql dumpfile.sql-c选项删除无效的字符序列。 两个文件的差异将显示无效的序列。iconv读取整个输入文件到内存中, 这样它可能为了处理需要使用split将转储分成多个较小的文件。

E.226.3. 额外的修改

下面你将发现PostgreSQL 8.1和以前的主版本间详细的额外的修改。

E.226.3.1. 性能改善

  • 提高GiST和R-tree索引性能(Neil)

  • 改善优化器,包括自动调整哈希连接的大小 (Tom)

  • 彻底检查几个方面的内部API

  • 修改WAL记录CRC从64位到32位 (Tom)

    我们觉得计算64位CRC的额外开销非常大,并且获得的可靠性并不足以为它辩解。

  • 阻止在WAL页面中写入大的空间隙 (Tom)

  • 改善SMP机器上的自旋锁行为,尤其是Opterons (Tom)

  • 允许非连续的索引字段在多字段索引上使用 (Tom)

    例如,这允许一个在字段a、b、c上的索引在一个带有 WHERE a = 4 and c = 10 的查询中使用。

  • CREATE TABLE AS / SELECT INTO 跳过WAL日志 (Simon)

    因为CREATE TABLE AS期间的崩溃会导致表在恢复期间被删除, 没有理由WAL记录该表被加载了。(不过,如果启用了WAL归档,记录仍然会发生。)

  • 允许并发的GiST索引访问 (Teodor, Oleg)

  • 添加配置参数full_page_writes控制写入全部页面到WAL (Bruce)

    为了阻止部分磁盘写入损坏数据库,PostgreSQL 写了每个数据库磁盘页面的完整拷贝来WAL它在一个检查点之后被修改的第一个时间。 这个选项为了更快的速度关闭了该功能。这对于使用电池后备的磁盘缓存来说是安全的, 这种情况下部分页面写入不会发生。

  • 当为wal_sync_method使用O_SYNC时, 如果可用则使用O_DIRECT (Itagaki Takahiro)

    O_DIRECT导致磁盘写入绕过内核缓存,对于WAL写入来说,这提高了性能。

  • 提高COPY FROM性能 (Alon Goldshuv)

    这是通过在更大的语块中读取COPY输入完成的,而不是挨个读取字符。

  • 提高了COUNT()SUMAVG()STDDEV()VARIANCE()的性能 (Neil, Tom)

E.226.3.2. 服务器的变化

  • 阻止由于事务ID (XID)环绕式处理引起的问题 (Tom)

    当事务计数器达到环绕的点时,服务器现在将发出警告。如果计数器即将达到环绕的点时, 服务器将停止接受查询。这保证了数据在需要的清理执行之前不会丢失。

  • 修复OID计数器已经环绕式处理之后,对象IDs (OIDs)与现有系统对象冲突的问题 (Tom)

  • 添加VACUUM期间需要增加max_fsm_relationsmax_fsm_pages的警告 (Ron Mayer)

  • 添加temp_buffers配置参数, 允许用户为临时表访问确定本地缓存区域的大小 (Tom)

  • 添加会话启动时间和客户端IP地址到pg_stat_activity (Magnus)

  • 为位图扫描调整pg_stat视图 (Tom)

    一些字段的含义发生了微妙的变化。

  • 加强了pg_locks视图 (Tom)

  • 客户端侧PREPAREEXECUTE的日志查询 (Simon)

  • 允许Kerberos名字和用户名在postgresql.conf的规定中大小写敏感 (Magnus)

  • 添加配置参数krb_server_hostname, 这样服务器主机名可以作为服务主体的一部分指定 (Todd Kover)

    如果没有设置,任何服务主体匹配keytab中的任意条目都有可能被使用。 这是这个版本中的新的Kerberos匹配行为。

  • 为毫秒时间戳(%m)和远程主机(%h)添加 log_line_prefix选项 (Ed L.)

  • 为GiST索引添加WAL日志 (Teodor, Oleg)

    GiST索引现在对于崩溃和时间点恢复来说是安全的。

  • 当我们执行pg_stop_backup()时,删除老的*.backup文件 (Bruce)

    这阻止了大量的*.backup文件存在于pg_xlog/中。

  • 添加配置参数为闲置、间隔和计数控制TCP/IP保持活动的时间 (Oliver Jowett)

    这些值可以修改来允许对丢失的客户端连接更快速的检测。

  • 添加每用户和每数据库连接限制 (Petr Jelinek)

    使用ALTER USERALTER DATABASE, 现在可以强制限制作为一个特殊用户或作为一个特殊数据库并发连接的最大会话数量。 设置限制为0禁用用户或数据库连接。

  • 在64位的机器上允许超过两千兆字节的共享内存和每后端的工作内存 (Koichi Suzuki)

  • 新增系统目录pg_pltemplate,允许在转储文件中重写废弃的过程语言定义 (Tom)

E.226.3.3. 查询修改

  • 添加临时视图 (Koju Iijima, Neil)

  • 修复HAVING没有任何聚合函数或GROUP BY, 这样查询返回一个组 (Tom)

    以前,这样的情况会将HAVING子句看做和WHERE子句相同。 这是不规范的。

  • 添加USING子句允许额外的表指定为DELETE (Euler Taveira de Oliveira, Neil)

    在以前的版本中,没有明确的方法指定用于DELETE语句中的连接的额外的表。 对于这个目的,UPDATE早已有了一个FROM子句。

  • 在后端和ecpg字符串中添加对\x十六进制转义的支持 (Bruce)

    这正像标准C \x转义语法。八进制转义早就支持了。

  • 添加BETWEEN SYMMETRIC查询语法 (Pavel Stehule)

    这个特征允许BETWEEN比较不请求第一个值小于第二个值。 例如,2 BETWEEN [ASYMMETRIC] 3 AND 1返回假, 而2 BETWEEN SYMMETRIC 3 AND 1返回真。 BETWEEN ASYMMETRIC早就支持了。

  • 添加NOWAIT选项到SELECT ... FOR UPDATE/SHARE (Hans-Juergen Schoenig)

    statement_timeout配置参数允许一个查询接受超过一定数量的时间被取消, NOWAIT选项允许查询在SELECT ... FOR UPDATE/SHARE 命令不能立即获得一个行锁时尽快被取消。

E.226.3.4. 对象操作的改变

  • 追踪共享对象的依赖性 (Alvaro)

    PostgreSQL允许全局表(用户、数据库、表空间) 引用多个数据库中的信息。这为全局表额外的添加了依赖关系信息,这样,例如, 用户所有权可以跨数据库追踪,一个在任意数据库中拥有某些东西的用户不再被删除。 依赖关系追踪早已为数据库本地对象存在了。

  • 允许受限制的ALTER OWNER命令被对象所有者执行 (Stephen Frost)

    以前的版本只允许超级用户修改对象所有者。现在,如果执行该命令的用户拥有该对象, 并且可以作为新的所有者创建它,那么所有权就可以转移(也就是说, 该用户是新的拥有角色的一员,并且该角色拥有重新创建该对象所需要的CREATE权限)。

  • 为某些对象类型(表、函数、类型)添加ALTER对象 SET SCHEMA能力 (Bernd Helmle)

    这允许对象迁移到不同的模式中。

  • 添加ALTER TABLE ENABLE/DISABLE TRIGGER禁用触发器 (Satoshi Nagayasu)

E.226.3.5. 工具命令的变化

  • 允许TRUNCATE在一个命令中截断多个表 (Alvaro)

    由于参照完整性检查,不允许截断是参照完整性约束的一部分的表。 使用这个新功能,TRUNCATE可以用来截断这个样的表, 如果两个表都包含在一个参照完整性约束中,那么会在一个 TRUNCATE命令中都被截断。

  • COPY CSV模式中正确的处理回车和换行 (Andrew)

    在版本8.0中,CSV COPY TO中的回车和换行是以一种不一致的方式处理的。 (这在TODO列表中记录了。)

  • 添加COPY WITH CSV HEADER,允许标题作为COPY 中的第一行 (Andrew)

    这允许处理公共CSV在数据文件的第一行放置字段名的用法。 对于COPY TO,第一行包含该字段名,对于COPY FROM, 忽略第一行。

  • 在Windows上,在EXPLAIN ANALYZE中显示更好的次秒级精度 (Magnus)

  • 添加触发时间显示到EXPLAIN ANALYZE

    以前的版本包含触发器的执行时间作为总的执行时间的一部分, 但是没有单独显示它。现在有可能看到在每个触发器中花费了多少时间。

  • COPY中添加对\x十六进制转义的支持 (Sergey Ten)

    以前的版本只支持八进制转义。

  • SHOW ALL包括变量描述 (Matthias Schmidt)

    SHOW变量名仍然只显示变量的值,不包括变量描述。

  • initdb创建一个新的称为postgres的标准数据库, 并转变工具为标准查询使用postgres而不是template1 (Dave)

    在以前的版本中,template1作为工具(像createuser) 的缺省连接使用,也作为新数据库的模板。这导致CREATE DATABASE 有时会失败,因为如果任何人连接了模板数据库,那么新的数据库就不能创建。 有了这个改变,缺省连接数据库现在是postgres, 意味着在CREATE DATABASE期间,极少可能有人正在使用template1

  • 通过移动/contrib/reindexdb到服务器, 创建新的reindexdb命令行工具 (Euler Taveira de Oliveira)

E.226.3.6. 数据类型和函数的变化

  • 为数组类型添加MAX()MIN()聚合 (Koju Iijima)

  • 修复CCYY字段都被使用了时,to_date()to_timestamp()合理的行为 (Karel Zak)

    如果格式声明包含CC并且年的声明是YYY或更长, 那么忽略CC。如果年的声明是YY或更短, 那么解释CC为上个世纪。

  • 添加md5(bytea) (Abhijit Menon-Sen)

    md5(text)早已存在了。

  • 添加对基于power(numeric, numeric)numeric ^ numeric的支持

    该函数早就存在了,但是没有分配操作符给他。

  • 通过正确的在计算时截断商,修复NUMERIC的模数 (Bruce)

    在以前的版本中,大值的模数有时会因为商的圆整返回负的结果。

  • 添加了一个函数lastval() (Dennis Björklund)

    lastval()currval()的一个简化版本。 它根据当前会话执行的最后一个nextval()setval() 调用,自动的确定正确的序列名。

  • 添加了to_timestamp(DOUBLE PRECISION) (Michael Glaesemann)

    转换自1970年以来的Unix秒到一个TIMESTAMP WITH TIMEZONE

  • 添加了pg_postmaster_start_time()函数 (Euler Taveira de Oliveira, Matthias Schmidt)

  • 允许在AT TIME ZONE中充分使用时区名字, 不只是以前可用的短列表 (Magnus)

    以前,AT TIME ZONE只支持时区名的一个预定义的列表。 现在任何支持的时区名都可以使用,例如:

    SELECT CURRENT_TIMESTAMP AT TIME ZONE 'Europe/London';

    在上面的查询中,使用的时区基于实际上影响提供的日期的夏令时规则调整。

  • 添加GREATEST()LEAST() variadic函数 (Pavel Stehule)

    这些函数接受可变数量的参数并返回这些参数的最大或最小值。

  • 添加了pg_column_size() (Mark Kirkwood)

    这返回一个字段的存储尺寸,可能是被压缩的。

  • 添加了regexp_replace() (Atsushi Ogawa)

    这允许正则表达式替换,像sed。一个可选的标识参数允许全局选择(替换所有) 和大小写敏感模式。

  • 修复间隔除法和乘法 (Bruce)

    以前的版本有时返回不正当的结果,像'4 months'::interval / 5 返回'1 mon -6 days'

  • 修复时间戳、时间和间隔输出中的舍入行为 (Tom)

    这修复了秒字段显示为60而不是增长高阶字段的一些情况。

  • 添加一个单独的天字段到类型interval, 这样一天的间隔可以不同于24小时的间隔 (Michael Glaesemann)

    包含夏令时调整的天不是24小时长,通常是23或25小时。这个修改创建了一个 这么多天的间隔和这么多小时的间隔之间概念上的不同。 添加1 day到一个时间戳现在给出和下一天相同的本地时间, 即使两天之间有一个夏令时调整,而添加24 hours 将给出一个不同的本地时间。例如,在US DST规则下:

    '2005-04-03 00:00:00-05' + '1 day' = '2005-04-04 00:00:00-04'
    '2005-04-03 00:00:00-05' + '24 hours' = '2005-04-04 01:00:00-04'
  • 添加了justify_days()justify_hours() (Michael Glaesemann)

    这些函数,分别的,调整天到一个合适数量的全月和日, 调整小时到一个合适数量的全天和小时。

  • 移动/contrib/dbsize到后端,并重命名一些函数 (Dave Page, Andreas Pflug)

    • pg_tablespace_size()

    • pg_database_size()

    • pg_relation_size()

    • pg_total_relation_size()

    • pg_size_pretty()

    pg_total_relation_size()包括索引和TOAST表。

  • 为访问集群目录的只读文件添加函数 (Dave Page, Andreas Pflug)

    • pg_stat_file()

    • pg_read_file()

    • pg_ls_dir()

  • 添加pg_reload_conf()强制配置文件的重载 (Dave Page, Andreas Pflug)

  • 添加pg_rotate_logfile()强制服务器日志文件的循环 (Dave Page, Andreas Pflug)

  • 修改pg_stat_*视图包含TOAST表 (Tom)

E.226.3.7. 编码和环境的变化

  • 重命名一些编码使其更加一致和遵守国际标准 (Bruce)

    • UNICODE现在是UTF8

    • ALT现在是WIN866

    • WIN现在是WIN1251

    • TCVN现在是WIN1258

    原先的名字仍然工作。

  • 添加对WIN1252编码的支持 (Roland Volkmann)

  • 添加对四字节UTF8字符的支持 (John Hansen)

    以前只支持一、二、三字节UTF8字符。这对于支持一些汉字字符设置尤其重要。

  • 允许EUC_JPSJIS之间的直接转换,以提高性能 (Atsushi Ogawa)

  • 允许UTF8编码在Windows上工作 (Magnus)

    这是通过映射UTF8到Windows本地的UTF16实现做到的。

E.226.3.8. 一般服务器端语言的变化

  • 修复ALTER LANGUAGE RENAME (Sergey Yatskevich)

  • 允许函数特征,像严格和活泼,通过ALTER FUNCTION来修改 (Neil)

  • 增加函数参数的最大数量到100 (Tom)

  • 允许SQL和PL/pgSQL函数使用OUTINOUT参数 (Tom)

    OUT是函数返回值的一个可替换的方式。取代使用RETURN, 可以通过分配参数声明为OUTINOUT来返回值。 这在一些情况下通常更简单,尤其是需要返回多个值时。 从一个函数中返回多个值在以前的版本中是可能的,这大大的简化了该过程。 (该特性在未来的版本中将扩展为其他服务器端语言。)

  • 移动语言处理器函数到pg_catalog模式

    如果要求,这使得它更容易删除公共模式。

  • 添加SPI_getnspname()到SPI (Neil)

E.226.3.9. PL/pgSQL服务器端语言的变化

  • 彻底检查PL/pgSQL函数的内存管理 (Neil)

    每个函数的分析树现在存储在一个单独的内存空间中。 当不再需要它时,这允许这个内存很容易的回收利用。

  • CREATE FUNCTION时检查函数语法,而不是在运行时 (Neil)

    以前,大多数语法错误只在该函数被执行时报告。

  • 允许OPEN打开非SELECT查询,像EXPLAINSHOW (Tom)

  • 不再要求函数发出RETURN语句 (Tom)

    这是新添加的OUTINOUT功能的副产品。 当不需要提供函数的返回值时,可以省略RETURN

  • 添加对可选INTO子句到PL/pgSQL的EXECUTE 语句的支持 (Pavel Stehule, Neil)

  • CREATE TABLE AS设置ROW_COUNT (Tom)

  • 定义SQLSTATESQLERRM返回当前异常的 SQLSTATE和错误消息 (Pavel Stehule, Neil)

    这些变量只在异常块中定义。

  • 允许到RAISE语句的参数为表达式 (Pavel Stehule, Neil)

  • 添加一个循环的CONTINUE语句 (Pavel Stehule, Neil)

  • 允许块和循环标签 (Pavel Stehule)

E.226.3.10. PL/Perl服务器端语言的变化

  • 允许大的结果集有效的返回 (Abhijit Menon-Sen)

    这允许函数使用return_next()来避免在内存中建立整个结果集。

  • 允许一次一行检索查询结果 (Abhijit Menon-Sen)

    这允许函数使用spi_query()spi_fetchrow() 避免在内存中累加整个结果集。

  • 如果服务器编码是UTF8,那么强制PL/Perl将字符串作为UTF8处理 (David Kamholz)

  • 为PL/Perl添加一个验证器函数 (Andrew)

    这允许语法错误在定义时被报告,而不是在执行时报告。

  • 当函数返回一个数组类型时,允许PL/Perl返回一个Perl数组 (Andrew)

    这主要是映射PostgreSQL数组到Perl数组。

  • 允许Perl非致命的警告产生NOTICE消息 (Andrew)

  • 允许启用Perl的strict模式 (Andrew)

E.226.3.11. psql的变化

  • 添加\set ON_ERROR_ROLLBACK以允许事务中的语句发生错误而不影响剩余的事务 (Greg Sabino Mullane)

    这基本上是通过包裹每个语句在一个子事务中实现的。

  • psql变量中添加对\x十六进制字符串的支持 (Bruce)

    八进制转义早就支持了。

  • 添加对troff -ms输出格式的支持 (Roger Leigh)

  • 允许历史文件位置通过HISTFILE控制 (Andreas Seltenreich)

    这允许存储每个数据库历史的配置。

  • 阻止\x(扩展模式)影响\d tablename的输出 (Neil)

  • 添加-L选项到psql以记录会话 (Lorne Sunley)

    添加这个选项是因为一些操作系统没有简单的命令行活动记录功能。

  • \d显示索引的表空间 (Qingqing Zhou)

  • 允许psql帮助(\h) 基于正确的帮助信息做一个更好的猜测 (Greg Sabino Mullane)

    这允许用户仅仅添加\h到语法错误查询的前面,获得支持的语法的帮助。 以前任何超出命令名的额外的查询文本都必须使用\h删除。

  • 添加\pset numericlocale以允许数字在识别环境的格式中输出 (Eugen Nedelcu)

    例如,使用C环境100000将被输出为100,000.0, 而欧洲环境可能输出这个值为100.000,0

  • 当服务器版本号和psql的版本号不同时,让启动标语显示两者 (Bruce)

    还有,如果服务器和psql来自不同的主版本,那么将会显示一个警告。

E.226.3.12. pg_dump的变化

  • 添加-n / --schema开关到pg_restore (Richard van den Berg)

    这允许只恢复指定模式中的对象。

  • 允许pg_dump转储大对象,即使是在文本模式中 (Tom)

    有了这个变化,大对象现在总是被转储了;前者-b开关是一个空操作。

  • 允许pg_dump转储大对象的一个一致的快照 (Tom)

  • 为大对象转储的评论 (Tom)

  • 添加--encodingpg_dump (Magnus Hagander)

    这允许数据库以一个不同于服务器编码的编码转储。 这在传递转储到一个有不同编码的机器时是有价值的。

  • 依赖pg_pltemplate过程语言 (Tom)

    如果过程语言的调用处理器在pg_catalog模式中,那么pg_dump 不转储该处理器。相反的,它使用 CREATE LANGUAGE name 转储该语言,依赖于pg_pltemplate目录提供语言的创建参数和加载时间。

E.226.3.13. libpq的变化

  • 添加一个PGPASSFILE环境变量指定口令文件的文件名 (Andrew)

  • 添加lo_create(),类似于lo_creat(), 但是允许指定大对象的OID (Tom)

  • libpqmalloc()失败时, 一致的返回一个错误到客户端应用 (Neil)

E.226.3.14. 源代码的变化

  • 修复pgxs,以支持重定位安装的建立

  • 为使用Intel编译器的Itanium处理器添加自旋锁支持 (Vikram Kalsi)

  • 为Windows添加Kerberos 5支持 (Magnus)

  • 添加了Chinese FAQ (laser@pgsqldb.com)

  • 重命名Rendezvous为Bonjour以匹配OS/X特性重命名 (Bruce)

  • 在macOS上添加对fsync_writethrough的支持 (Chris Campbell)

  • 流线化信息在服务器、优化器和锁系统中的路径 (Tom)

  • 允许pg_config使用MSVC编译 (Andrew)

    这在使用MSVC编译DBD::Pg时是需要的。

  • 删除对Kerberos V4的支持 (Magnus)

    Kerberos 4有安全缺陷并且不再维护了。

  • 代码清理(EnterpriseDB执行Coverity静态分析)

  • 修改postgresql.conf使用文档缺省on/off, 而不是true/false (Bruce)

  • 增强pg_config,能够报告更多的构建时的值 (Tom)

  • 允许libpq在Windows上的建立是线程安全的 (Dave Page)

  • 允许IPv6连接在Windows上使用 (Andrew)

  • 添加关于I/O子系统可靠性的服务器管理文档 (Bruce)

  • gist.h中移动私有的声明到gist_private.h (Neil)

    在以前的版本中,gist.h包含公共的GiST API (用来被GiST索引实现的作者使用)和一些被GiST本身的实现使用的私有声明。 后者已经被移动到一个独立的文件,gist_private.h。 大多数GiST索引实现应该是不受影响的。

  • 彻底检查GiST内存管理 (Neil)

    GiST方法现在总是在一个短期存活的内存空间中调用。因此,通过palloc() 的内存分配将被自动回收利用,所以GiST索引实现不需要通过pfree() 手动释放分配的内存。

E.226.3.15. 贡献版的变化

  • 添加了/contrib/pg_buffercache贡献版模板 (Mark Kirkwood)

    这显示了缓冲区缓存的内容,为了调试和性能调优的目的。

  • 删除了/contrib/array,因为它是废弃的 (Tom)

  • 清理/contrib/lo模块 (Tom)

  • 移动/contrib/findoidjoins/src/tools (Tom)

  • /contrib/cube中删除了<<>>&<&>操作符

    这些操作没什么用处。

  • 改善/contrib/btree_gist (Janko Richter)

  • 改善/contrib/pgbench (Tomoaki Sato, Tatsuo)

    现在有一个设施测试用户给出的SQL命令脚本,而不是只有一个硬线连接的命令序列。

  • 改善/contrib/pgcrypto (Marko Kreen)

    • OpenPGP对称秘钥和公共秘钥加密的实现

      RSA和Elgamal公共秘钥算法都支持。

    • 独立构建:包括SHA256/384/512 hashes, Fortuna PRNG

    • OpenSSL构建:支持3DES,使用内部的AES带有OpenSSL < 0.9.7

    • configure的结果中获取构建参数(OpenSSL, zlib)

      不再需要编辑Makefile

    • 删除对libmhashlibmcrypt的支持