Use the new implicit type coersion techniques for matching up types
authorThomas G. Lockhart <lockhart@fourpalms.org>
Mon, 14 Dec 1998 00:13:26 +0000 (00:13 +0000)
committerThomas G. Lockhart <lockhart@fourpalms.org>
Mon, 14 Dec 1998 00:13:26 +0000 (00:13 +0000)
 between columns and DEFAULT clauses.

src/backend/catalog/heap.c

index 9cfc267d9affeb9e27cc4f047aefc87249a17d17..2719b55d06322c6ac3a79c1f928d2ee1e03aa644 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.64.2.2 1998/11/17 14:42:52 thomas Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.64.2.3 1998/12/14 00:13:26 thomas Exp $
  *
  * INTERFACE ROUTINES
  *     heap_create()           - Create an uncataloged heap relation
@@ -1434,6 +1434,7 @@ StoreAttrDefault(Relation rel, AttrDefault *attrdef)
    TargetEntry *te;
    Resdom     *resdom;
    Node       *expr;
+   Oid         type;
    char       *adbin;
    MemoryContext oldcxt;
    Relation    adrel;
@@ -1460,7 +1461,9 @@ start:;
    te = (TargetEntry *) lfirst(query->targetList);
    resdom = te->resdom;
    expr = te->expr;
+   type = exprType(expr);
 
+#if 0
    if (IsA(expr, Const))
    {
        if (((Const *) expr)->consttype != atp->atttypid)
@@ -1474,6 +1477,26 @@ start:;
    else if ((exprType(expr) != atp->atttypid)
             && !IS_BINARY_COMPATIBLE(exprType(expr), atp->atttypid))
        elog(ERROR, "DEFAULT: type mismatched");
+#endif
+
+   if (type != atp->atttypid)
+   {
+       if (IS_BINARY_COMPATIBLE(type, atp->atttypid))
+           ; /* use without change */
+       else if (can_coerce_type(1, &(type), &(atp->atttypid)))
+           expr = coerce_type(NULL, (Node *)expr, type, atp->atttypid);
+       else if (IsA(expr, Const))
+       {
+           if (*cast != 0)
+               elog(ERROR, "DEFAULT clause const type '%s' mismatched with column type '%s'",
+                    typeidTypeName(type), typeidTypeName(atp->atttypid));
+           sprintf(cast, ":: %s", typeidTypeName(atp->atttypid));
+           goto start;
+       }
+       else
+           elog(ERROR, "DEFAULT clause type '%s' mismatched with column type '%s'",
+                typeidTypeName(type), typeidTypeName(atp->atttypid));
+   }
 
    adbin = nodeToString(expr);
    oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);