Re: right() returns the whole string for the most negative n

From: Ewan Young <kdbase(dot)hack(at)gmail(dot)com>
To: Dagfinn Ilmari Mannsåker <ilmari(at)ilmari(dot)org>
Cc: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, David Rowley <dgrowleyml(at)gmail(dot)com>, Andrey Rachitskiy <pl0h0yp1(at)gmail(dot)com>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Daniel Gustafsson <daniel(at)yesql(dot)se>
Subject: Re: right() returns the whole string for the most negative n
Date: 2026-08-26 01:52:02
Message-ID: CAON2xHOyMfo0ukXCx6s7_PZrR5_KWrUdQAmutEFpxBMDUhgChg@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Tue, Aug 25, 2026 at 8:18 PM Dagfinn Ilmari Mannsåker
<ilmari(at)ilmari(dot)org> wrote:
>
> Ewan Young <kdbase(dot)hack(at)gmail(dot)com> writes:
>
> > diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c
> > index a09a9e5d5bb..3117069cf1a 100644
> > --- a/src/backend/utils/adt/varlena.c
> > +++ b/src/backend/utils/adt/varlena.c
> > @@ -4714,7 +4714,17 @@ text_right(PG_FUNCTION_ARGS)
> > int off;
> >
> > if (n < 0)
> > - n = -n;
> > + {
> > + /*
> > + * Negating PG_INT32_MIN would overflow, so clamp instead. Any n whose
> > + * absolute value is at least the string's length skips the whole
> > + * string, and len can't exceed PG_INT32_MAX, so this is equivalent.
> > + */
> > + if (unlikely(n == PG_INT32_MIN))
> > + n = PG_INT32_MAX;
> > + else
> > + n = -n;
> > + }
>
> Instead of open-coding this, how about about using pg_neg_s32_overflow?
>
> if (pg_neg_s32_overflow(n, &n))
> n = PG_INT32_MAX;
>

Much nicer, thanks - done in v2. varlena.c already includes common/int.h,
so no new header was needed.

> This made me think we might want saturating versions of the
> pg_*_overflow functions, but some quick grepping doesn't reveal any
> other places using pg_*_overflow do it manually, so that feels like
> premature generalisation.

Agreed, I left it as the two-liner.

Behaviour and tests are unchanged from v1: right('abcdef', INT32_MIN) now
returns '', the adjacent values and left() are untouched, and make check
passes.

>
> - ilmari

--
Regards,
Ewan Young

Attachment Content-Type Size
v2-0001-Fix-right-with-the-most-negative-integer.patch application/octet-stream 3.5 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Kyotaro Horiguchi 2026-08-26 02:02:40 Re: Assertion failure in GetSubscriptionRelations() with concurrent DROP TABLE
Previous Message Fujii Masao 2026-08-26 01:44:55 Re: Correct some doc items due to the REPACK