pstate = make_parsestate(NULL);
 
                    /*
-                    * Cook the constr->raw_expr into an expression. Note:
-                    * name is strictly for error message
+                    * Cook the constr->raw_expr into an expression; copy it
+                    * in case the input is in plan cache.  Note: name is used
+                    * only for error messages.
                     */
-                   defaultExpr = cookDefault(pstate, constr->raw_expr,
+                   defaultExpr = cookDefault(pstate,
+                                             copyObject(constr->raw_expr),
                                              basetypeoid,
                                              basetypeMod,
                                              domainName);
        pstate = make_parsestate(NULL);
 
        /*
-        * Cook the colDef->raw_expr into an expression. Note: Name is
-        * strictly for error message
+        * Cook the raw default into an expression; copy it in case the input
+        * is in plan cache.  Note: name is used only for error messages.
         */
-       defaultExpr = cookDefault(pstate, defaultRaw,
+       defaultExpr = cookDefault(pstate, copyObject(defaultRaw),
                                  typTup->typbasetype,
                                  typTup->typtypmod,
                                  NameStr(typTup->typname));
 
    pstate->p_value_substitute = (Node *) domVal;
 
-   expr = transformExpr(pstate, constr->raw_expr, EXPR_KIND_DOMAIN_CHECK);
+   /*
+    * Transform the expression; first we must copy the input, in case it's in
+    * plan cache.
+    */
+   expr = transformExpr(pstate, copyObject(constr->raw_expr),
+                        EXPR_KIND_DOMAIN_CHECK);
 
    /*
     * Make sure it yields a boolean result.