mirror of
https://github.com/postgres/postgres.git
synced 2025-07-05 07:21:24 +03:00
Add a validator function for plperl. Andrew Dunstan
This commit is contained in:
@ -33,7 +33,7 @@
|
||||
* ENHANCEMENTS, OR MODIFICATIONS.
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.77 2005/06/15 00:35:16 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.78 2005/06/22 16:45:51 tgl Exp $
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
@ -114,6 +114,7 @@ static void plperl_init_all(void);
|
||||
static void plperl_init_interp(void);
|
||||
|
||||
Datum plperl_call_handler(PG_FUNCTION_ARGS);
|
||||
Datum plperl_validator(PG_FUNCTION_ARGS);
|
||||
void plperl_init(void);
|
||||
|
||||
HV *plperl_spi_exec(char *query, int limit);
|
||||
@ -506,10 +507,11 @@ plperl_modify_tuple(HV *hvTD, TriggerData *tdata, HeapTuple otup)
|
||||
}
|
||||
|
||||
|
||||
/* This is the only externally-visible part of the plperl interface.
|
||||
/*
|
||||
* This is the only externally-visible part of the plperl call interface.
|
||||
* The Postgres function and trigger managers call it to execute a
|
||||
* perl function. */
|
||||
|
||||
* perl function.
|
||||
*/
|
||||
PG_FUNCTION_INFO_V1(plperl_call_handler);
|
||||
|
||||
Datum
|
||||
@ -541,6 +543,44 @@ plperl_call_handler(PG_FUNCTION_ARGS)
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the other externally visible function - it is called when CREATE
|
||||
* FUNCTION is issued to validate the function being created/replaced.
|
||||
*/
|
||||
PG_FUNCTION_INFO_V1(plperl_validator);
|
||||
|
||||
Datum
|
||||
plperl_validator(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid funcoid = PG_GETARG_OID(0);
|
||||
HeapTuple tuple;
|
||||
Form_pg_proc proc;
|
||||
bool istrigger = false;
|
||||
plperl_proc_desc *prodesc;
|
||||
|
||||
plperl_init_all();
|
||||
|
||||
/* Get the new function's pg_proc entry */
|
||||
tuple = SearchSysCache(PROCOID,
|
||||
ObjectIdGetDatum(funcoid),
|
||||
0, 0, 0);
|
||||
if (!HeapTupleIsValid(tuple))
|
||||
elog(ERROR, "cache lookup failed for function %u", funcoid);
|
||||
proc = (Form_pg_proc) GETSTRUCT(tuple);
|
||||
|
||||
/* we assume OPAQUE with no arguments means a trigger */
|
||||
if (proc->prorettype == TRIGGEROID ||
|
||||
(proc->prorettype == OPAQUEOID && proc->pronargs == 0))
|
||||
istrigger = true;
|
||||
|
||||
ReleaseSysCache(tuple);
|
||||
|
||||
prodesc = compile_plperl_function(funcoid, istrigger);
|
||||
|
||||
/* the result of a validator is ignored */
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
||||
|
||||
/* Uses mksafefunc/mkunsafefunc to create an anonymous sub whose text is
|
||||
* supplied in s, and returns a reference to the closure. */
|
||||
@ -600,7 +640,7 @@ plperl_create_sub(char *s, bool trusted)
|
||||
*/
|
||||
subref = newSVsv(POPs);
|
||||
|
||||
if (!SvROK(subref))
|
||||
if (!SvROK(subref) || SvTYPE(SvRV(subref)) != SVt_PVCV)
|
||||
{
|
||||
PUTBACK;
|
||||
FREETMPS;
|
||||
|
Reference in New Issue
Block a user