Re-run pgindent to fix breakage when exceeding 150 'else if' clauses.
authorBruce Momjian
Mon, 14 Nov 2005 17:48:43 +0000 (17:48 +0000)
committerBruce Momjian
Mon, 14 Nov 2005 17:48:43 +0000 (17:48 +0000)
Cosmetic fix only.

src/bin/psql/tab-complete.c

index d96a375f5df778894670aedc738cf7fa1201ba36..811b996f3432727f9bc8afa7e8a562360ac70ecf 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2005, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.139 2005/11/07 17:36:45 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.140 2005/11/14 17:48:43 momjian Exp $
  */
 
 /*----------------------------------------------------------------------
@@ -1782,134 +1782,11 @@ psql_completion(char *text, int start, int end)
        matches = completion_matches(text, filename_completion_function);
 
 
-                                                                                                                           /*
-                                                                                                                            *
-                                                                                                                            * Fi
-                                                                                                                            * n
-                                                                                                                            * a
-                                                                                                                            * l
-                                                                                                                            * l
-                                                                                                                            * y
-                                                                                                                            * ,
-                                                                                                                            *
-                                                                                                                            * we
-                                                                                                                            *
-                                                                                                                            * lo
-                                                                                                                            * o
-                                                                                                                            * k
-                                                                                                                            *
-                                                                                                                            * th
-                                                                                                                            * r
-                                                                                                                            * o
-                                                                                                                            * u
-                                                                                                                            * g
-                                                                                                                            * h
-                                                                                                                            *
-                                                                                                                            * th
-                                                                                                                            * e
-                                                                                                                            *
-                                                                                                                            * li
-                                                                                                                            * s
-                                                                                                                            * t
-                                                                                                                            *
-                                                                                                                            * of
-                                                                                                                            *
-                                                                                                                            * "t
-                                                                                                                            * h
-                                                                                                                            * i
-                                                                                                                            * n
-                                                                                                                            * g
-                                                                                                                            * s
-                                                                                                                            * "
-                                                                                                                            * ,
-                                                                                                                            *
-                                                                                                                            * su
-                                                                                                                            * c
-                                                                                                                            * h
-                                                                                                                            *
-                                                                                                                            * as
-                                                                                                                            *
-                                                                                                                            * TA
-                                                                                                                            * B
-                                                                                                                            * L
-                                                                                                                            * E
-                                                                                                                            * ,
-                                                                                                                            *
-                                                                                                                            * IN
-                                                                                                                            * D
-                                                                                                                            * E
-                                                                                                                            * X
-                                                                                                                            *
-                                                                                                                            * an
-                                                                                                                            * d
-                                                                                                                            *
-                                                                                                                            * ch
-                                                                                                                            * e
-                                                                                                                            * c
-                                                                                                                            * k
-                                                                                                                            *
-                                                                                                                            * if
-                                                                                                                            *
-                                                                                                                            * th
-                                                                                                                            * a
-                                                                                                                            * t
-                                                                                                                            *
-                                                                                                                            * wa
-                                                                                                                            * s
-                                                                                                                            *
-                                                                                                                            * th
-                                                                                                                            * e
-                                                                                                                            *
-                                                                                                                            * pr
-                                                                                                                            * e
-                                                                                                                            * v
-                                                                                                                            * i
-                                                                                                                            * o
-                                                                                                                            * u
-                                                                                                                            * s
-                                                                                                                            *
-                                                                                                                            * wo
-                                                                                                                            * r
-                                                                                                                            * d
-                                                                                                                            * .
-                                                                                                                            *
-                                                                                                                            * If
-                                                                                                                            *
-                                                                                                                            * so
-                                                                                                                            * ,
-                                                                                                                            *
-                                                                                                                            * ex
-                                                                                                                            * e
-                                                                                                                            * c
-                                                                                                                            * u
-                                                                                                                            * t
-                                                                                                                            * e
-                                                                                                                            *
-                                                                                                                            * th
-                                                                                                                            * e
-                                                                                                                            *
-                                                                                                                            * qu
-                                                                                                                            * e
-                                                                                                                            * r
-                                                                                                                            * y
-                                                                                                                            *
-                                                                                                                            * to
-                                                                                                                            *
-                                                                                                                            * ge
-                                                                                                                            * t
-                                                                                                                            *
-                                                                                                                            * a
-                                                                                                                            * li
-                                                                                                                            * s
-                                                                                                                            * t
-                                                                                                                            *
-                                                                                                                            * of
-                                                                                                                            *
-                                                                                                                            * th
-                                                                                                                            * e
-                                                                                                                            * m
-                                                                                                                            * .
-                                                                                                                            * */
+   /*
+    * Finally, we look through the list of "things", such as TABLE, INDEX and
+    * check if that was the previous word. If so, execute the query to get a
+    * list of them.
+    */
    else
    {
        int         i;
@@ -1928,236 +1805,29 @@ psql_completion(char *text, int start, int end)
        }
    }
 
-                                                                                                   /*
-                                                                                                    *
-                                                                                                    * If
-                                                                                                    *
-                                                                                                    * we
-                                                                                                    *
-                                                                                                    * st
-                                                                                                    * i
-                                                                                                    * l
-                                                                                                    * l
-                                                                                                    *
-                                                                                                    * do
-                                                                                                    * n
-                                                                                                    * '
-                                                                                                    * t
-                                                                                                    *
-                                                                                                    * ha
-                                                                                                    * v
-                                                                                                    * e
-                                                                                                    *
-                                                                                                    * an
-                                                                                                    * y
-                                                                                                    * t
-                                                                                                    * h
-                                                                                                    * i
-                                                                                                    * n
-                                                                                                    * g
-                                                                                                    *
-                                                                                                    * to
-                                                                                                    *
-                                                                                                    * ma
-                                                                                                    * t
-                                                                                                    * c
-                                                                                                    * h
-                                                                                                    *
-                                                                                                    * we
-                                                                                                    *
-                                                                                                    * ha
-                                                                                                    * v
-                                                                                                    * e
-                                                                                                    *
-                                                                                                    * to
-                                                                                                    *
-                                                                                                    * fa
-                                                                                                    * b
-                                                                                                    * r
-                                                                                                    * i
-                                                                                                    * c
-                                                                                                    * a
-                                                                                                    * t
-                                                                                                    * e
-                                                                                                    *
-                                                                                                    * so
-                                                                                                    * m
-                                                                                                    * e
-                                                                                                    *
-                                                                                                    * so
-                                                                                                    * r
-                                                                                                    * t
-                                                                                                    *
-                                                                                                    * of
-                                                                                                    *
-                                                                                                    * de
-                                                                                                    * f
-                                                                                                    * a
-                                                                                                    * u
-                                                                                                    * l
-                                                                                                    * t
-                                                                                                    *
-                                                                                                    * li
-                                                                                                    * s
-                                                                                                    * t
-                                                                                                    * .
-                                                                                                    *
-                                                                                                    * If
-                                                                                                    *
-                                                                                                    * we
-                                                                                                    *
-                                                                                                    * we
-                                                                                                    * r
-                                                                                                    * e
-                                                                                                    *
-                                                                                                    * to
-                                                                                                    *
-                                                                                                    * ju
-                                                                                                    * s
-                                                                                                    * t
-                                                                                                    *
-                                                                                                    * re
-                                                                                                    * t
-                                                                                                    * u
-                                                                                                    * r
-                                                                                                    * n
-                                                                                                    *
-                                                                                                    * NU
-                                                                                                    * L
-                                                                                                    * L
-                                                                                                    * ,
-                                                                                                    *
-                                                                                                    * re
-                                                                                                    * a
-                                                                                                    * d
-                                                                                                    * l
-                                                                                                    * i
-                                                                                                    * n
-                                                                                                    * e
-                                                                                                    *
-                                                                                                    * au
-                                                                                                    * t
-                                                                                                    * o
-                                                                                                    * m
-                                                                                                    * a
-                                                                                                    * t
-                                                                                                    * i
-                                                                                                    * c
-                                                                                                    * a
-                                                                                                    * l
-                                                                                                    * l
-                                                                                                    * y
-                                                                                                    *
-                                                                                                    * at
-                                                                                                    * t
-                                                                                                    * e
-                                                                                                    * m
-                                                                                                    * p
-                                                                                                    * t
-                                                                                                    * s
-                                                                                                    *
-                                                                                                    * fi
-                                                                                                    * l
-                                                                                                    * e
-                                                                                                    * n
-                                                                                                    * a
-                                                                                                    * m
-                                                                                                    * e
-                                                                                                    *
-                                                                                                    * co
-                                                                                                    * m
-                                                                                                    * p
-                                                                                                    * l
-                                                                                                    * e
-                                                                                                    * t
-                                                                                                    * i
-                                                                                                    * o
-                                                                                                    * n
-                                                                                                    * ,
-                                                                                                    *
-                                                                                                    * an
-                                                                                                    * d
-                                                                                                    *
-                                                                                                    * th
-                                                                                                    * a
-                                                                                                    * t
-                                                                                                    * '
-                                                                                                    * s
-                                                                                                    *
-                                                                                                    * us
-                                                                                                    * u
-                                                                                                    * a
-                                                                                                    * l
-                                                                                                    * l
-                                                                                                    * y
-                                                                                                    *
-                                                                                                    * no
-                                                                                                    *
-                                                                                                    * go
-                                                                                                    * o
-                                                                                                    * d
-                                                                                                    * .
-                                                                                                    * */
-                                                                                                   if (matches == NULL)
-                                                                                                   {
-                                                                                                       COMPLETE_WITH_CONST("");
+   /*
+    * If we still don't have anything to match we have to fabricate some sort
+    * of default list. If we were to just return NULL, readline automatically
+    * attempts filename completion, and that's usually no good.
+    */
+   if (matches == NULL)
+   {
+       COMPLETE_WITH_CONST("");
 #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
-                                                                                                       rl_completion_append_character = '\0';
+       rl_completion_append_character = '\0';
 #endif
-                                                                                                   }
-
-                                                                                                   /*
-                                                                                                    * f
-                                                                                                    * r
-                                                                                                    * e
-                                                                                                    * e
-                                                                                                    *
-                                                                                                    * st
-                                                                                                    * o
-                                                                                                    * r
-                                                                                                    * a
-                                                                                                    * g
-                                                                                                    * e
-                                                                                                    *
-                                                                                                    */
-                                                                                                   free(prev_wd);
-                                                                                                   free(prev2_wd);
-                                                                                                   free(prev3_wd);
-                                                                                                   free(prev4_wd);
-                                                                                                   free(prev5_wd);
-
-                                                                                                   /*
-                                                                                                    * R
-                                                                                                    * e
-                                                                                                    * t
-                                                                                                    * u
-                                                                                                    * r
-                                                                                                    * n
-                                                                                                    *
-                                                                                                    * ou
-                                                                                                    * r
-                                                                                                    *
-                                                                                                    * Gr
-                                                                                                    * a
-                                                                                                    * n
-                                                                                                    * d
-                                                                                                    *
-                                                                                                    * Li
-                                                                                                    * s
-                                                                                                    * t
-                                                                                                    *
-                                                                                                    * O'
-                                                                                                    *
-                                                                                                    * Ma
-                                                                                                    * t
-                                                                                                    * c
-                                                                                                    * h
-                                                                                                    * e
-                                                                                                    * s
-                                                                                                    *
-                                                                                                    */
-                                                                                                   return matches;
-                                                                                                   }
+   }
+
+   /* free storage */
+   free(prev_wd);
+   free(prev2_wd);
+   free(prev3_wd);
+   free(prev4_wd);
+   free(prev5_wd);
+
+   /* Return our Grand List O' Matches */
+   return matches;
+}
 
 
 
