Commit 53311358 authored by Tom Lane's avatar Tom Lane

Rule deparser needs to quote identifiers that are spelled the same as

SQL keywords.
parent 7657bce7
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* out of it's tuple * out of it's tuple
* *
* IDENTIFICATION * 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. * This software is copyrighted by Jan Wieck - Hamburg.
* *
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include "lib/stringinfo.h" #include "lib/stringinfo.h"
#include "optimizer/clauses.h" #include "optimizer/clauses.h"
#include "optimizer/tlist.h" #include "optimizer/tlist.h"
#include "parser/keywords.h"
#include "parser/parsetree.h" #include "parser/parsetree.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/lsyscache.h" #include "utils/lsyscache.h"
...@@ -1764,8 +1765,8 @@ quote_identifier(char *ident) ...@@ -1764,8 +1765,8 @@ quote_identifier(char *ident)
{ {
/* /*
* Can avoid quoting if ident starts with a lowercase letter and * Can avoid quoting if ident starts with a lowercase letter and
* contains only lowercase letters, digits, and underscores. * contains only lowercase letters, digits, and underscores,
* Otherwise, supply quotes. * *and* is not any SQL keyword. Otherwise, supply quotes.
*/ */
bool safe; bool safe;
char *result; char *result;
...@@ -1791,6 +1792,21 @@ quote_identifier(char *ident) ...@@ -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) if (safe)
return ident; /* no change needed */ return ident; /* no change needed */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment