Rule deparser needs to quote identifiers that are spelled the same as
authorTom Lane
Mon, 6 Dec 1999 02:37:17 +0000 (02:37 +0000)
committerTom Lane
Mon, 6 Dec 1999 02:37:17 +0000 (02:37 +0000)
SQL keywords.

src/backend/utils/adt/ruleutils.c

index a4f182770b92ccca8c9a0f4cbc69290f46594e73..b62559ccdde64ae49d4b09c553e4ac5c54953b76 100644 (file)
@@ -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 */