@@ -2177,152 +1847,43 @@ psql_completion(char *text, int start, int end)
 /* This one gives you one from a list of things you can put after CREATE or DROP
    as defined above.
 */
-                                                                                                   static char *
-                                                                                                               create_command_generator(const char *text, int state)
-                                                                                                   {
-                                                                                                       static int  list_index,
-                                                                                                                   string_length;
-                                                                                                       const char *name;
-
-                                                                                                       /*
-                                                                                                        * I
-                                                                                                        * f
-                                                                                                        *
-                                                                                                        * th
-                                                                                                        * i
-                                                                                                        * s
-                                                                                                        *
-                                                                                                        * is
-                                                                                                        *
-                                                                                                        * th
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * fi
-                                                                                                        * r
-                                                                                                        * s
-                                                                                                        * t
-                                                                                                        *
-                                                                                                        * ti
-                                                                                                        * m
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * fo
-                                                                                                        * r
-                                                                                                        *
-                                                                                                        * th
-                                                                                                        * i
-                                                                                                        * s
-                                                                                                        *
-                                                                                                        * co
-                                                                                                        * m
-                                                                                                        * p
-                                                                                                        * l
-                                                                                                        * e
-                                                                                                        * t
-                                                                                                        * i
-                                                                                                        * o
-                                                                                                        * n
-                                                                                                        * ,
-                                                                                                        *
-                                                                                                        * in
-                                                                                                        * i
-                                                                                                        * t
-                                                                                                        *
-                                                                                                        * so
-                                                                                                        * m
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * va
-                                                                                                        * l
-                                                                                                        * u
-                                                                                                        * e
-                                                                                                        * s
-                                                                                                        *
-                                                                                                        */
-                                                                                                       if (state == 0)
-                                                                                                       {
-                                                                                                           list_index = 0;
-                                                                                                           string_length = strlen(text);
-                                                                                                       }
-
-                                                                                                       /*
-                                                                                                        * f
-                                                                                                        * i
-                                                                                                        * n
-                                                                                                        * d
-                                                                                                        *
-                                                                                                        * so
-                                                                                                        * m
-                                                                                                        * e
-                                                                                                        * t
-                                                                                                        * h
-                                                                                                        * i
-                                                                                                        * n
-                                                                                                        * g
-                                                                                                        *
-                                                                                                        * th
-                                                                                                        * a
-                                                                                                        * t
-                                                                                                        *
-                                                                                                        * ma
-                                                                                                        * t
-                                                                                                        * c
-                                                                                                        * h
-                                                                                                        * e
-                                                                                                        * s
-                                                                                                        *
-                                                                                                        */
-                                                                                                       while ((name = words_after_create[list_index++].name))
-                                                                                                           if (pg_strncasecmp(name, text, string_length) == 0)
-                                                                                                               return pg_strdup(name);
-
-                                                                                                       /*
-                                                                                                        * i
-                                                                                                        * f
-                                                                                                        *
-                                                                                                        * no
-                                                                                                        * t
-                                                                                                        * h
-                                                                                                        * i
-                                                                                                        * n
-                                                                                                        * g
-                                                                                                        *
-                                                                                                        * ma
-                                                                                                        * t
-                                                                                                        * c
-                                                                                                        * h
-                                                                                                        * e
-                                                                                                        * s
-                                                                                                        * ,
-                                                                                                        *
-                                                                                                        * re
-                                                                                                        * t
-                                                                                                        * u
-                                                                                                        * r
-                                                                                                        * n
-                                                                                                        *
-                                                                                                        * NU
-                                                                                                        * L
-                                                                                                        * L
-                                                                                                        *
-                                                                                                        */
-                                                                                                       return NULL;
-                                                                                                   }
+static char *
+create_command_generator(const char *text, int state)
+{
+   static int  list_index,
+               string_length;
+   const char *name;
+
+   /* If this is the first time for this completion, init some values */
+   if (state == 0)
+   {
+       list_index = 0;
+       string_length = strlen(text);
+   }
+
+   /* find something that matches */
+   while ((name = words_after_create[list_index++].name))
+       if (pg_strncasecmp(name, text, string_length) == 0)
+           return pg_strdup(name);
+
+   /* if nothing matches, return NULL */
+   return NULL;
+}
 
 
 /* The following two functions are wrappers for _complete_from_query */
 
-                                                                                                   static char *
-                                                                                                               complete_from_query(const char *text, int state)
-                                                                                                   {
-                                                                                                       return _complete_from_query(0, text, state);
-                                                                                                   }
+static char *
+complete_from_query(const char *text, int state)
+{
+   return _complete_from_query(0, text, state);
+}
 
-                                                                                                   static char *
-                                                                                                               complete_from_schema_query(const char *text, int state)
-                                                                                                   {
-                                                                                                       return _complete_from_query(1, text, state);
-                                                                                                   }
+static char *
+complete_from_schema_query(const char *text, int state)
+{
+   return _complete_from_query(1, text, state);
+}
 
 
 /* This creates a list of matching things, according to a query pointed to
@@ -2344,1308 +1905,228 @@ psql_completion(char *text, int start, int end)
    See top of file for examples of both kinds of query.
 */
 
