upgrade to 8.3 API for VARDATA
authorMarko Kreen <markokr@gmail.com>
Thu, 11 Oct 2007 10:35:04 +0000 (10:35 +0000)
committerMarko Kreen <markokr@gmail.com>
Thu, 11 Oct 2007 10:35:04 +0000 (10:35 +0000)
src/function.c
src/plproxy.h

index 2467d8da5f48bcc1ea03fd4c17b141374462785b..024abc169382c90739664d0865a3fe5d6837c5b2 100644 (file)
@@ -210,7 +210,6 @@ fn_set_name(ProxyFunction *func, HeapTuple proc_tuple)
        ReleaseSysCache(ns_tup);
 }
 
-
 /*
  * Parse source.
  *
@@ -220,13 +219,22 @@ static void
 fn_parse(ProxyFunction *func, HeapTuple proc_tuple)
 {
        bool            isnull;
-       Datum           source;
+       Datum           src_raw, src_detoast;
+       char            *data;
+       int                     size;
 
-       source = SysCacheGetAttr(PROCOID, proc_tuple, Anum_pg_proc_prosrc, &isnull);
+       src_raw = SysCacheGetAttr(PROCOID, proc_tuple, Anum_pg_proc_prosrc, &isnull);
        if (isnull)
                plproxy_error(func, "procedure source datum is null");
 
-       plproxy_run_parser(func, VARDATA(source), VARSIZE(source) - VARHDRSZ);
+       src_detoast = PointerGetDatum(PG_DETOAST_DATUM_PACKED(src_raw));
+       data = VARDATA_ANY(src_detoast);
+       size = VARSIZE_ANY_EXHDR(src_detoast);
+
+       plproxy_run_parser(func, data, size);
+
+       if (src_raw != src_detoast)
+               pfree(DatumGetPointer(src_detoast));
 }
 
 /*
index 21a43eb1846e166e87888ddabecde7fed039646c..b7756dc33e89019c5ace104182336c71d2739418 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <postgres.h>
 #include <funcapi.h>
+#include <fmgr.h>
 #include <executor/spi.h>
 
 #include <access/tupdesc.h>
 
 #include <libpq-fe.h>
 
+/*
+ * backwards compat with 8.2
+ */
+#ifndef VARDATA_ANY
+#define VARDATA_ANY(x) VARDATA(x)
+#endif
+#ifndef VARSIZE_ANY_EXHDR
+#define VARSIZE_ANY_EXHDR(x) (VARSIZE(x) - VARHDRSZ)
+#endif
+#ifndef PG_DETOAST_DATUM_PACKED
+#define PG_DETOAST_DATUM_PACKED(x) PG_DETOAST_DATUM(x)
+#endif
+
 
 /*
  * Maintenece period in seconds.  Connnections will be freed