@@ -280,25 +280,40 @@ do { \
280
280
matches = rl_completion_matches(text, complete_from_query); \
281
281
} while (0)
282
282
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
+ */
283
289
#define COMPLETE_WITH_ENUM_VALUE (type ) \
284
290
do { \
285
291
char *_completion_schema; \
286
292
char *_completion_type; \
293
+ bool use_quotes; \
287
294
\
288
295
_completion_schema = strtokx(type, " \t\n\r", ".", "\"", 0, \
289
296
false, false, pset.encoding); \
290
297
(void) strtokx(NULL, " \t\n\r", ".", "\"", 0, \
291
298
false, false, pset.encoding); \
292
299
_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) \
295
304
{ \
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; \
297
309
completion_info_charp = type; \
298
310
} \
299
311
else \
300
312
{ \
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; \
302
317
completion_info_charp = _completion_type; \
303
318
completion_info_charp2 = _completion_schema; \
304
319
} \
@@ -654,7 +669,7 @@ static const SchemaQuery Query_for_list_of_statistics = {
654
669
" AND (pg_catalog.quote_ident(nspname)='%s' "\
655
670
" OR '\"' || nspname || '\"' ='%s') "
656
671
657
- #define Query_for_list_of_enum_values \
672
+ #define Query_for_list_of_enum_values_quoted \
658
673
"SELECT pg_catalog.quote_literal(enumlabel) "\
659
674
" FROM pg_catalog.pg_enum e, pg_catalog.pg_type t "\
660
675
" WHERE t.oid = e.enumtypid "\
@@ -663,7 +678,16 @@ static const SchemaQuery Query_for_list_of_statistics = {
663
678
" OR '\"' || typname || '\"'='%s') "\
664
679
" AND pg_catalog.pg_type_is_visible(t.oid)"
665
680
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 \
667
691
"SELECT pg_catalog.quote_literal(enumlabel) "\
668
692
" FROM pg_catalog.pg_enum e, pg_catalog.pg_type t, pg_catalog.pg_namespace n "\
669
693
" WHERE t.oid = e.enumtypid "\
@@ -674,6 +698,17 @@ static const SchemaQuery Query_for_list_of_statistics = {
674
698
" AND (pg_catalog.quote_ident(nspname)='%s' "\
675
699
" OR '\"' || nspname || '\"' ='%s') "
676
700
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
+
677
712
#define Query_for_list_of_template_databases \
678
713
"SELECT pg_catalog.quote_ident(d.datname) "\
679
714
" FROM pg_catalog.pg_database d "\
@@ -3934,8 +3969,12 @@ psql_completion(const char *text, int start, int end)
3934
3969
if (matches == NULL )
3935
3970
{
3936
3971
COMPLETE_WITH_CONST (true, "" );
3972
+ /* Also, prevent Readline from appending stuff to the non-match */
3937
3973
#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
3938
3974
rl_completion_append_character = '\0' ;
3975
+ #endif
3976
+ #ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
3977
+ rl_completion_suppress_quote = 1 ;
3939
3978
#endif
3940
3979
}
3941
3980
0 commit comments