From 7d5edf2ba7c23ffebec978eb5c21b5d108aaaf2a Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Wed, 6 Mar 2002 18:50:33 +0000
Subject: [PATCH] Add new elog() levels to stored procedure languages.  plperl
 DEBUG hack still needed because only removed in 7.4.

---
 src/pl/plperl/SPI.xs             | 18 +++++++++----
 src/pl/plperl/eloglvl.c          | 23 ++++++++++++++--
 src/pl/plperl/eloglvl.h          | 15 +++++++----
 src/pl/plperl/plperl.c           |  4 +--
 src/pl/plpgsql/src/gram.y        | 17 +++++++++++-
 src/pl/plpgsql/src/scan.l        |  5 +++-
 src/pl/plpython/error.expected   |  6 ++---
 src/pl/plpython/feature.expected |  2 +-
 src/pl/plpython/plpython.c       | 46 ++++++++++++++++++++++++--------
 src/pl/tcl/pltcl.c               | 10 ++++---
 10 files changed, 111 insertions(+), 35 deletions(-)

diff --git a/src/pl/plperl/SPI.xs b/src/pl/plperl/SPI.xs
index 451714ce0e..61f59fa43c 100644
--- a/src/pl/plperl/SPI.xs
+++ b/src/pl/plperl/SPI.xs
@@ -55,17 +55,25 @@ elog_elog(level, message)
 	int level
 	char* message
 	CODE:
-	if (level > 0)
-		return;
-	else
-		elog(level, message);
+	elog(level, message);
 
 
 int
 elog_DEBUG()
 
 int
-elog_ERROR()
+elog_LOG()
+
+int
+elog_INFO()
 
 int
 elog_NOTICE()
+
+int
+elog_WARNING()
+
+int
+elog_ERROR()
+
+
diff --git a/src/pl/plperl/eloglvl.c b/src/pl/plperl/eloglvl.c
index 23289479cd..a0da01a2f0 100644
--- a/src/pl/plperl/eloglvl.c
+++ b/src/pl/plperl/eloglvl.c
@@ -12,14 +12,20 @@
 
 int
 elog_DEBUG(void)
+{
+	return DEBUG1;
+}
+
+int
+elog_LOG(void)
 {
 	return LOG;
 }
 
 int
-elog_ERROR(void)
+elog_INFO(void)
 {
-	return ERROR;
+	return INFO;
 }
 
 int
@@ -27,3 +33,16 @@ elog_NOTICE(void)
 {
 	return NOTICE;
 }
+
+int
+elog_WARNING(void)
+{
+	return WARNING;
+}
+
+int
+elog_ERROR(void)
+{
+	return ERROR;
+}
+
diff --git a/src/pl/plperl/eloglvl.h b/src/pl/plperl/eloglvl.h
index c07cd5b5d4..742b5e6434 100644
--- a/src/pl/plperl/eloglvl.h
+++ b/src/pl/plperl/eloglvl.h
@@ -1,8 +1,13 @@
 
-int
-			elog_DEBUG(void);
+int	elog_DEBUG(void);
 
-int
-			elog_ERROR(void);
+int	elog_LOG(void);
+
+int	elog_INFO(void);
+
+int	elog_NOTICE(void);
+
+int	elog_WARNING(void);
+
+int	elog_ERROR(void);
 
-int			elog_NOTICE(void);
diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c
index c6d5875b7e..5ba80b7b32 100644
--- a/src/pl/plperl/plperl.c
+++ b/src/pl/plperl/plperl.c
@@ -33,7 +33,7 @@
  *	  ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/pl/plperl/plperl.c,v 1.28 2002/01/24 21:40:44 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/pl/plperl/plperl.c,v 1.29 2002/03/06 18:50:26 momjian Exp $
  *
  **********************************************************************/
 
@@ -210,7 +210,7 @@ plperl_init_interp(void)
 		 */
 		"require Safe; SPI::bootstrap();"
 		"sub ::mksafefunc { my $x = new Safe; $x->permit_only(':default');$x->permit(':base_math');"
-		"$x->share(qw[&elog &DEBUG &NOTICE &ERROR]);"
+		"$x->share(qw[&elog &DEBUG &LOG &INFO &NOTICE &WARNING &ERROR]);"
 		" return $x->reval(qq[sub { $_[0] }]); }"
 		"sub ::mkunsafefunc {return eval(qq[ sub { $_[0] } ]); }"
 	};
diff --git a/src/pl/plpgsql/src/gram.y b/src/pl/plpgsql/src/gram.y
index 38544b2108..a1433a9022 100644
--- a/src/pl/plpgsql/src/gram.y
+++ b/src/pl/plpgsql/src/gram.y
@@ -4,7 +4,7 @@
  *						  procedural language
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.30 2002/03/02 21:39:35 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.31 2002/03/06 18:50:29 momjian Exp $
  *
  *	  This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -161,8 +161,10 @@ static	PLpgSQL_expr	*make_tupret_expr(PLpgSQL_row *row);
 %token	K_GET
 %token	K_IF
 %token	K_IN