-                                                                                                   static char *
-                                                                                                               _complete_from_query(int is_schema_query, const char *text, int state)
-                                                                                                   {
-                                                                                                       static int  list_index,
-                                                                                                                   string_length;
-                                                                                                       static PGresult *result = NULL;
-
-                                                                                                       /*
-                                                                                                        *
-                                                                                                        * If
-                                                                                                        *
-                                                                                                        * th
-                                                                                                        * i
-                                                                                                        * s
-                                                                                                        *
-                                                                                                        * is
-                                                                                                        *
-                                                                                                        * th
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * fi
-                                                                                                        * r
-                                                                                                        * s
-                                                                                                        * t
-                                                                                                        *
-                                                                                                        * ti
-                                                                                                        * m
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * fo
-                                                                                                        * r
-                                                                                                        *
-                                                                                                        * th
-                                                                                                        * i
-                                                                                                        * s
-                                                                                                        *
-                                                                                                        * co
-                                                                                                        * m
-                                                                                                        * p
-                                                                                                        * l
-                                                                                                        * e
-                                                                                                        * t
-                                                                                                        * i
-                                                                                                        * o
-                                                                                                        * n
-                                                                                                        * ,
-                                                                                                        *
-                                                                                                        * we
-                                                                                                        *
-                                                                                                        * fe
-                                                                                                        * t
-                                                                                                        * c
-                                                                                                        * h
-                                                                                                        *
-                                                                                                        * a
-                                                                                                        * li
-                                                                                                        * s
-                                                                                                        * t
-                                                                                                        *
-                                                                                                        * of
-                                                                                                        *
-                                                                                                        * ou
-                                                                                                        * r
-                                                                                                        *
-                                                                                                        * "t
-                                                                                                        * h
-                                                                                                        * i
-                                                                                                        * n
-                                                                                                        * g
-                                                                                                        * s
-                                                                                                        * "
-                                                                                                        *
-                                                                                                        * fr
-                                                                                                        * o
-                                                                                                        * m
-                                                                                                        *
-                                                                                                        * th
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * ba
-                                                                                                        * c
-                                                                                                        * k
-                                                                                                        * e
-                                                                                                        * n
-                                                                                                        * d
-                                                                                                        * .
-                                                                                                        * */
-                                                                                                       if (state == 0)
-                                                                                                       {
-                                                                                                           PQExpBufferData query_buffer;
-                                                                                                           char       *e_text;
-                                                                                                           char       *e_info_charp;
-
-                                                                                                           list_index = 0;
-                                                                                                           string_length = strlen(text);
-
-                                                                                                           /*
-                                                                                                            * F
-                                                                                                            * r
-                                                                                                            * e
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * an
-                                                                                                            * y
-                                                                                                            *
-                                                                                                            * pr
-                                                                                                            * i
-                                                                                                            * o
-                                                                                                            * r
-                                                                                                            *
-                                                                                                            * re
-                                                                                                            * s
-                                                                                                            * u
-                                                                                                            * l
-                                                                                                            * t
-                                                                                                            *
-                                                                                                            */
-                                                                                                           PQclear(result);
-                                                                                                           result = NULL;
-
-                                                                                                           /*
-                                                                                                            * S
-                                                                                                            * e
-                                                                                                            * t
-                                                                                                            *
-                                                                                                            * up
-                                                                                                            *
-                                                                                                            * su
-                                                                                                            * i
-                                                                                                            * t
-                                                                                                            * a
-                                                                                                            * b
-                                                                                                            * l
-                                                                                                            * y
-                                                                                                            * -
-                                                                                                            * e
-                                                                                                            * s
-                                                                                                            * c
-                                                                                                            * a
-                                                                                                            * p
-                                                                                                            * e
-                                                                                                            * d
-                                                                                                            *
-                                                                                                            * co
-                                                                                                            * p
-                                                                                                            * i
-                                                                                                            * e
-                                                                                                            * s
-                                                                                                            *
-                                                                                                            * of
-                                                                                                            *
-                                                                                                            * te
-                                                                                                            * x
-                                                                                                            * t
-                                                                                                            * u
-                                                                                                            * a
-                                                                                                            * l
-                                                                                                            *
-                                                                                                            * in
-                                                                                                            * p
-                                                                                                            * u
-                                                                                                            * t
-                                                                                                            * s
-                                                                                                            *
-                                                                                                            */
-                                                                                                           e_text = pg_malloc(string_length * 2 + 1);
-                                                                                                           PQescapeString(e_text, text, string_length);
-
-                                                                                                           if (completion_info_charp)
-                                                                                                           {
-                                                                                                               size_t      charp_len;
-
-                                                                                                               charp_len = strlen(completion_info_charp);
-                                                                                                               e_info_charp = pg_malloc(charp_len * 2 + 1);
-                                                                                                               PQescapeString(e_info_charp, completion_info_charp,
-                                                                                                                              charp_len);
-                                                                                                           }
-                                                                                                           else
-                                                                                                               e_info_charp = NULL;
-
-                                                                                                           initPQExpBuffer(&query_buffer);
-
-                                                                                                           if (is_schema_query)
-                                                                                                           {
-                                                                                                               /*
-                                                                                                                * c
-                                                                                                                * o
-                                                                                                                * m
-                                                                                                                * p
-                                                                                                                * l
-                                                                                                                * e
-                                                                                                                * t
-                                                                                                                * i
-                                                                                                                * o
-                                                                                                                * n
-                                                                                                                * _
-                                                                                                                * s
-                                                                                                                * q
-                                                                                                                * u
-                                                                                                                * e
-                                                                                                                * r
-                                                                                                                * y
-                                                                                                                *
-                                                                                                                * gi
-                                                                                                                * v
-                                                                                                                * e
-                                                                                                                * s
-                                                                                                                *
-                                                                                                                * us
-                                                                                                                *
-                                                                                                                * th
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * pi
-                                                                                                                * e
-                                                                                                                * c
-                                                                                                                * e
-                                                                                                                * s
-                                                                                                                *
-                                                                                                                * to
-                                                                                                                *
-                                                                                                                * as
-                                                                                                                * s
-                                                                                                                * e
-                                                                                                                * m
-                                                                                                                * b
-                                                                                                                * l
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                */
-                                                                                                               const char *qualresult = completion_squery->qualresult;
-
-                                                                                                               if (qualresult == NULL)
-                                                                                                                   qualresult = completion_squery->result;
-
-                                                                                                               /*
-                                                                                                                * G
-                                                                                                                * e
-                                                                                                                * t
-                                                                                                                *
-                                                                                                                * un
-                                                                                                                * q
-                                                                                                                * u
-                                                                                                                * a
-                                                                                                                * l
-                                                                                                                * i
-                                                                                                                * f
-                                                                                                                * i
-                                                                                                                * e
-                                                                                                                * d
-                                                                                                                *
-                                                                                                                * na
-                                                                                                                * m
-                                                                                                                * e
-                                                                                                                * s
-                                                                                                                *
-                                                                                                                * ma
-                                                                                                                * t
-                                                                                                                * c
-                                                                                                                * h
-                                                                                                                * i
-                                                                                                                * n
-                                                                                                                * g
-                                                                                                                *
-                                                                                                                * th
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * in
-                                                                                                                * p
-                                                                                                                * u
-                                                                                                                * t
-                                                                                                                * -
-                                                                                                                * s
-                                                                                                                * o
-                                                                                                                * -
-                                                                                                                * f
-                                                                                                                * a
-                                                                                                                * r
-                                                                                                                *
-                                                                                                                */
-                                                                                                               appendPQExpBuffer(&query_buffer, "SELECT %s FROM %s WHERE ",
-                                                                                                                                 completion_squery->result,
-                                                                                                                                 completion_squery->catname);
-                                                                                                               if (completion_squery->selcondition)
-                                                                                                                   appendPQExpBuffer(&query_buffer, "%s AND ",
-                                                                                                                                     completion_squery->selcondition);
-                                                                                                               appendPQExpBuffer(&query_buffer, "substring(%s,1,%d)='%s'",
-                                                                                                                                 completion_squery->result,
-                                                                                                                                 string_length, e_text);
-                                                                                                               appendPQExpBuffer(&query_buffer, " AND %s",
-                                                                                                                                 completion_squery->viscondition);
-
-                                                                                                               /*
-                                                                                                                *
-                                                                                                                * Wh
-                                                                                                                * e
-                                                                                                                * n
-                                                                                                                *
-                                                                                                                * fe
-                                                                                                                * t
-                                                                                                                * c
-                                                                                                                * h
-                                                                                                                * i
-                                                                                                                * n
-                                                                                                                * g
-                                                                                                                *
-                                                                                                                * re
-                                                                                                                * l
-                                                                                                                * a
-                                                                                                                * t
-                                                                                                                * i
-                                                                                                                * o
-                                                                                                                * n
-                                                                                                                *
-                                                                                                                * na
-                                                                                                                * m
-                                                                                                                * e
-                                                                                                                * s
-                                                                                                                * ,
-                                                                                                                *
-                                                                                                                * su
-                                                                                                                * p
-                                                                                                                * p
-                                                                                                                * r
-                                                                                                                * e
-                                                                                                                * s
-                                                                                                                * s
-                                                                                                                *
-                                                                                                                * sy
-                                                                                                                * s
-                                                                                                                * t
-                                                                                                                * e
-                                                                                                                * m
-                                                                                                                *
-                                                                                                                * ca
-                                                                                                                * t
-                                                                                                                * a
-                                                                                                                * l
-                                                                                                                * o
-                                                                                                                * g
-                                                                                                                * s
-                                                                                                                *
-                                                                                                                * un
-                                                                                                                * l
-                                                                                                                * e
-                                                                                                                * s
-                                                                                                                * s
-                                                                                                                *
-                                                                                                                * th
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * in
-                                                                                                                * p
-                                                                                                                * u
-                                                                                                                * t
-                                                                                                                * -
-                                                                                                                * s
-                                                                                                                * o
-                                                                                                                * -
-                                                                                                                * f
-                                                                                                                * a
-                                                                                                                * r
-                                                                                                                *
-                                                                                                                * be
-                                                                                                                * g
-                                                                                                                * i
-                                                                                                                * n
-                                                                                                                * s
-                                                                                                                *
-                                                                                                                * wi
-                                                                                                                * t
-                                                                                                                * h
-                                                                                                                *
-                                                                                                                * "p
-                                                                                                                * g
-                                                                                                                * _
-                                                                                                                * "
-                                                                                                                * .
-                                                                                                                *
-                                                                                                                * Th
-                                                                                                                * i
-                                                                                                                * s
-                                                                                                                *
-                                                                                                                * is
-                                                                                                                *
-                                                                                                                * a
-                                                                                                                * co
-                                                                                                                * m
-                                                                                                                * p
-                                                                                                                * r
-                                                                                                                * o
-                                                                                                                * m
-                                                                                                                * i
-                                                                                                                * s
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * be
-                                                                                                                * t
-                                                                                                                * w
-                                                                                                                * e
-                                                                                                                * e
-                                                                                                                * n
-                                                                                                                *
-                                                                                                                * no
-                                                                                                                * t
-                                                                                                                *
-                                                                                                                * of
-                                                                                                                * f
-                                                                                                                * e
-                                                                                                                * r
-                                                                                                                * i
-                                                                                                                * n
-                                                                                                                * g
-                                                                                                                *
-                                                                                                                * sy
-                                                                                                                * s
-                                                                                                                * t
-                                                                                                                * e
-                                                                                                                * m
-                                                                                                                *
-                                                                                                                * ca
-                                                                                                                * t
-                                                                                                                * a
-                                                                                                                * l
-                                                                                                                * o
-                                                                                                                * g
-                                                                                                                * s
-                                                                                                                *
-                                                                                                                * fo
-                                                                                                                * r
-                                                                                                                *
-                                                                                                                * co
-                                                                                                                * m
-                                                                                                                * p
-                                                                                                                * l
-                                                                                                                * e
-                                                                                                                * t
-                                                                                                                * i
-                                                                                                                * o
-                                                                                                                * n
-                                                                                                                *
-                                                                                                                * at
-                                                                                                                *
-                                                                                                                * al
-                                                                                                                * l
-                                                                                                                * ,
-                                                                                                                *
-                                                                                                                * an
-                                                                                                                * d
-                                                                                                                *
-                                                                                                                * ha
-                                                                                                                * v
-                                                                                                                * i
-                                                                                                                * n
-                                                                                                                * g
-                                                                                                                *
-                                                                                                                * th
-                                                                                                                * e
-                                                                                                                * m
-                                                                                                                *
-                                                                                                                * sw
-                                                                                                                * a
-                                                                                                                * m
-                                                                                                                * p
-                                                                                                                *
-                                                                                                                * th
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * re
-                                                                                                                * s
-                                                                                                                * u
-                                                                                                                * l
-                                                                                                                * t
-                                                                                                                *
-                                                                                                                * wh
-                                                                                                                * e
-                                                                                                                * n
-                                                                                                                *
-                                                                                                                * th
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * in
-                                                                                                                * p
-                                                                                                                * u
-                                                                                                                * t
-                                                                                                                *
-                                                                                                                * is
-                                                                                                                *
-                                                                                                                * ju
-                                                                                                                * s
-                                                                                                                * t
-                                                                                                                *
-                                                                                                                * "p
-                                                                                                                * "
-                                                                                                                * .
-                                                                                                                * */
-                                                                                                               if (strcmp(completion_squery->catname,
-                                                                                                                          "pg_catalog.pg_class c") == 0 &&
-                                                                                                                   strncmp(text, "pg_", 3) !=0)
-                                                                                                               {
-                                                                                                                   appendPQExpBuffer(&query_buffer,
-                                                                                                                                     " AND c.relnamespace <> (SELECT oid FROM"
-                                                                                                                                     " pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')");
-                                                                                                               }
-
-                                                                                                               /*
-                                                                                                                *
-                                                                                                                * Ad
-                                                                                                                * d
-                                                                                                                *
-                                                                                                                * in
-                                                                                                                *
-                                                                                                                * ma
-                                                                                                                * t
-                                                                                                                * c
-                                                                                                                * h
-                                                                                                                * i
-                                                                                                                * n
-                                                                                                                * g
-                                                                                                                *
-                                                                                                                * sc
-                                                                                                                * h
-                                                                                                                * e
-                                                                                                                * m
-                                                                                                                * a
-                                                                                                                *
-                                                                                                                * na
-                                                                                                                * m
-                                                                                                                * e
-                                                                                                                * s
-                                                                                                                * ,
-                                                                                                                *
-                                                                                                                * bu
-                                                                                                                * t
-                                                                                                                *
-                                                                                                                * on
-                                                                                                                * l
-                                                                                                                * y
-                                                                                                                *
-                                                                                                                * if
-                                                                                                                *
-                                                                                                                * th
-                                                                                                                * e
-                                                                                                                * r
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * is
-                                                                                                                *
-                                                                                                                * mo
-                                                                                                                * r
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * th
-                                                                                                                * a
-                                                                                                                * n
-                                                                                                                *
-                                                                                                                * on
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * po
-                                                                                                                * t
-                                                                                                                * e
-                                                                                                                * n
-                                                                                                                * t
-                                                                                                                * i
-                                                                                                                * a
-                                                                                                                * l
-                                                                                                                *
-                                                                                                                * ma
-                                                                                                                * t
-                                                                                                                * c
-                                                                                                                * h
-                                                                                                                *
-                                                                                                                * am
-                                                                                                                * o
-                                                                                                                * n
-                                                                                                                * g
-                                                                                                                *
-                                                                                                                * sc
-                                                                                                                * h
-                                                                                                                * e
-                                                                                                                * m
-                                                                                                                * a
-                                                                                                                *
-                                                                                                                * na
-                                                                                                                * m
-                                                                                                                * e
-                                                                                                                * s
-                                                                                                                * .
-                                                                                                                * */
-                                                                                                               appendPQExpBuffer(&query_buffer, "\nUNION\n"
-                                                                                                                                 "SELECT pg_catalog.quote_ident(n.nspname) || '.' "
-                                                                                                                                 "FROM pg_catalog.pg_namespace n "
-                                                                                                                                 "WHERE substring(pg_catalog.quote_ident(n.nspname) || '.',1,%d)='%s'",
-                                                                                                                                 string_length, e_text);
-                                                                                                               appendPQExpBuffer(&query_buffer,
-                                                                                                                                 " AND (SELECT pg_catalog.count(*)"
-                                                                                                                                 " FROM pg_catalog.pg_namespace"
-                                                                                                                                 " WHERE substring(pg_catalog.quote_ident(nspname) || '.',1,%d) ="
-                                                                                                                                 " substring('%s',1,pg_catalog.length(pg_catalog.quote_ident(nspname))+1)) > 1",
-                                                                                                                                 string_length, e_text);
-
-                                                                                                               /*
-                                                                                                                *
-                                                                                                                * Ad
-                                                                                                                * d
-                                                                                                                *
-                                                                                                                * in
-                                                                                                                *
-                                                                                                                * ma
-                                                                                                                * t
-                                                                                                                * c
-                                                                                                                * h
-                                                                                                                * i
-                                                                                                                * n
-                                                                                                                * g
-                                                                                                                *
-                                                                                                                * qu
-                                                                                                                * a
-                                                                                                                * l
-                                                                                                                * i
-                                                                                                                * f
-                                                                                                                * i
-                                                                                                                * e
-                                                                                                                * d
-                                                                                                                *
-                                                                                                                * na
-                                                                                                                * m
-                                                                                                                * e
-                                                                                                                * s
-                                                                                                                * ,
-                                                                                                                *
-                                                                                                                * bu
-                                                                                                                * t
-                                                                                                                *
-                                                                                                                * on
-                                                                                                                * l
-                                                                                                                * y
-                                                                                                                *
-                                                                                                                * if
-                                                                                                                *
-                                                                                                                * th
-                                                                                                                * e
-                                                                                                                * r
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * is
-                                                                                                                *
-                                                                                                                * ex
-                                                                                                                * a
-                                                                                                                * c
-                                                                                                                * t
-                                                                                                                * l
-                                                                                                                * y
-                                                                                                                *
-                                                                                                                * on
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * sc
-                                                                                                                * h
-                                                                                                                * e
-                                                                                                                * m
-                                                                                                                * a
-                                                                                                                *
-                                                                                                                * ma
-                                                                                                                * t
-                                                                                                                * c
-                                                                                                                * h
-                                                                                                                * i
-                                                                                                                * n
-                                                                                                                * g
-                                                                                                                *
-                                                                                                                * th
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * in
-                                                                                                                * p
-                                                                                                                * u
-                                                                                                                * t
-                                                                                                                * -
-                                                                                                                * s
-                                                                                                                * o
-                                                                                                                * -
-                                                                                                                * f
-                                                                                                                * a
-                                                                                                                * r
-                                                                                                                * .
-                                                                                                                * */
-                                                                                                               appendPQExpBuffer(&query_buffer, "\nUNION\n"
-                                                                                                                                 "SELECT pg_catalog.quote_ident(n.nspname) || '.' || %s "
-                                                                                                                                 "FROM %s, pg_catalog.pg_namespace n "
-                                                                                                                                 "WHERE %s = n.oid AND ",
-                                                                                                                                 qualresult,
-                                                                                                                                 completion_squery->catname,
-                                                                                                                                 completion_squery->namespace);
-                                                                                                               if (completion_squery->selcondition)
-                                                                                                                   appendPQExpBuffer(&query_buffer, "%s AND ",
-                                                                                                                                     completion_squery->selcondition);
-                                                                                                               appendPQExpBuffer(&query_buffer, "substring(pg_catalog.quote_ident(n.nspname) || '.' || %s,1,%d)='%s'",
-                                                                                                                                 qualresult,
-                                                                                                                                 string_length, e_text);
-
-                                                                                                               /*
-                                                                                                                *
-                                                                                                                * Th
-                                                                                                                * i
-                                                                                                                * s
-                                                                                                                *
-                                                                                                                * co
-                                                                                                                * n
-                                                                                                                * d
-                                                                                                                * i
-                                                                                                                * t
-                                                                                                                * i
-                                                                                                                * o
-                                                                                                                * n
-                                                                                                                *
-                                                                                                                * ex
-                                                                                                                * p
-                                                                                                                * l
-                                                                                                                * o
-                                                                                                                * i
-                                                                                                                * t
-                                                                                                                * s
-                                                                                                                *
-                                                                                                                * th
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * si
-                                                                                                                * n
-                                                                                                                * g
-                                                                                                                * l
-                                                                                                                * e
-                                                                                                                * -
-                                                                                                                * m
-                                                                                                                * a
-                                                                                                                * t
-                                                                                                                * c
-                                                                                                                * h
-                                                                                                                * i
-                                                                                                                * n
-                                                                                                                * g
-                                                                                                                * -
-                                                                                                                * s
-                                                                                                                * c
-                                                                                                                * h
-                                                                                                                * e
-                                                                                                                * m
-                                                                                                                * a
-                                                                                                                *
-                                                                                                                * ru
-                                                                                                                * l
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * to
-                                                                                                                *
-                                                                                                                * sp
-                                                                                                                * e
-                                                                                                                * e
-                                                                                                                * d
-                                                                                                                *
-                                                                                                                * up
-                                                                                                                *
-                                                                                                                * th
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * qu
-                                                                                                                * e
-                                                                                                                * r
-                                                                                                                * y
-                                                                                                                * */
-                                                                                                               appendPQExpBuffer(&query_buffer,
-                                                                                                                                 " AND substring(pg_catalog.quote_ident(n.nspname) || '.',1,%d) ="
-                                                                                                                                 " substring('%s',1,pg_catalog.length(pg_catalog.quote_ident(n.nspname))+1)",
-                                                                                                                                 string_length, e_text);
-                                                                                                               appendPQExpBuffer(&query_buffer,
-                                                                                                                                 " AND (SELECT pg_catalog.count(*)"
-                                                                                                                                 " FROM pg_catalog.pg_namespace"
-                                                                                                                                 " WHERE substring(pg_catalog.quote_ident(nspname) || '.',1,%d) ="
-                                                                                                                                 " substring('%s',1,pg_catalog.length(pg_catalog.quote_ident(nspname))+1)) = 1",
-                                                                                                                                 string_length, e_text);
-
-                                                                                                               /*
-                                                                                                                * I
-                                                                                                                * f
-                                                                                                                *
-                                                                                                                * an
-                                                                                                                *
-                                                                                                                * ad
-                                                                                                                * d
-                                                                                                                * o
-                                                                                                                * n
-                                                                                                                *
-                                                                                                                * qu
-                                                                                                                * e
-                                                                                                                * r
-                                                                                                                * y
-                                                                                                                *
-                                                                                                                * wa
-                                                                                                                * s
-                                                                                                                *
-                                                                                                                * pr
-                                                                                                                * o
-                                                                                                                * v
-                                                                                                                * i
-                                                                                                                * d
-                                                                                                                * e
-                                                                                                                * d
-                                                                                                                * ,
-                                                                                                                *
-                                                                                                                * us
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * it
-                                                                                                                *
-                                                                                                                */
-                                                                                                               if (completion_charp)
-                                                                                                                   appendPQExpBuffer(&query_buffer, "\n%s", completion_charp);
-                                                                                                           }
-                                                                                                           else
-                                                                                                           {
-                                                                                                               /*
-                                                                                                                * c
-                                                                                                                * o
-                                                                                                                * m
-                                                                                                                * p
-                                                                                                                * l
-                                                                                                                * e
-                                                                                                                * t
-                                                                                                                * i
-                                                                                                                * o
-                                                                                                                * n
-                                                                                                                * _
-                                                                                                                * c
-                                                                                                                * h
-                                                                                                                * a
-                                                                                                                * r
-                                                                                                                * p
-                                                                                                                *
-                                                                                                                * is
-                                                                                                                *
-                                                                                                                * an
-                                                                                                                *
-                                                                                                                * sp
-                                                                                                                * r
-                                                                                                                * i
-                                                                                                                * n
-                                                                                                                * t
-                                                                                                                * f
-                                                                                                                * -
-                                                                                                                * s
-                                                                                                                * t
-                                                                                                                * y
-                                                                                                                * l
-                                                                                                                * e
-                                                                                                                *
-                                                                                                                * fo
-                                                                                                                * r
-                                                                                                                * m
-                                                                                                                * a
-                                                                                                                * t
-                                                                                                                *
-                                                                                                                * st
-                                                                                                                * r
-                                                                                                                * i
-                                                                                                                * n
-                                                                                                                * g
-                                                                                                                *
-                                                                                                                */
-                                                                                                               appendPQExpBuffer(&query_buffer, completion_charp,
-                                                                                                                                 string_length, e_text, e_info_charp);
-                                                                                                           }
-
-                                                                                                           /*
-                                                                                                            * L
-                                                                                                            * i
-                                                                                                            * m
-                                                                                                            * i
-                                                                                                            * t
-                                                                                                            *
-                                                                                                            * th
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * nu
-                                                                                                            * m
-                                                                                                            * b
-                                                                                                            * e
-                                                                                                            * r
-                                                                                                            *
-                                                                                                            * of
-                                                                                                            *
-                                                                                                            * re
-                                                                                                            * c
-                                                                                                            * o
-                                                                                                            * r
-                                                                                                            * d
-                                                                                                            * s
-                                                                                                            *
-                                                                                                            * in
-                                                                                                            *
-                                                                                                            * th
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * re
-                                                                                                            * s
-                                                                                                            * u
-                                                                                                            * l
-                                                                                                            * t
-                                                                                                            *
-                                                                                                            */
-                                                                                                           appendPQExpBuffer(&query_buffer, "\nLIMIT %d",
-                                                                                                                             completion_max_records);
-
-                                                                                                           result = exec_query(query_buffer.data);
-
-                                                                                                           termPQExpBuffer(&query_buffer);
-                                                                                                           free(e_text);
-                                                                                                           if (e_info_charp)
-                                                                                                               free(e_info_charp);
-                                                                                                       }
-
-                                                                                                       /*
-                                                                                                        * F
-                                                                                                        * i
-                                                                                                        * n
-                                                                                                        * d
-                                                                                                        *
-                                                                                                        * so
-                                                                                                        * m
-                                                                                                        * e
-                                                                                                        * t
-                                                                                                        * h
-                                                                                                        * i
-                                                                                                        * n
-                                                                                                        * g
-                                                                                                        *
-                                                                                                        * th
-                                                                                                        * a
-                                                                                                        * t
-                                                                                                        *
-                                                                                                        * ma
-                                                                                                        * t
-                                                                                                        * c
-                                                                                                        * h
-                                                                                                        * e
-                                                                                                        * s
-                                                                                                        *
-                                                                                                        */
-                                                                                                       if (result && PQresultStatus(result) == PGRES_TUPLES_OK)
-                                                                                                       {
-                                                                                                           const char *item;
-
-                                                                                                           while (list_index < PQntuples(result) &&
-                                                                                                                  (item = PQgetvalue(result, list_index++, 0)))
-                                                                                                               if (pg_strncasecmp(text, item, string_length) == 0)
-                                                                                                                   return pg_strdup(item);
-                                                                                                       }
-
-                                                                                                       /*
-                                                                                                        * I
-                                                                                                        * f
-                                                                                                        *
-                                                                                                        * no
-                                                                                                        * t
-                                                                                                        * h
-                                                                                                        * i
-                                                                                                        * n
-                                                                                                        * g
-                                                                                                        *
-                                                                                                        * ma
-                                                                                                        * t
-                                                                                                        * c
-                                                                                                        * h
-                                                                                                        * e
-                                                                                                        * s
-                                                                                                        * ,
-                                                                                                        *
-                                                                                                        * fr
-                                                                                                        * e
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * th
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * db
-                                                                                                        *
-                                                                                                        * st
-                                                                                                        * r
-                                                                                                        * u
-                                                                                                        * c
-                                                                                                        * t
-                                                                                                        * u
-                                                                                                        * r
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * an
-                                                                                                        * d
-                                                                                                        *
-                                                                                                        * re
-                                                                                                        * t
-                                                                                                        * u
-                                                                                                        * r
-                                                                                                        * n
-                                                                                                        *
-                                                                                                        * nu
-                                                                                                        * l
-                                                                                                        * l
-                                                                                                        *
-                                                                                                        */
-                                                                                                       PQclear(result);
-                                                                                                       result = NULL;
-                                                                                                       return NULL;
-                                                                                                   }
+static char *
+_complete_from_query(int is_schema_query, const char *text, int state)
+{
+   static int  list_index,
+               string_length;
+   static PGresult *result = NULL;
+
+   /*
+    * If this is the first time for this completion, we fetch a list of our
+    * "things" from the backend.
+    */
+   if (state == 0)
+   {
+       PQExpBufferData query_buffer;
+       char       *e_text;
+       char       *e_info_charp;
+
+       list_index = 0;
+       string_length = strlen(text);
+
+       /* Free any prior result */
+       PQclear(result);
+       result = NULL;
+
+       /* Set up suitably-escaped copies of textual inputs */
+       e_text = pg_malloc(string_length * 2 + 1);
+       PQescapeString(e_text, text, string_length);
+
+       if (completion_info_charp)
+       {
+           size_t      charp_len;
+
+           charp_len = strlen(completion_info_charp);
+           e_info_charp = pg_malloc(charp_len * 2 + 1);
+           PQescapeString(e_info_charp, completion_info_charp,
+                          charp_len);
+       }
+       else
+           e_info_charp = NULL;
+
+       initPQExpBuffer(&query_buffer);
+
+       if (is_schema_query)
+       {
+           /* completion_squery gives us the pieces to assemble */
+           const char *qualresult = completion_squery->qualresult;
+
+           if (qualresult == NULL)
+               qualresult = completion_squery->result;
+
+           /* Get unqualified names matching the input-so-far */
+           appendPQExpBuffer(&query_buffer, "SELECT %s FROM %s WHERE ",
+                             completion_squery->result,
+                             completion_squery->catname);
+           if (completion_squery->selcondition)
+               appendPQExpBuffer(&query_buffer, "%s AND ",
+                                 completion_squery->selcondition);
+           appendPQExpBuffer(&query_buffer, "substring(%s,1,%d)='%s'",
+                             completion_squery->result,
+                             string_length, e_text);
+           appendPQExpBuffer(&query_buffer, " AND %s",
+                             completion_squery->viscondition);
+
+           /*
+            * When fetching relation names, suppress system catalogs unless
+            * the input-so-far begins with "pg_".  This is a compromise
+            * between not offering system catalogs for completion at all, and
+            * having them swamp the result when the input is just "p".
+            */
+           if (strcmp(completion_squery->catname,
+                      "pg_catalog.pg_class c") == 0 &&
+               strncmp(text, "pg_", 3) !=0)
+           {
+               appendPQExpBuffer(&query_buffer,
+                                 " AND c.relnamespace <> (SELECT oid FROM"
+                  " pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')");
+           }
+
+           /*
+            * Add in matching schema names, but only if there is more than
+            * one potential match among schema names.
+            */
+           appendPQExpBuffer(&query_buffer, "\nUNION\n"
+                          "SELECT pg_catalog.quote_ident(n.nspname) || '.' "
+                             "FROM pg_catalog.pg_namespace n "
+                             "WHERE substring(pg_catalog.quote_ident(n.nspname) || '.',1,%d)='%s'",
+                             string_length, e_text);
+           appendPQExpBuffer(&query_buffer,
+                             " AND (SELECT pg_catalog.count(*)"
+                             " FROM pg_catalog.pg_namespace"
+           " WHERE substring(pg_catalog.quote_ident(nspname) || '.',1,%d) ="
+                             " substring('%s',1,pg_catalog.length(pg_catalog.quote_ident(nspname))+1)) > 1",
+                             string_length, e_text);
+
+           /*
+            * Add in matching qualified names, but only if there is exactly
+            * one schema matching the input-so-far.
+            */
+           appendPQExpBuffer(&query_buffer, "\nUNION\n"
+                    "SELECT pg_catalog.quote_ident(n.nspname) || '.' || %s "
+                             "FROM %s, pg_catalog.pg_namespace n "
+                             "WHERE %s = n.oid AND ",
+                             qualresult,
+                             completion_squery->catname,
+                             completion_squery->namespace);
+           if (completion_squery->selcondition)
+               appendPQExpBuffer(&query_buffer, "%s AND ",
+                                 completion_squery->selcondition);
+           appendPQExpBuffer(&query_buffer, "substring(pg_catalog.quote_ident(n.nspname) || '.' || %s,1,%d)='%s'",
+                             qualresult,
+                             string_length, e_text);
+
+           /*
+            * This condition exploits the single-matching-schema rule to
+            * speed up the query
+            */
+           appendPQExpBuffer(&query_buffer,
+           " AND substring(pg_catalog.quote_ident(n.nspname) || '.',1,%d) ="
+                             " substring('%s',1,pg_catalog.length(pg_catalog.quote_ident(n.nspname))+1)",
+                             string_length, e_text);
+           appendPQExpBuffer(&query_buffer,
+                             " AND (SELECT pg_catalog.count(*)"
+                             " FROM pg_catalog.pg_namespace"
+           " WHERE substring(pg_catalog.quote_ident(nspname) || '.',1,%d) ="
+                             " substring('%s',1,pg_catalog.length(pg_catalog.quote_ident(nspname))+1)) = 1",
+                             string_length, e_text);
+
+           /* If an addon query was provided, use it */
+           if (completion_charp)
+               appendPQExpBuffer(&query_buffer, "\n%s", completion_charp);
+       }
+       else
+       {
+           /* completion_charp is an sprintf-style format string */
+           appendPQExpBuffer(&query_buffer, completion_charp,
+                             string_length, e_text, e_info_charp);
+       }
+
+       /* Limit the number of records in the result */
+       appendPQExpBuffer(&query_buffer, "\nLIMIT %d",
+                         completion_max_records);
+
+       result = exec_query(query_buffer.data);
+
+       termPQExpBuffer(&query_buffer);
+       free(e_text);
+       if (e_info_charp)
+           free(e_info_charp);
+   }
+
+   /* Find something that matches */
+   if (result && PQresultStatus(result) == PGRES_TUPLES_OK)
+   {
+       const char *item;
+
+       while (list_index < PQntuples(result) &&
+              (item = PQgetvalue(result, list_index++, 0)))
+           if (pg_strncasecmp(text, item, string_length) == 0)
+               return pg_strdup(item);
+   }
+
+   /* If nothing matches, free the db structure and return null */
+   PQclear(result);
+   result = NULL;
+   return NULL;
+}
 
 
 /* This function returns in order one of a fixed, NULL pointer terminated list
    of strings (if matching). This can be used if there are only a fixed number
    SQL words that can appear at certain spot.
 */
-                                                                                                   static char *
-                                                                                                               complete_from_list(const char *text, int state)
-                                                                                                   {
-                                                                                                       static int  string_length,
-                                                                                                                   list_index,
-                                                                                                                   matches;
-                                                                                                       static bool casesensitive;
-                                                                                                       const char *item;
-
-                                                                                                       /*
-                                                                                                        * n
-                                                                                                        * e
-                                                                                                        * e
-                                                                                                        * d
-                                                                                                        *
-                                                                                                        * to
-                                                                                                        *
-                                                                                                        * ha
-                                                                                                        * v
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * a
-                                                                                                        * li
-                                                                                                        * s
-                                                                                                        * t
-                                                                                                        *
-                                                                                                        */
-                                                                                                       psql_assert(completion_charpp);
-
-                                                                                                       /*
-                                                                                                        * I
-                                                                                                        * n
-                                                                                                        * i
-                                                                                                        * t
-                                                                                                        * i
-                                                                                                        * a
-                                                                                                        * l
-                                                                                                        * i
-                                                                                                        * z
-                                                                                                        * a
-                                                                                                        * t
-                                                                                                        * i
-                                                                                                        * o
-                                                                                                        * n
-                                                                                                        *
-                                                                                                        */
-                                                                                                       if (state == 0)
-                                                                                                       {
-                                                                                                           list_index = 0;
-                                                                                                           string_length = strlen(text);
-                                                                                                           casesensitive = true;
-                                                                                                           matches = 0;
-                                                                                                       }
-
-                                                                                                       while ((item = completion_charpp[list_index++]))
-                                                                                                       {
-                                                                                                           /*
-                                                                                                            * F
-                                                                                                            * i
-                                                                                                            * r
-                                                                                                            * s
-                                                                                                            * t
-                                                                                                            *
-                                                                                                            * pa
-                                                                                                            * s
-                                                                                                            * s
-                                                                                                            *
-                                                                                                            * is
-                                                                                                            *
-                                                                                                            * ca
-                                                                                                            * s
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * se
-                                                                                                            * n
-                                                                                                            * s
-                                                                                                            * i
-                                                                                                            * t
-                                                                                                            * i
-                                                                                                            * v
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            */
-                                                                                                           if (casesensitive && strncmp(text, item, string_length) == 0)
-                                                                                                           {
-                                                                                                               matches++;
-                                                                                                               return pg_strdup(item);
-                                                                                                           }
-
-                                                                                                           /*
-                                                                                                            * S
-                                                                                                            * e
-                                                                                                            * c
-                                                                                                            * o
-                                                                                                            * n
-                                                                                                            * d
-                                                                                                            *
-                                                                                                            * pa
-                                                                                                            * s
-                                                                                                            * s
-                                                                                                            *
-                                                                                                            * is
-                                                                                                            *
-                                                                                                            * ca
-                                                                                                            * s
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * in
-                                                                                                            * s
-                                                                                                            * e
-                                                                                                            * n
-                                                                                                            * s
-                                                                                                            * i
-                                                                                                            * t
-                                                                                                            * i
-                                                                                                            * v
-                                                                                                            * e
-                                                                                                            * ,
-                                                                                                            *
-                                                                                                            * do
-                                                                                                            * n
-                                                                                                            * '
-                                                                                                            * t
-                                                                                                            *
-                                                                                                            * bo
-                                                                                                            * t
-                                                                                                            * h
-                                                                                                            * e
-                                                                                                            * r
-                                                                                                            *
-                                                                                                            * co
-                                                                                                            * u
-                                                                                                            * n
-                                                                                                            * t
-                                                                                                            * i
-                                                                                                            * n
-                                                                                                            * g
-                                                                                                            *
-                                                                                                            * ma
-                                                                                                            * t
-                                                                                                            * c
-                                                                                                            * h
-                                                                                                            * e
-                                                                                                            * s
-                                                                                                            *
-                                                                                                            */
-                                                                                                           if (!casesensitive && pg_strncasecmp(text, item, string_length) == 0)
-                                                                                                               return pg_strdup(item);
-                                                                                                       }
-
-                                                                                                       /*
-                                                                                                        *
-                                                                                                        * No
-                                                                                                        *
-                                                                                                        * ma
-                                                                                                        * t
-                                                                                                        * c
-                                                                                                        * h
-                                                                                                        * e
-                                                                                                        * s
-                                                                                                        *
-                                                                                                        * fo
-                                                                                                        * u
-                                                                                                        * n
-                                                                                                        * d
-                                                                                                        * .
-                                                                                                        *
-                                                                                                        * If
-                                                                                                        *
-                                                                                                        * we
-                                                                                                        * '
-                                                                                                        * r
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * no
-                                                                                                        * t
-                                                                                                        *
-                                                                                                        * ca
-                                                                                                        * s
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * in
-                                                                                                        * s
-                                                                                                        * e
-                                                                                                        * n
-                                                                                                        * s
-                                                                                                        * i
-                                                                                                        * t
-                                                                                                        * i
-                                                                                                        * v
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * al
-                                                                                                        * r
-                                                                                                        * e
-                                                                                                        * a
-                                                                                                        * d
-                                                                                                        * y
-                                                                                                        * ,
-                                                                                                        *
-                                                                                                        * le
-                                                                                                        * t
-                                                                                                        * s
-                                                                                                        *
-                                                                                                        * sw
-                                                                                                        * i
-                                                                                                        * t
-                                                                                                        * c
-                                                                                                        * h
-                                                                                                        *
-                                                                                                        * to
-                                                                                                        *
-                                                                                                        * be
-                                                                                                        * i
-                                                                                                        * n
-                                                                                                        * g
-                                                                                                        *
-                                                                                                        * ca
-                                                                                                        * s
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * in
-                                                                                                        * s
-                                                                                                        * e
-                                                                                                        * n
-                                                                                                        * s
-                                                                                                        * i
-                                                                                                        * t
-                                                                                                        * i
-                                                                                                        * v
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * an
-                                                                                                        * d
-                                                                                                        *
-                                                                                                        * tr
-                                                                                                        * y
-                                                                                                        *
-                                                                                                        * ag
-                                                                                                        * a
-                                                                                                        * i
-                                                                                                        * n
-                                                                                                        * */
-                                                                                                       if (casesensitive && matches == 0)
-                                                                                                       {
-                                                                                                           casesensitive = false;
-                                                                                                           list_index = 0;
-                                                                                                           state++;
-                                                                                                           return (complete_from_list(text, state));
-                                                                                                       }
-
-                                                                                                       /*
-                                                                                                        * I
-                                                                                                        * f
-                                                                                                        *
-                                                                                                        * no
-                                                                                                        *
-                                                                                                        * mo
-                                                                                                        * r
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * ma
-                                                                                                        * t
-                                                                                                        * c
-                                                                                                        * h
-                                                                                                        * e
-                                                                                                        * s
-                                                                                                        * ,
-                                                                                                        *
-                                                                                                        * re
-                                                                                                        * t
-                                                                                                        * u
-                                                                                                        * r
-                                                                                                        * n
-                                                                                                        *
-                                                                                                        * nu
-                                                                                                        * l
-                                                                                                        * l
-                                                                                                        * .
-                                                                                                        *
-                                                                                                        */
-                                                                                                       return NULL;
-                                                                                                   }
+static char *
+complete_from_list(const char *text, int state)
+{
+   static int  string_length,
+               list_index,
+               matches;
+   static bool casesensitive;
+   const char *item;
+
+   /* need to have a list */
+   psql_assert(completion_charpp);
+
+   /* Initialization */
+   if (state == 0)
+   {
+       list_index = 0;
+       string_length = strlen(text);
+       casesensitive = true;
+       matches = 0;
+   }
+
+   while ((item = completion_charpp[list_index++]))
+   {
+       /* First pass is case sensitive */
+       if (casesensitive && strncmp(text, item, string_length) == 0)
+       {
+           matches++;
+           return pg_strdup(item);
+       }
+
+       /* Second pass is case insensitive, don't bother counting matches */
+       if (!casesensitive && pg_strncasecmp(text, item, string_length) == 0)
+           return pg_strdup(item);
+   }
+
+   /*
+    * No matches found. If we're not case insensitive already, lets switch to
+    * being case insensitive and try again
+    */
+   if (casesensitive && matches == 0)
+   {
+       casesensitive = false;
+       list_index = 0;
+       state++;
+       return (complete_from_list(text, state));
+   }
+
+   /* If no more matches, return null. */
+   return NULL;
+}
 
 
 /* This function returns one fixed string the first time even if it doesn't
@@ -3654,19 +2135,18 @@ psql_completion(char *text, int start, int end)
    will be overwritten.
    The string to be passed must be in completion_charp.
 */
-                                                                                                   static char *
-                                                                                                               complete_from_const(const char *text, int state)
-                                                                                                   {
-                                                                                                       (void) text;    /* We don't care about
-                                                                                                                        * what was entered
-                                                                                                                        * already. */
+static char *
+complete_from_const(const char *text, int state)
+{
+   (void) text;                /* We don't care about what was entered
+                                * already. */
 
-                                                                                                       psql_assert(completion_charp);
-                                                                                                       if (state == 0)
-                                                                                                           return pg_strdup(completion_charp);
-                                                                                                       else
-                                                                                                           return NULL;
-                                                                                                   }
+   psql_assert(completion_charp);
+   if (state == 0)
+       return pg_strdup(completion_charp);
+   else
+       return NULL;
+}
 
 
 
@@ -3677,28 +2157,28 @@ psql_completion(char *text, int start, int end)
  * Execute a query and report any errors. This should be the preferred way of
  * talking to the database in this file.
  */
-                                                                                                   static PGresult *
-                                                                                                               exec_query(const char *query)
-                                                                                                   {
-                                                                                                       PGresult   *result;
+static PGresult *
+exec_query(const char *query)
+{
+   PGresult   *result;
 
-                                                                                                       if (query == NULL || !pset.db || PQstatus(pset.db) != CONNECTION_OK)
-                                                                                                           return NULL;
+   if (query == NULL || !pset.db || PQstatus(pset.db) != CONNECTION_OK)
+       return NULL;
 
-                                                                                                       result = PQexec(pset.db, query);
+   result = PQexec(pset.db, query);
 
-                                                                                                       if (result != NULL && PQresultStatus(result) != PGRES_TUPLES_OK)
-                                                                                                       {
+   if (result != NULL && PQresultStatus(result) != PGRES_TUPLES_OK)
+   {
 #if 0
-                                                                                                           psql_error("tab completion: %s failed - %s\n",
-                                                                                                                      query, PQresStatus(PQresultStatus(result)));
+       psql_error("tab completion: %s failed - %s\n",
+                  query, PQresStatus(PQresultStatus(result)));
 #endif
-                                                                                                           PQclear(result);
-                                                                                                           result = NULL;
-                                                                                                       }
+       PQclear(result);
+       result = NULL;
+   }
 
-                                                                                                       return result;
-                                                                                                   }
+   return result;
+}
 
 
 
