Most of the pl/pgsql functions and variables are prefixed plpgsql_, so they
don't risk conflicting with other shared libraries loaded.

There are a couple that are not prefixed. Attached patch fixes that. It's
mostly a cleanup, but I think it's something we should do since it's only 2
variables and 2 functions.

AFAICT these are clearly meant to be internal. (the plugin variable is
accessed through find_rendezvous_variable)

Comments?

-- 
 Magnus Hagander
 Me: http://www.hagander.net/
 Work: http://www.redpill-linpro.com/
*** a/src/pl/plpgsql/src/pl_comp.c
--- b/src/pl/plpgsql/src/pl_comp.c
***************
*** 51,57 **** bool		plpgsql_check_syntax = false;
  PLpgSQL_function *plpgsql_curr_compile;
  
  /* A context appropriate for short-term allocs during compilation */
! MemoryContext compile_tmp_cxt;
  
  /* ----------
   * Hash table for compiled functions
--- 51,57 ----
  PLpgSQL_function *plpgsql_curr_compile;
  
  /* A context appropriate for short-term allocs during compilation */
! MemoryContext plpgsql_compile_tmp_cxt;
  
  /* ----------
   * Hash table for compiled functions
***************
*** 253,259 **** recheck:
   * careful about pfree'ing their allocations, it is also wise to
   * switch into a short-term context before calling into the
   * backend. An appropriate context for performing short-term
!  * allocations is the compile_tmp_cxt.
   *
   * NB: this code is not re-entrant.  We assume that nothing we do here could
   * result in the invocation of another plpgsql function.
--- 253,259 ----
   * careful about pfree'ing their allocations, it is also wise to
   * switch into a short-term context before calling into the
   * backend. An appropriate context for performing short-term
!  * allocations is the plpgsql_compile_tmp_cxt.
   *
   * NB: this code is not re-entrant.  We assume that nothing we do here could
   * result in the invocation of another plpgsql function.
***************
*** 343,349 **** do_compile(FunctionCallInfo fcinfo,
  									 ALLOCSET_DEFAULT_MINSIZE,
  									 ALLOCSET_DEFAULT_INITSIZE,
  									 ALLOCSET_DEFAULT_MAXSIZE);
! 	compile_tmp_cxt = MemoryContextSwitchTo(func_cxt);
  
  	function->fn_signature = format_procedure(fcinfo->flinfo->fn_oid);
  	function->fn_oid = fcinfo->flinfo->fn_oid;
--- 343,349 ----
  									 ALLOCSET_DEFAULT_MINSIZE,
  									 ALLOCSET_DEFAULT_INITSIZE,
  									 ALLOCSET_DEFAULT_MAXSIZE);
! 	plpgsql_compile_tmp_cxt = MemoryContextSwitchTo(func_cxt);
  
  	function->fn_signature = format_procedure(fcinfo->flinfo->fn_oid);
  	function->fn_oid = fcinfo->flinfo->fn_oid;
***************
*** 387,393 **** do_compile(FunctionCallInfo fcinfo,
  			 * argument types.  In validation mode we won't be able to, so we
  			 * arbitrarily assume we are dealing with integers.
  			 */
! 			MemoryContextSwitchTo(compile_tmp_cxt);
  
  			numargs = get_func_arg_info(procTup,
  										&argtypes, &argnames, &argmodes);
--- 387,393 ----
  			 * argument types.  In validation mode we won't be able to, so we
  			 * arbitrarily assume we are dealing with integers.
  			 */
! 			MemoryContextSwitchTo(plpgsql_compile_tmp_cxt);
  
  			numargs = get_func_arg_info(procTup,
  										&argtypes, &argnames, &argmodes);
***************
*** 774,781 **** do_compile(FunctionCallInfo fcinfo,
  
  	plpgsql_check_syntax = false;
  
! 	MemoryContextSwitchTo(compile_tmp_cxt);
! 	compile_tmp_cxt = NULL;
  	return function;
  }
  
--- 774,781 ----
  
  	plpgsql_check_syntax = false;
  
