]> granicus.if.org Git - postgresql/commitdiff
Now that fastpath protocol allows null arguments to be passed,
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 9 May 2003 18:18:54 +0000 (18:18 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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);