PLpgSQL_rec *rec);
static char *convert_value_to_string(PLpgSQL_execstate *estate,
Datum value, Oid valtype);
-static Datum exec_cast_value(PLpgSQL_execstate *estate,
- Datum value, bool *isnull,
- Oid valtype, int32 valtypmod,
- Oid reqtype, int32 reqtypmod);
+static inline Datum exec_cast_value(PLpgSQL_execstate *estate,
+ Datum value, bool *isnull,
+ Oid valtype, int32 valtypmod,
+ Oid reqtype, int32 reqtypmod);
+static Datum do_cast_value(PLpgSQL_execstate *estate,
+ Datum value, bool *isnull,
+ Oid valtype, int32 valtypmod,
+ Oid reqtype, int32 reqtypmod);
static plpgsql_CastHashEntry *get_cast_hashentry(PLpgSQL_execstate *estate,
Oid srctype, int32 srctypmod,
Oid dsttype, int32 dsttypmod);
* done with the result.
* ----------
*/
-static Datum
+static inline Datum
exec_cast_value(PLpgSQL_execstate *estate,
Datum value, bool *isnull,
Oid valtype, int32 valtypmod,
if (valtype != reqtype ||
(valtypmod != reqtypmod && reqtypmod != -1))
{
- plpgsql_CastHashEntry *cast_entry;
+ /* We keep the slow path out-of-line. */
+ value = do_cast_value(estate, value, isnull, valtype, valtypmod,
+ reqtype, reqtypmod);
+ }
- cast_entry = get_cast_hashentry(estate,
- valtype, valtypmod,
- reqtype, reqtypmod);
- if (cast_entry)
- {
- ExprContext *econtext = estate->eval_econtext;
- MemoryContext oldcontext;
+ return value;
+}
- oldcontext = MemoryContextSwitchTo(get_eval_mcontext(estate));
+/* ----------
+ * do_cast_value Slow path for exec_cast_value.
+ * ----------
+ */
+static Datum
+do_cast_value(PLpgSQL_execstate *estate,
+ Datum value, bool *isnull,
+ Oid valtype, int32 valtypmod,
+ Oid reqtype, int32 reqtypmod)
+{
+ plpgsql_CastHashEntry *cast_entry;
- econtext->caseValue_datum = value;
- econtext->caseValue_isNull = *isnull;
+ cast_entry = get_cast_hashentry(estate,
+ valtype, valtypmod,
+ reqtype, reqtypmod);
+ if (cast_entry)
+ {
+ ExprContext *econtext = estate->eval_econtext;
+ MemoryContext oldcontext;
- cast_entry->cast_in_use = true;
+ oldcontext = MemoryContextSwitchTo(get_eval_mcontext(estate));
- value = ExecEvalExpr(cast_entry->cast_exprstate, econtext,
- isnull);
+ econtext->caseValue_datum = value;
+ econtext->caseValue_isNull = *isnull;
- cast_entry->cast_in_use = false;
+ cast_entry->cast_in_use = true;
- MemoryContextSwitchTo(oldcontext);
- }
+ value = ExecEvalExpr(cast_entry->cast_exprstate, econtext,
+ isnull);
+
+ cast_entry->cast_in_use = false;
+
+ MemoryContextSwitchTo(oldcontext);
}
return value;