From: | Andres Freund <andres(at)anarazel(dot)de> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | pgsql-hackers(at)lists(dot)postgresql(dot)org |
Subject: | Re: Converting tab-complete.c's else-if chain to a switch |
Date: | 2024-07-15 17:40:16 |
Message-ID: | 20240715174016.ukm6k5shwszmudb7@awork3.anarazel.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hi,
On 2024-07-13 13:16:14 -0400, Tom Lane wrote:
> I wrote:
> > Per discussion elsewhere [1], I've been looking at $SUBJECT.
>
> Here's a finished patchset to perform this change.
Awesome!
> With gcc 8.5.0 I see the time drop from about 3 seconds to about 0.7. The
> win is less noticeable with clang version 15.0 on a Mac M1: from about 0.7s
> to 0.45s.
Nice!
With gcc 15 I see:
before after
-O0 1.2s 0.6s
-O2 10.5s 2.6s
-O3 10.8s 2.8s
Quite a nice win.
> Of course the main point is the hope that it will work at all with MSVC, but
> I'm not in a position to test that.
It does work with just your patches applied - very nice.
The only obvious thing that doesn't is that ctrl-c without a running query
terminates psql - interrupting a running query works without terminating psql,
which is a bit weird. But that seems independent of this series.
> Subject: [PATCH v1 3/5] Install preprocessor infrastructure for
> tab-complete.c.
Ah - I was wondering how the above would actually work when I read your intro :)
> +tab-complete.c: gen_tabcomplete.pl tab-complete.in.c
> + $(PERL) $^ --outfile $@
> +
When I first built this with make, I got this error:
make: *** No rule to make target '/home/andres/src/postgresql/src/bin/psql/tab-complete.c', needed by 'tab-complete.o'. Stop.
but that's just a a consequence of the make dependency handling... Removing
the .deps directory fixed it.
> +# The input is a C file that contains some case labels that are not
> +# constants, but look like function calls, for example:
> +# case Matches("A", "B"):
> +# The function name can be any one of Matches, HeadMatches, TailMatches,
> +# MatchesCS, HeadMatchesCS, or TailMatchesCS. The argument(s) must be
> +# string literals or macros that expand to string literals or NULL.
Hm, the fact that we are continuing to use the same macros in the switch makes
it a bit painful to edit the .in.c in an editor with compiler-warnings
integration - I see a lot of reported errors ("Expression is not an integer
constant expression") due to case statements not being something that the
normal C switch can handle.
Perhaps we could use a distinct macro for use in the switch, which generates
valid (but nonsensical) code, so we avoid warnings?
> +# These lines are replaced by "case N:" where N is a unique number
> +# for each such case label. (For convenience, we use the line number
> +# of the case label, although other values would work just as well.)
Hm, using the line number seems to make it a bit harder to compare the output
of the script after making changes to the input. Not the end of the world, but
...
> +tabcomplete = custom_target('tabcomplete',
> + input: 'tab-complete.in.c',
> + output: 'tab-complete.c',
> + command: [
> + perl, files('gen_tabcomplete.pl'), files('tab-complete.in.c'),
> + '--outfile', '@OUTPUT@',
> + '@INPUT@',
> + ],
> + install: true,
> + install_dir: dir_include_server / 'utils',
> +)
I don't think we want to install tab-complete.c?
Greetings,
Andres Freund
From | Date | Subject | |
---|---|---|---|
Next Message | Robert Haas | 2024-07-15 17:44:58 | Re: Addressing SECURITY DEFINER Function Vulnerabilities in PostgreSQL Extensions |
Previous Message | Nathan Bossart | 2024-07-15 17:20:29 | Re: Restart pg_usleep when interrupted |