summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/pl/plpgsql/src/pl_exec.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index 315d28b8fae..f24f55a2ff4 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -57,6 +57,7 @@ typedef struct
/* NB: we assume this struct contains no padding bytes */
Oid srctype; /* source type for cast */
Oid dsttype; /* destination type for cast */
+ int32 srctypmod; /* source typmod for cast */
int32 dsttypmod; /* destination typmod for cast */
} plpgsql_CastHashKey;
@@ -231,7 +232,7 @@ static Datum exec_cast_value(PLpgSQL_execstate *estate,
Oid valtype, int32 valtypmod,
Oid reqtype, int32 reqtypmod);
static ExprState *get_cast_expression(PLpgSQL_execstate *estate,
- Oid srctype, Oid dsttype, int32 dsttypmod);
+ Oid srctype, int32 srctypmod, Oid dsttype, int32 dsttypmod);
static void exec_init_tuple_store(PLpgSQL_execstate *estate);
static void exec_set_found(PLpgSQL_execstate *estate, bool state);
static void plpgsql_create_econtext(PLpgSQL_execstate *estate);
@@ -5733,7 +5734,9 @@ exec_cast_value(PLpgSQL_execstate *estate,
{
ExprState *cast_expr;
- cast_expr = get_cast_expression(estate, valtype, reqtype, reqtypmod);
+ cast_expr = get_cast_expression(estate,
+ valtype, valtypmod,
+ reqtype, reqtypmod);
if (cast_expr)
{
ExprContext *econtext = estate->eval_econtext;
@@ -5769,7 +5772,7 @@ exec_cast_value(PLpgSQL_execstate *estate,
*/
static ExprState *
get_cast_expression(PLpgSQL_execstate *estate,
- Oid srctype, Oid dsttype, int32 dsttypmod)
+ Oid srctype, int32 srctypmod, Oid dsttype, int32 dsttypmod)
{
HTAB *cast_hash = estate->func->cast_hash;
plpgsql_CastHashKey cast_key;
@@ -5799,6 +5802,7 @@ get_cast_expression(PLpgSQL_execstate *estate,
/* Look for existing entry */
cast_key.srctype = srctype;
cast_key.dsttype = dsttype;
+ cast_key.srctypmod = srctypmod;
cast_key.dsttypmod = dsttypmod;
cast_entry = (plpgsql_CastHashEntry *) hash_search(cast_hash,
(void *) &cast_key,
@@ -5815,7 +5819,7 @@ get_cast_expression(PLpgSQL_execstate *estate,
*/
placeholder = makeNode(CaseTestExpr);
placeholder->typeId = srctype;
- placeholder->typeMod = -1;
+ placeholder->typeMod = srctypmod;
placeholder->collation = get_typcollation(srctype);
if (OidIsValid(estate->func->fn_input_collation) &&
OidIsValid(placeholder->collation))