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