Bagaimana saya bisa melihat permintaan setelah aturan diterapkan?

9

Dari dokumen - 37.3.1.1. "Langkah Pertama, Langkah demi Langkah"

CREATE TABLE shoelace_log (
    sl_name    text,          -- shoelace changed
    sl_avail   integer,       -- new available value
    log_who    text,          -- who did it
    log_when   timestamp      -- when
);

CREATE RULE log_shoelace AS ON UPDATE TO shoelace_data
    WHERE NEW.sl_avail <> OLD.sl_avail
    DO INSERT INTO shoelace_log VALUES (
                                    NEW.sl_name,
                                    NEW.sl_avail,
                                    current_user,
                                    current_timestamp
                                );

Sekarang seseorang melakukannya:

(1) UPDATE shoelace_data SET sl_avail = 6 WHERE sl_name = 'sl7';

Dan parser menghasilkan kueri tambahan ini

(2) INSERT INTO shoelace_log VALUES (
       shoelace_data.sl_name, 6,
       current_user, current_timestamp )
  FROM shoelace_data
 WHERE 6 <> shoelace_data.sl_avail
   AND shoelace_data.sl_name = 'sl7';

Pertanyaannya adalah: Apakah ada alat untuk mengetahui bagaimana kueri (1) ditulis ulang menjadi (1) + (2)?

hegemon
sumber

Jawaban:

5

Tidak ada cara langsung untuk melihat representasi SQL dari permintaan yang ditulis ulang, karena penulisan ulang terjadi pada representasi internal tree, dan tidak mudah untuk mengubahnya kembali menjadi SQL. Hal terdekat adalah menyalakan parameter konfigurasi debug_print_rewritten, yang mencetak representasi dari format pohon internal ke log server. Jika Anda menggunakan ini bersamaan dengan pengaturan debug_print_parsedan debug_print_plan(dan mungkin debug_pretty_print), Anda dapat melihat bagaimana kueri diubah melalui berbagai tahapan. Formatnya tidak mudah dibaca, tetapi jika Anda tertarik mempelajari detailnya, formatnya mungkin layak.

Peter Eisentraut
sumber
Saya juga belajar bahwa EXPLAIN memberikan informasi tentang jumlah dan jenis kueri yang terlibat (dan jauh lebih mudah dibaca daripada log debug basis data :).
hegemon