diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index 986ee365a527e0aea7023af715aad1af98992f3a..0883d438f1cc904fcbc82db417494dcbee9aadd3 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -58,7 +58,8 @@ static bool
  * Handles all the different commands that start with '\',
  * ordinarily called by MainLoop().
  *
- * 'line' is the current input line, which must start with a '\'
+ * 'line' is the current input line, which should not start with a '\'
+ * but with the actual command name
  * (that is taken care of by MainLoop)
  *
  * 'query_buf' contains the query-so-far, which may be modified by
@@ -89,16 +90,22 @@ HandleSlashCmds(PsqlSettings *pset,
 	my_line = xstrdup(line);
 
 	/*
-	 * Find the first whitespace (or backslash) line[blank_loc] will now
+	 * Find the first whitespace. line[blank_loc] will now
 	 * be the whitespace character or the \0 at the end
+     *
+     * Also look for a backslash, so stuff like \p\g works.
 	 */
-	blank_loc = strcspn(my_line, " \t");
+	blank_loc = strcspn(my_line, " \t\\");
 
+    if (my_line[blank_loc] == '\\')
+    {
+        continue_parse = &my_line[blank_loc];
+		my_line[blank_loc] = '\0';
+    }
 	/* do we have an option string? */
-	if (my_line[blank_loc] != '\0')
-	{
-		options_string = &my_line[blank_loc + 1];
-
+	else if (my_line[blank_loc] != '\0')
+    {
+        options_string = &my_line[blank_loc + 1];
 		my_line[blank_loc] = '\0';
 	}
 
@@ -198,7 +205,6 @@ HandleSlashCmds(PsqlSettings *pset,
 	}
 
 	cmd = my_line;
-
 	status = exec_command(cmd, options, options_string, query_buf, pset);
 
 	if (status == CMD_UNKNOWN)
diff --git a/src/bin/psql/psqlHelp.h b/src/bin/psql/psqlHelp.h
deleted file mode 100644
index 81bee606f59625e1f2a562ac489d84a7f118c50e..0000000000000000000000000000000000000000
--- a/src/bin/psql/psqlHelp.h
+++ /dev/null
@@ -1,389 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * psqlHelp.h
- *	  Help for query language syntax
- *
- * Copyright (c) 1994, Regents of the University of California
- *
- * $Id: psqlHelp.h,v 1.81 1999/11/04 23:14:29 momjian Exp $
- *
- *-------------------------------------------------------------------------
- */
-
-struct _helpStruct
-{
-	char	   *cmd;			/* the command name */
-	char	   *help;			/* the help associated with it */
-	char	   *syntax;			/* the syntax associated with it */
-};
-
-static struct _helpStruct QL_HELP[] = {
-	{"abort transaction",
-		"abort the current transaction",
-	"\
-\tabort [transaction|work];"},
-	{"alter table",
-		"add/rename columns, rename tables",
-	"\
-\tALTER TABLE table_name [*] ADD COLUMN column_name type\n\
-\tALTER TABLE table_name [*] RENAME [COLUMN] column_name1 TO column_name2\n\
-\tALTER TABLE table_name1 RENAME TO table_name2"},
-	{"alter user",
-		"alter system information for a user",
-	"\
-\tALTER USER user_name\n\
-\t[WITH PASSWORD password]\n\
-\t[CREATEDB | NOCCREATEDB]\n\
-\t[CREATEUSER | NOCREATEUSER]\n\
-\t[IN GROUP group_1, ...groupN]\n\
-\t[VALID UNTIL 'abstime'];"},
-	{"begin work",
-		"begin a new transaction",
-	"\
-\tBEGIN [WORK|TRANSACTION];"},
-	{"close",
-		"close an existing cursor (cursor)",
-	"\
-\tCLOSE cursorname;"},
-	{"cluster",
-		"create a clustered index (from an existing index)",
-	"\
-\tCLUSTER index_name ON relation_name"},
-	{"comment",
-		"add comment on object",
-	"\
-\tCOMMENT ON\n\
-[\n\
-  [ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ] <object_name> |\n\
-  COLUMN <table_name>.<column_name>|\n\
-  AGGREGATE <agg_name> <agg_type>|\n\
-  FUNCTION <func_name> (arg1, arg2, ...)|\n\
-  OPERATOR <op> (leftoperand_type rightoperand_type) |\n\
-  TRIGGER <trigger_name> ON <table_name>\n\
-] IS 'text'"},
-	{"commit work",
-		"commit a transaction",
-	"\
-\tCOMMIT [WORK|TRANSACTION]"},
-	{"copy",
-		"copy data to and from a table",
-	"\
-\tCOPY [BINARY] table_name [WITH OIDS]\n\
-\tTO|FROM filename|STDIN|STDOUT [ [USING] DELIMITERS 'delim'];"},
-	{"create",
-		"Please be more specific:",
-	"\
-\tcreate aggregate\n\
-\tcreate database\n\
-\tcreate function\n\
-\tcreate index\n\
-\tcreate operator\n\
-\tcreate rule\n\
-\tcreate sequence\n\
-\tcreate table\n\
-\tcreate trigger\n\
-\tcreate type\n\
-\tcreate view"},
-	{"create aggregate",
-		"define an aggregate function",
-	"\
-\tCREATE AGGREGATE agg_name [AS] (BASETYPE = data_type, \n\
-\t[SFUNC1 = sfunc_1, STYPE1 = sfunc1_return_type]\n\
-\t[SFUNC2 = sfunc_2, STYPE2 = sfunc2_return_type]\n\
-\t[,FINALFUNC = final-function]\n\
-\t[,INITCOND1 = initial-cond1][,INITCOND2 = initial-cond2]);"},
-	{"create database",
-		"create a database",
-	"\
-\tCREATE DATABASE dbname [WITH LOCATION = 'dbpath']"},
-	{"create function",
-		"create a user-defined function",
-	"\
-\tCREATE FUNCTION function_name ([type1, ...typeN]) RETURNS return_type\n\
-\t[WITH ( column_names )]\n\
-\tAS 'sql_queries'|'builtin_function_name'|'procedural_commands'\n\
-\tLANGUAGE 'sql'|'internal'|'procedural_language_name';\n\
-\n\
-OR\n\
-\n\
-\tCREATE FUNCTION function_name ([type1, ...typeN]) RETURNS return_type\n\
-\t[WITH ( column_names )]\n\
-\tAS 'object_filename' [, 'link_symbol']\n\
-\tLANGUAGE 'C';"},
-	{"create index",
-		"construct an index",
-	"\
-\tCREATE [UNIQUE] INDEX indexname ON table_name [USING access_method]\n\
-( column_name1 [type_class1], ...column_nameN |\n\
-  funcname(column_name1, ...) [type_class] );"},
-	{"create operator",
-		"create a user-defined operator",
-	"\
-\tCREATE OPERATOR operator_name (\n\
-\t[LEFTARG = type1][,RIGHTARG = type2]\n\
-\t,PROCEDURE = func_name,\n\
-\t[,COMMUTATOR = com_op][,NEGATOR = neg_op]\n\
-\t[,RESTRICT = res_proc][,JOIN = join_proc][,HASHES]\n\
-\t[,SORT1 = left_sort_op][,SORT2 = right_sort_op]);"},
-	{"create rule",
-		"define a new rule",
-	"\
-\tCREATE RULE rule_name AS ON\n\
-\t{ SELECT | UPDATE | DELETE | INSERT }\n\
-\tTO object_name [WHERE qual]\n\
-\tDO [INSTEAD] [action|NOTHING|[actions]];"},
-	{"create sequence",
-		"create a new sequence number generator",
-	"\
-\tCREATE SEQUENCE sequence_name\n\
-\t[INCREMENT number]\n\
-\t[START number]\n\
-\t[MINVALUE number]\n\
-\t[MAXVALUE number]\n\
-\t[CACHE number]\n\
-\t[CYCLE];"},
-	{"create table",
-		"create a new table",
-	"\
-\tCREATE [TEMP] TABLE table_name\n\
-\t(column_name1 type1 [DEFAULT expression] [NOT NULL], ...column_nameN\n\
-\t[[CONSTRAINT name] CHECK condition1, ...conditionN] )\n\
-\t[INHERITS (table_name1, ...table_nameN)\n\
-;"},
-	{"create trigger",
-		"create a new trigger",
-	"\
-\tCREATE TRIGGER trigger_name AFTER|BEFORE event1 [OR event2 [OR event3] ]\n\
-\tON table_name FOR EACH ROW|STATEMENT\n\
-\tEXECUTE PROCEDURE func_name ([arguments])\n\
-\n\
-\teventX is one of INSERT, DELETE, UPDATE"},
-	{"create type",
-		"create a new user-defined base data type",
-	"\
-\tCREATE TYPE typename (\n\
-\tINTERNALLENGTH = (number|VARIABLE),\n\
-\t[EXTERNALLENGTH = (number|VARIABLE),]\n\
-\tINPUT = input_function, OUTPUT = output_function\n\
-\t[,ELEMENT = typename][,DELIMITER = character][,DEFAULT=\'<string>\']\n\
-\t[,SEND = send_function][,RECEIVE = receive_function][,PASSEDBYVALUE]);"},
-	{"create user",
-		"create a new user",
-	"\
-\tCREATE USER user_name\n\
-\t[WITH PASSWORD password]\n\
-\t[CREATEDB | NOCREATEDB]\n\
-\t[CREATEUSER | NOCREATEUSER]\n\
-\t[IN GROUP group1, ...groupN]\n\
-\t[VALID UNTIL 'abstime'];"},
-	{"create view",
-		"create a view",
-	"\
-\tCREATE VIEW view_name AS\n\
-\tSELECT [DISTINCT [ON column_nameN]]\n\
-\texpr1 [AS column_name1], ...exprN\n\
-\t[FROM table_list]\n\
-\t[WHERE qual]\n\
-\t[GROUP BY group_list];"},
-	{"declare",
-		"set up a cursor",
-	"\
-\tDECLARE cursorname [BINARY] CURSOR FOR\n\
-\tSELECT [DISTINCT [ON column_nameN]]\n\
-\texpr1 [AS column_name1], ...exprN\n\
-\t[FROM table_list]\n\
-\t[WHERE qual]\n\
-\t[GROUP BY group_list]\n\
-\t[HAVING having_clause]\n\
-\t[ORDER BY column_name1 [USING op1], ...column_nameN]\n\
-\t[ { UNION [ALL] | INTERSECT | EXCEPT } SELECT ...];"},
-	{"delete",
-		"delete tuples",
-	"\
-\tDELETE FROM table_name [WHERE qual];"},
-	{"drop",
-		"Please be more specific:",
-	"\
-\tdrop aggregate\n\
-\tdrop database\n\
-\tdrop function\n\
-\tdrop index\n\
-\tdrop operator\n\
-\tdrop rule\n\
-\tdrop sequence\n\
-\tdrop table\n\
-\tdrop trigger\n\
-\tdrop type\n\
-\tdrop view"},
-	{"drop aggregate",
-		"remove an aggregate function",
-	"\
-\tDROP AGGREGATE agg_name agg_type|*;"},
-	{"drop database",
-		"remove a database",
-	"\
-\tDROP DATABASE dbname"},
-	{"drop function",
-		"remove a user-defined function",
-	"\
-\tDROP FUNCTION funcname ([type1, ...typeN]);"},
-	{"drop index",
-		"remove an existing index",
-	"\
-\tDROP INDEX indexname;"},
-	{"drop operator",
-		"remove a user-defined operator",
-	"\
-\tDROP OPERATOR operator_name ([ltype|NONE],[RTYPE|none]);"},
-	{"drop rule",
-		"remove a rule",
-	"\
-\tDROP RULE rulename;"},
-	{"drop sequence",
-		"remove a sequence number generator",
-	"\
-\tDROP SEQUENCE sequence_name[, ...sequence_nameN];"},
-	{"drop table",
-		"remove a table",
-	"\
-\tDROP TABLE table_name1, ...table_nameN;"},
-	{"drop trigger",
-		"remove a trigger",
-	"\
-\tDROP TRIGGER trigger_name ON table_name;"},
-	{"drop type",
-		"remove a user-defined base type",
-	"\
-\tDROP TYPE typename;"},
-	{"drop user",
-		"remove a user from the system",
-	"\
-\tDROP USER user_name;"},
-	{"drop view",
-		"remove a view",
-	"\
-\tDROP VIEW view_name"},
-	{"end work",
-		"end the current transaction",
-	"\
-\tEND [WORK|TRANSACTION];"},
-	{"explain",
-		"explain the query execution plan",
-	"\
-\tEXPLAIN [VERBOSE] query"},
-	{"fetch",
-		"retrieve tuples from a cursor",
-	"\
-\tFETCH [FORWARD|BACKWARD] [number|ALL] [IN cursorname];"},
-	{"grant",
-		"grant access control to a user or group",
-	"\
-\tGRANT privilege1, ...privilegeN ON rel1, ...relN TO \n\
-{ PUBLIC | GROUP group | username }\n\
-\t privilege is { ALL | SELECT | INSERT | UPDATE | DELETE | RULE }"},
-	{"insert",
-		"insert tuples",
-	"\
-\tINSERT INTO table_name [(column_name1, ...column_nameN)]\n\
-\tVALUES (expr1,..exprN) |\n\
-\tSELECT [DISTINCT [ON column_nameN]]\n\
-\texpr1, ...exprN\n\
-\t[FROM table_list]\n\
-\t[WHERE qual]\n\
-\t[GROUP BY group_list]\n\
-\t[HAVING having_clause]\n\
-\t[ { UNION [ALL] | INTERSECT | EXCEPT } SELECT ...];"},
-	{"listen",
-		"listen for notification on a condition name",
-	"\
-\tLISTEN name|\"non-name string\""},
-	{"load",
-		"dynamically load a module",
-	"\
-\tLOAD 'filename';"},
-	{"lock",
-		"exclusive lock a table inside a transaction",
-	"\
-\tLOCK [TABLE] table_name \n\
-\t[IN [ROW|ACCESS] [SHARE|EXCLUSIVE] | [SHARE ROW EXCLUSIVE] MODE];"},
-	{"move",
-		"move an cursor position",
-	"\
-\tMOVE [FORWARD|BACKWARD] [number|ALL] [IN cursorname];"},
-	{"notify",
-		"signal all frontends listening on a condition name",
-	"\
-\tNOTIFY name|\"non-name string\""},
-	{"reset",
-		"set run-time environment back to default",
-	"\
-\tRESET DATESTYLE|COST_HEAP|COST_INDEX|GEQO|KSQO|PG_OPTIONS|\n\
-TIMEZONE|XACTISOLEVEL|CLIENT_ENCODING|SERVER_ENCODING"},
-	{"revoke",
-		"revoke access control from a user or group",
-	"\
-\tREVOKE privilege1, ...privilegeN ON rel1, ...relN FROM \n\
-{ PUBLIC | GROUP group | username }\n\
-\t privilege is { ALL | SELECT | INSERT | UPDATE | DELETE | RULE }"},
-	{"rollback work",
-		"abort a transaction",
-	"\
-\tROLLBACK [WORK|TRANSACTION]"},
-	{"select",
-		"retrieve tuples",
-	"\
-\tSELECT [DISTINCT [ON column_nameN]] expr1 [AS column_name1], ...exprN\n\
-\t[INTO [TEMP] [TABLE] table_name]\n\
-\t[FROM table_list]\n\
-\t[WHERE qual]\n\
-\t[GROUP BY group_list]\n\
-\t[HAVING having_clause]\n\
-\t[ { UNION [ALL] | INTERSECT | EXCEPT } SELECT ...]\n\
-\t[ORDER BY column_name1 [ASC|DESC] [USING op1], ...column_nameN ]\n\
-\t[FOR UPDATE [OF table_name...]]\n\
-\t[LIMIT count [OFFSET|, count]];"},
-	{"set",
-		"set run-time environment",
-	"\
-\tSET DATESTYLE TO 'ISO'|'SQL'|'Postgres'|'European'|'US'|'NonEuropean'\n\
-\tSET COST_HEAP TO #\n\
-\tSET COST_INDEX TO #\n\
-\tSET GEQO TO 'ON[=#]'|'OFF'\n\
-\tSET KSQO TO 'ON'|'OFF'\n\
-\tSET PG_OPTIONS TO 'value'\n\
-\tSET TIMEZONE TO 'value'\n\
-\tSET TRANSACTION ISOLATION LEVEL 'SERIALIZABLE'|'READ COMMITTED'\n\
-\tSET CLIENT_ENCODING|NAMES TO 'EUC_JP'|'SJIS'|'EUC_CN'|'EUC_KR'|'EUC_TW'|\n\
-\t  'BIG5'|'MULE_INTERNAL'|'LATIN1'|'LATIN2'|'LATIN3'|'LATIN4'|'LATIN5'|\n\
-\t  'KOI8|'WIN'|'ALT'|'WIN1250'\n\
-\tSET SERVER_ENCODING TO 'EUC_JP'|'SJIS'|'EUC_CN'|'EUC_KR'|'EUC_TW'|\n\
-\t  'BIG5'|'MULE_INTERNAL'|'LATIN1'|'LATIN2'|'LATIN3'|'LATIN4'|'LATIN5'|\n\
-\t  'KOI8|'WIN'|'ALT'"},
-	{"show",
-		"show current run-time environment",
-	"\
-\tSHOW DATESTYLE|COST_HEAP|COST_INDEX|GEQO|KSQO|PG_OPTIONS|\n\
-TIMEZONE|XACTISOLEVEL|CLIENT_ENCODING|SERVER_ENCODING"},
-	{"unlisten",
-		"stop listening for notification on a condition name",
-	"\
-\tUNLISTEN name|\"non-name string\"|\"*\""},
-	{"truncate",
-		"quickly removes all rows from a table",
-	"\
-\tTRUNCATE TABLE table_name"},
-	{"update",
-		"update tuples",
-	"\
-\tUPDATE table_name SET column_name1 = expr1, ...column_nameN = exprN\n\
-\t[FROM table_list]\n\
-\t[WHERE qual];"},
-	{"vacuum",
-		"vacuum the database, i.e. cleans out deleted records, updates statistics",
-	"\
-\tVACUUM [VERBOSE] [ANALYZE] [table]\n\
-\tor\n\
-\tVACUUM [VERBOSE]  ANALYZE  [table [(column_name1, ...column_nameN)]];"},
-	{NULL, NULL, NULL}			/* important to keep a NULL terminator
-								 * here! */
-};
diff --git a/src/tools/release_prep b/src/tools/release_prep
index 8fa1fa5bf2891d5c546c96349b0ca0eee7405a7d..a376ba4490890f5e6a1e7c4cffbfa13828f7f666 100755
--- a/src/tools/release_prep
+++ b/src/tools/release_prep
@@ -51,6 +51,16 @@ $MAKE preproc.c preproc.h pgc.c
 
 cd ../../..
 
+# Generate psql's help on SQL command from the SGML docs
+
+cd bin/psql
+
+rm -f sql_help.h
+
+$MAKE sql_help.h
+
+cd ../..
+
 # Clean up
 
 $MAKE distclean