Re: EXECUTE tab completion

Alvaro Herrera <alvherre@commandprompt.com>

From: Alvaro Herrera <alvherre@commandprompt.com>
To: Josh Kupershmidt <schmiddy@gmail.com>
Cc: Tom Lane <tgl@sss.pgh.pa.us>, Andreas Karlsson <andreas@proxel.se>, Pg Hackers <pgsql-hackers@postgresql.org>
Date: 2011-10-20T13:23:31Z
Lists: pgsql-hackers

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Add ALTER TABLE ... ALTER COLUMN ... SET STATISTICS DISTINCT

Excerpts from Josh Kupershmidt's message of mié oct 19 23:50:58 -0300 2011:
> On Wed, Oct 19, 2011 at 10:40 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> > Josh Kupershmidt <schmiddy@gmail.com> writes:
> >> Incidentally, I was wondering what the heck was up with a clause like this:
> >>     else if (pg_strcasecmp(prev_wd, "EXECUTE") == 0 &&
> >>              pg_strcasecmp(prev2_wd, "EXECUTE") == 0)
> >
> > Hmm, maybe || was meant not && ?  It seems pretty unlikely that the
> > above test would ever trigger on valid SQL input.
> 
> Well, changing '&&' to '||' breaks the stated comment of the patch, namely:
>           /* must not match CREATE TRIGGER ... EXECUTE PROCEDURE */
> 
> I assume this is an accepted quirk of previous_word() since we have
> this existing similar code:
> 
> /* DROP, but watch out for DROP embedded in other commands */
>     /* complete with something you can drop */
>     else if (pg_strcasecmp(prev_wd, "DROP") == 0 &&
>              pg_strcasecmp(prev2_wd, "DROP") == 0)

Maybe both are wrong, though the DROP case seems to work so maybe it's
just dead code.  This was introduced in commit
90725929465474648de133d216b873bdb69fe357:

***************
*** 674,685 **** psql_completion(char *text, int start, int end)
    else if (pg_strcasecmp(prev_wd, "CREATE") == 0)
        matches = completion_matches(text, create_command_generator);
  
! /* DROP, except ALTER (TABLE|DOMAIN|GROUP) sth DROP */
    /* complete with something you can drop */
    else if (pg_strcasecmp(prev_wd, "DROP") == 0 &&
!            pg_strcasecmp(prev3_wd, "TABLE") != 0 &&
!            pg_strcasecmp(prev3_wd, "DOMAIN") != 0 &&
!            pg_strcasecmp(prev3_wd, "GROUP") != 0)
        matches = completion_matches(text, drop_command_generator);
  
  /* ALTER */
--- 674,683 ----
    else if (pg_strcasecmp(prev_wd, "CREATE") == 0)
        matches = completion_matches(text, create_command_generator);
  
! /* DROP, but watch out for DROP embedded in other commands */
    /* complete with something you can drop */
    else if (pg_strcasecmp(prev_wd, "DROP") == 0 &&
!            pg_strcasecmp(prev2_wd, "DROP") == 0)
        matches = completion_matches(text, drop_command_generator);
  
  /* ALTER */


-- 
Álvaro Herrera <alvherre@commandprompt.com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support