mirror of
https://github.com/postgres/postgres.git
synced 2025-04-29 13:56:47 +03:00
In can_coerce_type, verify that a possible type-coercion function
actually returns the type it is named for.
This commit is contained in:
parent
7d392f257b
commit
f11d253e25
@ -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,
|
|||||||
|
|
||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user