Thanks, Alvaro, for the review.

I have addressed your comments per the above suggestions in the attached v4
patch.

--

Thanks & Regards,
Suraj kharage,



enterprisedb.com <https://www.enterprisedb.com/>


On Wed, Feb 5, 2025 at 12:11 AM Alvaro Herrera <alvhe...@alvh.no-ip.org>
wrote:

> On 2025-Jan-13, Suraj Kharage wrote:
>
> > Please find attached revised version of patch which added the INHERIT to
> NO
> > INHERIT state change for not null constraint.
>
> Thanks!
>
> I find the doc changes a little odd.  First, you seem to have added a
> [INHERIT/NO INHERIT] flag in the wrong place (line 112); that stuff
> already has the NO INHERIT flag next to the constraint types that allow
> it, so that change should be removed from the patch.  I think the
> addition in line 62 are sufficient.  Second, adding the explanation for
> what this does to the existing varlistentry for ALTER CONSTRAINT looks
> out of place.  I would add a separate one, something like this perhaps:
>
> diff --git a/doc/src/sgml/ref/alter_table.sgml
> b/doc/src/sgml/ref/alter_table.sgml
> index f9576da435e..10614bcdbd6 100644
> --- a/doc/src/sgml/ref/alter_table.sgml
> +++ b/doc/src/sgml/ref/alter_table.sgml
> @@ -59,6 +59,7 @@ ALTER TABLE [ IF EXISTS ] <replaceable
> class="parameter">name</replaceable>
>      ADD <replaceable class="parameter">table_constraint</replaceable> [
> NOT VALID ]
>      ADD <replaceable
> class="parameter">table_constraint_using_index</replaceable>
>      ALTER CONSTRAINT <replaceable
> class="parameter">constraint_name</replaceable> [ DEFERRABLE | NOT
> DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
> +    ALTER CONSTRAINT <replaceable
> class="parameter">constraint_name</replaceable> SET [ NO ] INHERIT
>      VALIDATE CONSTRAINT <replaceable
> class="parameter">constraint_name</replaceable>
>      DROP CONSTRAINT [ IF EXISTS ]  <replaceable
> class="parameter">constraint_name</replaceable> [ RESTRICT | CASCADE ]
>      DISABLE TRIGGER [ <replaceable
> class="parameter">trigger_name</replaceable> | ALL | USER ]
> @@ -551,7 +552,27 @@ WITH ( MODULUS <replaceable
> class="parameter">numeric_literal</replaceable>, REM
>      <listitem>
>       <para>
>        This form alters the attributes of a constraint that was previously
> -      created. Currently only foreign key constraints may be altered.
> +      created. Currently only foreign key constraints may be altered in
> +      this fashion, but see below.
> +     </para>
> +    </listitem>
> +   </varlistentry>
> +
> +   <varlistentry id="sql-altertable-desc-alter-constraint-inherit">
> +    <term><literal>ALTER CONSTRAINT ... SET INHERIT</literal></term>
> +    <term><literal>ALTER CONSTRAINT ... SET NO INHERIT</literal></term>
> +    <listitem>
> +     <para>
> +      This form modifies a inheritable constraint so that it becomes not
> +      inheritable, or vice-versa. Only not-null constraints may be altered
> +      in this fashion at present.
> +      In addition to changing the inheritability status of the constraint,
> +      in the case where a non-inheritable constraint is being marked
> +      inheritable, if the table has children, an equivalent constraint
> +      is added to them. If marking an inheritable constraint as
> +      non-inheritable on a table with children, then the corresponding
> +      constraint on children will be marked as no longer inherited,
> +      but not removed.
>       </para>
>      </listitem>
>     </varlistentry>
>
>
> I don't think reusing AT_AlterConstraint for this is a good idea.  I
> would rather add a new AT_AlterConstraintInherit /
> AT_AlterConstraintNoInherit, which takes only a constraint name in
> n->name rather than a Constraint in n->def.  So gram.y would look like
>
>                         /*
>                          * ALTER TABLE <name> ALTER CONSTRAINT SET [NO]
> INHERIT
>                          */
>                         | ALTER CONSTRAINT name SET INHERIT
>                                 {
>                                         AlterTableCmd *n =
> makeNode(AlterTableCmd);
>
>                                         n->subtype =
> AT_AlterConstraintInherit;
>                                         n->name = $3;
>
>                                         $$ = (Node *) n;
>                                 }
>                         | ALTER CONSTRAINT name SET NO INHERIT
>                                 {
>                                         AlterTableCmd *n =
> makeNode(AlterTableCmd);
>
>                                         n->subtype =
> AT_AlterConstraintNoInherit;
>                                         n->name = $3;
>
>                                         $$ = (Node *) n;
>                                 }
>
> This avoids hardcoding in the grammar that we only support this for
> not-null constraints -- I'm sure we'll want to implement this for CHECK
> constraints later, and at the grammar level there just wouldn't be any
> way to implement that the way you have it.
>
>
> It's a pity that bison doesn't like having unadorned NO INHERIT here.
> That would align better with the other use of INHERIT / NO INHERIT we
> have in alter table -- requiring a SET there looks ugly.  I tried to
> change it and the shift/reduce conflict is annoying.  I don't have any
> bright ideas on fixing that.
>
> --
> Álvaro Herrera               48°01'N 7°57'E  —
> https://www.EnterpriseDB.com/
> "Nunca confiaré en un traidor.  Ni siquiera si el traidor lo he creado yo"
> (Barón Vladimir Harkonnen)
>

Attachment: v4-alter_not_null_constraint_to_inherit_no_inherit.patch
Description: Binary data

Reply via email to