From 45173ae24e308061c008f77996f3edbebe0e4dc2 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 4 May 2008 16:42:41 +0000 Subject: [PATCH] Use new cstring/text conversion functions in some additional places. These changes assume that the varchar and xml data types are represented the same as text. (I did not, however, accept the portions of the proposed patch that wanted to assume bytea is the same as text --- tgl.) Brendan Jurd --- contrib/pgcrypto/pgp-pgsql.c | 9 ++--- contrib/xml2/xpath.c | 21 ++--------- contrib/xml2/xslt_proc.c | 17 ++------- src/backend/utils/adt/varchar.c | 10 ++--- src/backend/utils/adt/xml.c | 66 ++++++--------------------------- 5 files changed, 24 insertions(+), 99 deletions(-) diff --git a/contrib/pgcrypto/pgp-pgsql.c b/contrib/pgcrypto/pgp-pgsql.c index 9f38c621c9..5ffa5ad0a9 100644 --- a/contrib/pgcrypto/pgp-pgsql.c +++ b/contrib/pgcrypto/pgp-pgsql.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $PostgreSQL: pgsql/contrib/pgcrypto/pgp-pgsql.c,v 1.9 2007/02/27 23:48:06 tgl Exp $ + * $PostgreSQL: pgsql/contrib/pgcrypto/pgp-pgsql.c,v 1.10 2008/05/04 16:42:41 tgl Exp $ */ #include "postgres.h" @@ -34,6 +34,7 @@ #include "fmgr.h" #include "parser/scansup.h" #include "mb/pg_wchar.h" +#include "utils/builtins.h" #include "mbuf.h" #include "px.h" @@ -140,7 +141,6 @@ static text * convert_charset(text *src, int cset_from, int cset_to) { int src_len = VARSIZE(src) - VARHDRSZ; - int dst_len; unsigned char *dst; unsigned char *csrc = (unsigned char *) VARDATA(src); text *res; @@ -149,10 +149,7 @@ convert_charset(text *src, int cset_from, int cset_to) if (dst == csrc) return src; - dst_len = strlen((char *) dst); - res = palloc(dst_len + VARHDRSZ); - memcpy(VARDATA(res), dst, dst_len); - SET_VARSIZE(res, dst_len + VARHDRSZ); + res = cstring_to_text((char *) dst); pfree(dst); return res; } diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c index 601733ac87..98865bac7a 100644 --- a/contrib/xml2/xpath.c +++ b/contrib/xml2/xpath.c @@ -194,7 +194,6 @@ xml_encode_special_chars(PG_FUNCTION_ARGS) { text *tin = PG_GETARG_TEXT_P(0); text *tout; - int32 ressize; xmlChar *ts, *tt; @@ -204,10 +203,7 @@ xml_encode_special_chars(PG_FUNCTION_ARGS) pfree(ts); - ressize = strlen((char *) tt); - tout = (text *) palloc(ressize + VARHDRSZ); - memcpy(VARDATA(tout), tt, ressize); - SET_VARSIZE(tout, ressize + VARHDRSZ); + tout = cstring_to_text((char *) tt); xmlFree(tt); @@ -306,14 +302,7 @@ pgxmlNodeSetToText(xmlNodeSetPtr nodeset, xmlChar * pgxml_texttoxmlchar(text *textstring) { - xmlChar *res; - int32 txsize; - - txsize = VARSIZE(textstring) - VARHDRSZ; - res = (xmlChar *) palloc(txsize + 1); - memcpy((char *) res, VARDATA(textstring), txsize); - res[txsize] = '\0'; - return res; + return (xmlChar *) text_to_cstring(textstring); } /* Public visible XPath functions */ @@ -577,7 +566,6 @@ pgxml_result_to_text(xmlXPathObjectPtr res, xmlChar * plainsep) { xmlChar *xpresstr; - int32 ressize; text *xpres; if (res == NULL) @@ -604,10 +592,7 @@ pgxml_result_to_text(xmlXPathObjectPtr res, /* Now convert this result back to text */ - ressize = strlen((char *) xpresstr); - xpres = (text *) palloc(ressize + VARHDRSZ); - memcpy(VARDATA(xpres), xpresstr, ressize); - SET_VARSIZE(xpres, ressize + VARHDRSZ); + xpres = cstring_to_text((char *) xpresstr); /* Free various storage */ xmlCleanupParser(); diff --git a/contrib/xml2/xslt_proc.c b/contrib/xml2/xslt_proc.c index f15fabcb3c..f498192426 100644 --- a/contrib/xml2/xslt_proc.c +++ b/contrib/xml2/xslt_proc.c @@ -39,8 +39,9 @@ PG_FUNCTION_INFO_V1(xslt_process); Datum xslt_process(PG_FUNCTION_ARGS) { - - + text *doct = PG_GETARG_TEXT_P(0); + text *ssheet = PG_GETARG_TEXT_P(1); + text *paramstr; const char *params[MAXPARAMS + 1]; /* +1 for the terminator */ xsltStylesheetPtr stylesheet = NULL; xmlDocPtr doctree; @@ -50,12 +51,6 @@ xslt_process(PG_FUNCTION_ARGS) int resstat; int reslen; - text *doct = PG_GETARG_TEXT_P(0); - text *ssheet = PG_GETARG_TEXT_P(1); - text *paramstr; - text *tres; - - if (fcinfo->nargs == 3) { paramstr = PG_GETARG_TEXT_P(2); @@ -124,11 +119,7 @@ xslt_process(PG_FUNCTION_ARGS) if (resstat < 0) PG_RETURN_NULL(); - tres = palloc(reslen + VARHDRSZ); - memcpy(VARDATA(tres), resstr, reslen); - SET_VARSIZE(tres, reslen + VARHDRSZ); - - PG_RETURN_TEXT_P(tres); + PG_RETURN_TEXT_P(cstring_to_text_with_len(resstr, reslen)); } diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index 49ce0ef4d6..ad48f564c5 100644 --- a/src/backend/utils/adt/varchar.c +++ b/src/backend/utils/adt/varchar.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/varchar.c,v 1.127 2008/03/25 22:42:44 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/varchar.c,v 1.128 2008/05/04 16:42:41 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -566,7 +566,6 @@ varchar(PG_FUNCTION_ARGS) VarChar *source = PG_GETARG_VARCHAR_PP(0); int32 typmod = PG_GETARG_INT32(1); bool isExplicit = PG_GETARG_BOOL(2); - VarChar *result; int32 len, maxlen; size_t maxmblen; @@ -596,11 +595,8 @@ varchar(PG_FUNCTION_ARGS) maxlen))); } - result = palloc(maxmblen + VARHDRSZ); - SET_VARSIZE(result, maxmblen + VARHDRSZ); - memcpy(VARDATA(result), s_data, maxmblen); - - PG_RETURN_VARCHAR_P(result); + PG_RETURN_VARCHAR_P((VarChar *) cstring_to_text_with_len(s_data, + maxmblen)); } Datum diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index ce1e4a4fdd..6251e3c596 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.72 2008/04/04 08:33:15 mha Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.73 2008/05/04 16:42:41 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -319,13 +319,7 @@ xml_recv(PG_FUNCTION_ARGS) if (newstr != str) { pfree(result); - - nbytes = strlen(newstr); - - result = palloc(nbytes + VARHDRSZ); - SET_VARSIZE(result, nbytes + VARHDRSZ); - memcpy(VARDATA(result), newstr, nbytes); - + result = (xmltype *) cstring_to_text(newstr); pfree(newstr); } @@ -369,30 +363,14 @@ appendStringInfoText(StringInfo str, const text *t) static xmltype * stringinfo_to_xmltype(StringInfo buf) { - int32 len; - xmltype *result; - - len = buf->len + VARHDRSZ; - result = palloc(len); - SET_VARSIZE(result, len); - memcpy(VARDATA(result), buf->data, buf->len); - - return result; + return (xmltype *) cstring_to_text_with_len(buf->data, buf->len); } static xmltype * cstring_to_xmltype(const char *string) { - int32 len; - xmltype *result; - - len = strlen(string) + VARHDRSZ; - result = palloc(len); - SET_VARSIZE(result, len); - memcpy(VARDATA(result), string, len - VARHDRSZ); - - return result; + return (xmltype *) cstring_to_text(string); } @@ -400,15 +378,8 @@ cstring_to_xmltype(const char *string) static xmltype * xmlBuffer_to_xmltype(xmlBufferPtr buf) { - int32 len; - xmltype *result; - - len = xmlBufferLength(buf) + VARHDRSZ; - result = palloc(len); - SET_VARSIZE(result, len); - memcpy(VARDATA(result), xmlBufferContent(buf), len - VARHDRSZ); - - return result; + return (xmltype *) cstring_to_text_with_len((char *) xmlBufferContent(buf), + xmlBufferLength(buf)); } #endif @@ -474,9 +445,7 @@ xmlconcat(List *args) char *str; len = VARSIZE(x) - VARHDRSZ; - str = palloc(len + 1); - memcpy(str, VARDATA(x), len); - str[len] = '\0'; + str = text_to_cstring((text *) x); parse_xml_decl((xmlChar *) str, &len, &version, NULL, &standalone); @@ -751,9 +720,7 @@ xmlroot(xmltype *data, text *version, int standalone) StringInfoData buf; len = VARSIZE(data) - VARHDRSZ; - str = palloc(len + 1); - memcpy(str, VARDATA(data), len); - str[len] = '\0'; + str = text_to_cstring((text *) data); parse_xml_decl((xmlChar *) str, &len, &orig_version, NULL, &orig_standalone); @@ -1237,19 +1204,12 @@ xml_parse(text *data, XmlOptionType xmloption_arg, bool preserve_whitespace, /* - * xmlChar<->text convertions + * xmlChar<->text conversions */ static xmlChar * xml_text2xmlChar(text *in) { - int32 len = VARSIZE(in) - VARHDRSZ; - xmlChar *res; - - res = palloc(len + 1); - memcpy(res, VARDATA(in), len); - res[len] = '\0'; - - return (res); + return (xmlChar *) text_to_cstring(in); } @@ -3188,7 +3148,6 @@ xml_xmlnodetoxmltype(xmlNodePtr cur) { xmlChar *str; xmltype *result; - size_t len; xmlBufferPtr buf; if (cur->type == XML_ELEMENT_NODE) @@ -3201,10 +3160,7 @@ xml_xmlnodetoxmltype(xmlNodePtr cur) else { str = xmlXPathCastNodeToString(cur); - len = strlen((char *) str); - result = (xmltype *) palloc(len + VARHDRSZ); - SET_VARSIZE(result, len + VARHDRSZ); - memcpy(VARDATA(result), str, len); + result = (xmltype *) cstring_to_text((char *) str); } return result;