[PATCH 2/4] Add tests for "COPY ... TO FUNCTION ..." - Mailing list pgsql-hackers

From Daniel Farina
Subject [PATCH 2/4] Add tests for "COPY ... TO FUNCTION ..."
Date
Msg-id 1259012082-6196-3-git-send-email-dfarina@truviso.com
Whole thread Raw
In response to [PATCH 0/4] COPY to a UDF: "COPY ... TO FUNCTION ..."  (Daniel Farina <dfarina@truviso.com>)
List pgsql-hackers
Signed-off-by: Daniel Farina <dfarina@truviso.com>
---src/test/regress/input/copy.source  |   38 +++++++++++++++++++src/test/regress/output/copy.source |   69
+++++++++++++++++++++++++++++++++++src/test/regress/regress.c         |   56 ++++++++++++++++++++++++++++3 files
changed,163 insertions(+), 0 deletions(-)
 

diff --git a/src/test/regress/input/copy.source b/src/test/regress/input/copy.source
index 376329d..e5dcd62 100644
--- a/src/test/regress/input/copy.source
+++ b/src/test/regress/input/copy.source
@@ -107,3 +107,41 @@ this is just a line full of junk that would error out if parsedcopy copytest3 to stdout csv
header;
+
+-- test copy to function
+
+CREATE FUNCTION copyto_setup_state ()
+        RETURNS void
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+
+CREATE FUNCTION copyto_function (internal)
+        RETURNS void
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+
+CREATE FUNCTION copyto_yield_len ()
+        RETURNS int4
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+
+CREATE FUNCTION copyto_yield_text ()
+        RETURNS text
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+
+CREATE FUNCTION copyto_free ()
+        RETURNS void
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+
+select copyto_setup_state();
+copy copytest to function copyto_function;
+select copyto_yield_len();
+select copyto_yield_text();
+select copyto_free();
+
+select copyto_setup_state();
+copy binary copytest to function copyto_function;
+select copyto_yield_len();
+select copyto_free();
diff --git a/src/test/regress/output/copy.source b/src/test/regress/output/copy.source
index 5a88d6e..74ea935 100644
--- a/src/test/regress/output/copy.source
+++ b/src/test/regress/output/copy.source
@@ -71,3 +71,72 @@ copy copytest3 to stdout csv header;c1,"col with , comma","col with "" quote"1,a,12,b,2
+-- test copy to function
+CREATE FUNCTION copyto_setup_state ()
+        RETURNS void
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+CREATE FUNCTION copyto_function (internal)
+        RETURNS void
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+CREATE FUNCTION copyto_yield_len ()
+        RETURNS int4
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+CREATE FUNCTION copyto_yield_text ()
+        RETURNS text
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+CREATE FUNCTION copyto_free ()
+        RETURNS void
+        AS '@libdir@/regress@DLSUFFIX@'
+        LANGUAGE C;
+select copyto_setup_state();
+ copyto_setup_state 
+--------------------
+ 
+(1 row)
+
+copy copytest to function copyto_function;
+select copyto_yield_len();
+ copyto_yield_len 
+------------------
+               76
+(1 row)
+
+select copyto_yield_text();
+             copyto_yield_text             
+-------------------------------------------
+ DOS     abc\r\ndef      1                +
+ Unix    abc\ndef        2                +
+ Mac     abc\rdef        3                +
+ esc\\ape        a\\r\\\r\\\n\\nb        4+
+ 
+(1 row)
+
+select copyto_free();
+ copyto_free 
+-------------
+ 
+(1 row)
+
+select copyto_setup_state();
+ copyto_setup_state 
+--------------------
+ 
+(1 row)
+
+copy binary copytest to function copyto_function;
+select copyto_yield_len();
+ copyto_yield_len 
+------------------
+              142
+(1 row)
+
+select copyto_free();
+ copyto_free 
+-------------
+ 
+(1 row)
+
diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c
index 0e94e68..a96a085 100644
--- a/src/test/regress/regress.c
+++ b/src/test/regress/regress.c
@@ -16,6 +16,7 @@#include "executor/spi.h"#include "utils/builtins.h"#include "utils/geo_decls.h"
+#include "utils/memutils.h"#define P_MAXDIG 12
@@ -34,6 +35,11 @@ extern char *reverse_name(char *string);extern int    oldstyle_length(int n, text *t);extern Datum
int44in(PG_FUNCTION_ARGS);externDatum int44out(PG_FUNCTION_ARGS);
 
+extern Datum copyto_free(PG_FUNCTION_ARGS);
+extern Datum copyto_function(PG_FUNCTION_ARGS);
+extern Datum copyto_setup_state(PG_FUNCTION_ARGS);
+extern Datum copyto_yield_len(PG_FUNCTION_ARGS);
+extern Datum copyto_yield_text(PG_FUNCTION_ARGS);#ifdef PG_MODULE_MAGICPG_MODULE_MAGIC;
@@ -737,3 +743,53 @@ int44out(PG_FUNCTION_ARGS)    *--walk = '\0';    PG_RETURN_CSTRING(result);}
+
+/*
+ * copyto testing
+ */
+static StringInfo global_buf;
+
+PG_FUNCTION_INFO_V1(copyto_setup_state);
+
+Datum
+copyto_setup_state(PG_FUNCTION_ARGS)
+{
+    MemoryContext oldcxt = MemoryContextSwitchTo(TopMemoryContext);
+    global_buf = makeStringInfo();
+    MemoryContextSwitchTo(oldcxt);
+    PG_RETURN_VOID();
+}
+
+PG_FUNCTION_INFO_V1(copyto_function);
+
+Datum
+copyto_function(PG_FUNCTION_ARGS)
+{
+    StringInfo copybuf = (void *) PG_GETARG_POINTER(0);
+    appendBinaryStringInfo(global_buf, copybuf->data, copybuf->len);
+    PG_RETURN_VOID();
+}
+
+PG_FUNCTION_INFO_V1(copyto_yield_len);
+
+Datum
+copyto_yield_len(PG_FUNCTION_ARGS)
+{
+    PG_RETURN_INT32(global_buf->len);
+}
+
+PG_FUNCTION_INFO_V1(copyto_yield_text);
+
+Datum
+copyto_yield_text(PG_FUNCTION_ARGS)
+{
+    PG_RETURN_DATUM(DirectFunctionCall1(textin,
+                                        CStringGetDatum(global_buf->data)));
+}
+
+Datum
+copyto_free(PG_FUNCTION_ARGS)
+{
+    pfree(global_buf);
+    PG_RETURN_VOID();
+}
-- 
1.6.5.3



pgsql-hackers by date:

Previous
From: Daniel Farina
Date:
Subject: [PATCH 3/4] Add dblink functions for use with COPY ... TO FUNCTION ...
Next
From: Daniel Farina
Date:
Subject: [PATCH 1/4] Add "COPY ... TO FUNCTION ..." support