Error message editing in src/pl. The plpython module could use another
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 25 Jul 2003 23:37:31 +0000 (23:37 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 25 Jul 2003 23:37:31 +0000 (23:37 +0000)
look ... I'm not real certain which errors are strictly internal and which
are likely to be provoked by users.

src/pl/plperl/eloglvl.c
src/pl/plperl/plperl.c
src/pl/plpgsql/src/gram.y
src/pl/plpgsql/src/pl_comp.c
src/pl/plpgsql/src/pl_exec.c
src/pl/plpgsql/src/pl_funcs.c
src/pl/plpgsql/src/pl_handler.c
src/pl/plpgsql/src/scan.l
src/pl/plpython/plpython.c
src/pl/plpython/plpython.h
src/pl/tcl/pltcl.c

index bfa2e56e41d881685d8922e3c600f1ee2116e677..3baf0279017a50b577d88a9da01df21b42361cb6 100644 (file)
@@ -1,7 +1,5 @@
 #include "postgres.h"
 
-#include "utils/elog.h"
-
 /*
  * This kludge is necessary because of the conflicting
  * definitions of 'DEBUG' between postgres and perl.
index e4ad4102ac9b4d810d792afc040529f7a0364400..fcbe55c9c2e36a2b10c98253e418648ac917e6ab 100644 (file)
@@ -33,7 +33,7 @@
  *       ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/pl/plperl/plperl.c,v 1.36 2003/04/20 21:15:34 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/pl/plperl/plperl.c,v 1.37 2003/07/25 23:37:28 tgl Exp $
  *
  **********************************************************************/
 
@@ -47,7 +47,6 @@
 /* postgreSQL stuff */
 #include "executor/spi.h"
 #include "commands/trigger.h"
-#include "utils/elog.h"
 #include "fmgr.h"
 #include "access/heapam.h"
 #include "tcop/tcopprot.h"
@@ -193,7 +192,7 @@ plperl_init_interp(void)
 
        plperl_interp = perl_alloc();
        if (!plperl_interp)
-               elog(ERROR, "plperl_init_interp(): could not allocate perl interpreter");
+               elog(ERROR, "could not allocate perl interpreter");
 
        perl_construct(plperl_interp);
        perl_parse(plperl_interp, plperl_init_shared_libs, 3, embedding, NULL);
@@ -232,7 +231,7 @@ plperl_call_handler(PG_FUNCTION_ARGS)
         * Connect to SPI manager
         ************************************************************/
        if (SPI_connect() != SPI_OK_CONNECT)
-               elog(ERROR, "plperl: cannot connect to SPI manager");
+               elog(ERROR, "could not connect to SPI manager");
 
        /************************************************************
         * Determine if called as function or trigger and
@@ -240,7 +239,9 @@ plperl_call_handler(PG_FUNCTION_ARGS)
         ************************************************************/
        if (CALLED_AS_TRIGGER(fcinfo))
        {
-               elog(ERROR, "plperl: can't use perl in triggers yet.");
+               ereport(ERROR,
+                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                errmsg("cannot use perl in triggers yet")));
 
                /*
                 * retval = PointerGetDatum(plperl_trigger_handler(fcinfo));
@@ -286,7 +287,7 @@ plperl_create_sub(char *s, bool trusted)
                PUTBACK;
                FREETMPS;
                LEAVE;
-               elog(ERROR, "plperl: didn't get a return item from mksafefunc");
+               elog(ERROR, "didn't get a return item from mksafefunc");
        }
 
        if (SvTRUE(ERRSV))
@@ -314,7 +315,7 @@ plperl_create_sub(char *s, bool trusted)
                 * subref is our responsibility because it is not mortal
                 */
                SvREFCNT_dec(subref);
-               elog(ERROR, "plperl_create_sub: didn't get a code ref");
+               elog(ERROR, "didn't get a code ref");
        }
 
        PUTBACK;
@@ -406,7 +407,7 @@ plperl_call_perl_func(plperl_proc_desc * desc, FunctionCallInfo fcinfo)
                PUTBACK;
                FREETMPS;
                LEAVE;
-               elog(ERROR, "plperl: didn't get a return item from function");
+               elog(ERROR, "didn't get a return item from function");
        }
 
        if (SvTRUE(ERRSV))
@@ -415,7 +416,7 @@ plperl_call_perl_func(plperl_proc_desc * desc, FunctionCallInfo fcinfo)
                PUTBACK;
                FREETMPS;
                LEAVE;
-               elog(ERROR, "plperl: error from function: %s", SvPV(ERRSV, PL_na));
+               elog(ERROR, "error from function: %s", SvPV(ERRSV, PL_na));
        }
 
        retval = newSVsv(POPs);
@@ -453,7 +454,7 @@ plperl_func_handler(PG_FUNCTION_ARGS)
         * because SPI_finish would free it).
         ************************************************************/
        if (SPI_finish() != SPI_OK_FINISH)
-               elog(ERROR, "plperl: SPI_finish() failed");
+               elog(ERROR, "SPI_finish() failed");
 
        if (!(perlret && SvOK(perlret)))
        {
@@ -493,7 +494,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
                                                         ObjectIdGetDatum(fn_oid),
                                                         0, 0, 0);
        if (!HeapTupleIsValid(procTup))
-               elog(ERROR, "plperl: cache lookup for proc %u failed", fn_oid);
+               elog(ERROR, "cache lookup failed for function %u", fn_oid);
        procStruct = (Form_pg_proc) GETSTRUCT(procTup);
 
        /************************************************************
@@ -551,7 +552,9 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
                 ************************************************************/
                prodesc = (plperl_proc_desc *) malloc(sizeof(plperl_proc_desc));
                if (prodesc == NULL)
-                       elog(ERROR, "plperl: out of memory");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_OUT_OF_MEMORY),
+                                        errmsg("out of memory")));
                MemSet(prodesc, 0, sizeof(plperl_proc_desc));
                prodesc->proname = strdup(internal_proname);
                prodesc->fn_xmin = HeapTupleHeaderGetXmin(procTup->t_data);
@@ -567,7 +570,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
                {
                        free(prodesc->proname);
                        free(prodesc);
-                       elog(ERROR, "plperl: cache lookup for language %u failed",
+                       elog(ERROR, "cache lookup failed for language %u",
                                 procStruct->prolang);
                }
                langStruct = (Form_pg_language) GETSTRUCT(langTup);
@@ -587,7 +590,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
                        {
                                free(prodesc->proname);
                                free(prodesc);
-                               elog(ERROR, "plperl: cache lookup for return type %u failed",
+                               elog(ERROR, "cache lookup failed for type %u",
                                         procStruct->prorettype);
                        }
                        typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
@@ -601,16 +604,18 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
                                {
                                        free(prodesc->proname);
                                        free(prodesc);
-                                       elog(ERROR, "plperl functions cannot return type %s"
-                                                "\n\texcept when used as triggers",
-                                                format_type_be(procStruct->prorettype));
+                                       ereport(ERROR,
+                                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                        errmsg("trigger functions may only be called as triggers")));
                                }
                                else
                                {
                                        free(prodesc->proname);
                                        free(prodesc);
-                                       elog(ERROR, "plperl functions cannot return type %s",
-                                                format_type_be(procStruct->prorettype));
+                                       ereport(ERROR,
+                                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                        errmsg("plperl functions cannot return type %s",
+                                                                       format_type_be(procStruct->prorettype))));
                                }
                        }
 
@@ -618,7 +623,9 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
                        {
                                free(prodesc->proname);
                                free(prodesc);
-                               elog(ERROR, "plperl: return types of tuples not supported yet");
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                errmsg("plperl functions cannot return tuples yet")));
                        }
 
                        perm_fmgr_info(typeStruct->typinput, &(prodesc->result_in_func));
@@ -643,7 +650,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
                                {
                                        free(prodesc->proname);
                                        free(prodesc);
-                                       elog(ERROR, "plperl: cache lookup for argument type %u failed",
+                                       elog(ERROR, "cache lookup failed for type %u",
                                                 procStruct->proargtypes[i]);
                                }
                                typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
@@ -653,8 +660,10 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
                                {
                                        free(prodesc->proname);
                                        free(prodesc);
-                                       elog(ERROR, "plperl functions cannot take type %s",
-                                                format_type_be(procStruct->proargtypes[i]));
+                                       ereport(ERROR,
+                                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                        errmsg("plperl functions cannot take type %s",
+                                                                       format_type_be(procStruct->proargtypes[i]))));
                                }
 
                                if (typeStruct->typrelid != InvalidOid)
@@ -686,7 +695,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
                {
                        free(prodesc->proname);
                        free(prodesc);
-                       elog(ERROR, "plperl: cannot create internal procedure %s",
+                       elog(ERROR, "could not create internal procedure \"%s\"",
                                 internal_proname);
                }
 
@@ -751,8 +760,8 @@ plperl_build_tuple_argument(HeapTuple tuple, TupleDesc tupdesc)
                                                   ObjectIdGetDatum(tupdesc->attrs[i]->atttypid),
                                                                 0, 0, 0);
                if (!HeapTupleIsValid(typeTup))
-                       elog(ERROR, "plperl: Cache lookup for attribute '%s' type %u failed",
-                                attname, tupdesc->attrs[i]->atttypid);
+                       elog(ERROR, "cache lookup failed for type %u",
+                                tupdesc->attrs[i]->atttypid);
 
                typoutput = ((Form_pg_type) GETSTRUCT(typeTup))->typoutput;
                typelem = ((Form_pg_type) GETSTRUCT(typeTup))->typelem;
index 107946c336527739c4b3e0c7ba6015a40a0a22c6..8f0f76a4eab696db1a07766a8801c717d9be03f2 100644 (file)
@@ -4,7 +4,7 @@
  *                                               procedural language
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.44 2003/05/27 17:49:47 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.45 2003/07/25 23:37:28 tgl Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -340,11 +340,17 @@ decl_statement    : decl_varname decl_const decl_datatype decl_notnull decl_defval
                                                        row->lineno             = $1.lineno;
 
                                                        if ($2)
-                                                               elog(ERROR, "Rowtype variable cannot be CONSTANT");
+                                                               ereport(ERROR,
+                                                                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                                                errmsg("rowtype variable cannot be CONSTANT")));
                                                        if ($4)
-                                                               elog(ERROR, "Rowtype variable cannot be NOT NULL");
+                                                               ereport(ERROR,
+                                                                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                                                errmsg("rowtype variable cannot be NOT NULL")));
                                                        if ($5 != NULL)
-                                                               elog(ERROR, "Default value for rowtype variable is not supported");
+                                                               ereport(ERROR,
+                                                                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                                                errmsg("default value for rowtype variable is not supported")));
 
                                                        plpgsql_adddatum((PLpgSQL_datum *)row);
                                                        plpgsql_ns_additem(PLPGSQL_NSTYPE_ROW,
@@ -554,7 +560,10 @@ decl_aliasitem     : T_WORD
                                                if (nsi == NULL)
                                                {
                                                        plpgsql_error_lineno = plpgsql_scanner_lineno();
-                                                       elog(ERROR, "function has no parameter %s", name);
+                                                       ereport(ERROR,
+                                                                       (errcode(ERRCODE_UNDEFINED_PARAMETER),
+                                                                        errmsg("function has no parameter \"%s\"",
+                                                                                       name)));
                                                }
 
                                                plpgsql_ns_setlocal(true);
@@ -1087,7 +1096,8 @@ stmt_fors         : opt_label K_FOR lno fors_target K_IN K_SELECT expr_until_loop loop_
                                                                new->row = (PLpgSQL_row *)$4;
                                                                break;
                                                        default:
-                                                               elog(ERROR, "unknown dtype %d in stmt_fors", $4->dtype);
+                                                               elog(ERROR, "unrecognized dtype: %d",
+                                                                        $4->dtype);
                                                }
                                                new->query = $7;
                                                new->body  = $8;
@@ -1117,7 +1127,8 @@ stmt_dynfors : opt_label K_FOR lno fors_target K_IN K_EXECUTE expr_until_loop lo
                                                                new->row = (PLpgSQL_row *)$4;
                                                                break;
                                                        default:
-                                                               elog(ERROR, "unknown dtype %d in stmt_dynfors", $4->dtype);
+                                                               elog(ERROR, "unrecognized dtype: %d",
+                                                                        $4->dtype);
                                                }
                                                new->query = $7;
                                                new->body  = $8;
@@ -1375,7 +1386,11 @@ stmt_open                : K_OPEN lno cursor_varptr
                                                        if (tok != K_FOR)
                                                        {
                                                                plpgsql_error_lineno = $2;
-                                                               elog(ERROR, "syntax error at \"%s\" - expected FOR to open a reference cursor", yytext);
+                                                               ereport(ERROR,
+                                                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                                                                errmsg("syntax error at \"%s\"",
+                                                                                               yytext),
+                                                                                errdetail("Expected FOR to open a reference cursor.")));
                                                        }
 
                                                        tok = yylex();
@@ -1391,7 +1406,10 @@ stmt_open                : K_OPEN lno cursor_varptr
 
                                                                default:
                                                                        plpgsql_error_lineno = $2;
-                                                                       elog(ERROR, "syntax error at \"%s\"", yytext);
+                                                                       ereport(ERROR,
+                                                                                       (errcode(ERRCODE_SYNTAX_ERROR),
+                                                                                        errmsg("syntax error at \"%s\"",
+                                                                                                       yytext)));
                                                        }
 
                                                }
@@ -1406,8 +1424,10 @@ stmt_open                : K_OPEN lno cursor_varptr
                                                                if (tok != '(')
                                                                {
                                                                        plpgsql_error_lineno = plpgsql_scanner_lineno();
-                                                                       elog(ERROR, "cursor %s has arguments",
-                                                                                $3->refname);
+                                                                       ereport(ERROR,
+                                                                                       (errcode(ERRCODE_SYNTAX_ERROR),
+                                                                                        errmsg("cursor \"%s\" has arguments",
+                                                                                                       $3->refname)));
                                                                }
 
                                                                /*
@@ -1428,7 +1448,8 @@ stmt_open         : K_OPEN lno cursor_varptr
                                                                if (strncmp(cp, "SELECT", 6) != 0)
                                                                {
                                                                        plpgsql_error_lineno = plpgsql_scanner_lineno();
-                                                                       elog(ERROR, "expected 'SELECT (', got '%s' (internal error)",
+                                                                       /* internal error */
+                                                                       elog(ERROR, "expected \"SELECT (\", got \"%s\"",
                                                                                 new->argquery->query);
                                                                }
                                                                cp += 6;
