summaryrefslogtreecommitdiff
path: root/doc/src/sgml/release-9.0.sgml
blob: a9e0b1f97b2d2fb91967a567c4d5e50bc9fadce9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
<!-- $PostgreSQL: pgsql/doc/src/sgml/release-9.0.sgml,v 2.1 2010/02/17 04:19:37 tgl Exp $ -->

<sect1 id="release-9-0">
  <title>Release 9.0alpha3</title>
  <sect2>
    <title>Overview</title>
    <para>
      PostgreSQL alpha releases are snapshots of development code. They
      are intended to preview and test upcoming features and to provide
      the possibility for early feedback. They should not be used in
      production installations or active development projects. While the
      PostgreSQL code is continuously subject to a number of automated
      and manual tests, alpha releases might have serious bugs. Also
      features may be changed incompatibly or removed at any time during
      the development cycle.
    </para>
    <para>
      The development cycle of a PostgreSQL major release alternates
      between periods of development and periods of integration work,
      called commit fests, normally one month each. Alpha releases are
      planned to be produced at the end of every commit fest, thus every
      two months. Since the first commit fest starts within a month from
      the beginning of development altogether, early alpha releases are
      not indicative of the likely feature set of the final release.
    </para>
    <para>
      The release notes below highlight user visible changes and new
      features. There are normally numerous bug fixes and performance
      improvements in every new snapshot of PostgreSQL, and it would be
      too bulky to attempt to list them all. Note that many bug fixes are
      also backported to stable releases of PostgreSQL, and you should be
      using those if you are looking for bug-fix-only upgrades for your
      current installations.
    </para>
    <para>
      The release notes are cumulative over all alpha releases.  Items
      that are new in the latest alpha release
      are <emphasis>emphasized</emphasis>.
    </para>
  </sect2>
  <sect2>
    <title>Migration</title>
    <para>
      To upgrade from any release to an alpha release or from an alpha
      release to any other release will most likely require a
      dump/restore upgrade procedure. It may happen that this is not
      necessary in particular cases, but that is not verified beforehand.
      (The server will warn you in any case when a dump/restore is
      necessary if you attempt to use it with an old data directory.)
      Note, however, that the dump/restore upgrade procedure is expected
      to work for alpha releases, and problems in this area should be
      reported.
    </para>
  </sect2>
  <sect2>
    <title>Testing</title>
    <para>
      The primary reason we release alphas is to get users to test new
      features as early as possible.  If you are interested in helping
      with organized testing, please see
      <ulink url="http://wiki.postgresql.org/wiki/HowToBetaTest">the
      testing information page</ulink>.
      </para>
  </sect2>
  <sect2>
    <title>Changes</title>
    <sect3>
      <title>SQL Features</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Remove previously deprecated configuration
         parameter add_missing_from. The system now always behaves as
         though add_missing_from were off.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Performance and behavioral improvements in UPDATE,
         DELETE, and SELECT FOR UPDATE/SHARE queries with joins.
         Fix various corner cases that could have resulted in duplicated output
         rows. Set-returning functions are now prohibited in the
         target list of SELECT FOR UPDATE/SHARE. FOR UPDATE does not
         propagate into a WITH query anymore.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Fix SELECT FOR UPDATE/SHARE in conjunction with LIMIT.
          Previously, it could return fewer rows than the limit specified.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add a WHEN clause to CREATE TRIGGER, allowing a boolean expression
          to be checked to determine whether the trigger should be fired.</emphasis>
        </para>
        <para>
         <emphasis>For BEFORE triggers this is mostly a matter of spec compliance; but
          for AFTER triggers it can provide a noticeable performance
          improvement, since queuing of a deferred trigger event and
          re-fetching of the row(s) at end of statement can be
          short-circuited if the trigger does not need to be fired.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add exclusion constraints, which generalize the concept of
          uniqueness to support any indexable commutative operator, not just
          equality. Two rows violate the exclusion constraint if
          &quot;row1.col OP row2.col&quot; is TRUE for each of the columns in
          the constraint.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Support ORDER BY within aggregate function calls, at long last
          providing a non-kluge method for controlling the order in which
          values are fed to an aggregate function. At the same time eliminate
          the old implementation restriction that DISTINCT was only supported
          for single-argument aggregates.</emphasis>
        </para>
        <para>
         <emphasis>Behavioral change: formerly, agg(DISTINCT x) dropped null values of
          x unconditionally. Now, it does so only if the aggregate's transition
          function is strict; otherwise nulls are treated as DISTINCT
          normally would, i.e., you get one copy.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Add SQL-compliant triggers on columns, which fire only if
         certain columns are named in the UPDATE's SET list.
        </para>
       </listitem>
       <listitem>
        <para>
         Add CREATE LIKE INCLUDING COMMENTS and STORAGE, and INCLUDING
         ALL shortcut to allow users to make an exact copy of a table including
         all options and features.
        </para>
       </listitem>
       <listitem>
        <para>
         Define a new, more extensible syntax for COPY options
         in order to support additional COPY options in the future.
        </para>
       </listitem>
       <listitem>
        <para>
         Modify the definition of window-function PARTITION
         BY and ORDER BY clauses so that their elements are always
         taken as simple expressions over the query's input
         columns. This fixes a bug.
        </para>
       </listitem>
       <listitem>
        <para>
         Fix bug with nested WITH RECURSIVE statements.
        </para>
       </listitem>
       <listitem>
        <para>
         Add surrogate pair support for U&amp; string and identifier
         syntax.
        </para>
       </listitem>
       <listitem>
        <para>
         Add Unicode escapes in E'...' strings.
        </para>
       </listitem>
        <listitem>
          <para>
            DROP COLUMN and DROP CONSTRAINT now support an IF EXISTS clause so
            that users can avoid fatal errors when running repeatable scripts.
          </para>
        </listitem>
        <listitem>
          <para>
            UNIQUE constraints can now be DEFERRABLE. This is primarily useful
            for incremental updates of numerical keys, e.g. &quot;ID = ID +
            1&quot;
          </para>
        </listitem>
        <listitem>
          <para>
            Allow parentheses around the query expression that follows a WITH
            clause.
          </para>
        </listitem>
        <listitem>
          <para>
            INFORMATION_SCHEMA, a catalog of standard views of database
            objects, has been updated to the SQL:2008 standard.
          </para>
        </listitem>
        <listitem>
          <para>
            Change character_octet_length to more sensible values in
            INFORMATION_SCHEMA.
          </para>
        </listitem>
        <listitem>
          <para>
            Allow * as parameter for FORCE QUOTE for COPY CSV, so that all
            columns will be quoted.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Performance</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Allow rewriting forms of ALTER TABLE to skip WAL
          logging.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Speed up INFORMATION_SCHEMA's privilege views.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Make TRUNCATE do truncate-in-place when processing
         a relation that was created or previously truncated in the
         current (sub)transaction.
        </para>
       </listitem>
       <listitem>
        <para>
         Implement &quot;join removal&quot; for cases where the inner side
          of a left join is unique and is not referenced above the join.  This should
          speed up many ORM-generated and reporting tool queries.
        </para>
       </listitem>
       <listitem>
        <para>
         Remove the use of the flat files pg_auth and
         pg_database in order to improve performance. (Warning: pgbouncer
         and possibly other tools currently suggest referring to the pg_auth
         file for its user database. Such schemes will no longer work.)
        </para>
       </listitem>
        <listitem>
          <para>
            EXPLAIN allows output of plans in XML, JSON, or YAML format for automated
            processing of explain plans by analysis or visualization tools.
          </para>
        </listitem>
        <listitem>
          <para>
            EXPLAIN now supports the use of generic options in EXPLAIN ( option
            value, ... ) format, which permits the creation of additional
            EXPLAIN options.
          </para>
        </listitem>
        <listitem>
          <para>
            ALTER TABLE ... ALTER COLUMN ... SET STATISTICS DISTINCT allows
            users to manually tweak the number of distinct values estimated for
            a column, to fix cases where ANALYZE estimates are incorrect.
          </para>
        </listitem>
        <listitem>
          <para>
            Make GEQO's planning deterministic by having it start from a
            predictable random number seed each time.
          </para>
        </listitem>
        <listitem>
          <para>
            Rewrite GEQO's gimme_tree function so that it always finds a legal
            join sequence. Previously, it could have failed to produce a plan
            in some cases.
          </para>
        </listitem>
        <listitem>
          <para>
            Tweak TOAST code so that columns marked with MAIN storage strategy
            are not forced out-of-line unless that is necessary to make the row
            fit on a page. Previously, they were forced out-of-line if needed
            to get the row down to the default target size (1/4th page).
          </para>
        </listitem>
        <listitem>
          <para>
            Simplify the forms foo &lt;&gt; true and foo &lt;&gt; false to foo
            = false and foo = true during query optimization.
          </para>
        </listitem>
        <listitem>
          <para>
            Avoid per-send() system calls to manage SIGPIPE in libpq, if the
            platform provides either sockopt(SO_NOSIGPIPE) or the MSG_NOSIGNAL
            flag to send().
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Administration and Monitoring</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Allow read-only connections during recovery, also
         known as Hot Standby.  This provides a built-in master-slave
         replication solution.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Provide a parenthesized-options syntax for VACUUM, analogous to
          that recently adopted for EXPLAIN. This will allow additional
          options to be implemented in future without having to make them
          fully-reserved keywords. The old syntax remains available for
          existing options, however.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add support for an application_name parameter, which is displayed
          in pg_stat_activity and recorded in log entries.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Fix longstanding problems in VACUUM caused by untimely
          interruptions.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add YAML to list of EXPLAIN formats.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add an EXPLAIN (BUFFERS) option to show buffer-usage statistics.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add a hook to let loadable modules get control at ProcessUtility
          execution, and use it to extend contrib/pg_stat_statements to track
          utility commands.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Add a Boolean server configuration parameter
         &quot;bonjour&quot; to control whether a Bonjour-enabled
         build actually attempts to advertise itself via Bonjour.
        </para>
       </listitem>
       <listitem>
        <para>
         When reloading postgresql.conf, log what parameters actually
         changed.
        </para>
       </listitem>
       <listitem>
        <para>
         Make it possibly to specify server configuration parameters
         per user-database combination. Add a \drds command to psql to
         display the settings.
        </para>
       </listitem>
       <listitem>
        <para>
         Allow the collection of statistics on sequences.
        </para>
       </listitem>
      <listitem>
       <para>
        Increase the maximum value of extra_float_digits to
        3, and have pg_dump use that value when the backend is new
        enough to allow it, because it is possible to need 3 extra
        digits for float4 values (but not for float8 values).
       </para>
      </listitem>
        <listitem>
          <para>
            Add the ability to include the SQLSTATE error code of any error
            messages in the PostgreSQL activity log with the new
            log_line_prefix placeholder %e.
          </para>
        </listitem>
        <listitem>
          <para>
            Show the exact value being complained of in
            unique-constraint-violation error messages, including unique-index
            build failures.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Security</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>When querying a table with child tables, do not check permissions
          on the child tables, only on the parent table. The old behavior was
          found to be useless and confusing in virtually all cases, and also
          contrary to the SQL standard.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add a hook to CREATE/ALTER ROLE to allow an external module to
          check the strength of database passwords, and create a sample
          implementation of such a hook as a new contrib module
          &quot;passwordcheck&quot;.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add large object access control.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Allow LDAP authentication to operate in search+bind
         mode, meaning it does a search for the user in the directory
         first, and then binds with the DN found for this user.  This
         allows for LDAP logins in scenarios where the DN of the user
         cannot be determined simply by prefix and suffix, such as the
         case where different users are located in different
         containers.  The old way of authentication can be
         significantly faster, so it's kept as an option.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Add ALTER DEFAULT PRIVILEGES command, which allows
         users to adjust the privileges that will be applied to
         subsequently-created objects.
        </para>
       </listitem>
       <listitem>
        <para>
         Add GRANT/REVOKE ON ALL TABLES/SEQUENCES/FUNCTIONS IN SCHEMA.
         This makes it easier to manage permissions on database objects.
        </para>
       </listitem>
       <listitem>
        <para>
         Support &quot;samehost&quot; and &quot;samenet&quot; specifications
         in pg_hba.conf.  This allows users with dynamic server addresses to run
         PostgreSQL without frequently modifying pg_hba.conf.
        </para>
       </listitem>
        <listitem>
          <para>
            New has_sequence_privilege() functions allow you to check sequence
            privileges for a given ROLE.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Built-In Functions</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Remove configuration parameter regex_flavor. It is now always
          &quot;advanced&quot;.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Teach the regular expression functions to do case-insensitive
          matching and locale-dependent character classification properly
          when the database encoding is UTF8. This previously only worked
          correctly for single-byte encodings.  It is still broken for other
          multibyte encodings.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Support POSIX-compatible interpretation of ? as well as {m,n}
         and related constructs in SIMILAR TO, per SQL:2008.
        </para>
       </listitem>
        <listitem>
          <para>
            The to_char() formatting functions now supports EEEE (scientific
            notation).
          </para>
        </listitem>
        <listitem>
          <para>
            Use floor() not rint() when reducing precision of fractional
            seconds in timestamp_trunc, timestamptz_trunc, and interval_trunc()
            for the float-datetime case. This improves accuracy of time
            calculations.
          </para>
        </listitem>
        <listitem>
          <para>
            Fix ancient bug in handling of to_char() modifier 'TH', when used
            with HH.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Data Types</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>When doing &quot;ARRAY[...]::domain&quot;, where domain is a domain
          over an array type, we need to check domain constraints. Regression
          introduced in 8.4.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Fix integer-to-bit-string conversions to handle the first
          fractional byte correctly when the output bit width is wider than
          the given integer by something other than a multiple of 8 bits.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Fix encoding handling in binary input function of xml type.
        </para>
       </listitem>
       <listitem>
        <para>
         Tighten binary receive functions so that they reject values
         that the text input functions don't accept either.
        </para>
       </listitem>
        <listitem>
          <para>
            New hex-string input and output format options for type bytea. Hex
            output format is enabled by default, which is an incompatible
            change. See the new bytea_output parameter if you need to restore
            compatibility.
          </para>
        </listitem>
        <listitem>
          <para>
            Adds prefix support for text search synonym dictionary, allowing
            creation of synonyms on partial matches.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Server Tools</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>initdb now selects the encoding SQL_ASCII when the locale specifies
          US-ASCII. This case previously failed.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add init[db] option to pg_ctl.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         It is now reasonably safe to use pg_ctl to start
         the postmaster from a boot-time script.
        </para>
       </listitem>
       <listitem>
          <para>
            pg_dump/pg_restore --clean now drops large objects.
          </para>
        </listitem>
        <listitem>
          <para>
            Modify parallel pg_restore ordering logic to avoid a potential
            O(N^2) slowdown for some complex databases.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>libpq</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Throw error when a specified connection service name is not
          found in pg_service.conf, instead of ignoring it.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Make libpq reject non-numeric and out-of-range port numbers with a
         suitable error message.
        </para>
       </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>psql</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>In psql, show view definition only with \d+, not with \d.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>In psql, ignore UTF-8-encoded Unicode byte-order mark at the
          beginning of a file if the client encoding is UTF-8.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Improve psql's tabular display of wrapped-around data by inserting
          markers in the formerly-always-blank columns just to left and right
          of the data. &quot;pset linestyle old-ascii&quot; is added to make
          the previous behavior available if anyone really wants it.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Simplify psql's new linestyle behavior to default to
          linestyle=ascii all the time, rather than hoping we can tell
          whether the terminal supports UTF-8 characters.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Implement significantly saner behavior when two or
         more psql sessions overlap in their use of the history file.
        </para>
       </listitem>
       <listitem>
        <para>
         Add &quot;pset linestyle ascii/unicode&quot; option to psql,
         allowing our traditional ASCII-art style of table output to
         be upgraded to use Unicode box drawing characters if
         desired.
        </para>
       </listitem>
        <listitem>
          <para>
            Have \d show child tables that inherit from the specified parent
          </para>
        </listitem>
        <listitem>
          <para>
            psql now shows the index methods in \di
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Procedural Languages</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>PL/pgSQL is installed by default.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Remove PL/pgSQL's RENAME declaration, which has
          bizarre and mostly nonfunctional behavior, and is so little
          used that no one has been interested in fixing it. To ensure
          that possible uses are covered, remove the ALIAS declaration's
          arbitrary restriction that only $n identifiers can be
          aliased.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>The PL/pgSQL parser and scanner were reworked to behave much more
          sanely:</emphasis>
        </para>
        <para>
         <emphasis>A variable reference will only be recognized where it can validly
          go, ie, a place where a column value or parameter would be legal,
          instead of the former behavior that would replace any textual match
          including table names and column aliases (leading to syntax errors
          later on).</emphasis>
        </para>
        <para>
         <emphasis>When a name could refer either to a PL/pgSQL variable or a
          table column, PL/pgSQL formerly always assumed the variable was
          meant, sometimes resulting in surprising behavior.  Now, PL/pgSQL
          can assume the variable is meant, or assume the table column is
          meant, or throw an error in ambiguous cases.  For safety the default
          is to throw error.  To configure this see <link
          linkend="plpgsql-var-subst">the PL/pgSQL documentation</link>.</emphasis>
        </para>
        <para>
         <emphasis>Error reporting is much nicer: it no longer shows edited
          versions of statements that look significantly different from what
          you wrote.</emphasis>
        </para>
        <para>
         <emphasis>Note that this change affects the set of keywords that are
          reserved in PL/pgSQL (i.e., cannot be the name of a PL/pgSQL
          variable).  Now, all keywords shown as reserved in <link
          linkend="sql-keywords-appendix">Appendix C</link> are reserved for
          PL/pgSQL purposes as well.  However, many PL/pgSQL-only keywords
          that were formerly treated as reserved no longer are.  As in regular
          SQL, you can double-quote a variable's name if you want to use a
          name that conflicts with a reserved keyword.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add support for anonymous code blocks (DO blocks) to PL/Perl.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Support arrays as parameters and return values of PL/Python
          functions.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add Python 3 support to PL/Python.  It behaves more or less
          unchanged compared to Python 2, but the new language variant is
          called plpython3u.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Add DO statement to support execution of procedural language
         code without having to create a function for it.
        </para>
       </listitem>
       <listitem>
        <para>
         Support use of function argument names to identify which
         actual arguments match which function parameters. The syntax
         uses AS, for example funcname(value AS arg1, anothervalue AS
         arg2).
        </para>
       </listitem>
       <listitem>
        <para>
         Fix/improve bytea and boolean support in PL/Python. Data type
         conversion into and out of PL/Python previously went through
         an intermediate string representation, which caused various
         discrepancies especially with bytea and boolean data. This is
         now fixed by converting the values directly.
        </para>
       </listitem>
       <listitem>
        <para>
         PL/Python now accepts Unicode objects where it previously
         only accepted string objects (for example, as return
         value). Unicode objects are converted to the PostgreSQL
         server encoding as necessary.
        </para>
       </listitem>
       <listitem>
        <para>
         Improve error context reporting in PL/Perl, for
         easier debugging.
        </para>
       </listitem>
       <listitem>
        <para>
         PL/pgSQL IN parameters now accept value assignments.
        </para>
       </listitem>
       <listitem>
        <para>
         Convert a Perl array to a PostgreSQL array when returned by
         set-returning functions as well as non-SRFs.
        </para>
       </listitem>
       <listitem>
        <para>
         Allow cursor commands MOVE FORWARD n, MOVE BACKWARD n,
         MOVE FORWARD ALL, MOVE BACKWARD ALL in PL/pgSQL.
        </para>
       </listitem>
        <listitem>
          <para>
            PL/pgSQL functions can now better cope with row types
            containing dropped columns.
          </para>
        </listitem>
        <listitem>
          <para>
            Improve error context reporting in PL/Python, for easier
            debugging.
          </para>
        </listitem>
        <listitem>
          <para>
            Greatly expand the regression testing for PL/Python.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Additional Supplied Modules</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Add \shell and \setshell meta commands to pgbench.</emphasis>
        </para>
        <para>
         <emphasis>\shell runs an external shell command. \setshell
          does the same and assigns the result to a variable.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Multiple improvements in contrib/hstore, including
         raising limits on keys and values, conversions to and from
         records and arrays, and support for GROUP BY and DISTINCT.
        </para>
       </listitem>
        <listitem>
          <para>
            pgbench is now multi-threaded, allowing it to use multiple CPU's
            for its client connections, and to do more realistic workload
            testing.
          </para>
        </listitem>
        <listitem>
          <para>
            Added the ability to retrieve asynchronous notifications using
            dblink, via the addition of the function dblink_get_notify().
          </para>
        </listitem>
        <listitem>
          <para>
            Added matchorig, matchsynonyms, and keepsynonyms options to
            contrib/dict_xsyn.
          </para>
        </listitem>
        <listitem>
          <para>
            Added contrib/unaccent.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>ecpg</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Refactor ECPG grammar so that it uses the core grammar's
          unreserved_keyword list, minus a few specific words that have to be
          treated specially. This de-reserves a number of words in ECPG.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Added dynamic cursor names to ECPG.</emphasis>
        </para>
       </listitem>
      <listitem>
       <para>
        Add ECPG function that returns the current transaction status.
       </para>
      </listitem>
      <listitem>
       <para>
        Make ECPG more robust against applications freeing strings.
       </para>
      </listitem>
        <listitem>
          <para>
            ECPG now includes a STRING datatype for Informix compatibility
            mode.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Ports</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Disable triggering failover with a signal in pg_standby on Windows.
          It never really worked before anyway.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Change the WIN32 API version to be 5.01 (Windows XP), to
         bring in the proper IPv6 headers in newer SDKs.
        </para>
       </listitem>
       <listitem>
        <para>
         Write to the Windows eventlog in UTF-16, converting the
         message encoding as necessary.
        </para>
       </listitem>
       <listitem>
        <para>
         Replace use of the long-deprecated Bonjour API
         DNSServiceRegistrationCreate with the not-so-deprecated
         DNSServiceRegister. The new code will fail on Mac OS X
         releases before 10.3.
        </para>
       </listitem>
       <listitem>
          <para>
            Reserve the shared memory region during backend startup on Windows,
            so that memory allocated by starting third party DLLs doesn't end
            up conflicting with it. Hopefully this solves the long-time issue
            with &quot;could not reattach to shared memory&quot; errors on
            Win32.
          </para>
        </listitem>
        <listitem>
          <para>
            Add s_lock support for SuperH architecture (not well tested).
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Source Code, Build Options</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>configure --enable-thread-safety is now the default (but can still
          be turned off).</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Fix inclusions of readline/editline header files so that we
         only attempt to #include the version of history.h that is in
         the same directory as the readline.h we are using. This
         avoids problems in some scenarios where both readline and
         editline are installed.
        </para>
       </listitem>
       <listitem>
        <para>
         Derived files that are shipped in the distribution used to be
         built in the source directory even for out-of-tree
         builds. They are now built in the build tree. This
         should be more convenient for certain developers' workflows.
        </para>
       </listitem>
        <listitem>
          <para>
            Functions which conflict with C++ reserved words have been renamed,
            making backend header files now safe to use with C++ libraries.
          </para>
        </listitem>
        <listitem>
          <para>
            Add man pages for SPI functions.
          </para>
        </listitem>
        <listitem>
          <para>
            Upgrade to Autoconf 2.63 (not relevant to users of distribution
            tarballs).
          </para>
        </listitem>
        <listitem>
          <para>
            Minimum version of Flex is now 2.5.31, to support reentrant
            scanners (not relevant to users of distribution tarballs).
          </para>
        </listitem>
        <listitem>
          <para>
            Documentation build rules have been improved. The generated
            documentation files are now shipped &quot;loose&quot;, not in
            sub-tarballs.
          </para>
        </listitem>
        <listitem>
          <para>
            New toolchain to generate man pages. From now on, the man pages
            will be current in every release.
          </para>
        </listitem>
        <listitem>
          <para>
            Code-coverage testing support now extends to the entire source
            tree, not only src/backend/.
          </para>
        </listitem>
        <listitem>
          <para>
            Make the core scanner re-entrant, along with additional fixes that
            will let it be used directly by PL/pgSQL.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
  </sect2>
</sect1>