+%token	K_INFO
 %token	K_INTO
 %token	K_IS
+%token	K_LOG
 %token	K_LOOP
 %token	K_NOT
 %token	K_NOTICE
@@ -180,6 +182,7 @@ static	PLpgSQL_expr	*make_tupret_expr(PLpgSQL_row *row);
 %token	K_THEN
 %token	K_TO
 %token	K_TYPE
+%token	K_WARNING
 %token	K_WHEN
 %token	K_WHILE
 
@@ -1201,10 +1204,22 @@ raise_level		: K_EXCEPTION
 					{
 						$$ = ERROR;
 					}
+				| K_WARNING
+					{
+						$$ = WARNING;
+					}
 				| K_NOTICE
 					{
 						$$ = NOTICE;
 					}
+				| K_INFO
+					{
+						$$ = INFO;
+					}
+				| K_LOG
+					{
+						$$ = LOG;
+					}
 				| K_DEBUG
 					{
 						$$ = DEBUG5;
diff --git a/src/pl/plpgsql/src/scan.l b/src/pl/plpgsql/src/scan.l
index 49191fa106..a9f6997500 100644
--- a/src/pl/plpgsql/src/scan.l
+++ b/src/pl/plpgsql/src/scan.l
@@ -4,7 +4,7 @@
  *			  procedural language
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.16 2001/10/09 15:59:56 tgl Exp $
+ *    $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.17 2002/03/06 18:50:29 momjian Exp $
  *
  *    This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -117,8 +117,10 @@ from			{ return K_FROM;			}
 get				{ return K_GET;				}
 if				{ return K_IF;				}
 in				{ return K_IN;				}
+info			{ return K_INFO;			}
 into			{ return K_INTO;			}
 is				{ return K_IS;				}
+log				{ return K_LOG;				}
 loop			{ return K_LOOP;			}
 not				{ return K_NOT;				}
 notice			{ return K_NOTICE;			}
@@ -136,6 +138,7 @@ select			{ return K_SELECT;			}
 then			{ return K_THEN;			}
 to				{ return K_TO;				}
 type			{ return K_TYPE;			}
+warning			{ return K_WARNING;			}
 when			{ return K_WHEN;			}
 while			{ return K_WHILE;			}
 
diff --git a/src/pl/plpython/error.expected b/src/pl/plpython/error.expected
index 96de5da660..9f0eff0762 100644
--- a/src/pl/plpython/error.expected
+++ b/src/pl/plpython/error.expected
@@ -1,11 +1,11 @@
 SELECT invalid_type_uncaught('rick');
-NOTICE:  plpython: in function __plpython_procedure_invalid_type_uncaught_49801:
+WARNING:  plpython: in function __plpython_procedure_invalid_type_uncaught_49801:
 plpy.SPIError: Cache lookup for type `test' failed.
 SELECT invalid_type_caught('rick');
-NOTICE:  plpython: in function __plpython_procedure_invalid_type_caught_49802:
+WARNING:  plpython: in function __plpython_procedure_invalid_type_caught_49802:
 plpy.SPIError: Cache lookup for type `test' failed.
 SELECT invalid_type_reraised('rick');
-NOTICE:  plpython: in function __plpython_procedure_invalid_type_reraised_49803:
+WARNING:  plpython: in function __plpython_procedure_invalid_type_reraised_49803:
 plpy.SPIError: Cache lookup for type `test' failed.
 SELECT valid_type('rick');
  valid_type 
diff --git a/src/pl/plpython/feature.expected b/src/pl/plpython/feature.expected
index b689c1f615..9afd782e7d 100644
--- a/src/pl/plpython/feature.expected
+++ b/src/pl/plpython/feature.expected
@@ -29,7 +29,7 @@ SELECT global_test_two();
 (1 row)
 
 SELECT import_fail();
-NOTICE:  ('import socket failed -- untrusted dynamic module: _socket',)
+WARNING:  ('import socket failed -- untrusted dynamic module: _socket',)
     import_fail     
 --------------------
  failed as expected
diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c
index c0858076f6..e56f9254cf 100644
--- a/src/pl/plpython/plpython.c
+++ b/src/pl/plpython/plpython.c
@@ -29,7 +29,7 @@
  * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *	$Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.15 2002/03/06 06:10:47 momjian Exp $
+ *	$Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.16 2002/03/06 18:50:32 momjian Exp $
  *
  *********************************************************************
  */
@@ -1658,9 +1658,12 @@ PLyDict_FromTuple(PLyTypeInfo * info, HeapTuple tuple, TupleDesc desc)
 /* interface to postgresql elog
  */
 static PyObject *PLy_debug(PyObject *, PyObject *);
+static PyObject *PLy_log(PyObject *, PyObject *);
+static PyObject *PLy_info(PyObject *, PyObject *);
+static PyObject *PLy_notice(PyObject *, PyObject *);
+static PyObject *PLy_warning(PyObject *, PyObject *);
 static PyObject *PLy_error(PyObject *, PyObject *);
 static PyObject *PLy_fatal(PyObject *, PyObject *);
-static PyObject *PLy_notice(PyObject *, PyObject *);
 
 /* PLyPlanObject, PLyResultObject and SPI interface
  */
@@ -1782,9 +1785,12 @@ static PyMethodDef PLy_methods[] = {
 	 * logging methods
 	 */
 	{"debug", PLy_debug, METH_VARARGS, NULL},
+	{"log", PLy_log, METH_VARARGS, NULL},
+	{"info", PLy_info, METH_VARARGS, NULL},
+	{"notice", PLy_notice, METH_VARARGS, NULL},
+	{"warning", PLy_warning, METH_VARARGS, NULL},
 	{"error", PLy_error, METH_VARARGS, NULL},
 	{"fatal", PLy_fatal, METH_VARARGS, NULL},
-	{"notice", PLy_notice, METH_VARARGS, NULL},
 
 	/*
 	 * create a stored plan
@@ -2627,35 +2633,53 @@ populate_methods(PyObject *klass, PyMethodDef *methods)
 /* the python interface to the elog function
  * don't confuse these with PLy_elog
  */
-static PyObject *PLy_log(int, PyObject *, PyObject *);
+static PyObject *PLy_output(int, PyObject *, PyObject *);
 
 PyObject *
 PLy_debug(PyObject * self, PyObject * args)
 {
-	return PLy_log(LOG, self, args);
+	return PLy_output(DEBUG1, self, args);
 }
 
 PyObject *
-PLy_error(PyObject * self, PyObject * args)
+PLy_log(PyObject * self, PyObject * args)
 {
-	return PLy_log(ERROR, self, args);
+	return PLy_output(LOG, self, args);
 }
 
 PyObject *
-PLy_fatal(PyObject * self, PyObject * args)
+PLy_info(PyObject * self, PyObject * args)
 {
-	return PLy_log(FATAL, self, args);
+	return PLy_output(INFO, self, args);
 }
 
 PyObject *
 PLy_notice(PyObject * self, PyObject * args)
 {
-	return PLy_log(NOTICE, self, args);
+	return PLy_output(NOTICE, self, args);
+}
+
+PyObject *
+PLy_warning(PyObject * self, PyObject * args)
+{
+	return PLy_output(WARNING, self, args);
+}
+
+PyObject *
+PLy_error(PyObject * self, PyObject * args)
+{
+	return PLy_output(ERROR, self, args);
+}
+
+PyObject *
+PLy_fatal(PyObject * self, PyObject * args)
+{
+	return PLy_output(FATAL, self, args);
 }
 
 
 PyObject *
-PLy_log(volatile int level, PyObject * self, PyObject * args)
+PLy_output(volatile int level, PyObject * self, PyObject * args)
 {
 	DECLARE_EXC();
 	PyObject   *so;
diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c
index ebc7b8fb88..34bc731e9a 100644
--- a/src/pl/tcl/pltcl.c
+++ b/src/pl/tcl/pltcl.c
@@ -31,7 +31,7 @@
  *	  ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.51 2002/03/06 06:10:48 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.52 2002/03/06 18:50:33 momjian Exp $
  *
  **********************************************************************/
 
@@ -1259,7 +1259,11 @@ pltcl_elog(ClientData cdata, Tcl_Interp *interp,
 		return TCL_ERROR;
 	}
 
-	if (strcmp(argv[1], "INFO") == 0)
+	if (strcmp(argv[1], "DEBUG") == 0)
+		level = DEBUG1;
+	else if (strcmp(argv[1], "LOG") == 0)
+		level = LOG;
+	else if (strcmp(argv[1], "INFO") == 0)
 		level = INFO;
 	else if (strcmp(argv[1], "NOTICE") == 0)
 		level = NOTICE;
@@ -1269,8 +1273,6 @@ pltcl_elog(ClientData cdata, Tcl_Interp *interp,
 		level = ERROR;
 	else if (strcmp(argv[1], "FATAL") == 0)
 		level = FATAL;
-	else if (strcmp(argv[1], "DEBUG") == 0)
-		level = DEBUG1;
 	else
 	{
 		Tcl_AppendResult(interp, "Unknown elog level '", argv[1],
-- 
2.24.1