aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/quote.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-03-21 16:29:20 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-03-21 16:29:20 +0000
commit775d28302cda48b3f22a2f4f9067de0cf5192fff (patch)
treef7f6cc2003523328172d2d8aab547c589a3431b0 /src/backend/utils/adt/quote.c
parent6a8eb1a7b6dd48bceca9ed0e449ef8d1c09967e3 (diff)
downloadpostgresql-775d28302cda48b3f22a2f4f9067de0cf5192fff.tar.gz
postgresql-775d28302cda48b3f22a2f4f9067de0cf5192fff.zip
Fix quote_ident to use quote_identifier rather than its own, not quite
up-to-speed logic; in particular this will cause it to quote names that match keywords. Remove unnecessary multibyte cruft from quote_literal (all backend-internal encodings are 8-bit-safe).
Diffstat (limited to 'src/backend/utils/adt/quote.c')
-rw-r--r--src/backend/utils/adt/quote.c154
1 files changed, 23 insertions, 131 deletions
diff --git a/src/backend/utils/adt/quote.c b/src/backend/utils/adt/quote.c
index 7065a1f2e52..8650a0d2e86 100644
--- a/src/backend/utils/adt/quote.c
+++ b/src/backend/utils/adt/quote.c
@@ -7,23 +7,15 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/quote.c,v 1.14 2005/01/01 05:43:07 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/quote.c,v 1.15 2005/03/21 16:29:20 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
-#include <ctype.h>
-
-#include "mb/pg_wchar.h"
#include "utils/builtins.h"
-static bool quote_ident_required(text *iptr);
-static text *do_quote_ident(text *iptr);
-static text *do_quote_literal(text *iptr);
-
-
/*
* quote_ident -
* returns a properly quoted identifier
@@ -33,16 +25,22 @@ quote_ident(PG_FUNCTION_ARGS)
{
text *t = PG_GETARG_TEXT_P(0);
text *result;
+ const char *qstr;
+ char *str;
+ int len;
- if (quote_ident_required(t))
- result = do_quote_ident(t);
- else
- {
- result = (text *) palloc(VARSIZE(t));
- memcpy(result, t, VARSIZE(t));
- }
+ /* We have to convert to a C string to use quote_identifier */
+ len = VARSIZE(t) - VARHDRSZ;
+ str = (char *) palloc(len + 1);
+ memcpy(str, VARDATA(t), len);
+ str[len] = '\0';
- PG_FREE_IF_COPY(t, 0);
+ qstr = quote_identifier(str);
+
+ len = strlen(qstr);
+ result = (text *) palloc(len + VARHDRSZ);
+ VARATT_SIZEP(result) = len + VARHDRSZ;
+ memcpy(VARDATA(result), qstr, len);
PG_RETURN_TEXT_P(result);
}
@@ -56,136 +54,30 @@ quote_literal(PG_FUNCTION_ARGS)
{
text *t = PG_GETARG_TEXT_P(0);
text *result;
-
- result = do_quote_literal(t);
-
- PG_FREE_IF_COPY(t, 0);
-
- PG_RETURN_TEXT_P(result);
-}
-
-/*
- * Check if a given identifier needs quoting
- */
-static bool
-quote_ident_required(text *iptr)
-{
- char *cp;
- char *ep;
-
- cp = VARDATA(iptr);
- ep = VARDATA(iptr) + VARSIZE(iptr) - VARHDRSZ;
-
- if (cp >= ep)
- return true;
-
- if (pg_mblen(cp) != 1)
- return true;
- if (!(*cp == '_' || (*cp >= 'a' && *cp <= 'z')))
- return true;
-
- while ((++cp) < ep)
- {
- if (pg_mblen(cp) != 1)
- return true;
-
- if (*cp >= 'a' && *cp <= 'z')
- continue;
- if (*cp >= '0' && *cp <= '9')
- continue;
- if (*cp == '_')
- continue;
-
- return true;
- }
-
- return false;
-}
-
-/*
- * Return a properly quoted identifier
- */
-static text *
-do_quote_ident(text *iptr)
-{
- text *result;
char *cp1;
char *cp2;
int len;
- int wl;
- len = VARSIZE(iptr) - VARHDRSZ;
- result = (text *) palloc(len * 2 + VARHDRSZ + 2);
+ len = VARSIZE(t) - VARHDRSZ;
+ /* We make a worst-case result area; wasting a little space is OK */
+ result = (text *) palloc(len * 2 + 2 + VARHDRSZ);
- cp1 = VARDATA(iptr);
- cp2 = VARDATA(result);
-
- *cp2++ = '"';
- while (len > 0)
- {
- if ((wl = pg_mblen(cp1)) != 1)
- {
- len -= wl;
-
- while (wl-- > 0)
- *cp2++ = *cp1++;
- continue;
- }
-
- if (*cp1 == '"')
- *cp2++ = '"';
- *cp2++ = *cp1++;
-
- len--;
- }
- *cp2++ = '"';
-
- VARATT_SIZEP(result) = cp2 - ((char *) result);
-
- return result;
-}
-
-/*
- * Return a properly quoted literal value
- */
-static text *
-do_quote_literal(text *lptr)
-{
- text *result;
- char *cp1;
- char *cp2;
- int len;
- int wl;
-
- len = VARSIZE(lptr) - VARHDRSZ;
- result = (text *) palloc(len * 2 + VARHDRSZ + 2);
-
- cp1 = VARDATA(lptr);
+ cp1 = VARDATA(t);
cp2 = VARDATA(result);
*cp2++ = '\'';
- while (len > 0)
+ while (len-- > 0)
{
- if ((wl = pg_mblen(cp1)) != 1)
- {
- len -= wl;
-
- while (wl-- > 0)
- *cp2++ = *cp1++;
- continue;
- }
-
if (*cp1 == '\'')
*cp2++ = '\'';
- if (*cp1 == '\\')
+ else if (*cp1 == '\\')
*cp2++ = '\\';
- *cp2++ = *cp1++;
- len--;
+ *cp2++ = *cp1++;
}
*cp2++ = '\'';
VARATT_SIZEP(result) = cp2 - ((char *) result);
- return result;
+ PG_RETURN_TEXT_P(result);
}