@@ -278,25 +278,40 @@ do { \
278278matches = rl_completion_matches(text, complete_from_query); \
279279} while (0)
280280
281+ /*
282+ * libedit will typically include the literal's leading single quote in
283+ * "text", while readline will not. Adapt our offered strings to fit.
284+ * But include a quote if there's not one just before "text", to get the
285+ * user off to the right start.
286+ */
281287#define COMPLETE_WITH_ENUM_VALUE (type ) \
282288do { \
283289char *_completion_schema; \
284290char *_completion_type; \
291+ booluse_quotes; \
285292\
286293_completion_schema = strtokx(type, " \t\n\r", ".", "\"", 0, \
287294 false, false, pset.encoding); \
288295(void) strtokx(NULL, " \t\n\r", ".", "\"", 0, \
289296 false, false, pset.encoding); \
290297_completion_type = strtokx(NULL, " \t\n\r", ".", "\"", 0, \
291- false, false, pset.encoding); \
292- if (_completion_type == NULL)\
298+ false, false, pset.encoding); \
299+ use_quotes = (text[0] == '\'' || \
300+ start == 0 || rl_line_buffer[start - 1] != '\''); \
301+ if (_completion_type == NULL) \
293302{ \
294- completion_charp = Query_for_list_of_enum_values; \
303+ if (use_quotes) \
304+ completion_charp = Query_for_list_of_enum_values_quoted; \
305+ else \
306+ completion_charp = Query_for_list_of_enum_values_unquoted; \
295307completion_info_charp = type; \
296308} \
297309else \
298310{ \
299- completion_charp = Query_for_list_of_enum_values_with_schema; \
311+ if (use_quotes) \
312+ completion_charp = Query_for_list_of_enum_values_with_schema_quoted; \
313+ else \
314+ completion_charp = Query_for_list_of_enum_values_with_schema_unquoted; \
300315completion_info_charp = _completion_type; \
301316completion_info_charp2 = _completion_schema; \
302317} \
@@ -678,7 +693,7 @@ static const SchemaQuery Query_for_list_of_collations = {
678693" AND (pg_catalog.quote_ident(nspname)='%s' "\
679694" OR '\"' || nspname || '\"' ='%s') "
680695
681- #define Query_for_list_of_enum_values \
696+ #define Query_for_list_of_enum_values_quoted \
682697"SELECT pg_catalog.quote_literal(enumlabel) "\
683698" FROM pg_catalog.pg_enum e, pg_catalog.pg_type t "\
684699" WHERE t.oid = e.enumtypid "\
@@ -687,7 +702,16 @@ static const SchemaQuery Query_for_list_of_collations = {
687702" OR '\"' || typname || '\"'='%s') "\
688703" AND pg_catalog.pg_type_is_visible(t.oid)"
689704
690- #define Query_for_list_of_enum_values_with_schema \
705+ #define Query_for_list_of_enum_values_unquoted \
706+ "SELECT enumlabel "\
707+ " FROM pg_catalog.pg_enum e, pg_catalog.pg_type t "\
708+ " WHERE t.oid = e.enumtypid "\
709+ " AND substring(enumlabel,1,%d)='%s' "\
710+ " AND (pg_catalog.quote_ident(typname)='%s' "\
711+ " OR '\"' || typname || '\"'='%s') "\
712+ " AND pg_catalog.pg_type_is_visible(t.oid)"
713+
714+ #define Query_for_list_of_enum_values_with_schema_quoted \
691715"SELECT pg_catalog.quote_literal(enumlabel) "\
692716" FROM pg_catalog.pg_enum e, pg_catalog.pg_type t, pg_catalog.pg_namespace n "\
693717" WHERE t.oid = e.enumtypid "\
@@ -698,6 +722,17 @@ static const SchemaQuery Query_for_list_of_collations = {
698722" AND (pg_catalog.quote_ident(nspname)='%s' "\
699723" OR '\"' || nspname || '\"' ='%s') "
700724
725+ #define Query_for_list_of_enum_values_with_schema_unquoted \
726+ "SELECT enumlabel "\
727+ " FROM pg_catalog.pg_enum e, pg_catalog.pg_type t, pg_catalog.pg_namespace n "\
728+ " WHERE t.oid = e.enumtypid "\
729+ " AND n.oid = t.typnamespace "\
730+ " AND substring(enumlabel,1,%d)='%s' "\
731+ " AND (pg_catalog.quote_ident(typname)='%s' "\
732+ " OR '\"' || typname || '\"'='%s') "\
733+ " AND (pg_catalog.quote_ident(nspname)='%s' "\
734+ " OR '\"' || nspname || '\"' ='%s') "
735+
701736#define Query_for_list_of_template_databases \
702737"SELECT pg_catalog.quote_ident(d.datname) "\
703738" FROM pg_catalog.pg_database d "\
@@ -4192,8 +4227,12 @@ psql_completion(const char *text, int start, int end)
41924227if (matches == NULL )
41934228{
41944229COMPLETE_WITH_CONST (true,"" );
4230+ /* Also, prevent Readline from appending stuff to the non-match */
41954231#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
41964232rl_completion_append_character = '\0' ;
4233+ #endif
4234+ #ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
4235+ rl_completion_suppress_quote = 1 ;
41974236#endif
41984237}
41994238