]> granicus.if.org Git - postgresql/commitdiff
Update release notes to show how to upgrade a database to use the new
authorBruce Momjian <bruce@momjian.us>
Mon, 3 Oct 2005 01:57:59 +0000 (01:57 +0000)
committerBruce Momjian <bruce@momjian.us>
Mon, 3 Oct 2005 01:57:59 +0000 (01:57 +0000)
early binding for nextval() calls in default clauses.

doc/src/sgml/release.sgml

index 37d67a94797f1eb667c39a67f5d3df1b11e53428..ecd846376ee2cfd7bb5d73bca0b2d88cbe474065 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/release.sgml,v 1.381 2005/10/02 23:50:06 tgl Exp $
+$PostgreSQL: pgsql/doc/src/sgml/release.sgml,v 1.382 2005/10/03 01:57:59 momjian Exp $
 
 Typical markup:
 
@@ -262,6 +262,21 @@ pg_[A-Za-z0-9_]                 <application>
 
     <itemizedlist>
 
+     <listitem>
+      <para>
+       <varname>Add proper sequence function dependencies (Tom)
+      </para>
+      <para>
+       In previous releases, <function>nextval()</>,
+       <function>currval</>, and <function>setval()</> recorded
+       sequence names as simple text strings, meaning that renaming or
+       dropping a sequence used in a <command>DEFAULT</> made the
+       clause invalid. This release stores all newly-created sequence
+       function arguments using internal oids, allowing them to handle
+       sequence renaming, and adding dependency information that
+      </para>
+     </listitem>
+
      <listitem>
       <para>
        <varname>add_missing_from</> is now false by default (Neil)
@@ -398,16 +413,53 @@ pg_[A-Za-z0-9_]                 <application>
       </para>
       <para>
        When an expression like <literal>nextval('myseq')</> appears in a
-       column default expression or view, the referenced sequence (here
-       <literal>myseq</>) is now looked up immediately, and its pg_class
-       OID is placed in the stored expression.  This representation will
-       survive renaming of the referenced sequence, as well as changes in
-       schema search paths.  The system also understands that the sequence
-       reference represents a dependency, so the sequence cannot be dropped
-       without dropping the referencing object.  To get the old behavior of
-       run-time lookup of the sequence by name, cast the argument to
-       <type>text</>, for example <literal>nextval('myseq'::text)</>.
+       column <command>DEFAULT</> expression or view, the referenced
+       sequence (here <literal>myseq</>) is now looked up immediately,
+       and its pg_class OID is placed in the stored expression. This
+       representation will survive renaming of the referenced sequence,
+       as well as changes in schema search paths. The system also
+       understands that the sequence reference represents a dependency,
+       so the sequence cannot be dropped without dropping the
+       referencing object. Previous releases stored this information as
+       a simple text string, with none of the benefits outlined above.
+       To get the old text-based behavior of run-time lookup of the
+       sequence name, cast the argument to <type>text</>, for example
+       <literal>nextval('myseq'::text)</>.
       </para>
+      <para>
+       Pre-8.1 schemas loaded into 8.1 will use the previous, text-based
+       representation and therefore will not have these protections.
+       However, it is possible to upgrade a database to the newer
+       OID-based arguments. First, save this query into a file, such as
+       <filename>fixseq.sql</>:
+<programlisting>
+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, '(nextval\\(''[^'']*'')::text', '\\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 ~ '.*nextval\\(''[^'']*''::text';
+</programlisting>
+       Next, run the query against a database to find what
+       adjustments are required, like this for database <literal>db1</>:
+<programlisting>
+psql -aT -f fixseq.sql db1
+</programlisting>
+       This will show the <command>ALTER TABLE</> commands needed to
+       convert the database to the newer OID-based representation.
+       Finally, run this to update the database:
+<programlisting>
+psql -aT -f fixseq.sql db1 | psql -e db1
+</programlisting>
+       This process should be done for each database loaded with pre-8.1
+       schemas.
      </listitem>
 
      <listitem>