Thread: Redundant strlen(query) in get_rel_infos

Redundant strlen(query) in get_rel_infos

From
Peter Smith
Date:
Hi.

While reviewing another patch to the file info.c, I noticed there seem
to be some unnecessary calls to strlen(query) in get_rel_infos()
function.

i.e. The query is explicitly initialized to an empty string
immediately prior, so why the strlen?

PSA patch for this.

------
Kind Regards,
Peter Smith.
Fujitsu Australia

Attachment

Re: Redundant strlen(query) in get_rel_infos

From
Michael Paquier
Date:
On Thu, May 11, 2023 at 01:06:42PM +1000, Peter Smith wrote:
> While reviewing another patch to the file info.c, I noticed there seem
> to be some unnecessary calls to strlen(query) in get_rel_infos()
> function.
>
> i.e. The query is explicitly initialized to an empty string
> immediately prior, so why the strlen?

It just looks like this was copied from a surrounding area like
get_db_infos().  Keeping the code as it is is no big deal, either, but
yes we could just remove them and save the two calls.  So ok by me.
--
Michael

Attachment

Re: Redundant strlen(query) in get_rel_infos

From
Daniel Gustafsson
Date:
> On 11 May 2023, at 06:24, Michael Paquier <michael@paquier.xyz> wrote:
>
> On Thu, May 11, 2023 at 01:06:42PM +1000, Peter Smith wrote:
>> While reviewing another patch to the file info.c, I noticed there seem
>> to be some unnecessary calls to strlen(query) in get_rel_infos()
>> function.
>>
>> i.e. The query is explicitly initialized to an empty string
>> immediately prior, so why the strlen?
>
> It just looks like this was copied from a surrounding area like
> get_db_infos().  Keeping the code as it is is no big deal, either, but
> yes we could just remove them and save the two calls.  So ok by me.

I think it's intentionally done in 73b9952e82 as defensive coding, and given
that this is far from a hot codepath I think leaving them is better.

Instead I think it would be more worthwhile to remove these snprintf() made
queries and use PQExpbuffers.  29aeda6e4e6 introduced that in pg_upgrade and it
is more in line with how we build queries in other tools.

Looking at the snprintf sites made me remember a patchset I worked on last year
(but I don't remember if I ended up submitting); there is no need to build one
of the queries on the stack as it has no variables.  The attached 0003 (which
needs a reindent of the query text) comes from that patchset.  I think we
should do this regardless.

--
Daniel Gustafsson


Attachment

Re: Redundant strlen(query) in get_rel_infos

From
Michael Paquier
Date:
On Thu, May 11, 2023 at 11:57:37AM +0200, Daniel Gustafsson wrote:
> I think it's intentionally done in 73b9952e82 as defensive coding, and given
> that this is far from a hot codepath I think leaving them is better.
>
> Instead I think it would be more worthwhile to remove these snprintf() made
> queries and use PQExpbuffers.  29aeda6e4e6 introduced that in pg_upgrade and it
> is more in line with how we build queries in other tools.

Good idea to reduce the overall presence of QUERY_ALLOC in the
surroundings.

> Looking at the snprintf sites made me remember a patchset I worked on last year
> (but I don't remember if I ended up submitting); there is no need to build one
> of the queries on the stack as it has no variables.  The attached 0003 (which
> needs a reindent of the query text) comes from that patchset.  I think we
> should do this regardless.

Not sure that this is an improvement in itself as
get_tablespace_paths() includes QUERY_ALLOC because
executeQueryOrDie() does so, so this could become a problem if
someones decides to copy-paste this code with a query becomes longer
than QUERY_ALLOC once built?  Perhaps that's not worth worrying, but I
like your suggestion of applying more PQExpbuffers, particularly if
applied in a consistent way across the board.  It could matter if the
code of get_tablespace_paths() is changed to use a query with
parameters.
--
Michael

Attachment

Re: Redundant strlen(query) in get_rel_infos

From
Daniel Gustafsson
Date:
> On 15 May 2023, at 09:45, Michael Paquier <michael@paquier.xyz> wrote:
> On Thu, May 11, 2023 at 11:57:37AM +0200, Daniel Gustafsson wrote:

>> Looking at the snprintf sites made me remember a patchset I worked on last year
>> (but I don't remember if I ended up submitting); there is no need to build one
>> of the queries on the stack as it has no variables.  The attached 0003 (which
>> needs a reindent of the query text) comes from that patchset.  I think we
>> should do this regardless.
>
> Not sure that this is an improvement in itself as
> get_tablespace_paths() includes QUERY_ALLOC because
> executeQueryOrDie() does so, so this could become a problem if
> someones decides to copy-paste this code with a query becomes longer
> than QUERY_ALLOC once built?  Perhaps that's not worth worrying,

We already have lots of invocations of executeQueryOrDie which doesn't pass via
a QUERY_ALLOC buffer so I don't see any risk with adding one more.

--
Daniel Gustafsson