]> granicus.if.org Git - postgresql/commitdiff
Apply pg_get_serial_sequence() to identity column sequences as well
authorPeter Eisentraut <peter_e@gmx.net>
Fri, 15 Sep 2017 18:04:51 +0000 (14:04 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Fri, 15 Sep 2017 18:21:20 +0000 (14:21 -0400)
Bug: #14813

doc/src/sgml/func.sgml
src/backend/utils/adt/ruleutils.c
src/test/regress/expected/identity.out
src/test/regress/expected/sequence.out
src/test/regress/sql/identity.sql
src/test/regress/sql/sequence.sql

index 641b3b8f4e4cc6d9009d71a2df922e08919200d8..2f036015cc240dc00eaba4a86fb3ec805c22db09 100644 (file)
@@ -17034,8 +17034,7 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
       <row>
        <entry><literal><function>pg_get_serial_sequence(<parameter>table_name</parameter>, <parameter>column_name</parameter>)</function></literal></entry>
        <entry><type>text</type></entry>
-       <entry>get name of the sequence that a <type>serial</type>, <type>smallserial</type> or <type>bigserial</type> column
-       uses</entry>
+       <entry>get name of the sequence that a serial or identity column uses</entry>
       </row>
       <row>
        <entry><literal><function>pg_get_statisticsobjdef(<parameter>statobj_oid</parameter>)</function></literal></entry>
@@ -17223,19 +17222,27 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
   <para>
    <function>pg_get_serial_sequence</function> returns the name of the
    sequence associated with a column, or NULL if no sequence is associated
-   with the column.  The first input parameter is a table name with
-   optional schema, and the second parameter is a column name.  Because
-   the first parameter is potentially a schema and table, it is not treated
-   as a double-quoted identifier, meaning it is lower cased by default,
-   while the second parameter, being just a column name, is treated as
-   double-quoted and has its case preserved.  The function returns a value
-   suitably formatted for passing to sequence functions (see <xref
-   linkend="functions-sequence">).  This association can be modified or
-   removed with <command>ALTER SEQUENCE OWNED BY</>.  (The function
-   probably should have been called
-   <function>pg_get_owned_sequence</function>; its current name reflects the fact
-   that it's typically used with <type>serial</> or <type>bigserial</>
-   columns.)
+   with the column.  If the column is an identity column, the associated
+   sequence is the sequence internally created for the identity column.  For
+   columns created using one of the serial types
+   (<type>serial</type>, <type>smallserial</type>, <type>bigserial</type>), it
+   is the sequence created for that serial column definition.  In the latter
+   case, this association can be modified or removed with <command>ALTER
+   SEQUENCE OWNED BY</>.  (The function probably should have been called
+   <function>pg_get_owned_sequence</function>; its current name reflects the
+   fact that it has typically been used with <type>serial</>
+   or <type>bigserial</> columns.)  The first input parameter is a table name
+   with optional schema, and the second parameter is a column name.  Because
+   the first parameter is potentially a schema and table, it is not treated as
+   a double-quoted identifier, meaning it is lower cased by default, while the
+   second parameter, being just a column name, is treated as double-quoted and
+   has its case preserved.  The function returns a value suitably formatted
+   for passing to sequence functions
+   (see <xref linkend="functions-sequence">).  A typical use is in reading the
+   current value of a sequence for an identity or serial column, for example:
+<programlisting>
+SELECT currval(pg_get_serial_sequence('sometable', 'id'));
+</programlisting>
   </para>
 
   <para>
index 0ea50782181e9cfa44188178c062cb954133e9d4..84759b6149e33292647206e32c963a5c3c44b7b7 100644 (file)
@@ -2322,7 +2322,7 @@ pg_get_userbyid(PG_FUNCTION_ARGS)
 
 /*
  * pg_get_serial_sequence
- *             Get the name of the sequence used by a serial column,
+ *             Get the name of the sequence used by an identity or serial column,
  *             formatted suitably for passing to setval, nextval or currval.
  *             First parameter is not treated as double-quoted, second parameter
  *             is --- see documentation for reason.
@@ -2380,13 +2380,14 @@ pg_get_serial_sequence(PG_FUNCTION_ARGS)
                Form_pg_depend deprec = (Form_pg_depend) GETSTRUCT(tup);
 
                /*
-                * We assume any auto dependency of a sequence on a column must be
-                * what we are looking for.  (We need the relkind test because indexes
-                * can also have auto dependencies on columns.)
+                * Look for an auto dependency (serial column) or internal dependency
+                * (identity column) of a sequence on a column.  (We need the relkind
+                * test because indexes can also have auto dependencies on columns.)
                 */
                if (deprec->classid == RelationRelationId &&
                        deprec->objsubid == 0 &&
-                       deprec->deptype == DEPENDENCY_AUTO &&
+                       (deprec->deptype == DEPENDENCY_AUTO ||
+                        deprec->deptype == DEPENDENCY_INTERNAL) &&
                        get_rel_relkind(deprec->objid) == RELKIND_SEQUENCE)
                {
                        sequenceId = deprec->objid;
index 88b56dad93b148736b2d9f8fcc0d686765200881..2800ed7caabc3ecf821ec75066cea5482b26b0d3 100644 (file)
@@ -26,6 +26,12 @@ SELECT sequence_name FROM information_schema.sequences WHERE sequence_name LIKE
 ---------------
 (0 rows)
 
+SELECT pg_get_serial_sequence('itest1', 'a');
+ pg_get_serial_sequence 
+------------------------
+ public.itest1_a_seq
+(1 row)
+
 CREATE TABLE itest4 (a int, b text);
 ALTER TABLE itest4 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY;  -- error, requires NOT NULL
 ERROR:  column "a" of relation "itest4" must be declared NOT NULL before identity can be added
index a43b52cfc1e6548a59b6e3cde01369102ac24c5e..ea05a3382b8766a90ca155128bfc5f005b0c8075 100644 (file)
@@ -79,6 +79,12 @@ SELECT * FROM serialTest1;
  force | 100
 (3 rows)
 
+SELECT pg_get_serial_sequence('serialTest1', 'f2');
+  pg_get_serial_sequence   
+---------------------------
+ public.serialtest1_f2_seq
+(1 row)
+
 -- test smallserial / bigserial
 CREATE TABLE serialTest2 (f1 text, f2 serial, f3 smallserial, f4 serial2,
   f5 bigserial, f6 serial8);
index a7e7b157371885714c24398cd723237493a4b62f..7886456a56974fab1173d4914966c22b88342651 100644 (file)
@@ -12,6 +12,8 @@ SELECT table_name, column_name, column_default, is_nullable, is_identity, identi
 -- internal sequences should not be shown here
 SELECT sequence_name FROM information_schema.sequences WHERE sequence_name LIKE 'itest%';
 
+SELECT pg_get_serial_sequence('itest1', 'a');
+
 CREATE TABLE itest4 (a int, b text);
 ALTER TABLE itest4 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY;  -- error, requires NOT NULL
 ALTER TABLE itest4 ALTER COLUMN a SET NOT NULL;
index b41c5a753dc3d0bdc5374940e3330ff82658a962..c50834a5b97e61f3f2246b5029769078aa12368c 100644 (file)
@@ -61,6 +61,8 @@ INSERT INTO serialTest1 VALUES ('wrong', NULL);
 
 SELECT * FROM serialTest1;
 
+SELECT pg_get_serial_sequence('serialTest1', 'f2');
+
 -- test smallserial / bigserial
 CREATE TABLE serialTest2 (f1 text, f2 serial, f3 smallserial, f4 serial2,
   f5 bigserial, f6 serial8);