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]

Index: tab-complete.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/tab-complete.c,v
retrieving revision 1.141
diff -r1.141 tab-complete.c
478a479,480
> static int find_open_parenthesis(int end);
> 
1019c1021,1037
<               COMPLETE_WITH_ATTR(prev_wd);
---
>       {
>               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);
>       }
> 
1225,1228c1243,1275
<               static const char *const list_DROPCR[] =
<               {"CASCADE", "RESTRICT", NULL};
< 
<               COMPLETE_WITH_LIST(list_DROPCR);
---
>               
>               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);
1230a1278,1279
> 
> 
2249a2299,2319
> /* 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;
2250a2321
> }
---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
       choose an index scan if your joining column's datatypes do not
       match

Reply via email to