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

Reply via email to