! 	MemoryContextSwitchTo(plpgsql_compile_tmp_cxt);
! 	plpgsql_compile_tmp_cxt = NULL;
  	return function;
  }
  
***************
*** 833,839 **** plpgsql_compile_inline(char *proc_source)
  									 ALLOCSET_DEFAULT_MINSIZE,
  									 ALLOCSET_DEFAULT_INITSIZE,
  									 ALLOCSET_DEFAULT_MAXSIZE);
! 	compile_tmp_cxt = MemoryContextSwitchTo(func_cxt);
  
  	function->fn_signature = pstrdup(func_name);
  	function->fn_is_trigger = PLPGSQL_NOT_TRIGGER;
--- 833,839 ----
  									 ALLOCSET_DEFAULT_MINSIZE,
  									 ALLOCSET_DEFAULT_INITSIZE,
  									 ALLOCSET_DEFAULT_MAXSIZE);
! 	plpgsql_compile_tmp_cxt = MemoryContextSwitchTo(func_cxt);
  
  	function->fn_signature = pstrdup(func_name);
  	function->fn_is_trigger = PLPGSQL_NOT_TRIGGER;
***************
*** 911,918 **** plpgsql_compile_inline(char *proc_source)
  
  	plpgsql_check_syntax = false;
  
! 	MemoryContextSwitchTo(compile_tmp_cxt);
! 	compile_tmp_cxt = NULL;
  	return function;
  }
  
--- 911,918 ----
  
  	plpgsql_check_syntax = false;
  
! 	MemoryContextSwitchTo(plpgsql_compile_tmp_cxt);
! 	plpgsql_compile_tmp_cxt = NULL;
  	return function;
  }
  
***************
*** 1325,1331 **** make_datum_param(PLpgSQL_expr *expr, int dno, int location)
  	param = makeNode(Param);
  	param->paramkind = PARAM_EXTERN;
  	param->paramid = dno + 1;
