2013/9/18 Jim Nasby <j...@nasby.net>

> On 9/14/13 11:55 PM, Pavel Stehule wrote:
>
>>
>>
>>
>> 2013/9/15 Marko Tiikkaja <ma...@joh.to <mailto:ma...@joh.to>>
>>
>>
>>     On 2013-09-15 00:09, Pavel Stehule wrote:
>>
>>         this is a possibility for introduction a new hook and possibility
>> implement
>>         asserions and similar task in generic form (as extension). it can
>> be
>>         assertions, tracing, profiling.
>>
>>
>>     You can already do tracing and profiling in an extension.  I don't
>> see what you would put inside the function body for these two, either.
>>
>>
>> you cannot mark a tracing points explicitly in current (unsupported now)
>> extensions.
>>
>> These functions share  same pattern:
>>
>> CREATE OR REPLACE FUNCTION assert(boolean)
>> RETURNS void AS $$
>> IF current_setting('plpgsq.**assertions') = 'on' THEN
>>    IF $1 THEN
>>      RAISE EXCEPTION 'Assert fails';
>>    END IF;
>> END IF;
>> END;
>> $$ LANGUAGE plpgsql;
>>
>> CREATE OR REPLACE FUNCTION trace(text)
>> RETURNS void AS $$
>> IF current_setting('plpgsq.trace'**) = 'on' THEN
>>      RAISE WARNING 'trace: %', $1; END IF;
>> END;
>> $$ LANGUAGE plpgsql;
>>
>> Depends on usage, these functions will not be extremely slow against to
>> builtin solution - can be faster, if we implement it in C, and little bit
>> faster if we implement it as internal PLpgSQL statement. But if you use a
>> one not simple queries, then overhead is not significant (probably).
>>
>> You have to watch some global state variable and then execute (or not)
>> some functionality.
>>
>
> FWIW, we've written a framework (currently available in the EnovaTools
> project on pgFoundry) that allows for very, very fine-grain control over
> asserts.
>
> - Every assert has a name (and an optional sub-name) as well as a level
> - You can globally set the minimum level that will trigger an assert. This
> is useful for some debugging stuff; have an assert with a negative level
> and normally it won't fire unless you set the minimum level to be less than
> zero.
> - You can disable an assert globally (across all backends)
> - You can disable an assert only within your session
>
> We should eventually allow for disabling an assert only for your
> transaction; we just haven't gotten around to it yet.
>
> The reason for all this flexibility is the concept of "it should be very
> difficult but not impossible for the code to do X". We use it for
> sanity-checking things.
>

I think so similar frameworks will be exists (we have some similar
functionality) in orafce too - and it is not reason why we should not merge
some function to core. I am with Marko, so some simple, user friendly
statement for assertions should be very nice plpgsql feature. I am
different in opinion how to implementat it and about syntax. I prefer a
possibility (not necessary currently implemented) to enhance this feature
for similar tasks (as buildin or external feature)

Probably You and me have a same opinion so only simple and very primitive
assert is not enough:

I see as useful feature for assertions:

a) possibility to specify a message (two parametric assert)
b) possibility to specify some threshold
c) possibility to specify some level (exception, warning, notice) ..
default should be exception
c) possibility to specify a handled/unhandled exception

Regards

Pavel





> --
> Jim C. Nasby, Data Architect                       j...@nasby.net
> 512.569.9461 (cell)                         http://jim.nasby.net
>

Reply via email to