From f11d253e25fccc93704803d0840a8e7ada46249e Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 19 Mar 2000 00:15:39 +0000 Subject: [PATCH] In can_coerce_type, verify that a possible type-coercion function actually returns the type it is named for. --- src/backend/parser/parse_coerce.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index f37082a87f..35312eaadf 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -8,13 +8,13 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.36 2000/03/16 06:35:07 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.37 2000/03/19 00:15:39 tgl Exp $ * *------------------------------------------------------------------------- */ #include "postgres.h" - +#include "catalog/pg_proc.h" #include "optimizer/clauses.h" #include "parser/parse_coerce.h" #include "parser/parse_expr.h" @@ -126,6 +126,12 @@ coerce_type(ParseState *pstate, Node *node, Oid inputTypeId, result = transformExpr(pstate, (Node *) n, EXPR_COLUMN_FIRST); + /* safety check that we got the right thing */ + if (exprType(result) != targetTypeId) + elog(ERROR, "coerce_type: conversion function %s produced %s", + typeTypeName(targetType), + typeidTypeName(exprType(result))); + /* * If the input is a constant, apply the type conversion function * now instead of delaying to runtime. (We could, of course, @@ -163,6 +169,7 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *func_typeids) { int i; HeapTuple ftup; + Form_pg_proc pform; Oid oid_array[FUNC_MAX_ARGS]; /* run through argument list... */ @@ -221,9 +228,10 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *func_typeids) 0); if (!HeapTupleIsValid(ftup)) return false; - /* - * should also check the function return type just to be safe... - */ + /* Make sure the function's result type is as expected, too */ + pform = (Form_pg_proc) GETSTRUCT(ftup); + if (pform->prorettype != targetTypeId) + return false; } return true; -- 2.11.0