Pages

Wednesday, August 5, 2020

plpgsql_check now supports tracing

The extension plpgsql_check can be used like linter, validator for PLpgSQL language. It can be used like profiler with possibility to calculate some basic coverage metrics. And now it can be used for code tracing. In this mode, plpgsql_check raises notice when function or statent is starting or is fininshing: Example of output in default verbosity level:
postgres=# do $$ begin perform fx(10,null, 'now', e'stěhule'); end; $$;
NOTICE:  #0   ->> start of block inline_code_block (oid=0)
NOTICE:  #2     ->> start of function fx(integer,integer,date,text) (oid=16405)
NOTICE:  #2          call by inline_code_block line 1 at PERFORM
NOTICE:  #2         "a" => '10', "b" => null, "c" => '2020-08-05', "d" => 'stěhule'
NOTICE:  #4       ->> start of function fx(integer) (oid=16404)
NOTICE:  #4            call by fx(integer,integer,date,text) line 1 at PERFORM
NOTICE:  #4           "a" => '10'
NOTICE:  #4       <<- end of function fx (elapsed time=0.336 ms)
NOTICE:  #2     <<- end of function fx (elapsed time=0.631 ms)
NOTICE:  #0   <<- end of block (elapsed time=0.978 ms)
DO
Example of output in verbose verbosity level:
postgres=# set plpgsql_check.tracer_verbosity TO verbose;
SET
postgres=# do $$ begin perform fx(10,null, 'now', e'stěhule'); end; $$;
NOTICE:  #0            ->> start of block inline_code_block (oid=0)
NOTICE:  #0.1       1  --> start of PERFORM (expr='fx(10,null, 'now', e'stěhule' ..')
NOTICE:  #2              ->> start of function fx(integer,integer,date,text) (oid=16405)
NOTICE:  #2                   call by inline_code_block line 1 at PERFORM
NOTICE:  #2                  "a" =>; '10', "b" => null, "c" => '2020-08-05', "d" => 'stěhule'
NOTICE:  #2.1       1    --> start of PERFORM (expr='fx(a)')
NOTICE:  #2.1                "a" => '10'
NOTICE:  #4                ->> start of function fx(integer) (oid=16404)
NOTICE:  #4                     call by fx(integer,integer,date,text) line 1 at PERFORM
NOTICE:  #4                    "a" => '10'
NOTICE:  #4.3       6      --> start of IF (cond='a > 10')
NOTICE:  #4.3                  "a" => '10'
NOTICE:  #4.3       8          ELSEIF (expr='a < 0')
NOTICE:  #4.3                  "a" => '10'
NOTICE:  #4.3              <-- end of IF (elapsed time=0.056 ms)
NOTICE:  #4.4      12      --> start of assignment (expr='100 + a + b')
NOTICE:  #4.4                  "a" => '10', "b" => '20'
NOTICE:  #4.4              <-- end of assignment (elapsed time=0.024 ms)
NOTICE:  #4.4                  "res" => '130'
NOTICE:  #4.5      13      --> start of RETURN
NOTICE:  #4.5                  "res" => '130'
NOTICE:  #4.5              <-- end of RETURN (elapsed time=0.045 ms)
NOTICE:  #4                <<- end of function fx (elapsed time=0.248 ms)
NOTICE:  #2.1            <-- end of PERFORM (elapsed time=0.354 ms)
NOTICE:  #2              <<- end of function fx (elapsed time=0.441 ms)
NOTICE:  #0.1          <-- end of PERFORM (elapsed time=0.710 ms)
NOTICE:  #0            <<- end of block (elapsed time=0.777 ms)

No comments:

Post a Comment