@@ -3707,344 +2187,61 @@ psql_completion(char *text, int start, int end)
  * skip that many words; e.g. skip=1 finds the word before the
  * previous one. Return value is NULL or a malloc'ed string.
  */
-                                                                                                   static char *
-                                                                                                               previous_word(int point, int skip)
-                                                                                                   {
-                                                                                                       int         i,
-                                                                                                                   start = 0,
-                                                                                                                   end = -1,
-                                                                                                                   inquotes = 0;
-                                                                                                       char       *s;
-
-                                                                                                       while (skip-- >= 0)
-                                                                                                       {
-                                                                                                           /*
-                                                                                                            * f
-                                                                                                            * i
-                                                                                                            * r
-                                                                                                            * s
-                                                                                                            * t
-                                                                                                            *
-                                                                                                            * we
-                                                                                                            *
-                                                                                                            * lo
-                                                                                                            * o
-                                                                                                            * k
-                                                                                                            *
-                                                                                                            * fo
-                                                                                                            * r
-                                                                                                            *
-                                                                                                            * a
-                                                                                                            * sp
-                                                                                                            * a
-                                                                                                            * c
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * be
-                                                                                                            * f
-                                                                                                            * o
-                                                                                                            * r
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * th
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * cu
-                                                                                                            * r
-                                                                                                            * r
-                                                                                                            * e
-                                                                                                            * n
-                                                                                                            * t
-                                                                                                            *
-                                                                                                            * wo
-                                                                                                            * r
-                                                                                                            * d
-                                                                                                            *
-                                                                                                            */
-                                                                                                           for (i = point; i >= 0; i--)
-                                                                                                               if (rl_line_buffer[i] == ' ')
-                                                                                                                   break;
-
-                                                                                                           /*
-                                                                                                            * n
-                                                                                                            * o
-                                                                                                            * w
-                                                                                                            *
-                                                                                                            * fi
-                                                                                                            * n
-                                                                                                            * d
-                                                                                                            *
-                                                                                                            * th
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * fi
-                                                                                                            * r
-                                                                                                            * s
-                                                                                                            * t
-                                                                                                            *
-                                                                                                            * no
-                                                                                                            * n
-                                                                                                            * -
-                                                                                                            * s
-                                                                                                            * p
-                                                                                                            * a
-                                                                                                            * c
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * wh
-                                                                                                            * i
-                                                                                                            * c
-                                                                                                            * h
-                                                                                                            *
-                                                                                                            * th
-                                                                                                            * e
-                                                                                                            * n
-                                                                                                            *
-                                                                                                            * co
-                                                                                                            * n
-                                                                                                            * s
-                                                                                                            * t
-                                                                                                            * i
-                                                                                                            * t
-                                                                                                            * u
-                                                                                                            * t
-                                                                                                            * e
-                                                                                                            * s
-                                                                                                            *
-                                                                                                            * th
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * en
-                                                                                                            * d
-                                                                                                            *
-                                                                                                            */
-                                                                                                           for (; i >= 0; i--)
-                                                                                                               if (rl_line_buffer[i] != ' ')
-                                                                                                               {
-                                                                                                                   end = i;
-                                                                                                                   break;
-                                                                                                               }
-
-                                                                                                           /*
-                                                                                                            *
-                                                                                                            * If
-                                                                                                            *
-                                                                                                            * no
-                                                                                                            *
-                                                                                                            * en
-                                                                                                            * d
-                                                                                                            *
-                                                                                                            * fo
-                                                                                                            * u
-                                                                                                            * n
-                                                                                                            * d
-                                                                                                            *
-                                                                                                            * we
-                                                                                                            *
-                                                                                                            * re
-                                                                                                            * t
-                                                                                                            * u
-                                                                                                            * r
-                                                                                                            * n
-                                                                                                            *
-                                                                                                            * nu
-                                                                                                            * l
-                                                                                                            * l
-                                                                                                            * ,
-                                                                                                            *
-                                                                                                            * be
-                                                                                                            * c
-                                                                                                            * a
-                                                                                                            * u
-                                                                                                            * s
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * th
-                                                                                                            * e
-                                                                                                            * r
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * is
-                                                                                                            *
-                                                                                                            * no
-                                                                                                            *
-                                                                                                            * wo
-                                                                                                            * r
-                                                                                                            * d
-                                                                                                            *
-                                                                                                            * be
-                                                                                                            * f
-                                                                                                            * o
-                                                                                                            * r
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * th
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * po
-                                                                                                            * i
-                                                                                                            * n
-                                                                                                            * t
-                                                                                                            * */
-                                                                                                           if (end == -1)
-                                                                                                               return NULL;
-
-                                                                                                           /*
-                                                                                                            *
-                                                                                                            * Ot
-                                                                                                            * h
-                                                                                                            * e
-                                                                                                            * r
-                                                                                                            * w
-                                                                                                            * i
-                                                                                                            * s
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * we
-                                                                                                            *
-                                                                                                            * no
-                                                                                                            * w
-                                                                                                            *
-                                                                                                            * lo
-                                                                                                            * o
-                                                                                                            * k
-                                                                                                            *
-                                                                                                            * fo
-                                                                                                            * r
-                                                                                                            *
-                                                                                                            * th
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * st
-                                                                                                            * a
-                                                                                                            * r
-                                                                                                            * t
-                                                                                                            * .
-                                                                                                            *
-                                                                                                            * Th
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * st
-                                                                                                            * a
-                                                                                                            * r
-                                                                                                            * t
-                                                                                                            *
-                                                                                                            * is
-                                                                                                            *
-                                                                                                            * ei
-                                                                                                            * t
-                                                                                                            * h
-                                                                                                            * e
-                                                                                                            * r
-                                                                                                            *
-                                                                                                            * th
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * la
-                                                                                                            * s
-                                                                                                            * t
-                                                                                                            *
-                                                                                                            * ch
-                                                                                                            * a
-                                                                                                            * r
-                                                                                                            * a
-                                                                                                            * c
-                                                                                                            * t
-                                                                                                            * e
-                                                                                                            * r
-                                                                                                            *
-                                                                                                            * be
-                                                                                                            * f
-                                                                                                            * o
-                                                                                                            * r
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * an
-                                                                                                            * y
-                                                                                                            *
-                                                                                                            * sp
-                                                                                                            * a
-                                                                                                            * c
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * go
-                                                                                                            * i
-                                                                                                            * n
-                                                                                                            * g
-                                                                                                            *
-                                                                                                            * ba
-                                                                                                            * c
-                                                                                                            * k
-                                                                                                            * w
-                                                                                                            * a
-                                                                                                            * r
-                                                                                                            * d
-                                                                                                            * s
-                                                                                                            *
-                                                                                                            * fr
-                                                                                                            * o
-                                                                                                            * m
-                                                                                                            *
-                                                                                                            * th
-                                                                                                            * e
-                                                                                                            *
-                                                                                                            * en
-                                                                                                            * d
-                                                                                                            * ,
-                                                                                                            *
-                                                                                                            * or
-                                                                                                            *
-                                                                                                            * it
-                                                                                                            * '
-                                                                                                            * s
-                                                                                                            *
-                                                                                                            * si
-                                                                                                            * m
-                                                                                                            * p
-                                                                                                            * l
-                                                                                                            * y
-                                                                                                            *
-                                                                                                            * ch
-                                                                                                            * a
-                                                                                                            * r
-                                                                                                            * a
-                                                                                                            * c
-                                                                                                            * t
-                                                                                                            * e
-                                                                                                            * r
-                                                                                                            *
-                                                                                                            * 0
-                                                                                                            */
-                                                                                                           for (start = end; start > 0; start--)
-                                                                                                           {
-                                                                                                               if (rl_line_buffer[start] == '"')
-                                                                                                                   inquotes = !inquotes;
-                                                                                                               if ((rl_line_buffer[start - 1] == ' ') && inquotes == 0)
-                                                                                                                   break;
-                                                                                                           }
-
-                                                                                                           point = start;
-                                                                                                       }
-
-                                                                                                       /*
-                                                                                                        * m
-                                                                                                        * a
-                                                                                                        * k
-                                                                                                        * e
-                                                                                                        *
-                                                                                                        * a
-                                                                                                        * co
-                                                                                                        * p
-                                                                                                        * y
-                                                                                                        *
-                                                                                                        */
-                                                                                                       s = pg_malloc(end - start + 2);
-
-                                                                                                       strncpy(s, &rl_line_buffer[start], end - start + 1);
-                                                                                                       s[end - start + 1] = '\0';
-
-                                                                                                       return s;
-                                                                                                   }
+static char *
+previous_word(int point, int skip)
+{
+   int         i,
+               start = 0,
+               end = -1,
+               inquotes = 0;
+   char       *s;
+
+   while (skip-- >= 0)
+   {
+       /* first we look for a space before the current word */
+       for (i = point; i >= 0; i--)
+           if (rl_line_buffer[i] == ' ')
+               break;
+
+       /* now find the first non-space which then constitutes the end */
+       for (; i >= 0; i--)
+           if (rl_line_buffer[i] != ' ')
+           {
+               end = i;
+               break;
+           }
+
+       /*
+        * If no end found we return null, because there is no word before the
+        * point
+        */
+       if (end == -1)
+           return NULL;
+
+       /*
+        * Otherwise we now look for the start. The start is either the last
+        * character before any space going backwards from the end, or it's
+        * simply character 0
+        */
+       for (start = end; start > 0; start--)
+       {
+           if (rl_line_buffer[start] == '"')
+               inquotes = !inquotes;
+           if ((rl_line_buffer[start - 1] == ' ') && inquotes == 0)
+               break;
+       }
+
+       point = start;
+   }
+
+   /* make a copy */
+   s = pg_malloc(end - start + 2);
+
+   strncpy(s, &rl_line_buffer[start], end - start + 1);
+   s[end - start + 1] = '\0';
+
+   return s;
+}
 
 
 
