Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bin/psql/command.c17
-rw-r--r--src/bin/psql/psqlscanslash.l21
-rw-r--r--src/test/regress/expected/psql.out2
-rw-r--r--src/test/regress/sql/psql.sql2
4 files changed, 26 insertions, 16 deletions
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index eb216b7c09e..9ad911e28d5 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -1640,18 +1640,7 @@ exec_command_help(PsqlScanState scan_state, bool active_branch)
if (active_branch)
{
char *opt = psql_scan_slash_option(scan_state,
- OT_WHOLE_LINE, NULL, false);
- size_t len;
-
- /* strip any trailing spaces and semicolons */
- if (opt)
- {
- len = strlen(opt);
- while (len > 0 &&
- (isspace((unsigned char) opt[len - 1])
- || opt[len - 1] == ';'))
- opt[--len] = '\0';
- }
+ OT_WHOLE_LINE, NULL, true);
helpSQL(opt, pset.popt.topt.pager);
free(opt);
@@ -3151,6 +3140,10 @@ ignore_slash_filepipe(PsqlScanState scan_state)
* This *MUST* be used for inactive-branch processing of any slash command
* that takes an OT_WHOLE_LINE option. Otherwise we might consume a different
* amount of option text in active and inactive cases.
+ *
+ * Note: although callers might pass "semicolon" as either true or false,
+ * we need not duplicate that here, since it doesn't affect the amount of
+ * input text consumed.
*/
static void
ignore_slash_whole_line(PsqlScanState scan_state)
diff --git a/src/bin/psql/psqlscanslash.l b/src/bin/psql/psqlscanslash.l
index 514977e59dc..e1ae8627dbf 100644
--- a/src/bin/psql/psqlscanslash.l
+++ b/src/bin/psql/psqlscanslash.l
@@ -18,6 +18,8 @@
*/
#include "postgres_fe.h"
+#include <ctype.h>
+
#include "common.h"
#include "psqlscanslash.h"
@@ -608,7 +610,7 @@ psql_scan_slash_option(PsqlScanState state,
/* empty arg */
break;
case xslasharg:
- /* Strip any unquoted trailing semi-colons if requested */
+ /* Strip any unquoted trailing semicolons if requested */
if (semicolon)
{
while (unquoted_option_chars-- > 0 &&
@@ -640,7 +642,22 @@ psql_scan_slash_option(PsqlScanState state,
termPQExpBuffer(&mybuf);
return NULL;
case xslashwholeline:
- /* always okay */
+ /*
+ * In whole-line mode, we interpret semicolon = true as stripping
+ * trailing whitespace as well as semicolons; this gives the
+ * nearest equivalent to what semicolon = true does in normal
+ * mode. Note there's no concept of quoting in this mode.
+ */
+ if (semicolon)
+ {
+ while (mybuf.len > 0 &&
+ (mybuf.data[mybuf.len - 1] == ';' ||
+ (isascii((unsigned char) mybuf.data[mybuf.len - 1]) &&
+ isspace((unsigned char) mybuf.data[mybuf.len - 1]))))
+ {
+ mybuf.data[--mybuf.len] = '\0';
+ }
+ }
break;
default:
/* can't get here */
diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out
index 5d61e4c7bb9..4f3fd464207 100644
--- a/src/test/regress/expected/psql.out
+++ b/src/test/regress/expected/psql.out
@@ -5323,7 +5323,7 @@ END
LANGUAGE sql
IMMUTABLE PARALLEL SAFE STRICT COST 1
1 RETURN ($2 + $1)
-\sf ts_debug(text)
+\sf ts_debug(text);
CREATE OR REPLACE FUNCTION pg_catalog.ts_debug(document text, OUT alias text, OUT description text, OUT token text, OUT dictionaries regdictionary[], OUT dictionary regdictionary, OUT lexemes text[])
RETURNS SETOF record
LANGUAGE sql
diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql
index f199d624d3b..c997106b9f3 100644
--- a/src/test/regress/sql/psql.sql
+++ b/src/test/regress/sql/psql.sql
@@ -1315,7 +1315,7 @@ drop role regress_psql_user;
\sf information_schema._pg_index_position
\sf+ information_schema._pg_index_position
\sf+ interval_pl_time
-\sf ts_debug(text)
+\sf ts_debug(text);
\sf+ ts_debug(text)
-- AUTOCOMMIT