1

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.