@@ -280,25 +280,40 @@ do { \
280280matches = rl_completion_matches(text, complete_from_query); \
281281} while (0)
282282
283+ /*
284+ * libedit will typically include the literal's leading single quote in
285+ * "text", while readline will not. Adapt our offered strings to fit.
286+ * But include a quote if there's not one just before "text", to get the
287+ * user off to the right start.
288+ */
283289#define COMPLETE_WITH_ENUM_VALUE (type ) \
284290do { \
285291char *_completion_schema; \
286292char *_completion_type; \
293+ booluse_quotes; \
287294\
288295_completion_schema = strtokx(type, " \t\n\r", ".", "\"", 0, \
289296 false, false, pset.encoding); \
290297(void) strtokx(NULL, " \t\n\r", ".", "\"", 0, \
291298 false, false, pset.encoding); \
292299_completion_type = strtokx(NULL, " \t\n\r", ".", "\"", 0, \
293- false, false, pset.encoding); \
294- if (_completion_type == NULL)\
300+ false, false, pset.encoding); \
301+ use_quotes = (text[0] == '\'' || \
302+ start == 0 || rl_line_buffer[start - 1] != '\''); \
303+ if (_completion_type == NULL) \
295304{ \
296- completion_charp = Query_for_list_of_enum_values; \
305+ if (use_quotes) \
306+ completion_charp = Query_for_list_of_enum_values_quoted; \
307+ else \
308+ completion_charp = Query_for_list_of_enum_values_unquoted; \
297309completion_info_charp = type; \
298310} \
299311else \
300312{ \
301- completion_charp = Query_for_list_of_enum_values_with_schema; \
313+ if (use_quotes) \
314+ completion_charp = Query_for_list_of_enum_values_with_schema_quoted; \
315+ else \
316+ completion_charp = Query_for_list_of_enum_values_with_schema_unquoted; \
302317completion_info_charp = _completion_type; \
303318completion_info_charp2 = _completion_schema; \
304319} \
@@ -654,7 +669,7 @@ static const SchemaQuery Query_for_list_of_statistics = {
654669" AND (pg_catalog.quote_ident(nspname)='%s' "\
655670" OR '\"' || nspname || '\"' ='%s') "
656671
657- #define Query_for_list_of_enum_values \
672+ #define Query_for_list_of_enum_values_quoted \
658673"SELECT pg_catalog.quote_literal(enumlabel) "\
659674" FROM pg_catalog.pg_enum e, pg_catalog.pg_type t "\
660675" WHERE t.oid = e.enumtypid "\
@@ -663,7 +678,16 @@ static const SchemaQuery Query_for_list_of_statistics = {
663678" OR '\"' || typname || '\"'='%s') "\
664679" AND pg_catalog.pg_type_is_visible(t.oid)"
665680
666- #define Query_for_list_of_enum_values_with_schema \
681+ #define Query_for_list_of_enum_values_unquoted \
682+ "SELECT enumlabel "\
683+ " FROM pg_catalog.pg_enum e, pg_catalog.pg_type t "\
684+ " WHERE t.oid = e.enumtypid "\
685+ " AND substring(enumlabel,1,%d)='%s' "\
686+ " AND (pg_catalog.quote_ident(typname)='%s' "\
687+ " OR '\"' || typname || '\"'='%s') "\
688+ " AND pg_catalog.pg_type_is_visible(t.oid)"
689+
690+ #define Query_for_list_of_enum_values_with_schema_quoted \
667691"SELECT pg_catalog.quote_literal(enumlabel) "\
668692" FROM pg_catalog.pg_enum e, pg_catalog.pg_type t, pg_catalog.pg_namespace n "\
669693" WHERE t.oid = e.enumtypid "\
@@ -674,6 +698,17 @@ static const SchemaQuery Query_for_list_of_statistics = {
674698" AND (pg_catalog.quote_ident(nspname)='%s' "\
675699" OR '\"' || nspname || '\"' ='%s') "
676700
701+ #define Query_for_list_of_enum_values_with_schema_unquoted \
702+ "SELECT enumlabel "\
703+ " FROM pg_catalog.pg_enum e, pg_catalog.pg_type t, pg_catalog.pg_namespace n "\
704+ " WHERE t.oid = e.enumtypid "\
705+ " AND n.oid = t.typnamespace "\
706+ " AND substring(enumlabel,1,%d)='%s' "\
707+ " AND (pg_catalog.quote_ident(typname)='%s' "\
708+ " OR '\"' || typname || '\"'='%s') "\
709+ " AND (pg_catalog.quote_ident(nspname)='%s' "\
710+ " OR '\"' || nspname || '\"' ='%s') "
711+
677712#define Query_for_list_of_template_databases \
678713"SELECT pg_catalog.quote_ident(d.datname) "\
679714" FROM pg_catalog.pg_database d "\
@@ -3934,8 +3969,12 @@ psql_completion(const char *text, int start, int end)
39343969if (matches == NULL )
39353970{
39363971COMPLETE_WITH_CONST (true,"" );
3972+ /* Also, prevent Readline from appending stuff to the non-match */
39373973#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
39383974rl_completion_append_character = '\0' ;
3975+ #endif
3976+ #ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
3977+ rl_completion_suppress_quote = 1 ;
39393978#endif
39403979}
39413980