Re: Refactor to eliminate cast-away-const in pg_dump object sort comparator - Mailing list pgsql-hackers

From Chao Li
Subject Re: Refactor to eliminate cast-away-const in pg_dump object sort comparator
Date
Msg-id CAEoWx2n9gfXRezWfDXkz+Ajb3D8BgOCwvfgBMtu-op=cKUj-cA@mail.gmail.com
Whole thread Raw
In response to Re: Refactor to eliminate cast-away-const in pg_dump object sort comparator  (Peter Eisentraut <peter@eisentraut.org>)
List pgsql-hackers


On Jan 5, 2026, at 21:24, Peter Eisentraut <peter@eisentraut.org> wrote:

On 30.12.25 10:03, Chao Li wrote:
Thanks a lot for pointing out the error. v3 has reverted the changes to be the same as v1 and rebased.

The explanation of this patch doesn't seem right.  The commit message says "... eliminate cast-away-const ...", but that is not what is happening in the code.  For example, in

static int
DOTypeNameCompare(const void *p1, const void *p2)
{
- DumpableObject *obj1 = *(DumpableObject *const *) p1;
- DumpableObject *obj2 = *(DumpableObject *const *) p2;
+ const DumpableObject *obj1 = *(DumpableObject *const *) p1;
+ const DumpableObject *obj2 = *(DumpableObject *const *) p2;

p1 is of type pointer-to-const-void, which is then cast into pointer-to-const-pointer-to-DumpableObject (which preserves the qualifier, because it's pointer-to-const-xxx on both sides), which is then dereferenced to result in type const-pointer-to-DumpableObject (type DumpableObject * const, not const DumpableObject *), which is then assigned by value to obj1 of type pointer-to-DumpableObject.  This is all entirely correct.

Now there is nothing wrong with making the receiving obj1 have an additional const qualification, if that's the promise you want to make about it for that scope.  But that's separate from preserving the qualifier on p1.  And it's incorrect to claim that this is fixing an existing cast-away-const issue.

Thanks for the explanation, you’re right.

The original p1/p2 are pointers to pointers, and the const qualifier only applies to the outer pointer. After dereferencing, the second-level pointer (DumpableObject *) is obtained, and my change simply adds const qualification to that pointer.

So this is not fixing a cast-away-const issue, but rather tightening the const qualification of the local variables.


Independent of that, there appears to be some not quite finished code here:

- AttrDefInfo *adobj1 = *(AttrDefInfo *const *) p1;
- AttrDefInfo *adobj2 = *(AttrDefInfo *const *) p2;
+ const AttrDefInfo *adobj1 = p1;//*(AttrDefInfo *const *) p1;
+ const AttrDefInfo *adobj2 = *(AttrDefInfo *const *) p2;


Sorry for the dirty patch file of v3. I was doing some tests, and missed to revert the dirty change.

V4 has updated the commit message and fixed the dirty code.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/




Attachment

pgsql-hackers by date:

Previous
From: Sami Imseih
Date:
Subject: Re: Refactor query normalization into core query jumbling
Next
From: "David E. Wheeler"
Date:
Subject: Re: Reject Foreign Tables from MIN/MAX indexscan Optimization?