Обсуждение: trappable warnings, dynamic change of minimal level for PG_RE_THROW

Поиск
Список
Период
Сортировка

trappable warnings, dynamic change of minimal level for PG_RE_THROW

От
"Pavel Stehule"
Дата:
Hello

SQL/PSM concept of condition's handlers suppouses so all signals (all levels 
of exception's) are trappable. Common construct is:
begin declare finish boolean default false; declare continue handler for sqlwarning set finish = true; open cursor
whilenot finish do    fetch from cursor end while; close cursor;
 
end;

Every compound statement in sql/psm has default empty continue handler for 
success, warning and not found signal's.

Current code in errfinish (elog.c) throw signal only when level is error.
     if (elevel == ERROR)       {               ...               PG_RE_THROW();       }

I have to dynamicly change this level for all sql/psm block. Can be solution 
using of global variable? Like error_context_stack?

hypotetic code from pl/plpgsql/src/pl_exec.c

static int
exec_stmt_block(PLpgPSM_execstate *estate, PLpgPSM_stmt_block *block)
{    int current_min_level =  error_min_level;    /* global variable from 
elog.c */
    min_level = INFO;    ....    PG_TRY()      ....    PG_CATCH()      ....    PG_END_TRY()
    error_min_level = current_min_level;
}

Is it safe?  Any ideas?

Regards
Pavel Stehule

_________________________________________________________________
Chcete sdilet sve obrazky a hudbu s prateli? http://messenger.msn.cz/



Re: trappable warnings, dynamic change of minimal level for PG_RE_THROW

От
Tom Lane
Дата:
"Pavel Stehule" <pavel.stehule@hotmail.com> writes:
> Current code in errfinish (elog.c) throw signal only when level is error.
> I have to dynamicly change this level for all sql/psm block. Can be solution 
> using of global variable? Like error_context_stack?

You certainly would not want to use TRY/CATCH to handle warnings,
because that way would cause the statement to be aborted before
completion, quite possibly without essential cleanup.  Another problem
is that the conditions you are interested don't produce elog messages at
all (and shouldn't).  You need a new mechanism for this, likely.
        regards, tom lane