! 	exec_get_datum_type_info(estate,
  							 datum,
  							 &param->paramtype,
  							 &param->paramtypmod,
--- 1325,1331 ----
  	param = makeNode(Param);
  	param->paramkind = PARAM_EXTERN;
  	param->paramid = dno + 1;
! 	plpgsql_exec_get_datum_type_info(estate,
  							 datum,
  							 &param->paramtype,
  							 &param->paramtypmod,
***************
*** 1703,1709 **** plpgsql_parse_cwordtype(List *idents)
  	MemoryContext oldCxt;
  
  	/* Avoid memory leaks in the long-term function context */
! 	oldCxt = MemoryContextSwitchTo(compile_tmp_cxt);
  
  	if (list_length(idents) == 2)
  	{
--- 1703,1709 ----
  	MemoryContext oldCxt;
  
  	/* Avoid memory leaks in the long-term function context */
! 	oldCxt = MemoryContextSwitchTo(plpgsql_compile_tmp_cxt);
  
  	if (list_length(idents) == 2)
  	{
***************
*** 1786,1792 **** plpgsql_parse_cwordtype(List *idents)
  	dtype = build_datatype(typetup,
  						   attrStruct->atttypmod,
  						   attrStruct->attcollation);
! 	MemoryContextSwitchTo(compile_tmp_cxt);
  
  done:
  	if (HeapTupleIsValid(classtup))
--- 1786,1792 ----
  	dtype = build_datatype(typetup,
  						   attrStruct->atttypmod,
  						   attrStruct->attcollation);
! 	MemoryContextSwitchTo(plpgsql_compile_tmp_cxt);
  
  done:
  	if (HeapTupleIsValid(classtup))
***************
*** 1837,1843 **** plpgsql_parse_cwordrowtype(List *idents)
  		return NULL;
  
  	/* Avoid memory leaks in long-term function context */
! 	oldCxt = MemoryContextSwitchTo(compile_tmp_cxt);
  
  	/* Look up relation name.  Can't lock it - we might not have privileges. */
  	relvar = makeRangeVar(strVal(linitial(idents)),
--- 1837,1843 ----
  		return NULL;
  
  	/* Avoid memory leaks in long-term function context */
! 	oldCxt = MemoryContextSwitchTo(plpgsql_compile_tmp_cxt);
  
  	/* Look up relation name.  Can't lock it - we might not have privileges. */
  	relvar = makeRangeVar(strVal(linitial(idents)),
***************
*** 2309,2315 **** plpgsql_start_datums(void)
  	datums_alloc = 128;
  	plpgsql_nDatums = 0;
  	/* This is short-lived, so needn't allocate in function's cxt */
! 	plpgsql_Datums = MemoryContextAlloc(compile_tmp_cxt,
  									 sizeof(PLpgSQL_datum *) * datums_alloc);
  	/* datums_last tracks what's been seen by plpgsql_add_initdatums() */
  	datums_last = 0;
--- 2309,2315 ----
  	datums_alloc = 128;
  	plpgsql_nDatums = 0;
  	/* This is short-lived, so needn't allocate in function's cxt */
! 	plpgsql_Datums = MemoryContextAlloc(plpgsql_compile_tmp_cxt,
  									 sizeof(PLpgSQL_datum *) * datums_alloc);
  	/* datums_last tracks what's been seen by plpgsql_add_initdatums() */
  	datums_last = 0;
*** a/src/pl/plpgsql/src/pl_exec.c
--- b/src/pl/plpgsql/src/pl_exec.c
***************
*** 423,430 **** plpgsql_exec_function(PLpgSQL_function *func, FunctionCallInfo fcinfo,
  	/*
  	 * Let the instrumentation plugin peek at this function
  	 */
! 	if (*plugin_ptr && (*plugin_ptr)->func_beg)
! 		((*plugin_ptr)->func_beg) (&estate, func);
  
  	/*
  	 * Now call the toplevel block of statements
--- 423,430 ----
  	/*
  	 * Let the instrumentation plugin peek at this function
  	 */
! 	if (*plpgsql_plugin_ptr && (*plpgsql_plugin_ptr)->func_beg)
! 		((*plpgsql_plugin_ptr)->func_beg) (&estate, func);
  
  	/*
  	 * Now call the toplevel block of statements
***************
*** 556,563 **** plpgsql_exec_function(PLpgSQL_function *func, FunctionCallInfo fcinfo,
  	/*
  	 * Let the instrumentation plugin peek at this function
  	 */
! 	if (*plugin_ptr && (*plugin_ptr)->func_end)
! 		((*plugin_ptr)->func_end) (&estate, func);
  
  	/* Clean up any leftover temporary memory */
  	plpgsql_destroy_econtext(&estate);
--- 556,563 ----
  	/*
  	 * Let the instrumentation plugin peek at this function
  	 */
! 	if (*plpgsql_plugin_ptr && (*plpgsql_plugin_ptr)->func_end)
! 		((*plpgsql_plugin_ptr)->func_end) (&estate, func);
  
  	/* Clean up any leftover temporary memory */
  	plpgsql_destroy_econtext(&estate);
***************
*** 767,774 **** plpgsql_exec_trigger(PLpgSQL_function *func,
  	/*
  	 * Let the instrumentation plugin peek at this function
  	 */
! 	if (*plugin_ptr && (*plugin_ptr)->func_beg)
! 		((*plugin_ptr)->func_beg) (&estate, func);
  
  	/*
  	 * Now call the toplevel block of statements
--- 767,774 ----
  	/*
  	 * Let the instrumentation plugin peek at this function
  	 */
! 	if (*plpgsql_plugin_ptr && (*plpgsql_plugin_ptr)->func_beg)
! 		((*plpgsql_plugin_ptr)->func_beg) (&estate, func);
  
  	/*
  	 * Now call the toplevel block of statements
***************
*** 826,833 **** plpgsql_exec_trigger(PLpgSQL_function *func,
  	/*
  	 * Let the instrumentation plugin peek at this function
  	 */
! 	if (*plugin_ptr && (*plugin_ptr)->func_end)
! 		((*plugin_ptr)->func_end) (&estate, func);
  
  	/* Clean up any leftover temporary memory */
  	plpgsql_destroy_econtext(&estate);
--- 826,833 ----
  	/*
  	 * Let the instrumentation plugin peek at this function
  	 */
! 	if (*plpgsql_plugin_ptr && (*plpgsql_plugin_ptr)->func_end)
! 		((*plpgsql_plugin_ptr)->func_end) (&estate, func);
  
  	/* Clean up any leftover temporary memory */
  	plpgsql_destroy_econtext(&estate);
***************
*** 885,892 **** plpgsql_exec_event_trigger(PLpgSQL_function *func, EventTriggerData *trigdata)
  	/*
  	 * Let the instrumentation plugin peek at this function
  	 */
! 	if (*plugin_ptr && (*plugin_ptr)->func_beg)
! 		((*plugin_ptr)->func_beg) (&estate, func);
  
  	/*
  	 * Now call the toplevel block of statements
--- 885,892 ----
  	/*
  	 * Let the instrumentation plugin peek at this function
  	 */
! 	if (*plpgsql_plugin_ptr && (*plpgsql_plugin_ptr)->func_beg)
! 		((*plpgsql_plugin_ptr)->func_beg) (&estate, func);
  
  	/*
  	 * Now call the toplevel block of statements
***************
*** 909,916 **** plpgsql_exec_event_trigger(PLpgSQL_function *func, EventTriggerData *trigdata)
  	/*
  	 * Let the instrumentation plugin peek at this function
  	 */
! 	if (*plugin_ptr && (*plugin_ptr)->func_end)
! 		((*plugin_ptr)->func_end) (&estate, func);
  
  	/* Clean up any leftover temporary memory */
  	plpgsql_destroy_econtext(&estate);
--- 909,916 ----
  	/*
  	 * Let the instrumentation plugin peek at this function
  	 */
! 	if (*plpgsql_plugin_ptr && (*plpgsql_plugin_ptr)->func_end)
! 		((*plpgsql_plugin_ptr)->func_end) (&estate, func);
  
  	/* Clean up any leftover temporary memory */
  	plpgsql_destroy_econtext(&estate);
***************
*** 1420,1427 **** exec_stmt(PLpgSQL_execstate *estate, PLpgSQL_stmt *stmt)
  	estate->err_stmt = stmt;
  
  	/* Let the plugin know that we are about to execute this statement */
! 	if (*plugin_ptr && (*plugin_ptr)->stmt_beg)
! 		((*plugin_ptr)->stmt_beg) (estate, stmt);
  
  	CHECK_FOR_INTERRUPTS();
  
--- 1420,1427 ----
  	estate->err_stmt = stmt;
  
  	/* Let the plugin know that we are about to execute this statement */
! 	if (*plpgsql_plugin_ptr && (*plpgsql_plugin_ptr)->stmt_beg)
! 		((*plpgsql_plugin_ptr)->stmt_beg) (estate, stmt);
  
  	CHECK_FOR_INTERRUPTS();
  
***************
*** 1529,1536 **** exec_stmt(PLpgSQL_execstate *estate, PLpgSQL_stmt *stmt)
  	}
  
  	/* Let the plugin know that we have finished executing this statement */
! 	if (*plugin_ptr && (*plugin_ptr)->stmt_end)
! 		((*plugin_ptr)->stmt_end) (estate, stmt);
  
  	estate->err_stmt = save_estmt;
  
--- 1529,1536 ----
  	}
  
  	/* Let the plugin know that we have finished executing this statement */
! 	if (*plpgsql_plugin_ptr && (*plpgsql_plugin_ptr)->stmt_end)
! 		((*plpgsql_plugin_ptr)->stmt_end) (estate, stmt);
  
  	estate->err_stmt = save_estmt;
  
***************
*** 2315,2321 **** exec_stmt_foreach_a(PLpgSQL_execstate *estate, PLpgSQL_stmt_foreach_a *stmt)
  		loop_var_elem_type = InvalidOid;
  	}
  	else
! 		loop_var_elem_type = get_element_type(exec_get_datum_type(estate,
  																  loop_var));
  
  	/*
--- 2315,2321 ----
  		loop_var_elem_type = InvalidOid;
  	}
  	else
! 		loop_var_elem_type = get_element_type(plpgsql_exec_get_datum_type(estate,
  																  loop_var));
  
  	/*
***************
*** 3350,3362 **** plpgsql_estate_setup(PLpgSQL_execstate *estate,
  	 * pointers so it can call back into PL/pgSQL for doing things like
  	 * variable assignments and stack traces
  	 */
! 	if (*plugin_ptr)
  	{
! 		(*plugin_ptr)->error_callback = plpgsql_exec_error_callback;
! 		(*plugin_ptr)->assign_expr = exec_assign_expr;
  
! 		if ((*plugin_ptr)->func_setup)
! 			((*plugin_ptr)->func_setup) (estate, func);
  	}
  }
  
--- 3350,3362 ----
  	 * pointers so it can call back into PL/pgSQL for doing things like
  	 * variable assignments and stack traces
  	 */
! 	if (*plpgsql_plugin_ptr)
  	{
! 		(*plpgsql_plugin_ptr)->error_callback = plpgsql_exec_error_callback;
! 		(*plpgsql_plugin_ptr)->assign_expr = exec_assign_expr;
  
! 		if ((*plpgsql_plugin_ptr)->func_setup)
! 			((*plpgsql_plugin_ptr)->func_setup) (estate, func);
  	}
  }
  
***************
*** 4758,4764 **** exec_eval_datum(PLpgSQL_execstate *estate,
  }
  
  /*
!  * exec_get_datum_type				Get datatype of a PLpgSQL_datum
   *
   * This is the same logic as in exec_eval_datum, except that it can handle
   * some cases where exec_eval_datum has to fail; specifically, we may have
--- 4758,4764 ----
  }
  
  /*
!  * plpgsql_exec_get_datum_type				Get datatype of a PLpgSQL_datum
   *
   * This is the same logic as in exec_eval_datum, except that it can handle
   * some cases where exec_eval_datum has to fail; specifically, we may have
***************
*** 4766,4772 **** exec_eval_datum(PLpgSQL_execstate *estate,
   * happen only for a trigger's NEW/OLD records.)
   */
  Oid
! exec_get_datum_type(PLpgSQL_execstate *estate,
  					PLpgSQL_datum *datum)
  {
  	Oid			typeid;
--- 4766,4772 ----
   * happen only for a trigger's NEW/OLD records.)
   */
  Oid
! plpgsql_exec_get_datum_type(PLpgSQL_execstate *estate,
  					PLpgSQL_datum *datum)
  {
  	Oid			typeid;
***************
*** 4842,4854 **** exec_get_datum_type(PLpgSQL_execstate *estate,
  }
  
  /*
!  * exec_get_datum_type_info			Get datatype etc of a PLpgSQL_datum
   *
!  * An extended version of exec_get_datum_type, which also retrieves the
   * typmod and collation of the datum.
   */
  void
! exec_get_datum_type_info(PLpgSQL_execstate *estate,
  						 PLpgSQL_datum *datum,
  						 Oid *typeid, int32 *typmod, Oid *collation)
  {
--- 4842,4854 ----
  }
  
  /*
!  * plpgsql_exec_get_datum_type_info			Get datatype etc of a PLpgSQL_datum
   *
!  * An extended version of plpgsql_exec_get_datum_type, which also retrieves the
   * typmod and collation of the datum.
   */
  void
! plpgsql_exec_get_datum_type_info(PLpgSQL_execstate *estate,
  						 PLpgSQL_datum *datum,
  						 Oid *typeid, int32 *typmod, Oid *collation)
  {
*** a/src/pl/plpgsql/src/pl_gram.y
--- b/src/pl/plpgsql/src/pl_gram.y
***************
*** 3518,3524 **** check_sql_expr(const char *stmt, int location, int leaderlen)
  	syntax_errcontext.previous = error_context_stack;
  	error_context_stack = &syntax_errcontext;
  
! 	oldCxt = MemoryContextSwitchTo(compile_tmp_cxt);
  	(void) raw_parser(stmt);
  	MemoryContextSwitchTo(oldCxt);
  
--- 3518,3524 ----
  	syntax_errcontext.previous = error_context_stack;
  	error_context_stack = &syntax_errcontext;
  
! 	oldCxt = MemoryContextSwitchTo(plpgsql_compile_tmp_cxt);
  	(void) raw_parser(stmt);
  	MemoryContextSwitchTo(oldCxt);
  
*** a/src/pl/plpgsql/src/pl_handler.c
--- b/src/pl/plpgsql/src/pl_handler.c
***************
*** 52,58 **** int			plpgsql_extra_warnings;
  int			plpgsql_extra_errors;
  
  /* Hook for plugins */
! PLpgSQL_plugin **plugin_ptr = NULL;
  
  
  static bool
--- 52,58 ----
  int			plpgsql_extra_errors;
  
  /* Hook for plugins */
! PLpgSQL_plugin **plpgsql_plugin_ptr = NULL;
  
  
  static bool
***************
*** 197,203 **** _PG_init(void)
  	RegisterSubXactCallback(plpgsql_subxact_cb, NULL);
  
  	/* Set up a rendezvous point with optional instrumentation plugin */
! 	plugin_ptr = (PLpgSQL_plugin **) find_rendezvous_variable("PLpgSQL_plugin");
  
  	inited = true;
  }
--- 197,203 ----
  	RegisterSubXactCallback(plpgsql_subxact_cb, NULL);
  
  	/* Set up a rendezvous point with optional instrumentation plugin */
! 	plpgsql_plugin_ptr = (PLpgSQL_plugin **) find_rendezvous_variable("PLpgSQL_plugin");
  
  	inited = true;
  }
*** a/src/pl/plpgsql/src/plpgsql.h
--- b/src/pl/plpgsql/src/plpgsql.h
***************
*** 938,946 **** extern PLpgSQL_datum **plpgsql_Datums;
  extern char *plpgsql_error_funcname;
  
  extern PLpgSQL_function *plpgsql_curr_compile;
! extern MemoryContext compile_tmp_cxt;
  
! extern PLpgSQL_plugin **plugin_ptr;
  
  /**********************************************************************
   * Function declarations
--- 938,946 ----
  extern char *plpgsql_error_funcname;
  
  extern PLpgSQL_function *plpgsql_curr_compile;
! extern MemoryContext plpgsql_compile_tmp_cxt;
  
! extern PLpgSQL_plugin **plpgsql_plugin_ptr;
  
  /**********************************************************************
   * Function declarations
***************
*** 999,1007 **** extern void plpgsql_exec_event_trigger(PLpgSQL_function *func,
  extern void plpgsql_xact_cb(XactEvent event, void *arg);
  extern void plpgsql_subxact_cb(SubXactEvent event, SubTransactionId mySubid,
  				   SubTransactionId parentSubid, void *arg);
! extern Oid exec_get_datum_type(PLpgSQL_execstate *estate,
  					PLpgSQL_datum *datum);
! extern void exec_get_datum_type_info(PLpgSQL_execstate *estate,
  						 PLpgSQL_datum *datum,
  						 Oid *typeid, int32 *typmod, Oid *collation);
  
--- 999,1007 ----
  extern void plpgsql_xact_cb(XactEvent event, void *arg);
  extern void plpgsql_subxact_cb(SubXactEvent event, SubTransactionId mySubid,
  				   SubTransactionId parentSubid, void *arg);
! extern Oid plpgsql_exec_get_datum_type(PLpgSQL_execstate *estate,
  					PLpgSQL_datum *datum);
! extern void plpgsql_exec_get_datum_type_info(PLpgSQL_execstate *estate,
  						 PLpgSQL_datum *datum,
  						 Oid *typeid, int32 *typmod, Oid *collation);
  
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to