@@ -1437,7 +1458,8 @@ stmt_open         : K_OPEN lno cursor_varptr
                                                                if (*cp != '(')
                                                                {
                                                                        plpgsql_error_lineno = plpgsql_scanner_lineno();
-                                                                       elog(ERROR, "expected 'SELECT (', got '%s' (internal error)",
+                                                                       /* internal error */
+                                                                       elog(ERROR, "expected \"SELECT (\", got \"%s\"",
                                                                                 new->argquery->query);
                                                                }
                                                                *cp = ' ';
@@ -1455,13 +1477,19 @@ stmt_open               : K_OPEN lno cursor_varptr
                                                                if (tok == '(')
                                                                {
                                                                        plpgsql_error_lineno = plpgsql_scanner_lineno();
-                                                                       elog(ERROR, "cursor %s has no arguments", $3->refname);
+                                                                       ereport(ERROR,
+                                                                                       (errcode(ERRCODE_SYNTAX_ERROR),
+                                                                                        errmsg("cursor \"%s\" has no arguments",
+                                                                                                       $3->refname)));
                                                                }
                                                                
                                                                if (tok != ';')
                                                                {
                                                                        plpgsql_error_lineno = plpgsql_scanner_lineno();
-                                                                       elog(ERROR, "syntax error at \"%s\"", yytext);
+                                                                       ereport(ERROR,
+                                                                                       (errcode(ERRCODE_SYNTAX_ERROR),
+                                                                                        errmsg("syntax error at \"%s\"",
+                                                                                                       yytext)));
                                                                }
                                                        }
                                                }
@@ -1503,8 +1531,10 @@ cursor_varptr    : T_VARIABLE
                                                if (((PLpgSQL_var *) yylval.variable)->datatype->typoid != REFCURSOROID)
                                                {
                                                        plpgsql_error_lineno = plpgsql_scanner_lineno();
-                                                       elog(ERROR, "%s must be of type cursor or refcursor",
-                                                                ((PLpgSQL_var *) yylval.variable)->refname);
+                                                       ereport(ERROR,
+                                                                       (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                                                        errmsg("\"%s\" must be of type cursor or refcursor",
+                                                                                       ((PLpgSQL_var *) yylval.variable)->refname)));
                                                }
                                                $$ = (PLpgSQL_var *) yylval.variable;
                                        }
@@ -1518,8 +1548,10 @@ cursor_variable  : T_VARIABLE
                                                if (((PLpgSQL_var *) yylval.variable)->datatype->typoid != REFCURSOROID)
                                                {
                                                        plpgsql_error_lineno = plpgsql_scanner_lineno();
-                                                       elog(ERROR, "%s must be of type refcursor",
-                                                                ((PLpgSQL_var *) yylval.variable)->refname);
+                                                       ereport(ERROR,
+                                                                       (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                                                        errmsg("\"%s\" must be of type refcursor",
+                                                                                       ((PLpgSQL_var *) yylval.variable)->refname)));
                                                }
                                                $$ = yylval.variable->dno;
                                        }
@@ -1632,7 +1664,9 @@ read_sql_construct(int until,
                {
                        parenlevel--;
                        if (parenlevel < 0)
-                               elog(ERROR, "mismatched parentheses");
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                                errmsg("mismatched parentheses")));
                }
                /*
                 * End of function definition is an error, and we don't expect to
@@ -1643,13 +1677,19 @@ read_sql_construct(int until,
                {
                        plpgsql_error_lineno = lno;
                        if (parenlevel != 0)
-                               elog(ERROR, "mismatched parentheses");
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                                errmsg("mismatched parentheses")));
                        if (isexpression)
-                               elog(ERROR, "missing %s at end of SQL expression",
-                                        expected);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                                errmsg("missing \"%s\" at end of SQL expression",
+                                                               expected)));
                        else
-                               elog(ERROR, "missing %s at end of SQL statement",
-                                        expected);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                                errmsg("missing \"%s\" at end of SQL statement",
+                                                               expected)));
                        break;
                }
                if (plpgsql_SpaceScanned)
@@ -1709,8 +1749,12 @@ read_datatype(int tok)
                {
                        plpgsql_error_lineno = lno;
                        if (parenlevel != 0)
-                               elog(ERROR, "mismatched parentheses");
-                       elog(ERROR, "incomplete datatype declaration");
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                                errmsg("mismatched parentheses")));
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_SYNTAX_ERROR),
+                                        errmsg("incomplete datatype declaration")));
                }
                /* Possible followers for datatype in a declaration */
                if (tok == K_NOT || tok == K_ASSIGN || tok == K_DEFAULT)
@@ -1769,14 +1813,18 @@ make_select_stmt(void)
                if (tok == 0)
                {
                        plpgsql_error_lineno = plpgsql_scanner_lineno();
-                       elog(ERROR, "unexpected end of file");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_SYNTAX_ERROR),
+                                        errmsg("unexpected end of function definition")));
                }
                if (tok == K_INTO)
                {
                        if (have_into)
                        {
                                plpgsql_error_lineno = plpgsql_scanner_lineno();
-                               elog(ERROR, "INTO specified more than once");
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                                errmsg("INTO specified more than once")));
                        }
                        tok = yylex();
                        switch (tok)
@@ -1814,8 +1862,10 @@ make_select_stmt(void)
 
                                                        default:
                                                                plpgsql_error_lineno = plpgsql_scanner_lineno();
-                                                               elog(ERROR, "plpgsql: %s is not a variable",
-                                                                        yytext);
+                                                               ereport(ERROR,
+                                                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                                                                errmsg("\"%s\" is not a variable",
+                                                                                               yytext)));
                                                }
                                        }
                                        have_nexttok = 1;
@@ -1945,8 +1995,10 @@ make_fetch_stmt(void)
 
                                                default:
                                                        plpgsql_error_lineno = plpgsql_scanner_lineno();
-                                                       elog(ERROR, "plpgsql: %s is not a variable",
-                                                                yytext);
+                                                       ereport(ERROR,
+                                                                       (errcode(ERRCODE_SYNTAX_ERROR),
+                                                                        errmsg("\"%s\" is not a variable",
+                                                                                       yytext)));
                                        }
                                }
                                have_nexttok = 1;
@@ -2028,8 +2080,10 @@ check_assignable(PLpgSQL_datum *datum)
                        if (((PLpgSQL_var *) datum)->isconst)
                        {
                                plpgsql_error_lineno = plpgsql_scanner_lineno();
-                               elog(ERROR, "%s is declared CONSTANT",
-                                        ((PLpgSQL_var *) datum)->refname);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_ERROR_IN_ASSIGNMENT),
+                                                errmsg("\"%s\" is declared CONSTANT",
+                                                               ((PLpgSQL_var *) datum)->refname)));
                        }
                        break;
                case PLPGSQL_DTYPE_RECFIELD:
index b9867dd6dbf3a4fe00b7f744ffa48023285aad63..1a84cdfd667bcd3a00367a3f8cf4246e32c76e6b 100644 (file)
@@ -3,7 +3,7 @@
  *                       procedural language
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.59 2003/07/01 21:47:09 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.60 2003/07/25 23:37:28 tgl Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -154,7 +154,7 @@ plpgsql_compile(FunctionCallInfo fcinfo)
                                                         ObjectIdGetDatum(funcOid),
                                                         0, 0, 0);
        if (!HeapTupleIsValid(procTup))
-               elog(ERROR, "plpgsql: cache lookup for proc %u failed", funcOid);
+               elog(ERROR, "cache lookup failed for function %u", funcOid);
        procStruct = (Form_pg_proc) GETSTRUCT(procTup);
 
        /*
@@ -301,15 +301,21 @@ do_compile(FunctionCallInfo fcinfo,
                         * Check for a polymorphic returntype. If found, use the actual
                         * returntype type from the caller's FuncExpr node, if we
                         * have one.
+                        *
+                        * Note: errcode is FEATURE_NOT_SUPPORTED because it should always
+                        * work; if it doesn't we're in some context that fails to make
+                        * the info available.
                         */
                        rettypeid = procStruct->prorettype;
                        if (rettypeid == ANYARRAYOID || rettypeid == ANYELEMENTOID)
                        {
                                rettypeid = get_fn_expr_rettype(fcinfo->flinfo);
                                if (!OidIsValid(rettypeid))
-                                       elog(ERROR, "could not determine actual return type "
-                                                "for polymorphic function %s",
-                                                plpgsql_error_funcname);
+                                       ereport(ERROR,
+                                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                        errmsg("could not determine actual return type "
+                                                                       "for polymorphic function \"%s\"",
+                                                                       plpgsql_error_funcname)));
                        }
 
                        /*
@@ -325,8 +331,7 @@ do_compile(FunctionCallInfo fcinfo,
                                                                         ObjectIdGetDatum(rettypeid),
                                                                         0, 0, 0);
                        if (!HeapTupleIsValid(typeTup))
-                               elog(ERROR, "cache lookup for return type %u failed",
-                                        rettypeid);
+                               elog(ERROR, "cache lookup failed for type %u", rettypeid);
                        typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
 
                        /* Disallow pseudotype result, except VOID or RECORD */
@@ -337,12 +342,14 @@ do_compile(FunctionCallInfo fcinfo,
                                        rettypeid == RECORDOID)
                                        /* okay */ ;
                                else if (rettypeid == TRIGGEROID)
-                                       elog(ERROR, "plpgsql functions cannot return type %s"
-                                                "\n\texcept when used as triggers",
-                                                format_type_be(rettypeid));
+                                       ereport(ERROR,
+                                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                        errmsg("trigger functions may only be called as triggers")));
                                else
-                                       elog(ERROR, "plpgsql functions cannot return type %s",
-                                                format_type_be(rettypeid));
+                                       ereport(ERROR,
+                                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                        errmsg("plpgsql functions cannot return type %s",
+                                                                       format_type_be(rettypeid))));
                        }
 
                        if (typeStruct->typrelid != InvalidOid ||
@@ -382,15 +389,16 @@ do_compile(FunctionCallInfo fcinfo,
                                                                                 ObjectIdGetDatum(argtypeid),
                                                                                 0, 0, 0);
                                if (!HeapTupleIsValid(typeTup))
-                                       elog(ERROR, "cache lookup for argument type %u failed",
-                                                argtypeid);
+                                       elog(ERROR, "cache lookup failed for type %u", argtypeid);
                                typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
 
                                /* Disallow pseudotype argument */
                                /* (note we already replaced ANYARRAY/ANYELEMENT) */
                                if (typeStruct->typtype == 'p')
-                                       elog(ERROR, "plpgsql functions cannot take type %s",
-                                                format_type_be(argtypeid));
+                                       ereport(ERROR,
+                                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                        errmsg("plpgsql functions cannot take type %s",
+                                                                       format_type_be(argtypeid))));
 
                                if (typeStruct->typrelid != InvalidOid)
                                {
@@ -601,8 +609,7 @@ do_compile(FunctionCallInfo fcinfo,
                        break;
 
                default:
-                       elog(ERROR, "unknown function type %u in plpgsql_compile()",
-                                functype);
+                       elog(ERROR, "unrecognized function typecode: %u", functype);
                        break;
        }
 
@@ -634,7 +641,7 @@ do_compile(FunctionCallInfo fcinfo,
         */
        parse_rc = plpgsql_yyparse();
        if (parse_rc != 0)
-               elog(ERROR, "plpgsql: parser returned %d ???", parse_rc);
+               elog(ERROR, "plpgsql parser returned %d", parse_rc);
 
        plpgsql_scanner_finish();
 
@@ -864,8 +871,10 @@ plpgsql_parse_dblword(char *word)
                                                return T_VARIABLE;
                                        }
                                }
-                               elog(ERROR, "row %s doesn't have a field %s",
-                                        cp[0], cp[1]);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_UNDEFINED_COLUMN),
+                                                errmsg("row \"%s\" has no field \"%s\"",
+                                                               cp[0], cp[1])));
                        }
 
                default:
@@ -969,8 +978,10 @@ plpgsql_parse_tripword(char *word)
                                                return T_VARIABLE;
                                        }
                                }
-                               elog(ERROR, "row %s.%s doesn't have a field %s",
-                                        cp[0], cp[1], cp[2]);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_UNDEFINED_COLUMN),
+                                                errmsg("row \"%s.%s\" has no field \"%s\"",
+                                                               cp[0], cp[1], cp[2])));
                        }
 
                default:
@@ -1188,8 +1199,7 @@ plpgsql_parse_dblwordtype(char *word)
                                                         ObjectIdGetDatum(attrStruct->atttypid),
                                                         0, 0, 0);
        if (!HeapTupleIsValid(typetup))
-               elog(ERROR, "cache lookup for type %u of %s.%s failed",
-                        attrStruct->atttypid, cp[0], cp[1]);
+               elog(ERROR, "cache lookup failed for type %u", attrStruct->atttypid);
 
        /*
         * Found that - build a compiler type struct and return it
@@ -1300,8 +1310,7 @@ plpgsql_parse_tripwordtype(char *word)
                                                         ObjectIdGetDatum(attrStruct->atttypid),
                                                         0, 0, 0);
        if (!HeapTupleIsValid(typetup))
-               elog(ERROR, "cache lookup for type %u of %s.%s failed",
-                        attrStruct->atttypid, cp[0], cp[1]);
+               elog(ERROR, "cache lookup failed for type %u", attrStruct->atttypid);
 
        /*
         * Found that - build a compiler type struct and return it
@@ -1339,7 +1348,9 @@ plpgsql_parse_wordrowtype(char *word)
        /* Lookup the relation */
        classOid = RelnameGetRelid(cp[0]);
        if (!OidIsValid(classOid))
