Use new cstring/text conversion functions in some additional places.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 4 May 2008 16:42:41 +0000 (16:42 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 4 May 2008 16:42:41 +0000 (16:42 +0000)
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
contrib/xml2/xpath.c
contrib/xml2/xslt_proc.c
src/backend/utils/adt/varchar.c
src/backend/utils/adt/xml.c

index acfd151e55b1109fb4eaa218892d8dd644b3c069..8f5da311158cb8c09b438cbef025e687f247d7fa 100644 (file)
@@ -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;
 }
index 601733ac87456f71fb11a44b43217de750debc7e..98865bac7a6753747cf9c6194d41abac9ada4a05 100644 (file)
@@ -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();
index f15fabcb3c52275226efb303da9f07cb635920e9..f498192426098a10713a9c0b25b08c07b3e32356 100644 (file)
@@ -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));
 }
 
 
index 680f031609e8ca91d4123e20e499e2dca1a0ffa7..95b26834b47a09de4b679a8749b984e7e395f402 100644 (file)
@@ -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
index a3f588bd793251793c095093b7bcc0417c18a433..9ad3ff81fde5d19605e605da4b64576ecc4f02fb 100644 (file)
@@ -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;