refactor: Use include_triggers argument to pg_relation_is_updatable instead of manual check

This commit is contained in:
Wolfgang Walther
2021-10-26 19:15:02 +02:00
committed by Wolfgang Walther
parent 3b83f536ca
commit 8cde90b7fe
+7 -53
View File
@@ -325,44 +325,24 @@ accessibleTables =
c.relkind IN ('r','p') c.relkind IN ('r','p')
OR ( OR (
c.relkind IN ('v','f') c.relkind IN ('v','f')
AND (pg_relation_is_updatable(c.oid::regclass, FALSE) & 8) = 8 -- CMD_INSERT - see allTables query below for explanation
OR EXISTS ( AND (pg_relation_is_updatable(c.oid::regclass, TRUE) & 8) = 8
SELECT 1
FROM pg_trigger
WHERE
pg_trigger.tgrelid = c.oid
AND (pg_trigger.tgtype::integer & 69) = 69
)
) )
) AS insertable, ) AS insertable,
( (
c.relkind IN ('r','p') c.relkind IN ('r','p')
OR ( OR (
c.relkind IN ('v','f') c.relkind IN ('v','f')
AND (pg_relation_is_updatable(c.oid::regclass, FALSE) & 4) = 4
-- CMD_UPDATE -- CMD_UPDATE
OR EXISTS ( AND (pg_relation_is_updatable(c.oid::regclass, TRUE) & 4) = 4
SELECT 1
FROM pg_trigger
WHERE
pg_trigger.tgrelid = c.oid
and (pg_trigger.tgtype::integer & 81) = 81
)
) )
) as updatable, ) as updatable,
( (
c.relkind IN ('r','p') c.relkind IN ('r','p')
OR ( OR (
c.relkind IN ('v','f') c.relkind IN ('v','f')
AND (pg_relation_is_updatable(c.oid::regclass, FALSE) & 16) = 16
-- CMD_DELETE -- CMD_DELETE
OR EXISTS ( AND (pg_relation_is_updatable(c.oid::regclass, TRUE) & 16) = 16
SELECT 1
FROM pg_trigger
WHERE
pg_trigger.tgrelid = c.oid
and (pg_trigger.tgtype::integer & 73) = 73
)
) )
) as deletable ) as deletable
from from
@@ -479,52 +459,26 @@ allTables =
c.relkind IN ('r','p') c.relkind IN ('r','p')
OR ( OR (
c.relkind in ('v','f') c.relkind in ('v','f')
AND (pg_relation_is_updatable(c.oid::regclass, FALSE) & 8) = 8
-- The function `pg_relation_is_updateable` returns a bitmask where 8 -- The function `pg_relation_is_updateable` returns a bitmask where 8
-- corresponds to `1 << CMD_INSERT` in the PostgreSQL source code, i.e. -- corresponds to `1 << CMD_INSERT` in the PostgreSQL source code, i.e.
-- it's possible to insert into the relation. -- it's possible to insert into the relation.
OR EXISTS ( AND (pg_relation_is_updatable(c.oid::regclass, TRUE) & 8) = 8
SELECT 1
FROM pg_trigger
WHERE
pg_trigger.tgrelid = c.oid
AND (pg_trigger.tgtype::integer & 69) = 69
-- The trigger type `tgtype` is a bitmask where 69 corresponds to
-- TRIGGER_TYPE_ROW + TRIGGER_TYPE_INSTEAD + TRIGGER_TYPE_INSERT
-- in the PostgreSQL source code.
)
) )
) AS insertable, ) AS insertable,
( (
c.relkind IN ('r','p') c.relkind IN ('r','p')
OR ( OR (
c.relkind in ('v','f') c.relkind in ('v','f')
AND (pg_relation_is_updatable(c.oid::regclass, FALSE) & 4) = 4
-- CMD_UPDATE -- CMD_UPDATE
OR EXISTS ( AND (pg_relation_is_updatable(c.oid::regclass, TRUE) & 4) = 4
SELECT 1
FROM pg_trigger
WHERE
pg_trigger.tgrelid = c.oid
and (pg_trigger.tgtype::integer & 81) = 81
-- TRIGGER_TYPE_ROW + TRIGGER_TYPE_INSTEAD + TRIGGER_TYPE_UPDATE
)
) )
) AS updatable, ) AS updatable,
( (
c.relkind IN ('r','p') c.relkind IN ('r','p')
OR ( OR (
c.relkind in ('v','f') c.relkind in ('v','f')
AND (pg_relation_is_updatable(c.oid::regclass, FALSE) & 16) = 16
-- CMD_DELETE -- CMD_DELETE
OR EXISTS ( AND (pg_relation_is_updatable(c.oid::regclass, TRUE) & 16) = 16
SELECT 1
FROM pg_trigger
WHERE
pg_trigger.tgrelid = c.oid
and (pg_trigger.tgtype::integer & 73) = 73
-- TRIGGER_TYPE_ROW + TRIGGER_TYPE_INSTEAD + TRIGGER_TYPE_DELETE
)
) )
) AS deletable ) AS deletable
FROM pg_class c FROM pg_class c