Now the patch have been made using "cvs diff -c" Sergey
On Tue, 29 Nov 2005, Sergey E. Koposov wrote: > Hello All, > > 1) I'm proposing a patch to do the DROP FUNCTION argument tab completion. > Now, the arguments of the drop function can be tab completed. for example > > drop function strpos ( > <press tab> > drop FUNCTION strpos (text, text) > > or: > > wsdb=# drop FUNCTION length ( > bit) bytea) character) lseg) path) text) > <press c> > wsdb# DROP FUNCTION length ( character) > > I think that this patch should be rather useful. At it least I hate > always to type all the arguments of the dropped functions. > > 2) Also some fixes applied for the > CREATE INDEX syntax > > now the parenthesises are inserted by tab pressing. > suppose I have the table q3c: > wsdb=# \d q3c > Table "public.q3c" > Column | Type | Modifiers > --------+------------------+----------- > ipix | bigint | > ra | double precision | > dec | double precision | > > Now if I do > wsdb# create index xxx on q3c > <press tab> > wsdb# CREATE INDEX xxx on q3c ( > <press tab> > wsdb=# CREATE INDEX xxx on q3c ( > "dec" ipix ra > <press r> > wsdb=# CREATE INDEX xxx on q3c ( ra > > Regards, > Sergey > > ***************************************************** > Sergey E. Koposov > Max-Planck Institut for Astronomy > Web: http://lnfm1.sai.msu.ru/~math > E-mail: [EMAIL PROTECTED] > > ***************************************************** Sergey E. Koposov Max-Planck Institut for Astronomy Web: http://lnfm1.sai.msu.ru/~math E-mail: [EMAIL PROTECTED]
Index: tab-complete.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/bin/psql/tab-complete.c,v retrieving revision 1.141 diff -c -r1.141 tab-complete.c *** tab-complete.c 18 Nov 2005 16:31:11 -0000 1.141 --- tab-complete.c 5 Dec 2005 04:14:43 -0000 *************** *** 476,481 **** --- 476,483 ---- static char *previous_word(int point, int skip); + static int find_open_parenthesis(int end); + #if 0 static char *quote_file_name(char *text, int match_type, char *quote_pointer); static char *dequote_file_name(char *text, char quote_char); *************** *** 1016,1022 **** */ else if (pg_strcasecmp(prev4_wd, "INDEX") == 0 && pg_strcasecmp(prev2_wd, "ON") == 0) ! COMPLETE_WITH_ATTR(prev_wd); /* same if you put in USING */ else if (pg_strcasecmp(prev4_wd, "ON") == 0 && pg_strcasecmp(prev2_wd, "USING") == 0) --- 1018,1040 ---- */ else if (pg_strcasecmp(prev4_wd, "INDEX") == 0 && pg_strcasecmp(prev2_wd, "ON") == 0) ! { ! if (find_open_parenthesis(end)) ! { ! COMPLETE_WITH_ATTR(prev_wd); ! } ! else ! { ! COMPLETE_WITH_CONST("("); ! } ! } ! else if (pg_strcasecmp(prev5_wd, "INDEX") == 0 && ! pg_strcasecmp(prev3_wd, "ON") == 0 && ! pg_strcasecmp(prev_wd, "(") == 0) ! { ! COMPLETE_WITH_ATTR(prev2_wd); ! } ! /* same if you put in USING */ else if (pg_strcasecmp(prev4_wd, "ON") == 0 && pg_strcasecmp(prev2_wd, "USING") == 0) *************** *** 1222,1233 **** pg_strcasecmp(prev3_wd, "AGGREGATE") == 0 && prev_wd[strlen(prev_wd) - 1] == ')')) { ! static const char *const list_DROPCR[] = ! {"CASCADE", "RESTRICT", NULL}; ! ! COMPLETE_WITH_LIST(list_DROPCR); } /* EXPLAIN */ /* --- 1240,1282 ---- pg_strcasecmp(prev3_wd, "AGGREGATE") == 0 && prev_wd[strlen(prev_wd) - 1] == ')')) { ! ! if ((pg_strcasecmp(prev3_wd, "DROP") == 0) && (pg_strcasecmp(prev2_wd, "FUNCTION") == 0)) ! { ! if (find_open_parenthesis(end)) ! { ! static const char func_args_query[] = "select pg_catalog.oidvectortypes(proargtypes)||')' from pg_proc where proname='%s'"; ! char *tmp_buf = malloc(strlen(func_args_query) + strlen(prev_wd)); ! sprintf(tmp_buf, func_args_query, prev_wd); ! COMPLETE_WITH_QUERY(tmp_buf); ! free(tmp_buf); ! } ! else ! { ! COMPLETE_WITH_CONST("("); ! } ! } ! else ! { ! static const char *const list_DROPCR[] = ! {"CASCADE", "RESTRICT", NULL}; ! ! COMPLETE_WITH_LIST(list_DROPCR); ! } ! } ! else if (pg_strcasecmp(prev4_wd, "DROP") == 0 && ! pg_strcasecmp(prev3_wd, "FUNCTION") == 0 && ! pg_strcasecmp(prev_wd, "(") == 0 ) ! { ! static const char func_args_query[] = "select pg_catalog.oidvectortypes(proargtypes)||')' from pg_proc where proname='%s'"; ! char *tmp_buf = malloc(strlen(func_args_query) + strlen(prev2_wd)); ! sprintf(tmp_buf, func_args_query, prev2_wd); ! COMPLETE_WITH_QUERY(tmp_buf); ! free(tmp_buf); } + + /* EXPLAIN */ /* *************** *** 2247,2253 **** --- 2296,2324 ---- return s; } + /* Find the parenthesis after the last word */ + + + static int find_open_parenthesis(int end) + { + int i = end-1; + + while((rl_line_buffer[i]!=' ')&&(i>=0)) + { + if (rl_line_buffer[i]=='(') return 1; + i--; + } + while((rl_line_buffer[i]==' ')&&(i>=0)) + { + i--; + } + if (rl_line_buffer[i]=='(') + { + return 1; + } + return 0; + } #if 0
---------------------------(end of broadcast)--------------------------- TIP 1: if posting/reading through Usenet, please send an appropriate subscribe-nomail command to [EMAIL PROTECTED] so that your message can get through to the mailing list cleanly