Re: Can't find not null constraint, but \d+ shows that - Mailing list pgsql-hackers

From Tender Wang
Subject Re: Can't find not null constraint, but \d+ shows that
Date
Msg-id CAHewXNmLog6Apch1TsS6cEpeQVJjG44ciNN6NzmPJmtKsnvoiQ@mail.gmail.com
Whole thread Raw
In response to Re: Can't find not null constraint, but \d+ shows that  (jian he <jian.universality@gmail.com>)
Responses Re: Can't find not null constraint, but \d+ shows that
Re: Can't find not null constraint, but \d+ shows that
List pgsql-hackers


jian he <jian.universality@gmail.com> 于2024年3月29日周五 14:56写道:
hi.
about v4, i think, i understand the changes you made.
RemoveConstraintById(Oid conId)
will drop a single constraint record.
if the constraint is primary key, then primary key associated
attnotnull should set to false.
but sometimes it shouldn't.

Yeah, indeed. 


for example:
drop table if exists t2;
CREATE TABLE t2(c0 int, c1 int);
ALTER TABLE  t2 ADD CONSTRAINT t2_pk PRIMARY KEY(c0, c1);
ALTER TABLE t2 ALTER COLUMN c0 ADD GENERATED ALWAYS AS IDENTITY;
ALTER TABLE  t2 DROP c1;

+ * If this was a NOT NULL or the primary key, the constrained columns must
+ * have had pg_attribute.attnotnull set.  See if we need to reset it, and
+ * do so.
+ */
+ if (unconstrained_cols != NIL)

unconstrained_cols is not NIL, which means we have dropped a primary key.
I am confused by "If this was a NOT NULL or the primary key".

NOT NULL means the definition of column having not-null constranit. For example:
create table t1(a int not null);
the pg_attribute.attnotnull is set to true.
primary key case like below:
create table t2(a int primary key);
the pg_attribute.attnotnull is set to true.

I think aboved case can explain what's meaning about comments in dropconstraint_internal.
But here, in RemoveConstraintById() , we only care about primary key case, so NOT NULL is better
to removed from comments.
 

+
+ /*
+ * Since the above deletion has been made visible, we can now
+ * search for any remaining constraints on this column (or these
+ * columns, in the case we're dropping a multicol primary key.)
+ * Then, verify whether any further NOT NULL exists, and reset
+ * attnotnull if none.
+ */
+ contup = findNotNullConstraintAttnum(RelationGetRelid(rel), attnum);
+ if (HeapTupleIsValid(contup))
+ {
+ heap_freetuple(contup);
+ heap_freetuple(atttup);
+ continue;
+ }

I am a little bit confused by the above comment.
I think the comments should say,
if contup is valid, that means, we already have one  "not null"
constraint associate with the attnum
in that condition, we must not set attnotnull, otherwise the
consistency between attnotnull and "not null"
table constraint will be broken.

other than that, the change in RemoveConstraintById looks sane.
 Above comments want to say that after pk constranit dropped, if there are tuples in
pg_constraint, that means the definition of column has not-null constraint. So we can't
set pg_attribute.attnotnull to false.

For example:
create table t1(a int not null);
alter table t1 add constraint t1_pk primary key(a);
alter table t1 drop constraint t1_pk;


--
Tender Wang
OpenPie:  https://en.openpie.com/

pgsql-hackers by date:

Previous
From: Bertrand Drouvot
Date:
Subject: Re: Synchronizing slots from primary to standby
Next
From: Jelte Fennema-Nio
Date:
Subject: Re: [EXTERNAL] Re: Add non-blocking version of PQcancel