From 6c8d838079402de61192dfdd9dd020f64aa586cb Mon Sep 17 00:00:00 2001
From: Neil Conway <neilc@samurai.com>
Date: Mon, 9 Jan 2006 02:47:09 +0000
Subject: [PATCH] Minor code cleanup for PL/Python: fixup some strangely
 formatted comments, and change two elogs into ereports because they could
 actually occur in practice.

---
 src/pl/plpython/plpython.c | 116 +++++++++++++++----------------------
 1 file changed, 47 insertions(+), 69 deletions(-)

diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c
index f4c6985bc3a..39acb47e69b 100644
--- a/src/pl/plpython/plpython.c
+++ b/src/pl/plpython/plpython.c
@@ -29,7 +29,7 @@
  * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *	$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.68 2005/12/29 21:47:32 neilc Exp $
+ *	$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.69 2006/01/09 02:47:09 neilc Exp $
  *
  *********************************************************************
  */
@@ -124,8 +124,7 @@ typedef struct PLyTypeInfo
 }	PLyTypeInfo;
 
 
-/* cached procedure data
- */
+/* cached procedure data */
 typedef struct PLyProcedure
 {
 	char	   *proname;		/* SQL name of procedure */
@@ -145,8 +144,7 @@ typedef struct PLyProcedure
 }	PLyProcedure;
 
 
-/* Python objects.
- */
+/* Python objects */
 typedef struct PLyPlanObject
 {
 	PyObject_HEAD
@@ -167,8 +165,7 @@ typedef struct PLyResultObject
 }	PLyResultObject;
 
 
-/* function declarations
- */
+/* function declarations */
 
 /* Two exported functions: first is the magic telling Postgresql
  * what function call interface it implements. Second allows
@@ -179,8 +176,7 @@ void		plpython_init(void);
 
 PG_FUNCTION_INFO_V1(plpython_call_handler);
 
-/* most of the remaining of the declarations, all static
- */
+/* most of the remaining of the declarations, all static */
 
 /* these should only be called once at the first call
  * of plpython_call_handler.  initialize the python interpreter
@@ -190,18 +186,15 @@ static void PLy_init_all(void);
 static void PLy_init_interp(void);
 static void PLy_init_plpy(void);
 
-/* call PyErr_SetString with a vprint interface
- */
+/* call PyErr_SetString with a vprint interface */
 static void
 PLy_exception_set(PyObject *, const char *,...)
 __attribute__((format(printf, 2, 3)));
 
-/* Get the innermost python procedure called from the backend.
- */
+/* Get the innermost python procedure called from the backend */
 static char *PLy_procedure_name(PLyProcedure *);
 
-/* some utility functions
- */
+/* some utility functions */
 static void PLy_elog(int, const char *,...);
 static char *PLy_traceback(int *);
 static char *PLy_vprintf(const char *fmt, va_list ap);
@@ -212,8 +205,7 @@ static void *PLy_realloc(void *, size_t);
 static char *PLy_strdup(const char *);
 static void PLy_free(void *);
 
-/* sub handlers for functions and triggers
- */
+/* sub handlers for functions and triggers */
 static Datum PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *);
 static HeapTuple PLy_trigger_handler(FunctionCallInfo fcinfo, PLyProcedure *);
 
@@ -245,8 +237,7 @@ static void PLy_input_datum_func2(PLyDatumToOb *, Oid, HeapTuple);
 static void PLy_output_tuple_funcs(PLyTypeInfo *, TupleDesc);
 static void PLy_input_tuple_funcs(PLyTypeInfo *, TupleDesc);
 
-/* conversion functions
- */
+/* conversion functions */
 static PyObject *PLyDict_FromTuple(PLyTypeInfo *, HeapTuple, TupleDesc);
 static PyObject *PLyBool_FromString(const char *);
 static PyObject *PLyFloat_FromString(const char *);
@@ -255,8 +246,7 @@ static PyObject *PLyLong_FromString(const char *);
 static PyObject *PLyString_FromString(const char *);
 
 
