aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>1999-02-07 02:56:53 +0000
committerBruce Momjian <bruce@momjian.us>1999-02-07 02:56:53 +0000
commit65decc34021ed239472abb825a0c79ec9b9fcbe4 (patch)
treebc7f7bf3bca2ad65beaedd3c5bfbab414e05d29e /src
parent48fd9a2cc2ee8b94dba78dcc02b384f951cb736c (diff)
downloadpostgresql-65decc34021ed239472abb825a0c79ec9b9fcbe4.tar.gz
postgresql-65decc34021ed239472abb825a0c79ec9b9fcbe4.zip
Allow psql to do \p\g. Ingres does it, why not us?
Diffstat (limited to 'src')
-rw-r--r--src/bin/psql/psql.c57
1 files changed, 40 insertions, 17 deletions
diff --git a/src/bin/psql/psql.c b/src/bin/psql/psql.c
index 3b3ea179ecb..88e3ea40062 100644
--- a/src/bin/psql/psql.c
+++ b/src/bin/psql/psql.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.168 1999/02/03 21:17:44 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.169 1999/02/07 02:56:53 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1753,10 +1753,10 @@ do_shell(const char *command)
/*
* HandleSlashCmds:
*
- * Handles all the different commands that start with \ db_ptr is a pointer to
- * the TgDb* structure line is the current input line prompt_ptr is a pointer
- * to the prompt string, a pointer is used because the prompt can be used
- * with a connection to a new database.
+ * Handles all the different commands that start with \
+ * db_ptr is a pointer to the TgDb* structure line is the current input
+ * line prompt_ptr is a pointer to the prompt string, a pointer is used
+ * because the prompt can be used with a connection to a new database.
* Returns a status:
* 0 - send currently constructed query to backend (i.e. we got a \g)
* 1 - skip processing of this line, continue building up query
@@ -2690,22 +2690,45 @@ MainLoop(PsqlSettings *pset, char *query, FILE *source)
if (!in_quote && query_start[0] == '\\')
{
- slashCmdStatus = HandleSlashCmds(pset,
- query_start,
- query);
- if (slashCmdStatus == CMD_SKIP_LINE)
+ /* handle \p\g and other backslash combinations */
+ while (query_start[0] != '\0')
{
- if (query[0] == '\0')
- paren_level = 0;
- free(line);
- continue;
+ char hold_char;
+
+#ifndef WIN32
+ /* I believe \w \dos\system\x would cause a problem */
+ /* do we have '\p\g' or '\p \g' ? */
+ if (strlen(query_start) > 2 &&
+ query_start[2 + strspn(query_start + 2, " \t")] == '\\')
+ {
+ hold_char = query_start[2 + strspn(query_start + 2, " \t")];
+ query_start[2 + strspn(query_start + 2, " \t")] = '\0';
+ }
+ else /* spread over #endif */
+#endif
+ hold_char = '\0';
+
+ slashCmdStatus = HandleSlashCmds(pset,
+ query_start,
+ query);
+
+ if (slashCmdStatus == CMD_SKIP_LINE && !hold_char)
+ {
+ if (query[0] == '\0')
+ paren_level = 0;
+ break;
+ }
+ if (slashCmdStatus == CMD_TERMINATE)
+ break;
+
+ query_start += strlen(query_start);
+ if (hold_char)
+ query_start[0] = hold_char;
}
+ free(line);
+ /* They did \q, leave the loop */
if (slashCmdStatus == CMD_TERMINATE)
- {
- free(line);
break;
- }
- free(line);
}
else if (strlen(query) + strlen(query_start) > MAX_QUERY_BUFFER)
{