Re: Removing unneeded self joins

From: Alexander Korotkov <aekorotkov(at)gmail(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Alena Rybakina <a(dot)rybakina(at)postgrespro(dot)ru>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, Andrei Lepikhov <lepihov(at)gmail(dot)com>, Robert Haas <robertmhaas(at)gmail(dot)com>, Richard Guo <guofenglinux(at)gmail(dot)com>, Alexander Lakhin <exclusion(at)gmail(dot)com>, "Gregory Stark (as CFM)" <stark(dot)cfm(at)gmail(dot)com>, Michał Kłeczek <michal(at)kleczek(dot)org>, Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com>
Subject: Re: Removing unneeded self joins
Date: 2025-02-23 21:15:35
Message-ID: CAPpHfdt-F2CzQEEDZjhDB0pHMP-FdWt-jv6DVsO+5JZEGpTyTA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Sun, Feb 23, 2025 at 7:02 PM Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
>
> Alexander Korotkov <aekorotkov(at)gmail(dot)com> writes:
> > I've corrected some spelling error reported by Alexander Lakhin
> > privately to me. Also, I've revised comments around ChangeVarNodes()
> > and ChangeVarNodesExtended(). I'm going to continue nitpicking this
> > patch during next couple days then push it if no objections.
>
> Coverity has another nit-pick:
>
> /srv/coverity/git/pgsql-git/postgresql/src/backend/optimizer/plan/analyzejoins.c: 327 in remove_rel_from_query()
> 321 static void
> 322 remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel,
> 323 int subst, SpecialJoinInfo *sjinfo,
> 324 Relids joinrelids)
> 325 {
> 326 int relid = rel->relid;
> >>> CID 1643155: Integer handling issues (INTEGER_OVERFLOW)
> >>> Expression "ojrelid", which is equal to 4294967295, where "(sjinfo != NULL) ? sjinfo->ojrelid : 4294967295U" is known to be equal to 4294967295, overflows the type that receives it, a signed integer 32 bits wide.
> 327 int ojrelid = (sjinfo != NULL) ? sjinfo->ojrelid : -1;
> 328 Index rti;
> 329 ListCell *l;
> 330
> 331 /*
> 332 * Update all_baserels and related relid sets.
>
> This is unhappy because sjinfo->ojrelid, which is declared Index
> (that is, unsigned int) is being converted to int. Admittedly
> there are plenty of other places that do likewise, but the additional
> load of assuming that -1 isn't a possible value of sjinfo->ojrelid
> seems to be enough to draw its ire.

Thank you for reporting this!

> I suggest finding another way to code this function that doesn't
> depend on that type pun. I think it's fairly accidental that
> adjust_relid_set doesn't misbehave on -1 anyway, so personally I'd
> get rid of that local variable entirely in favor of something like
>
> if (sjinfo != NULL)
> {
> root->outer_join_rels = adjust_relid_set(root->outer_join_rels,
> sjinfo->ojrelid, subst);
> root->all_query_rels = adjust_relid_set(root->all_query_rels,
> sjinfo->ojrelid, subst);
> }

There is my attempt to implement this approach. Getting rid of local
variable (and computation of the same value other way) required to
change arguments of remove_rel_from_eclass() as well. I'm going to
further polish this tomorrow.

------
Regards,
Alexander Korotkov
Supabase

Attachment Content-Type Size
v1-0001-Get-rid-of-ojrelid-local-variable-in-remove_rel_f.patch application/octet-stream 8.3 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Sadeq Dousti 2025-02-23 21:26:42 Re: psql \dh: List High-Level (Root) Tables and Indexes
Previous Message Sadeq Dousti 2025-02-23 21:10:44 Re: psql \dh: List High-Level (Root) Tables and Indexes