Back out SQLSTATE and SQLERRM support.
authorBruce Momjian <[email protected]>
Thu, 26 May 2005 04:08:32 +0000 (04:08 +0000)
committerBruce Momjian <[email protected]>
Thu, 26 May 2005 04:08:32 +0000 (04:08 +0000)
doc/src/sgml/plpgsql.sgml
src/pl/plpgsql/src/gram.y
src/pl/plpgsql/src/pl_exec.c
src/pl/plpgsql/src/plpgsql.h
src/test/regress/expected/plpgsql.out
src/test/regress/sql/plpgsql.sql

index b557087d05ac35113a2ae46d388482509cedf04b..fab180b5a7364c086997f3b8d80c8f93511b6319 100644 (file)
@@ -2007,13 +2007,12 @@ END LOOP;
     </indexterm>
 
     <para>
-     Any error occurring in <application>PL/pgSQL</> sets variables
-     <varname>SQLSTATE</> and <varname>SQLERRM</>, and, by default,
-     aborts execution of the function, and indeed of the surrounding
-     transaction as well. You can trap errors and recover from them by
-     using a <command>BEGIN</> block with an <literal>EXCEPTION</>
-     clause. The syntax is an extension of the normal syntax for a
-     <command>BEGIN</> block:
+     By default, any error occurring in a <application>PL/pgSQL</>
+     function aborts execution of the function, and indeed of the
+     surrounding transaction as well.  You can trap errors and recover
+     from them by using a <command>BEGIN</> block with an
+     <literal>EXCEPTION</> clause.  The syntax is an extension of the
+     normal syntax for a <command>BEGIN</> block:
 
 <synopsis>
 <optional> &lt;&lt;<replaceable>label</replaceable>&gt;&gt; </optional>
index ad80048b10ec6e3423fd5cc8f9baf8f36eb66f9e..551bfb2e4d587cfcb23f034d3f017534638979fa 100644 (file)
@@ -80,11 +80,6 @@ static       void                     plpgsql_sql_error_callback(void *arg);
                        int  n_initvars;
                        int  *initvarnos;
                }                                               declhdr;
-               struct 
-               {
-                       int sqlstate_varno;
-                       int sqlerrm_varno;
-               }                                               fict_vars;
                List                                    *list;
                PLpgSQL_type                    *dtype;
                PLpgSQL_datum                   *scalar;        /* a VAR, RECFIELD, or TRIGARG */
@@ -101,7 +96,6 @@ static       void                     plpgsql_sql_error_callback(void *arg);
                PLpgSQL_diag_item               *diagitem;
 }
 
-%type <fict_vars> fict_vars_sect
 %type <declhdr> decl_sect
 %type <varname> decl_varname
 %type <str>            decl_renname
@@ -250,22 +244,19 @@ opt_semi          :
                                | ';'
                                ;
 
-pl_block               : decl_sect fict_vars_sect K_BEGIN lno proc_sect exception_sect K_END
+pl_block               : decl_sect K_BEGIN lno proc_sect exception_sect K_END
                                        {
                                                PLpgSQL_stmt_block *new;
 
                                                new = palloc0(sizeof(PLpgSQL_stmt_block));
 
                                                new->cmd_type   = PLPGSQL_STMT_BLOCK;
-                                               new->lineno             = $4;
+                                               new->lineno             = $3;
                                                new->label              = $1.label;
                                                new->n_initvars = $1.n_initvars;
                                                new->initvarnos = $1.initvarnos;
-                                               new->body               = $5;
-                                               new->exceptions = $6;
-
-                                               new->sqlstate_varno = $2.sqlstate_varno;
-                                               new->sqlerrm_varno = $2.sqlerrm_varno;
+                                               new->body               = $4;
+                                               new->exceptions = $5;
 
                                                plpgsql_ns_pop();
 
@@ -273,20 +264,6 @@ pl_block           : decl_sect fict_vars_sect K_BEGIN lno proc_sect exception_sect K_END
                                        }
                                ;
 
-fict_vars_sect :
-                                       {
-                                               PLpgSQL_variable        *var;
-
-                                               plpgsql_ns_setlocal(false);
-                                               var = plpgsql_build_variable("sqlstate", 0,
-                                                                                plpgsql_build_datatype(TEXTOID, -1), true);  
-                                               $$.sqlstate_varno = var->dno;
-                                               var = plpgsql_build_variable("sqlerrm", 0,
-                                                                                plpgsql_build_datatype(TEXTOID, -1), true);  
-                                               $$.sqlerrm_varno = var->dno;
-                                               plpgsql_add_initdatums(NULL);
-                                       }
-                               ;
 
 decl_sect              : opt_label
                                        {
index 7e2942a729925b3b619a4bd94ac9d3b76d65c5f4..780f1d2af6a9e5207febbf8748d5bffaf157b382 100644 (file)
@@ -180,7 +180,6 @@ static Datum exec_simple_cast_value(Datum value, Oid valtype,
 static void exec_init_tuple_store(PLpgSQL_execstate *estate);
 static bool compatible_tupdesc(TupleDesc td1, TupleDesc td2);
 static void exec_set_found(PLpgSQL_execstate *estate, bool state);
-static char *unpack_sql_state(int ssval);
 
 
 /* ----------
@@ -748,20 +747,6 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block)
        int                     i;
        int                     n;
 
-
-       /* setup SQLSTATE and SQLERRM */
-       PLpgSQL_var *var;
-  
-       var = (PLpgSQL_var *) (estate->datums[block->sqlstate_varno]);
-       var->isnull = false;
-       var->freeval = true;
-       var->value = DirectFunctionCall1(textin, CStringGetDatum("00000"));
-  
-       var = (PLpgSQL_var *) (estate->datums[block->sqlerrm_varno]);
-       var->isnull = false;
-       var->freeval = true;
-       var->value = DirectFunctionCall1(textin, CStringGetDatum("Successful completion"));
-
        /*
         * First initialize all variables declared in this block
         */
@@ -777,7 +762,7 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block)
 
                                        if (var->freeval)
                                        {
-                                               pfree(DatumGetPointer(var->value));
+                                               pfree((void *) (var->value));
                                                var->freeval = false;
                                        }
 
@@ -870,15 +855,6 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block)
                        RollbackAndReleaseCurrentSubTransaction();
                        MemoryContextSwitchTo(oldcontext);
                        CurrentResourceOwner = oldowner;
