plpgsql's exec_simple_cast_value() mistakenly supposed that it could bypass
authorTom Lane <[email protected]>
Thu, 2 Apr 2009 01:16:25 +0000 (01:16 +0000)
committerTom Lane <[email protected]>
Thu, 2 Apr 2009 01:16:25 +0000 (01:16 +0000)
casting effort whenever the input value was NULL.  However this prevents
application of not-null domain constraints in the cases that use this
function, as illustrated in bug #4741.  Since this function isn't meant
for use in performance-critical paths anyway, this certainly seems like
another case of "premature optimization is the root of all evil".

Back-patch as far as 8.2; older versions made no effort to enforce
domain constraints here anyway.

src/pl/plpgsql/src/pl_exec.c

index 074379fd78a560b5833557022e1061d1e4256b61..3accfb8130d72393a29067e296fd47e8965b1c40 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.180.2.9 2009/02/27 10:27:45 heikki Exp $
+ *   $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.180.2.10 2009/04/02 01:16:25 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -4351,26 +4351,23 @@ exec_simple_cast_value(Datum value, Oid valtype,
                       Oid reqtype, int32 reqtypmod,
                       bool isnull)
 {
-   if (!isnull)
+   if (valtype != reqtype || reqtypmod != -1)
    {
-       if (valtype != reqtype || reqtypmod != -1)
-       {
-           Oid         typinput;
-           Oid         typioparam;
-           FmgrInfo    finfo_input;
+       Oid         typinput;
+       Oid         typioparam;
+       FmgrInfo    finfo_input;
 
-           getTypeInputInfo(reqtype, &typinput, &typioparam);
+       getTypeInputInfo(reqtype, &typinput, &typioparam);
 
-           fmgr_info(typinput, &finfo_input);
+       fmgr_info(typinput, &finfo_input);
 
-           value = exec_cast_value(value,
-                                   valtype,
-                                   reqtype,
-                                   &finfo_input,
-                                   typioparam,
-                                   reqtypmod,
-                                   isnull);
-       }
+       value = exec_cast_value(value,
+                               valtype,
+                               reqtype,
+                               &finfo_input,
+                               typioparam,
+                               reqtypmod,
+                               isnull);
    }
 
    return value;