-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
                                                                                
                                                              
                                                                                
                                                              
Attached is a patch that enhances the "\h" capability in psql. I often
find myself typing a command and then wanting to get the syntax for
it. So I do a ctrl-a and add a \h: but psql does not recognize the
command, because I have stuff attached to it (e.g. "alter table
foobar"),
so I have to scroll over and delete everything except the name of the
command itself. This patch gives \h three chances to match: if nothing
matches the complete string (current behavior), it tries to match the
first two words (e.g. "ALTER TABLE"). If that fails, it tries to match
the first word (e.g. "DELETE").
                                                                                
                                                              
- --
Greg Sabino Mullane [EMAIL PROTECTED]
PGP Key: 0x14964AC8 200505161840
http://biglumber.com/x/web?pk=2529DF6AB8F79407E94445B4BC9B906714964AC8
-----BEGIN PGP SIGNATURE-----
                                                                                
                                                              
iD8DBQFCiSF3vJuQZxSWSsgRAumaAKCKd0xns4V+ITRSfxGJCrJUtZOrjgCfW8FC
qbFC2jdXGOWWP8cN3Um/1hY=
=kZeh
-----END PGP SIGNATURE-----

Index: help.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/help.c,v
retrieving revision 1.101
diff -c -r1.101 help.c
*** help.c	22 Feb 2005 04:40:55 -0000	1.101
--- help.c	16 May 2005 20:59:51 -0000
***************
*** 304,355 ****
  	}
  	else
  	{
! 		int			i;
  		bool		help_found = false;
  		FILE	   *output;
! 		size_t		len;
  		int			nl_count = 0;
  		char	   *ch;
  
! 		/* don't care about trailing spaces or semicolons */
  		len = strlen(topic);
  		while (topic[len - 1] == ' ' || topic[len - 1] == ';')
! 			len--;
  
! 		/* Count newlines for pager */
! 		for (i = 0; QL_HELP[i].cmd; i++)
  		{
! 			if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
! 				strcmp(topic, "*") == 0)
! 			{
! 				nl_count += 5;
! 				for (ch = QL_HELP[i].syntax; *ch != '\0'; ch++)
! 					if (*ch == '\n')
! 						nl_count++;
! 				/* If we have an exact match, exit.  Fixes \h SELECT */
! 				if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
! 					break;
! 			}
! 		}
! 
! 		output = PageOutput(nl_count, pager);
! 
! 		for (i = 0; QL_HELP[i].cmd; i++)
! 		{
! 			if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
! 				strcmp(topic, "*") == 0)
! 			{
! 				help_found = true;
! 				fprintf(output, _("Command:     %s\n"
! 								  "Description: %s\n"
! 								  "Syntax:\n%s\n\n"),
! 						QL_HELP[i].cmd,
! 						_(QL_HELP[i].help),
! 						_(QL_HELP[i].syntax));
! 				/* If we have an exact match, exit.  Fixes \h SELECT */
! 				if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
! 					break;
! 			}
  		}
  
  		if (!help_found)
--- 304,381 ----
  	}
  	else
  	{
! 			int			i,j,x=0;
  		bool		help_found = false;
  		FILE	   *output;
! 		size_t		len, wordlen;
  		int			nl_count = 0;
  		char	   *ch;
  
! 		/* User gets two chances: exact match, then the first word */
! 		
! 		/* First pass : strip trailing spaces and semicolons */
  		len = strlen(topic);
  		while (topic[len - 1] == ' ' || topic[len - 1] == ';')
! 				len--;
  
! 		for (x=1; x<=3; x++) /* Three chances to guess that word... */
  		{
! 				if (x>1) /* Nothing on first pass - try the opening words */
! 				{
! 						wordlen=j=1;
! 						while (topic[j] != ' ' && j++<len)
! 								wordlen++;
! 						if (x==2)
! 						{
! 								j++;
! 								while (topic[j] != ' ' && j++<=len)
! 										wordlen++;
! 						}
! 						if (wordlen >= len) /* Don't try again if the same word */
! 						{
! 								output = PageOutput(nl_count, pager);
! 								break;
! 						}
! 						len = wordlen;
! 				}
! 
! 				/* Count newlines for pager */
! 				for (i = 0; QL_HELP[i].cmd; i++)
! 				{
! 						if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
! 								strcmp(topic, "*") == 0)
! 						{
! 								nl_count += 5;
! 								for (ch = QL_HELP[i].syntax; *ch != '\0'; ch++)
! 										if (*ch == '\n')
! 												nl_count++;
! 								/* If we have an exact match, exit.  Fixes \h SELECT */
! 								if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
! 										break;
! 						}
! 				}
! 				
! 				output = PageOutput(nl_count, pager);
! 				
! 				for (i = 0; QL_HELP[i].cmd; i++)
! 				{
! 						if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
! 								strcmp(topic, "*") == 0)
! 						{
! 								help_found = true;
! 								fprintf(output, _("Command:     %s\n"
! 																	"Description: %s\n"
! 																	"Syntax:\n%s\n\n"),
! 												QL_HELP[i].cmd,
! 												_(QL_HELP[i].help),
! 												_(QL_HELP[i].syntax));
! 								/* If we have an exact match, exit.  Fixes \h SELECT */
! 								if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
! 										break;
! 						}
! 				}
! 				if (help_found) /* Don't keep trying if we got a match */
! 						break;
  		}
  
  		if (!help_found)
---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]

Reply via email to