pg.ddx.io  pgsql-committers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Tom Lane <tgl@sss.pgh.pa.us>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Convert tab-complete's long else-if chain to a switch statement.
Date: Mon, 07 Oct 2024 16:31:49 +0000
Message-ID: <E1sxqeD-002ZUL-4u@gemulon.postgresql.org> (raw)

Convert tab-complete's long else-if chain to a switch statement.

Rename tab-complete.c to tab-complete.in.c, create the preprocessor
script gen_tabcomplete.pl, and install Makefile/meson.build rules
to create tab-complete.c from tab-complete.in.c.  The preprocessor
converts match_previous_words' else-if chain into a switch and
populates tcpatterns[] with the data needed by the driver loop.

The initial HeadMatches/TailMatches/Matches test in each else-if arm
is now performed in a table-driven loop.  Where we get a match, the
corresponding switch case is invoked to see if the match succeeds.
(It might not, if there were additional conditions in the original
else-if test.)

The total number of string comparisons done is just about the
same as it was in the previous coding; however, now that we
have table-driven logic underlying the handmade rules, there
is room to improve that.  For now I haven't bothered because
tab completion is still plenty fast enough for human use.
If the number of rules keeps increasing, we might someday
need to do more in that area.

The immediate benefit of all this thrashing is that C compilers
frequently don't deal well with long else-if chains.  On gcc 8.5.0,
this reduces the compile time of tab-complete.c by about a factor of
four, while MSVC is reported to crash outright with the previous
coding.

Discussion: https://postgr.es/m/2208466.1720729502@sss.pgh.pa.us

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/f391d9dc93a24923c57bb0e044161d3f0b840770

Modified Files
--------------
src/bin/psql/.gitignore                            |   1 +
src/bin/psql/Makefile                              |   5 +-
src/bin/psql/gen_tabcomplete.pl                    | 306 +++++++++++++++++++++
src/bin/psql/meson.build                           |  12 +-
src/bin/psql/{tab-complete.c => tab-complete.in.c} |   2 +-
5 files changed, 323 insertions(+), 3 deletions(-)



Message-ID: <E1sxqeD-002ZUL-4u@gemulon.postgresql.org>
Permalink:  ../E1sxqeD-002ZUL-4u@gemulon.postgresql.org/
Also on:    postgresql.org/message-id/E1sxqeD-002ZUL-4u@gemulon.postgresql.org

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-committers@postgresql.org
  Cc: tgl@sss.pgh.pa.us, pgsql-committers@lists.postgresql.org
  Subject: Re: pgsql: Convert tab-complete's long else-if chain to a switch statement.
  In-Reply-To: <E1sxqeD-002ZUL-4u@gemulon.postgresql.org>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox