mirror of
https://github.com/postgres/postgres.git
synced 2025-10-22 14:32:25 +03:00
Fix determination of not-null constraint "locality" for inherited columns
It is possible to have a non-inherited not-null constraint on an
inherited column, but we were failing to preserve such constraints
during pg_upgrade where the source is 17 or older, because of a bug in
the pg_dump query for it. Oversight in commit 14e87ffa5c
. Fix that
query. In passing, touch-up a bogus nearby comment introduced by the
same commit.
In version 17, make the regression tests leave a table in this
situation, so that this scenario is tested in the cross-version upgrade
tests of 18 and up.
Author: Dilip Kumar <dilipbalaut@gmail.com>
Reported-by: Andrew Bille <andrewbille@gmail.com>
Bug: #19074
Backpatch-through: 18
Discussion: https://postgr.es/m/19074-ae2548458cf0195c@postgresql.org
This commit is contained in:
@@ -9351,8 +9351,7 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
|
|||||||
*
|
*
|
||||||
* We track in notnull_islocal whether the constraint was defined directly
|
* We track in notnull_islocal whether the constraint was defined directly
|
||||||
* in this table or via an ancestor, for binary upgrade. flagInhAttrs
|
* in this table or via an ancestor, for binary upgrade. flagInhAttrs
|
||||||
* might modify this later; that routine is also in charge of determining
|
* might modify this later.
|
||||||
* the correct inhcount.
|
|
||||||
*/
|
*/
|
||||||
if (fout->remoteVersion >= 180000)
|
if (fout->remoteVersion >= 180000)
|
||||||
appendPQExpBufferStr(q,
|
appendPQExpBufferStr(q,
|
||||||
@@ -9369,7 +9368,10 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
|
|||||||
"NULL AS notnull_comment,\n"
|
"NULL AS notnull_comment,\n"
|
||||||
"NULL AS notnull_invalidoid,\n"
|
"NULL AS notnull_invalidoid,\n"
|
||||||
"false AS notnull_noinherit,\n"
|
"false AS notnull_noinherit,\n"
|
||||||
"a.attislocal AS notnull_islocal,\n");
|
"CASE WHEN a.attislocal THEN true\n"
|
||||||
|
" WHEN a.attnotnull AND NOT a.attislocal THEN true\n"
|
||||||
|
" ELSE false\n"
|
||||||
|
"END AS notnull_islocal,\n");
|
||||||
|
|
||||||
if (fout->remoteVersion >= 140000)
|
if (fout->remoteVersion >= 140000)
|
||||||
appendPQExpBufferStr(q,
|
appendPQExpBufferStr(q,
|
||||||
|
@@ -1705,3 +1705,7 @@ DROP ROLE regress_constraint_comments_noaccess;
|
|||||||
CREATE DOMAIN constraint_comments_dom AS int;
|
CREATE DOMAIN constraint_comments_dom AS int;
|
||||||
ALTER DOMAIN constraint_comments_dom ADD CONSTRAINT inv_ck CHECK (value > 0) NOT VALID;
|
ALTER DOMAIN constraint_comments_dom ADD CONSTRAINT inv_ck CHECK (value > 0) NOT VALID;
|
||||||
COMMENT ON CONSTRAINT inv_ck ON DOMAIN constraint_comments_dom IS 'comment on invalid constraint';
|
COMMENT ON CONSTRAINT inv_ck ON DOMAIN constraint_comments_dom IS 'comment on invalid constraint';
|
||||||
|
-- Create a table that exercises pg_upgrade
|
||||||
|
CREATE TABLE regress_notnull1 (a integer);
|
||||||
|
CREATE TABLE regress_notnull2 () INHERITS (regress_notnull1);
|
||||||
|
ALTER TABLE ONLY regress_notnull2 ALTER COLUMN a SET NOT NULL;
|
||||||
|
@@ -1049,3 +1049,8 @@ CREATE DOMAIN constraint_comments_dom AS int;
|
|||||||
|
|
||||||
ALTER DOMAIN constraint_comments_dom ADD CONSTRAINT inv_ck CHECK (value > 0) NOT VALID;
|
ALTER DOMAIN constraint_comments_dom ADD CONSTRAINT inv_ck CHECK (value > 0) NOT VALID;
|
||||||
COMMENT ON CONSTRAINT inv_ck ON DOMAIN constraint_comments_dom IS 'comment on invalid constraint';
|
COMMENT ON CONSTRAINT inv_ck ON DOMAIN constraint_comments_dom IS 'comment on invalid constraint';
|
||||||
|
|
||||||
|
-- Create a table that exercises pg_upgrade
|
||||||
|
CREATE TABLE regress_notnull1 (a integer);
|
||||||
|
CREATE TABLE regress_notnull2 () INHERITS (regress_notnull1);
|
||||||
|
ALTER TABLE ONLY regress_notnull2 ALTER COLUMN a SET NOT NULL;
|
||||||
|
Reference in New Issue
Block a user