Now that fastpath protocol allows null arguments to be passed,
authorTom Lane
Fri, 9 May 2003 18:18:54 +0000 (18:18 +0000)
committerTom Lane
Fri, 9 May 2003 18:18:54 +0000 (18:18 +0000)
fastpath.c had better check for strict functions.

src/backend/tcop/fastpath.c

index 74971c49c5de2066e9c7eb5d06487ab3b925c1ce..37b7c3d8d9df6946cf7a207fc95d5098e2d9d77f 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/tcop/fastpath.c,v 1.63 2003/05/09 18:08:48 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/tcop/fastpath.c,v 1.64 2003/05/09 18:18:54 tgl Exp $
  *
  * NOTES
  *   This cruft is the server side of PQfn.
@@ -273,6 +273,7 @@ HandleFunctionRequest(StringInfo msgBuf)
    Datum       retval;
    struct fp_info my_fp;
    struct fp_info *fip;
+   bool        callit;
 
    /*
     * Read message contents if not already done.
@@ -341,8 +342,34 @@ HandleFunctionRequest(StringInfo msgBuf)
    /* Verify we reached the end of the message where expected. */
    pq_getmsgend(msgBuf);
 
-   /* Okay, do it ... */
-   retval = FunctionCallInvoke(&fcinfo);
+   /*
+    * If func is strict, must not call it for null args.
+    */
+   callit = true;
+   if (fip->flinfo.fn_strict)
+   {
+       int     i;
+
+       for (i = 0; i < fcinfo.nargs; i++)
+       {
+           if (fcinfo.argnull[i])
+           {
+               callit = false;
+               break;
+           }
+       }
+   }
+
+   if (callit)
+   {
+       /* Okay, do it ... */
+       retval = FunctionCallInvoke(&fcinfo);
+   }
+   else
+   {
+       fcinfo.isnull = true;
+       retval = (Datum) 0;
+   }
 
    SendFunctionResult(retval, fcinfo.isnull, fip->rettype, rformat);