plpgsql_lint - prosba o otestovani

16 zobrazení
Přeskočit na první nepřečtenou zprávu

Pavel Stěhule

nepřečteno,
8. 7. 2011 12:58:5608.07.11
komu: PostgreSQL-cz
Ahoj,

dodelavam jeden trochu vetsi projekt v PL/pgSQL a uz mne zacal stvat
zpusob, jak se v plpgsql, kontroluji SQL prikazy a vyrazy - tj pri
kompilaci se zjisti syntakticka spravnost, ale uz se nezjistuje
semanticka spravnost - zda-li sedi nazvy promennych a nazvy sloupcu.
Semanticka spravnost se zjisti az pri prvnim vyhodnoceni toho ci onoho
vyrazu (dotazu), coz se taky hned nemusi povest zjistit - navic, v
kombinaci s "EXCEPTION WHEN OTHERS THEN" se zjistuje dost spatne.

Abych si trochu usnadnil zivot, tak jsem si napsal modul, ktery kdyz
se zavede, tak zajisti, ze se po startu funkce zkontroluji vsechny
vyrazy, sql prikazy, ktere funkce obsahuje. Primarne je to napsane pro
9.0 a tuto verzi chci do budoucna rozvijet. Vzhledem k rozsireni 8.4
jsem jeste udelal backport pro 8.4. K dispozici jsou zdrojaky - modul
je nutne prelozit.

http://kix.fsv.cvut.cz/~stehule/download/plpgsql_lint.tgz

Jak to zhruba funguje?

Mam funkci, ktera obsahuje chybu - "kuku"

CREATE OR REPLACE FUNCTION public.kuku(a integer)
RETURNS integer
LANGUAGE plpgsql
AS $function$
begin
if (a > 10) then
return b + 1;
else
return a + 1;
end if;
end;
$function$;

ve vyrazu v prvnim RETURN je pouzita promenna "b", ktera neexistuje.
Na tuto chybu prijdu jen tehdy, kdyz funkci spustim s parametrem
vetsim nez 10:

postgres=# select kuku(11);
ERROR: column "b" does not exist
LINE 1: SELECT b + 1
^
QUERY: SELECT b + 1
CONTEXT: PL/pgSQL function "kuku" line 3 at RETURN
postgres=# select kuku(1);
kuku
------
2
(1 row)

Pricemz ale s parametrem mensim nebo rovno 10 funkce probehne bez
chyby - prestoze se jedna o statickou chybu.

Po zavedeni modulu (jeste drive se musi zavest modul plpgsql)

postgres=# load 'plpgsql';
LOAD
postgres=# load 'plpgsql_lint';
LOAD

se zacnou kontrolovat vsechny vyrazy uvnitr funkce - nejen ty prave
prvne provadene:

postgres=# select kuku(1);
ERROR: column "b" does not exist
LINE 1: SELECT b + 1
^
QUERY: SELECT b + 1
CONTEXT: PL/pgSQL function "kuku" line 3 at RETURN

Kontrolu lze vypnout:

a) ukoncenim session
b) nastavenim SET plpgsql.disable_lint to on;
c) atributem funkce

postgres=# CREATE OR REPLACE FUNCTION public.kuku(a integer)
RETURNS integer
LANGUAGE plpgsql
AS $function$
begin
if (a > 10) then
return b + 1;
else
return a + 1;
end if;
end;
$function$ SET plpgsql.disable_lint = on

Napriklad u funkci, ktere pracuji s docasnymi tabulkami nelze tuto
kontrolu pouzit - protoze v dobe zahajeni vykonavani funkce tyto
docasne tabulky jeste nemohou existovat.

Melo by to identifikovat chyby typu pouziti nedeklarovane promenne,
pouziti neexistujiciho sloupce, tabulky, tam kde ty chyby jsou, nemelo
by to padat, pripadne hlasit falesne chyby, pokud funkce chyby
neobsahuje. A s tim bych potreboval pomoct - jestli muzete tento modul
vyzkouset na svem kodu - jednak Vam muze pomoci najit chyby o kterych
nevite, jednak mi muzete pomoci otestovat tento modul, ktery mohou
pouzivat ostatni vyvojari v plpgsql.

Jak s pozitivnimi, tak negativnimi vysledky se mi, prosim, ozvete.

Zdravim a preji hezky vikend

Pavel

p.s. Tato verze je a bude v ₊/- stavajicim rozsahu dostupna pod BSD
licenci. Planuji pridani jeste jednoducheho coverage testu.
Odpovědět všem
Odpověď autorovi
Přeposlat
0 nových zpráv