]> granicus.if.org Git - postgresql/commitdiff
Allow psql to do \p\g. Ingres does it, why not us?
authorBruce Momjian <bruce@momjian.us>
Sun, 7 Feb 1999 02:56:53 +0000 (02:56 +0000)
committerBruce Momjian <bruce@momjian.us>
Sun, 7 Feb 1999 02:56:53 +0000 (02:56 +0000)
src/bin/psql/psql.c

index 3b3ea179ecbd5fd5c639bc5167fa57ef8b67bc70..88e3ea40062351a29775b03cf7c7e0f39bd55327 100644 (file)
@@ -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)
                {