]> granicus.if.org Git - postgresql/commitdiff
Use the new implicit type coersion techniques for matching up types
authorThomas G. Lockhart <lockhart@fourpalms.org>
Sun, 13 Dec 1998 23:50:58 +0000 (23:50 +0000)
committerThomas G. Lockhart <lockhart@fourpalms.org>
Sun, 13 Dec 1998 23:50:58 +0000 (23:50 +0000)
 between columns and DEFAULT clauses.

src/backend/catalog/heap.c

index c1088a0bfc004aca679648976c1c0ce0e78b17c5..065e341eee2337e82d51f00eaff60e7abe9a3dab 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.67 1998/11/27 19:51:48 vadim Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.68 1998/12/13 23:50:58 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);