Topic: PostgreSQL stupid-circuit evaluation
satu hal yang agak menyebalkan di postgres adalah caranya menangani
short-circuit evaluation dalam fungsi trigger yang tidak umum (dibandingkan
dengan misalnya: oracle atau firebirdsql).
status nilai .OLD dan .NEW di postgres (juga rdbms lainnya) adalah sbb:
EVENT .OLD .NEW
---------------------------
INSERT ERR Y
UPDATE Y Y
DELETE Y ERR
misalkan contoh cuplikan fungsi sbb:
...
if tg_op = 'DELETE' then
_var1 := OLD.Field1;
else
_var1 := NEW.Field1;
if tg_op = 'UPDATE' then
_var2 := OLD.Field2;
end if
end if;
...di postgres harus dipisah jadi tiga ekspresi sbb:
...
if tg_op = 'DELETE' then
_var1 := OLD.Field1;
end if;
if tg_op = 'INSERT' then
_var1 := NEW.Field1;
end if;
if tg_op = 'UPDATE' then
_var1 := NEW.Field1;
_var2 := OLD.Field2;
end if;
...atau setidaknya sbb (dengan toggled boolean yang menambahkan kerumitan yang tidak perlu):
...
if tg_op = 'DELETE' then
_var1 := OLD.Field1;
end if;
if tg_op <> DELETE then
_var1 := NEW.Field1;
if tg_op = 'UPDATE' then
_var2 := OLD.Field2;
end if
end if;
...dalam contoh yang pertama kita bisa terjebak error: OLD is undefined.
pada saat instruksi INSERT memicu trigger, atau sebaliknya NEW is
undefined pada saat DELETE.
penyebabnya adalah karena ekspresi IF diinterpretasi oleh evaluator
sekaligus secara keseluruhan (termasuk seluruh variabel di dalamnya,
tanpa memandang apakah variabel tsb digunakan/diakses ataukah tidak).
hal ini praktis menihilkan logika yang kita susun justru untuk mencegah
nilai-nilai undefined tsb.
mungkin versi postgres mendatang akan memiliki evaluator yang lebih cerdas
tapi untuk sementara ini harus diperhatikan 'kegagapan' postgres diatas
dalam membuat multi-events trigger.