-/* global data
- */
+/* global data */
 static bool	PLy_first_call = true;
 
 /*
@@ -281,14 +271,12 @@ static PyObject *PLy_interp_globals = NULL;
 static PyObject *PLy_interp_safe_globals = NULL;
 static PyObject *PLy_procedure_cache = NULL;
 
-/* Python exceptions
- */
+/* Python exceptions */
 static PyObject *PLy_exc_error = NULL;
 static PyObject *PLy_exc_fatal = NULL;
 static PyObject *PLy_exc_spi_error = NULL;
 
-/* some globals for the python module
- */
+/* some globals for the python module */
 static char PLy_plan_doc[] = {
 	"Store a PostgreSQL plan"
 };
@@ -412,7 +400,10 @@ PLy_trigger_handler(FunctionCallInfo fcinfo, PLyProcedure * proc)
 			char	   *srv;
 
 			if (!PyString_Check(plrv))
-				elog(ERROR, "expected trigger to return None or a String");
+				ereport(ERROR,
+						(errcode(ERRCODE_DATA_EXCEPTION),
+						 errmsg("unexpected return value from trigger procedure"),
+						 errdetail("expected None or a String")));
 
 			srv = PyString_AsString(plrv);
 			if (pg_strcasecmp(srv, "SKIP") == 0)
@@ -430,11 +421,13 @@ PLy_trigger_handler(FunctionCallInfo fcinfo, PLyProcedure * proc)
 			else if (pg_strcasecmp(srv, "OK") != 0)
 			{
 				/*
-				 * hmmm, perhaps they only read the pltcl page, not a
-				 * surprising thing since i've written no documentation, so
-				 * accept a belated OK
+				 * accept "OK" as an alternative to None; otherwise,
+				 * raise an error
 				 */
-				elog(ERROR, "expected return to be \"SKIP\" or \"MODIFY\"");
+				ereport(ERROR,
+						(errcode(ERRCODE_DATA_EXCEPTION),
+						 errmsg("unexpected return value from trigger procedure"),
+						 errdetail("expected None, \"OK\", \"SKIP\", or \"MODIFY\"")));
 			}
 		}
 	}
@@ -533,7 +526,7 @@ PLy_modify_tuple(PLyProcedure * proc, PyObject * pltd, TriggerData *tdata,
 			}
 			else
 			{
-				modvalues[i] = (Datum) 0;
+				modvalues[i] = PointerGetDatum(NULL);
 				modnulls[i] = 'n';
 			}
 
@@ -737,8 +730,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure * proc, HeapTuple *
 
 
 
-/* function handler and friends
- */
+/* function handler and friends */
 static Datum
 PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure * proc)
 {
@@ -771,7 +763,7 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure * proc)
 		if (plrv == Py_None)
 		{
 			fcinfo->isnull = true;
-			rv = (Datum) NULL;
+			rv = PointerGetDatum(NULL);
 		}
 		else
 		{
@@ -785,7 +777,6 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure * proc)
 							   ObjectIdGetDatum(proc->result.out.d.typioparam),
 							   Int32GetDatum(-1));
 		}
-
 	}
 	PG_CATCH();
 	{
@@ -1150,8 +1141,8 @@ PLy_procedure_compile(PLyProcedure * proc, const char *src)
 	proc->globals = PyDict_Copy(PLy_interp_globals);
 
 	/*
-	 * SD is private preserved data between calls GD is global data shared by
-	 * all functions
+	 * SD is private preserved data between calls. GD is global data
+	 * shared by all functions
 	 */
 	proc->statics = PyDict_New();
 	PyDict_SetItemString(proc->globals, "SD", proc->statics);
@@ -1406,8 +1397,7 @@ PLy_typeinfo_dealloc(PLyTypeInfo * arg)
 	}
 }
 
-/* assumes that a bool is always returned as a 't' or 'f'
- */
+/* assumes that a bool is always returned as a 't' or 'f' */
 static PyObject *
 PLyBool_FromString(const char *src)
 {
@@ -1514,11 +1504,9 @@ PLyDict_FromTuple(PLyTypeInfo * info, HeapTuple tuple, TupleDesc desc)
 	return dict;
 }
 
-/* initialization, some python variables function declared here
- */
+/* initialization, some python variables function declared here */
 
-/* interface to postgresql elog
- */
+/* interface to postgresql elog */
 static PyObject *PLy_debug(PyObject *, PyObject *);
 static PyObject *PLy_log(PyObject *, PyObject *);
 static PyObject *PLy_info(PyObject *, PyObject *);
