On Thu, Nov 14, 2024 at 1:02 PM Suraj Kharage
<suraj.khar...@enterprisedb.com> wrote:
>
> Hi,
>
> Upstream commit 14e87ffa5c543b5f30ead7413084c25f7735039f added the support 
> for named NOT NULL constraints which are INHERIT by default.
> We can declare those as NO INHERIT which means those constraints will not be 
> inherited to child tables and after this state, we don't have the 
> functionality to change the state back to INHERIT.
>
> This patch adds this support where named NOT NULL constraint defined as NO 
> INHERIT can be changed to INHERIT.
> For this, introduced the new syntax something like -
>
> ALTER TABLE <tabname> ALTER CONSTRAINT <constrname> INHERIT;
>


            /* ALTER TABLE <name> ALTER CONSTRAINT INHERIT*/
            | ALTER CONSTRAINT name INHERIT
                {
                    AlterTableCmd *n = makeNode(AlterTableCmd);
                    Constraint *c = makeNode(Constraint);

                    n->subtype = AT_AlterConstraint;
                    n->def = (Node *) c;
                    c->contype = CONSTR_NOTNULL;

in gram.y, adding a comment saying this only supports not-null would be great.

comments " * Currently only works for Foreign Key constraints."
above ATExecAlterConstraint need change?



ATExecAlterConstraint
+ if (currcon->contype != CONSTRAINT_NOTNULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("constraint \"%s\" of relation \"%s\" is not a not null constraint",
+ cmdcon->conname, RelationGetRelationName(rel))));
the error message is not helpful?

we should instead saying
ALTER TABLE <tabname> ALTER CONSTRAINT <constrname> INHERIT;
only support not-null constraint.

in ATExecSetNotNull we already have:
if (recurse)
{
        List       *children;
        children = find_inheritance_children(RelationGetRelid(rel),
                                             lockmode);
        foreach_oid(childoid, children)
        {
            Relation    childrel = table_open(childoid, NoLock);
            CommandCounterIncrement();
            ATExecSetNotNull(wqueue, childrel, conName, colName,
                             recurse, true, lockmode);
            table_close(childrel, NoLock);
        }
    }
so we don't need another CommandCounterIncrement()
in the `foreach_oid(childoid, children)` loop?


maybe we need a CommandCounterIncrement() for
+ /* Update the constraint tuple and mark connoinherit as false. */
+ currcon->connoinherit = false;
+
+ CatalogTupleUpdate(conrel, &contuple->t_self, contuple);
+ ObjectAddressSet(address, ConstraintRelationId, currcon->oid);


+-- error out when provided not null constarint does not exists.
+create table part1(f1 int not null no inherit);
+alter table foo alter constraint part1_id_not_nul inherit;
+ERROR:  constraint "part1_id_not_nul" of relation "foo" does not exist
+drop table part1;
i think you mean:
+alter table part1 alter constraint foo inherit;


Reply via email to