diff options
author | David Rowley <drowley@postgresql.org> | 2023-09-21 17:15:02 +1200 |
---|---|---|
committer | David Rowley <drowley@postgresql.org> | 2023-09-21 17:39:30 +1200 |
commit | f7dbdab051d08b1b728b17dbc2b18b7e4f16734c (patch) | |
tree | 7d40f21044f37a8b1e61527511d1e56d868e7425 /src | |
parent | 3701db77a08ecbd28c6f600de81f53d3712568fe (diff) | |
download | postgresql-f7dbdab051d08b1b728b17dbc2b18b7e4f16734c.tar.gz postgresql-f7dbdab051d08b1b728b17dbc2b18b7e4f16734c.zip |
Fix vacuumdb to pass buffer-usage-limit with analyze-only mode
ae78cae3b added the --buffer-usage-limit to vacuumdb to allow it to
include the BUFFER_USAGE_LIMIT option in the VACUUM command.
Unfortunately, that commit forgot to adjust the code so the option was
added to the ANALYZE command when the -Z command line argument was
specified.
There were no issues with the -z command as that option just adds
ANALYZE to the VACUUM command.
In passing adjust the code to escape the --buffer-usage-limit option
before passing it to the server. It seems nothing beyond a confusing
error message could become this lack of escaping as VACUUM cannot be
specified in a multi-command string.
Reported-by: Ryoga Yoshida
Author: Ryoga Yoshida, David Rowley
Discussion: https://postgr.es/m/08930c0b541700a5264e5fbf3a685f5a%40oss.nttdata.com
Backpatch-through: 16, where ae78cae3b was introduced.
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/scripts/vacuumdb.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c index f03d5b1c6cb..005b064c06c 100644 --- a/src/bin/scripts/vacuumdb.c +++ b/src/bin/scripts/vacuumdb.c @@ -85,6 +85,8 @@ static void help(const char *progname); void check_objfilter(void); +static char *escape_quotes(const char *src); + /* For analyze-in-stages mode */ #define ANALYZE_NO_STAGE -1 #define ANALYZE_NUM_STAGES 3 @@ -270,7 +272,7 @@ main(int argc, char *argv[]) vacopts.process_main = false; break; case 13: - vacopts.buffer_usage_limit = pg_strdup(optarg); + vacopts.buffer_usage_limit = escape_quotes(optarg); break; default: /* getopt_long already emitted a complaint */ @@ -453,6 +455,20 @@ check_objfilter(void) } /* + * Returns a newly malloc'd version of 'src' with escaped single quotes and + * backslashes. + */ +static char * +escape_quotes(const char *src) +{ + char *result = escape_single_quotes_ascii(src); + + if (!result) + pg_fatal("out of memory"); + return result; +} + +/* * vacuum_one_database * * Process tables in the given database. If the 'tables' list is empty, @@ -964,6 +980,13 @@ prepare_vacuum_command(PQExpBuffer sql, int serverVersion, appendPQExpBuffer(sql, "%sVERBOSE", sep); sep = comma; } + if (vacopts->buffer_usage_limit) + { + Assert(serverVersion >= 160000); + appendPQExpBuffer(sql, "%sBUFFER_USAGE_LIMIT '%s'", sep, + vacopts->buffer_usage_limit); + sep = comma; + } if (sep != paren) appendPQExpBufferChar(sql, ')'); } |