@@ -1527,8 +1515,7 @@ static PyObject *PLy_warning(PyObject *, PyObject *);
 static PyObject *PLy_error(PyObject *, PyObject *);
 static PyObject *PLy_fatal(PyObject *, PyObject *);
 
-/* PLyPlanObject, PLyResultObject and SPI interface
- */
+/* PLyPlanObject, PLyResultObject and SPI interface */
 #define is_PLyPlanObject(x) ((x)->ob_type == &PLy_PlanType)
 static PyObject *PLy_plan_new(void);
 static void PLy_plan_dealloc(PyObject *);
@@ -1660,8 +1647,7 @@ static PyMethodDef PLy_methods[] = {
 };
 
 
-/* plan object methods
- */
+/* plan object methods */
 static PyObject *
 PLy_plan_new(void)
 {
@@ -1722,8 +1708,7 @@ PLy_plan_status(PyObject * self, PyObject * args)
 
 
 
-/* result object methods
- */
+/* result object methods */
 
 static PyObject *
 PLy_result_new(void)
@@ -1833,8 +1818,7 @@ PLy_result_ass_slice(PyObject * arg, int lidx, int hidx, PyObject * slice)
 	return rv;
 }
 
-/* SPI interface
- */
+/* SPI interface */
 static PyObject *
 PLy_spi_prepare(PyObject * self, PyObject * args)
 {
@@ -1893,7 +1877,7 @@ PLy_spi_prepare(PyObject * self, PyObject * args)
 				for (i = 0; i < nargs; i++)
 				{
 					PLy_typeinfo_init(&plan->args[i]);
-					plan->values[i] = (Datum) NULL;
+					plan->values[i] = PointerGetDatum(NULL);
 				}
 
 				for (i = 0; i < nargs; i++)
@@ -2073,7 +2057,7 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, long limit)
 			else
 			{
 				Py_DECREF(elem);
-				plan->values[i] = (Datum) 0;
+				plan->values[i] = PointerGetDatum(NULL);
 				nulls[i] = 'n';
 			}
 		}
@@ -2095,10 +2079,10 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, long limit)
 		for (i = 0; i < nargs; i++)
 		{
 			if (!plan->args[i].out.d.typbyval &&
-				(plan->values[i] != (Datum) NULL))
+				(plan->values[i] != PointerGetDatum(NULL)))
 			{
 				pfree(DatumGetPointer(plan->values[i]));
-				plan->values[i] = (Datum) NULL;
+				plan->values[i] = PointerGetDatum(NULL);
 			}
 		}
 
@@ -2115,10 +2099,10 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, long limit)
 	for (i = 0; i < nargs; i++)
 	{
 		if (!plan->args[i].out.d.typbyval &&
-			(plan->values[i] != (Datum) NULL))
+			(plan->values[i] != PointerGetDatum(NULL)))
 		{
 			pfree(DatumGetPointer(plan->values[i]));
-			plan->values[i] = (Datum) NULL;
+			plan->values[i] = PointerGetDatum(NULL);
 		}
 	}
 
@@ -2436,13 +2420,12 @@ PLy_output(volatile int level, PyObject * self, PyObject * args)
 
 
 /*
- * Get the last procedure name called by the backend ( the innermost,
- * If a plpython procedure call calls the backend and the backend calls
- * another plpython procedure )
+ * Get the name of the last procedure called by the backend (the
+ * innermost, if a plpython procedure call calls the backend and the
+ * backend calls another plpython procedure).
  *
  * NB: this returns the SQL name, not the internal Python procedure name
  */
-
 static char *
 PLy_procedure_name(PLyProcedure * proc)
 {
@@ -2606,13 +2589,9 @@ PLy_vprintf(const char *fmt, va_list ap)
 	return NULL;
 }
 
-/* python module code
- */
-
-
-/* some dumb utility functions
- */
+/* python module code */
 
+/* some dumb utility functions */
 static void *
 PLy_malloc(size_t bytes)
 {
@@ -2650,8 +2629,7 @@ PLy_strdup(const char *str)
 	return result;
 }
 
-/* define this away
- */
+/* define this away */
 static void
 PLy_free(void *ptr)
 {
-- 
GitLab