jian he <jian.universal...@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/