diff options
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/parse_expr.c | 10 | ||||
-rw-r--r-- | src/backend/parser/parse_oper.c | 4 | ||||
-rw-r--r-- | src/backend/parser/parse_relation.c | 2 | ||||
-rw-r--r-- | src/backend/parser/parse_type.c | 29 |
4 files changed, 31 insertions, 14 deletions
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 4b5cf3e3db6..ca48b9b104b 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -159,8 +159,8 @@ transformExpr(ParseState *pstate, Node *expr) Oid elementType; int32 targetTypmod; - targetType = typenameTypeId(pstate, tc->typeName, - &targetTypmod); + typenameTypeIdAndMod(pstate, tc->typeName, + &targetType, &targetTypmod); /* * If target is a domain over array, work with the base * array type here. transformTypeCast below will cast the @@ -1031,7 +1031,7 @@ transformAExprOf(ParseState *pstate, A_Expr *a) ltype = exprType(lexpr); foreach(telem, (List *) a->rexpr) { - rtype = typenameTypeId(pstate, lfirst(telem), NULL); + rtype = typenameTypeId(pstate, lfirst(telem)); matched = (rtype == ltype); if (matched) break; @@ -1889,7 +1889,7 @@ transformXmlSerialize(ParseState *pstate, XmlSerialize *xs) XMLOID, "XMLSERIALIZE")); - targetType = typenameTypeId(pstate, xs->typeName, &targetTypmod); + typenameTypeIdAndMod(pstate, xs->typeName, &targetType, &targetTypmod); xexpr->xmloption = xs->xmloption; xexpr->location = xs->location; @@ -2052,7 +2052,7 @@ transformTypeCast(ParseState *pstate, TypeCast *tc) int32 targetTypmod; int location; - targetType = typenameTypeId(pstate, tc->typeName, &targetTypmod); + typenameTypeIdAndMod(pstate, tc->typeName, &targetType, &targetTypmod); if (inputType == InvalidOid) return expr; /* do nothing if NULL input */ diff --git a/src/backend/parser/parse_oper.c b/src/backend/parser/parse_oper.c index 8d77590fac9..83cc41606cf 100644 --- a/src/backend/parser/parse_oper.c +++ b/src/backend/parser/parse_oper.c @@ -148,12 +148,12 @@ LookupOperNameTypeNames(ParseState *pstate, List *opername, if (oprleft == NULL) leftoid = InvalidOid; else - leftoid = typenameTypeId(pstate, oprleft, NULL); + leftoid = typenameTypeId(pstate, oprleft); if (oprright == NULL) rightoid = InvalidOid; else - rightoid = typenameTypeId(pstate, oprright, NULL); + rightoid = typenameTypeId(pstate, oprright); return LookupOperName(pstate, opername, leftoid, rightoid, noError, location); diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index aa71709b43a..b32ca3cfcd0 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -1165,7 +1165,7 @@ addRangeTableEntryForFunction(ParseState *pstate, errmsg("column \"%s\" cannot be declared SETOF", attrname), parser_errposition(pstate, n->typeName->location))); - attrtype = typenameTypeId(pstate, n->typeName, &attrtypmod); + typenameTypeIdAndMod(pstate, n->typeName, &attrtype, &attrtypmod); eref->colnames = lappend(eref->colnames, makeString(attrname)); rte->funccoltypes = lappend_oid(rte->funccoltypes, attrtype); rte->funccoltypmods = lappend_int(rte->funccoltypmods, attrtypmod); diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c index dfa6a9a92d3..b9acbdc4318 100644 --- a/src/backend/parser/parse_type.c +++ b/src/backend/parser/parse_type.c @@ -206,18 +206,18 @@ typenameType(ParseState *pstate, const TypeName *typeName, int32 *typmod_p) } /* - * typenameTypeId - given a TypeName, return the type's OID and typmod + * typenameTypeId - given a TypeName, return the type's OID * - * This is equivalent to typenameType, but we only hand back the type OID + * This is similar to typenameType, but we only hand back the type OID * not the syscache entry. */ Oid -typenameTypeId(ParseState *pstate, const TypeName *typeName, int32 *typmod_p) +typenameTypeId(ParseState *pstate, const TypeName *typeName) { Oid typoid; Type tup; - tup = typenameType(pstate, typeName, typmod_p); + tup = typenameType(pstate, typeName, NULL); typoid = HeapTupleGetOid(tup); ReleaseSysCache(tup); @@ -225,6 +225,23 @@ typenameTypeId(ParseState *pstate, const TypeName *typeName, int32 *typmod_p) } /* + * typenameTypeIdAndMod - given a TypeName, return the type's OID and typmod + * + * This is equivalent to typenameType, but we only hand back the type OID + * and typmod, not the syscache entry. + */ +void +typenameTypeIdAndMod(ParseState *pstate, const TypeName *typeName, + Oid *typeid_p, int32 *typmod_p) +{ + Type tup; + + tup = typenameType(pstate, typeName, typmod_p); + *typeid_p = HeapTupleGetOid(tup); + ReleaseSysCache(tup); +} + +/* * typenameTypeMod - given a TypeName, return the internal typmod value * * This will throw an error if the TypeName includes type modifiers that are @@ -561,7 +578,7 @@ pts_error_callback(void *arg) * the string and convert it to a type OID and type modifier. */ void -parseTypeString(const char *str, Oid *type_id, int32 *typmod_p) +parseTypeString(const char *str, Oid *typeid_p, int32 *typmod_p) { StringInfoData buf; List *raw_parsetree_list; @@ -635,7 +652,7 @@ parseTypeString(const char *str, Oid *type_id, int32 *typmod_p) if (typeName->setof) goto fail; - *type_id = typenameTypeId(NULL, typeName, typmod_p); + typenameTypeIdAndMod(NULL, typeName, typeid_p, typmod_p); pfree(buf.data); |