diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index 3f76fd8d04114c52ea26fc4815ed0479b745a75d..b3df4860e09c582bbedc4abf7990d88546c98bfc 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.226 2009/07/24 19:35:44 petere Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.227 2009/07/25 17:04:19 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -774,7 +774,7 @@ testdb=&gt;
               [ header ]
               [ quote [ as ] '<replaceable class="parameter">character</replaceable>' ]
               [ escape [ as ] '<replaceable class="parameter">character</replaceable>' ]
-              [ force quote <replaceable class="parameter">column_list</replaceable> ]
+              [ force quote <replaceable class="parameter">column_list</replaceable> | * ]
               [ force not null <replaceable class="parameter">column_list</replaceable> ] ]</literal>
         </term>
 
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index eb3af9798d165da327441368560f073becba68fd..b41da6385db8c6641e1a436084138cc35387671f 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.314 2009/07/25 13:35:32 adunstan Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.315 2009/07/25 17:04:19 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -722,6 +722,7 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
 	List	   *attnamelist = stmt->attlist;
 	List	   *force_quote = NIL;
 	List	   *force_notnull = NIL;
+	bool		force_quote_all = false;
 	AclMode		required_access = (is_from ? ACL_INSERT : ACL_SELECT);
 	AclMode		relPerms;
 	AclMode		remainingPerms;
@@ -729,8 +730,7 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
 	TupleDesc	tupDesc;
 	int			num_phys_attrs;
 	uint64		processed;
-	bool		force_quote_all = false;
-	
+
 	/* Allocate workspace and zero all fields */
 	cstate = (CopyStateData *) palloc0(sizeof(CopyStateData));
 
@@ -805,12 +805,11 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
 		}
 		else if (strcmp(defel->defname, "force_quote") == 0)
 		{
-			if (force_quote)
+			if (force_quote || force_quote_all)
 				ereport(ERROR,
 						(errcode(ERRCODE_SYNTAX_ERROR),
 						 errmsg("conflicting or redundant options")));
-
-			if (IsA(defel->arg, A_Star))
+			if (defel->arg && IsA(defel->arg, A_Star))
 				force_quote_all = true;
 			else
 				force_quote = (List *) defel->arg;
@@ -930,11 +929,11 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
 				 errmsg("COPY escape must be a single one-byte character")));
 
 	/* Check force_quote */
-	if (!cstate->csv_mode && force_quote != NIL)
+	if (!cstate->csv_mode && (force_quote != NIL || force_quote_all))
 		ereport(ERROR,
 				(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 				 errmsg("COPY force quote available only in CSV mode")));
-	if (force_quote != NIL && is_from)
+	if ((force_quote != NIL || force_quote_all) && is_from)
 		ereport(ERROR,
 				(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 				 errmsg("COPY force quote only available using COPY TO")));
diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c
index 57593d111c11f1462b5a0f3571a104c980efc1f9..01fe0f6c84db8d936811256ffeb41d9acd8de97e 100644
--- a/src/bin/psql/copy.c
+++ b/src/bin/psql/copy.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2009, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.80 2009/04/26 15:31:50 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.81 2009/07/25 17:04:19 tgl Exp $
  */
 #include "postgres_fe.h"
 #include "copy.h"
@@ -35,12 +35,12 @@
  *	\copy tablename [(columnlist)] from|to filename
  *	  [ with ] [ binary ] [ oids ] [ delimiter [as] char ] [ null [as] string ]
  *	  [ csv  [ header ] [ quote [ AS ] string ]  escape [as] string
- *		[ force not null column [, ...] | force quote column [, ...] ] ]
+ *		[ force not null column [, ...] | force quote column [, ...] | * ] ]
  *
  *	\copy ( select stmt ) to filename
  *	  [ with ] [ binary ] [ delimiter [as] char ] [ null [as] string ]
  *	  [ csv  [ header ] [ quote [ AS ] string ]  escape [as] string
- *		[ force quote column [, ...] ] ]
+ *		[ force quote column [, ...] | * ] ]
  *
  * Force quote only applies for copy to; force not null only applies for
  * copy from.