|
3 | 3 | * procedural language
|
4 | 4 | *
|
5 | 5 | * IDENTIFICATION
|
6 |
| - * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.138 2005/05/06 17:24:55 tgl Exp $ |
| 6 | + * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.139 2005/05/26 00:16:31 momjian Exp $ |
7 | 7 | *
|
8 | 8 | * This software is copyrighted by Jan Wieck - Hamburg.
|
9 | 9 | *
|
@@ -180,6 +180,7 @@ static Datum exec_simple_cast_value(Datum value, Oid valtype,
|
180 | 180 | staticvoidexec_init_tuple_store(PLpgSQL_execstate*estate);
|
181 | 181 | staticboolcompatible_tupdesc(TupleDesctd1,TupleDesctd2);
|
182 | 182 | staticvoidexec_set_found(PLpgSQL_execstate*estate,boolstate);
|
| 183 | +staticchar*unpack_sql_state(intssval); |
183 | 184 |
|
184 | 185 |
|
185 | 186 | /* ----------
|
@@ -747,6 +748,20 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block)
|
747 | 748 | inti;
|
748 | 749 | intn;
|
749 | 750 |
|
| 751 | + |
| 752 | +/* setup SQLSTATE and SQLERRM */ |
| 753 | +PLpgSQL_var*var; |
| 754 | + |
| 755 | +var= (PLpgSQL_var*) (estate->datums[block->sqlstate_varno]); |
| 756 | +var->isnull= false; |
| 757 | +var->freeval= true; |
| 758 | +var->value=DirectFunctionCall1(textin,CStringGetDatum("00000")); |
| 759 | + |
| 760 | +var= (PLpgSQL_var*) (estate->datums[block->sqlerrm_varno]); |
| 761 | +var->isnull= false; |
| 762 | +var->freeval= true; |
| 763 | +var->value=DirectFunctionCall1(textin,CStringGetDatum("Sucessful completion")); |
| 764 | + |
750 | 765 | /*
|
751 | 766 | * First initialize all variables declared in this block
|
752 | 767 | */
|
@@ -855,6 +870,16 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block)
|
855 | 870 | RollbackAndReleaseCurrentSubTransaction();
|
856 | 871 | MemoryContextSwitchTo(oldcontext);
|
857 | 872 | CurrentResourceOwner=oldowner;
|
| 873 | + |
| 874 | +/* set SQLSTATE and SQLERRM variables */ |
| 875 | + |
| 876 | +var= (PLpgSQL_var*) (estate->datums[block->sqlstate_varno]); |
| 877 | +pfree((void*) (var->value)); |
| 878 | +var->value=DirectFunctionCall1(textin,CStringGetDatum(unpack_sql_state(edata->sqlerrcode))); |
| 879 | + |
| 880 | +var= (PLpgSQL_var*) (estate->datums[block->sqlerrm_varno]); |
| 881 | +pfree((void*) (var->value)); |
| 882 | +var->value=DirectFunctionCall1(textin,CStringGetDatum(edata->message)); |
858 | 883 |
|
859 | 884 | /*
|
860 | 885 | * If AtEOSubXact_SPI() popped any SPI context of the subxact,
|
@@ -919,6 +944,26 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block)
|
919 | 944 | returnPLPGSQL_RC_OK;
|
920 | 945 | }
|
921 | 946 |
|
| 947 | +/* |
| 948 | + * unpack MAKE_SQLSTATE code |
| 949 | + * This code is copied from backend/utils/error/elog.c. |
| 950 | + */ |
| 951 | +staticchar* |
| 952 | +unpack_sql_state(intssval) |
| 953 | +{ |
| 954 | +staticchartbuf[12]; |
| 955 | +inti; |
| 956 | + |
| 957 | +for (i=0;i<5;i++) |
| 958 | +{ |
| 959 | +tbuf[i]=PGUNSIXBIT(ssval); |
| 960 | +ssval >>=6; |
| 961 | + } |
| 962 | +tbuf[i]='\0'; |
| 963 | +returntbuf; |
| 964 | +} |
| 965 | + |
| 966 | + |
922 | 967 |
|
923 | 968 | /* ----------
|
924 | 969 | * exec_stmtsIterate over a list of statements
|
|