From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | Isaac Morland <isaac(dot)morland(at)gmail(dot)com> |
Cc: | Robert Haas <robertmhaas(at)gmail(dot)com>, pgsql-hackers(at)lists(dot)postgresql(dot)org, Andres Freund <andres(at)anarazel(dot)de> |
Subject: | Re: Violation of principle that plan trees are read-only |
Date: | 2025-05-19 14:45:47 |
Message-ID: | 406180.1747665947@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Isaac Morland <isaac(dot)morland(at)gmail(dot)com> writes:
> I assume this question has an obvious negative answer, but why can't we
> attach const declarations to the various structures that make up the plan
> tree (at all levels, all the way down)? I know const doesn't actually
> prevent a value from changing, but at least the compiler would complain if
> code accidentally tried.
The big problem is that a "const" attached to a top-level pointer
doesn't inherently propagate down to sub-nodes. So if I had, say,
"const Query *stmt", the compiler would complain about
stmt->jointree = foo;
but not about
stmt->jointree->quals = foo;
I guess we could imagine developing an entirely parallel set of
struct declarations with "const" on all pointer fields, like
typedef struct ConstQuery
{
...
const ConstFromExpr *jointree;
...
} ConstQuery;
but even with automated maintenance of the ConstFoo doppelganger
typedefs, it seems like that'd be a notational nightmare. For
one thing, I'm not sure how to teach the compiler that casting
"Query *" to "ConstQuery *" is okay but vice versa isn't.
Does C++ have a better story in this area? I haven't touched it
in so long that I don't remember.
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | Andres Freund | 2025-05-19 14:51:46 | Re: wrong query results on bf leafhopper |
Previous Message | Robert Haas | 2025-05-19 14:39:51 | Re: Violation of principle that plan trees are read-only |