-               elog(ERROR, "%s: no such class", cp[0]);
+               ereport(ERROR,
+                               (errcode(ERRCODE_UNDEFINED_TABLE),
+                                errmsg("relation \"%s\" does not exist", cp[0])));
 
        /*
         * Build and return the complete row definition
@@ -1380,7 +1391,9 @@ plpgsql_parse_dblwordrowtype(char *word)
        relvar = makeRangeVarFromNameList(stringToQualifiedNameList(cp, "plpgsql_parse_dblwordrowtype"));
        classOid = RangeVarGetRelid(relvar, true);
        if (!OidIsValid(classOid))
-               elog(ERROR, "%s: no such class", cp);
+               ereport(ERROR,
+                               (errcode(ERRCODE_UNDEFINED_TABLE),
+                                errmsg("relation \"%s\" does not exist", cp)));
 
        /*
         * Build and return the complete row definition
@@ -1420,7 +1433,9 @@ plpgsql_build_rowtype(Oid classOid)
                classStruct->relkind != RELKIND_SEQUENCE &&
                classStruct->relkind != RELKIND_VIEW &&
                classStruct->relkind != RELKIND_COMPOSITE_TYPE)
-               elog(ERROR, "%s isn't a table", relname);
+               ereport(ERROR,
+                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                                errmsg("relation \"%s\" is not a table", relname)));
 
        /*
         * Create a row datum entry and all the required variables that it
@@ -1451,8 +1466,8 @@ plpgsql_build_rowtype(Oid classOid)
                                                                 Int16GetDatum(i + 1),
                                                                 0, 0);
                if (!HeapTupleIsValid(attrtup))
-                       elog(ERROR, "cache lookup for attribute %d of class %s failed",
-                                i + 1, relname);
+                       elog(ERROR, "cache lookup failed for attribute %d of relation %u",
+                                i + 1, classOid);
                attrStruct = (Form_pg_attribute) GETSTRUCT(attrtup);
 
                attname = NameStr(attrStruct->attname);
@@ -1461,8 +1476,8 @@ plpgsql_build_rowtype(Oid classOid)
                                                                 ObjectIdGetDatum(attrStruct->atttypid),
                                                                 0, 0, 0);
                if (!HeapTupleIsValid(typetup))
-                       elog(ERROR, "cache lookup for type %u of %s.%s failed",
-                                attrStruct->atttypid, relname, attname);
+                       elog(ERROR, "cache lookup failed for type %u",
+                                attrStruct->atttypid);
 
                /*
                 * Create the internal variable
@@ -1639,7 +1654,10 @@ void
 plpgsql_yyerror(const char *s)
 {
        plpgsql_error_lineno = plpgsql_scanner_lineno();
-       elog(ERROR, "%s at or near \"%s\"", s, plpgsql_yytext);
+       ereport(ERROR,
+                       (errcode(ERRCODE_SYNTAX_ERROR),
+                        /* translator: first %s is a phrase like "syntax error" */
+                        errmsg("%s at or near \"%s\"", s, plpgsql_yytext)));
 }
 
 
@@ -1678,9 +1696,11 @@ compute_function_hashkey(FmgrInfo *flinfo,
                {
                        argtypeid = get_fn_expr_argtype(flinfo, i);
                        if (!OidIsValid(argtypeid))
-                               elog(ERROR, "could not determine actual argument "
-                                        "type for polymorphic function %s",
-                                        NameStr(procStruct->proname));
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                errmsg("could not determine actual argument "
+                                                               "type for polymorphic function \"%s\"",
+                                                               NameStr(procStruct->proname))));
                }
 
                hashkey->argtypes[i] = argtypeid;
@@ -1729,9 +1749,11 @@ plpgsql_HashTableInsert(PLpgSQL_function *function,
                                                                                        HASH_ENTER,
                                                                                        &found);
        if (hentry == NULL)
-               elog(ERROR, "out of memory in plpgsql_HashTable");
+               ereport(ERROR,
+                               (errcode(ERRCODE_OUT_OF_MEMORY),
+                                errmsg("out of memory")));
        if (found)
-               elog(WARNING, "trying to insert a function that exists");
+               elog(WARNING, "trying to insert a function that already exists");
 
        hentry->function = function;
        /* prepare back link from function to hashtable key */
index 54f2b3a88037bc29e756fb44c2cdbf3439a69d2e..dfa508a94a06a0b51a0f068c210a3eeec8fa7238 100644 (file)
@@ -3,7 +3,7 @@
  *                       procedural language
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.87 2003/06/29 00:33:44 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.88 2003/07/25 23:37:28 tgl Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -212,8 +212,7 @@ plpgsql_exec_function(PLpgSQL_function * func, FunctionCallInfo fcinfo)
                                break;
 
                        default:
-                               elog(ERROR, "unknown dtype %d in plpgsql_exec_function()",
-                                        func->datums[i]->dtype);
+                               elog(ERROR, "unrecognized dtype: %d", func->datums[i]->dtype);
                }
        }
 
@@ -252,8 +251,7 @@ plpgsql_exec_function(PLpgSQL_function * func, FunctionCallInfo fcinfo)
                                break;
 
                        default:
-                               elog(ERROR, "unknown dtype %d in plpgsql_exec_function()",
-                                        func->datums[i]->dtype);
+                               elog(ERROR, "unrecognized dtype: %d", func->datums[i]->dtype);
                }
        }
 
@@ -283,8 +281,7 @@ plpgsql_exec_function(PLpgSQL_function * func, FunctionCallInfo fcinfo)
                                break;
 
                        default:
-                               elog(ERROR, "unknown dtype %d in plpgsql_exec_function()",
-                                        func->datums[i]->dtype);
+                               elog(ERROR, "unrecognized dtype: %d", func->datums[i]->dtype);
                }
        }
 
@@ -302,7 +299,9 @@ plpgsql_exec_function(PLpgSQL_function * func, FunctionCallInfo fcinfo)
        {
                estate.err_stmt = NULL;
                estate.err_text = "at END of toplevel PL block";
-               elog(ERROR, "control reaches end of function without RETURN");
+               ereport(ERROR,
+                               (errcode(ERRCODE_S_R_E_FUNCTION_EXECUTED_NO_RETURN_STATEMENT),
+                                errmsg("control reached end of function without RETURN")));
        }
 
        /*
@@ -320,7 +319,9 @@ plpgsql_exec_function(PLpgSQL_function * func, FunctionCallInfo fcinfo)
                /* Check caller can handle a set result */
                if (!rsi || !IsA(rsi, ReturnSetInfo) ||
                        (rsi->allowedModes & SFRM_Materialize) == 0)
-                       elog(ERROR, "Set-valued function called in context that cannot accept a set");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                        errmsg("set-valued function called in context that cannot accept a set")));
                rsi->returnMode = SFRM_Materialize;
 
                /* If we produced any tuples, send back the result */
@@ -447,8 +448,7 @@ plpgsql_exec_trigger(PLpgSQL_function * func,
                                break;
 
                        default:
-                               elog(ERROR, "unknown dtype %d in plpgsql_exec_function()",
-                                        func->datums[i]->dtype);
+                               elog(ERROR, "unrecognized dtype: %d", func->datums[i]->dtype);
                }
        }
 
@@ -494,7 +494,7 @@ plpgsql_exec_trigger(PLpgSQL_function * func,
                rec_old->tupdesc = trigdata->tg_relation->rd_att;
        }
        else
-               elog(ERROR, "Unknown trigger action: not INSERT, DELETE, or UPDATE");
+               elog(ERROR, "unrecognized trigger action: not INSERT, DELETE, or UPDATE");
 
        /*
         * Assign the special tg_ variables
@@ -511,7 +511,7 @@ plpgsql_exec_trigger(PLpgSQL_function * func,
        else if (TRIGGER_FIRED_BY_DELETE(trigdata->tg_event))
                var->value = DirectFunctionCall1(textin, CStringGetDatum("DELETE"));
        else
-               elog(ERROR, "Unknown trigger action: not INSERT, DELETE, or UPDATE");
+               elog(ERROR, "unrecognized trigger action: not INSERT, DELETE, or UPDATE");
 
        var = (PLpgSQL_var *) (estate.datums[func->tg_name_varno]);
        var->isnull = false;
@@ -527,7 +527,7 @@ plpgsql_exec_trigger(PLpgSQL_function * func,
        else if (TRIGGER_FIRED_AFTER(trigdata->tg_event))
                var->value = DirectFunctionCall1(textin, CStringGetDatum("AFTER"));
        else
-               elog(ERROR, "Unknown trigger execution time: not BEFORE or AFTER");
+               elog(ERROR, "unrecognized trigger execution time: not BEFORE or AFTER");
 
        var = (PLpgSQL_var *) (estate.datums[func->tg_level_varno]);
        var->isnull = false;
@@ -537,7 +537,7 @@ plpgsql_exec_trigger(PLpgSQL_function * func,
        else if (TRIGGER_FIRED_FOR_STATEMENT(trigdata->tg_event))
                var->value = DirectFunctionCall1(textin, CStringGetDatum("STATEMENT"));
        else
-               elog(ERROR, "Unknown trigger event type: not ROW or STATEMENT");
+               elog(ERROR, "unrecognized trigger event type: not ROW or STATEMENT");
 
        var = (PLpgSQL_var *) (estate.datums[func->tg_relid_varno]);
        var->isnull = false;
@@ -598,8 +598,7 @@ plpgsql_exec_trigger(PLpgSQL_function * func,
                                break;
 
                        default:
-                               elog(ERROR, "unknown dtype %d in plpgsql_exec_trigger()",
-                                        func->datums[i]->dtype);
+                               elog(ERROR, "unrecognized dtype: %d", func->datums[i]->dtype);
                }
        }
 
@@ -617,11 +616,15 @@ plpgsql_exec_trigger(PLpgSQL_function * func,
        {
                estate.err_stmt = NULL;
                estate.err_text = "at END of toplevel PL block";
-               elog(ERROR, "control reaches end of trigger procedure without RETURN");
+               ereport(ERROR,
+                               (errcode(ERRCODE_S_R_E_FUNCTION_EXECUTED_NO_RETURN_STATEMENT),
+                                errmsg("control reached end of trigger procedure without RETURN")));
        }
 
        if (estate.retisset)
-               elog(ERROR, "trigger procedure cannot return a set");
+               ereport(ERROR,
+                               (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                errmsg("trigger procedure cannot return a set")));
 
        /*
         * Check that the returned tuple structure has the same attributes,
@@ -639,7 +642,9 @@ plpgsql_exec_trigger(PLpgSQL_function * func,
        {
                if (!compatible_tupdesc(estate.rettupdesc,
                                                                trigdata->tg_relation->rd_att))
-                       elog(ERROR, "returned tuple structure doesn't match table of trigger event");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                        errmsg("returned tuple structure does not match table of trigger event")));
                /* Copy tuple to upper executor memory */
                rettup = SPI_copytuple((HeapTuple) (estate.retval));
        }
@@ -758,7 +763,10 @@ exec_stmt_block(PLpgSQL_execstate * estate, PLpgSQL_stmt_block * block)
                                                        var->value = (Datum) 0;
                                                        var->isnull = true;
                                                        if (var->notnull)
-                                                               elog(ERROR, "variable '%s' declared NOT NULL cannot default to NULL", var->refname);
+                                                               ereport(ERROR,
+                                                                               (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+                                                                                errmsg("variable \"%s\" declared NOT NULL cannot default to NULL",
+                                                                                               var->refname)));
                                                }
                                                else
                                                {
@@ -790,7 +798,8 @@ exec_stmt_block(PLpgSQL_execstate * estate, PLpgSQL_stmt_block * block)
                                break;
 
                        default:
-                               elog(ERROR, "unknown dtype %d in exec_stmt_block()", estate->datums[n]->dtype);
+                               elog(ERROR, "unrecognized dtype: %d",
+                                        estate->datums[n]->dtype);
                }
 
        }
@@ -822,7 +831,7 @@ exec_stmt_block(PLpgSQL_execstate * estate, PLpgSQL_stmt_block * block)
                        return PLPGSQL_RC_RETURN;
 
                default:
-                       elog(ERROR, "unknown rc %d from exec_stmt()", rc);
+                       elog(ERROR, "unrecognized rc: %d", rc);
        }
 
        return PLPGSQL_RC_OK;
@@ -951,8 +960,7 @@ exec_stmt(PLpgSQL_execstate * estate, PLpgSQL_stmt * stmt)
 
                default:
                        estate->err_stmt = save_estmt;
-                       elog(ERROR, "unknown cmdtype %d in exec_stmt",
-                                stmt->cmd_type);
+                       elog(ERROR, "unrecognized cmdtype: %d", stmt->cmd_type);
        }
 
        estate->err_stmt = save_estmt;
@@ -996,7 +1004,9 @@ exec_stmt_perform(PLpgSQL_execstate * estate, PLpgSQL_stmt_perform * stmt)
 
        rc = exec_run_select(estate, expr, 0, NULL);
        if (rc != SPI_OK_SELECT)
-               elog(ERROR, "query \"%s\" didn't return data", expr->query);
+               ereport(ERROR,
+                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                                errmsg("query \"%s\" did not return data", expr->query)));
 
        exec_set_found(estate, (estate->eval_processed != 0));
 
@@ -1046,8 +1056,7 @@ exec_stmt_getdiag(PLpgSQL_execstate * estate, PLpgSQL_stmt_getdiag * stmt)
                                break;
 
                        default:
-
-                               elog(ERROR, "unknown attribute request %d in get_diagnostic",
+                               elog(ERROR, "unrecognized attribute request: %d",
                                         dtitem->item);
                }
        }
@@ -1119,7 +1128,7 @@ exec_stmt_loop(PLpgSQL_execstate * estate, PLpgSQL_stmt_loop * stmt)
                                return PLPGSQL_RC_RETURN;
 
                        default:
-                               elog(ERROR, "unknown rc %d from exec_stmts()", rc);
+                               elog(ERROR, "unrecognized rc: %d", rc);
                }
        }
 
@@ -1169,7 +1178,7 @@ exec_stmt_while(PLpgSQL_execstate * estate, PLpgSQL_stmt_while * stmt)
                                return PLPGSQL_RC_RETURN;
 
                        default:
-                               elog(ERROR, "unknown rc %d from exec_stmts()", rc);
+                               elog(ERROR, "unrecognized rc: %d", rc);
                }
        }
 
@@ -1204,7 +1213,9 @@ exec_stmt_fori(PLpgSQL_execstate * estate, PLpgSQL_stmt_fori * stmt)
                                                        var->datatype->typelem,
                                                        var->datatype->atttypmod, &isnull);
        if (isnull)
-               elog(ERROR, "lower bound of FOR loop cannot be NULL");
+               ereport(ERROR,
+                               (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+                                errmsg("lower bound of FOR loop cannot be NULL")));
        var->value = value;
        var->isnull = false;
        exec_eval_cleanup(estate);
@@ -1218,7 +1229,9 @@ exec_stmt_fori(PLpgSQL_execstate * estate, PLpgSQL_stmt_fori * stmt)
                                                        var->datatype->typelem,
                                                        var->datatype->atttypmod, &isnull);
        if (isnull)
