]> granicus.if.org Git - postgresql/commitdiff
Allow binary I/O of type "void".
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 22 Feb 2011 18:08:22 +0000 (13:08 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 22 Feb 2011 18:08:22 +0000 (13:08 -0500)
void_send is useful for the same reason that void_out doesn't throw error,
namely that someone might do "select void_returning_func(...)"  from a
client that prefers to operate in binary mode.  The void_recv function may
or may not have any practical use, but we provide it for symmetry.

RadosÅ‚aw Smogura

src/backend/utils/adt/pseudotypes.c
src/include/catalog/catversion.h
src/include/catalog/pg_proc.h
src/include/catalog/pg_type.h
src/include/utils/builtins.h

index d9329f834287b7472688c80417a37934a4668abb..ddb1bd2b71ccf577b7cec15942bd257e5ad83e23 100644 (file)
@@ -212,6 +212,34 @@ void_out(PG_FUNCTION_ARGS)
        PG_RETURN_CSTRING(pstrdup(""));
 }
 
+/*
+ * void_recv   - binary input routine for pseudo-type VOID.
+ *
+ * Note that since we consume no bytes, an attempt to send anything but
+ * an empty string will result in an "invalid message format" error.
+ */
+Datum
+void_recv(PG_FUNCTION_ARGS)
+{
+       PG_RETURN_VOID();
+}
+
+/*
+ * void_send   - binary output routine for pseudo-type VOID.
+ *
+ * We allow this so that "SELECT function_returning_void(...)" works
+ * even when binary output is requested.
+ */
+Datum
+void_send(PG_FUNCTION_ARGS)
+{
+       StringInfoData buf;
+
+       /* send an empty string */
+       pq_begintypsend(&buf);
+       PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
 
 /*
  * trigger_in          - input routine for pseudo-type TRIGGER.
index 989138169a922f76317362a99f8e33231eee6940..70106414cfe2b4e643a188de021657933cd12066 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     201102191
+#define CATALOG_VERSION_NO     201102221
 
 #endif
index 08949853f190d3190f6ed8afcd5e947581e926d6..8c940bb74d1c6bf725b95fe6bc4ca2b608eb6fdd 100644 (file)
@@ -4226,6 +4226,10 @@ DATA(insert OID = 2502 (  anyarray_recv             PGNSP PGUID 12 1 0 0 f f f t f s 1 0
 DESCR("I/O");
 DATA(insert OID = 2503 (  anyarray_send                   PGNSP PGUID 12 1 0 0 f f f t f s 1 0 17 "2277" _null_ _null_ _null_ _null_   anyarray_send _null_ _null_ _null_ ));
 DESCR("I/O");
+DATA(insert OID = 3120 (  void_recv                       PGNSP PGUID 12 1 0 0 f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ void_recv _null_ _null_ _null_ ));
+DESCR("I/O");
+DATA(insert OID = 3121 (  void_send                       PGNSP PGUID 12 1 0 0 f f f t f i 1 0 17 "2278" _null_ _null_ _null_ _null_   void_send _null_ _null_ _null_ ));
+DESCR("I/O");
 
 /* System-view support functions with pretty-print option */
 DATA(insert OID = 2504 (  pg_get_ruledef          PGNSP PGUID 12 1 0 0 f f f t f s 2 0 25 "26 16" _null_ _null_ _null_ _null_  pg_get_ruledef_ext _null_ _null_ _null_ ));
index 0f7312e495d4c74accecf4825060638ea159000b..9baed6c7690b28594187989a11757a82f589e523 100644 (file)
@@ -615,7 +615,7 @@ DATA(insert OID = 2276 ( any                        PGNSP PGUID  4 t p P f t \054 0 0 0 any_in any_ou
 #define ANYOID                 2276
 DATA(insert OID = 2277 ( anyarray              PGNSP PGUID -1 f p P f t \054 0 0 0 anyarray_in anyarray_out anyarray_recv anyarray_send - - - d x f 0 -1 0 0 _null_ _null_ ));
 #define ANYARRAYOID            2277
-DATA(insert OID = 2278 ( void                  PGNSP PGUID  4 t p P f t \054 0 0 0 void_in void_out - - - - - i p f 0 -1 0 0 _null_ _null_ ));
+DATA(insert OID = 2278 ( void                  PGNSP PGUID  4 t p P f t \054 0 0 0 void_in void_out void_recv void_send - - - i p f 0 -1 0 0 _null_ _null_ ));
 #define VOIDOID                        2278
 DATA(insert OID = 2279 ( trigger               PGNSP PGUID  4 t p P f t \054 0 0 0 trigger_in trigger_out - - - - - i p f 0 -1 0 0 _null_ _null_ ));
 #define TRIGGEROID             2279
index 8392be6208a89666ecd55121e401fcd496389c90..8652ba03a05edd994e41d374ca7b8d38666b20ae 100644 (file)
@@ -504,6 +504,8 @@ extern Datum anyenum_in(PG_FUNCTION_ARGS);
 extern Datum anyenum_out(PG_FUNCTION_ARGS);
 extern Datum void_in(PG_FUNCTION_ARGS);
 extern Datum void_out(PG_FUNCTION_ARGS);
+extern Datum void_recv(PG_FUNCTION_ARGS);
+extern Datum void_send(PG_FUNCTION_ARGS);
 extern Datum trigger_in(PG_FUNCTION_ARGS);
 extern Datum trigger_out(PG_FUNCTION_ARGS);
 extern Datum language_handler_in(PG_FUNCTION_ARGS);