diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index 9c1e6d3a57459f8c9652befb70c42fbfcc54562e..1bbe4acc43fa7a3f8d677c7fa676f87daa468a44 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2005, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/help.c,v 1.102 2005/06/14 02:57:41 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/help.c,v 1.103 2005/07/06 03:14:48 momjian Exp $
  */
 #include "postgres_fe.h"
 #include "common.h"
@@ -305,52 +305,78 @@ helpSQL(const char *topic, unsigned short int pager)
 	}
 	else
 	{
-		int			i;
+			int			i,j,x=0;
 		bool		help_found = false;
 		FILE	   *output;
-		size_t		len;
+		size_t		len, wordlen;
 		int			nl_count = 0;
 		char	   *ch;
 
-		/* don't care about trailing spaces or semicolons */
+		/* 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--;
-
-		/* 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);
+				len--;
 
-		for (i = 0; QL_HELP[i].cmd; i++)
+		for (x=1; x<=3; x++) /* Three chances to guess that word... */
 		{
-			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 (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)