OSDN Git Service

Rule deparser needs to quote identifiers that are spelled the same as
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 6 Dec 1999 02:37:17 +0000 (02:37 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 6 Dec 1999 02:37:17 +0000 (02:37 +0000)
SQL keywords.

src/backend/utils/adt/ruleutils.c

index a4f1827..b62559c 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;
@@ -1792,6 +1793,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 */
 
        result = (char *) palloc(strlen(ident) + 2 + 1);