-               elog(ERROR, "upper bound of FOR loop cannot be NULL");
+               ereport(ERROR,
+                               (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+                                errmsg("upper bound of FOR loop cannot be NULL")));
        exec_eval_cleanup(estate);
 
        /*
@@ -1319,7 +1332,7 @@ exec_stmt_fors(PLpgSQL_execstate * estate, PLpgSQL_stmt_fors * stmt)
        else if (stmt->row != NULL)
                row = (PLpgSQL_row *) (estate->datums[stmt->row->rowno]);
        else
-               elog(ERROR, "unsupported target in exec_stmt_fors()");
+               elog(ERROR, "unsupported target");
 
        /*
         * Open the implicit cursor for the statement and fetch the initial 10
@@ -1450,7 +1463,7 @@ exec_stmt_select(PLpgSQL_execstate * estate, PLpgSQL_stmt_select * stmt)
        else if (stmt->row != NULL)
                row = (PLpgSQL_row *) (estate->datums[stmt->row->rowno]);
        else
-               elog(ERROR, "unsupported target in exec_stmt_select()");
+               elog(ERROR, "unsupported target");
 
        /*
         * Run the query
@@ -1592,7 +1605,9 @@ exec_stmt_return_next(PLpgSQL_execstate * estate,
        bool            free_tuple = false;
 
        if (!estate->retisset)
-               elog(ERROR, "Cannot use RETURN NEXT in a non-SETOF function");
+               ereport(ERROR,
+                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                errmsg("cannot use RETURN NEXT in a non-SETOF function")));
 
        if (estate->tuple_store == NULL)
                exec_init_tuple_store(estate);
@@ -1606,9 +1621,15 @@ exec_stmt_return_next(PLpgSQL_execstate * estate,
                PLpgSQL_rec *rec = (PLpgSQL_rec *) (estate->datums[stmt->rec->recno]);
 
                if (!HeapTupleIsValid(rec->tup))
-                       elog(ERROR, "record \"%s\" is unassigned yet", rec->refname);
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+                                        errmsg("record \"%s\" is not assigned yet",
+                                                       rec->refname),
+                                        errdetail("The tuple structure of a not-yet-assigned record is indeterminate.")));
                if (!compatible_tupdesc(tupdesc, rec->tupdesc))
-                       elog(ERROR, "Wrong record type supplied in RETURN NEXT");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                        errmsg("wrong record type supplied in RETURN NEXT")));
                tuple = rec->tup;
        }
        else if (stmt->row)
@@ -1618,7 +1639,9 @@ exec_stmt_return_next(PLpgSQL_execstate * estate,
                int                     i;
 
                if (natts != stmt->row->nfields)
-                       elog(ERROR, "Wrong record type supplied in RETURN NEXT");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                        errmsg("wrong record type supplied in RETURN NEXT")));
 
                dvalues = (Datum *) palloc0(natts * sizeof(Datum));
                nulls = (char *) palloc(natts * sizeof(char));
@@ -1630,7 +1653,9 @@ exec_stmt_return_next(PLpgSQL_execstate * estate,
 
                        var = (PLpgSQL_var *) (estate->datums[stmt->row->varnos[i]]);
                        if (var->datatype->typoid != tupdesc->attrs[i]->atttypid)
-                               elog(ERROR, "Wrong record type supplied in RETURN NEXT");
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                                errmsg("wrong record type supplied in RETURN NEXT")));
                        dvalues[i] = var->value;
                        if (!var->isnull)
                                nulls[i] = ' ';
@@ -1650,7 +1675,9 @@ exec_stmt_return_next(PLpgSQL_execstate * estate,
                char            nullflag;
 
                if (natts != 1)
-                       elog(ERROR, "Wrong result type supplied in RETURN NEXT");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                        errmsg("wrong result type supplied in RETURN NEXT")));
 
                retval = exec_eval_expr(estate,
                                                                stmt->expr,
@@ -1674,7 +1701,9 @@ exec_stmt_return_next(PLpgSQL_execstate * estate,
        }
        else
        {
-               elog(ERROR, "Blank RETURN NEXT not allowed");
+               ereport(ERROR,
+                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                errmsg("RETURN NEXT must have a parameter")));
                tuple = NULL;                   /* keep compiler quiet */
        }
 
@@ -1705,7 +1734,9 @@ exec_init_tuple_store(PLpgSQL_execstate * estate)
        if (!rsi || !IsA(rsi, ReturnSetInfo) ||
                (rsi->allowedModes & SFRM_Materialize) == 0 ||
                rsi->expectedDesc == NULL)
-               elog(ERROR, "Set-valued function called in context that cannot accept a set");
+               ereport(ERROR,
+                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                errmsg("set-valued function called in context that cannot accept a set")));
 
        estate->tuple_store_cxt = rsi->econtext->ecxt_per_query_memory;
 
@@ -1717,8 +1748,7 @@ exec_init_tuple_store(PLpgSQL_execstate * estate)
 }
 
 /* ----------
- * exec_stmt_raise                     Build a message and throw it with
- *                                     elog()
+ * exec_stmt_raise                     Build a message and throw it with elog()
  * ----------
  */
 static int
@@ -1741,23 +1771,20 @@ exec_stmt_raise(PLpgSQL_execstate * estate, PLpgSQL_stmt_raise * stmt)
        for (cp = stmt->message; *cp; cp++)
        {
                /*
-                * Occurences of a single % are replaced by the next arguments
-                * external representation. Double %'s are left as is so elog()
-                * will also don't touch them.
+                * Occurences of a single % are replaced by the next argument's
+                * external representation. Double %'s are converted to one %.
                 */
                if ((c[0] = *cp) == '%')
                {
                        cp++;
                        if (*cp == '%')
                        {
-                               plpgsql_dstring_append(&ds, c);
                                plpgsql_dstring_append(&ds, c);
                                continue;
                        }
                        cp--;
                        if (pidx >= stmt->nparams)
                        {
-                               plpgsql_dstring_append(&ds, c);
                                plpgsql_dstring_append(&ds, c);
                                continue;
                        }
@@ -1774,7 +1801,7 @@ exec_stmt_raise(PLpgSQL_execstate * estate, PLpgSQL_stmt_raise * stmt)
                                                                                 ObjectIdGetDatum(paramtypeid),
                                                                                 0, 0, 0);
                                if (!HeapTupleIsValid(typetup))
-                                       elog(ERROR, "cache lookup for type %u failed",
+                                       elog(ERROR, "cache lookup failed for type %u",
                                                 paramtypeid);
                                typeStruct = (Form_pg_type) GETSTRUCT(typetup);
 
@@ -1792,7 +1819,9 @@ exec_stmt_raise(PLpgSQL_execstate * estate, PLpgSQL_stmt_raise * stmt)
 
                /*
                 * Occurrences of single ' are removed. double ' are reduced to
-                * single ones.
+                * single ones.  We must do this because the parameter stored
+                * by the grammar is the raw T_STRING input literal, rather than
+                * the de-lexed string as you might expect ...
                 */
                if (*cp == '\'')
                {
@@ -1998,8 +2027,10 @@ exec_stmt_execsql(PLpgSQL_execstate * estate,
                        break;
 
                case SPI_OK_SELECT:
-                       elog(ERROR, "SELECT query has no destination for result data."
-                                "\n\tIf you want to discard the results, use PERFORM instead.");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_SYNTAX_ERROR),
+                                        errmsg("SELECT query has no destination for result data"),
+                                        errhint("If you want to discard the results, use PERFORM instead.")));
 
                default:
                        elog(ERROR, "error executing query \"%s\"", expr->query);
@@ -2046,7 +2077,9 @@ exec_stmt_dynexecute(PLpgSQL_execstate * estate,
         */
        query = exec_eval_expr(estate, stmt->query, &isnull, &restype);
        if (isnull)
-               elog(ERROR, "cannot EXECUTE NULL query");
+               ereport(ERROR,
+                               (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+                                errmsg("cannot EXECUTE a null querystring")));
 
        /*
         * Get the C-String representation.
@@ -2055,7 +2088,7 @@ exec_stmt_dynexecute(PLpgSQL_execstate * estate,
                                                         ObjectIdGetDatum(restype),
                                                         0, 0, 0);
        if (!HeapTupleIsValid(typetup))
-               elog(ERROR, "cache lookup for type %u failed", restype);
+               elog(ERROR, "cache lookup failed for type %u", restype);
        typeStruct = (Form_pg_type) GETSTRUCT(typetup);
 
        fmgr_info(typeStruct->typoutput, &finfo_output);
@@ -2109,12 +2142,14 @@ exec_stmt_dynexecute(PLpgSQL_execstate * estate,
                                        if (!isspace((unsigned char) *ptr))
                                                break;
                                if (*ptr == 'S' || *ptr == 's')
-                                       elog(ERROR, "EXECUTE of SELECT ... INTO is not implemented yet");
+                                       ereport(ERROR,
+                                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                        errmsg("EXECUTE of SELECT ... INTO is not implemented yet")));
                                break;
                        }
 
                default:
-                       elog(ERROR, "unexpected error %d in EXECUTE of query '%s'",
+                       elog(ERROR, "unexpected error %d in EXECUTE of query \"%s\"",
                                 exec_res, querystr);
                        break;
        }
@@ -2166,7 +2201,7 @@ exec_stmt_dynfors(PLpgSQL_execstate * estate, PLpgSQL_stmt_dynfors * stmt)
        else if (stmt->row != NULL)
                row = (PLpgSQL_row *) (estate->datums[stmt->row->rowno]);
        else
-               elog(ERROR, "unsupported target in exec_stmt_dynfors()");
+               elog(ERROR, "unsupported target");
 
        /*
         * Evaluate the string expression after the EXECUTE keyword. It's
@@ -2174,7 +2209,9 @@ exec_stmt_dynfors(PLpgSQL_execstate * estate, PLpgSQL_stmt_dynfors * stmt)
         */
        query = exec_eval_expr(estate, stmt->query, &isnull, &restype);
        if (isnull)
-               elog(ERROR, "cannot EXECUTE NULL-query");
+               ereport(ERROR,
+                               (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+                                errmsg("cannot EXECUTE a null querystring")));
 
        /*
         * Get the C-String representation.
@@ -2183,7 +2220,7 @@ exec_stmt_dynfors(PLpgSQL_execstate * estate, PLpgSQL_stmt_dynfors * stmt)
                                                         ObjectIdGetDatum(restype),
                                                         0, 0, 0);
        if (!HeapTupleIsValid(typetup))
-               elog(ERROR, "cache lookup for type %u failed", restype);
+               elog(ERROR, "cache lookup failed for type %u", restype);
        typeStruct = (Form_pg_type) GETSTRUCT(typetup);
 
        fmgr_info(typeStruct->typoutput, &finfo_output);
@@ -2335,7 +2372,9 @@ exec_stmt_open(PLpgSQL_execstate * estate, PLpgSQL_stmt_open * stmt)
        {
                curname = DatumGetCString(DirectFunctionCall1(textout, curvar->value));
                if (SPI_cursor_find(curname) != NULL)
-                       elog(ERROR, "cursor \"%s\" already in use", curname);
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_DUPLICATE_CURSOR),
+                                        errmsg("cursor \"%s\" already in use", curname)));
        }
 
        /* ----------
@@ -2377,7 +2416,9 @@ exec_stmt_open(PLpgSQL_execstate * estate, PLpgSQL_stmt_open * stmt)
                 */
                queryD = exec_eval_expr(estate, stmt->dynquery, &isnull, &restype);
                if (isnull)
-                       elog(ERROR, "cannot EXECUTE NULL query");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+                                        errmsg("cannot EXECUTE a null querystring")));
 
                /* ----------
                 * Get the C-String representation.
@@ -2387,7 +2428,7 @@ exec_stmt_open(PLpgSQL_execstate * estate, PLpgSQL_stmt_open * stmt)
                                                                 ObjectIdGetDatum(restype),
                                                                 0, 0, 0);
                if (!HeapTupleIsValid(typetup))
-                       elog(ERROR, "cache lookup for type %u failed", restype);
+                       elog(ERROR, "cache lookup failed for type %u", restype);
                typeStruct = (Form_pg_type) GETSTRUCT(typetup);
 
                fmgr_info(typeStruct->typoutput, &finfo_output);
@@ -2409,7 +2450,7 @@ exec_stmt_open(PLpgSQL_execstate * estate, PLpgSQL_stmt_open * stmt)
                                 querystr);
                portal = SPI_cursor_open(curname, curplan, NULL, NULL);
                if (portal == NULL)
-                       elog(ERROR, "Failed to open cursor");
+                       elog(ERROR, "failed to open cursor");
                pfree(querystr);
                SPI_freeplan(curplan);
 
@@ -2446,7 +2487,9 @@ exec_stmt_open(PLpgSQL_execstate * estate, PLpgSQL_stmt_open * stmt)
                        PLpgSQL_stmt_select set_args;
 
                        if (curvar->cursor_explicit_argrow < 0)
-                               elog(ERROR, "arguments given for cursor without arguments");
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                                errmsg("arguments given for cursor without arguments")));
 
                        memset(&set_args, 0, sizeof(set_args));
                        set_args.cmd_type = PLPGSQL_STMT_SELECT;
@@ -2461,7 +2504,9 @@ exec_stmt_open(PLpgSQL_execstate * estate, PLpgSQL_stmt_open * stmt)
                else
                {
                        if (curvar->cursor_explicit_argrow >= 0)
-                               elog(ERROR, "arguments required for cursor");
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                                errmsg("arguments required for cursor")));
                }
 
                query = curvar->cursor_explicit_expr;
@@ -2498,7 +2543,7 @@ exec_stmt_open(PLpgSQL_execstate * estate, PLpgSQL_stmt_open * stmt)
         */
        portal = SPI_cursor_open(curname, query->plan, values, nulls);
        if (portal == NULL)
-               elog(ERROR, "Failed to open cursor");
+               elog(ERROR, "failed to open cursor");
 
        pfree(values);
        pfree(nulls);
@@ -2541,12 +2586,16 @@ exec_stmt_fetch(PLpgSQL_execstate * estate, PLpgSQL_stmt_fetch * stmt)
         */
        curvar = (PLpgSQL_var *) (estate->datums[stmt->curvar]);
        if (curvar->isnull)
