Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
3012061b
Commit
3012061b
authored
Sep 15, 2017
by
Peter Eisentraut
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Apply pg_get_serial_sequence() to identity column sequences as well
Bug: #14813
parent
f0e60ee4
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
44 additions
and
20 deletions
+44
-20
doc/src/sgml/func.sgml
doc/src/sgml/func.sgml
+22
-15
src/backend/utils/adt/ruleutils.c
src/backend/utils/adt/ruleutils.c
+6
-5
src/test/regress/expected/identity.out
src/test/regress/expected/identity.out
+6
-0
src/test/regress/expected/sequence.out
src/test/regress/expected/sequence.out
+6
-0
src/test/regress/sql/identity.sql
src/test/regress/sql/identity.sql
+2
-0
src/test/regress/sql/sequence.sql
src/test/regress/sql/sequence.sql
+2
-0
No files found.
doc/src/sgml/func.sgml
View file @
3012061b
...
...
@@ -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>
...
...
src/backend/utils/adt/ruleutils.c
View file @
3012061b
...
...
@@ -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 a
n 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
;
...
...
src/test/regress/expected/identity.out
View file @
3012061b
...
...
@@ -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
...
...
src/test/regress/expected/sequence.out
View file @
3012061b
...
...
@@ -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);
...
...
src/test/regress/sql/identity.sql
View file @
3012061b
...
...
@@ -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
;
...
...
src/test/regress/sql/sequence.sql
View file @
3012061b
...
...
@@ -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
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment