On Tue, Oct 19, 2021 at 10:04 AM Tom Lane <t...@sss.pgh.pa.us> wrote:

> [ please do not quote the entire thread when replying ]
>
> Zhihong Yu <z...@yugabyte.com> writes:
> > Here is the patch.
>
> This patch seems quite misguided to me.  The proximate cause of
> the crash is that we're arriving at ExecEvalFieldStoreDeForm with
> *op->resnull and *op->resvalue both zero, which is a completely
> invalid situation for a pass-by-reference datatype; so something
> upstream of this messed up.  Even if there were an argument for
> acting as though that were a valid NULL value, this patch fails to
> do so; that'd require setting all the output fieldstore.nulls[]
> entries to true, which you didn't.
>
> Moreover, experiment quickly shows that the problem only shows up with
> an array of domain over composite, not an array of plain composite.
> The proposed patch doesn't seem to have anything to do with that
> observation.
>
> After some digging around, I see where the issue actually is:
> the expression tree we're dealing with looks like
>
>                  {SUBSCRIPTINGREF
>                  :refexpr
>                     {VAR
>                     }
>                  :refassgnexpr
>                     {COERCETODOMAIN
>                     :arg
>                        {FIELDSTORE
>                        :arg
>                           {CASETESTEXPR
>                           }
>                        }
>                     }
>                  }
>
> The array element we intend to replace has to be passed down to
> the CaseTestExpr, but that isn't happening.  That's because
> isAssignmentIndirectionExpr fails to recognize a tree like
> this, so ExecInitSubscriptingRef doesn't realize it needs to
> arrange for that.
>
> I believe the attached is a correct fix.
>
>                         regards, tom lane
>
> Hi,
Tom's patch fixes the update of individual field inside the domain type as
well.

Tom's patch looks good to me.

Reply via email to