-               elog(ERROR, "cursor variable \"%s\" is NULL", curvar->refname);
+               ereport(ERROR,
+                               (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+                                errmsg("cursor variable \"%s\" is NULL", curvar->refname)));
        curname = DatumGetCString(DirectFunctionCall1(textout, curvar->value));
 
        portal = SPI_cursor_find(curname);
        if (portal == NULL)
-               elog(ERROR, "cursor \"%s\" is invalid", curname);
+               ereport(ERROR,
+                               (errcode(ERRCODE_UNDEFINED_CURSOR),
+                                errmsg("cursor \"%s\" does not exist", curname)));
        pfree(curname);
 
        /* ----------
@@ -2558,7 +2607,7 @@ exec_stmt_fetch(PLpgSQL_execstate * estate, PLpgSQL_stmt_fetch * stmt)
        else if (stmt->row != NULL)
                row = (PLpgSQL_row *) (estate->datums[stmt->row->rowno]);
        else
-               elog(ERROR, "unsupported target in exec_stmt_fetch()");
+               elog(ERROR, "unsupported target");
 
        /* ----------
         * Fetch 1 tuple from the cursor
@@ -2606,12 +2655,16 @@ exec_stmt_close(PLpgSQL_execstate * estate, PLpgSQL_stmt_close * stmt)
         */
        curvar = (PLpgSQL_var *) (estate->datums[stmt->curvar]);
        if (curvar->isnull)
-               elog(ERROR, "cursor variable \"%s\" is NULL", curvar->refname);
+               ereport(ERROR,
+                               (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+                                errmsg("cursor variable \"%s\" is NULL", curvar->refname)));
        curname = DatumGetCString(DirectFunctionCall1(textout, curvar->value));
 
        portal = SPI_cursor_find(curname);
        if (portal == NULL)
-               elog(ERROR, "cursor \"%s\" is invalid", curname);
+               ereport(ERROR,
+                               (errcode(ERRCODE_UNDEFINED_CURSOR),
+                                errmsg("cursor \"%s\" does not exist", curname)));
        pfree(curname);
 
        /* ----------
@@ -2703,7 +2756,10 @@ exec_assign_value(PLpgSQL_execstate * estate,
                                                                           isNull);
 
                        if (*isNull && var->notnull)
-                               elog(ERROR, "NULL assignment to variable '%s' declared NOT NULL", var->refname);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+                                                errmsg("NULL cannot be assigned to variable \"%s\" declared NOT NULL",
+                                                               var->refname)));
 
                        /*
                         * If type is by-reference, make sure we have a freshly
@@ -2741,7 +2797,11 @@ exec_assign_value(PLpgSQL_execstate * estate,
                         * structure.
                         */
                        if (!HeapTupleIsValid(rec->tup))
-                               elog(ERROR, "record \"%s\" is unassigned yet - don't know its tuple structure", rec->refname);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+                                                errmsg("record \"%s\" is not assigned yet",
+                                                               rec->refname),
+                                                errdetail("The tuple structure of a not-yet-assigned record is indeterminate.")));
 
                        /*
                         * Get the number of the records field to change and the
@@ -2749,7 +2809,10 @@ exec_assign_value(PLpgSQL_execstate * estate,
                         */
                        fno = SPI_fnumber(rec->tupdesc, recfield->fieldname);
                        if (fno == SPI_ERROR_NOATTRIBUTE)
-                               elog(ERROR, "record \"%s\" has no field named \"%s\"", rec->refname, recfield->fieldname);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_UNDEFINED_COLUMN),
+                                                errmsg("record \"%s\" has no field \"%s\"",
+                                                               rec->refname, recfield->fieldname)));
                        fno--;
                        natts = rec->tupdesc->natts;
 
@@ -2835,7 +2898,10 @@ exec_assign_value(PLpgSQL_execstate * estate,
                                PLpgSQL_arrayelem *arrayelem = (PLpgSQL_arrayelem *) target;
 
                                if (nsubscripts >= MAXDIM)
-                                       elog(ERROR, "Too many subscripts");
+                                       ereport(ERROR,
+                                                       (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+                                                        errmsg("number of array dimensions exceeds the maximum allowed, %d",
+                                                                       MAXDIM)));
                                subscripts[nsubscripts++] = arrayelem->subscript;
                                target = estate->datums[arrayelem->arrayparentno];
                        } while (target->dtype == PLPGSQL_DTYPE_ARRAYELEM);
@@ -2846,7 +2912,9 @@ exec_assign_value(PLpgSQL_execstate * estate,
 
                        getTypeInputInfo(arraytypeid, &arrayInputFn, &arrayelemtypeid);
                        if (!OidIsValid(arrayelemtypeid))
-                               elog(ERROR, "Subscripted item is not an array");
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                                errmsg("subscripted object is not an array")));
 
                        /* Evaluate the subscripts, switch into left-to-right order */
                        havenullsubscript = false;
@@ -2916,8 +2984,7 @@ exec_assign_value(PLpgSQL_execstate * estate,
                        break;
 
                default:
-                       elog(ERROR, "unknown dtype %d in exec_assign_value()",
-                                target->dtype);
+                       elog(ERROR, "unrecognized dtype: %d", target->dtype);
        }
 }
 
@@ -2957,24 +3024,34 @@ exec_eval_datum(PLpgSQL_execstate *estate,
                        *value = var->value;
                        *isnull = var->isnull;
                        if (expectedtypeid != InvalidOid && expectedtypeid != *typeid)
-                               elog(ERROR, "type of %s doesn't match that when preparing the plan",
-                                        var->refname);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                                errmsg("type of \"%s\" does not match that when preparing the plan",
+                                                               var->refname)));
                        break;
 
                case PLPGSQL_DTYPE_RECFIELD:
                        recfield = (PLpgSQL_recfield *) datum;
                        rec = (PLpgSQL_rec *) (estate->datums[recfield->recparentno]);
                        if (!HeapTupleIsValid(rec->tup))
-                               elog(ERROR, "record \"%s\" is unassigned yet", rec->refname);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+                                                errmsg("record \"%s\" is not assigned yet",
+                                                               rec->refname),
+                                                errdetail("The tuple structure of a not-yet-assigned record is indeterminate.")));
                        fno = SPI_fnumber(rec->tupdesc, recfield->fieldname);
                        if (fno == SPI_ERROR_NOATTRIBUTE)
-                               elog(ERROR, "record \"%s\" has no field named \"%s\"",
-                                        rec->refname, recfield->fieldname);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_UNDEFINED_COLUMN),
+                                                errmsg("record \"%s\" has no field \"%s\"",
+                                                               rec->refname, recfield->fieldname)));
                        *typeid = SPI_gettypeid(rec->tupdesc, fno);
                        *value = SPI_getbinval(rec->tup, rec->tupdesc, fno, isnull);
                        if (expectedtypeid != InvalidOid && expectedtypeid != *typeid)
-                               elog(ERROR, "type of %s.%s doesn't match that when preparing the plan",
-                                        rec->refname, recfield->fieldname);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                                errmsg("type of \"%s.%s\" does not match that when preparing the plan",
+                                                               rec->refname, recfield->fieldname)));
                        break;
 
                case PLPGSQL_DTYPE_TRIGARG:
@@ -2992,13 +3069,14 @@ exec_eval_datum(PLpgSQL_execstate *estate,
                                *isnull = false;
                        }
                        if (expectedtypeid != InvalidOid && expectedtypeid != *typeid)
-                               elog(ERROR, "type of tgargv[%d] doesn't match that when preparing the plan",
-                                        tgargno);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                                errmsg("type of tgargv[%d] does not match that when preparing the plan",
+                                                               tgargno)));
                        break;
 
                default:
-                       elog(ERROR, "unknown datum dtype %d in exec_eval_datum()",
-                                datum->dtype);
+                       elog(ERROR, "unrecognized dtype: %d", datum->dtype);
        }
 }
 
@@ -3062,7 +3140,9 @@ exec_eval_expr(PLpgSQL_execstate * estate,
 
        rc = exec_run_select(estate, expr, 2, NULL);
        if (rc != SPI_OK_SELECT)
-               elog(ERROR, "query \"%s\" didn't return data", expr->query);
+               ereport(ERROR,
+                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                                errmsg("query \"%s\" did not return data", expr->query)));
 
        /*
         * If there are no rows selected, the result is NULL.
@@ -3077,10 +3157,15 @@ exec_eval_expr(PLpgSQL_execstate * estate,
         * Check that the expression returned one single Datum
         */
        if (estate->eval_processed > 1)
-               elog(ERROR, "query \"%s\" returned more than one row", expr->query);
+               ereport(ERROR,
+                               (errcode(ERRCODE_CARDINALITY_VIOLATION),
+                                errmsg("query \"%s\" returned more than one row",
+                                               expr->query)));
        if (estate->eval_tuptable->tupdesc->natts != 1)
-               elog(ERROR, "query \"%s\" returned %d columns", expr->query,
-                        estate->eval_tuptable->tupdesc->natts);
+               ereport(ERROR,
+                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                errmsg("query \"%s\" returned %d columns", expr->query,
+                                               estate->eval_tuptable->tupdesc->natts)));
 
        /*
         * Return the result and its type
@@ -3149,7 +3234,9 @@ exec_run_select(PLpgSQL_execstate * estate,
         */
        rc = SPI_execp(expr->plan, values, nulls, maxtuples);
        if (rc != SPI_OK_SELECT)
-               elog(ERROR, "query \"%s\" isn't a SELECT", expr->query);
+               ereport(ERROR,
+                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                errmsg("query \"%s\" is not a SELECT", expr->query)));
 
        /* Save query results for eventual cleanup */
        Assert(estate->eval_tuptable == NULL);
@@ -3356,7 +3443,7 @@ exec_move_row(PLpgSQL_execstate * estate,
                return;
        }
 
-       elog(ERROR, "unsupported target in exec_move_row()");
+       elog(ERROR, "unsupported target");
 }
 
 
@@ -3389,7 +3476,7 @@ exec_cast_value(Datum value, Oid valtype,
                                                                         ObjectIdGetDatum(valtype),
                                                                         0, 0, 0);
                        if (!HeapTupleIsValid(typetup))
-                               elog(ERROR, "cache lookup for type %u failed", valtype);
+                               elog(ERROR, "cache lookup failed for type %u", valtype);
                        typeStruct = (Form_pg_type) GETSTRUCT(typetup);
 
                        fmgr_info(typeStruct->typoutput, &finfo_output);
index b18f584f66593a89f2088c99a089b6f619f7aa02..632dd36e8158837bb7527493af5907a9f20cb362 100644 (file)
@@ -3,7 +3,7 @@
  *                       procedural language
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.26 2003/05/23 04:08:34 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.27 2003/07/25 23:37:29 tgl Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -313,7 +313,10 @@ plpgsql_ns_rename(char *oldname, char *newname)
                }
        }
 
-       elog(ERROR, "there is no variable '%s' in the current block", oldname);
+       ereport(ERROR,
+                       (errcode(ERRCODE_UNDEFINED_OBJECT),
+                        errmsg("there is no variable \"%s\" in the current block",
+                                       oldname)));
 }
 
 
@@ -366,7 +369,9 @@ plpgsql_convert_ident(const char *s, char **output, int numidents)
                                *cp++ = *s++;
                        }
                        if (*s != '"')          /* should not happen if lexer checked */
-                               elog(ERROR, "unterminated \" in name: %s", sstart);
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                                errmsg("unterminated \" in name: %s", sstart)));
                        s++;
                }
                else
@@ -403,8 +408,10 @@ plpgsql_convert_ident(const char *s, char **output, int numidents)
                if (identctr < numidents)
                        output[identctr++] = curident;
                else
-                       elog(ERROR, "Qualified identifier cannot be used here: %s",
-                                sstart);
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_SYNTAX_ERROR),
+                                        errmsg("qualified identifier cannot be used here: %s",
+                                                       sstart)));
 
                /* If not done, skip whitespace, dot, whitespace */
                if (*s)
@@ -412,16 +419,16 @@ plpgsql_convert_ident(const char *s, char **output, int numidents)
                        while (*s && isspace((unsigned char) *s))
                                s++;
                        if (*s++ != '.')
-                               elog(ERROR, "Expected dot between identifiers: %s", sstart);
+                               elog(ERROR, "expected dot between identifiers: %s", sstart);
                        while (*s && isspace((unsigned char) *s))
                                s++;
                        if (*s == '\0')
-                               elog(ERROR, "Expected another identifier: %s", sstart);
+                               elog(ERROR, "expected another identifier: %s", sstart);
                }
        }
 
        if (identctr != numidents)
-               elog(ERROR, "Improperly qualified identifier: %s",
+               elog(ERROR, "improperly qualified identifier: %s",
                         sstart);
 }
 
@@ -586,7 +593,7 @@ dump_stmt(PLpgSQL_stmt * stmt)
                        dump_perform((PLpgSQL_stmt_perform *) stmt);
                        break;
                default:
-                       elog(ERROR, "plpgsql_dump: unknown cmd_type %d\n", stmt->cmd_type);
+                       elog(ERROR, "unknown cmd_type: %d", stmt->cmd_type);
                        break;
        }
 }
index 592877fe52b65c92fc8c22b660b9fa8157884ee4..81d08ac51229c91ff6d23dd96e9a0e7b3e7f7df7 100644 (file)
@@ -3,7 +3,7 @@
  *                       procedural language
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_handler.c,v 1.13 2003/07/01 21:47:09 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_handler.c,v 1.14 2003/07/25 23:37:29 tgl Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -65,7 +65,7 @@ plpgsql_call_handler(PG_FUNCTION_ARGS)
         * Connect to SPI manager
         */
        if (SPI_connect() != SPI_OK_CONNECT)
-               elog(ERROR, "plpgsql: cannot connect to SPI manager");
+               elog(ERROR, "could not connect to SPI manager");
 
        /* Find or compile the function */
        func = plpgsql_compile(fcinfo);
@@ -84,7 +84,7 @@ plpgsql_call_handler(PG_FUNCTION_ARGS)
         * Disconnect from SPI manager
         */
        if (SPI_finish() != SPI_OK_FINISH)
-               elog(ERROR, "plpgsql: SPI_finish() failed");
+               elog(ERROR, "SPI_finish() failed");
 
        return retval;
 }
index 2203cdd6b4f9dc8e0b3b3a6617405ce86176a129..68715df9ed3cf185be6777b3f369a8648918459d 100644 (file)
@@ -4,7 +4,7 @@
  *                       procedural language
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.28 2003/06/19 23:22:40 tgl Exp $
+ *    $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.29 2003/07/25 23:37:29 tgl Exp $
  *
  *    This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -228,7 +228,9 @@ dump                        { return O_DUMP;                        }
 
 \".                            {
                                plpgsql_error_lineno = plpgsql_scanner_lineno();
-                               elog(ERROR, "unterminated quoted identifier");
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                                errmsg("unterminated quoted identifier")));
                        }
 
     /* ----------
@@ -251,7 +253,9 @@ dump                        { return O_DUMP;                        }
 <IN_COMMENT>.          ;
 <IN_COMMENT><<EOF>>    {
                                plpgsql_error_lineno = start_lineno;
-                               elog(ERROR, "unterminated comment");
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                                errmsg("unterminated comment")));
                        }
 
     /* ----------
@@ -277,7 +281,9 @@ dump                        { return O_DUMP;                        }
                        }
 <IN_STRING><<EOF>>     {
                                plpgsql_error_lineno = start_lineno;
-                               elog(ERROR, "unterminated string");
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_DATATYPE_MISMATCH),
+                                                errmsg("unterminated string")));
                        }
 <IN_STRING>[^'\\]*     { }
 
@@ -344,7 +350,7 @@ void
 plpgsql_push_back_token(int token)
 {
        if (have_pushback_token)
-               elog(ERROR, "plpgsql_push_back_token: can't push back multiple tokens");
+               elog(ERROR, "cannot push back multiple tokens");
        pushback_token = token;
        have_pushback_token = true;
 }
index 3bc5d73b33060c4be4a4448d4200ae7ea749a762..2a4c45e6e56bd9568a11d58120a860e787452c69 100644 (file)
@@ -29,7 +29,7 @@
  * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *     $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.34 2003/06/25 01:18:58 momjian Exp $
+ *     $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.35 2003/07/25 23:37:30 tgl Exp $
  *
  *********************************************************************
  */
@@ -333,7 +333,7 @@ plpython_call_handler(PG_FUNCTION_ARGS)
                PLy_init_all();
 
        if (SPI_connect() != SPI_OK_CONNECT)
-               elog(ERROR, "plpython: Unable to connect to SPI manager");
+               elog(ERROR, "could not connect to SPI manager");
 
        CALL_LEVEL_INC();
        is_trigger = CALLED_AS_TRIGGER(fcinfo);
@@ -420,13 +420,13 @@ PLy_trigger_handler(FunctionCallInfo fcinfo, PLyProcedure * proc)
         * Disconnect from SPI manager
         */
        if (SPI_finish() != SPI_OK_FINISH)
-               elog(ERROR, "plpython: SPI_finish failed");
+               elog(ERROR, "SPI_finish failed");
 
        if (plrv == NULL)
-               elog(FATAL, "Aiieee, PLy_procedure_call returned NULL");
+               elog(FATAL, "PLy_procedure_call returned NULL");
 
        if (PLy_restart_in_progress)
-               elog(FATAL, "Aiieee, restart in progress not expected");
+               elog(FATAL, "restart in progress not expected");
 
        /*
         * return of None means we're happy with the tuple
@@ -436,7 +436,7 @@ PLy_trigger_handler(FunctionCallInfo fcinfo, PLyProcedure * proc)
                char       *srv;
 
                if (!PyString_Check(plrv))
-                       elog(ERROR, "plpython: Expected trigger to return None or a String");
+                       elog(ERROR, "expected trigger to return None or a String");
 
                srv = PyString_AsString(plrv);
                if (strcasecmp(srv, "SKIP") == 0)
@@ -449,7 +449,7 @@ PLy_trigger_handler(FunctionCallInfo fcinfo, PLyProcedure * proc)
                                (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event)))
                                rv = PLy_modify_tuple(proc, plargs, tdata, rv);
                        else
-                               elog(WARNING, "plpython: Ignoring modified tuple in DELETE trigger");
+                               elog(WARNING, "ignoring modified tuple in DELETE trigger");
                }
                else if (strcasecmp(srv, "OK"))
                {
@@ -458,7 +458,7 @@ PLy_trigger_handler(FunctionCallInfo fcinfo, PLyProcedure * proc)
                         * surprising thing since i've written no documentation, so
                         * accept a belated OK
                         */
-                       elog(ERROR, "plpython: Expected return to be 'SKIP' or 'MODIFY'");
+                       elog(ERROR, "expected return to be \"SKIP\" or \"MODIFY\"");
                }
        }
 
@@ -520,16 +520,16 @@ PLy_modify_tuple(PLyProcedure * proc, PyObject * pltd, TriggerData *tdata,
        }
 
        if ((plntup = PyDict_GetItemString(pltd, "new")) == NULL)
-               elog(ERROR, "plpython: TD[\"new\"] deleted, unable to modify tuple");
+               elog(ERROR, "TD[\"new\"] deleted, unable to modify tuple");
        if (!PyDict_Check(plntup))
-               elog(ERROR, "plpython: TD[\"new\"] is not a dictionary object");
+               elog(ERROR, "TD[\"new\"] is not a dictionary object");
        Py_INCREF(plntup);
 
        plkeys = PyDict_Keys(plntup);
        natts = PyList_Size(plkeys);
 
        if (natts != proc->result.out.r.natts)
-               elog(ERROR, "plpython: TD[\"new\"] has an incorrect number of keys.");
+               elog(ERROR, "TD[\"new\"] has an incorrect number of keys");
 
        modattrs = palloc(natts * sizeof(int));
        modvalues = palloc(natts * sizeof(Datum));
@@ -550,17 +550,17 @@ PLy_modify_tuple(PLyProcedure * proc, PyObject * pltd, TriggerData *tdata,
 
                platt = PyList_GetItem(plkeys, j);
                if (!PyString_Check(platt))
-                       elog(ERROR, "plpython: attribute is not a string");
+                       elog(ERROR, "attribute is not a string");
                attn = modattrs[j] = SPI_fnumber(tupdesc, PyString_AsString(platt));
 
                if (attn == SPI_ERROR_NOATTRIBUTE)
-                       elog(ERROR, "plpython: invalid attribute `%s' in tuple.",
+                       elog(ERROR, "invalid attribute \"%s\" in tuple",
                                 PyString_AsString(platt));
                atti = attn - 1;
 
                plval = PyDict_GetItem(plntup, platt);
                if (plval == NULL)
-                       elog(FATAL, "plpython: interpreter is probably corrupted");
+                       elog(FATAL, "python interpreter is probably corrupted");
 
                Py_INCREF(plval);
 
@@ -594,7 +594,7 @@ PLy_modify_tuple(PLyProcedure * proc, PyObject * pltd, TriggerData *tdata,
        pfree(modnulls);
 
        if (rtup == NULL)
-               elog(ERROR, "plpython: SPI_modifytuple failed -- error %d", SPI_result);
+               elog(ERROR, "SPI_modifytuple failed -- error %d", SPI_result);
 
        Py_DECREF(plntup);
        Py_DECREF(plkeys);
@@ -636,7 +636,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure * proc, HeapTuple *
 
        pltdata = PyDict_New();
        if (!pltdata)
-               PLy_elog(ERROR, "Unable to build arguments for trigger procedure");
+               PLy_elog(ERROR, "could not build arguments for trigger procedure");
 
        pltname = PyString_FromString(tdata->tg_trigger->tgname);
        PyDict_SetItemString(pltdata, "name", pltname);
@@ -786,14 +786,14 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure * proc)
         * it).
         */
        if (SPI_finish() != SPI_OK_FINISH)
-               elog(ERROR, "plpython: SPI_finish failed");
+               elog(ERROR, "SPI_finish failed");
 
        if (plrv == NULL)
        {
-               elog(FATAL, "Aiieee, PLy_procedure_call returned NULL");
+               elog(FATAL, "PLy_procedure_call returned NULL");
 #ifdef NOT_USED
                if (!PLy_restart_in_progress)
-                       PLy_elog(ERROR, "plpython: Function \"%s\" failed.", proc->proname);
+                       PLy_elog(ERROR, "function \"%s\" failed", proc->proname);
 
                /*
                 * FIXME is this dead code?  i'm pretty sure it is for unnested
@@ -853,7 +853,7 @@ PLy_procedure_call(PLyProcedure * proc, char *kargs, PyObject * vargs)
        {
                Py_XDECREF(rv);
                if (!PLy_restart_in_progress)
-                       PLy_elog(ERROR, "Call of function `%s' failed.", proc->proname);
+                       PLy_elog(ERROR, "function \"%s\" failed", proc->proname);
                RAISE_EXC(1);
        }
 
@@ -951,13 +951,13 @@ PLy_procedure_get(FunctionCallInfo fcinfo, bool is_trigger)
                                                         ObjectIdGetDatum(fn_oid),
                                                         0, 0, 0);
        if (!HeapTupleIsValid(procTup))
-               elog(ERROR, "plpython: cache lookup for procedure %u failed", fn_oid);
+               elog(ERROR, "cache lookup failed for function %u", fn_oid);
 
        rv = snprintf(key, sizeof(key), "%u%s",
                                  fn_oid,
                                  is_trigger ? "_trigger" : "");
        if ((rv >= sizeof(key)) || (rv < 0))
-               elog(FATAL, "plpython: Buffer overrun in %s:%d", __FILE__, __LINE__);
+               elog(ERROR, "key too long");
 
        plproc = PyDict_GetItemString(PLy_procedure_cache, key);
 
@@ -965,13 +965,13 @@ PLy_procedure_get(FunctionCallInfo fcinfo, bool is_trigger)
        {
                Py_INCREF(plproc);
                if (!PyCObject_Check(plproc))
-                       elog(FATAL, "plpython: Expected a PyCObject, didn't get one");
+                       elog(FATAL, "expected a PyCObject, didn't get one");
 
                mark();
 
                proc = PyCObject_AsVoidPtr(plproc);
                if (proc->me != plproc)
-                       elog(FATAL, "plpython: Aiieee, proc->me != plproc");
+                       elog(FATAL, "proc->me != plproc");
                /* did we find an up-to-date cache entry? */
                if (proc->fn_xmin != HeapTupleHeaderGetXmin(procTup->t_data) ||
                        proc->fn_cmin != HeapTupleHeaderGetCmin(procTup->t_data))
@@ -1013,7 +1013,7 @@ PLy_procedure_create(FunctionCallInfo fcinfo, bool is_trigger,
                                  fcinfo->flinfo->fn_oid,
                                  is_trigger ? "_trigger" : "");
        if ((rv >= sizeof(procName)) || (rv < 0))
-               elog(FATAL, "plpython: Procedure name would overrun buffer");
+               elog(ERROR, "procedure name would overrun buffer");
 
        proc = PLy_malloc(sizeof(PLyProcedure));
        proc->proname = PLy_malloc(strlen(NameStr(procStruct->proname)) + 1);
@@ -1047,19 +1047,21 @@ PLy_procedure_create(FunctionCallInfo fcinfo, bool is_trigger,
        {
                HeapTuple       rvTypeTup;
                Form_pg_type rvTypeStruct;
-               Datum           rvDatum;
 
-               rvDatum = ObjectIdGetDatum(procStruct->prorettype);
-               rvTypeTup = SearchSysCache(TYPEOID, rvDatum, 0, 0, 0);
+               rvTypeTup = SearchSysCache(TYPEOID,
+                                                                  ObjectIdGetDatum(procStruct->prorettype),
+                                                                  0, 0, 0);
                if (!HeapTupleIsValid(rvTypeTup))
-                       elog(ERROR, "plpython: cache lookup for type \"%u\" failed",
+                       elog(ERROR, "cache lookup failed for type %u",
                                 procStruct->prorettype);
 
                rvTypeStruct = (Form_pg_type) GETSTRUCT(rvTypeTup);
                if (rvTypeStruct->typrelid == InvalidOid)
                        PLy_output_datum_func(&proc->result, rvTypeStruct);
                else
-                       elog(ERROR, "plpython: tuple return types not supported, yet");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                        errmsg("tuple return types are not supported yet")));
 
                ReleaseSysCache(rvTypeTup);
        }
@@ -1084,12 +1086,12 @@ PLy_procedure_create(FunctionCallInfo fcinfo, bool is_trigger,
        {
                HeapTuple       argTypeTup;
                Form_pg_type argTypeStruct;
-               Datum           argDatum;
 
-               argDatum = ObjectIdGetDatum(procStruct->proargtypes[i]);
-               argTypeTup = SearchSysCache(TYPEOID, argDatum, 0, 0, 0);
+               argTypeTup = SearchSysCache(TYPEOID,
+                                                                       ObjectIdGetDatum(procStruct->proargtypes[i]),
+                                                                       0, 0, 0);
                if (!HeapTupleIsValid(argTypeTup))
-                       elog(ERROR, "plpython: cache lookup for type \"%u\" failed",
+                       elog(ERROR, "cache lookup failed for type %u",
                                 procStruct->proargtypes[i]);
                argTypeStruct = (Form_pg_type) GETSTRUCT(argTypeTup);
 
@@ -1164,7 +1166,7 @@ PLy_procedure_compile(PLyProcedure * proc, const char *src)
                 */
                clen = snprintf(call, sizeof(call), "%s()", proc->pyname);
                if ((clen < 0) || (clen >= sizeof(call)))
-                       elog(ERROR, "plpython: string would overflow buffer.");
+                       elog(ERROR, "string would overflow buffer");
                proc->code = Py_CompileString(call, "<string>", Py_eval_input);
                if ((proc->code != NULL) && (!PyErr_Occurred()))
                        return;
@@ -1172,7 +1174,7 @@ PLy_procedure_compile(PLyProcedure * proc, const char *src)
        else
                Py_XDECREF(crv);
 
-       PLy_elog(ERROR, "Unable to compile function %s", proc->proname);
+       PLy_elog(ERROR, "could not compile function \"%s\"", proc->proname);
 }
 
 char *
@@ -1193,8 +1195,7 @@ PLy_procedure_munge_source(const char *name, const char *src)
 
        mrc = PLy_malloc(mlen);
        plen = snprintf(mrc, mlen, "def %s():\n\t", name);
-       if ((plen < 0) || (plen >= mlen))
-               elog(FATAL, "Aiieee, impossible buffer overrun (or snprintf failure)");
+       Assert(plen >= 0 && plen < mlen);
 
        sp = src;
        mp = mrc + plen;
@@ -1214,7 +1215,7 @@ PLy_procedure_munge_source(const char *name, const char *src)
        *mp = '\0';
 
        if (mp > (mrc + mlen))
-               elog(FATAL, "plpython: Buffer overrun in PLy_munge_source");
+               elog(FATAL, "buffer overrun in PLy_munge_source");
 
        return mrc;
 }
@@ -1253,12 +1254,11 @@ void
 PLy_input_tuple_funcs(PLyTypeInfo * arg, TupleDesc desc)
 {
        int                     i;
-       Datum           datum;
 
        enter();
 
        if (arg->is_rel == 0)
-               elog(FATAL, "plpython: PLyTypeInfo struct is initialized for a Datum");
+               elog(ERROR, "PLyTypeInfo struct is initialized for a Datum");
 
        arg->is_rel = 1;
        arg->in.r.natts = desc->natts;
@@ -1269,16 +1269,12 @@ PLy_input_tuple_funcs(PLyTypeInfo * arg, TupleDesc desc)
                HeapTuple       typeTup;
                Form_pg_type typeStruct;
 
-               datum = ObjectIdGetDatum(desc->attrs[i]->atttypid);
-               typeTup = SearchSysCache(TYPEOID, datum, 0, 0, 0);
+               typeTup = SearchSysCache(TYPEOID,
+                                                                ObjectIdGetDatum(desc->attrs[i]->atttypid),
+                                                                0, 0, 0);
                if (!HeapTupleIsValid(typeTup))
-               {
-                       char       *attname = NameStr(desc->attrs[i]->attname);
-
-                       elog(ERROR, "plpython: Cache lookup for attribute `%s' type `%u' failed",
-                                attname, desc->attrs[i]->atttypid);
-               }
-
+                       elog(ERROR, "cache lookup failed for type %u",
+                                desc->attrs[i]->atttypid);
                typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
 
                PLy_input_datum_func2(&(arg->in.r.atts[i]),
@@ -1293,12 +1289,11 @@ void
 PLy_output_tuple_funcs(PLyTypeInfo * arg, TupleDesc desc)
 {
        int                     i;
-       Datum           datum;
 
        enter();
 
        if (arg->is_rel == 0)
-               elog(FATAL, "plpython: PLyTypeInfo struct is initialized for a Datum");
+               elog(ERROR, "PLyTypeInfo struct is initialized for a Datum");
 
        arg->is_rel = 1;
        arg->out.r.natts = desc->natts;
@@ -1309,16 +1304,12 @@ PLy_output_tuple_funcs(PLyTypeInfo * arg, TupleDesc desc)
                HeapTuple       typeTup;
                Form_pg_type typeStruct;
 
-               datum = ObjectIdGetDatum(desc->attrs[i]->atttypid);
-               typeTup = SearchSysCache(TYPEOID, datum, 0, 0, 0);
+               typeTup = SearchSysCache(TYPEOID,
+                                                                ObjectIdGetDatum(desc->attrs[i]->atttypid),
+                                                                0, 0, 0);
                if (!HeapTupleIsValid(typeTup))
-               {
-                       char       *attname = NameStr(desc->attrs[i]->attname);
-
-                       elog(ERROR, "plpython: Cache lookup for attribute `%s' type `%u' failed",
-                                attname, desc->attrs[i]->atttypid);
-               }
-
+                       elog(ERROR, "cache lookup failed for type %u",
+                                desc->attrs[i]->atttypid);
                typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
 
                PLy_output_datum_func2(&(arg->out.r.atts[i]), typeStruct);
@@ -1333,7 +1324,7 @@ PLy_output_datum_func(PLyTypeInfo * arg, Form_pg_type typeStruct)
        enter();
 
        if (arg->is_rel == 1)
-               elog(FATAL, "plpython: PLyTypeInfo struct is initialized for a Tuple");
+               elog(ERROR, "PLyTypeInfo struct is initialized for a Tuple");
        arg->is_rel = 0;
        PLy_output_datum_func2(&(arg->out.d), typeStruct);
 }
@@ -1354,7 +1345,7 @@ PLy_input_datum_func(PLyTypeInfo * arg, Oid typeOid, Form_pg_type typeStruct)
        enter();
 
        if (arg->is_rel == 1)
-               elog(FATAL, "plpython: PLyTypeInfo struct is initialized for Tuple");
+               elog(ERROR, "PLyTypeInfo struct is initialized for Tuple");
        arg->is_rel = 0;
        PLy_input_datum_func2(&(arg->in.d), typeOid, typeStruct);
 }
@@ -1476,11 +1467,11 @@ PLyDict_FromTuple(PLyTypeInfo * info, HeapTuple tuple, TupleDesc desc)
        enter();
 
        if (info->is_rel != 1)
-               elog(FATAL, "plpython: PLyTypeInfo structure describes a datum.");
+               elog(ERROR, "PLyTypeInfo structure describes a datum");
 
        dict = PyDict_New();
        if (dict == NULL)
-               PLy_elog(ERROR, "Unable to create tuple dictionary.");
+               PLy_elog(ERROR, "could not create tuple dictionary");
 
        SAVE_EXC();
        if (TRAP_EXC())
@@ -1915,7 +1906,8 @@ PLy_spi_prepare(PyObject * self, PyObject * args)
                Py_XDECREF(optr);
                if (!PyErr_Occurred())
                        PyErr_SetString(PLy_exc_spi_error,
-                                                       "Unknown error in PLy_spi_prepare.");
+                                                       "Unknown error in PLy_spi_prepare");
+               /* XXX this oughta be replaced with errcontext mechanism */
                PLy_elog(WARNING, "in function %s:", PLy_procedure_name(PLy_last_procedure));
                RERAISE_EXC();
        }
@@ -2191,7 +2183,7 @@ PLy_spi_execute_query(char *query, int limit)
                RESTORE_EXC();
                if ((!PLy_restart_in_progress) && (!PyErr_Occurred()))
                        PyErr_SetString(PLy_exc_spi_error,
-                                                       "Unknown error in PLy_spi_execute_query.");
+                                                       "Unknown error in PLy_spi_execute_query");
                PLy_elog(WARNING, "in function %s:", PLy_procedure_name(PLy_last_procedure));
                RERAISE_EXC();
        }
