Thread

  1. Re: Fix ALTER TABLE DROP EXPRESSION with inheritance hierarchy

    jian he <jian.universality@gmail.com> — 2025-12-30T01:35:12Z

    On Tue, Dec 30, 2025 at 4:56 AM Kirill Reshke <reshkekirill@gmail.com> wrote:
    >
    > Hi!
    > I did take another look at this thread. I agree this "recurse and
    > recursing" logic is a little confusing.
    > Anyway, are you saying that v3 from this thread is a fix you are OK with?
    >
    
    Yes.
    
    Maybe we can do something in ATSimpleRecursion.
    but ATSimpleRecursion is very generic. adding some ad-hoc code for
    AT_DropExpression seems not ideal.
    
    In ATPrepDropExpression
    ```
        if (!recurse && !recursing &&
            find_inheritance_children(RelationGetRelid(rel), lockmode))
            ereport(ERROR,
                    errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                    errmsg("ALTER TABLE / DROP EXPRESSION must be applied
    to child tables too"),
                    errhint("Do not specify the ONLY keyword."));
    ```
    is correct, i think.
    
    If ONLY is not specified:
    For child relations (see ATSimpleRecursion), the code invokes
    ATPrepDropExpression(rel, cmd, false, true, lockmode);
    
    For the parent relation, it invokes
    ATPrepDropExpression(rel, cmd, true, false, lockmode);
    
    
    If ONLY is specified:
    The ATSimpleRecursion logic is entirely skipped.
    ATPrepDropExpression is invoked exactly once as
    ATPrepDropExpression(rel, cmd, false, false, lockmode);
    
    
    --
    jian
    https://www.enterprisedb.com