¿Cómo puedo ver una consulta después de que se hayan aplicado las reglas?

9

De documentos - 37.3.1.1. "Una primera regla paso a paso"

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
                                );

Ahora alguien hace:

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

Y el analizador genera esta consulta adicional

(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';

La pregunta es: ¿hay alguna herramienta para saber cómo se reescribe la consulta (1) en (1) + (2)?

hegemon
fuente

Respuestas:

5

No hay una forma directa de ver una representación SQL de la consulta reescrita, porque la reescritura ocurre en una representación interna del árbol, y no es fácil volver a convertir esto en SQL. Lo más cercano es activar el parámetro de configuración debug_print_rewritten, que imprime una representación de ese formato de árbol interno en el registro del servidor. Si usa esto junto con la configuración debug_print_parsey debug_print_plan(y posiblemente debug_pretty_print), puede ver cómo se transforma la consulta a través de las distintas etapas. El formato no es fácil de leer, pero si está interesado en conocer los detalles de esto, probablemente valdrá la pena.

Peter Eisentraut
fuente
También aprendí que EXPLAIN brinda información sobre el número y tipo de consultas involucradas (y es mucho más legible que el registro de depuración de la base de datos :).
hegemon