-                       /* set SQLSTATE and SQLERRM variables */
-                       var = (PLpgSQL_var *) (estate->datums[block->sqlstate_varno]);
-                       pfree(DatumGetPointer(var->value));
-                       var->value = DirectFunctionCall1(textin, CStringGetDatum(unpack_sql_state(edata->sqlerrcode)));
-
-                       var = (PLpgSQL_var *) (estate->datums[block->sqlerrm_varno]);
-                       pfree(DatumGetPointer(var->value));
-                       var->value = DirectFunctionCall1(textin, CStringGetDatum(edata->message));
 
                        /*
                         * If AtEOSubXact_SPI() popped any SPI context of the subxact,
@@ -943,26 +919,6 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block)
        return PLPGSQL_RC_OK;
 }
 
-/* 
- * unpack MAKE_SQLSTATE code 
- * This code is copied from backend/utils/error/elog.c.
- */
-static char *
-unpack_sql_state(int ssval)
-{
-       static  char            tbuf[12];
-       int                     i;
-
-       for (i = 0; i < 5; i++)
-       {
-               tbuf[i] = PGUNSIXBIT(ssval);
-               ssval >>= 6;
-       }
-       tbuf[i] = '\0';
-       return tbuf;
-}
-
-
 
 /* ----------
  * exec_stmts                  Iterate over a list of statements
index 7b33329d75949ad2dde1bea224130149f617151a..809533a8dc85453aad25ae2c942bacc0dc7bba92 100644 (file)
@@ -336,11 +336,9 @@ typedef struct
        int                     lineno;
        char       *label;
        List       *body;                       /* List of statements */
-       List       *exceptions;         /* List of WHEN clauses */
-       int             n_initvars;
-       int        *initvarnos;
-       int             sqlstate_varno;
-       int             sqlerrm_varno;
+       List       *exceptions;         /* List of WHEN clauses */
+       int                     n_initvars;
+       int                *initvarnos;
 } PLpgSQL_stmt_block;
 
 
index aa50550f23f4e162c222fef83726a45f3505d8e9..08fbe46b3a240f4932ff382d3370ed20f44e580d 100644 (file)
@@ -2380,29 +2380,3 @@ ERROR:  control reached end of function without RETURN
 CONTEXT:  PL/pgSQL function "missing_return_expr"
 drop function void_return_expr();
 drop function missing_return_expr();
--- test SQLSTATE and SQLERRM
-create function trap_exceptions() returns void as $_$
-begin
-   begin
-     raise exception 'first exception';
-   exception when others then
-     raise notice '% %', SQLSTATE, SQLERRM;
-   end;
-   raise notice '% %', SQLSTATE, SQLERRM;
-   begin
-     raise exception 'last exception';
-   exception when others then
-     raise notice '% %', SQLSTATE, SQLERRM;
-   end;
-   return;
-end; $_$ language plpgsql;
-select trap_exceptions();
-NOTICE:  P0001 first exception
-NOTICE:  00000 Successful completion
-NOTICE:  P0001 last exception
- trap_exceptions 
------------------
-(1 row)
-
-drop function trap_exceptions();
index 3703587ad16c1cbccfc6d8a9ce9a3c0e923de580..7ea7c8c6e0c558243f82b891059b0a77a848debf 100644 (file)
@@ -2018,24 +2018,3 @@ select missing_return_expr();
 
 drop function void_return_expr();
 drop function missing_return_expr();
-
--- test SQLSTATE and SQLERRM
-create function trap_exceptions() returns void as $_$
-begin
-   begin
-     raise exception 'first exception';
-   exception when others then
-     raise notice '% %', SQLSTATE, SQLERRM;
-   end;
-   raise notice '% %', SQLSTATE, SQLERRM;
-   begin
-     raise exception 'last exception';
-   exception when others then
-     raise notice '% %', SQLSTATE, SQLERRM;
-   end;
-   return;
-end; $_$ language plpgsql;
-
-select trap_exceptions();
-
-drop function trap_exceptions();