cooked->contype = CONSTR_DEFAULT;
                        cooked->name = NULL;
                        cooked->attnum = attnum;
-                       cooked->expr = stringToNode(colDef->cooked_default);
+                       cooked->expr = colDef->cooked_default;
                        cooked->is_local = true;        /* not used for defaults */
                        cooked->inhcount = 0;           /* ditto */
                        cookedDefaults = lappend(cookedDefaults, cooked);
        List       *constraints = NIL;
        int                     parentsWithOids = 0;
        bool            have_bogus_defaults = false;
-       char       *bogus_marker = "Bogus!";            /* marks conflicting defaults */
        int                     child_attno;
+       static Node     bogus_marker = { 0 };           /* marks conflicting defaults */
 
        /*
         * Check for and reject tables with too many columns. We perform this
                         */
                        if (attribute->atthasdef)
                        {
-                               char       *this_default = NULL;
+                               Node       *this_default = NULL;
                                AttrDefault *attrdef;
                                int                     i;
 
                                {
                                        if (attrdef[i].adnum == parent_attno)
                                        {
-                                               this_default = attrdef[i].adbin;
+                                               this_default = stringToNode(attrdef[i].adbin);
                                                break;
                                        }
                                }
                                 */
                                Assert(def->raw_default == NULL);
                                if (def->cooked_default == NULL)
-                                       def->cooked_default = pstrdup(this_default);
-                               else if (strcmp(def->cooked_default, this_default) != 0)
+                                       def->cooked_default = this_default;
+                               else if (!equal(def->cooked_default, this_default))
                                {
-                                       def->cooked_default = bogus_marker;
+                                       def->cooked_default = &bogus_marker;
                                        have_bogus_defaults = true;
                                }
                        }
                {
                        ColumnDef  *def = lfirst(entry);
 
-                       if (def->cooked_default == bogus_marker)
+                       if (def->cooked_default == &bogus_marker)
                                ereport(ERROR,
                                                (errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
                                  errmsg("column \"%s\" inherits conflicting default values",
 
        COPY_SCALAR_FIELD(is_local);
        COPY_SCALAR_FIELD(is_not_null);
        COPY_NODE_FIELD(raw_default);
-       COPY_STRING_FIELD(cooked_default);
+       COPY_NODE_FIELD(cooked_default);
        COPY_NODE_FIELD(constraints);
 
        return newnode;
 
        COMPARE_SCALAR_FIELD(is_local);
        COMPARE_SCALAR_FIELD(is_not_null);
        COMPARE_NODE_FIELD(raw_default);
-       COMPARE_STRING_FIELD(cooked_default);
+       COMPARE_NODE_FIELD(cooked_default);
        COMPARE_NODE_FIELD(constraints);
 
        return true;
 
        WRITE_BOOL_FIELD(is_local);
        WRITE_BOOL_FIELD(is_not_null);
        WRITE_NODE_FIELD(raw_default);
-       WRITE_STRING_FIELD(cooked_default);
+       WRITE_NODE_FIELD(cooked_default);
        WRITE_NODE_FIELD(constraints);
 }
 
 
                 */
                if (attribute->atthasdef && including_defaults)
                {
-                       char       *this_default = NULL;
+                       Node       *this_default = NULL;
                        AttrDefault *attrdef;
                        int                     i;
 
                        {
                                if (attrdef[i].adnum == parent_attno)
                                {
-                                       this_default = attrdef[i].adbin;
+                                       this_default = stringToNode(attrdef[i].adbin);
                                        break;
                                }
                        }
                         * but it can't; so default is ready to apply to child.
                         */
 
-                       def->cooked_default = pstrdup(this_default);
+                       def->cooked_default = this_default;
                }
        }
 
 
  *
  * If the column has a default value, we may have the value expression
  * in either "raw" form (an untransformed parse tree) or "cooked" form
- * (the nodeToString representation of an executable expression tree),
- * depending on how this ColumnDef node was created (by parsing, or by
- * inheritance from an existing relation).     We should never have both
- * in the same node!
+ * (a post-parse-analysis, executable expression tree), depending on
+ * how this ColumnDef node was created (by parsing, or by inheritance
+ * from an existing relation).  We should never have both in the same node!
  *
  * The constraints list may contain a CONSTR_DEFAULT item in a raw
  * parsetree produced by gram.y, but transformCreateStmt will remove
        bool            is_local;               /* column has local (non-inherited) def'n */
        bool            is_not_null;    /* NOT NULL constraint specified? */
        Node       *raw_default;        /* default value (untransformed parse tree) */
-       char       *cooked_default; /* nodeToString representation */
+       Node       *cooked_default; /* default value (transformed expr tree) */
        List       *constraints;        /* other constraints on column */
 } ColumnDef;
 
 
  bar2    |  4 |   4
 (8 rows)
 
+/* Test multiple inheritance of column defaults */
+CREATE TABLE firstparent (tomorrow date default now()::date + 1);
+CREATE TABLE secondparent (tomorrow date default  now() :: date  +  1);
+CREATE TABLE jointchild () INHERITS (firstparent, secondparent);  -- ok
+NOTICE:  merging multiple inherited definitions of column "tomorrow"
+CREATE TABLE thirdparent (tomorrow date default now()::date - 1);
+CREATE TABLE otherchild () INHERITS (firstparent, thirdparent);  -- not ok
+NOTICE:  merging multiple inherited definitions of column "tomorrow"
+ERROR:  column "tomorrow" inherits conflicting default values
+HINT:  To resolve the conflict, specify a default explicitly.
+CREATE TABLE otherchild (tomorrow date default now())
+  INHERITS (firstparent, thirdparent);  -- ok, child resolves ambiguous default
+NOTICE:  merging multiple inherited definitions of column "tomorrow"
+NOTICE:  merging column "tomorrow" with inherited definition
+DROP TABLE firstparent, secondparent, jointchild, thirdparent, otherchild;
 /* Test inheritance of structure (LIKE) */
 CREATE TABLE inhx (xx text DEFAULT 'text');
 /*
 
 SELECT relname, bar.* FROM bar, pg_class where bar.tableoid = pg_class.oid
 order by 1,2;
 
+/* Test multiple inheritance of column defaults */
+
+CREATE TABLE firstparent (tomorrow date default now()::date + 1);
+CREATE TABLE secondparent (tomorrow date default  now() :: date  +  1);
+CREATE TABLE jointchild () INHERITS (firstparent, secondparent);  -- ok
+CREATE TABLE thirdparent (tomorrow date default now()::date - 1);
+CREATE TABLE otherchild () INHERITS (firstparent, thirdparent);  -- not ok
+CREATE TABLE otherchild (tomorrow date default now())
+  INHERITS (firstparent, thirdparent);  -- ok, child resolves ambiguous default
+
+DROP TABLE firstparent, secondparent, jointchild, thirdparent, otherchild;
 
 /* Test inheritance of structure (LIKE) */
 CREATE TABLE inhx (xx text DEFAULT 'text');