@@ -2318,17 +2310,17 @@ PLy_init_all(void)
        enter();
 
        if (init_active)
-               elog(FATAL, "plpython: Initialization of language module failed.");
+               elog(FATAL, "initialization of language module failed");
        init_active = 1;
 
        Py_Initialize();
        PLy_init_interp();
        PLy_init_plpy();
        if (PyErr_Occurred())
-               PLy_elog(FATAL, "Untrapped error in initialization.");
+               PLy_elog(FATAL, "untrapped error in initialization");
        PLy_procedure_cache = PyDict_New();
        if (PLy_procedure_cache == NULL)
-               PLy_elog(ERROR, "Unable to create procedure cache.");
+               PLy_elog(ERROR, "could not create procedure cache");
 
        PLy_first_call = 0;
 
@@ -2344,14 +2336,14 @@ PLy_init_interp(void)
 
        mainmod = PyImport_AddModule("__main__");
        if ((mainmod == NULL) || (PyErr_Occurred()))
-               PLy_elog(ERROR, "Unable to import '__main__' module.");
+               PLy_elog(ERROR, "could not import \"__main__\" module.");
        Py_INCREF(mainmod);
        PLy_interp_globals = PyModule_GetDict(mainmod);
        PLy_interp_safe_globals = PyDict_New();
        PyDict_SetItemString(PLy_interp_globals, "GD", PLy_interp_safe_globals);
        Py_DECREF(mainmod);
        if ((PLy_interp_globals == NULL) || (PyErr_Occurred()))
-               PLy_elog(ERROR, "Unable to initialize globals.");
+               PLy_elog(ERROR, "could not initialize globals");
 }
 
 void
@@ -2389,7 +2381,7 @@ PLy_init_plpy(void)
        plpy_mod = PyImport_AddModule("plpy");
        PyDict_SetItemString(main_dict, "plpy", plpy_mod);
        if (PyErr_Occurred())
-               elog(ERROR, "Unable to init plpy.");
+               elog(ERROR, "could not init plpy");
 }
 
 /* the python interface to the elog function
@@ -2450,7 +2442,7 @@ PLy_output(volatile int level, PyObject * self, PyObject * args)
        enter();
 
        if (args == NULL)
-               elog(WARNING, "plpython, args is NULL in %s", __FUNCTION__);
+               elog(WARNING, "args is NULL");
 
        so = PyObject_Str(args);
        if ((so == NULL) || ((sv = PyString_AsString(so)) == NULL))
@@ -2492,7 +2484,7 @@ PLy_output(volatile int level, PyObject * self, PyObject * args)
                 * postgresql log, no?  whatever, this shouldn't happen so die
                 * hideously.
                 */
-               elog(FATAL, "plpython: Aiieee, elog threw an unknown exception!");
+               elog(FATAL, "elog threw an unknown exception");
                RERAISE_EXC();
        }
 
@@ -2576,18 +2568,18 @@ PLy_elog(int elevel, const char *fmt,...)
                 */
                PLy_restart_in_progress += 1;
                PLy_free(emsg);
-               PLy_free(xmsg);
+               if (xmsg)
+                       PLy_free(xmsg);
                RERAISE_EXC();
        }
 
+       ereport(elevel,
+                       (errmsg("plpython: %s", emsg),
+                        (xmsg) ? errdetail("%s", xmsg) : 0));
+
+       PLy_free(emsg);
        if (xmsg)
-       {
-               elog(elevel, "plpython: %s\n%s", emsg, xmsg);
                PLy_free(xmsg);
-       }
-       else
-               elog(elevel, "plpython: %s", emsg);
-       PLy_free(emsg);
 
        leave();
 
@@ -2706,7 +2698,9 @@ PLy_malloc(size_t bytes)
        void       *ptr = malloc(bytes);
 
        if (ptr == NULL)
-               elog(FATAL, "plpython: Memory exhausted.");
+               ereport(FATAL,
+                               (errcode(ERRCODE_OUT_OF_MEMORY),
+                                errmsg("out of memory")));
        return ptr;
 }
 
@@ -2716,7 +2710,9 @@ PLy_realloc(void *optr, size_t bytes)
        void       *nptr = realloc(optr, bytes);
 
        if (nptr == NULL)
-               elog(FATAL, "plpython: Memory exhausted.");
+               ereport(FATAL,
+                               (errcode(ERRCODE_OUT_OF_MEMORY),
+                                errmsg("out of memory")));
        return nptr;
 }
 
index 5b5300c83d98649e52a8bc9855b6150901570511..d6060ee373dd5ddc25a69093e79c675025a6ded5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/pl/plpython/Attic/plpython.h,v 1.7 2003/05/27 17:49:47 momjian Exp $ */
+/* $Header: /cvsroot/pgsql/src/pl/plpython/Attic/plpython.h,v 1.8 2003/07/25 23:37:30 tgl Exp $ */
 
 #ifndef PLPYTHON_H
 #define PLPYTHON_H
@@ -43,8 +43,8 @@
 
 #if DEBUG_LEVEL
 #define CALL_LEVEL_INC() do { PLy_call_level += 1; \
-       elog(DEBUG4, "Level: %d", PLy_call_level); } while (0)
-#define CALL_LEVEL_DEC() do { elog(DEBUG4, "Level: %d", PLy_call_level); \
+       elog(DEBUG4, "level: %d", PLy_call_level); } while (0)
+#define CALL_LEVEL_DEC() do { elog(DEBUG4, "level: %d", PLy_call_level); \
        PLy_call_level -= 1; } while (0)
 #else
 #define CALL_LEVEL_INC() do { PLy_call_level += 1; } while (0)
index 35414d7889369724f3d129bb14d91631657229ed..2f14245ee176e8cf24b8c52cdecbcf0aab27dd18 100644 (file)
@@ -31,7 +31,7 @@
  *       ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.71 2003/05/27 17:49:47 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.72 2003/07/25 23:37:31 tgl Exp $
  *
  **********************************************************************/
 
@@ -215,28 +215,19 @@ pltcl_init_all(void)
         * stdout and stderr on DeleteInterp
         ************************************************************/
        if ((pltcl_hold_interp = Tcl_CreateInterp()) == NULL)
-       {
-               elog(ERROR, "pltcl: internal error - cannot create 'hold' "
-                        "interpreter");
-       }
+               elog(ERROR, "could not create \"hold\" interpreter");
 
        /************************************************************
         * Create the two interpreters
         ************************************************************/
        if ((pltcl_norm_interp =
                 Tcl_CreateSlave(pltcl_hold_interp, "norm", 0)) == NULL)
-       {
-               elog(ERROR,
-                  "pltcl: internal error - cannot create 'normal' interpreter");
-       }
+               elog(ERROR, "could not create \"normal\" interpreter");
        pltcl_init_interp(pltcl_norm_interp);
 
        if ((pltcl_safe_interp =
                 Tcl_CreateSlave(pltcl_hold_interp, "safe", 1)) == NULL)
-       {
-               elog(ERROR,
-                        "pltcl: internal error - cannot create 'safe' interpreter");
-       }
+               elog(ERROR, "could not create \"safe\" interpreter");
        pltcl_init_interp(pltcl_safe_interp);
 
        /************************************************************
@@ -285,10 +276,10 @@ pltcl_init_interp(Tcl_Interp *interp)
         * Try to load the unknown procedure from pltcl_modules
         ************************************************************/
        if (SPI_connect() != SPI_OK_CONNECT)
-               elog(ERROR, "pltcl_init_interp(): SPI_connect failed");
+               elog(ERROR, "SPI_connect failed");
        pltcl_init_load_unknown(interp);
        if (SPI_finish() != SPI_OK_FINISH)
-               elog(ERROR, "pltcl_init_interp(): SPI_finish failed");
+               elog(ERROR, "SPI_finish failed");
 }
 
 
@@ -313,7 +304,7 @@ pltcl_init_load_unknown(Tcl_Interp *interp)
                                          "where relname = 'pltcl_modules'", 1);
        SPI_freetuptable(SPI_tuptable);
        if (spi_rc != SPI_OK_SELECT)
-               elog(ERROR, "pltcl_init_load_unknown(): select from pg_class failed");
+               elog(ERROR, "select from pg_class failed");
        if (SPI_processed == 0)
                return;
 
@@ -327,10 +318,7 @@ pltcl_init_load_unknown(Tcl_Interp *interp)
                                          "where modname = 'unknown' "
                                          "order by modseq", 0);
        if (spi_rc != SPI_OK_SELECT)
