postgres.git / summary / log / commit / refs

commit    e8d118fe859cdbae8b7dafefd126f31105f3aaab
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Fri Sep 21 19:58:37 2018 +0000
First released in: 12.0, 10.6, 11.0

    Fix bogus tab-completion rule for CREATE PUBLICATION.
    
    You can't use "FOR TABLE" as a single Matches argument, because readline
    will consider that input to be two words not one.  It's necessary to make
    the pattern contain two arguments.
    
    The case accidentally worked anyway because the words_after_create
    test fired ... but only for the first such table name.
    
    Noted by Edmund Horner, though this isn't exactly his proposed fix.
    Backpatch to v10 where the faulty code came in.
    
    Discussion: https://postgr.es/m/CAMyN-kDe=gBmHgxWwUUaXuwK+p+7g1vChR7foPHRDLE592nJPQ@mail.gmail.com


src/bin/psql/tab-complete.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 1583cfa998e..83b2b9cee3c 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1405,6 +1405,21 @@ psql_completion(const char *text, int start, int end) word_matches(p2, previous_words[previous_words_count - 2]) && \ word_matches(p3, previous_words[previous_words_count - 3])) +#define HeadMatches4(p1, p2, p3, p4) \ + (previous_words_count >= 4 && \ + word_matches(p1, previous_words[previous_words_count - 1]) && \ + word_matches(p2, previous_words[previous_words_count - 2]) && \ + word_matches(p3, previous_words[previous_words_count - 3]) && \ + word_matches(p4, previous_words[previous_words_count - 4])) + +#define HeadMatches5(p1, p2, p3, p4, p5) \ + (previous_words_count >= 5 && \ + word_matches(p1, previous_words[previous_words_count - 1]) && \ + word_matches(p2, previous_words[previous_words_count - 2]) && \ + word_matches(p3, previous_words[previous_words_count - 3]) && \ + word_matches(p4, previous_words[previous_words_count - 4]) && \ + word_matches(p5, previous_words[previous_words_count - 5])) + /* Known command-starting keywords. */ static const char *const sql_commands[] = { "ABORT", "ALTER", "ANALYZE", "BEGIN", "CHECKPOINT", "CLOSE", "CLUSTER", @@ -2424,8 +2439,8 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_LIST3("FOR TABLE", "FOR ALL TABLES", "WITH ("); else if (Matches4("CREATE", "PUBLICATION", MatchAny, "FOR")) COMPLETE_WITH_LIST2("TABLE", "ALL TABLES"); - /* Complete "CREATE PUBLICATION <name> FOR TABLE <table>" */ - else if (Matches4("CREATE", "PUBLICATION", MatchAny, "FOR TABLE")) + /* Complete "CREATE PUBLICATION <name> FOR TABLE <table>, ..." */ + else if (HeadMatches5("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); /* Complete "CREATE PUBLICATION <name> [...] WITH" */ else if (HeadMatches2("CREATE", "PUBLICATION") && TailMatches2("WITH", "(")) [parent: 917fe6a48218]