aboutsummaryrefslogtreecommitdiff
path: root/doc/TODO.detail/function
diff options
context:
space:
mode:
Diffstat (limited to 'doc/TODO.detail/function')
-rw-r--r--doc/TODO.detail/function97
1 files changed, 97 insertions, 0 deletions
diff --git a/doc/TODO.detail/function b/doc/TODO.detail/function
new file mode 100644
index 00000000000..7ed6fa7d54d
--- /dev/null
+++ b/doc/TODO.detail/function
@@ -0,0 +1,97 @@
+From tgl@sss.pgh.pa.us Mon Jun 14 20:50:41 1999
+Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [206.210.65.6])
+ by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id UAA19110
+ for <maillist@candle.pha.pa.us>; Mon, 14 Jun 1999 20:50:39 -0400 (EDT)
+Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1])
+ by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id UAA21506;
+ Mon, 14 Jun 1999 20:51:07 -0400 (EDT)
+To: Bruce Momjian <maillist@candle.pha.pa.us>
+cc: Roman.Hodek@informatik.uni-erlangen.de, olly@lfix.co.uk,
+ PostgreSQL-development <pgsql-hackers@postgreSQL.org>
+Subject: Cleaning up function interface (was Re: Patch for m68k architecture)
+In-reply-to: Your message of Mon, 14 Jun 1999 17:53:25 -0400 (EDT)
+ <199906142153.RAA16276@candle.pha.pa.us>
+Date: Mon, 14 Jun 1999 20:51:06 -0400
+Message-ID: <21504.929407866@sss.pgh.pa.us>
+From: Tom Lane <tgl@sss.pgh.pa.us>
+Status: RO
+
+Bruce Momjian <maillist@candle.pha.pa.us> writes:
+>> ANSI C says results are undefined if you call a function via pointer
+>> and the pointer is declared to return another type than the function
+>> actually returns. So m68k compilers conform to the standard here.
+
+> Yes, we admit that we break the standard with fmgr_ptr, because we
+> return a variety of values depending on what function they call. It
+> appears the egcs optimization on the powerpc or alpha cause a problem
+> when optimization is -O2, but not -O. We may see more platforms with
+> problems as optimizers get smarter.
+
+Seeing as how we also know that the function-call interface ought to be
+redesigned to handle NULLs better, maybe we should just bite the bullet
+and fix all of these problems at once by adopting a new standard
+interface for everything that can be called via fmgr. It'd uglify the
+code, no doubt, but I think we are starting to see an accumulation of
+problems that justify doing something.
+
+Here is a straw-man proposal:
+
+ Datum function (bool *resultnull,
+ Datum *args,
+ bool *argnull,
+ int nargs)
+
+args[i] is the i'th parameter, or undefined (perhaps always 0?)
+when argnull[i] is true. The function is responsible for setting
+*resultnull, and returns a Datum value if *resultnull is false.
+Most standard functions could ignore nargs since they'd know what it
+should be, but we ought to pass it for flexibility.
+
+A useful addition to this scheme would be for fmgr to preset *resultnull
+to the OR of the input argnull[] array just before calling the function.
+In the typical case where the function is "strict" (ie, result is NULL
+if any input is NULL), this would save the function from having to look
+at argnull[] at all; it'd just check *resultnull and immediately return
+if true.
+
+As an example, int4 addition goes from
+
+int32
+int4pl(int32 arg1, int32 arg2)
+{
+ return arg1 + arg2;
+}
+
+to
+
+Datum
+int4pl (bool *resultnull, Datum *args, bool *argnull, int nargs)
+{
+ if (*resultnull)
+ return (Datum) 0; /* value doesn't really matter ... */
+ /* we can ignore argnull and nargs */
+
+ return Int32GetDatum(DatumGetInt32(args[0]) + DatumGetInt32(args[1]));
+}
+
+This is, of course, much uglier than the existing code, but we might be
+able to improve matters with some well-chosen macros for the boilerplate
+parts. What we actually end up writing might look something like
+
+Datum
+int4pl (PG_FUNCTION_ARGS)
+{
+ PG_STRICT_FUNCTION( /* encapsulates null check */
+ PG_ARG0_INT32;
+ PG_ARG1_INT32;
+
+ PG_RESULT_INT32( arg0 + arg1 );
+ );
+}
+
+where the macros expand to things like "int32 arg0 = DatumGetInt32(args[0])"
+and "return Int32GetDatum( x )". It'd be worth a little thought to
+try to set up a group of macros like that, I think.
+
+ regards, tom lane
+