-       {
-               elog(ERROR, "pltcl_init_load_unknown(): select from pltcl_modules "
-                        "failed");
-       }
+               elog(ERROR, "select from pltcl_modules failed");
 
        /************************************************************
         * If there's nothing, module unknown doesn't exist
@@ -339,7 +327,7 @@ pltcl_init_load_unknown(Tcl_Interp *interp)
        {
                Tcl_DStringFree(&unknown_src);
                SPI_freetuptable(SPI_tuptable);
-               elog(WARNING, "pltcl: Module unknown not found in pltcl_modules");
+               elog(WARNING, "module \"unknown\" not found in pltcl_modules");
                return;
        }
 
@@ -394,7 +382,7 @@ pltcl_call_handler(PG_FUNCTION_ARGS)
         * Connect to SPI manager
         ************************************************************/
        if (SPI_connect() != SPI_OK_CONNECT)
-               elog(ERROR, "pltcl: cannot connect to SPI manager");
+               elog(ERROR, "could not connect to SPI manager");
        /************************************************************
         * Keep track about the nesting of Tcl-SPI-Tcl-... calls
         ************************************************************/
@@ -550,9 +538,11 @@ pltcl_func_handler(PG_FUNCTION_ARGS)
                        if (--pltcl_call_level == 0)
                                pltcl_restart_in_progress = 0;
                        UTF_BEGIN;
-                       elog(ERROR, "pltcl: %s\n%s", interp->result,
-                                UTF_U2E(Tcl_GetVar(interp, "errorInfo",
-                                                                       TCL_GLOBAL_ONLY)));
+                       ereport(ERROR,
+                                       (errmsg("pltcl: %s", interp->result),
+                                        errdetail("%s",
+                                                          UTF_U2E(Tcl_GetVar(interp, "errorInfo",
+                                                                                                 TCL_GLOBAL_ONLY)))));
                        UTF_END;
                }
                if (--pltcl_call_level == 0)
@@ -586,7 +576,7 @@ pltcl_func_handler(PG_FUNCTION_ARGS)
         * the result type in that case.
         ************************************************************/
        if (SPI_finish() != SPI_OK_FINISH)
-               elog(ERROR, "pltcl: SPI_finish() failed");
+               elog(ERROR, "SPI_finish() failed");
 
        if (fcinfo->isnull)
                retval = (Datum) 0;
@@ -785,9 +775,11 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
                        if (--pltcl_call_level == 0)
                                pltcl_restart_in_progress = 0;
                        UTF_BEGIN;
-                       elog(ERROR, "pltcl: %s\n%s", interp->result,
-                                UTF_U2E(Tcl_GetVar(interp, "errorInfo",
-                                                                       TCL_GLOBAL_ONLY)));
+                       ereport(ERROR,
+                                       (errmsg("pltcl: %s", interp->result),
+                                        errdetail("%s",
+                                                          UTF_U2E(Tcl_GetVar(interp, "errorInfo",
+                                                                                                 TCL_GLOBAL_ONLY)))));
                        UTF_END;
                }
                if (--pltcl_call_level == 0)
@@ -801,7 +793,7 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
                        break;
 
                default:
-                       elog(ERROR, "pltcl: unsupported TCL return code %d", tcl_rc);
+                       elog(ERROR, "unsupported TCL return code: %d", tcl_rc);
        }
 
        /************************************************************
@@ -809,7 +801,7 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
         * the magic strings OK or SKIP or a list from array get
         ************************************************************/
        if (SPI_finish() != SPI_OK_FINISH)
-               elog(ERROR, "pltcl: SPI_finish() failed");
+               elog(ERROR, "SPI_finish() failed");
 
        if (strcmp(interp->result, "OK") == 0)
                return rettup;
@@ -822,15 +814,13 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
         ************************************************************/
        if (Tcl_SplitList(interp, interp->result,
                                          &ret_numvals, &ret_values) != TCL_OK)
-       {
-               elog(WARNING, "pltcl: cannot split return value from trigger");
-               elog(ERROR, "pltcl: %s", interp->result);
-       }
+               elog(ERROR, "could not split return value from trigger: %s",
+                        interp->result);
 
        if (ret_numvals % 2 != 0)
        {
                ckfree((char *) ret_values);
-               elog(ERROR, "pltcl: invalid return list from trigger - must have even # of elements");
+               elog(ERROR, "invalid return list from trigger - must have even # of elements");
        }
 
        modattrs = (int *) palloc(tupdesc->natts * sizeof(int));
@@ -881,9 +871,11 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
                 ************************************************************/
                attnum = SPI_fnumber(tupdesc, ret_values[i++]);
                if (attnum == SPI_ERROR_NOATTRIBUTE)
-                       elog(ERROR, "pltcl: invalid attribute '%s'", ret_values[--i]);
+                       elog(ERROR, "invalid attribute \"%s\"",
+                                ret_values[--i]);
                if (attnum <= 0)
-                       elog(ERROR, "pltcl: cannot set system attribute '%s'", ret_values[--i]);
+                       elog(ERROR, "cannot set system attribute \"%s\"",
+                                ret_values[--i]);
 
                /************************************************************
                 * Lookup the attribute type in the syscache
@@ -893,11 +885,8 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
                                  ObjectIdGetDatum(tupdesc->attrs[attnum - 1]->atttypid),
                                                                 0, 0, 0);
                if (!HeapTupleIsValid(typeTup))
-               {
-                       elog(ERROR, "pltcl: Cache lookup for attribute '%s' type %u failed",
-                                ret_values[--i],
+                       elog(ERROR, "cache lookup failed for type %u",
                                 tupdesc->attrs[attnum - 1]->atttypid);
-               }
                typinput = ((Form_pg_type) GETSTRUCT(typeTup))->typinput;
                typelem = ((Form_pg_type) GETSTRUCT(typeTup))->typelem;
                ReleaseSysCache(typeTup);
@@ -924,7 +913,7 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
        pfree(modnulls);
 
        if (rettup == NULL)
-               elog(ERROR, "pltcl: SPI_modifytuple() failed - RC = %d\n", SPI_result);
+               elog(ERROR, "SPI_modifytuple() failed - RC = %d", SPI_result);
 
        ckfree((char *) ret_values);
        memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
@@ -954,7 +943,7 @@ compile_pltcl_function(Oid fn_oid, bool is_trigger)
                                                         ObjectIdGetDatum(fn_oid),
                                                         0, 0, 0);
        if (!HeapTupleIsValid(procTup))
-               elog(ERROR, "pltcl: cache lookup for proc %u failed", fn_oid);
+               elog(ERROR, "cache lookup failed for function %u", fn_oid);
        procStruct = (Form_pg_proc) GETSTRUCT(procTup);
 
        /************************************************************
@@ -1018,7 +1007,9 @@ compile_pltcl_function(Oid fn_oid, bool is_trigger)
                 ************************************************************/
                prodesc = (pltcl_proc_desc *) malloc(sizeof(pltcl_proc_desc));
                if (prodesc == NULL)
-                       elog(ERROR, "pltcl: out of memory");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_OUT_OF_MEMORY),
+                                        errmsg("out of memory")));
                MemSet(prodesc, 0, sizeof(pltcl_proc_desc));
                prodesc->proname = strdup(internal_proname);
                prodesc->fn_xmin = HeapTupleHeaderGetXmin(procTup->t_data);
@@ -1034,7 +1025,7 @@ compile_pltcl_function(Oid fn_oid, bool is_trigger)
                {
                        free(prodesc->proname);
                        free(prodesc);
-                       elog(ERROR, "pltcl: cache lookup for language %u failed",
+                       elog(ERROR, "cache lookup failed for language %u",
                                 procStruct->prolang);
                }
                langStruct = (Form_pg_language) GETSTRUCT(langTup);
@@ -1059,7 +1050,7 @@ compile_pltcl_function(Oid fn_oid, bool is_trigger)
                        {
                                free(prodesc->proname);
                                free(prodesc);
-                               elog(ERROR, "pltcl: cache lookup for return type %u failed",
+                               elog(ERROR, "cache lookup failed for type %u",
                                         procStruct->prorettype);
                        }
                        typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
@@ -1073,16 +1064,18 @@ compile_pltcl_function(Oid fn_oid, bool is_trigger)
                                {
                                        free(prodesc->proname);
                                        free(prodesc);
-                                       elog(ERROR, "pltcl functions cannot return type %s"
-                                                "\n\texcept when used as triggers",
-                                                format_type_be(procStruct->prorettype));
+                                       ereport(ERROR,
+                                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                        errmsg("trigger functions may only be called as triggers")));
                                }
                                else
                                {
                                        free(prodesc->proname);
                                        free(prodesc);
-                                       elog(ERROR, "pltcl functions cannot return type %s",
-                                                format_type_be(procStruct->prorettype));
+                                       ereport(ERROR,
+                                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                        errmsg("pltcl functions cannot return type %s",
+                                                                       format_type_be(procStruct->prorettype))));
                                }
                        }
 
@@ -1090,7 +1083,9 @@ compile_pltcl_function(Oid fn_oid, bool is_trigger)
                        {
                                free(prodesc->proname);
                                free(prodesc);
-                               elog(ERROR, "pltcl: return types of tuples not supported yet");
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                errmsg("pltcl functions cannot return tuples yet")));
                        }
 
                        perm_fmgr_info(typeStruct->typinput, &(prodesc->result_in_func));
@@ -1116,7 +1111,7 @@ compile_pltcl_function(Oid fn_oid, bool is_trigger)
                                {
                                        free(prodesc->proname);
                                        free(prodesc);
-                                       elog(ERROR, "pltcl: cache lookup for argument type %u failed",
+                                       elog(ERROR, "cache lookup failed for type %u",
                                                 procStruct->proargtypes[i]);
                                }
                                typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
@@ -1126,8 +1121,10 @@ compile_pltcl_function(Oid fn_oid, bool is_trigger)
                                {
                                        free(prodesc->proname);
                                        free(prodesc);
-                                       elog(ERROR, "pltcl functions cannot take type %s",
-                                                format_type_be(procStruct->proargtypes[i]));
+                                       ereport(ERROR,
+                                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                        errmsg("pltcl functions cannot take type %s",
+                                                                       format_type_be(procStruct->proargtypes[i]))));
                                }
 
                                if (typeStruct->typrelid != InvalidOid)
@@ -1230,7 +1227,7 @@ compile_pltcl_function(Oid fn_oid, bool is_trigger)
                {
                        free(prodesc->proname);
                        free(prodesc);
-                       elog(ERROR, "pltcl: cannot create internal procedure %s - %s",
+                       elog(ERROR, "could not create internal procedure \"%s\": %s",
                                 internal_proname, interp->result);
                }
 
@@ -1802,45 +1799,8 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp,
 
        if (plan == NULL)
        {
-               char            buf[128];
-               char       *reason;
-
                memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
-
-               switch (SPI_result)
-               {
-                       case SPI_ERROR_ARGUMENT:
-                               reason = "SPI_ERROR_ARGUMENT";
-                               break;
-
-                       case SPI_ERROR_UNCONNECTED:
-                               reason = "SPI_ERROR_UNCONNECTED";
-                               break;
-
-                       case SPI_ERROR_COPY:
-                               reason = "SPI_ERROR_COPY";
-                               break;
-
-                       case SPI_ERROR_CURSOR:
-                               reason = "SPI_ERROR_CURSOR";
-                               break;
-
-                       case SPI_ERROR_TRANSACTION:
-                               reason = "SPI_ERROR_TRANSACTION";
-                               break;
-
-                       case SPI_ERROR_OPUNKNOWN:
-                               reason = "SPI_ERROR_OPUNKNOWN";
-                               break;
-
-                       default:
-                               snprintf(buf, sizeof(buf), "unknown RC %d", SPI_result);
-                               reason = buf;
-                               break;
-
-               }
-
-               elog(ERROR, "pltcl: SPI_prepare() failed - %s", reason);
+               elog(ERROR, "SPI_prepare() failed");
        }
 
        /************************************************************
@@ -1850,29 +1810,8 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp,
        qdesc->plan = SPI_saveplan(plan);
        if (qdesc->plan == NULL)
        {
-               char            buf[128];
-               char       *reason;
-
                memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
-
-               switch (SPI_result)
-               {
-                       case SPI_ERROR_ARGUMENT:
-                               reason = "SPI_ERROR_ARGUMENT";
-                               break;
-
-                       case SPI_ERROR_UNCONNECTED:
-                               reason = "SPI_ERROR_UNCONNECTED";
-                               break;
-
-                       default:
-                               snprintf(buf, sizeof(buf), "unknown RC %d", SPI_result);
-                               reason = buf;
-                               break;
-
-               }
-
-               elog(ERROR, "pltcl: SPI_saveplan() failed - %s", reason);
+               elog(ERROR, "SPI_saveplan() failed");
        }
        /* Release the procCxt copy to avoid within-function memory leak */
        SPI_freeplan(plan);
@@ -2359,10 +2298,8 @@ pltcl_set_tuple_values(Tcl_Interp *interp, CONST84 char *arrayname,
                                                   ObjectIdGetDatum(tupdesc->attrs[i]->atttypid),
                                                                 0, 0, 0);
                if (!HeapTupleIsValid(typeTup))
-               {
-                       elog(ERROR, "pltcl: Cache lookup for attribute '%s' type %u failed",
-                                attname, tupdesc->attrs[i]->atttypid);
-               }
+                       elog(ERROR, "cache lookup failed for type %u",
+                                tupdesc->attrs[i]->atttypid);
 
                typoutput = ((Form_pg_type) GETSTRUCT(typeTup))->typoutput;
                typelem = ((Form_pg_type) GETSTRUCT(typeTup))->typelem;
@@ -2431,10 +2368,8 @@ pltcl_build_tuple_argument(HeapTuple tuple, TupleDesc tupdesc,
                                                   ObjectIdGetDatum(tupdesc->attrs[i]->atttypid),
                                                                 0, 0, 0);
                if (!HeapTupleIsValid(typeTup))
-               {
-                       elog(ERROR, "pltcl: Cache lookup for attribute '%s' type %u failed",
-                                attname, tupdesc->attrs[i]->atttypid);
-               }
+                       elog(ERROR, "cache lookup failed for type %u",
+                                tupdesc->attrs[i]->atttypid);
 
                typoutput = ((Form_pg_type) GETSTRUCT(typeTup))->typoutput;
                typelem = ((Form_pg_type) GETSTRUCT(typeTup))->typelem;