diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index a4f182770b92ccca8c9a0f4cbc69290f46594e73..b62559ccdde64ae49d4b09c553e4ac5c54953b76 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -3,7 +3,7 @@
  *			  out of it's tuple
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.33 1999/11/24 16:52:37 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.34 1999/12/06 02:37:17 tgl Exp $
  *
  *	  This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -48,6 +48,7 @@
 #include "lib/stringinfo.h"
 #include "optimizer/clauses.h"
 #include "optimizer/tlist.h"
+#include "parser/keywords.h"
 #include "parser/parsetree.h"
 #include "utils/builtins.h"
 #include "utils/lsyscache.h"
@@ -1764,8 +1765,8 @@ quote_identifier(char *ident)
 {
 	/*
 	 * Can avoid quoting if ident starts with a lowercase letter and
-	 * contains only lowercase letters, digits, and underscores.
-	 * Otherwise, supply quotes.
+	 * contains only lowercase letters, digits, and underscores,
+	 * *and* is not any SQL keyword.  Otherwise, supply quotes.
 	 */
 	bool		safe;
 	char	   *result;
@@ -1791,6 +1792,21 @@ quote_identifier(char *ident)
 		}
 	}
 
+	if (safe)
+	{
+		/*
+		 * Check for keyword.  This test is overly strong, since many of
+		 * the "keywords" known to the parser are usable as column names,
+		 * but the parser doesn't provide any easy way to test for whether
+		 * an identifier is safe or not... so be safe not sorry.
+		 *
+		 * Note: ScanKeywordLookup() expects an all-lower-case input, but
+		 * we've already checked we have that.
+		 */
+		if (ScanKeywordLookup(ident) != NULL)
+			safe = false;
+	}
+
 	if (safe)
 		return ident;			/* no change needed */