Commit f11d253e authored by Tom Lane's avatar Tom Lane

In can_coerce_type, verify that a possible type-coercion function

actually returns the type it is named for.
parent 7d392f25
...@@ -8,13 +8,13 @@ ...@@ -8,13 +8,13 @@
* *
* *
* IDENTIFICATION * 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 "postgres.h"
#include "catalog/pg_proc.h"
#include "optimizer/clauses.h" #include "optimizer/clauses.h"
#include "parser/parse_coerce.h" #include "parser/parse_coerce.h"
#include "parser/parse_expr.h" #include "parser/parse_expr.h"
...@@ -126,6 +126,12 @@ coerce_type(ParseState *pstate, Node *node, Oid inputTypeId, ...@@ -126,6 +126,12 @@ coerce_type(ParseState *pstate, Node *node, Oid inputTypeId,
result = transformExpr(pstate, (Node *) n, EXPR_COLUMN_FIRST); 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 * If the input is a constant, apply the type conversion function
* now instead of delaying to runtime. (We could, of course, * 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) ...@@ -163,6 +169,7 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *func_typeids)
{ {
int i; int i;
HeapTuple ftup; HeapTuple ftup;
Form_pg_proc pform;
Oid oid_array[FUNC_MAX_ARGS]; Oid oid_array[FUNC_MAX_ARGS];
/* run through argument list... */ /* run through argument list... */
...@@ -221,9 +228,10 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *func_typeids) ...@@ -221,9 +228,10 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *func_typeids)
0); 0);
if (!HeapTupleIsValid(ftup)) if (!HeapTupleIsValid(ftup))
return false; return false;
/* /* Make sure the function's result type is as expected, too */
* should also check the function return type just to be safe... pform = (Form_pg_proc) GETSTRUCT(ftup);
*/ if (pform->prorettype != targetTypeId)
return false;
} }
return true; return true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment