From 0bd4da23a4bee4fb3b6b61cb0fadc43c054c5ddb Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 11 Nov 2007 19:22:49 +0000 Subject: Ensure that typmod decoration on a datatype name is validated in all cases, even in code paths where we don't pay any subsequent attention to the typmod value. This seems needed in view of the fact that 8.3's generalized typmod support will accept a lot of bogus syntax, such as "timestamp(foo)" or "record(int, 42)" --- if we allow such things to pass without comment, users will get confused. Per a recent example from Greg Stark. To implement this in a way that's not very vulnerable to future bugs-of-omission, refactor the API of parse_type.c's TypeName lookup routines so that typmod validation is folded into the base lookup operation. Callers can still choose not to receive the encoded typmod, but we'll check the decoration anyway if it's present. --- src/backend/parser/parse_expr.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'src/backend/parser/parse_expr.c') diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 86fddc4a7a6..52957e825e7 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.222 2007/10/29 19:40:40 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.223 2007/11/11 19:22:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -829,7 +829,7 @@ transformAExprOf(ParseState *pstate, A_Expr *a) ltype = exprType(lexpr); foreach(telem, (List *) a->rexpr) { - rtype = typenameTypeId(pstate, lfirst(telem)); + rtype = typenameTypeId(pstate, lfirst(telem), NULL); matched = (rtype == ltype); if (matched) break; @@ -1550,8 +1550,7 @@ transformXmlSerialize(ParseState *pstate, XmlSerialize *xs) XMLOID, "XMLSERIALIZE")); - targetType = typenameTypeId(pstate, xs->typename); - targetTypmod = typenameTypeMod(pstate, xs->typename, targetType); + targetType = typenameTypeId(pstate, xs->typename, &targetTypmod); xexpr->xmloption = xs->xmloption; /* We actually only need these to be able to parse back the expression. */ @@ -2227,8 +2226,7 @@ typecast_expression(ParseState *pstate, Node *expr, TypeName *typename) Oid targetType; int32 targetTypmod; - targetType = typenameTypeId(pstate, typename); - targetTypmod = typenameTypeMod(pstate, typename, targetType); + targetType = typenameTypeId(pstate, typename, &targetTypmod); if (inputType == InvalidOid) return expr; /* do nothing if NULL input */ -- cgit v1.2.3