@@ -4055,42 +2252,42 @@ psql_completion(char *text, int start, int end)
  * psql internal. Currently disabled because it is reported not to
  * cooperate with certain versions of readline.
  */
-                                                                                                   static char *
-                                                                                                               quote_file_name(char *text, int match_type, char *quote_pointer)
-                                                                                                   {
-                                                                                                       char       *s;
-                                                                                                       size_t      length;
-
-                                                                                                       (void) quote_pointer;   /* not used */
-
-                                                                                                       length = strlen(text) +(match_type == SINGLE_MATCH ? 3 : 2);
-                                                                                                       s = pg_malloc(length);
-                                                                                                       s[0] = '\'';
-                                                                                                       strcpy(s + 1, text);
-                                                                                                       if (match_type == SINGLE_MATCH)
-                                                                                                           s[length - 2] = '\'';
-                                                                                                       s[length - 1] = '\0';
-                                                                                                       return s;
-                                                                                                   }
-
-
-
-                                                                                                   static char *
-                                                                                                               dequote_file_name(char *text, char quote_char)
-                                                                                                   {
-                                                                                                       char       *s;
-                                                                                                       size_t      length;
-
-                                                                                                       if (!quote_char)
-                                                                                                           return pg_strdup(text);
-
-                                                                                                       length = strlen(text);
-                                                                                                       s = pg_malloc(length - 2 + 1);
-                                                                                                       strncpy(s, text +1, length - 2);
-                                                                                                       s[length] = '\0';
-
-                                                                                                       return s;
-                                                                                                   }
+static char *
+quote_file_name(char *text, int match_type, char *quote_pointer)
+{
+   char       *s;
+   size_t      length;
+
+   (void) quote_pointer;       /* not used */
+
+   length = strlen(text) +(match_type == SINGLE_MATCH ? 3 : 2);
+   s = pg_malloc(length);
+   s[0] = '\'';
+   strcpy(s + 1, text);
+   if (match_type == SINGLE_MATCH)
+       s[length - 2] = '\'';
+   s[length - 1] = '\0';
+   return s;
+}
+
+
+
+static char *
+dequote_file_name(char *text, char quote_char)
+{
+   char       *s;
+   size_t      length;
+
+   if (!quote_char)
+       return pg_strdup(text);
+
+   length = strlen(text);
+   s = pg_malloc(length - 2 + 1);
+   strncpy(s, text +1, length - 2);
+   s[length] = '\0';
+
+   return s;
+}
 #endif   /* 0 */
 
 #endif   /* USE_READLINE */