From: Thomas G. Lockhart Date: Sun, 13 Dec 1998 23:50:58 +0000 (+0000) Subject: Use the new implicit type coersion techniques for matching up types X-Git-Tag: REL6_5~912 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1a8790f7ebaa46e0565f4aa221ca3b49a3eb5120;p=postgresql Use the new implicit type coersion techniques for matching up types between columns and DEFAULT clauses. --- diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index c1088a0bfc..065e341eee 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -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);