agora inbox for [email protected]
help / color / mirror / Atom feedBUG #15448: server process (PID 22656) was terminated by exception 0xC0000005
26+ messages / 8 participants
[nested] [flat]
* BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005
@ 2018-10-22 12:34 PG Bug reporting form <[email protected]>
2018-10-23 02:00 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Amit Langote <[email protected]>
0 siblings, 1 reply; 26+ messages in thread
From: PG Bug reporting form @ 2018-10-22 12:34 UTC (permalink / raw)
To: [email protected]; +Cc: [email protected]
The following bug has been logged on the website:
Bug reference: 15448
Logged by: Tillmann Schulz
Email address: [email protected]
PostgreSQL version: 11.0
Operating system: Windows
Description:
I have a reproducable error when running two junit test cases in sequence
from Java with Postgres 11.0.1. With postgres 10 everything worked fine.
The error occurs at
2018-10-22 14:06:59.651 CEST [22696] LOG: server process (PID 22656) was
terminated by exception 0xC0000005
2018-10-22 14:06:59.651 CEST [22696] DETAIL: Failed process was running:
delete from c5_member
Aft that, postgres is in recovery mode. Shortly after that the database is
availiably again.
The complete log of both testcases is:
2018-10-22 14:06:56.963 CEST [18768] LOG: duration: 0.639 ms parse
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:56.963 CEST [18768] LOG: duration: 0.011 ms bind
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:56.963 CEST [18768] LOG: duration: 0.019 ms execute
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:56.965 CEST [18768] LOG: duration: 0.049 ms parse
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:56.965 CEST [18768] LOG: duration: 0.028 ms bind
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:56.965 CEST [18768] LOG: duration: 0.015 ms execute
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:57.033 CEST [18768] LOG: duration: 3.968 ms parse
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND (false OR (
c.relkind IN ('r','p') AND n.nspname !~ '^pg_' AND n.nspname <>
'information_schema' ) ) ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:57.037 CEST [18768] LOG: duration: 3.690 ms bind
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND (false OR (
c.relkind IN ('r','p') AND n.nspname !~ '^pg_' AND n.nspname <>
'information_schema' ) ) ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:57.037 CEST [18768] LOG: duration: 0.272 ms execute
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND (false OR (
c.relkind IN ('r','p') AND n.nspname !~ '^pg_' AND n.nspname <>
'information_schema' ) ) ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:57.047 CEST [18768] LOG: duration: 0.077 ms parse
<unnamed>: DROP TABLE c5_global_security_config
2018-10-22 14:06:57.047 CEST [18768] LOG: duration: 0.006 ms bind
<unnamed>: DROP TABLE c5_global_security_config
2018-10-22 14:06:57.048 CEST [18768] DEBUG: relation
"c5_global_security_config" does not exist
2018-10-22 14:06:57.048 CEST [18768] STATEMENT: DROP TABLE
c5_global_security_config
2018-10-22 14:06:57.048 CEST [18768] ERROR: table
"c5_global_security_config" does not exist
2018-10-22 14:06:57.048 CEST [18768] STATEMENT: DROP TABLE
c5_global_security_config
2018-10-22 14:06:57.050 CEST [18768] LOG: duration: 0.027 ms parse
<unnamed>: DROP TABLE c5_tracking_protocol
2018-10-22 14:06:57.050 CEST [18768] LOG: duration: 0.006 ms bind
<unnamed>: DROP TABLE c5_tracking_protocol
2018-10-22 14:06:57.050 CEST [18768] DEBUG: relation "c5_tracking_protocol"
does not exist
2018-10-22 14:06:57.050 CEST [18768] STATEMENT: DROP TABLE
c5_tracking_protocol
2018-10-22 14:06:57.050 CEST [18768] ERROR: table "c5_tracking_protocol"
does not exist
2018-10-22 14:06:57.050 CEST [18768] STATEMENT: DROP TABLE
c5_tracking_protocol
2018-10-22 14:06:57.051 CEST [18768] LOG: duration: 0.016 ms parse
<unnamed>: DROP TABLE c5_restart_sending_queue_entry
2018-10-22 14:06:57.051 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_restart_sending_queue_entry
2018-10-22 14:06:57.051 CEST [18768] DEBUG: relation
"c5_restart_sending_queue_entry" does not exist
2018-10-22 14:06:57.051 CEST [18768] STATEMENT: DROP TABLE
c5_restart_sending_queue_entry
2018-10-22 14:06:57.051 CEST [18768] ERROR: table
"c5_restart_sending_queue_entry" does not exist
2018-10-22 14:06:57.051 CEST [18768] STATEMENT: DROP TABLE
c5_restart_sending_queue_entry
2018-10-22 14:06:57.051 CEST [18768] LOG: duration: 0.011 ms parse
<unnamed>: DROP TABLE c5_tracking_permission_event
2018-10-22 14:06:57.051 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_tracking_permission_event
2018-10-22 14:06:57.051 CEST [18768] DEBUG: relation
"c5_tracking_permission_event" does not exist
2018-10-22 14:06:57.051 CEST [18768] STATEMENT: DROP TABLE
c5_tracking_permission_event
2018-10-22 14:06:57.051 CEST [18768] ERROR: table
"c5_tracking_permission_event" does not exist
2018-10-22 14:06:57.051 CEST [18768] STATEMENT: DROP TABLE
c5_tracking_permission_event
2018-10-22 14:06:57.052 CEST [18768] LOG: duration: 0.012 ms parse
<unnamed>: DROP TABLE c5_tracking_permission_state
2018-10-22 14:06:57.052 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_tracking_permission_state
2018-10-22 14:06:57.052 CEST [18768] DEBUG: relation
"c5_tracking_permission_state" does not exist
2018-10-22 14:06:57.052 CEST [18768] STATEMENT: DROP TABLE
c5_tracking_permission_state
2018-10-22 14:06:57.052 CEST [18768] ERROR: table
"c5_tracking_permission_state" does not exist
2018-10-22 14:06:57.052 CEST [18768] STATEMENT: DROP TABLE
c5_tracking_permission_state
2018-10-22 14:06:57.052 CEST [18768] LOG: duration: 0.010 ms parse
<unnamed>: DROP TABLE c5_subscription_state
2018-10-22 14:06:57.052 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_subscription_state
2018-10-22 14:06:57.052 CEST [18768] DEBUG: relation
"c5_subscription_state" does not exist
2018-10-22 14:06:57.052 CEST [18768] STATEMENT: DROP TABLE
c5_subscription_state
2018-10-22 14:06:57.052 CEST [18768] ERROR: table "c5_subscription_state"
does not exist
2018-10-22 14:06:57.052 CEST [18768] STATEMENT: DROP TABLE
c5_subscription_state
2018-10-22 14:06:57.052 CEST [18768] LOG: duration: 0.012 ms parse
<unnamed>: DROP TABLE c5_qrtz_locks
2018-10-22 14:06:57.052 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_qrtz_locks
2018-10-22 14:06:57.052 CEST [18768] DEBUG: relation "c5_qrtz_locks" does
not exist
2018-10-22 14:06:57.052 CEST [18768] STATEMENT: DROP TABLE c5_qrtz_locks
2018-10-22 14:06:57.053 CEST [18768] ERROR: table "c5_qrtz_locks" does not
exist
2018-10-22 14:06:57.053 CEST [18768] STATEMENT: DROP TABLE c5_qrtz_locks
2018-10-22 14:06:57.053 CEST [18768] LOG: duration: 0.010 ms parse
<unnamed>: DROP TABLE c5_qrtz_scheduler_state
2018-10-22 14:06:57.053 CEST [18768] LOG: duration: 0.006 ms bind
<unnamed>: DROP TABLE c5_qrtz_scheduler_state
2018-10-22 14:06:57.053 CEST [18768] DEBUG: relation
"c5_qrtz_scheduler_state" does not exist
2018-10-22 14:06:57.053 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_scheduler_state
2018-10-22 14:06:57.053 CEST [18768] ERROR: table "c5_qrtz_scheduler_state"
does not exist
2018-10-22 14:06:57.053 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_scheduler_state
2018-10-22 14:06:57.053 CEST [18768] LOG: duration: 0.009 ms parse
<unnamed>: DROP TABLE c5_qrtz_fired_triggers
2018-10-22 14:06:57.053 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_qrtz_fired_triggers
2018-10-22 14:06:57.053 CEST [18768] DEBUG: relation
"c5_qrtz_fired_triggers" does not exist
2018-10-22 14:06:57.053 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_fired_triggers
2018-10-22 14:06:57.053 CEST [18768] ERROR: table "c5_qrtz_fired_triggers"
does not exist
2018-10-22 14:06:57.053 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_fired_triggers
2018-10-22 14:06:57.054 CEST [18768] LOG: duration: 0.011 ms parse
<unnamed>: DROP TABLE c5_qrtz_paused_trigger_grps
2018-10-22 14:06:57.054 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_qrtz_paused_trigger_grps
2018-10-22 14:06:57.054 CEST [18768] DEBUG: relation
"c5_qrtz_paused_trigger_grps" does not exist
2018-10-22 14:06:57.054 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_paused_trigger_grps
2018-10-22 14:06:57.054 CEST [18768] ERROR: table
"c5_qrtz_paused_trigger_grps" does not exist
2018-10-22 14:06:57.054 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_paused_trigger_grps
2018-10-22 14:06:57.054 CEST [18768] LOG: duration: 0.012 ms parse
<unnamed>: DROP TABLE c5_qrtz_calendars
2018-10-22 14:06:57.054 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_qrtz_calendars
2018-10-22 14:06:57.054 CEST [18768] DEBUG: relation "c5_qrtz_calendars"
does not exist
2018-10-22 14:06:57.054 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_calendars
2018-10-22 14:06:57.054 CEST [18768] ERROR: table "c5_qrtz_calendars" does
not exist
2018-10-22 14:06:57.054 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_calendars
2018-10-22 14:06:57.054 CEST [18768] LOG: duration: 0.015 ms parse
<unnamed>: DROP TABLE c5_qrtz_blob_triggers
2018-10-22 14:06:57.055 CEST [18768] LOG: duration: 0.005 ms bind
<unnamed>: DROP TABLE c5_qrtz_blob_triggers
2018-10-22 14:06:57.055 CEST [18768] DEBUG: relation
"c5_qrtz_blob_triggers" does not exist
2018-10-22 14:06:57.055 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_blob_triggers
2018-10-22 14:06:57.055 CEST [18768] ERROR: table "c5_qrtz_blob_triggers"
does not exist
2018-10-22 14:06:57.055 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_blob_triggers
2018-10-22 14:06:57.055 CEST [18768] LOG: duration: 0.015 ms parse
<unnamed>: DROP TABLE c5_qrtz_simprop_triggers
2018-10-22 14:06:57.055 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_qrtz_simprop_triggers
2018-10-22 14:06:57.055 CEST [18768] DEBUG: relation
"c5_qrtz_simprop_triggers" does not exist
2018-10-22 14:06:57.055 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_simprop_triggers
2018-10-22 14:06:57.055 CEST [18768] ERROR: table
"c5_qrtz_simprop_triggers" does not exist
2018-10-22 14:06:57.055 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_simprop_triggers
2018-10-22 14:06:57.055 CEST [18768] LOG: duration: 0.016 ms parse
<unnamed>: DROP TABLE c5_qrtz_cron_triggers
2018-10-22 14:06:57.055 CEST [18768] LOG: duration: 0.005 ms bind
<unnamed>: DROP TABLE c5_qrtz_cron_triggers
2018-10-22 14:06:57.056 CEST [18768] DEBUG: relation
"c5_qrtz_cron_triggers" does not exist
2018-10-22 14:06:57.056 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_cron_triggers
2018-10-22 14:06:57.056 CEST [18768] ERROR: table "c5_qrtz_cron_triggers"
does not exist
2018-10-22 14:06:57.056 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_cron_triggers
2018-10-22 14:06:57.057 CEST [18768] LOG: duration: 0.078 ms parse
<unnamed>: DROP TABLE c5_qrtz_simple_triggers
2018-10-22 14:06:57.057 CEST [18768] LOG: duration: 0.009 ms bind
<unnamed>: DROP TABLE c5_qrtz_simple_triggers
2018-10-22 14:06:57.057 CEST [18768] DEBUG: relation
"c5_qrtz_simple_triggers" does not exist
2018-10-22 14:06:57.057 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_simple_triggers
2018-10-22 14:06:57.057 CEST [18768] ERROR: table "c5_qrtz_simple_triggers"
does not exist
2018-10-22 14:06:57.057 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_simple_triggers
2018-10-22 14:06:57.057 CEST [18768] LOG: duration: 0.014 ms parse
<unnamed>: DROP TABLE c5_qrtz_triggers
2018-10-22 14:06:57.057 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_qrtz_triggers
2018-10-22 14:06:57.057 CEST [18768] DEBUG: relation "c5_qrtz_triggers"
does not exist
2018-10-22 14:06:57.057 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_triggers
2018-10-22 14:06:57.057 CEST [18768] ERROR: table "c5_qrtz_triggers" does
not exist
2018-10-22 14:06:57.057 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_triggers
2018-10-22 14:06:57.058 CEST [18768] LOG: duration: 0.011 ms parse
<unnamed>: DROP TABLE c5_qrtz_job_details
2018-10-22 14:06:57.058 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_qrtz_job_details
2018-10-22 14:06:57.058 CEST [18768] DEBUG: relation "c5_qrtz_job_details"
does not exist
2018-10-22 14:06:57.058 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_job_details
2018-10-22 14:06:57.058 CEST [18768] ERROR: table "c5_qrtz_job_details"
does not exist
2018-10-22 14:06:57.058 CEST [18768] STATEMENT: DROP TABLE
c5_qrtz_job_details
2018-10-22 14:06:57.058 CEST [18768] LOG: duration: 0.010 ms parse
<unnamed>: DROP TABLE c5_data_exchange_activation
2018-10-22 14:06:57.058 CEST [18768] LOG: duration: 0.005 ms bind
<unnamed>: DROP TABLE c5_data_exchange_activation
2018-10-22 14:06:57.058 CEST [18768] DEBUG: relation
"c5_data_exchange_activation" does not exist
2018-10-22 14:06:57.058 CEST [18768] STATEMENT: DROP TABLE
c5_data_exchange_activation
2018-10-22 14:06:57.058 CEST [18768] ERROR: table
"c5_data_exchange_activation" does not exist
2018-10-22 14:06:57.058 CEST [18768] STATEMENT: DROP TABLE
c5_data_exchange_activation
2018-10-22 14:06:57.059 CEST [18768] LOG: duration: 0.013 ms parse
<unnamed>: DROP TABLE c5_import_execution_config
2018-10-22 14:06:57.059 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_import_execution_config
2018-10-22 14:06:57.059 CEST [18768] DEBUG: relation
"c5_import_execution_config" does not exist
2018-10-22 14:06:57.059 CEST [18768] STATEMENT: DROP TABLE
c5_import_execution_config
2018-10-22 14:06:57.059 CEST [18768] ERROR: table
"c5_import_execution_config" does not exist
2018-10-22 14:06:57.059 CEST [18768] STATEMENT: DROP TABLE
c5_import_execution_config
2018-10-22 14:06:57.064 CEST [18768] LOG: duration: 0.025 ms parse
<unnamed>: DROP TABLE c5_import_config
2018-10-22 14:06:57.064 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_import_config
2018-10-22 14:06:57.064 CEST [18768] DEBUG: relation "c5_import_config"
does not exist
2018-10-22 14:06:57.064 CEST [18768] STATEMENT: DROP TABLE
c5_import_config
2018-10-22 14:06:57.064 CEST [18768] ERROR: table "c5_import_config" does
not exist
2018-10-22 14:06:57.064 CEST [18768] STATEMENT: DROP TABLE
c5_import_config
2018-10-22 14:06:57.065 CEST [18768] LOG: duration: 0.026 ms parse
<unnamed>: DROP TABLE c5_data_exchange_file_prot
2018-10-22 14:06:57.065 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_data_exchange_file_prot
2018-10-22 14:06:57.065 CEST [18768] DEBUG: relation
"c5_data_exchange_file_prot" does not exist
2018-10-22 14:06:57.065 CEST [18768] STATEMENT: DROP TABLE
c5_data_exchange_file_prot
2018-10-22 14:06:57.065 CEST [18768] ERROR: table
"c5_data_exchange_file_prot" does not exist
2018-10-22 14:06:57.065 CEST [18768] STATEMENT: DROP TABLE
c5_data_exchange_file_prot
2018-10-22 14:06:57.065 CEST [18768] LOG: duration: 0.010 ms parse
<unnamed>: DROP TABLE c5_data_exchange_import_file
2018-10-22 14:06:57.065 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_data_exchange_import_file
2018-10-22 14:06:57.065 CEST [18768] DEBUG: relation
"c5_data_exchange_import_file" does not exist
2018-10-22 14:06:57.065 CEST [18768] STATEMENT: DROP TABLE
c5_data_exchange_import_file
2018-10-22 14:06:57.065 CEST [18768] ERROR: table
"c5_data_exchange_import_file" does not exist
2018-10-22 14:06:57.065 CEST [18768] STATEMENT: DROP TABLE
c5_data_exchange_import_file
2018-10-22 14:06:57.065 CEST [18768] LOG: duration: 0.009 ms parse
<unnamed>: DROP TABLE c5_data_exchange_queue
2018-10-22 14:06:57.065 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_data_exchange_queue
2018-10-22 14:06:57.066 CEST [18768] DEBUG: relation
"c5_data_exchange_queue" does not exist
2018-10-22 14:06:57.066 CEST [18768] STATEMENT: DROP TABLE
c5_data_exchange_queue
2018-10-22 14:06:57.066 CEST [18768] ERROR: table "c5_data_exchange_queue"
does not exist
2018-10-22 14:06:57.066 CEST [18768] STATEMENT: DROP TABLE
c5_data_exchange_queue
2018-10-22 14:06:57.066 CEST [18768] LOG: duration: 0.010 ms parse
<unnamed>: DROP TABLE c5_data_exchange_execution
2018-10-22 14:06:57.066 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_data_exchange_execution
2018-10-22 14:06:57.066 CEST [18768] DEBUG: relation
"c5_data_exchange_execution" does not exist
2018-10-22 14:06:57.066 CEST [18768] STATEMENT: DROP TABLE
c5_data_exchange_execution
2018-10-22 14:06:57.066 CEST [18768] ERROR: table
"c5_data_exchange_execution" does not exist
2018-10-22 14:06:57.066 CEST [18768] STATEMENT: DROP TABLE
c5_data_exchange_execution
2018-10-22 14:06:57.066 CEST [18768] LOG: duration: 0.018 ms parse
<unnamed>: DROP TABLE c5_data_exchange
2018-10-22 14:06:57.066 CEST [18768] LOG: duration: 0.006 ms bind
<unnamed>: DROP TABLE c5_data_exchange
2018-10-22 14:06:57.067 CEST [18768] DEBUG: relation "c5_data_exchange"
does not exist
2018-10-22 14:06:57.067 CEST [18768] STATEMENT: DROP TABLE
c5_data_exchange
2018-10-22 14:06:57.067 CEST [18768] ERROR: table "c5_data_exchange" does
not exist
2018-10-22 14:06:57.067 CEST [18768] STATEMENT: DROP TABLE
c5_data_exchange
2018-10-22 14:06:57.067 CEST [18768] LOG: duration: 0.034 ms parse
<unnamed>: DROP TABLE c5_splittest_link
2018-10-22 14:06:57.067 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_splittest_link
2018-10-22 14:06:57.067 CEST [18768] DEBUG: relation "c5_splittest_link"
does not exist
2018-10-22 14:06:57.067 CEST [18768] STATEMENT: DROP TABLE
c5_splittest_link
2018-10-22 14:06:57.067 CEST [18768] ERROR: table "c5_splittest_link" does
not exist
2018-10-22 14:06:57.067 CEST [18768] STATEMENT: DROP TABLE
c5_splittest_link
2018-10-22 14:06:57.068 CEST [18768] LOG: duration: 0.034 ms parse
<unnamed>: DROP TABLE c5_splittest_mailing
2018-10-22 14:06:57.068 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_splittest_mailing
2018-10-22 14:06:57.068 CEST [18768] DEBUG: relation "c5_splittest_mailing"
does not exist
2018-10-22 14:06:57.068 CEST [18768] STATEMENT: DROP TABLE
c5_splittest_mailing
2018-10-22 14:06:57.068 CEST [18768] ERROR: table "c5_splittest_mailing"
does not exist
2018-10-22 14:06:57.068 CEST [18768] STATEMENT: DROP TABLE
c5_splittest_mailing
2018-10-22 14:06:57.068 CEST [18768] LOG: duration: 0.028 ms parse
<unnamed>: DROP TABLE c5_splittest_variant
2018-10-22 14:06:57.068 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_splittest_variant
2018-10-22 14:06:57.068 CEST [18768] DEBUG: relation "c5_splittest_variant"
does not exist
2018-10-22 14:06:57.068 CEST [18768] STATEMENT: DROP TABLE
c5_splittest_variant
2018-10-22 14:06:57.068 CEST [18768] ERROR: table "c5_splittest_variant"
does not exist
2018-10-22 14:06:57.068 CEST [18768] STATEMENT: DROP TABLE
c5_splittest_variant
2018-10-22 14:06:57.069 CEST [18768] LOG: duration: 0.013 ms parse
<unnamed>: DROP TABLE c5_splittest
2018-10-22 14:06:57.069 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_splittest
2018-10-22 14:06:57.069 CEST [18768] DEBUG: relation "c5_splittest" does
not exist
2018-10-22 14:06:57.069 CEST [18768] STATEMENT: DROP TABLE c5_splittest
2018-10-22 14:06:57.069 CEST [18768] ERROR: table "c5_splittest" does not
exist
2018-10-22 14:06:57.069 CEST [18768] STATEMENT: DROP TABLE c5_splittest
2018-10-22 14:06:57.069 CEST [18768] LOG: duration: 0.028 ms parse
<unnamed>: DROP TABLE c5_sending_running
2018-10-22 14:06:57.070 CEST [18768] LOG: duration: 0.022 ms bind
<unnamed>: DROP TABLE c5_sending_running
2018-10-22 14:06:57.070 CEST [18768] DEBUG: relation "c5_sending_running"
does not exist
2018-10-22 14:06:57.070 CEST [18768] STATEMENT: DROP TABLE
c5_sending_running
2018-10-22 14:06:57.070 CEST [18768] ERROR: table "c5_sending_running" does
not exist
2018-10-22 14:06:57.070 CEST [18768] STATEMENT: DROP TABLE
c5_sending_running
2018-10-22 14:06:57.070 CEST [18768] LOG: duration: 0.012 ms parse
<unnamed>: DROP TABLE c5_sending_protocol
2018-10-22 14:06:57.070 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_sending_protocol
2018-10-22 14:06:57.070 CEST [18768] DEBUG: relation "c5_sending_protocol"
does not exist
2018-10-22 14:06:57.070 CEST [18768] STATEMENT: DROP TABLE
c5_sending_protocol
2018-10-22 14:06:57.070 CEST [18768] ERROR: table "c5_sending_protocol"
does not exist
2018-10-22 14:06:57.070 CEST [18768] STATEMENT: DROP TABLE
c5_sending_protocol
2018-10-22 14:06:57.071 CEST [18768] LOG: duration: 0.012 ms parse
<unnamed>: DROP TABLE c5_sending_log
2018-10-22 14:06:57.071 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_sending_log
2018-10-22 14:06:57.071 CEST [18768] DEBUG: relation "c5_sending_log" does
not exist
2018-10-22 14:06:57.071 CEST [18768] STATEMENT: DROP TABLE c5_sending_log
2018-10-22 14:06:57.071 CEST [18768] ERROR: table "c5_sending_log" does not
exist
2018-10-22 14:06:57.071 CEST [18768] STATEMENT: DROP TABLE c5_sending_log
2018-10-22 14:06:57.071 CEST [18768] LOG: duration: 0.015 ms parse
<unnamed>: DROP TABLE c5_webpage
2018-10-22 14:06:57.071 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_webpage
2018-10-22 14:06:57.071 CEST [18768] DEBUG: relation "c5_webpage" does not
exist
2018-10-22 14:06:57.071 CEST [18768] STATEMENT: DROP TABLE c5_webpage
2018-10-22 14:06:57.071 CEST [18768] ERROR: table "c5_webpage" does not
exist
2018-10-22 14:06:57.071 CEST [18768] STATEMENT: DROP TABLE c5_webpage
2018-10-22 14:06:57.072 CEST [18768] LOG: duration: 0.013 ms parse
<unnamed>: DROP TABLE c5_datasource
2018-10-22 14:06:57.072 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_datasource
2018-10-22 14:06:57.072 CEST [18768] DEBUG: relation "c5_datasource" does
not exist
2018-10-22 14:06:57.072 CEST [18768] STATEMENT: DROP TABLE c5_datasource
2018-10-22 14:06:57.072 CEST [18768] ERROR: table "c5_datasource" does not
exist
2018-10-22 14:06:57.072 CEST [18768] STATEMENT: DROP TABLE c5_datasource
2018-10-22 14:06:57.072 CEST [18768] LOG: duration: 0.013 ms parse
<unnamed>: DROP TABLE c5_datasource_xslt
2018-10-22 14:06:57.072 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_datasource_xslt
2018-10-22 14:06:57.072 CEST [18768] DEBUG: relation "c5_datasource_xslt"
does not exist
2018-10-22 14:06:57.072 CEST [18768] STATEMENT: DROP TABLE
c5_datasource_xslt
2018-10-22 14:06:57.072 CEST [18768] ERROR: table "c5_datasource_xslt" does
not exist
2018-10-22 14:06:57.072 CEST [18768] STATEMENT: DROP TABLE
c5_datasource_xslt
2018-10-22 14:06:57.073 CEST [18768] LOG: duration: 0.016 ms parse
<unnamed>: DROP TABLE c5_action_seq_desc
2018-10-22 14:06:57.073 CEST [18768] LOG: duration: 0.005 ms bind
<unnamed>: DROP TABLE c5_action_seq_desc
2018-10-22 14:06:57.073 CEST [18768] DEBUG: relation "c5_action_seq_desc"
does not exist
2018-10-22 14:06:57.073 CEST [18768] STATEMENT: DROP TABLE
c5_action_seq_desc
2018-10-22 14:06:57.073 CEST [18768] ERROR: table "c5_action_seq_desc" does
not exist
2018-10-22 14:06:57.073 CEST [18768] STATEMENT: DROP TABLE
c5_action_seq_desc
2018-10-22 14:06:57.073 CEST [18768] LOG: duration: 0.014 ms parse
<unnamed>: DROP TABLE c5_mail_server_log
2018-10-22 14:06:57.073 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_mail_server_log
2018-10-22 14:06:57.074 CEST [18768] DEBUG: relation "c5_mail_server_log"
does not exist
2018-10-22 14:06:57.074 CEST [18768] STATEMENT: DROP TABLE
c5_mail_server_log
2018-10-22 14:06:57.074 CEST [18768] ERROR: table "c5_mail_server_log" does
not exist
2018-10-22 14:06:57.074 CEST [18768] STATEMENT: DROP TABLE
c5_mail_server_log
2018-10-22 14:06:57.074 CEST [18768] LOG: duration: 0.009 ms parse
<unnamed>: DROP TABLE c5_list_size_log
2018-10-22 14:06:57.074 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_list_size_log
2018-10-22 14:06:57.074 CEST [18768] DEBUG: relation "c5_list_size_log"
does not exist
2018-10-22 14:06:57.074 CEST [18768] STATEMENT: DROP TABLE
c5_list_size_log
2018-10-22 14:06:57.074 CEST [18768] ERROR: table "c5_list_size_log" does
not exist
2018-10-22 14:06:57.074 CEST [18768] STATEMENT: DROP TABLE
c5_list_size_log
2018-10-22 14:06:57.074 CEST [18768] LOG: duration: 0.009 ms parse
<unnamed>: DROP TABLE c5_template_data_source
2018-10-22 14:06:57.074 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_template_data_source
2018-10-22 14:06:57.074 CEST [18768] DEBUG: relation
"c5_template_data_source" does not exist
2018-10-22 14:06:57.074 CEST [18768] STATEMENT: DROP TABLE
c5_template_data_source
2018-10-22 14:06:57.074 CEST [18768] ERROR: table "c5_template_data_source"
does not exist
2018-10-22 14:06:57.074 CEST [18768] STATEMENT: DROP TABLE
c5_template_data_source
2018-10-22 14:06:57.075 CEST [18768] LOG: duration: 0.011 ms parse
<unnamed>: DROP TABLE c5_design_template
2018-10-22 14:06:57.075 CEST [18768] LOG: duration: 0.022 ms bind
<unnamed>: DROP TABLE c5_design_template
2018-10-22 14:06:57.075 CEST [18768] DEBUG: relation "c5_design_template"
does not exist
2018-10-22 14:06:57.075 CEST [18768] STATEMENT: DROP TABLE
c5_design_template
2018-10-22 14:06:57.075 CEST [18768] ERROR: table "c5_design_template" does
not exist
2018-10-22 14:06:57.075 CEST [18768] STATEMENT: DROP TABLE
c5_design_template
2018-10-22 14:06:57.075 CEST [18768] LOG: duration: 0.010 ms parse
<unnamed>: DROP TABLE c5_design_collection
2018-10-22 14:06:57.075 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_design_collection
2018-10-22 14:06:57.075 CEST [18768] DEBUG: relation "c5_design_collection"
does not exist
2018-10-22 14:06:57.075 CEST [18768] STATEMENT: DROP TABLE
c5_design_collection
2018-10-22 14:06:57.075 CEST [18768] ERROR: table "c5_design_collection"
does not exist
2018-10-22 14:06:57.075 CEST [18768] STATEMENT: DROP TABLE
c5_design_collection
2018-10-22 14:06:57.076 CEST [18768] LOG: duration: 0.012 ms parse
<unnamed>: DROP TABLE c5_send_revenue
2018-10-22 14:06:57.076 CEST [18768] LOG: duration: 0.022 ms bind
<unnamed>: DROP TABLE c5_send_revenue
2018-10-22 14:06:57.076 CEST [18768] DEBUG: relation "c5_send_revenue" does
not exist
2018-10-22 14:06:57.076 CEST [18768] STATEMENT: DROP TABLE
c5_send_revenue
2018-10-22 14:06:57.076 CEST [18768] ERROR: table "c5_send_revenue" does
not exist
2018-10-22 14:06:57.076 CEST [18768] STATEMENT: DROP TABLE
c5_send_revenue
2018-10-22 14:06:57.076 CEST [18768] LOG: duration: 0.010 ms parse
<unnamed>: DROP TABLE c5_subscription_event
2018-10-22 14:06:57.076 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_subscription_event
2018-10-22 14:06:57.076 CEST [18768] DEBUG: relation
"c5_subscription_event" does not exist
2018-10-22 14:06:57.076 CEST [18768] STATEMENT: DROP TABLE
c5_subscription_event
2018-10-22 14:06:57.076 CEST [18768] ERROR: table "c5_subscription_event"
does not exist
2018-10-22 14:06:57.076 CEST [18768] STATEMENT: DROP TABLE
c5_subscription_event
2018-10-22 14:06:57.077 CEST [18768] LOG: duration: 0.011 ms parse
<unnamed>: DROP TABLE c5_verification_mailing
2018-10-22 14:06:57.077 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_verification_mailing
2018-10-22 14:06:57.077 CEST [18768] DEBUG: relation
"c5_verification_mailing" does not exist
2018-10-22 14:06:57.077 CEST [18768] STATEMENT: DROP TABLE
c5_verification_mailing
2018-10-22 14:06:57.077 CEST [18768] ERROR: table "c5_verification_mailing"
does not exist
2018-10-22 14:06:57.077 CEST [18768] STATEMENT: DROP TABLE
c5_verification_mailing
2018-10-22 14:06:57.077 CEST [18768] LOG: duration: 0.010 ms parse
<unnamed>: DROP TABLE c5_sequence_mailing
2018-10-22 14:06:57.077 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_sequence_mailing
2018-10-22 14:06:57.077 CEST [18768] DEBUG: relation "c5_sequence_mailing"
does not exist
2018-10-22 14:06:57.077 CEST [18768] STATEMENT: DROP TABLE
c5_sequence_mailing
2018-10-22 14:06:57.077 CEST [18768] ERROR: table "c5_sequence_mailing"
does not exist
2018-10-22 14:06:57.077 CEST [18768] STATEMENT: DROP TABLE
c5_sequence_mailing
2018-10-22 14:06:57.077 CEST [18768] LOG: duration: 0.010 ms parse
<unnamed>: DROP TABLE c5_mailing_template
2018-10-22 14:06:57.078 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_mailing_template
2018-10-22 14:06:57.078 CEST [18768] DEBUG: relation "c5_mailing_template"
does not exist
2018-10-22 14:06:57.078 CEST [18768] STATEMENT: DROP TABLE
c5_mailing_template
2018-10-22 14:06:57.078 CEST [18768] ERROR: table "c5_mailing_template"
does not exist
2018-10-22 14:06:57.078 CEST [18768] STATEMENT: DROP TABLE
c5_mailing_template
2018-10-22 14:06:57.078 CEST [18768] LOG: duration: 0.011 ms parse
<unnamed>: DROP TABLE c5_textmodule
2018-10-22 14:06:57.078 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_textmodule
2018-10-22 14:06:57.078 CEST [18768] DEBUG: relation "c5_textmodule" does
not exist
2018-10-22 14:06:57.078 CEST [18768] STATEMENT: DROP TABLE c5_textmodule
2018-10-22 14:06:57.078 CEST [18768] ERROR: table "c5_textmodule" does not
exist
2018-10-22 14:06:57.078 CEST [18768] STATEMENT: DROP TABLE c5_textmodule
2018-10-22 14:06:57.078 CEST [18768] LOG: duration: 0.009 ms parse
<unnamed>: DROP TABLE c5_time_trigger_action
2018-10-22 14:06:57.078 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_time_trigger_action
2018-10-22 14:06:57.078 CEST [18768] DEBUG: relation
"c5_time_trigger_action" does not exist
2018-10-22 14:06:57.078 CEST [18768] STATEMENT: DROP TABLE
c5_time_trigger_action
2018-10-22 14:06:57.079 CEST [18768] ERROR: table "c5_time_trigger_action"
does not exist
2018-10-22 14:06:57.079 CEST [18768] STATEMENT: DROP TABLE
c5_time_trigger_action
2018-10-22 14:06:57.079 CEST [18768] LOG: duration: 0.014 ms parse
<unnamed>: DROP TABLE c5_action_mailing
2018-10-22 14:06:57.079 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_action_mailing
2018-10-22 14:06:57.079 CEST [18768] DEBUG: relation "c5_action_mailing"
does not exist
2018-10-22 14:06:57.079 CEST [18768] STATEMENT: DROP TABLE
c5_action_mailing
2018-10-22 14:06:57.079 CEST [18768] ERROR: table "c5_action_mailing" does
not exist
2018-10-22 14:06:57.079 CEST [18768] STATEMENT: DROP TABLE
c5_action_mailing
2018-10-22 14:06:57.079 CEST [18768] LOG: duration: 0.031 ms parse
<unnamed>: DROP TABLE c5_sending
2018-10-22 14:06:57.080 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_sending
2018-10-22 14:06:57.080 CEST [18768] DEBUG: relation "c5_sending" does not
exist
2018-10-22 14:06:57.080 CEST [18768] STATEMENT: DROP TABLE c5_sending
2018-10-22 14:06:57.080 CEST [18768] ERROR: table "c5_sending" does not
exist
2018-10-22 14:06:57.080 CEST [18768] STATEMENT: DROP TABLE c5_sending
2018-10-22 14:06:57.080 CEST [18768] LOG: duration: 0.017 ms parse
<unnamed>: DROP TABLE c5_object_filter_set
2018-10-22 14:06:57.080 CEST [18768] LOG: duration: 0.023 ms bind
<unnamed>: DROP TABLE c5_object_filter_set
2018-10-22 14:06:57.080 CEST [18768] DEBUG: relation "c5_object_filter_set"
does not exist
2018-10-22 14:06:57.080 CEST [18768] STATEMENT: DROP TABLE
c5_object_filter_set
2018-10-22 14:06:57.080 CEST [18768] ERROR: table "c5_object_filter_set"
does not exist
2018-10-22 14:06:57.080 CEST [18768] STATEMENT: DROP TABLE
c5_object_filter_set
2018-10-22 14:06:57.080 CEST [18768] LOG: duration: 0.021 ms parse
<unnamed>: DROP TABLE c5_mailing
2018-10-22 14:06:57.080 CEST [18768] LOG: duration: 0.022 ms bind
<unnamed>: DROP TABLE c5_mailing
2018-10-22 14:06:57.081 CEST [18768] DEBUG: relation "c5_mailing" does not
exist
2018-10-22 14:06:57.081 CEST [18768] STATEMENT: DROP TABLE c5_mailing
2018-10-22 14:06:57.081 CEST [18768] ERROR: table "c5_mailing" does not
exist
2018-10-22 14:06:57.081 CEST [18768] STATEMENT: DROP TABLE c5_mailing
2018-10-22 14:06:57.081 CEST [18768] LOG: duration: 0.011 ms parse
<unnamed>: DROP TABLE c5_plugin_data
2018-10-22 14:06:57.081 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_plugin_data
2018-10-22 14:06:57.081 CEST [18768] DEBUG: relation "c5_plugin_data" does
not exist
2018-10-22 14:06:57.081 CEST [18768] STATEMENT: DROP TABLE c5_plugin_data
2018-10-22 14:06:57.081 CEST [18768] ERROR: table "c5_plugin_data" does not
exist
2018-10-22 14:06:57.081 CEST [18768] STATEMENT: DROP TABLE c5_plugin_data
2018-10-22 14:06:57.081 CEST [18768] LOG: duration: 0.012 ms parse
<unnamed>: DROP TABLE c5_plugin_configuration
2018-10-22 14:06:57.081 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_plugin_configuration
2018-10-22 14:06:57.081 CEST [18768] DEBUG: relation
"c5_plugin_configuration" does not exist
2018-10-22 14:06:57.081 CEST [18768] STATEMENT: DROP TABLE
c5_plugin_configuration
2018-10-22 14:06:57.081 CEST [18768] ERROR: table "c5_plugin_configuration"
does not exist
2018-10-22 14:06:57.081 CEST [18768] STATEMENT: DROP TABLE
c5_plugin_configuration
2018-10-22 14:06:57.082 CEST [18768] LOG: duration: 0.011 ms parse
<unnamed>: DROP TABLE c5_plugin_attribute_access
2018-10-22 14:06:57.082 CEST [18768] LOG: duration: 0.023 ms bind
<unnamed>: DROP TABLE c5_plugin_attribute_access
2018-10-22 14:06:57.082 CEST [18768] DEBUG: relation
"c5_plugin_attribute_access" does not exist
2018-10-22 14:06:57.082 CEST [18768] STATEMENT: DROP TABLE
c5_plugin_attribute_access
2018-10-22 14:06:57.082 CEST [18768] ERROR: table
"c5_plugin_attribute_access" does not exist
2018-10-22 14:06:57.082 CEST [18768] STATEMENT: DROP TABLE
c5_plugin_attribute_access
2018-10-22 14:06:57.082 CEST [18768] LOG: duration: 0.011 ms parse
<unnamed>: DROP TABLE c5_plugin_list_access
2018-10-22 14:06:57.082 CEST [18768] LOG: duration: 0.022 ms bind
<unnamed>: DROP TABLE c5_plugin_list_access
2018-10-22 14:06:57.082 CEST [18768] DEBUG: relation
"c5_plugin_list_access" does not exist
2018-10-22 14:06:57.082 CEST [18768] STATEMENT: DROP TABLE
c5_plugin_list_access
2018-10-22 14:06:57.082 CEST [18768] ERROR: table "c5_plugin_list_access"
does not exist
2018-10-22 14:06:57.082 CEST [18768] STATEMENT: DROP TABLE
c5_plugin_list_access
2018-10-22 14:06:57.083 CEST [18768] LOG: duration: 0.014 ms parse
<unnamed>: DROP TABLE c5_plugin_list
2018-10-22 14:06:57.083 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_plugin_list
2018-10-22 14:06:57.083 CEST [18768] DEBUG: relation "c5_plugin_list" does
not exist
2018-10-22 14:06:57.083 CEST [18768] STATEMENT: DROP TABLE c5_plugin_list
2018-10-22 14:06:57.083 CEST [18768] ERROR: table "c5_plugin_list" does not
exist
2018-10-22 14:06:57.083 CEST [18768] STATEMENT: DROP TABLE c5_plugin_list
2018-10-22 14:06:57.083 CEST [18768] LOG: duration: 0.020 ms parse
<unnamed>: DROP TABLE c5_sending_history
2018-10-22 14:06:57.083 CEST [18768] LOG: duration: 0.005 ms bind
<unnamed>: DROP TABLE c5_sending_history
2018-10-22 14:06:57.083 CEST [18768] DEBUG: relation "c5_sending_history"
does not exist
2018-10-22 14:06:57.083 CEST [18768] STATEMENT: DROP TABLE
c5_sending_history
2018-10-22 14:06:57.083 CEST [18768] ERROR: table "c5_sending_history" does
not exist
2018-10-22 14:06:57.083 CEST [18768] STATEMENT: DROP TABLE
c5_sending_history
2018-10-22 14:06:57.083 CEST [18768] LOG: duration: 0.025 ms parse
<unnamed>: DROP TABLE c5_approver_list
2018-10-22 14:06:57.084 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_approver_list
2018-10-22 14:06:57.084 CEST [18768] DEBUG: relation "c5_approver_list"
does not exist
2018-10-22 14:06:57.084 CEST [18768] STATEMENT: DROP TABLE
c5_approver_list
2018-10-22 14:06:57.084 CEST [18768] ERROR: table "c5_approver_list" does
not exist
2018-10-22 14:06:57.084 CEST [18768] STATEMENT: DROP TABLE
c5_approver_list
2018-10-22 14:06:57.084 CEST [18768] LOG: duration: 0.011 ms parse
<unnamed>: DROP TABLE c5_approver
2018-10-22 14:06:57.084 CEST [18768] LOG: duration: 0.021 ms bind
<unnamed>: DROP TABLE c5_approver
2018-10-22 14:06:57.084 CEST [18768] DEBUG: relation "c5_approver" does not
exist
2018-10-22 14:06:57.084 CEST [18768] STATEMENT: DROP TABLE c5_approver
2018-10-22 14:06:57.084 CEST [18768] ERROR: table "c5_approver" does not
exist
2018-10-22 14:06:57.084 CEST [18768] STATEMENT: DROP TABLE c5_approver
2018-10-22 14:06:57.084 CEST [18768] LOG: duration: 0.010 ms parse
<unnamed>: DROP TABLE c5_approval_recipient
2018-10-22 14:06:57.084 CEST [18768] LOG: duration: 0.005 ms bind
<unnamed>: DROP TABLE c5_approval_recipient
2018-10-22 14:06:57.085 CEST [18768] DEBUG: relation
"c5_approval_recipient" does not exist
2018-10-22 14:06:57.085 CEST [18768] STATEMENT: DROP TABLE
c5_approval_recipient
2018-10-22 14:06:57.085 CEST [18768] ERROR: table "c5_approval_recipient"
does not exist
2018-10-22 14:06:57.085 CEST [18768] STATEMENT: DROP TABLE
c5_approval_recipient
2018-10-22 14:06:57.085 CEST [18768] LOG: duration: 0.023 ms parse
<unnamed>: DROP TABLE c5_approval_history
2018-10-22 14:06:57.085 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_approval_history
2018-10-22 14:06:57.085 CEST [18768] DEBUG: relation "c5_approval_history"
does not exist
2018-10-22 14:06:57.085 CEST [18768] STATEMENT: DROP TABLE
c5_approval_history
2018-10-22 14:06:57.085 CEST [18768] ERROR: table "c5_approval_history"
does not exist
2018-10-22 14:06:57.085 CEST [18768] STATEMENT: DROP TABLE
c5_approval_history
2018-10-22 14:06:57.085 CEST [18768] LOG: duration: 0.021 ms parse
<unnamed>: DROP TABLE c5_unsubscription
2018-10-22 14:06:57.085 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_unsubscription
2018-10-22 14:06:57.089 CEST [18768] LOG: duration: 3.174 ms execute
<unnamed>: DROP TABLE c5_unsubscription
2018-10-22 14:06:57.097 CEST [18768] LOG: duration: 0.045 ms parse
<unnamed>: DROP TABLE c5_test_recipient
2018-10-22 14:06:57.097 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_test_recipient
2018-10-22 14:06:57.097 CEST [18768] DEBUG: relation "c5_test_recipient"
does not exist
2018-10-22 14:06:57.097 CEST [18768] STATEMENT: DROP TABLE
c5_test_recipient
2018-10-22 14:06:57.097 CEST [18768] ERROR: table "c5_test_recipient" does
not exist
2018-10-22 14:06:57.097 CEST [18768] STATEMENT: DROP TABLE
c5_test_recipient
2018-10-22 14:06:57.098 CEST [18768] LOG: duration: 0.012 ms parse
<unnamed>: DROP TABLE c5_reply_log
2018-10-22 14:06:57.098 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_reply_log
2018-10-22 14:06:57.098 CEST [18768] DEBUG: relation "c5_reply_log" does
not exist
2018-10-22 14:06:57.098 CEST [18768] STATEMENT: DROP TABLE c5_reply_log
2018-10-22 14:06:57.098 CEST [18768] ERROR: table "c5_reply_log" does not
exist
2018-10-22 14:06:57.098 CEST [18768] STATEMENT: DROP TABLE c5_reply_log
2018-10-22 14:06:57.098 CEST [18768] LOG: duration: 0.009 ms parse
<unnamed>: DROP TABLE c5_bounce_log
2018-10-22 14:06:57.098 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_bounce_log
2018-10-22 14:06:57.098 CEST [18768] DEBUG: relation "c5_bounce_log" does
not exist
2018-10-22 14:06:57.098 CEST [18768] STATEMENT: DROP TABLE c5_bounce_log
2018-10-22 14:06:57.098 CEST [18768] ERROR: table "c5_bounce_log" does not
exist
2018-10-22 14:06:57.098 CEST [18768] STATEMENT: DROP TABLE c5_bounce_log
2018-10-22 14:06:57.098 CEST [18768] LOG: duration: 0.008 ms parse
<unnamed>: DROP TABLE c5_discussion_log
2018-10-22 14:06:57.098 CEST [18768] LOG: duration: 0.006 ms bind
<unnamed>: DROP TABLE c5_discussion_log
2018-10-22 14:06:57.098 CEST [18768] DEBUG: relation "c5_discussion_log"
does not exist
2018-10-22 14:06:57.098 CEST [18768] STATEMENT: DROP TABLE
c5_discussion_log
2018-10-22 14:06:57.099 CEST [18768] ERROR: table "c5_discussion_log" does
not exist
2018-10-22 14:06:57.099 CEST [18768] STATEMENT: DROP TABLE
c5_discussion_log
2018-10-22 14:06:57.099 CEST [18768] LOG: duration: 0.015 ms parse
<unnamed>: DROP TABLE c5_user_property
2018-10-22 14:06:57.099 CEST [18768] LOG: duration: 0.005 ms bind
<unnamed>: DROP TABLE c5_user_property
2018-10-22 14:06:57.099 CEST [18768] DEBUG: relation "c5_user_property"
does not exist
2018-10-22 14:06:57.099 CEST [18768] STATEMENT: DROP TABLE
c5_user_property
2018-10-22 14:06:57.099 CEST [18768] ERROR: table "c5_user_property" does
not exist
2018-10-22 14:06:57.099 CEST [18768] STATEMENT: DROP TABLE
c5_user_property
2018-10-22 14:06:57.100 CEST [18768] LOG: duration: 0.034 ms parse
<unnamed>: DROP TABLE c5_target_group
2018-10-22 14:06:57.100 CEST [18768] LOG: duration: 0.005 ms bind
<unnamed>: DROP TABLE c5_target_group
2018-10-22 14:06:57.100 CEST [18768] DEBUG: relation "c5_target_group" does
not exist
2018-10-22 14:06:57.100 CEST [18768] STATEMENT: DROP TABLE
c5_target_group
2018-10-22 14:06:57.100 CEST [18768] ERROR: table "c5_target_group" does
not exist
2018-10-22 14:06:57.100 CEST [18768] STATEMENT: DROP TABLE
c5_target_group
2018-10-22 14:06:57.100 CEST [18768] LOG: duration: 0.015 ms parse
<unnamed>: DROP TABLE c5_action_task
2018-10-22 14:06:57.100 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_action_task
2018-10-22 14:06:57.100 CEST [18768] DEBUG: relation "c5_action_task" does
not exist
2018-10-22 14:06:57.100 CEST [18768] STATEMENT: DROP TABLE c5_action_task
2018-10-22 14:06:57.100 CEST [18768] ERROR: table "c5_action_task" does not
exist
2018-10-22 14:06:57.100 CEST [18768] STATEMENT: DROP TABLE c5_action_task
2018-10-22 14:06:57.101 CEST [18768] LOG: duration: 0.015 ms parse
<unnamed>: DROP TABLE c5_action_seq_trigger
2018-10-22 14:06:57.101 CEST [18768] LOG: duration: 0.007 ms bind
<unnamed>: DROP TABLE c5_action_seq_trigger
2018-10-22 14:06:57.101 CEST [18768] DEBUG: relation
"c5_action_seq_trigger" does not exist
2018-10-22 14:06:57.101 CEST [18768] STATEMENT: DROP TABLE
c5_action_seq_trigger
2018-10-22 14:06:57.101 CEST [18768] ERROR: table "c5_action_seq_trigger"
does not exist
2018-10-22 14:06:57.101 CEST [18768] STATEMENT: DROP TABLE
c5_action_seq_trigger
2018-10-22 14:06:57.101 CEST [18768] LOG: duration: 0.017 ms parse
<unnamed>: DROP TABLE c5_errormail
2018-10-22 14:06:57.101 CEST [18768] LOG: duration: 0.007 ms bind
<unnamed>: DROP TABLE c5_errormail
2018-10-22 14:06:57.101 CEST [18768] DEBUG: relation "c5_errormail" does
not exist
2018-10-22 14:06:57.101 CEST [18768] STATEMENT: DROP TABLE c5_errormail
2018-10-22 14:06:57.102 CEST [18768] ERROR: table "c5_errormail" does not
exist
2018-10-22 14:06:57.102 CEST [18768] STATEMENT: DROP TABLE c5_errormail
2018-10-22 14:06:57.102 CEST [18768] LOG: duration: 0.016 ms parse
<unnamed>: DROP TABLE c5_resource
2018-10-22 14:06:57.102 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_resource
2018-10-22 14:06:57.102 CEST [18768] DEBUG: relation "c5_resource" does not
exist
2018-10-22 14:06:57.102 CEST [18768] STATEMENT: DROP TABLE c5_resource
2018-10-22 14:06:57.102 CEST [18768] ERROR: table "c5_resource" does not
exist
2018-10-22 14:06:57.102 CEST [18768] STATEMENT: DROP TABLE c5_resource
2018-10-22 14:06:57.102 CEST [18768] LOG: duration: 0.015 ms parse
<unnamed>: DROP TABLE c5_blacklist
2018-10-22 14:06:57.103 CEST [18768] LOG: duration: 0.005 ms bind
<unnamed>: DROP TABLE c5_blacklist
2018-10-22 14:06:57.103 CEST [18768] DEBUG: relation "c5_blacklist" does
not exist
2018-10-22 14:06:57.103 CEST [18768] STATEMENT: DROP TABLE c5_blacklist
2018-10-22 14:06:57.103 CEST [18768] ERROR: table "c5_blacklist" does not
exist
2018-10-22 14:06:57.103 CEST [18768] STATEMENT: DROP TABLE c5_blacklist
2018-10-22 14:06:57.103 CEST [18768] LOG: duration: 0.012 ms parse
<unnamed>: DROP TABLE c5_click
2018-10-22 14:06:57.103 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_click
2018-10-22 14:06:57.103 CEST [18768] DEBUG: relation "c5_click" does not
exist
2018-10-22 14:06:57.103 CEST [18768] STATEMENT: DROP TABLE c5_click
2018-10-22 14:06:57.103 CEST [18768] ERROR: table "c5_click" does not
exist
2018-10-22 14:06:57.103 CEST [18768] STATEMENT: DROP TABLE c5_click
2018-10-22 14:06:57.103 CEST [18768] LOG: duration: 0.012 ms parse
<unnamed>: DROP TABLE c5_link
2018-10-22 14:06:57.103 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_link
2018-10-22 14:06:57.103 CEST [18768] DEBUG: relation "c5_link" does not
exist
2018-10-22 14:06:57.103 CEST [18768] STATEMENT: DROP TABLE c5_link
2018-10-22 14:06:57.103 CEST [18768] ERROR: table "c5_link" does not
exist
2018-10-22 14:06:57.103 CEST [18768] STATEMENT: DROP TABLE c5_link
2018-10-22 14:06:57.104 CEST [18768] LOG: duration: 0.010 ms parse
<unnamed>: DROP TABLE c5_users_userright
2018-10-22 14:06:57.104 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_users_userright
2018-10-22 14:06:57.104 CEST [18768] DEBUG: relation "c5_users_userright"
does not exist
2018-10-22 14:06:57.104 CEST [18768] STATEMENT: DROP TABLE
c5_users_userright
2018-10-22 14:06:57.104 CEST [18768] ERROR: table "c5_users_userright" does
not exist
2018-10-22 14:06:57.104 CEST [18768] STATEMENT: DROP TABLE
c5_users_userright
2018-10-22 14:06:57.104 CEST [18768] LOG: duration: 0.009 ms parse
<unnamed>: DROP TABLE c5_users_userrole
2018-10-22 14:06:57.104 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_users_userrole
2018-10-22 14:06:57.104 CEST [18768] DEBUG: relation "c5_users_userrole"
does not exist
2018-10-22 14:06:57.104 CEST [18768] STATEMENT: DROP TABLE
c5_users_userrole
2018-10-22 14:06:57.104 CEST [18768] ERROR: table "c5_users_userrole" does
not exist
2018-10-22 14:06:57.104 CEST [18768] STATEMENT: DROP TABLE
c5_users_userrole
2018-10-22 14:06:57.105 CEST [18768] LOG: duration: 0.009 ms parse
<unnamed>: DROP TABLE c5_userrole_userright
2018-10-22 14:06:57.105 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_userrole_userright
2018-10-22 14:06:57.105 CEST [18768] DEBUG: relation
"c5_userrole_userright" does not exist
2018-10-22 14:06:57.105 CEST [18768] STATEMENT: DROP TABLE
c5_userrole_userright
2018-10-22 14:06:57.105 CEST [18768] ERROR: table "c5_userrole_userright"
does not exist
2018-10-22 14:06:57.105 CEST [18768] STATEMENT: DROP TABLE
c5_userrole_userright
2018-10-22 14:06:57.105 CEST [18768] LOG: duration: 0.009 ms parse
<unnamed>: DROP TABLE c5_userrole
2018-10-22 14:06:57.105 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_userrole
2018-10-22 14:06:57.105 CEST [18768] DEBUG: relation "c5_userrole" does not
exist
2018-10-22 14:06:57.105 CEST [18768] STATEMENT: DROP TABLE c5_userrole
2018-10-22 14:06:57.105 CEST [18768] ERROR: table "c5_userrole" does not
exist
2018-10-22 14:06:57.105 CEST [18768] STATEMENT: DROP TABLE c5_userrole
2018-10-22 14:06:57.108 CEST [18768] LOG: duration: 0.019 ms parse
<unnamed>: DROP TABLE c5_userright
2018-10-22 14:06:57.108 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_userright
2018-10-22 14:06:57.108 CEST [18768] DEBUG: relation "c5_userright" does
not exist
2018-10-22 14:06:57.108 CEST [18768] STATEMENT: DROP TABLE c5_userright
2018-10-22 14:06:57.108 CEST [18768] ERROR: table "c5_userright" does not
exist
2018-10-22 14:06:57.108 CEST [18768] STATEMENT: DROP TABLE c5_userright
2018-10-22 14:06:57.109 CEST [18768] LOG: duration: 0.011 ms parse
<unnamed>: DROP TABLE c5_list_userrole
2018-10-22 14:06:57.109 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_list_userrole
2018-10-22 14:06:57.109 CEST [18768] DEBUG: relation "c5_list_userrole"
does not exist
2018-10-22 14:06:57.109 CEST [18768] STATEMENT: DROP TABLE
c5_list_userrole
2018-10-22 14:06:57.109 CEST [18768] ERROR: table "c5_list_userrole" does
not exist
2018-10-22 14:06:57.109 CEST [18768] STATEMENT: DROP TABLE
c5_list_userrole
2018-10-22 14:06:57.109 CEST [18768] LOG: duration: 0.008 ms parse
<unnamed>: DROP TABLE c5_list_users
2018-10-22 14:06:57.109 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_list_users
2018-10-22 14:06:57.109 CEST [18768] DEBUG: relation "c5_list_users" does
not exist
2018-10-22 14:06:57.109 CEST [18768] STATEMENT: DROP TABLE c5_list_users
2018-10-22 14:06:57.109 CEST [18768] ERROR: table "c5_list_users" does not
exist
2018-10-22 14:06:57.109 CEST [18768] STATEMENT: DROP TABLE c5_list_users
2018-10-22 14:06:57.110 CEST [18768] LOG: duration: 0.012 ms parse
<unnamed>: DROP TABLE c5_users
2018-10-22 14:06:57.110 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_users
2018-10-22 14:06:57.110 CEST [18768] DEBUG: relation "c5_users" does not
exist
2018-10-22 14:06:57.110 CEST [18768] STATEMENT: DROP TABLE c5_users
2018-10-22 14:06:57.110 CEST [18768] ERROR: table "c5_users" does not
exist
2018-10-22 14:06:57.110 CEST [18768] STATEMENT: DROP TABLE c5_users
2018-10-22 14:06:57.110 CEST [18768] LOG: duration: 0.011 ms parse
<unnamed>: DROP TABLE c5_list_agent
2018-10-22 14:06:57.110 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_list_agent
2018-10-22 14:06:57.110 CEST [18768] DEBUG: relation "c5_list_agent" does
not exist
2018-10-22 14:06:57.110 CEST [18768] STATEMENT: DROP TABLE c5_list_agent
2018-10-22 14:06:57.110 CEST [18768] ERROR: table "c5_list_agent" does not
exist
2018-10-22 14:06:57.110 CEST [18768] STATEMENT: DROP TABLE c5_list_agent
2018-10-22 14:06:57.110 CEST [18768] LOG: duration: 0.010 ms parse
<unnamed>: DROP TABLE c5_agent
2018-10-22 14:06:57.110 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_agent
2018-10-22 14:06:57.110 CEST [18768] DEBUG: relation "c5_agent" does not
exist
2018-10-22 14:06:57.110 CEST [18768] STATEMENT: DROP TABLE c5_agent
2018-10-22 14:06:57.110 CEST [18768] ERROR: table "c5_agent" does not
exist
2018-10-22 14:06:57.110 CEST [18768] STATEMENT: DROP TABLE c5_agent
2018-10-22 14:06:57.111 CEST [18768] LOG: duration: 0.008 ms parse
<unnamed>: DROP TABLE c5_list_property
2018-10-22 14:06:57.111 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_list_property
2018-10-22 14:06:57.111 CEST [18768] DEBUG: relation "c5_list_property"
does not exist
2018-10-22 14:06:57.111 CEST [18768] STATEMENT: DROP TABLE
c5_list_property
2018-10-22 14:06:57.111 CEST [18768] ERROR: table "c5_list_property" does
not exist
2018-10-22 14:06:57.111 CEST [18768] STATEMENT: DROP TABLE
c5_list_property
2018-10-22 14:06:57.111 CEST [18768] LOG: duration: 0.009 ms parse
<unnamed>: DROP TABLE c5_table_column_settings
2018-10-22 14:06:57.111 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_table_column_settings
2018-10-22 14:06:57.111 CEST [18768] DEBUG: relation
"c5_table_column_settings" does not exist
2018-10-22 14:06:57.111 CEST [18768] STATEMENT: DROP TABLE
c5_table_column_settings
2018-10-22 14:06:57.111 CEST [18768] ERROR: table
"c5_table_column_settings" does not exist
2018-10-22 14:06:57.111 CEST [18768] STATEMENT: DROP TABLE
c5_table_column_settings
2018-10-22 14:06:57.111 CEST [18768] LOG: duration: 0.009 ms parse
<unnamed>: DROP TABLE c5_history_log
2018-10-22 14:06:57.112 CEST [18768] LOG: duration: 0.002 ms bind
<unnamed>: DROP TABLE c5_history_log
2018-10-22 14:06:57.112 CEST [18768] DEBUG: relation "c5_history_log" does
not exist
2018-10-22 14:06:57.112 CEST [18768] STATEMENT: DROP TABLE c5_history_log
2018-10-22 14:06:57.112 CEST [18768] ERROR: table "c5_history_log" does not
exist
2018-10-22 14:06:57.112 CEST [18768] STATEMENT: DROP TABLE c5_history_log
2018-10-22 14:06:57.112 CEST [18768] LOG: duration: 0.008 ms parse
<unnamed>: DROP TABLE c5_log
2018-10-22 14:06:57.112 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_log
2018-10-22 14:06:57.112 CEST [18768] DEBUG: relation "c5_log" does not
exist
2018-10-22 14:06:57.112 CEST [18768] STATEMENT: DROP TABLE c5_log
2018-10-22 14:06:57.112 CEST [18768] ERROR: table "c5_log" does not exist
2018-10-22 14:06:57.112 CEST [18768] STATEMENT: DROP TABLE c5_log
2018-10-22 14:06:57.112 CEST [18768] LOG: duration: 0.008 ms parse
<unnamed>: DROP TABLE c5_attribute
2018-10-22 14:06:57.112 CEST [18768] LOG: duration: 0.003 ms bind
<unnamed>: DROP TABLE c5_attribute
2018-10-22 14:06:57.113 CEST [18768] LOG: duration: 0.597 ms execute
<unnamed>: DROP TABLE c5_attribute
2018-10-22 14:06:57.123 CEST [18768] LOG: duration: 0.032 ms parse
<unnamed>: DROP TABLE c5_member
2018-10-22 14:06:57.124 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_member
2018-10-22 14:06:57.124 CEST [18768] LOG: duration: 0.565 ms execute
<unnamed>: DROP TABLE c5_member
2018-10-22 14:06:57.135 CEST [18768] LOG: duration: 0.045 ms parse
<unnamed>: DROP TABLE c5_list
2018-10-22 14:06:57.135 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_list
2018-10-22 14:06:57.135 CEST [18768] LOG: duration: 0.773 ms execute
<unnamed>: DROP TABLE c5_list
2018-10-22 14:06:57.143 CEST [18768] LOG: duration: 0.028 ms parse
<unnamed>: DROP TABLE c5_uid
2018-10-22 14:06:57.143 CEST [18768] LOG: duration: 0.004 ms bind
<unnamed>: DROP TABLE c5_uid
2018-10-22 14:06:57.143 CEST [18768] LOG: duration: 0.321 ms execute
<unnamed>: DROP TABLE c5_uid
2018-10-22 14:06:57.150 CEST [18768] LOG: duration: 0.067 ms parse
<unnamed>: CREATE TABLE c5_uid( generator_name VARCHAR(128), max_id INT8 NOT
NULL, PRIMARY KEY(generator_name))
2018-10-22 14:06:57.150 CEST [18768] LOG: duration: 0.007 ms bind
<unnamed>: CREATE TABLE c5_uid( generator_name VARCHAR(128), max_id INT8 NOT
NULL, PRIMARY KEY(generator_name))
2018-10-22 14:06:57.154 CEST [18768] DEBUG: CREATE TABLE / PRIMARY KEY will
create implicit index "c5_uid_pkey" for table "c5_uid"
2018-10-22 14:06:57.154 CEST [18768] STATEMENT: CREATE TABLE c5_uid(
generator_name VARCHAR(128), max_id INT8 NOT NULL, PRIMARY
KEY(generator_name))
2018-10-22 14:06:57.156 CEST [18768] DEBUG: building index "c5_uid_pkey" on
table "c5_uid" serially
2018-10-22 14:06:57.156 CEST [18768] STATEMENT: CREATE TABLE c5_uid(
generator_name VARCHAR(128), max_id INT8 NOT NULL, PRIMARY
KEY(generator_name))
2018-10-22 14:06:57.163 CEST [18768] LOG: duration: 13.433 ms execute
<unnamed>: CREATE TABLE c5_uid( generator_name VARCHAR(128), max_id INT8 NOT
NULL, PRIMARY KEY(generator_name))
2018-10-22 14:06:57.173 CEST [18768] LOG: duration: 0.160 ms parse
<unnamed>: INSERT INTO c5_uid(generator_name, max_id) VALUES ('attribute',
3)
2018-10-22 14:06:57.173 CEST [18768] LOG: duration: 0.036 ms bind
<unnamed>: INSERT INTO c5_uid(generator_name, max_id) VALUES ('attribute',
3)
2018-10-22 14:06:57.174 CEST [18768] LOG: duration: 0.865 ms execute
<unnamed>: INSERT INTO c5_uid(generator_name, max_id) VALUES ('attribute',
3)
2018-10-22 14:06:57.179 CEST [18768] LOG: duration: 0.064 ms parse
<unnamed>: CREATE TABLE c5_attribute( attribute_id INT4, attribute_name TEXT
NOT NULL, attribute_type INT4, table_name TEXT NOT NULL, column_name TEXT
NOT NULL, deleted BOOLEAN NOT NULL, list_id INT4, agent_id INT4,
sql_data_type INT4, PRIMARY KEY(attribute_id))
2018-10-22 14:06:57.180 CEST [18768] LOG: duration: 0.013 ms bind
<unnamed>: CREATE TABLE c5_attribute( attribute_id INT4, attribute_name TEXT
NOT NULL, attribute_type INT4, table_name TEXT NOT NULL, column_name TEXT
NOT NULL, deleted BOOLEAN NOT NULL, list_id INT4, agent_id INT4,
sql_data_type INT4, PRIMARY KEY(attribute_id))
2018-10-22 14:06:57.185 CEST [18768] DEBUG: building index
"pg_toast_40965_index" on table "pg_toast_40965" serially
2018-10-22 14:06:57.185 CEST [18768] STATEMENT: CREATE TABLE c5_attribute(
attribute_id INT4, attribute_name TEXT NOT NULL, attribute_type INT4,
table_name TEXT NOT NULL, column_name TEXT NOT NULL, deleted BOOLEAN NOT
NULL, list_id INT4, agent_id INT4, sql_data_type INT4, PRIMARY
KEY(attribute_id))
2018-10-22 14:06:57.195 CEST [18768] DEBUG: CREATE TABLE / PRIMARY KEY will
create implicit index "c5_attribute_pkey" for table "c5_attribute"
2018-10-22 14:06:57.195 CEST [18768] STATEMENT: CREATE TABLE c5_attribute(
attribute_id INT4, attribute_name TEXT NOT NULL, attribute_type INT4,
table_name TEXT NOT NULL, column_name TEXT NOT NULL, deleted BOOLEAN NOT
NULL, list_id INT4, agent_id INT4, sql_data_type INT4, PRIMARY
KEY(attribute_id))
2018-10-22 14:06:57.196 CEST [18768] DEBUG: building index
"c5_attribute_pkey" on table "c5_attribute" serially
2018-10-22 14:06:57.196 CEST [18768] STATEMENT: CREATE TABLE c5_attribute(
attribute_id INT4, attribute_name TEXT NOT NULL, attribute_type INT4,
table_name TEXT NOT NULL, column_name TEXT NOT NULL, deleted BOOLEAN NOT
NULL, list_id INT4, agent_id INT4, sql_data_type INT4, PRIMARY
KEY(attribute_id))
2018-10-22 14:06:57.201 CEST [18768] LOG: duration: 21.422 ms execute
<unnamed>: CREATE TABLE c5_attribute( attribute_id INT4, attribute_name TEXT
NOT NULL, attribute_type INT4, table_name TEXT NOT NULL, column_name TEXT
NOT NULL, deleted BOOLEAN NOT NULL, list_id INT4, agent_id INT4,
sql_data_type INT4, PRIMARY KEY(attribute_id))
2018-10-22 14:06:57.204 CEST [18768] LOG: duration: 0.075 ms parse
<unnamed>: CREATE INDEX c5_idx_attribute_2 ON c5_attribute(attribute_name)
2018-10-22 14:06:57.204 CEST [18768] LOG: duration: 0.013 ms bind
<unnamed>: CREATE INDEX c5_idx_attribute_2 ON c5_attribute(attribute_name)
2018-10-22 14:06:57.206 CEST [18768] DEBUG: building index
"c5_idx_attribute_2" on table "c5_attribute" serially
2018-10-22 14:06:57.206 CEST [18768] STATEMENT: CREATE INDEX
c5_idx_attribute_2 ON c5_attribute(attribute_name)
2018-10-22 14:06:57.211 CEST [18768] LOG: duration: 6.895 ms execute
<unnamed>: CREATE INDEX c5_idx_attribute_2 ON c5_attribute(attribute_name)
2018-10-22 14:06:57.214 CEST [18768] LOG: duration: 0.090 ms parse
<unnamed>: INSERT INTO c5_attribute(attribute_id, attribute_name,
attribute_type, table_name, column_name, deleted, sql_data_type) VALUES (1,
'&&lower_email', 6, 'member', 'attribute_1', FALSE, -128)
2018-10-22 14:06:57.214 CEST [18768] LOG: duration: 0.032 ms bind
<unnamed>: INSERT INTO c5_attribute(attribute_id, attribute_name,
attribute_type, table_name, column_name, deleted, sql_data_type) VALUES (1,
'&&lower_email', 6, 'member', 'attribute_1', FALSE, -128)
2018-10-22 14:06:57.216 CEST [18768] LOG: duration: 1.395 ms execute
<unnamed>: INSERT INTO c5_attribute(attribute_id, attribute_name,
attribute_type, table_name, column_name, deleted, sql_data_type) VALUES (1,
'&&lower_email', 6, 'member', 'attribute_1', FALSE, -128)
2018-10-22 14:06:57.218 CEST [18768] LOG: duration: 0.071 ms parse
<unnamed>: INSERT INTO c5_attribute(attribute_id, attribute_name,
attribute_type, table_name, column_name, deleted, sql_data_type) VALUES (2,
'&&last_modified', 7, 'member', 'attribute_2', FALSE, 10)
2018-10-22 14:06:57.218 CEST [18768] LOG: duration: 0.030 ms bind
<unnamed>: INSERT INTO c5_attribute(attribute_id, attribute_name,
attribute_type, table_name, column_name, deleted, sql_data_type) VALUES (2,
'&&last_modified', 7, 'member', 'attribute_2', FALSE, 10)
2018-10-22 14:06:57.219 CEST [18768] LOG: duration: 0.055 ms execute
<unnamed>: INSERT INTO c5_attribute(attribute_id, attribute_name,
attribute_type, table_name, column_name, deleted, sql_data_type) VALUES (2,
'&&last_modified', 7, 'member', 'attribute_2', FALSE, 10)
2018-10-22 14:06:57.221 CEST [18768] LOG: duration: 0.049 ms parse
<unnamed>: INSERT INTO c5_attribute(attribute_id, attribute_name,
attribute_type, table_name, column_name, deleted, sql_data_type) VALUES (3,
'&&hardbounce', 8, 'member', 'attribute_3', FALSE, 2)
2018-10-22 14:06:57.221 CEST [18768] LOG: duration: 0.023 ms bind
<unnamed>: INSERT INTO c5_attribute(attribute_id, attribute_name,
attribute_type, table_name, column_name, deleted, sql_data_type) VALUES (3,
'&&hardbounce', 8, 'member', 'attribute_3', FALSE, 2)
2018-10-22 14:06:57.221 CEST [18768] LOG: duration: 0.033 ms execute
<unnamed>: INSERT INTO c5_attribute(attribute_id, attribute_name,
attribute_type, table_name, column_name, deleted, sql_data_type) VALUES (3,
'&&hardbounce', 8, 'member', 'attribute_3', FALSE, 2)
2018-10-22 14:06:57.224 CEST [18768] LOG: duration: 0.071 ms parse
<unnamed>: CREATE TABLE c5_list( list_id INT4, list_name TEXT NOT NULL,
list_description TEXT, list_type INT4 NOT NULL, filter_id INT4,
creation_date TIMESTAMP, creator_user_id INT4, last_save_date TIMESTAMP,
last_editor_user_id INT4, deleted BOOLEAN NOT NULL DEFAULT FALSE,
deleted_date TIMESTAMP, PRIMARY KEY(list_id))
2018-10-22 14:06:57.224 CEST [18768] LOG: duration: 0.015 ms bind
<unnamed>: CREATE TABLE c5_list( list_id INT4, list_name TEXT NOT NULL,
list_description TEXT, list_type INT4 NOT NULL, filter_id INT4,
creation_date TIMESTAMP, creator_user_id INT4, last_save_date TIMESTAMP,
last_editor_user_id INT4, deleted BOOLEAN NOT NULL DEFAULT FALSE,
deleted_date TIMESTAMP, PRIMARY KEY(list_id))
2018-10-22 14:06:57.230 CEST [18768] DEBUG: building index
"pg_toast_40974_index" on table "pg_toast_40974" serially
2018-10-22 14:06:57.230 CEST [18768] STATEMENT: CREATE TABLE c5_list(
list_id INT4, list_name TEXT NOT NULL, list_description TEXT, list_type INT4
NOT NULL, filter_id INT4, creation_date TIMESTAMP, creator_user_id INT4,
last_save_date TIMESTAMP, last_editor_user_id INT4, deleted BOOLEAN NOT NULL
DEFAULT FALSE, deleted_date TIMESTAMP, PRIMARY KEY(list_id))
2018-10-22 14:06:57.237 CEST [18768] DEBUG: CREATE TABLE / PRIMARY KEY will
create implicit index "c5_list_pkey" for table "c5_list"
2018-10-22 14:06:57.237 CEST [18768] STATEMENT: CREATE TABLE c5_list(
list_id INT4, list_name TEXT NOT NULL, list_description TEXT, list_type INT4
NOT NULL, filter_id INT4, creation_date TIMESTAMP, creator_user_id INT4,
last_save_date TIMESTAMP, last_editor_user_id INT4, deleted BOOLEAN NOT NULL
DEFAULT FALSE, deleted_date TIMESTAMP, PRIMARY KEY(list_id))
2018-10-22 14:06:57.238 CEST [18768] DEBUG: building index "c5_list_pkey"
on table "c5_list" serially
2018-10-22 14:06:57.238 CEST [18768] STATEMENT: CREATE TABLE c5_list(
list_id INT4, list_name TEXT NOT NULL, list_description TEXT, list_type INT4
NOT NULL, filter_id INT4, creation_date TIMESTAMP, creator_user_id INT4,
last_save_date TIMESTAMP, last_editor_user_id INT4, deleted BOOLEAN NOT NULL
DEFAULT FALSE, deleted_date TIMESTAMP, PRIMARY KEY(list_id))
2018-10-22 14:06:57.243 CEST [18768] LOG: duration: 18.676 ms execute
<unnamed>: CREATE TABLE c5_list( list_id INT4, list_name TEXT NOT NULL,
list_description TEXT, list_type INT4 NOT NULL, filter_id INT4,
creation_date TIMESTAMP, creator_user_id INT4, last_save_date TIMESTAMP,
last_editor_user_id INT4, deleted BOOLEAN NOT NULL DEFAULT FALSE,
deleted_date TIMESTAMP, PRIMARY KEY(list_id))
2018-10-22 14:06:57.246 CEST [18768] LOG: duration: 0.075 ms parse
<unnamed>: CREATE TABLE c5_member( member_id INT4 NOT NULL, member_email
VARCHAR(128) NOT NULL, attribute_1 VARCHAR(128) NOT NULL, attribute_2
TIMESTAMP, attribute_3 INT4, attribute_4 TIMESTAMP, attribute_5 VARCHAR(80),
attribute_6 INT4, PRIMARY KEY(member_id))
2018-10-22 14:06:57.246 CEST [18768] LOG: duration: 0.011 ms bind
<unnamed>: CREATE TABLE c5_member( member_id INT4 NOT NULL, member_email
VARCHAR(128) NOT NULL, attribute_1 VARCHAR(128) NOT NULL, attribute_2
TIMESTAMP, attribute_3 INT4, attribute_4 TIMESTAMP, attribute_5 VARCHAR(80),
attribute_6 INT4, PRIMARY KEY(member_id))
2018-10-22 14:06:57.247 CEST [18768] DEBUG: CREATE TABLE / PRIMARY KEY will
create implicit index "c5_member_pkey" for table "c5_member"
2018-10-22 14:06:57.247 CEST [18768] STATEMENT: CREATE TABLE c5_member(
member_id INT4 NOT NULL, member_email VARCHAR(128) NOT NULL, attribute_1
VARCHAR(128) NOT NULL, attribute_2 TIMESTAMP, attribute_3 INT4, attribute_4
TIMESTAMP, attribute_5 VARCHAR(80), attribute_6 INT4, PRIMARY
KEY(member_id))
2018-10-22 14:06:57.249 CEST [18768] DEBUG: building index "c5_member_pkey"
on table "c5_member" serially
2018-10-22 14:06:57.249 CEST [18768] STATEMENT: CREATE TABLE c5_member(
member_id INT4 NOT NULL, member_email VARCHAR(128) NOT NULL, attribute_1
VARCHAR(128) NOT NULL, attribute_2 TIMESTAMP, attribute_3 INT4, attribute_4
TIMESTAMP, attribute_5 VARCHAR(80), attribute_6 INT4, PRIMARY
KEY(member_id))
2018-10-22 14:06:57.254 CEST [18768] LOG: duration: 8.135 ms execute
<unnamed>: CREATE TABLE c5_member( member_id INT4 NOT NULL, member_email
VARCHAR(128) NOT NULL, attribute_1 VARCHAR(128) NOT NULL, attribute_2
TIMESTAMP, attribute_3 INT4, attribute_4 TIMESTAMP, attribute_5 VARCHAR(80),
attribute_6 INT4, PRIMARY KEY(member_id))
2018-10-22 14:06:57.257 CEST [18768] LOG: duration: 0.051 ms parse
<unnamed>: CREATE INDEX c5_idx_member_1 ON c5_member(member_email)
2018-10-22 14:06:57.257 CEST [18768] LOG: duration: 0.006 ms bind
<unnamed>: CREATE INDEX c5_idx_member_1 ON c5_member(member_email)
2018-10-22 14:06:57.259 CEST [18768] DEBUG: building index
"c5_idx_member_1" on table "c5_member" serially
2018-10-22 14:06:57.259 CEST [18768] STATEMENT: CREATE INDEX
c5_idx_member_1 ON c5_member(member_email)
2018-10-22 14:06:57.264 CEST [18768] LOG: duration: 6.762 ms execute
<unnamed>: CREATE INDEX c5_idx_member_1 ON c5_member(member_email)
2018-10-22 14:06:57.267 CEST [18768] LOG: duration: 0.054 ms parse
<unnamed>: CREATE INDEX c5_idx_member_attr_2 ON c5_member(attribute_2)
2018-10-22 14:06:57.267 CEST [18768] LOG: duration: 0.006 ms bind
<unnamed>: CREATE INDEX c5_idx_member_attr_2 ON c5_member(attribute_2)
2018-10-22 14:06:57.269 CEST [18768] DEBUG: building index
"c5_idx_member_attr_2" on table "c5_member" serially
2018-10-22 14:06:57.269 CEST [18768] STATEMENT: CREATE INDEX
c5_idx_member_attr_2 ON c5_member(attribute_2)
2018-10-22 14:06:57.273 CEST [18768] LOG: duration: 6.355 ms execute
<unnamed>: CREATE INDEX c5_idx_member_attr_2 ON c5_member(attribute_2)
2018-10-22 14:06:57.276 CEST [18768] LOG: duration: 0.058 ms parse
<unnamed>: CREATE UNIQUE INDEX c5_idx_member_attr_1 ON
c5_member(attribute_1)
2018-10-22 14:06:57.276 CEST [18768] LOG: duration: 0.007 ms bind
<unnamed>: CREATE UNIQUE INDEX c5_idx_member_attr_1 ON
c5_member(attribute_1)
2018-10-22 14:06:57.278 CEST [18768] DEBUG: building index
"c5_idx_member_attr_1" on table "c5_member" serially
2018-10-22 14:06:57.278 CEST [18768] STATEMENT: CREATE UNIQUE INDEX
c5_idx_member_attr_1 ON c5_member(attribute_1)
2018-10-22 14:06:57.285 CEST [18768] LOG: duration: 7.652 ms execute
<unnamed>: CREATE UNIQUE INDEX c5_idx_member_attr_1 ON
c5_member(attribute_1)
2018-10-22 14:06:57.288 CEST [18768] LOG: duration: 0.064 ms parse
<unnamed>: CREATE TABLE c5_unsubscription( recipient_id INT8 REFERENCES
c5_member (member_id) ON DELETE CASCADE, list_id INT4 REFERENCES c5_list
(list_id) ON DELETE CASCADE, unsubscription_date TIMESTAMP,
original_subscription_date TIMESTAMP, PRIMARY KEY(recipient_id, list_id))
2018-10-22 14:06:57.288 CEST [18768] LOG: duration: 0.028 ms bind
<unnamed>: CREATE TABLE c5_unsubscription( recipient_id INT8 REFERENCES
c5_member (member_id) ON DELETE CASCADE, list_id INT4 REFERENCES c5_list
(list_id) ON DELETE CASCADE, unsubscription_date TIMESTAMP,
original_subscription_date TIMESTAMP, PRIMARY KEY(recipient_id, list_id))
2018-10-22 14:06:57.289 CEST [18768] DEBUG: CREATE TABLE / PRIMARY KEY will
create implicit index "c5_unsubscription_pkey" for table
"c5_unsubscription"
2018-10-22 14:06:57.289 CEST [18768] STATEMENT: CREATE TABLE
c5_unsubscription( recipient_id INT8 REFERENCES c5_member (member_id) ON
DELETE CASCADE, list_id INT4 REFERENCES c5_list (list_id) ON DELETE CASCADE,
unsubscription_date TIMESTAMP, original_subscription_date TIMESTAMP, PRIMARY
KEY(recipient_id, list_id))
2018-10-22 14:06:57.292 CEST [18768] DEBUG: building index
"c5_unsubscription_pkey" on table "c5_unsubscription" serially
2018-10-22 14:06:57.292 CEST [18768] STATEMENT: CREATE TABLE
c5_unsubscription( recipient_id INT8 REFERENCES c5_member (member_id) ON
DELETE CASCADE, list_id INT4 REFERENCES c5_list (list_id) ON DELETE CASCADE,
unsubscription_date TIMESTAMP, original_subscription_date TIMESTAMP, PRIMARY
KEY(recipient_id, list_id))
2018-10-22 14:06:57.298 CEST [18768] LOG: duration: 10.024 ms execute
<unnamed>: CREATE TABLE c5_unsubscription( recipient_id INT8 REFERENCES
c5_member (member_id) ON DELETE CASCADE, list_id INT4 REFERENCES c5_list
(list_id) ON DELETE CASCADE, unsubscription_date TIMESTAMP,
original_subscription_date TIMESTAMP, PRIMARY KEY(recipient_id, list_id))
2018-10-22 14:06:57.407 CEST [7388] LOG: duration: 0.168 ms parse
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:57.407 CEST [7388] LOG: duration: 0.009 ms bind
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:57.407 CEST [7388] LOG: duration: 0.017 ms execute
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:57.408 CEST [7388] LOG: duration: 0.039 ms parse
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:57.408 CEST [7388] LOG: duration: 0.005 ms bind
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:57.408 CEST [7388] LOG: duration: 0.007 ms execute
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:57.423 CEST [7388] LOG: duration: 2.119 ms parse
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND c.relname LIKE
'%' AND (false OR ( c.relkind IN ('r','p') AND n.nspname !~ '^pg_' AND
n.nspname <> 'information_schema' ) ) ORDER BY
TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:57.426 CEST [7388] LOG: duration: 2.956 ms bind
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND c.relname LIKE
'%' AND (false OR ( c.relkind IN ('r','p') AND n.nspname !~ '^pg_' AND
n.nspname <> 'information_schema' ) ) ORDER BY
TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:57.427 CEST [7388] LOG: duration: 0.253 ms execute
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND c.relname LIKE
'%' AND (false OR ( c.relkind IN ('r','p') AND n.nspname !~ '^pg_' AND
n.nspname <> 'information_schema' ) ) ORDER BY
TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:57.432 CEST [7388] LOG: duration: 0.367 ms parse
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND c.relname LIKE
'c5_member' ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:57.433 CEST [7388] LOG: duration: 0.839 ms bind
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND c.relname LIKE
'c5_member' ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:57.433 CEST [7388] LOG: duration: 0.145 ms execute
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND c.relname LIKE
'c5_member' ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:57.434 CEST [7388] LOG: duration: 0.213 ms parse
<unnamed>: delete from c5_member
2018-10-22 14:06:57.445 CEST [7388] LOG: duration: 10.990 ms bind
<unnamed>: delete from c5_member
2018-10-22 14:06:57.445 CEST [7388] LOG: duration: 0.042 ms execute
<unnamed>: delete from c5_member
2018-10-22 14:06:57.449 CEST [7388] LOG: duration: 1.422 ms parse
<unnamed>: SELECT * FROM (SELECT
n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd'
AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,row_number() OVER
(PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity,
'') as attidentity,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS
adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace
n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN
pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t
ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON
(a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN
pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum =
dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND
dc.relname='pg_class') LEFT JOIN pg_catalog.pg_namespace dn ON
(dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') WHERE c.relkind in
('r','p','v','f','m') and a.attnum > 0 AND NOT a.attisdropped AND c.relname
LIKE 'c5_member') c WHERE true AND attname LIKE '%' ORDER BY
nspname,c.relname,attnum
2018-10-22 14:06:57.452 CEST [7388] LOG: duration: 3.563 ms bind
<unnamed>: SELECT * FROM (SELECT
n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd'
AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,row_number() OVER
(PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity,
'') as attidentity,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS
adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace
n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN
pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t
ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON
(a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN
pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum =
dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND
dc.relname='pg_class') LEFT JOIN pg_catalog.pg_namespace dn ON
(dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') WHERE c.relkind in
('r','p','v','f','m') and a.attnum > 0 AND NOT a.attisdropped AND c.relname
LIKE 'c5_member') c WHERE true AND attname LIKE '%' ORDER BY
nspname,c.relname,attnum
2018-10-22 14:06:57.453 CEST [7388] LOG: duration: 0.189 ms execute
<unnamed>: SELECT * FROM (SELECT
n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd'
AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,row_number() OVER
(PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity,
'') as attidentity,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS
adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace
n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN
pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t
ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON
(a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN
pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum =
dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND
dc.relname='pg_class') LEFT JOIN pg_catalog.pg_namespace dn ON
(dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') WHERE c.relkind in
('r','p','v','f','m') and a.attnum > 0 AND NOT a.attisdropped AND c.relname
LIKE 'c5_member') c WHERE true AND attname LIKE '%' ORDER BY
nspname,c.relname,attnum
2018-10-22 14:06:57.456 CEST [7388] LOG: duration: 0.588 ms parse
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, ct.relname
AS TABLE_NAME, a.attname AS COLUMN_NAME, (i.keys).n AS KEY_SEQ, ci.relname
AS PK_NAME FROM pg_catalog.pg_class ct JOIN pg_catalog.pg_attribute a ON
(ct.oid = a.attrelid) JOIN pg_catalog.pg_namespace n ON (ct.relnamespace =
n.oid) JOIN (SELECT i.indexrelid, i.indrelid, i.indisprimary,
information_schema._pg_expandarray(i.indkey) AS keys FROM
pg_catalog.pg_index i) i ON (a.attnum = (i.keys).x AND a.attrelid =
i.indrelid) JOIN pg_catalog.pg_class ci ON (ci.oid = i.indexrelid) WHERE
true AND ct.relname = 'c5_member' AND i.indisprimary ORDER BY table_name,
pk_name, key_seq
2018-10-22 14:06:57.458 CEST [7388] LOG: duration: 1.513 ms bind
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, ct.relname
AS TABLE_NAME, a.attname AS COLUMN_NAME, (i.keys).n AS KEY_SEQ, ci.relname
AS PK_NAME FROM pg_catalog.pg_class ct JOIN pg_catalog.pg_attribute a ON
(ct.oid = a.attrelid) JOIN pg_catalog.pg_namespace n ON (ct.relnamespace =
n.oid) JOIN (SELECT i.indexrelid, i.indrelid, i.indisprimary,
information_schema._pg_expandarray(i.indkey) AS keys FROM
pg_catalog.pg_index i) i ON (a.attnum = (i.keys).x AND a.attrelid =
i.indrelid) JOIN pg_catalog.pg_class ci ON (ci.oid = i.indexrelid) WHERE
true AND ct.relname = 'c5_member' AND i.indisprimary ORDER BY table_name,
pk_name, key_seq
2018-10-22 14:06:57.458 CEST [7388] LOG: duration: 0.520 ms execute
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, ct.relname
AS TABLE_NAME, a.attname AS COLUMN_NAME, (i.keys).n AS KEY_SEQ, ci.relname
AS PK_NAME FROM pg_catalog.pg_class ct JOIN pg_catalog.pg_attribute a ON
(ct.oid = a.attrelid) JOIN pg_catalog.pg_namespace n ON (ct.relnamespace =
n.oid) JOIN (SELECT i.indexrelid, i.indrelid, i.indisprimary,
information_schema._pg_expandarray(i.indkey) AS keys FROM
pg_catalog.pg_index i) i ON (a.attnum = (i.keys).x AND a.attrelid =
i.indrelid) JOIN pg_catalog.pg_class ci ON (ci.oid = i.indexrelid) WHERE
true AND ct.relname = 'c5_member' AND i.indisprimary ORDER BY table_name,
pk_name, key_seq
2018-10-22 14:06:57.470 CEST [7388] LOG: duration: 0.147 ms parse
<unnamed>: insert into c5_member (member_id, member_email, attribute_1,
attribute_2, attribute_3, attribute_4, attribute_5, attribute_6) values ($1,
$2, $3, $4, $5, $6, $7, $8)
2018-10-22 14:06:57.470 CEST [7388] LOG: duration: 0.064 ms bind
<unnamed>: insert into c5_member (member_id, member_email, attribute_1,
attribute_2, attribute_3, attribute_4, attribute_5, attribute_6) values ($1,
$2, $3, $4, $5, $6, $7, $8)
2018-10-22 14:06:57.470 CEST [7388] DETAIL: parameters: $1 = '1', $2 =
'[email protected]', $3 = '[email protected]', $4 = '2009-02-11 09:14:26',
$5 = NULL, $6 = '2009-02-11 09:14:04', $7 = 'R1', $8 = NULL
2018-10-22 14:06:57.472 CEST [7388] LOG: duration: 1.228 ms execute
<unnamed>: insert into c5_member (member_id, member_email, attribute_1,
attribute_2, attribute_3, attribute_4, attribute_5, attribute_6) values ($1,
$2, $3, $4, $5, $6, $7, $8)
2018-10-22 14:06:57.472 CEST [7388] DETAIL: parameters: $1 = '1', $2 =
'[email protected]', $3 = '[email protected]', $4 = '2009-02-11 09:14:26',
$5 = NULL, $6 = '2009-02-11 09:14:04', $7 = 'R1', $8 = NULL
2018-10-22 14:06:57.478 CEST [7388] LOG: duration: 0.064 ms parse
<unnamed>: insert into c5_member (member_id, member_email, attribute_1,
attribute_2, attribute_3, attribute_4, attribute_5, attribute_6) values ($1,
$2, $3, $4, $5, $6, $7, $8)
2018-10-22 14:06:57.478 CEST [7388] LOG: duration: 0.051 ms bind
<unnamed>: insert into c5_member (member_id, member_email, attribute_1,
attribute_2, attribute_3, attribute_4, attribute_5, attribute_6) values ($1,
$2, $3, $4, $5, $6, $7, $8)
2018-10-22 14:06:57.478 CEST [7388] DETAIL: parameters: $1 = '2', $2 =
'[email protected]', $3 = '[email protected]', $4 = '2009-02-11 09:14:31',
$5 = NULL, $6 = NULL, $7 = 'R2', $8 = NULL
2018-10-22 14:06:57.479 CEST [7388] LOG: duration: 0.076 ms execute
<unnamed>: insert into c5_member (member_id, member_email, attribute_1,
attribute_2, attribute_3, attribute_4, attribute_5, attribute_6) values ($1,
$2, $3, $4, $5, $6, $7, $8)
2018-10-22 14:06:57.479 CEST [7388] DETAIL: parameters: $1 = '2', $2 =
'[email protected]', $3 = '[email protected]', $4 = '2009-02-11 09:14:31',
$5 = NULL, $6 = NULL, $7 = 'R2', $8 = NULL
2018-10-22 14:06:59.070 CEST [12476] LOG: duration: 0.177 ms parse
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.070 CEST [12476] LOG: duration: 0.010 ms bind
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.070 CEST [12476] LOG: duration: 0.016 ms execute
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.070 CEST [12476] LOG: duration: 0.023 ms parse
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.070 CEST [12476] LOG: duration: 0.004 ms bind
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.070 CEST [12476] LOG: duration: 0.006 ms execute
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.072 CEST [12476] LOG: duration: 0.017 ms parse
<unnamed>:
2018-10-22 14:06:59.072 CEST [12476] LOG: duration: 0.004 ms bind
<unnamed>:
2018-10-22 14:06:59.072 CEST [12476] LOG: duration: 0.056 ms parse
<unnamed>: SHOW TRANSACTION ISOLATION LEVEL
2018-10-22 14:06:59.072 CEST [12476] LOG: duration: 0.008 ms bind
<unnamed>: SHOW TRANSACTION ISOLATION LEVEL
2018-10-22 14:06:59.072 CEST [12476] LOG: duration: 0.026 ms execute
<unnamed>: SHOW TRANSACTION ISOLATION LEVEL
2018-10-22 14:06:59.265 CEST [17840] LOG: duration: 0.195 ms parse
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.265 CEST [17840] LOG: duration: 0.011 ms bind
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.265 CEST [17840] LOG: duration: 0.018 ms execute
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.265 CEST [17840] LOG: duration: 0.031 ms parse
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.265 CEST [17840] LOG: duration: 0.006 ms bind
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.265 CEST [17840] LOG: duration: 0.008 ms execute
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.266 CEST [17840] LOG: duration: 0.017 ms parse
<unnamed>:
2018-10-22 14:06:59.266 CEST [17840] LOG: duration: 0.004 ms bind
<unnamed>:
2018-10-22 14:06:59.266 CEST [17840] LOG: duration: 0.063 ms parse
<unnamed>: SHOW TRANSACTION ISOLATION LEVEL
2018-10-22 14:06:59.266 CEST [17840] LOG: duration: 0.006 ms bind
<unnamed>: SHOW TRANSACTION ISOLATION LEVEL
2018-10-22 14:06:59.266 CEST [17840] LOG: duration: 0.033 ms execute
<unnamed>: SHOW TRANSACTION ISOLATION LEVEL
2018-10-22 14:06:59.398 CEST [22568] LOG: duration: 0.186 ms parse
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.398 CEST [22568] LOG: duration: 0.012 ms bind
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.398 CEST [22568] LOG: duration: 0.018 ms execute
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.398 CEST [22568] LOG: duration: 0.026 ms parse
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.398 CEST [22568] LOG: duration: 0.006 ms bind
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.398 CEST [22568] LOG: duration: 0.007 ms execute
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.410 CEST [22568] LOG: duration: 0.049 ms parse
<unnamed>: SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY
2018-10-22 14:06:59.410 CEST [22568] LOG: duration: 0.008 ms bind
<unnamed>: SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY
2018-10-22 14:06:59.410 CEST [22568] LOG: duration: 0.010 ms execute
<unnamed>: SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY
2018-10-22 14:06:59.424 CEST [22568] LOG: duration: 0.027 ms parse
<unnamed>: BEGIN
2018-10-22 14:06:59.424 CEST [22568] LOG: duration: 0.006 ms bind
<unnamed>: BEGIN
2018-10-22 14:06:59.424 CEST [22568] LOG: duration: 0.004 ms execute
<unnamed>: BEGIN
2018-10-22 14:06:59.424 CEST [22568] LOG: duration: 0.252 ms parse
<unnamed>: SELECT generator_name, max_id FROM c5_uid
2018-10-22 14:06:59.430 CEST [22568] LOG: duration: 5.786 ms bind
<unnamed>/C_1: SELECT generator_name, max_id FROM c5_uid
2018-10-22 14:06:59.430 CEST [22568] LOG: duration: 0.054 ms execute
<unnamed>/C_1: SELECT generator_name, max_id FROM c5_uid
2018-10-22 14:06:59.438 CEST [22568] LOG: duration: 0.013 ms parse S_2:
COMMIT
2018-10-22 14:06:59.439 CEST [22568] LOG: duration: 0.010 ms bind S_2:
COMMIT
2018-10-22 14:06:59.439 CEST [22568] LOG: duration: 0.030 ms execute S_2:
COMMIT
2018-10-22 14:06:59.439 CEST [22568] LOG: duration: 0.037 ms parse
<unnamed>: SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE
2018-10-22 14:06:59.439 CEST [22568] LOG: duration: 0.004 ms bind
<unnamed>: SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE
2018-10-22 14:06:59.439 CEST [22568] LOG: duration: 0.013 ms execute
<unnamed>: SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE
2018-10-22 14:06:59.501 CEST [14848] LOG: duration: 0.154 ms parse
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.501 CEST [14848] LOG: duration: 0.010 ms bind
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.501 CEST [14848] LOG: duration: 0.015 ms execute
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.501 CEST [14848] LOG: duration: 0.026 ms parse
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.501 CEST [14848] LOG: duration: 0.004 ms bind
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.501 CEST [14848] LOG: duration: 0.007 ms execute
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.503 CEST [14848] LOG: duration: 0.024 ms parse
<unnamed>: BEGIN
2018-10-22 14:06:59.503 CEST [14848] LOG: duration: 0.005 ms bind
<unnamed>: BEGIN
2018-10-22 14:06:59.503 CEST [14848] LOG: duration: 0.004 ms execute
<unnamed>: BEGIN
2018-10-22 14:06:59.504 CEST [14848] LOG: duration: 1.395 ms parse
<unnamed>: SELECT * FROM (SELECT
n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd'
AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,row_number() OVER
(PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity,
'') as attidentity,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS
adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace
n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN
pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t
ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON
(a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN
pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum =
dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND
dc.relname='pg_class') LEFT JOIN pg_catalog.pg_namespace dn ON
(dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') WHERE c.relkind in
('r','p','v','f','m') and a.attnum > 0 AND NOT a.attisdropped AND c.relname
LIKE 'c5_member') c WHERE true ORDER BY nspname,c.relname,attnum
2018-10-22 14:06:59.509 CEST [14848] LOG: duration: 5.095 ms bind
<unnamed>: SELECT * FROM (SELECT
n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd'
AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,row_number() OVER
(PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity,
'') as attidentity,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS
adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace
n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN
pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t
ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON
(a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN
pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum =
dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND
dc.relname='pg_class') LEFT JOIN pg_catalog.pg_namespace dn ON
(dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') WHERE c.relkind in
('r','p','v','f','m') and a.attnum > 0 AND NOT a.attisdropped AND c.relname
LIKE 'c5_member') c WHERE true ORDER BY nspname,c.relname,attnum
2018-10-22 14:06:59.510 CEST [14848] LOG: duration: 0.222 ms execute
<unnamed>: SELECT * FROM (SELECT
n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd'
AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,row_number() OVER
(PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity,
'') as attidentity,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS
adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace
n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN
pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t
ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON
(a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN
pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum =
dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND
dc.relname='pg_class') LEFT JOIN pg_catalog.pg_namespace dn ON
(dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') WHERE c.relkind in
('r','p','v','f','m') and a.attnum > 0 AND NOT a.attisdropped AND c.relname
LIKE 'c5_member') c WHERE true ORDER BY nspname,c.relname,attnum
2018-10-22 14:06:59.511 CEST [14848] LOG: duration: 0.016 ms parse S_1:
ROLLBACK
2018-10-22 14:06:59.511 CEST [14848] LOG: duration: 0.099 ms bind S_1:
ROLLBACK
2018-10-22 14:06:59.511 CEST [14848] LOG: duration: 0.019 ms execute S_1:
ROLLBACK
2018-10-22 14:06:59.512 CEST [14848] LOG: duration: 0.160 ms parse
<unnamed>: BEGIN
2018-10-22 14:06:59.512 CEST [14848] LOG: duration: 0.004 ms bind
<unnamed>: BEGIN
2018-10-22 14:06:59.512 CEST [14848] LOG: duration: 0.003 ms execute
<unnamed>: BEGIN
2018-10-22 14:06:59.512 CEST [14848] LOG: duration: 0.035 ms parse
<unnamed>: ALTER TABLE c5_member ADD attribute_7 INT4
2018-10-22 14:06:59.512 CEST [14848] LOG: duration: 0.005 ms bind
<unnamed>: ALTER TABLE c5_member ADD attribute_7 INT4
2018-10-22 14:06:59.513 CEST [14848] LOG: duration: 0.674 ms execute
<unnamed>: ALTER TABLE c5_member ADD attribute_7 INT4
2018-10-22 14:06:59.513 CEST [14848] LOG: duration: 0.010 ms parse S_2:
COMMIT
2018-10-22 14:06:59.514 CEST [14848] LOG: duration: 0.024 ms bind S_2:
COMMIT
2018-10-22 14:06:59.527 CEST [14848] LOG: duration: 13.455 ms execute S_2:
COMMIT
2018-10-22 14:06:59.528 CEST [14848] LOG: duration: 0.022 ms parse
<unnamed>: BEGIN
2018-10-22 14:06:59.528 CEST [14848] LOG: duration: 0.005 ms bind
<unnamed>: BEGIN
2018-10-22 14:06:59.528 CEST [14848] LOG: duration: 0.004 ms execute
<unnamed>: BEGIN
2018-10-22 14:06:59.528 CEST [14848] LOG: duration: 0.497 ms parse
<unnamed>: SELECT * FROM (SELECT
n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd'
AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,row_number() OVER
(PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity,
'') as attidentity,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS
adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace
n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN
pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t
ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON
(a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN
pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum =
dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND
dc.relname='pg_class') LEFT JOIN pg_catalog.pg_namespace dn ON
(dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') WHERE c.relkind in
('r','p','v','f','m') and a.attnum > 0 AND NOT a.attisdropped AND c.relname
LIKE 'c5_member') c WHERE true ORDER BY nspname,c.relname,attnum
2018-10-22 14:06:59.530 CEST [14848] LOG: duration: 1.871 ms bind
<unnamed>: SELECT * FROM (SELECT
n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd'
AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,row_number() OVER
(PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity,
'') as attidentity,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS
adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace
n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN
pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t
ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON
(a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN
pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum =
dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND
dc.relname='pg_class') LEFT JOIN pg_catalog.pg_namespace dn ON
(dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') WHERE c.relkind in
('r','p','v','f','m') and a.attnum > 0 AND NOT a.attisdropped AND c.relname
LIKE 'c5_member') c WHERE true ORDER BY nspname,c.relname,attnum
2018-10-22 14:06:59.531 CEST [14848] LOG: duration: 0.194 ms execute
<unnamed>: SELECT * FROM (SELECT
n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd'
AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,row_number() OVER
(PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity,
'') as attidentity,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS
adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace
n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN
pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t
ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON
(a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN
pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum =
dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND
dc.relname='pg_class') LEFT JOIN pg_catalog.pg_namespace dn ON
(dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') WHERE c.relkind in
('r','p','v','f','m') and a.attnum > 0 AND NOT a.attisdropped AND c.relname
LIKE 'c5_member') c WHERE true ORDER BY nspname,c.relname,attnum
2018-10-22 14:06:59.532 CEST [14848] LOG: duration: 0.083 ms bind S_1:
ROLLBACK
2018-10-22 14:06:59.532 CEST [14848] LOG: duration: 0.019 ms execute S_1:
ROLLBACK
2018-10-22 14:06:59.532 CEST [14848] LOG: duration: 0.156 ms parse
<unnamed>: BEGIN
2018-10-22 14:06:59.532 CEST [14848] LOG: duration: 0.005 ms bind
<unnamed>: BEGIN
2018-10-22 14:06:59.532 CEST [14848] LOG: duration: 0.003 ms execute
<unnamed>: BEGIN
2018-10-22 14:06:59.533 CEST [14848] LOG: duration: 0.030 ms parse
<unnamed>: ALTER TABLE c5_member DROP COLUMN attribute_7
2018-10-22 14:06:59.533 CEST [14848] LOG: duration: 0.007 ms bind
<unnamed>: ALTER TABLE c5_member DROP COLUMN attribute_7
2018-10-22 14:06:59.533 CEST [14848] LOG: duration: 0.353 ms execute
<unnamed>: ALTER TABLE c5_member DROP COLUMN attribute_7
2018-10-22 14:06:59.533 CEST [14848] LOG: duration: 0.009 ms bind S_2:
COMMIT
2018-10-22 14:06:59.536 CEST [14848] LOG: duration: 2.269 ms execute S_2:
COMMIT
2018-10-22 14:06:59.536 CEST [14848] LOG: duration: 0.019 ms parse
<unnamed>: BEGIN
2018-10-22 14:06:59.536 CEST [14848] LOG: duration: 0.005 ms bind
<unnamed>: BEGIN
2018-10-22 14:06:59.537 CEST [14848] LOG: duration: 0.003 ms execute
<unnamed>: BEGIN
2018-10-22 14:06:59.537 CEST [14848] LOG: duration: 0.498 ms parse
<unnamed>: SELECT * FROM (SELECT
n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd'
AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,row_number() OVER
(PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity,
'') as attidentity,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS
adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace
n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN
pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t
ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON
(a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN
pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum =
dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND
dc.relname='pg_class') LEFT JOIN pg_catalog.pg_namespace dn ON
(dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') WHERE c.relkind in
('r','p','v','f','m') and a.attnum > 0 AND NOT a.attisdropped AND c.relname
LIKE 'c5_member') c WHERE true ORDER BY nspname,c.relname,attnum
2018-10-22 14:06:59.539 CEST [14848] LOG: duration: 1.830 ms bind
<unnamed>: SELECT * FROM (SELECT
n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd'
AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,row_number() OVER
(PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity,
'') as attidentity,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS
adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace
n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN
pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t
ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON
(a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN
pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum =
dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND
dc.relname='pg_class') LEFT JOIN pg_catalog.pg_namespace dn ON
(dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') WHERE c.relkind in
('r','p','v','f','m') and a.attnum > 0 AND NOT a.attisdropped AND c.relname
LIKE 'c5_member') c WHERE true ORDER BY nspname,c.relname,attnum
2018-10-22 14:06:59.539 CEST [14848] LOG: duration: 0.178 ms execute
<unnamed>: SELECT * FROM (SELECT
n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd'
AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,row_number() OVER
(PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity,
'') as attidentity,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS
adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace
n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN
pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t
ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON
(a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN
pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum =
dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND
dc.relname='pg_class') LEFT JOIN pg_catalog.pg_namespace dn ON
(dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') WHERE c.relkind in
('r','p','v','f','m') and a.attnum > 0 AND NOT a.attisdropped AND c.relname
LIKE 'c5_member') c WHERE true ORDER BY nspname,c.relname,attnum
2018-10-22 14:06:59.540 CEST [14848] LOG: duration: 0.077 ms bind S_1:
ROLLBACK
2018-10-22 14:06:59.540 CEST [14848] LOG: duration: 0.018 ms execute S_1:
ROLLBACK
2018-10-22 14:06:59.548 CEST [22568] LOG: duration: 0.023 ms parse
<unnamed>: BEGIN
2018-10-22 14:06:59.548 CEST [22568] LOG: duration: 0.006 ms bind
<unnamed>: BEGIN
2018-10-22 14:06:59.548 CEST [22568] LOG: duration: 0.006 ms execute
<unnamed>: BEGIN
2018-10-22 14:06:59.550 CEST [22568] LOG: duration: 1.233 ms parse
<unnamed>: UPDATE c5_uid SET max_id = $1 WHERE generator_name = $2
2018-10-22 14:06:59.550 CEST [22568] LOG: duration: 0.177 ms bind
<unnamed>: UPDATE c5_uid SET max_id = $1 WHERE generator_name = $2
2018-10-22 14:06:59.550 CEST [22568] DETAIL: parameters: $1 = '3', $2 =
'attribute'
2018-10-22 14:06:59.550 CEST [22568] LOG: duration: 0.126 ms execute
<unnamed>: UPDATE c5_uid SET max_id = $1 WHERE generator_name = $2
2018-10-22 14:06:59.550 CEST [22568] DETAIL: parameters: $1 = '3', $2 =
'attribute'
2018-10-22 14:06:59.550 CEST [22568] LOG: duration: 0.009 ms bind S_2:
COMMIT
2018-10-22 14:06:59.557 CEST [22568] LOG: duration: 6.285 ms execute S_2:
COMMIT
2018-10-22 14:06:59.621 CEST [22656] LOG: duration: 0.170 ms parse
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.621 CEST [22656] LOG: duration: 0.010 ms bind
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.621 CEST [22656] LOG: duration: 0.016 ms execute
<unnamed>: SET extra_float_digits = 3
2018-10-22 14:06:59.621 CEST [22656] LOG: duration: 0.024 ms parse
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.621 CEST [22656] LOG: duration: 0.004 ms bind
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.622 CEST [22656] LOG: duration: 0.006 ms execute
<unnamed>: SET application_name = 'PostgreSQL JDBC Driver'
2018-10-22 14:06:59.623 CEST [22656] LOG: duration: 1.082 ms parse
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND c.relname LIKE
'%' AND (false OR ( c.relkind IN ('r','p') AND n.nspname !~ '^pg_' AND
n.nspname <> 'information_schema' ) ) ORDER BY
TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:59.626 CEST [22656] LOG: duration: 2.779 ms bind
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND c.relname LIKE
'%' AND (false OR ( c.relkind IN ('r','p') AND n.nspname !~ '^pg_' AND
n.nspname <> 'information_schema' ) ) ORDER BY
TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:59.627 CEST [22656] LOG: duration: 0.252 ms execute
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND c.relname LIKE
'%' AND (false OR ( c.relkind IN ('r','p') AND n.nspname !~ '^pg_' AND
n.nspname <> 'information_schema' ) ) ORDER BY
TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:59.627 CEST [22656] LOG: duration: 0.381 ms parse
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND c.relname LIKE
'c5_member' ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:59.628 CEST [22656] LOG: duration: 0.715 ms bind
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND c.relname LIKE
'c5_member' ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:59.628 CEST [22656] LOG: duration: 0.113 ms execute
<unnamed>: SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS
TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'
WHEN true THEN CASE WHEN n.nspname = 'pg_catalog' OR n.nspname =
'information_schema' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM TABLE'
WHEN 'v' THEN 'SYSTEM VIEW' WHEN 'i' THEN 'SYSTEM INDEX' ELSE NULL END
WHEN n.nspname = 'pg_toast' THEN CASE c.relkind WHEN 'r' THEN 'SYSTEM
TOAST TABLE' WHEN 'i' THEN 'SYSTEM TOAST INDEX' ELSE NULL END ELSE
CASE c.relkind WHEN 'r' THEN 'TEMPORARY TABLE' WHEN 'p' THEN 'TEMPORARY
TABLE' WHEN 'i' THEN 'TEMPORARY INDEX' WHEN 'S' THEN 'TEMPORARY
SEQUENCE' WHEN 'v' THEN 'TEMPORARY VIEW' ELSE NULL END END WHEN
false THEN CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'p' THEN 'TABLE'
WHEN 'i' THEN 'INDEX' WHEN 'S' THEN 'SEQUENCE' WHEN 'v' THEN 'VIEW' WHEN
'c' THEN 'TYPE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'm' THEN 'MATERIALIZED
VIEW' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS
REMARKS FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN
pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) LEFT
JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')
LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND
dn.nspname='pg_catalog') WHERE c.relnamespace = n.oid AND c.relname LIKE
'c5_member' ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME
2018-10-22 14:06:59.629 CEST [22656] LOG: duration: 0.211 ms parse
<unnamed>: delete from c5_member
2018-10-22 14:06:59.643 CEST [22656] LOG: duration: 14.150 ms bind
<unnamed>: delete from c5_member
2018-10-22 14:06:59.651 CEST [22696] LOG: server process (PID 22656) was
terminated by exception 0xC0000005
2018-10-22 14:06:59.651 CEST [22696] DETAIL: Failed process was running:
delete from c5_member
2018-10-22 14:06:59.651 CEST [22696] HINT: See C include file "ntstatus.h"
for a description of the hexadecimal value.
2018-10-22 14:06:59.651 CEST [22696] LOG: terminating any other active
server processes
2018-10-22 14:06:59.663 CEST [3876] WARNING: terminating connection because
of crash of another server process
2018-10-22 14:06:59.663 CEST [3876] DETAIL: The postmaster has commanded
this server process to roll back the current transaction and exit, because
another server process exited abnormally and possibly corrupted shared
memory.
2018-10-22 14:06:59.663 CEST [3876] HINT: In a moment you should be able to
reconnect to the database and repeat your command.
2018-10-22 14:06:59.705 CEST [17508] FATAL: the database system is in
recovery mode
2018-10-22 14:06:59.712 CEST [22696] LOG: all server processes terminated;
reinitializing
2018-10-22 14:06:59.715 CEST [22696] DEBUG: could not enable Lock Pages in
Memory user right
2018-10-22 14:06:59.715 CEST [22696] HINT: Assign Lock Pages in Memory user
right to the Windows user account which runs PostgreSQL.
2018-10-22 14:06:59.715 CEST [22696] DEBUG: disabling huge pages
2018-10-22 14:06:59.755 CEST [22728] LOG: database system was interrupted;
last known up at 2018-10-22 14:02:11 CEST
2018-10-22 14:07:00.287 CEST [22728] DEBUG: checkpoint record is at
0/17A7588
2018-10-22 14:07:00.289 CEST [22728] DEBUG: redo record is at 0/17A7588;
shutdown true
2018-10-22 14:07:00.289 CEST [22728] DEBUG: next transaction ID: 0:735;
next OID: 40960
2018-10-22 14:07:00.289 CEST [22728] DEBUG: next MultiXactId: 1; next
MultiXactOffset: 0
2018-10-22 14:07:00.289 CEST [22728] DEBUG: oldest unfrozen transaction ID:
562, in database 1
2018-10-22 14:07:00.289 CEST [22728] DEBUG: oldest MultiXactId: 1, in
database 1
2018-10-22 14:07:00.289 CEST [22728] DEBUG: commit timestamp Xid
oldest/newest: 0/0
2018-10-22 14:07:00.289 CEST [22728] DEBUG: transaction ID wrap limit is
2147484209, limited by database with OID 1
2018-10-22 14:07:00.289 CEST [22728] DEBUG: MultiXactId wrap limit is
2147483648, limited by database with OID 1
2018-10-22 14:07:00.289 CEST [22728] DEBUG: starting up replication slots
2018-10-22 14:07:00.289 CEST [22728] LOG: database system was not properly
shut down; automatic recovery in progress
2018-10-22 14:07:00.297 CEST [22728] DEBUG: resetting unlogged relations:
cleanup 1 init 0
2018-10-22 14:07:00.299 CEST [22728] LOG: redo starts at 0/17A75F8
2018-10-22 14:07:00.349 CEST [22728] LOG: invalid record length at
0/17F0520: wanted 24, got 0
2018-10-22 14:07:00.349 CEST [22728] LOG: redo done at 0/17F04F8
2018-10-22 14:07:00.349 CEST [22728] LOG: last completed transaction was at
log time 2018-10-22 14:06:59.551035+02
2018-10-22 14:07:00.349 CEST [22728] DEBUG: resetting unlogged relations:
cleanup 0 init 1
2018-10-22 14:07:00.363 CEST [22728] DEBUG: performing replication slot
checkpoint
2018-10-22 14:07:01.342 CEST [22728] DEBUG: MultiXactId wrap limit is
2147483648, limited by database with OID 1
2018-10-22 14:07:01.342 CEST [22728] DEBUG: MultiXact member stop limit is
now 4294914944 based on MultiXact 1
2018-10-22 14:07:01.586 CEST [22696] DEBUG: starting background worker
process "logical replication launcher"
2018-10-22 14:07:01.621 CEST [22696] LOG: database system is ready to
accept connections
2018-10-22 14:07:01.628 CEST [4560] DEBUG: autovacuum launcher started
2018-10-22 14:07:01.665 CEST [2772] DEBUG: logical replication launcher
started
2018-10-22 14:12:01.586 CEST [10364] DEBUG: checkpoint skipped because
system is idle
2018-10-22 14:17:01.583 CEST [10364] DEBUG: checkpoint skipped because
system is idle
^ permalink raw reply [nested|flat] 26+ messages in thread
* Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005
2018-10-22 12:34 BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 PG Bug reporting form <[email protected]>
@ 2018-10-23 02:00 ` Amit Langote <[email protected]>
2018-10-23 03:16 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Michael Paquier <[email protected]>
2018-10-23 11:46 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Andrew Dunstan <[email protected]>
0 siblings, 2 replies; 26+ messages in thread
From: Amit Langote @ 2018-10-23 02:00 UTC (permalink / raw)
To: [email protected]; [email protected]; PG Bug reporting form <[email protected]>; +Cc: [email protected]
Hi,
On 2018/10/22 21:34, PG Bug reporting form wrote:
> The following bug has been logged on the website:
>
> Bug reference: 15448
> Logged by: Tillmann Schulz
> Email address: [email protected]
> PostgreSQL version: 11.0
> Operating system: Windows
> Description:
>
> I have a reproducable error when running two junit test cases in sequence
> from Java with Postgres 11.0.1. With postgres 10 everything worked fine.
>
>
> The error occurs at
>
> 2018-10-22 14:06:59.651 CEST [22696] LOG: server process (PID 22656) was
> terminated by exception 0xC0000005
> 2018-10-22 14:06:59.651 CEST [22696] DETAIL: Failed process was running:
> delete from c5_member
Thanks for the report and the log.
(Today I learned that exception 0xC0000005 is the Windows equivalent of
"segmentation fault".)
> Aft that, postgres is in recovery mode. Shortly after that the database is
> availiably again.
>
> The complete log of both testcases is:
After observing the test case in the provided log, I managed to reproduce
it with the following:
create table foo (a int primary key, b int);
create table bar (a int references foo on delete cascade, b int);
insert into foo values (1, 1);
insert into foo values (2, 2);
alter table foo add c int;
alter table foo drop c;
delete from foo;
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
Analyzing this crash, I located the bug down to GetTupleForTrigger(), but
perhaps it's really in heap_expand_tuple() / expand_tuple(), where the
value of trigger tuple's t_self is being switched from a valid one to an
invalid value.
In heaptuple.c: expand_tuple()
ItemPointerSetInvalid(&((*targetHeapTuple)->t_self));
FWIW, attached patch fixes this for me. Adding Andrew whose recent commit
7636e5c60f [1] seems to have introduced the heap_expan_tuple call in
GetTupleForTrigger. Maybe, he can better judge a fix for this.
Thanks,
Amit
[1] https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=7636e5c60f
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 240e85e391..3c9ce9be0c 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -3399,7 +3399,10 @@ ltrmark:;
}
if (HeapTupleHeaderGetNatts(tuple.t_data) < relation->rd_att->natts)
+ {
result = heap_expand_tuple(&tuple, relation->rd_att);
+ result->t_self = *tid;
+ }
else
result = heap_copytuple(&tuple);
ReleaseBuffer(buffer);
Attachments:
[text/plain] GetTupleForTrigger-fix.patch (456B, ../../[email protected]/2-GetTupleForTrigger-fix.patch)
download | inline diff:
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 240e85e391..3c9ce9be0c 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -3399,7 +3399,10 @@ ltrmark:;
}
if (HeapTupleHeaderGetNatts(tuple.t_data) < relation->rd_att->natts)
+ {
result = heap_expand_tuple(&tuple, relation->rd_att);
+ result->t_self = *tid;
+ }
else
result = heap_copytuple(&tuple);
ReleaseBuffer(buffer);
^ permalink raw reply [nested|flat] 26+ messages in thread
* Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005
2018-10-22 12:34 BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 PG Bug reporting form <[email protected]>
2018-10-23 02:00 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Amit Langote <[email protected]>
@ 2018-10-23 03:16 ` Michael Paquier <[email protected]>
2018-10-23 03:27 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Amit Langote <[email protected]>
1 sibling, 1 reply; 26+ messages in thread
From: Michael Paquier @ 2018-10-23 03:16 UTC (permalink / raw)
To: Amit Langote <[email protected]>; +Cc: [email protected]; [email protected]; PG Bug reporting form <[email protected]>; [email protected]
On Tue, Oct 23, 2018 at 11:00:56AM +0900, Amit Langote wrote:
> FWIW, attached patch fixes this for me. Adding Andrew whose recent commit
> 7636e5c60f [1] seems to have introduced the heap_expan_tuple call in
> GetTupleForTrigger. Maybe, he can better judge a fix for this.
Could you add that to the next commit fest as a bug fix? Adding
yourself as an author of this patch would be adapted. And we don't want
to lose track of this issue. (I am looking at some other stuff now...)
--
Michael
Attachments:
[application/pgp-signature] signature.asc (833B, ../../[email protected]/2-signature.asc)
download
^ permalink raw reply [nested|flat] 26+ messages in thread
* Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005
2018-10-22 12:34 BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 PG Bug reporting form <[email protected]>
2018-10-23 02:00 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Amit Langote <[email protected]>
2018-10-23 03:16 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Michael Paquier <[email protected]>
@ 2018-10-23 03:27 ` Amit Langote <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Amit Langote @ 2018-10-23 03:27 UTC (permalink / raw)
To: Michael Paquier <[email protected]>; +Cc: [email protected]; [email protected]; PG Bug reporting form <[email protected]>; [email protected]
On 2018/10/23 12:16, Michael Paquier wrote:
> On Tue, Oct 23, 2018 at 11:00:56AM +0900, Amit Langote wrote:
>> FWIW, attached patch fixes this for me. Adding Andrew whose recent commit
>> 7636e5c60f [1] seems to have introduced the heap_expan_tuple call in
>> GetTupleForTrigger. Maybe, he can better judge a fix for this.
>
> Could you add that to the next commit fest as a bug fix? Adding
> yourself as an author of this patch would be adapted. And we don't want
> to lose track of this issue. (I am looking at some other stuff now...)
Okay, I'll add this one and one more I posted a patch for last week.
Thanks,
Amit
^ permalink raw reply [nested|flat] 26+ messages in thread
* Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005
2018-10-22 12:34 BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 PG Bug reporting form <[email protected]>
2018-10-23 02:00 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Amit Langote <[email protected]>
@ 2018-10-23 11:46 ` Andrew Dunstan <[email protected]>
2018-10-23 13:44 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Amit Langote <[email protected]>
2018-10-24 23:00 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Michael Banck <[email protected]>
1 sibling, 2 replies; 26+ messages in thread
From: Andrew Dunstan @ 2018-10-23 11:46 UTC (permalink / raw)
To: Amit Langote <[email protected]>; [email protected]; [email protected]; pgsql-hackers
On 10/22/2018 10:00 PM, Amit Langote wrote:
>
> After observing the test case in the provided log, I managed to reproduce
> it with the following:
>
> create table foo (a int primary key, b int);
> create table bar (a int references foo on delete cascade, b int);
> insert into foo values (1, 1);
> insert into foo values (2, 2);
> alter table foo add c int;
> alter table foo drop c;
> delete from foo;
> server closed the connection unexpectedly
> This probably means the server terminated abnormally
> before or while processing the request.
> The connection to the server was lost. Attempting reset: Failed.
>
> Analyzing this crash, I located the bug down to GetTupleForTrigger(), but
> perhaps it's really in heap_expand_tuple() / expand_tuple(), where the
> value of trigger tuple's t_self is being switched from a valid one to an
> invalid value.
>
> In heaptuple.c: expand_tuple()
>
>
> ItemPointerSetInvalid(&((*targetHeapTuple)->t_self));
>
>
> FWIW, attached patch fixes this for me. Adding Andrew whose recent commit
> 7636e5c60f [1] seems to have introduced the heap_expan_tuple call in
> GetTupleForTrigger. Maybe, he can better judge a fix for this.
>
Thanks. I think the line in expand_tuple is a thinko and we should
change it, rather than change GetTupleForTrigger().
Here is a patch that does that and also adds your test case to the
regression tests.
cheers
andrew
--
Andrew Dunstan https://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Attachments:
[text/x-patch] fast_default_expand_tuple_fix.patch (2.2K, ../../[email protected]/2-fast_default_expand_tuple_fix.patch)
download | inline diff:
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 15444cf..28127b3 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -856,7 +856,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
= (HeapTupleHeader) ((char *) *targetHeapTuple + HEAPTUPLESIZE);
(*targetHeapTuple)->t_len = len;
(*targetHeapTuple)->t_tableOid = sourceTuple->t_tableOid;
- ItemPointerSetInvalid(&((*targetHeapTuple)->t_self));
+ (*targetHeapTuple)->t_self = sourceTuple->t_self;
targetTHeader->t_infomask = sourceTHeader->t_infomask;
targetTHeader->t_hoff = hoff;
diff --git a/src/test/regress/expected/fast_default.out b/src/test/regress/expected/fast_default.out
index 48bd360..0797e11 100644
--- a/src/test/regress/expected/fast_default.out
+++ b/src/test/regress/expected/fast_default.out
@@ -727,7 +727,17 @@ SELECT * FROM t;
(1 row)
DROP TABLE t;
+-- make sure expanded tuple has correct self pointer
+-- it will be required by the RI tigger doing the cascading delete
+CREATE TABLE leader (a int PRIMARY KEY, b int);
+CREATE TABLE follower (a int REFERENCES leader ON DELETE CASCADE, b int);
+INSERT INTO leader VALUES (1, 1), (2, 2);
+ALTER TABLE leader ADD c int;
+ALTER TABLE leader DROP c;
+DELETE FROM leader;
-- cleanup
+DROP TABLE follower;
+DROP TABLE leader;
DROP FUNCTION test_trigger();
DROP TABLE t1;
DROP FUNCTION set(name);
diff --git a/src/test/regress/sql/fast_default.sql b/src/test/regress/sql/fast_default.sql
index 06205cb..eefcd49 100644
--- a/src/test/regress/sql/fast_default.sql
+++ b/src/test/regress/sql/fast_default.sql
@@ -471,7 +471,19 @@ UPDATE t SET y = 2;
SELECT * FROM t;
DROP TABLE t;
+-- make sure expanded tuple has correct self pointer
+-- it will be required by the RI tigger doing the cascading delete
+
+CREATE TABLE leader (a int PRIMARY KEY, b int);
+CREATE TABLE follower (a int REFERENCES leader ON DELETE CASCADE, b int);
+INSERT INTO leader VALUES (1, 1), (2, 2);
+ALTER TABLE leader ADD c int;
+ALTER TABLE leader DROP c;
+DELETE FROM leader;
+
-- cleanup
+DROP TABLE follower;
+DROP TABLE leader;
DROP FUNCTION test_trigger();
DROP TABLE t1;
DROP FUNCTION set(name);
^ permalink raw reply [nested|flat] 26+ messages in thread
* Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005
2018-10-22 12:34 BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 PG Bug reporting form <[email protected]>
2018-10-23 02:00 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Amit Langote <[email protected]>
2018-10-23 11:46 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Andrew Dunstan <[email protected]>
@ 2018-10-23 13:44 ` Amit Langote <[email protected]>
1 sibling, 0 replies; 26+ messages in thread
From: Amit Langote @ 2018-10-23 13:44 UTC (permalink / raw)
To: Andrew Dunstan <[email protected]>; +Cc: Amit Langote <[email protected]>; [email protected]; [email protected]; pgsql-hackers
Hi,
On Tue, Oct 23, 2018 at 8:46 PM Andrew Dunstan
<[email protected]> wrote:
> On 10/22/2018 10:00 PM, Amit Langote wrote:
> > After observing the test case in the provided log, I managed to reproduce
> > it with the following:
> >
> > create table foo (a int primary key, b int);
> > create table bar (a int references foo on delete cascade, b int);
> > insert into foo values (1, 1);
> > insert into foo values (2, 2);
> > alter table foo add c int;
> > alter table foo drop c;
> > delete from foo;
> > server closed the connection unexpectedly
> > This probably means the server terminated abnormally
> > before or while processing the request.
> > The connection to the server was lost. Attempting reset: Failed.
> >
> > Analyzing this crash, I located the bug down to GetTupleForTrigger(), but
> > perhaps it's really in heap_expand_tuple() / expand_tuple(), where the
> > value of trigger tuple's t_self is being switched from a valid one to an
> > invalid value.
> >
> > In heaptuple.c: expand_tuple()
> >
> >
> > ItemPointerSetInvalid(&((*targetHeapTuple)->t_self));
> >
> >
> > FWIW, attached patch fixes this for me. Adding Andrew whose recent commit
> > 7636e5c60f [1] seems to have introduced the heap_expan_tuple call in
> > GetTupleForTrigger. Maybe, he can better judge a fix for this.
>
> Thanks. I think the line in expand_tuple is a thinko and we should
> change it, rather than change GetTupleForTrigger().
Agreed.
> Here is a patch that does that and also adds your test case to the
> regression tests.
Looks good.
Thanks,
Amit
^ permalink raw reply [nested|flat] 26+ messages in thread
* Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005
2018-10-22 12:34 BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 PG Bug reporting form <[email protected]>
2018-10-23 02:00 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Amit Langote <[email protected]>
2018-10-23 11:46 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Andrew Dunstan <[email protected]>
@ 2018-10-24 23:00 ` Michael Banck <[email protected]>
2018-10-24 23:43 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Andrew Dunstan <[email protected]>
1 sibling, 1 reply; 26+ messages in thread
From: Michael Banck @ 2018-10-24 23:00 UTC (permalink / raw)
To: Andrew Dunstan <[email protected]>; +Cc: Amit Langote <[email protected]>; [email protected]; [email protected]; pgsql-hackers
Hi,
On Tue, Oct 23, 2018 at 07:46:01AM -0400, Andrew Dunstan wrote:
> diff --git a/src/test/regress/expected/fast_default.out b/src/test/regress/expected/fast_default.out
> index 48bd360..0797e11 100644
> --- a/src/test/regress/expected/fast_default.out
> +++ b/src/test/regress/expected/fast_default.out
> @@ -727,7 +727,17 @@ SELECT * FROM t;
> (1 row)
>
> DROP TABLE t;
> +-- make sure expanded tuple has correct self pointer
> +-- it will be required by the RI tigger doing the cascading delete
That should be s/tigger/trigger/ I guess?
Michael
--
Michael Banck
Projektleiter / Senior Berater
Tel.: +49 2166 9901-171
Fax: +49 2166 9901-100
Email: [email protected]
credativ GmbH, HRB Mönchengladbach 12080
USt-ID-Nummer: DE204566209
Trompeterallee 108, 41189 Mönchengladbach
Geschäftsführung: Dr. Michael Meskes, Jörg Folz, Sascha Heuer
Unser Umgang mit personenbezogenen Daten unterliegt
folgenden Bestimmungen: https://www.credativ.de/datenschutz
^ permalink raw reply [nested|flat] 26+ messages in thread
* Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005
2018-10-22 12:34 BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 PG Bug reporting form <[email protected]>
2018-10-23 02:00 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Amit Langote <[email protected]>
2018-10-23 11:46 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Andrew Dunstan <[email protected]>
2018-10-24 23:00 ` Re: BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 Michael Banck <[email protected]>
@ 2018-10-24 23:43 ` Andrew Dunstan <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Andrew Dunstan @ 2018-10-24 23:43 UTC (permalink / raw)
To: Michael Banck <[email protected]>; +Cc: Amit Langote <[email protected]>; [email protected]; [email protected]; pgsql-hackers
On 10/24/2018 07:00 PM, Michael Banck wrote:
> Hi,
>
> On Tue, Oct 23, 2018 at 07:46:01AM -0400, Andrew Dunstan wrote:
>> diff --git a/src/test/regress/expected/fast_default.out b/src/test/regress/expected/fast_default.out
>> index 48bd360..0797e11 100644
>> --- a/src/test/regress/expected/fast_default.out
>> +++ b/src/test/regress/expected/fast_default.out
>> @@ -727,7 +727,17 @@ SELECT * FROM t;
>> (1 row)
>>
>> DROP TABLE t;
>> +-- make sure expanded tuple has correct self pointer
>> +-- it will be required by the RI tigger doing the cascading delete
> That should be s/tigger/trigger/ I guess?
>
>
Yeah, will fix.
cheers
andrew
--
Andrew Dunstan https://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
^ permalink raw reply [nested|flat] 26+ messages in thread
* [PATCH v3 09/17] Separate tuple pre freeze checks and invoke earlier
@ 2024-01-07 21:53 Melanie Plageman <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Melanie Plageman @ 2024-01-07 21:53 UTC (permalink / raw)
When combining the prune and freeze records their critical sections will
have to be combined. heap_freeze_execute_prepared() does a set of pre
freeze validations before starting its critical section. Move these
validations into a helper function, heap_pre_freeze_checks(), and invoke
it in heap_page_prune() before the pruning critical section.
Also move up the calculation of the freeze snapshot conflict horizon.
---
src/backend/access/heap/heapam.c | 58 ++++++++++++++++-------------
src/backend/access/heap/pruneheap.c | 8 +++-
src/include/access/heapam.h | 3 ++
3 files changed, 42 insertions(+), 27 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 7261c4988d7..16e3f2520a4 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -6659,35 +6659,19 @@ heap_execute_freeze_tuple(HeapTupleHeader tuple, HeapTupleFreeze *frz)
}
/*
- * heap_freeze_execute_prepared
- *
- * Executes freezing of one or more heap tuples on a page on behalf of caller.
- * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
- * Caller must set 'offset' in each plan for us. Note that we destructively
- * sort caller's tuples array in-place, so caller had better be done with it.
- *
- * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
- * later on without any risk of unsafe pg_xact lookups, even following a hard
- * crash (or when querying from a standby). We represent freezing by setting
- * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
- * See section on buffer access rules in src/backend/storage/buffer/README.
- */
+* Perform xmin/xmax XID status sanity checks before calling
+* heap_freeze_execute_prepared().
+*
+* heap_prepare_freeze_tuple doesn't perform these checks directly because
+* pg_xact lookups are relatively expensive. They shouldn't be repeated
+* by successive VACUUMs that each decide against freezing the same page.
+*/
void
-heap_freeze_execute_prepared(Relation rel, Buffer buffer,
- TransactionId snapshotConflictHorizon,
- HeapTupleFreeze *tuples, int ntuples)
+heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples)
{
Page page = BufferGetPage(buffer);
- Assert(ntuples > 0);
-
- /*
- * Perform xmin/xmax XID status sanity checks before critical section.
- *
- * heap_prepare_freeze_tuple doesn't perform these checks directly because
- * pg_xact lookups are relatively expensive. They shouldn't be repeated
- * by successive VACUUMs that each decide against freezing the same page.
- */
for (int i = 0; i < ntuples; i++)
{
HeapTupleFreeze *frz = tuples + i;
@@ -6726,6 +6710,30 @@ heap_freeze_execute_prepared(Relation rel, Buffer buffer,
xmax)));
}
}
+}
+
+/*
+ * heap_freeze_execute_prepared
+ *
+ * Executes freezing of one or more heap tuples on a page on behalf of caller.
+ * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
+ * Caller must set 'offset' in each plan for us. Note that we destructively
+ * sort caller's tuples array in-place, so caller had better be done with it.
+ *
+ * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
+ * later on without any risk of unsafe pg_xact lookups, even following a hard
+ * crash (or when querying from a standby). We represent freezing by setting
+ * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
+ * See section on buffer access rules in src/backend/storage/buffer/README.
+ */
+void
+heap_freeze_execute_prepared(Relation rel, Buffer buffer,
+ TransactionId snapshotConflictHorizon,
+ HeapTupleFreeze *tuples, int ntuples)
+{
+ Page page = BufferGetPage(buffer);
+
+ Assert(ntuples > 0);
START_CRIT_SECTION();
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index f164b7957ed..bc0a23da61b 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -523,6 +523,12 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
(pagefrz->freeze_required ||
(whole_page_freezable && presult->nfrozen > 0 && (prune_fpi || hint_bit_fpi)));
+ if (do_freeze)
+ {
+ heap_pre_freeze_checks(buffer, frozen, presult->nfrozen);
+ frz_conflict_horizon = heap_frz_conflict_horizon(presult, pagefrz);
+ }
+
/* Any error while applying the changes is critical */
START_CRIT_SECTION();
@@ -621,8 +627,6 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
if (do_freeze)
{
- frz_conflict_horizon = heap_frz_conflict_horizon(presult, pagefrz);
-
/* Execute all freeze plans for page as a single atomic action */
heap_freeze_execute_prepared(relation, buffer,
frz_conflict_horizon,
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index 45c4ae22e6a..dffbbd3cd3e 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -314,6 +314,9 @@ extern TransactionId heap_frz_conflict_horizon(PruneFreezeResult *presult,
extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple,
HeapPageFreeze *pagefrz,
HeapTupleFreeze *frz, bool *totally_frozen);
+
+extern void heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples);
extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer,
TransactionId snapshotConflictHorizon,
HeapTupleFreeze *tuples, int ntuples);
--
2.40.1
--racicctn4wry6xe5
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0010-Inline-heap_freeze_execute_prepared.patch"
^ permalink raw reply [nested|flat] 26+ messages in thread
* [PATCH v4 11/19] Separate tuple pre freeze checks and invoke earlier
@ 2024-01-07 21:53 Melanie Plageman <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Melanie Plageman @ 2024-01-07 21:53 UTC (permalink / raw)
When combining the prune and freeze records their critical sections will
have to be combined. heap_freeze_execute_prepared() does a set of pre
freeze validations before starting its critical section. Move these
validations into a helper function, heap_pre_freeze_checks(), and invoke
it in heap_page_prune() before the pruning critical section.
Also move up the calculation of the freeze snapshot conflict horizon.
---
src/backend/access/heap/heapam.c | 58 ++++++++++++++++-------------
src/backend/access/heap/pruneheap.c | 31 ++++++++-------
src/include/access/heapam.h | 3 ++
3 files changed, 54 insertions(+), 38 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 7261c4988d7..16e3f2520a4 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -6659,35 +6659,19 @@ heap_execute_freeze_tuple(HeapTupleHeader tuple, HeapTupleFreeze *frz)
}
/*
- * heap_freeze_execute_prepared
- *
- * Executes freezing of one or more heap tuples on a page on behalf of caller.
- * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
- * Caller must set 'offset' in each plan for us. Note that we destructively
- * sort caller's tuples array in-place, so caller had better be done with it.
- *
- * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
- * later on without any risk of unsafe pg_xact lookups, even following a hard
- * crash (or when querying from a standby). We represent freezing by setting
- * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
- * See section on buffer access rules in src/backend/storage/buffer/README.
- */
+* Perform xmin/xmax XID status sanity checks before calling
+* heap_freeze_execute_prepared().
+*
+* heap_prepare_freeze_tuple doesn't perform these checks directly because
+* pg_xact lookups are relatively expensive. They shouldn't be repeated
+* by successive VACUUMs that each decide against freezing the same page.
+*/
void
-heap_freeze_execute_prepared(Relation rel, Buffer buffer,
- TransactionId snapshotConflictHorizon,
- HeapTupleFreeze *tuples, int ntuples)
+heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples)
{
Page page = BufferGetPage(buffer);
- Assert(ntuples > 0);
-
- /*
- * Perform xmin/xmax XID status sanity checks before critical section.
- *
- * heap_prepare_freeze_tuple doesn't perform these checks directly because
- * pg_xact lookups are relatively expensive. They shouldn't be repeated
- * by successive VACUUMs that each decide against freezing the same page.
- */
for (int i = 0; i < ntuples; i++)
{
HeapTupleFreeze *frz = tuples + i;
@@ -6726,6 +6710,30 @@ heap_freeze_execute_prepared(Relation rel, Buffer buffer,
xmax)));
}
}
+}
+
+/*
+ * heap_freeze_execute_prepared
+ *
+ * Executes freezing of one or more heap tuples on a page on behalf of caller.
+ * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
+ * Caller must set 'offset' in each plan for us. Note that we destructively
+ * sort caller's tuples array in-place, so caller had better be done with it.
+ *
+ * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
+ * later on without any risk of unsafe pg_xact lookups, even following a hard
+ * crash (or when querying from a standby). We represent freezing by setting
+ * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
+ * See section on buffer access rules in src/backend/storage/buffer/README.
+ */
+void
+heap_freeze_execute_prepared(Relation rel, Buffer buffer,
+ TransactionId snapshotConflictHorizon,
+ HeapTupleFreeze *tuples, int ntuples)
+{
+ Page page = BufferGetPage(buffer);
+
+ Assert(ntuples > 0);
START_CRIT_SECTION();
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index 9edf6bf72d7..87f99497865 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -524,6 +524,24 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
(pagefrz->freeze_required ||
(whole_page_freezable && presult->nfrozen > 0 && (prune_fpi || hint_bit_fpi)));
+ if (do_freeze)
+ {
+ heap_pre_freeze_checks(buffer, prstate.frozen, presult->nfrozen);
+
+ /*
+ * We can use frz_conflict_horizon as our cutoff for conflicts when
+ * the whole page is eligible to become all-frozen in the VM once
+ * we're done with it. Otherwise we generate a conservative cutoff by
+ * stepping back from OldestXmin.
+ */
+ if (!(presult->all_visible_except_removable && presult->all_frozen))
+ {
+ /* Avoids false conflicts when hot_standby_feedback in use */
+ presult->frz_conflict_horizon = pagefrz->cutoffs->OldestXmin;
+ TransactionIdRetreat(presult->frz_conflict_horizon);
+ }
+ }
+
/* Any error while applying the changes is critical */
START_CRIT_SECTION();
@@ -622,19 +640,6 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
if (do_freeze)
{
- /*
- * We can use frz_conflict_horizon as our cutoff for conflicts when
- * the whole page is eligible to become all-frozen in the VM once
- * we're done with it. Otherwise we generate a conservative cutoff by
- * stepping back from OldestXmin.
- */
- if (!(presult->all_visible_except_removable && presult->all_frozen))
- {
- /* Avoids false conflicts when hot_standby_feedback in use */
- presult->frz_conflict_horizon = pagefrz->cutoffs->OldestXmin;
- TransactionIdRetreat(presult->frz_conflict_horizon);
- }
-
/* Execute all freeze plans for page as a single atomic action */
heap_freeze_execute_prepared(relation, buffer,
presult->frz_conflict_horizon,
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index b2a4caeb33a..02e33f213e1 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -312,6 +312,9 @@ extern void heap_inplace_update(Relation relation, HeapTuple tuple);
extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple,
HeapPageFreeze *pagefrz,
HeapTupleFreeze *frz, bool *totally_frozen);
+
+extern void heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples);
extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer,
TransactionId snapshotConflictHorizon,
HeapTupleFreeze *tuples, int ntuples);
--
2.40.1
--tez7m2a73jtztiij
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0012-Remove-heap_freeze_execute_prepared.patch"
^ permalink raw reply [nested|flat] 26+ messages in thread
* [PATCH v3 09/17] Separate tuple pre freeze checks and invoke earlier
@ 2024-01-07 21:53 Melanie Plageman <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Melanie Plageman @ 2024-01-07 21:53 UTC (permalink / raw)
When combining the prune and freeze records their critical sections will
have to be combined. heap_freeze_execute_prepared() does a set of pre
freeze validations before starting its critical section. Move these
validations into a helper function, heap_pre_freeze_checks(), and invoke
it in heap_page_prune() before the pruning critical section.
Also move up the calculation of the freeze snapshot conflict horizon.
---
src/backend/access/heap/heapam.c | 58 ++++++++++++++++-------------
src/backend/access/heap/pruneheap.c | 8 +++-
src/include/access/heapam.h | 3 ++
3 files changed, 42 insertions(+), 27 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 7261c4988d7..16e3f2520a4 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -6659,35 +6659,19 @@ heap_execute_freeze_tuple(HeapTupleHeader tuple, HeapTupleFreeze *frz)
}
/*
- * heap_freeze_execute_prepared
- *
- * Executes freezing of one or more heap tuples on a page on behalf of caller.
- * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
- * Caller must set 'offset' in each plan for us. Note that we destructively
- * sort caller's tuples array in-place, so caller had better be done with it.
- *
- * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
- * later on without any risk of unsafe pg_xact lookups, even following a hard
- * crash (or when querying from a standby). We represent freezing by setting
- * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
- * See section on buffer access rules in src/backend/storage/buffer/README.
- */
+* Perform xmin/xmax XID status sanity checks before calling
+* heap_freeze_execute_prepared().
+*
+* heap_prepare_freeze_tuple doesn't perform these checks directly because
+* pg_xact lookups are relatively expensive. They shouldn't be repeated
+* by successive VACUUMs that each decide against freezing the same page.
+*/
void
-heap_freeze_execute_prepared(Relation rel, Buffer buffer,
- TransactionId snapshotConflictHorizon,
- HeapTupleFreeze *tuples, int ntuples)
+heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples)
{
Page page = BufferGetPage(buffer);
- Assert(ntuples > 0);
-
- /*
- * Perform xmin/xmax XID status sanity checks before critical section.
- *
- * heap_prepare_freeze_tuple doesn't perform these checks directly because
- * pg_xact lookups are relatively expensive. They shouldn't be repeated
- * by successive VACUUMs that each decide against freezing the same page.
- */
for (int i = 0; i < ntuples; i++)
{
HeapTupleFreeze *frz = tuples + i;
@@ -6726,6 +6710,30 @@ heap_freeze_execute_prepared(Relation rel, Buffer buffer,
xmax)));
}
}
+}
+
+/*
+ * heap_freeze_execute_prepared
+ *
+ * Executes freezing of one or more heap tuples on a page on behalf of caller.
+ * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
+ * Caller must set 'offset' in each plan for us. Note that we destructively
+ * sort caller's tuples array in-place, so caller had better be done with it.
+ *
+ * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
+ * later on without any risk of unsafe pg_xact lookups, even following a hard
+ * crash (or when querying from a standby). We represent freezing by setting
+ * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
+ * See section on buffer access rules in src/backend/storage/buffer/README.
+ */
+void
+heap_freeze_execute_prepared(Relation rel, Buffer buffer,
+ TransactionId snapshotConflictHorizon,
+ HeapTupleFreeze *tuples, int ntuples)
+{
+ Page page = BufferGetPage(buffer);
+
+ Assert(ntuples > 0);
START_CRIT_SECTION();
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index f164b7957ed..bc0a23da61b 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -523,6 +523,12 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
(pagefrz->freeze_required ||
(whole_page_freezable && presult->nfrozen > 0 && (prune_fpi || hint_bit_fpi)));
+ if (do_freeze)
+ {
+ heap_pre_freeze_checks(buffer, frozen, presult->nfrozen);
+ frz_conflict_horizon = heap_frz_conflict_horizon(presult, pagefrz);
+ }
+
/* Any error while applying the changes is critical */
START_CRIT_SECTION();
@@ -621,8 +627,6 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
if (do_freeze)
{
- frz_conflict_horizon = heap_frz_conflict_horizon(presult, pagefrz);
-
/* Execute all freeze plans for page as a single atomic action */
heap_freeze_execute_prepared(relation, buffer,
frz_conflict_horizon,
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index 45c4ae22e6a..dffbbd3cd3e 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -314,6 +314,9 @@ extern TransactionId heap_frz_conflict_horizon(PruneFreezeResult *presult,
extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple,
HeapPageFreeze *pagefrz,
HeapTupleFreeze *frz, bool *totally_frozen);
+
+extern void heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples);
extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer,
TransactionId snapshotConflictHorizon,
HeapTupleFreeze *tuples, int ntuples);
--
2.40.1
--racicctn4wry6xe5
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0010-Inline-heap_freeze_execute_prepared.patch"
^ permalink raw reply [nested|flat] 26+ messages in thread
* [PATCH v4 11/19] Separate tuple pre freeze checks and invoke earlier
@ 2024-01-07 21:53 Melanie Plageman <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Melanie Plageman @ 2024-01-07 21:53 UTC (permalink / raw)
When combining the prune and freeze records their critical sections will
have to be combined. heap_freeze_execute_prepared() does a set of pre
freeze validations before starting its critical section. Move these
validations into a helper function, heap_pre_freeze_checks(), and invoke
it in heap_page_prune() before the pruning critical section.
Also move up the calculation of the freeze snapshot conflict horizon.
---
src/backend/access/heap/heapam.c | 58 ++++++++++++++++-------------
src/backend/access/heap/pruneheap.c | 31 ++++++++-------
src/include/access/heapam.h | 3 ++
3 files changed, 54 insertions(+), 38 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 7261c4988d7..16e3f2520a4 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -6659,35 +6659,19 @@ heap_execute_freeze_tuple(HeapTupleHeader tuple, HeapTupleFreeze *frz)
}
/*
- * heap_freeze_execute_prepared
- *
- * Executes freezing of one or more heap tuples on a page on behalf of caller.
- * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
- * Caller must set 'offset' in each plan for us. Note that we destructively
- * sort caller's tuples array in-place, so caller had better be done with it.
- *
- * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
- * later on without any risk of unsafe pg_xact lookups, even following a hard
- * crash (or when querying from a standby). We represent freezing by setting
- * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
- * See section on buffer access rules in src/backend/storage/buffer/README.
- */
+* Perform xmin/xmax XID status sanity checks before calling
+* heap_freeze_execute_prepared().
+*
+* heap_prepare_freeze_tuple doesn't perform these checks directly because
+* pg_xact lookups are relatively expensive. They shouldn't be repeated
+* by successive VACUUMs that each decide against freezing the same page.
+*/
void
-heap_freeze_execute_prepared(Relation rel, Buffer buffer,
- TransactionId snapshotConflictHorizon,
- HeapTupleFreeze *tuples, int ntuples)
+heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples)
{
Page page = BufferGetPage(buffer);
- Assert(ntuples > 0);
-
- /*
- * Perform xmin/xmax XID status sanity checks before critical section.
- *
- * heap_prepare_freeze_tuple doesn't perform these checks directly because
- * pg_xact lookups are relatively expensive. They shouldn't be repeated
- * by successive VACUUMs that each decide against freezing the same page.
- */
for (int i = 0; i < ntuples; i++)
{
HeapTupleFreeze *frz = tuples + i;
@@ -6726,6 +6710,30 @@ heap_freeze_execute_prepared(Relation rel, Buffer buffer,
xmax)));
}
}
+}
+
+/*
+ * heap_freeze_execute_prepared
+ *
+ * Executes freezing of one or more heap tuples on a page on behalf of caller.
+ * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
+ * Caller must set 'offset' in each plan for us. Note that we destructively
+ * sort caller's tuples array in-place, so caller had better be done with it.
+ *
+ * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
+ * later on without any risk of unsafe pg_xact lookups, even following a hard
+ * crash (or when querying from a standby). We represent freezing by setting
+ * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
+ * See section on buffer access rules in src/backend/storage/buffer/README.
+ */
+void
+heap_freeze_execute_prepared(Relation rel, Buffer buffer,
+ TransactionId snapshotConflictHorizon,
+ HeapTupleFreeze *tuples, int ntuples)
+{
+ Page page = BufferGetPage(buffer);
+
+ Assert(ntuples > 0);
START_CRIT_SECTION();
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index 9edf6bf72d7..87f99497865 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -524,6 +524,24 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
(pagefrz->freeze_required ||
(whole_page_freezable && presult->nfrozen > 0 && (prune_fpi || hint_bit_fpi)));
+ if (do_freeze)
+ {
+ heap_pre_freeze_checks(buffer, prstate.frozen, presult->nfrozen);
+
+ /*
+ * We can use frz_conflict_horizon as our cutoff for conflicts when
+ * the whole page is eligible to become all-frozen in the VM once
+ * we're done with it. Otherwise we generate a conservative cutoff by
+ * stepping back from OldestXmin.
+ */
+ if (!(presult->all_visible_except_removable && presult->all_frozen))
+ {
+ /* Avoids false conflicts when hot_standby_feedback in use */
+ presult->frz_conflict_horizon = pagefrz->cutoffs->OldestXmin;
+ TransactionIdRetreat(presult->frz_conflict_horizon);
+ }
+ }
+
/* Any error while applying the changes is critical */
START_CRIT_SECTION();
@@ -622,19 +640,6 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
if (do_freeze)
{
- /*
- * We can use frz_conflict_horizon as our cutoff for conflicts when
- * the whole page is eligible to become all-frozen in the VM once
- * we're done with it. Otherwise we generate a conservative cutoff by
- * stepping back from OldestXmin.
- */
- if (!(presult->all_visible_except_removable && presult->all_frozen))
- {
- /* Avoids false conflicts when hot_standby_feedback in use */
- presult->frz_conflict_horizon = pagefrz->cutoffs->OldestXmin;
- TransactionIdRetreat(presult->frz_conflict_horizon);
- }
-
/* Execute all freeze plans for page as a single atomic action */
heap_freeze_execute_prepared(relation, buffer,
presult->frz_conflict_horizon,
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index b2a4caeb33a..02e33f213e1 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -312,6 +312,9 @@ extern void heap_inplace_update(Relation relation, HeapTuple tuple);
extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple,
HeapPageFreeze *pagefrz,
HeapTupleFreeze *frz, bool *totally_frozen);
+
+extern void heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples);
extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer,
TransactionId snapshotConflictHorizon,
HeapTupleFreeze *tuples, int ntuples);
--
2.40.1
--tez7m2a73jtztiij
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0012-Remove-heap_freeze_execute_prepared.patch"
^ permalink raw reply [nested|flat] 26+ messages in thread
* [PATCH v2 09/17] Separate tuple pre freeze checks and invoke earlier
@ 2024-01-07 21:53 Melanie Plageman <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Melanie Plageman @ 2024-01-07 21:53 UTC (permalink / raw)
When combining the prune and freeze records their critical sections will
have to be combined. heap_freeze_execute_prepared() does a set of pre
freeze validations before starting its critical section. Move these
validations into a helper function, heap_pre_freeze_checks(), and invoke
it in heap_page_prune() before the pruning critical section.
Also move up the calculation of the freeze snapshot conflict horizon.
---
src/backend/access/heap/heapam.c | 58 ++++++++++++++++-------------
src/backend/access/heap/pruneheap.c | 8 +++-
src/include/access/heapam.h | 3 ++
3 files changed, 42 insertions(+), 27 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 7261c4988d7..16e3f2520a4 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -6659,35 +6659,19 @@ heap_execute_freeze_tuple(HeapTupleHeader tuple, HeapTupleFreeze *frz)
}
/*
- * heap_freeze_execute_prepared
- *
- * Executes freezing of one or more heap tuples on a page on behalf of caller.
- * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
- * Caller must set 'offset' in each plan for us. Note that we destructively
- * sort caller's tuples array in-place, so caller had better be done with it.
- *
- * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
- * later on without any risk of unsafe pg_xact lookups, even following a hard
- * crash (or when querying from a standby). We represent freezing by setting
- * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
- * See section on buffer access rules in src/backend/storage/buffer/README.
- */
+* Perform xmin/xmax XID status sanity checks before calling
+* heap_freeze_execute_prepared().
+*
+* heap_prepare_freeze_tuple doesn't perform these checks directly because
+* pg_xact lookups are relatively expensive. They shouldn't be repeated
+* by successive VACUUMs that each decide against freezing the same page.
+*/
void
-heap_freeze_execute_prepared(Relation rel, Buffer buffer,
- TransactionId snapshotConflictHorizon,
- HeapTupleFreeze *tuples, int ntuples)
+heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples)
{
Page page = BufferGetPage(buffer);
- Assert(ntuples > 0);
-
- /*
- * Perform xmin/xmax XID status sanity checks before critical section.
- *
- * heap_prepare_freeze_tuple doesn't perform these checks directly because
- * pg_xact lookups are relatively expensive. They shouldn't be repeated
- * by successive VACUUMs that each decide against freezing the same page.
- */
for (int i = 0; i < ntuples; i++)
{
HeapTupleFreeze *frz = tuples + i;
@@ -6726,6 +6710,30 @@ heap_freeze_execute_prepared(Relation rel, Buffer buffer,
xmax)));
}
}
+}
+
+/*
+ * heap_freeze_execute_prepared
+ *
+ * Executes freezing of one or more heap tuples on a page on behalf of caller.
+ * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
+ * Caller must set 'offset' in each plan for us. Note that we destructively
+ * sort caller's tuples array in-place, so caller had better be done with it.
+ *
+ * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
+ * later on without any risk of unsafe pg_xact lookups, even following a hard
+ * crash (or when querying from a standby). We represent freezing by setting
+ * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
+ * See section on buffer access rules in src/backend/storage/buffer/README.
+ */
+void
+heap_freeze_execute_prepared(Relation rel, Buffer buffer,
+ TransactionId snapshotConflictHorizon,
+ HeapTupleFreeze *tuples, int ntuples)
+{
+ Page page = BufferGetPage(buffer);
+
+ Assert(ntuples > 0);
START_CRIT_SECTION();
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e715fc29a83..bac461940de 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -509,6 +509,12 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
(pagefrz->freeze_required ||
(whole_page_freezable && presult->nfrozen > 0 && (prune_fpi || hint_bit_fpi)));
+ if (do_freeze)
+ {
+ heap_pre_freeze_checks(buffer, frozen, presult->nfrozen);
+ frz_conflict_horizon = heap_frz_conflict_horizon(presult, pagefrz);
+ }
+
/* Any error while applying the changes is critical */
START_CRIT_SECTION();
@@ -607,8 +613,6 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
if (do_freeze)
{
- frz_conflict_horizon = heap_frz_conflict_horizon(presult, pagefrz);
-
/* Execute all freeze plans for page as a single atomic action */
heap_freeze_execute_prepared(relation, buffer,
frz_conflict_horizon,
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index 69d97bb8ece..d14f36d9ce7 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -315,6 +315,9 @@ extern TransactionId heap_frz_conflict_horizon(PruneFreezeResult *presult,
extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple,
HeapPageFreeze *pagefrz,
HeapTupleFreeze *frz, bool *totally_frozen);
+
+extern void heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples);
extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer,
TransactionId snapshotConflictHorizon,
HeapTupleFreeze *tuples, int ntuples);
--
2.40.1
--rdqtp5puvxqotfdw
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v2-0010-Inline-heap_freeze_execute_prepared.patch"
^ permalink raw reply [nested|flat] 26+ messages in thread
* [PATCH v4 11/19] Separate tuple pre freeze checks and invoke earlier
@ 2024-01-07 21:53 Melanie Plageman <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Melanie Plageman @ 2024-01-07 21:53 UTC (permalink / raw)
When combining the prune and freeze records their critical sections will
have to be combined. heap_freeze_execute_prepared() does a set of pre
freeze validations before starting its critical section. Move these
validations into a helper function, heap_pre_freeze_checks(), and invoke
it in heap_page_prune() before the pruning critical section.
Also move up the calculation of the freeze snapshot conflict horizon.
---
src/backend/access/heap/heapam.c | 58 ++++++++++++++++-------------
src/backend/access/heap/pruneheap.c | 31 ++++++++-------
src/include/access/heapam.h | 3 ++
3 files changed, 54 insertions(+), 38 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 7261c4988d7..16e3f2520a4 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -6659,35 +6659,19 @@ heap_execute_freeze_tuple(HeapTupleHeader tuple, HeapTupleFreeze *frz)
}
/*
- * heap_freeze_execute_prepared
- *
- * Executes freezing of one or more heap tuples on a page on behalf of caller.
- * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
- * Caller must set 'offset' in each plan for us. Note that we destructively
- * sort caller's tuples array in-place, so caller had better be done with it.
- *
- * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
- * later on without any risk of unsafe pg_xact lookups, even following a hard
- * crash (or when querying from a standby). We represent freezing by setting
- * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
- * See section on buffer access rules in src/backend/storage/buffer/README.
- */
+* Perform xmin/xmax XID status sanity checks before calling
+* heap_freeze_execute_prepared().
+*
+* heap_prepare_freeze_tuple doesn't perform these checks directly because
+* pg_xact lookups are relatively expensive. They shouldn't be repeated
+* by successive VACUUMs that each decide against freezing the same page.
+*/
void
-heap_freeze_execute_prepared(Relation rel, Buffer buffer,
- TransactionId snapshotConflictHorizon,
- HeapTupleFreeze *tuples, int ntuples)
+heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples)
{
Page page = BufferGetPage(buffer);
- Assert(ntuples > 0);
-
- /*
- * Perform xmin/xmax XID status sanity checks before critical section.
- *
- * heap_prepare_freeze_tuple doesn't perform these checks directly because
- * pg_xact lookups are relatively expensive. They shouldn't be repeated
- * by successive VACUUMs that each decide against freezing the same page.
- */
for (int i = 0; i < ntuples; i++)
{
HeapTupleFreeze *frz = tuples + i;
@@ -6726,6 +6710,30 @@ heap_freeze_execute_prepared(Relation rel, Buffer buffer,
xmax)));
}
}
+}
+
+/*
+ * heap_freeze_execute_prepared
+ *
+ * Executes freezing of one or more heap tuples on a page on behalf of caller.
+ * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
+ * Caller must set 'offset' in each plan for us. Note that we destructively
+ * sort caller's tuples array in-place, so caller had better be done with it.
+ *
+ * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
+ * later on without any risk of unsafe pg_xact lookups, even following a hard
+ * crash (or when querying from a standby). We represent freezing by setting
+ * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
+ * See section on buffer access rules in src/backend/storage/buffer/README.
+ */
+void
+heap_freeze_execute_prepared(Relation rel, Buffer buffer,
+ TransactionId snapshotConflictHorizon,
+ HeapTupleFreeze *tuples, int ntuples)
+{
+ Page page = BufferGetPage(buffer);
+
+ Assert(ntuples > 0);
START_CRIT_SECTION();
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index 9edf6bf72d7..87f99497865 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -524,6 +524,24 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
(pagefrz->freeze_required ||
(whole_page_freezable && presult->nfrozen > 0 && (prune_fpi || hint_bit_fpi)));
+ if (do_freeze)
+ {
+ heap_pre_freeze_checks(buffer, prstate.frozen, presult->nfrozen);
+
+ /*
+ * We can use frz_conflict_horizon as our cutoff for conflicts when
+ * the whole page is eligible to become all-frozen in the VM once
+ * we're done with it. Otherwise we generate a conservative cutoff by
+ * stepping back from OldestXmin.
+ */
+ if (!(presult->all_visible_except_removable && presult->all_frozen))
+ {
+ /* Avoids false conflicts when hot_standby_feedback in use */
+ presult->frz_conflict_horizon = pagefrz->cutoffs->OldestXmin;
+ TransactionIdRetreat(presult->frz_conflict_horizon);
+ }
+ }
+
/* Any error while applying the changes is critical */
START_CRIT_SECTION();
@@ -622,19 +640,6 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
if (do_freeze)
{
- /*
- * We can use frz_conflict_horizon as our cutoff for conflicts when
- * the whole page is eligible to become all-frozen in the VM once
- * we're done with it. Otherwise we generate a conservative cutoff by
- * stepping back from OldestXmin.
- */
- if (!(presult->all_visible_except_removable && presult->all_frozen))
- {
- /* Avoids false conflicts when hot_standby_feedback in use */
- presult->frz_conflict_horizon = pagefrz->cutoffs->OldestXmin;
- TransactionIdRetreat(presult->frz_conflict_horizon);
- }
-
/* Execute all freeze plans for page as a single atomic action */
heap_freeze_execute_prepared(relation, buffer,
presult->frz_conflict_horizon,
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index b2a4caeb33a..02e33f213e1 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -312,6 +312,9 @@ extern void heap_inplace_update(Relation relation, HeapTuple tuple);
extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple,
HeapPageFreeze *pagefrz,
HeapTupleFreeze *frz, bool *totally_frozen);
+
+extern void heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples);
extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer,
TransactionId snapshotConflictHorizon,
HeapTupleFreeze *tuples, int ntuples);
--
2.40.1
--tez7m2a73jtztiij
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0012-Remove-heap_freeze_execute_prepared.patch"
^ permalink raw reply [nested|flat] 26+ messages in thread
* [PATCH v2 09/17] Separate tuple pre freeze checks and invoke earlier
@ 2024-01-07 21:53 Melanie Plageman <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Melanie Plageman @ 2024-01-07 21:53 UTC (permalink / raw)
When combining the prune and freeze records their critical sections will
have to be combined. heap_freeze_execute_prepared() does a set of pre
freeze validations before starting its critical section. Move these
validations into a helper function, heap_pre_freeze_checks(), and invoke
it in heap_page_prune() before the pruning critical section.
Also move up the calculation of the freeze snapshot conflict horizon.
---
src/backend/access/heap/heapam.c | 58 ++++++++++++++++-------------
src/backend/access/heap/pruneheap.c | 8 +++-
src/include/access/heapam.h | 3 ++
3 files changed, 42 insertions(+), 27 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 7261c4988d7..16e3f2520a4 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -6659,35 +6659,19 @@ heap_execute_freeze_tuple(HeapTupleHeader tuple, HeapTupleFreeze *frz)
}
/*
- * heap_freeze_execute_prepared
- *
- * Executes freezing of one or more heap tuples on a page on behalf of caller.
- * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
- * Caller must set 'offset' in each plan for us. Note that we destructively
- * sort caller's tuples array in-place, so caller had better be done with it.
- *
- * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
- * later on without any risk of unsafe pg_xact lookups, even following a hard
- * crash (or when querying from a standby). We represent freezing by setting
- * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
- * See section on buffer access rules in src/backend/storage/buffer/README.
- */
+* Perform xmin/xmax XID status sanity checks before calling
+* heap_freeze_execute_prepared().
+*
+* heap_prepare_freeze_tuple doesn't perform these checks directly because
+* pg_xact lookups are relatively expensive. They shouldn't be repeated
+* by successive VACUUMs that each decide against freezing the same page.
+*/
void
-heap_freeze_execute_prepared(Relation rel, Buffer buffer,
- TransactionId snapshotConflictHorizon,
- HeapTupleFreeze *tuples, int ntuples)
+heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples)
{
Page page = BufferGetPage(buffer);
- Assert(ntuples > 0);
-
- /*
- * Perform xmin/xmax XID status sanity checks before critical section.
- *
- * heap_prepare_freeze_tuple doesn't perform these checks directly because
- * pg_xact lookups are relatively expensive. They shouldn't be repeated
- * by successive VACUUMs that each decide against freezing the same page.
- */
for (int i = 0; i < ntuples; i++)
{
HeapTupleFreeze *frz = tuples + i;
@@ -6726,6 +6710,30 @@ heap_freeze_execute_prepared(Relation rel, Buffer buffer,
xmax)));
}
}
+}
+
+/*
+ * heap_freeze_execute_prepared
+ *
+ * Executes freezing of one or more heap tuples on a page on behalf of caller.
+ * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
+ * Caller must set 'offset' in each plan for us. Note that we destructively
+ * sort caller's tuples array in-place, so caller had better be done with it.
+ *
+ * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
+ * later on without any risk of unsafe pg_xact lookups, even following a hard
+ * crash (or when querying from a standby). We represent freezing by setting
+ * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
+ * See section on buffer access rules in src/backend/storage/buffer/README.
+ */
+void
+heap_freeze_execute_prepared(Relation rel, Buffer buffer,
+ TransactionId snapshotConflictHorizon,
+ HeapTupleFreeze *tuples, int ntuples)
+{
+ Page page = BufferGetPage(buffer);
+
+ Assert(ntuples > 0);
START_CRIT_SECTION();
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e715fc29a83..bac461940de 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -509,6 +509,12 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
(pagefrz->freeze_required ||
(whole_page_freezable && presult->nfrozen > 0 && (prune_fpi || hint_bit_fpi)));
+ if (do_freeze)
+ {
+ heap_pre_freeze_checks(buffer, frozen, presult->nfrozen);
+ frz_conflict_horizon = heap_frz_conflict_horizon(presult, pagefrz);
+ }
+
/* Any error while applying the changes is critical */
START_CRIT_SECTION();
@@ -607,8 +613,6 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
if (do_freeze)
{
- frz_conflict_horizon = heap_frz_conflict_horizon(presult, pagefrz);
-
/* Execute all freeze plans for page as a single atomic action */
heap_freeze_execute_prepared(relation, buffer,
frz_conflict_horizon,
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index 69d97bb8ece..d14f36d9ce7 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -315,6 +315,9 @@ extern TransactionId heap_frz_conflict_horizon(PruneFreezeResult *presult,
extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple,
HeapPageFreeze *pagefrz,
HeapTupleFreeze *frz, bool *totally_frozen);
+
+extern void heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples);
extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer,
TransactionId snapshotConflictHorizon,
HeapTupleFreeze *tuples, int ntuples);
--
2.40.1
--rdqtp5puvxqotfdw
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v2-0010-Inline-heap_freeze_execute_prepared.patch"
^ permalink raw reply [nested|flat] 26+ messages in thread
* [PATCH v2 09/17] Separate tuple pre freeze checks and invoke earlier
@ 2024-01-07 21:53 Melanie Plageman <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Melanie Plageman @ 2024-01-07 21:53 UTC (permalink / raw)
When combining the prune and freeze records their critical sections will
have to be combined. heap_freeze_execute_prepared() does a set of pre
freeze validations before starting its critical section. Move these
validations into a helper function, heap_pre_freeze_checks(), and invoke
it in heap_page_prune() before the pruning critical section.
Also move up the calculation of the freeze snapshot conflict horizon.
---
src/backend/access/heap/heapam.c | 58 ++++++++++++++++-------------
src/backend/access/heap/pruneheap.c | 8 +++-
src/include/access/heapam.h | 3 ++
3 files changed, 42 insertions(+), 27 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 7261c4988d7..16e3f2520a4 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -6659,35 +6659,19 @@ heap_execute_freeze_tuple(HeapTupleHeader tuple, HeapTupleFreeze *frz)
}
/*
- * heap_freeze_execute_prepared
- *
- * Executes freezing of one or more heap tuples on a page on behalf of caller.
- * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
- * Caller must set 'offset' in each plan for us. Note that we destructively
- * sort caller's tuples array in-place, so caller had better be done with it.
- *
- * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
- * later on without any risk of unsafe pg_xact lookups, even following a hard
- * crash (or when querying from a standby). We represent freezing by setting
- * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
- * See section on buffer access rules in src/backend/storage/buffer/README.
- */
+* Perform xmin/xmax XID status sanity checks before calling
+* heap_freeze_execute_prepared().
+*
+* heap_prepare_freeze_tuple doesn't perform these checks directly because
+* pg_xact lookups are relatively expensive. They shouldn't be repeated
+* by successive VACUUMs that each decide against freezing the same page.
+*/
void
-heap_freeze_execute_prepared(Relation rel, Buffer buffer,
- TransactionId snapshotConflictHorizon,
- HeapTupleFreeze *tuples, int ntuples)
+heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples)
{
Page page = BufferGetPage(buffer);
- Assert(ntuples > 0);
-
- /*
- * Perform xmin/xmax XID status sanity checks before critical section.
- *
- * heap_prepare_freeze_tuple doesn't perform these checks directly because
- * pg_xact lookups are relatively expensive. They shouldn't be repeated
- * by successive VACUUMs that each decide against freezing the same page.
- */
for (int i = 0; i < ntuples; i++)
{
HeapTupleFreeze *frz = tuples + i;
@@ -6726,6 +6710,30 @@ heap_freeze_execute_prepared(Relation rel, Buffer buffer,
xmax)));
}
}
+}
+
+/*
+ * heap_freeze_execute_prepared
+ *
+ * Executes freezing of one or more heap tuples on a page on behalf of caller.
+ * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
+ * Caller must set 'offset' in each plan for us. Note that we destructively
+ * sort caller's tuples array in-place, so caller had better be done with it.
+ *
+ * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
+ * later on without any risk of unsafe pg_xact lookups, even following a hard
+ * crash (or when querying from a standby). We represent freezing by setting
+ * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
+ * See section on buffer access rules in src/backend/storage/buffer/README.
+ */
+void
+heap_freeze_execute_prepared(Relation rel, Buffer buffer,
+ TransactionId snapshotConflictHorizon,
+ HeapTupleFreeze *tuples, int ntuples)
+{
+ Page page = BufferGetPage(buffer);
+
+ Assert(ntuples > 0);
START_CRIT_SECTION();
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e715fc29a83..bac461940de 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -509,6 +509,12 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
(pagefrz->freeze_required ||
(whole_page_freezable && presult->nfrozen > 0 && (prune_fpi || hint_bit_fpi)));
+ if (do_freeze)
+ {
+ heap_pre_freeze_checks(buffer, frozen, presult->nfrozen);
+ frz_conflict_horizon = heap_frz_conflict_horizon(presult, pagefrz);
+ }
+
/* Any error while applying the changes is critical */
START_CRIT_SECTION();
@@ -607,8 +613,6 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
if (do_freeze)
{
- frz_conflict_horizon = heap_frz_conflict_horizon(presult, pagefrz);
-
/* Execute all freeze plans for page as a single atomic action */
heap_freeze_execute_prepared(relation, buffer,
frz_conflict_horizon,
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index 69d97bb8ece..d14f36d9ce7 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -315,6 +315,9 @@ extern TransactionId heap_frz_conflict_horizon(PruneFreezeResult *presult,
extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple,
HeapPageFreeze *pagefrz,
HeapTupleFreeze *frz, bool *totally_frozen);
+
+extern void heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples);
extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer,
TransactionId snapshotConflictHorizon,
HeapTupleFreeze *tuples, int ntuples);
--
2.40.1
--rdqtp5puvxqotfdw
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v2-0010-Inline-heap_freeze_execute_prepared.patch"
^ permalink raw reply [nested|flat] 26+ messages in thread
* [PATCH v3 09/17] Separate tuple pre freeze checks and invoke earlier
@ 2024-01-07 21:53 Melanie Plageman <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Melanie Plageman @ 2024-01-07 21:53 UTC (permalink / raw)
When combining the prune and freeze records their critical sections will
have to be combined. heap_freeze_execute_prepared() does a set of pre
freeze validations before starting its critical section. Move these
validations into a helper function, heap_pre_freeze_checks(), and invoke
it in heap_page_prune() before the pruning critical section.
Also move up the calculation of the freeze snapshot conflict horizon.
---
src/backend/access/heap/heapam.c | 58 ++++++++++++++++-------------
src/backend/access/heap/pruneheap.c | 8 +++-
src/include/access/heapam.h | 3 ++
3 files changed, 42 insertions(+), 27 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 7261c4988d7..16e3f2520a4 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -6659,35 +6659,19 @@ heap_execute_freeze_tuple(HeapTupleHeader tuple, HeapTupleFreeze *frz)
}
/*
- * heap_freeze_execute_prepared
- *
- * Executes freezing of one or more heap tuples on a page on behalf of caller.
- * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
- * Caller must set 'offset' in each plan for us. Note that we destructively
- * sort caller's tuples array in-place, so caller had better be done with it.
- *
- * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
- * later on without any risk of unsafe pg_xact lookups, even following a hard
- * crash (or when querying from a standby). We represent freezing by setting
- * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
- * See section on buffer access rules in src/backend/storage/buffer/README.
- */
+* Perform xmin/xmax XID status sanity checks before calling
+* heap_freeze_execute_prepared().
+*
+* heap_prepare_freeze_tuple doesn't perform these checks directly because
+* pg_xact lookups are relatively expensive. They shouldn't be repeated
+* by successive VACUUMs that each decide against freezing the same page.
+*/
void
-heap_freeze_execute_prepared(Relation rel, Buffer buffer,
- TransactionId snapshotConflictHorizon,
- HeapTupleFreeze *tuples, int ntuples)
+heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples)
{
Page page = BufferGetPage(buffer);
- Assert(ntuples > 0);
-
- /*
- * Perform xmin/xmax XID status sanity checks before critical section.
- *
- * heap_prepare_freeze_tuple doesn't perform these checks directly because
- * pg_xact lookups are relatively expensive. They shouldn't be repeated
- * by successive VACUUMs that each decide against freezing the same page.
- */
for (int i = 0; i < ntuples; i++)
{
HeapTupleFreeze *frz = tuples + i;
@@ -6726,6 +6710,30 @@ heap_freeze_execute_prepared(Relation rel, Buffer buffer,
xmax)));
}
}
+}
+
+/*
+ * heap_freeze_execute_prepared
+ *
+ * Executes freezing of one or more heap tuples on a page on behalf of caller.
+ * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
+ * Caller must set 'offset' in each plan for us. Note that we destructively
+ * sort caller's tuples array in-place, so caller had better be done with it.
+ *
+ * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
+ * later on without any risk of unsafe pg_xact lookups, even following a hard
+ * crash (or when querying from a standby). We represent freezing by setting
+ * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
+ * See section on buffer access rules in src/backend/storage/buffer/README.
+ */
+void
+heap_freeze_execute_prepared(Relation rel, Buffer buffer,
+ TransactionId snapshotConflictHorizon,
+ HeapTupleFreeze *tuples, int ntuples)
+{
+ Page page = BufferGetPage(buffer);
+
+ Assert(ntuples > 0);
START_CRIT_SECTION();
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index f164b7957ed..bc0a23da61b 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -523,6 +523,12 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
(pagefrz->freeze_required ||
(whole_page_freezable && presult->nfrozen > 0 && (prune_fpi || hint_bit_fpi)));
+ if (do_freeze)
+ {
+ heap_pre_freeze_checks(buffer, frozen, presult->nfrozen);
+ frz_conflict_horizon = heap_frz_conflict_horizon(presult, pagefrz);
+ }
+
/* Any error while applying the changes is critical */
START_CRIT_SECTION();
@@ -621,8 +627,6 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
if (do_freeze)
{
- frz_conflict_horizon = heap_frz_conflict_horizon(presult, pagefrz);
-
/* Execute all freeze plans for page as a single atomic action */
heap_freeze_execute_prepared(relation, buffer,
frz_conflict_horizon,
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index 45c4ae22e6a..dffbbd3cd3e 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -314,6 +314,9 @@ extern TransactionId heap_frz_conflict_horizon(PruneFreezeResult *presult,
extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple,
HeapPageFreeze *pagefrz,
HeapTupleFreeze *frz, bool *totally_frozen);
+
+extern void heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples);
extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer,
TransactionId snapshotConflictHorizon,
HeapTupleFreeze *tuples, int ntuples);
--
2.40.1
--racicctn4wry6xe5
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0010-Inline-heap_freeze_execute_prepared.patch"
^ permalink raw reply [nested|flat] 26+ messages in thread
* [PATCH v7 10/16] Separate tuple pre freeze checks and invoke earlier
@ 2024-03-26 00:54 Melanie Plageman <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Melanie Plageman @ 2024-03-26 00:54 UTC (permalink / raw)
When combining the prune and freeze records their critical sections will
have to be combined. heap_freeze_execute_prepared() does a set of pre
freeze validations before starting its critical section. Move these
validations into a helper function, heap_pre_freeze_checks(), and invoke
it in heap_page_prune() before the pruning critical section.
---
src/backend/access/heap/heapam.c | 58 ++++++++++++++++-------------
src/backend/access/heap/pruneheap.c | 41 +++++++++++---------
src/include/access/heapam.h | 3 ++
3 files changed, 59 insertions(+), 43 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index e38c710c192..be48098f7f3 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -6657,35 +6657,19 @@ heap_execute_freeze_tuple(HeapTupleHeader tuple, HeapTupleFreeze *frz)
}
/*
- * heap_freeze_execute_prepared
- *
- * Executes freezing of one or more heap tuples on a page on behalf of caller.
- * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
- * Caller must set 'offset' in each plan for us. Note that we destructively
- * sort caller's tuples array in-place, so caller had better be done with it.
- *
- * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
- * later on without any risk of unsafe pg_xact lookups, even following a hard
- * crash (or when querying from a standby). We represent freezing by setting
- * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
- * See section on buffer access rules in src/backend/storage/buffer/README.
- */
+* Perform xmin/xmax XID status sanity checks before calling
+* heap_freeze_execute_prepared().
+*
+* heap_prepare_freeze_tuple doesn't perform these checks directly because
+* pg_xact lookups are relatively expensive. They shouldn't be repeated
+* by successive VACUUMs that each decide against freezing the same page.
+*/
void
-heap_freeze_execute_prepared(Relation rel, Buffer buffer,
- TransactionId snapshotConflictHorizon,
- HeapTupleFreeze *tuples, int ntuples)
+heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples)
{
Page page = BufferGetPage(buffer);
- Assert(ntuples > 0);
-
- /*
- * Perform xmin/xmax XID status sanity checks before critical section.
- *
- * heap_prepare_freeze_tuple doesn't perform these checks directly because
- * pg_xact lookups are relatively expensive. They shouldn't be repeated
- * by successive VACUUMs that each decide against freezing the same page.
- */
for (int i = 0; i < ntuples; i++)
{
HeapTupleFreeze *frz = tuples + i;
@@ -6724,6 +6708,30 @@ heap_freeze_execute_prepared(Relation rel, Buffer buffer,
xmax)));
}
}
+}
+
+/*
+ * heap_freeze_execute_prepared
+ *
+ * Executes freezing of one or more heap tuples on a page on behalf of caller.
+ * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
+ * Caller must set 'offset' in each plan for us. Note that we destructively
+ * sort caller's tuples array in-place, so caller had better be done with it.
+ *
+ * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
+ * later on without any risk of unsafe pg_xact lookups, even following a hard
+ * crash (or when querying from a standby). We represent freezing by setting
+ * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
+ * See section on buffer access rules in src/backend/storage/buffer/README.
+ */
+void
+heap_freeze_execute_prepared(Relation rel, Buffer buffer,
+ TransactionId snapshotConflictHorizon,
+ HeapTupleFreeze *tuples, int ntuples)
+{
+ Page page = BufferGetPage(buffer);
+
+ Assert(ntuples > 0);
START_CRIT_SECTION();
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index d38de9b063d..fe463ad7146 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -245,6 +245,7 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
PruneState prstate;
HeapTupleData tup;
TransactionId visibility_cutoff_xid;
+ TransactionId frz_conflict_horizon;
bool do_freeze;
bool all_visible_except_removable;
bool do_prune;
@@ -297,6 +298,7 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
* all-visible, so the conflict horizon remains InvalidTransactionId.
*/
presult->vm_conflict_horizon = visibility_cutoff_xid = InvalidTransactionId;
+ frz_conflict_horizon = InvalidTransactionId;
/* For advancing relfrozenxid and relminmxid */
presult->new_relfrozenxid = InvalidTransactionId;
@@ -541,6 +543,27 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
(pagefrz->freeze_required ||
(whole_page_freezable && presult->nfrozen > 0 && (prune_fpi || hint_bit_fpi)));
+ if (do_freeze)
+ {
+ heap_pre_freeze_checks(buffer, prstate.frozen, presult->nfrozen);
+
+ /*
+ * We can use the visibility_cutoff_xid as our cutoff for conflicts
+ * when the whole page is eligible to become all-frozen in the VM once
+ * we're done with it. Otherwise we generate a conservative cutoff by
+ * stepping back from OldestXmin. This avoids false conflicts when
+ * hot_standby_feedback is in use.
+ */
+ if (all_visible_except_removable && presult->all_frozen)
+ frz_conflict_horizon = visibility_cutoff_xid;
+ else
+ {
+ /* Avoids false conflicts when hot_standby_feedback in use */
+ frz_conflict_horizon = pagefrz->cutoffs->OldestXmin;
+ TransactionIdRetreat(frz_conflict_horizon);
+ }
+ }
+
/* Any error while applying the changes is critical */
START_CRIT_SECTION();
@@ -612,24 +635,6 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
if (do_freeze)
{
- TransactionId frz_conflict_horizon = InvalidTransactionId;
-
- /*
- * We can use the visibility_cutoff_xid as our cutoff for conflicts
- * when the whole page is eligible to become all-frozen in the VM once
- * we're done with it. Otherwise we generate a conservative cutoff by
- * stepping back from OldestXmin. This avoids false conflicts when
- * hot_standby_feedback is in use.
- */
- if (all_visible_except_removable && presult->all_frozen)
- frz_conflict_horizon = visibility_cutoff_xid;
- else
- {
- /* Avoids false conflicts when hot_standby_feedback in use */
- frz_conflict_horizon = pagefrz->cutoffs->OldestXmin;
- TransactionIdRetreat(frz_conflict_horizon);
- }
-
/* Execute all freeze plans for page as a single atomic action */
heap_freeze_execute_prepared(relation, buffer,
frz_conflict_horizon,
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index 6f9c66a872b..dbf6323b5ff 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -340,6 +340,9 @@ extern void heap_inplace_update(Relation relation, HeapTuple tuple);
extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple,
HeapPageFreeze *pagefrz,
HeapTupleFreeze *frz, bool *totally_frozen);
+
+extern void heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples);
extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer,
TransactionId snapshotConflictHorizon,
HeapTupleFreeze *tuples, int ntuples);
--
2.40.1
--ck6erxojvlx23byk
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v7-0011-Remove-heap_freeze_execute_prepared.patch"
^ permalink raw reply [nested|flat] 26+ messages in thread
* [PATCH v9 10/21] Separate tuple pre freeze checks and invoke earlier
@ 2024-03-26 00:54 Melanie Plageman <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Melanie Plageman @ 2024-03-26 00:54 UTC (permalink / raw)
When combining the prune and freeze records their critical sections will
have to be combined. heap_freeze_execute_prepared() does a set of pre
freeze validations before starting its critical section. Move these
validations into a helper function, heap_pre_freeze_checks(), and invoke
it in heap_page_prune() before the pruning critical section.
---
src/backend/access/heap/heapam.c | 58 ++++++++++++++++-------------
src/backend/access/heap/pruneheap.c | 41 +++++++++++---------
src/include/access/heapam.h | 3 ++
3 files changed, 59 insertions(+), 43 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index bb856690234..b3119de2aa6 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -6762,35 +6762,19 @@ heap_execute_freeze_tuple(HeapTupleHeader tuple, HeapTupleFreeze *frz)
}
/*
- * heap_freeze_execute_prepared
- *
- * Executes freezing of one or more heap tuples on a page on behalf of caller.
- * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
- * Caller must set 'offset' in each plan for us. Note that we destructively
- * sort caller's tuples array in-place, so caller had better be done with it.
- *
- * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
- * later on without any risk of unsafe pg_xact lookups, even following a hard
- * crash (or when querying from a standby). We represent freezing by setting
- * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
- * See section on buffer access rules in src/backend/storage/buffer/README.
- */
+* Perform xmin/xmax XID status sanity checks before calling
+* heap_freeze_execute_prepared().
+*
+* heap_prepare_freeze_tuple doesn't perform these checks directly because
+* pg_xact lookups are relatively expensive. They shouldn't be repeated
+* by successive VACUUMs that each decide against freezing the same page.
+*/
void
-heap_freeze_execute_prepared(Relation rel, Buffer buffer,
- TransactionId snapshotConflictHorizon,
- HeapTupleFreeze *tuples, int ntuples)
+heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples)
{
Page page = BufferGetPage(buffer);
- Assert(ntuples > 0);
-
- /*
- * Perform xmin/xmax XID status sanity checks before critical section.
- *
- * heap_prepare_freeze_tuple doesn't perform these checks directly because
- * pg_xact lookups are relatively expensive. They shouldn't be repeated
- * by successive VACUUMs that each decide against freezing the same page.
- */
for (int i = 0; i < ntuples; i++)
{
HeapTupleFreeze *frz = tuples + i;
@@ -6829,6 +6813,30 @@ heap_freeze_execute_prepared(Relation rel, Buffer buffer,
xmax)));
}
}
+}
+
+/*
+ * heap_freeze_execute_prepared
+ *
+ * Executes freezing of one or more heap tuples on a page on behalf of caller.
+ * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
+ * Caller must set 'offset' in each plan for us. Note that we destructively
+ * sort caller's tuples array in-place, so caller had better be done with it.
+ *
+ * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
+ * later on without any risk of unsafe pg_xact lookups, even following a hard
+ * crash (or when querying from a standby). We represent freezing by setting
+ * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
+ * See section on buffer access rules in src/backend/storage/buffer/README.
+ */
+void
+heap_freeze_execute_prepared(Relation rel, Buffer buffer,
+ TransactionId snapshotConflictHorizon,
+ HeapTupleFreeze *tuples, int ntuples)
+{
+ Page page = BufferGetPage(buffer);
+
+ Assert(ntuples > 0);
START_CRIT_SECTION();
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index f0decff35dc..13db348b2c1 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -245,6 +245,7 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
PruneState prstate;
HeapTupleData tup;
TransactionId visibility_cutoff_xid;
+ TransactionId frz_conflict_horizon;
bool do_freeze;
bool all_visible_except_removable;
bool do_prune;
@@ -297,6 +298,7 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
* all-visible, so the conflict horizon remains InvalidTransactionId.
*/
presult->vm_conflict_horizon = visibility_cutoff_xid = InvalidTransactionId;
+ frz_conflict_horizon = InvalidTransactionId;
/* For advancing relfrozenxid and relminmxid */
presult->new_relfrozenxid = InvalidTransactionId;
@@ -541,6 +543,27 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
(pagefrz->freeze_required ||
(whole_page_freezable && presult->nfrozen > 0 && (prune_fpi || hint_bit_fpi)));
+ if (do_freeze)
+ {
+ heap_pre_freeze_checks(buffer, prstate.frozen, presult->nfrozen);
+
+ /*
+ * We can use the visibility_cutoff_xid as our cutoff for conflicts
+ * when the whole page is eligible to become all-frozen in the VM once
+ * we're done with it. Otherwise we generate a conservative cutoff by
+ * stepping back from OldestXmin. This avoids false conflicts when
+ * hot_standby_feedback is in use.
+ */
+ if (all_visible_except_removable && presult->all_frozen)
+ frz_conflict_horizon = visibility_cutoff_xid;
+ else
+ {
+ /* Avoids false conflicts when hot_standby_feedback in use */
+ frz_conflict_horizon = pagefrz->cutoffs->OldestXmin;
+ TransactionIdRetreat(frz_conflict_horizon);
+ }
+ }
+
/* Any error while applying the changes is critical */
START_CRIT_SECTION();
@@ -612,24 +635,6 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
if (do_freeze)
{
- TransactionId frz_conflict_horizon = InvalidTransactionId;
-
- /*
- * We can use the visibility_cutoff_xid as our cutoff for conflicts
- * when the whole page is eligible to become all-frozen in the VM once
- * we're done with it. Otherwise we generate a conservative cutoff by
- * stepping back from OldestXmin. This avoids false conflicts when
- * hot_standby_feedback is in use.
- */
- if (all_visible_except_removable && presult->all_frozen)
- frz_conflict_horizon = visibility_cutoff_xid;
- else
- {
- /* Avoids false conflicts when hot_standby_feedback in use */
- frz_conflict_horizon = pagefrz->cutoffs->OldestXmin;
- TransactionIdRetreat(frz_conflict_horizon);
- }
-
/* Execute all freeze plans for page as a single atomic action */
heap_freeze_execute_prepared(relation, buffer,
frz_conflict_horizon,
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index de11c166575..cc3b3346bc4 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -342,6 +342,9 @@ extern void heap_inplace_update(Relation relation, HeapTuple tuple);
extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple,
HeapPageFreeze *pagefrz,
HeapTupleFreeze *frz, bool *totally_frozen);
+
+extern void heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples);
extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer,
TransactionId snapshotConflictHorizon,
HeapTupleFreeze *tuples, int ntuples);
--
2.40.1
--caj67xgx3lukmr5f
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v9-0011-Remove-heap_freeze_execute_prepared.patch"
^ permalink raw reply [nested|flat] 26+ messages in thread
* [PATCH v7 10/16] Separate tuple pre freeze checks and invoke earlier
@ 2024-03-26 00:54 Melanie Plageman <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Melanie Plageman @ 2024-03-26 00:54 UTC (permalink / raw)
When combining the prune and freeze records their critical sections will
have to be combined. heap_freeze_execute_prepared() does a set of pre
freeze validations before starting its critical section. Move these
validations into a helper function, heap_pre_freeze_checks(), and invoke
it in heap_page_prune() before the pruning critical section.
---
src/backend/access/heap/heapam.c | 58 ++++++++++++++++-------------
src/backend/access/heap/pruneheap.c | 41 +++++++++++---------
src/include/access/heapam.h | 3 ++
3 files changed, 59 insertions(+), 43 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index e38c710c192..be48098f7f3 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -6657,35 +6657,19 @@ heap_execute_freeze_tuple(HeapTupleHeader tuple, HeapTupleFreeze *frz)
}
/*
- * heap_freeze_execute_prepared
- *
- * Executes freezing of one or more heap tuples on a page on behalf of caller.
- * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
- * Caller must set 'offset' in each plan for us. Note that we destructively
- * sort caller's tuples array in-place, so caller had better be done with it.
- *
- * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
- * later on without any risk of unsafe pg_xact lookups, even following a hard
- * crash (or when querying from a standby). We represent freezing by setting
- * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
- * See section on buffer access rules in src/backend/storage/buffer/README.
- */
+* Perform xmin/xmax XID status sanity checks before calling
+* heap_freeze_execute_prepared().
+*
+* heap_prepare_freeze_tuple doesn't perform these checks directly because
+* pg_xact lookups are relatively expensive. They shouldn't be repeated
+* by successive VACUUMs that each decide against freezing the same page.
+*/
void
-heap_freeze_execute_prepared(Relation rel, Buffer buffer,
- TransactionId snapshotConflictHorizon,
- HeapTupleFreeze *tuples, int ntuples)
+heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples)
{
Page page = BufferGetPage(buffer);
- Assert(ntuples > 0);
-
- /*
- * Perform xmin/xmax XID status sanity checks before critical section.
- *
- * heap_prepare_freeze_tuple doesn't perform these checks directly because
- * pg_xact lookups are relatively expensive. They shouldn't be repeated
- * by successive VACUUMs that each decide against freezing the same page.
- */
for (int i = 0; i < ntuples; i++)
{
HeapTupleFreeze *frz = tuples + i;
@@ -6724,6 +6708,30 @@ heap_freeze_execute_prepared(Relation rel, Buffer buffer,
xmax)));
}
}
+}
+
+/*
+ * heap_freeze_execute_prepared
+ *
+ * Executes freezing of one or more heap tuples on a page on behalf of caller.
+ * Caller passes an array of tuple plans from heap_prepare_freeze_tuple.
+ * Caller must set 'offset' in each plan for us. Note that we destructively
+ * sort caller's tuples array in-place, so caller had better be done with it.
+ *
+ * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid
+ * later on without any risk of unsafe pg_xact lookups, even following a hard
+ * crash (or when querying from a standby). We represent freezing by setting
+ * infomask bits in tuple headers, but this shouldn't be thought of as a hint.
+ * See section on buffer access rules in src/backend/storage/buffer/README.
+ */
+void
+heap_freeze_execute_prepared(Relation rel, Buffer buffer,
+ TransactionId snapshotConflictHorizon,
+ HeapTupleFreeze *tuples, int ntuples)
+{
+ Page page = BufferGetPage(buffer);
+
+ Assert(ntuples > 0);
START_CRIT_SECTION();
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index d38de9b063d..fe463ad7146 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -245,6 +245,7 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
PruneState prstate;
HeapTupleData tup;
TransactionId visibility_cutoff_xid;
+ TransactionId frz_conflict_horizon;
bool do_freeze;
bool all_visible_except_removable;
bool do_prune;
@@ -297,6 +298,7 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
* all-visible, so the conflict horizon remains InvalidTransactionId.
*/
presult->vm_conflict_horizon = visibility_cutoff_xid = InvalidTransactionId;
+ frz_conflict_horizon = InvalidTransactionId;
/* For advancing relfrozenxid and relminmxid */
presult->new_relfrozenxid = InvalidTransactionId;
@@ -541,6 +543,27 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
(pagefrz->freeze_required ||
(whole_page_freezable && presult->nfrozen > 0 && (prune_fpi || hint_bit_fpi)));
+ if (do_freeze)
+ {
+ heap_pre_freeze_checks(buffer, prstate.frozen, presult->nfrozen);
+
+ /*
+ * We can use the visibility_cutoff_xid as our cutoff for conflicts
+ * when the whole page is eligible to become all-frozen in the VM once
+ * we're done with it. Otherwise we generate a conservative cutoff by
+ * stepping back from OldestXmin. This avoids false conflicts when
+ * hot_standby_feedback is in use.
+ */
+ if (all_visible_except_removable && presult->all_frozen)
+ frz_conflict_horizon = visibility_cutoff_xid;
+ else
+ {
+ /* Avoids false conflicts when hot_standby_feedback in use */
+ frz_conflict_horizon = pagefrz->cutoffs->OldestXmin;
+ TransactionIdRetreat(frz_conflict_horizon);
+ }
+ }
+
/* Any error while applying the changes is critical */
START_CRIT_SECTION();
@@ -612,24 +635,6 @@ heap_page_prune_and_freeze(Relation relation, Buffer buffer,
if (do_freeze)
{
- TransactionId frz_conflict_horizon = InvalidTransactionId;
-
- /*
- * We can use the visibility_cutoff_xid as our cutoff for conflicts
- * when the whole page is eligible to become all-frozen in the VM once
- * we're done with it. Otherwise we generate a conservative cutoff by
- * stepping back from OldestXmin. This avoids false conflicts when
- * hot_standby_feedback is in use.
- */
- if (all_visible_except_removable && presult->all_frozen)
- frz_conflict_horizon = visibility_cutoff_xid;
- else
- {
- /* Avoids false conflicts when hot_standby_feedback in use */
- frz_conflict_horizon = pagefrz->cutoffs->OldestXmin;
- TransactionIdRetreat(frz_conflict_horizon);
- }
-
/* Execute all freeze plans for page as a single atomic action */
heap_freeze_execute_prepared(relation, buffer,
frz_conflict_horizon,
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index 6f9c66a872b..dbf6323b5ff 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -340,6 +340,9 @@ extern void heap_inplace_update(Relation relation, HeapTuple tuple);
extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple,
HeapPageFreeze *pagefrz,
HeapTupleFreeze *frz, bool *totally_frozen);
+
+extern void heap_pre_freeze_checks(Buffer buffer,
+ HeapTupleFreeze *tuples, int ntuples);
extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer,
TransactionId snapshotConflictHorizon,
HeapTupleFreeze *tuples, int ntuples);
--
2.40.1
--ck6erxojvlx23byk
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v7-0011-Remove-heap_freeze_execute_prepared.patch"
^ permalink raw reply [nested|flat] 26+ messages in thread
* Re: pgsql: Add pg_get_acl() to get the ACL for a database object
@ 2024-07-04 20:53 Joel Jacobson <[email protected]>
2024-07-04 23:18 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Michael Paquier <[email protected]>
0 siblings, 1 reply; 26+ messages in thread
From: Joel Jacobson @ 2024-07-04 20:53 UTC (permalink / raw)
To: Tom Lane <[email protected]>; Michael Paquier <[email protected]>; +Cc: [email protected]
On Thu, Jul 4, 2024, at 17:44, Tom Lane wrote:
> Michael Paquier <[email protected]> writes:
>> Add pg_get_acl() to get the ACL for a database object
>> This function returns the ACL for a database object, specified by
>> catalog OID and object OID.
>
> Uh, why is it defined like that rather than allowing a subobject?
> This definition is unable to fetch column-specific ACLs.
Good point, that's surely an important missing feature,
that I hadn't thought about up until now.
Probably because all object classes, except columns, don't have subobjects.
I wonder if it would be motivated to provide overloads for this function,
and perhaps even for pg_get_object_address and pg_identify_object_as_address?
That is, two param versions (class OID and object OID),
and three param versions that in addition also take subobject ID.
Why I think this could be motivated, is since during discussion,
some even wanted reg* overloads, to avoid having to pass the class OID.
As a middle ground, maybe users would appreciate if they at least
didn't have pass in the extra 0, since it's meaningless anyway,
most of the times (for all classes except columns)?
Anyway, that's just an idea. We still need support for subobject,
so I had a look on how to implement it.
Unfortunately, the AlterObjectOwner_internal function in alter.c,
which pg_get_acl in objectaddress.c is based upon,
doesn't deal with subobjects.
I found some code in aclchk.c on line 4452-4468 that seems useful,
but not sure. Maybe there is some other existing code that is better
as an inspiration?
I guess we need to handle the RelationRelationId separately,
and handle all other classes using the current code in pg_get_acl()?
Regards,
Joel
^ permalink raw reply [nested|flat] 26+ messages in thread
* Re: pgsql: Add pg_get_acl() to get the ACL for a database object
2024-07-04 20:53 Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
@ 2024-07-04 23:18 ` Michael Paquier <[email protected]>
2024-07-05 08:40 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
0 siblings, 1 reply; 26+ messages in thread
From: Michael Paquier @ 2024-07-04 23:18 UTC (permalink / raw)
To: Joel Jacobson <[email protected]>; +Cc: Tom Lane <[email protected]>; Postgres hackers <[email protected]>
(Moving to -hackers)
On Thu, Jul 04, 2024 at 10:53:49PM +0200, Joel Jacobson wrote:
> On Thu, Jul 4, 2024, at 17:44, Tom Lane wrote:
>> Uh, why is it defined like that rather than allowing a subobject?
>> This definition is unable to fetch column-specific ACLs.
Yes, I was wondering about that as well yesterday when looking at the
patch, and saw that this was already a pretty good cut as it covers
most of the objects types and does 90% of the job, so just moved on.
> I wonder if it would be motivated to provide overloads for this function,
> and perhaps even for pg_get_object_address and pg_identify_object_as_address?
>
> That is, two param versions (class OID and object OID),
> and three param versions that in addition also take subobject ID.
I would still stick to only one function, with arguments coming from
scanning pg_[sh]depend.
> I found some code in aclchk.c on line 4452-4468 that seems useful,
> but not sure. Maybe there is some other existing code that is better
> as an inspiration?
My first feelings about that was that subobjids are only used for
pg_attribute, so if we use them as a base, it would look like:
- Adding a new AttrNumber in ObjectProperty to track to which column
the subobjid should apply and its catcache number (ATTNUM for the
attribute number for fast lookup).
- Extend get_catalog_object_by_oid() with more data: the attribute
column for the subobjid scan stored in ObjectProperty, the subobjid
value given by the caller. If get_catalog_object_by_oid()'s caller
defines a subobjid, use get_object_catcache_oid() on it over the main
OID one. If it cannot be found in the cache, use a scan key based on
the class OID and the subobjid.
> I guess we need to handle the RelationRelationId separately,
> and handle all other classes using the current code in pg_get_acl()?
But most of that simply blows away because we track the dependency to
the attribute ACLs in pg_shdepend based on pg_class, not pg_attribute.
get_attname() itself relies on ATTNUM, so perhaps that's OK to just
add an exception based on RelationRelationId in the code path of
pg_get_acl(). That makes me a bit uncomfortable to derive more from
the other routines for the object descriptions, but we've been living
with that in getObjectDescription() for years now, as well.
--
Michael
Attachments:
[application/pgp-signature] signature.asc (833B, ../../[email protected]/2-signature.asc)
download
^ permalink raw reply [nested|flat] 26+ messages in thread
* Re: pgsql: Add pg_get_acl() to get the ACL for a database object
2024-07-04 20:53 Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
2024-07-04 23:18 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Michael Paquier <[email protected]>
@ 2024-07-05 08:40 ` Joel Jacobson <[email protected]>
2024-07-08 08:34 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Michael Paquier <[email protected]>
0 siblings, 1 reply; 26+ messages in thread
From: Joel Jacobson @ 2024-07-05 08:40 UTC (permalink / raw)
To: Michael Paquier <[email protected]>; +Cc: Tom Lane <[email protected]>; Postgres hackers <[email protected]>
On Fri, Jul 5, 2024, at 01:18, Michael Paquier wrote:
> I would still stick to only one function, with arguments coming from
> scanning pg_[sh]depend.
>
>> I found some code in aclchk.c on line 4452-4468 that seems useful,
>> but not sure. Maybe there is some other existing code that is better
>> as an inspiration?
>
> My first feelings about that was that subobjids are only used for
> pg_attribute, so if we use them as a base, it would look like:
> - Adding a new AttrNumber in ObjectProperty to track to which column
> the subobjid should apply and its catcache number (ATTNUM for the
> attribute number for fast lookup).
> - Extend get_catalog_object_by_oid() with more data: the attribute
> column for the subobjid scan stored in ObjectProperty, the subobjid
> value given by the caller. If get_catalog_object_by_oid()'s caller
> defines a subobjid, use get_object_catcache_oid() on it over the main
> OID one. If it cannot be found in the cache, use a scan key based on
> the class OID and the subobjid.
>
>> I guess we need to handle the RelationRelationId separately,
>> and handle all other classes using the current code in pg_get_acl()?
>
> But most of that simply blows away because we track the dependency to
> the attribute ACLs in pg_shdepend based on pg_class, not pg_attribute.
> get_attname() itself relies on ATTNUM, so perhaps that's OK to just
> add an exception based on RelationRelationId in the code path of
> pg_get_acl(). That makes me a bit uncomfortable to derive more from
> the other routines for the object descriptions, but we've been living
> with that in getObjectDescription() for years now, as well.
OK, I made an attempt to implement this, based on adapting code from
recordExtObjInitPriv() in aclchk.c, which retrieves ACL based on ATTNUM.
There are now two different code paths for columns and non-columns.
It sounds like a bigger refactoring in this area would be nice,
which would enable cleaning up code in other functions as well,
but maybe that's better to do as a separate project.
I've also updated func.sgml, adjusted pg_proc.dat, and added
regression tests for column privileges.
Regards,
Joel
Attachments:
[application/octet-stream] 0001-Extend-pg_get_acl-to-handle-sub-object-IDs.patch (10.8K, ../../[email protected]/2-0001-Extend-pg_get_acl-to-handle-sub-object-IDs.patch)
download | inline diff:
From 6245502f9fc981d613c70016b45d6e2674d7d0cb Mon Sep 17 00:00:00 2001
From: Joel Jakobsson <[email protected]>
Date: Thu, 4 Jul 2024 22:56:37 +0200
Subject: [PATCH] Extend pg_get_acl to handle sub-object IDs.
This patch modifies the pg_get_acl function to accept a third objsubid param.
This enables the retrieval of ACLs for columns within a table.
Detailed changes:
- Updated func.sgml to document the new parameter and its usage.
- Modified pg_get_acl function in objectaddress.c to handle sub-object IDs.
- Adjusted the catalog entry in pg_proc.dat to include the new parameter.
- Enhanced regression tests in privileges.sql to test the new functionality.
---
doc/src/sgml/func.sgml | 6 +--
src/backend/catalog/objectaddress.c | 67 +++++++++++++++++++-----
src/include/catalog/pg_proc.dat | 2 +-
src/test/regress/expected/privileges.out | 56 ++++++++++++++++++--
src/test/regress/sql/privileges.sql | 16 ++++--
5 files changed, 123 insertions(+), 24 deletions(-)
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 93ee3d4b60..aad944979f 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -26592,12 +26592,12 @@ SELECT currval(pg_get_serial_sequence('sometable', 'id'));
<indexterm>
<primary>pg_get_acl</primary>
</indexterm>
- <function>pg_get_acl</function> ( <parameter>classid</parameter> <type>oid</type>, <parameter>objid</parameter> <type>oid</type> )
+ <function>pg_get_acl</function> ( <parameter>classid</parameter> <type>oid</type>, <parameter>objid</parameter> <type>oid</type>, <parameter>objsubid</parameter> <type>integer</type> )
<returnvalue>aclitem[]</returnvalue>
</para>
<para>
Returns the <acronym>ACL</acronym> for a database object, specified
- by catalog OID and object OID. This function returns
+ by catalog OID, object OID and sub-object ID. This function returns
<literal>NULL</literal> values for undefined objects.
</para></entry>
</row>
@@ -26723,7 +26723,7 @@ SELECT currval(pg_get_serial_sequence('sometable', 'id'));
<programlisting>
postgres=# SELECT
(pg_identify_object(s.classid,s.objid,s.objsubid)).*,
- pg_catalog.pg_get_acl(s.classid,s.objid) AS acl
+ pg_catalog.pg_get_acl(s.classid,s.objid,s.objsubid) AS acl
FROM pg_catalog.pg_shdepend AS s
JOIN pg_catalog.pg_database AS d
ON d.datname = current_database() AND
diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c
index 2983b9180f..659512b254 100644
--- a/src/backend/catalog/objectaddress.c
+++ b/src/backend/catalog/objectaddress.c
@@ -4364,13 +4364,14 @@ pg_identify_object_as_address(PG_FUNCTION_ARGS)
/*
* SQL-level callable function to obtain the ACL of a specified object, given
- * its catalog OID and object OID.
+ * its catalog OID, object OID and sub-object ID.
*/
Datum
pg_get_acl(PG_FUNCTION_ARGS)
{
Oid classId = PG_GETARG_OID(0);
Oid objectId = PG_GETARG_OID(1);
+ int32 objsubid = PG_GETARG_INT32(2);
Oid catalogId;
AttrNumber Anum_acl;
Relation rel;
@@ -4391,21 +4392,63 @@ pg_get_acl(PG_FUNCTION_ARGS)
if (Anum_acl == InvalidAttrNumber)
PG_RETURN_NULL();
- rel = table_open(catalogId, AccessShareLock);
-
- tup = get_catalog_object_by_oid(rel, get_object_attnum_oid(catalogId),
- objectId);
- if (!HeapTupleIsValid(tup))
+ /*
+ * The procedure to retrive the ACL is different if the object is a table
+ * and the sub-object is non-zero, which means we're dealing with a column
+ * of a table. In this case, the objsubid is the attnum for the column.
+ */
+ if (classId == RelationRelationId && objsubid != 0)
{
- table_close(rel, AccessShareLock);
- PG_RETURN_NULL();
+ AttrNumber attnum = (AttrNumber) objsubid;
+
+ HeapTuple attTuple;
+ bool isNull;
+
+ attTuple = SearchSysCache2(ATTNUM,
+ ObjectIdGetDatum(objectId),
+ Int16GetDatum(attnum));
+
+ if (!HeapTupleIsValid(attTuple))
+ PG_RETURN_NULL();
+
+ /* ignore dropped columns */
+ if (((Form_pg_attribute) GETSTRUCT(attTuple))->attisdropped)
+ {
+ ReleaseSysCache(attTuple);
+ PG_RETURN_NULL();
+ }
+
+ datum = SysCacheGetAttr(ATTNUM, attTuple,
+ Anum_pg_attribute_attacl,
+ &isNull);
+
+ /* no need to do anything for a NULL ACL */
+ if (isNull)
+ {
+ ReleaseSysCache(attTuple);
+ PG_RETURN_NULL();
+ }
+
+ ReleaseSysCache(attTuple);
}
+ else
+ {
+ rel = table_open(catalogId, AccessShareLock);
- datum = heap_getattr(tup, Anum_acl, RelationGetDescr(rel), &isnull);
- table_close(rel, AccessShareLock);
+ tup = get_catalog_object_by_oid(rel, get_object_attnum_oid(catalogId),
+ objectId);
+ if (!HeapTupleIsValid(tup))
+ {
+ table_close(rel, AccessShareLock);
+ PG_RETURN_NULL();
+ }
- if (isnull)
- PG_RETURN_NULL();
+ datum = heap_getattr(tup, Anum_acl, RelationGetDescr(rel), &isnull);
+ table_close(rel, AccessShareLock);
+
+ if (isnull)
+ PG_RETURN_NULL();
+ }
PG_RETURN_DATUM(datum);
}
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index e1001a4822..9654b3ba4e 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -6364,7 +6364,7 @@
{ oid => '6347', descr => 'get ACL for SQL object',
proname => 'pg_get_acl', provolatile => 's', prorettype => '_aclitem',
- proargtypes => 'oid oid', proargnames => '{classid,objid}',
+ proargtypes => 'oid oid int4', proargnames => '{classid,objid,objsubid}',
prosrc => 'pg_get_acl' },
{ oid => '3839',
diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out
index 332bc584eb..c904cbef84 100644
--- a/src/test/regress/expected/privileges.out
+++ b/src/test/regress/expected/privileges.out
@@ -213,7 +213,7 @@ SELECT * FROM atest1;
(0 rows)
CREATE TABLE atest2 (col1 varchar(10), col2 boolean);
-SELECT pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid);
+SELECT pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid, 0);
pg_get_acl
------------
@@ -223,7 +223,7 @@ GRANT SELECT ON atest2 TO regress_priv_user2;
GRANT UPDATE ON atest2 TO regress_priv_user3;
GRANT INSERT ON atest2 TO regress_priv_user4 GRANTED BY CURRENT_USER;
GRANT TRUNCATE ON atest2 TO regress_priv_user5 GRANTED BY CURRENT_ROLE;
-SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid));
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid, 0));
unnest
------------------------------------------------
regress_priv_user1=arwdDxtm/regress_priv_user1
@@ -234,13 +234,13 @@ SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid));
(5 rows)
-- Invalid inputs
-SELECT pg_get_acl('pg_class'::regclass, 0); -- null
+SELECT pg_get_acl('pg_class'::regclass, 0, 0); -- null
pg_get_acl
------------
(1 row)
-SELECT pg_get_acl(0, 0); -- null
+SELECT pg_get_acl(0, 0, 0); -- null
pg_get_acl
------------
@@ -651,8 +651,56 @@ ERROR: permission denied for table atest2
SET SESSION AUTHORIZATION regress_priv_user1;
CREATE TABLE atest5 (one int, two int unique, three int, four int unique);
CREATE TABLE atest6 (one int, two int, blue int);
+SELECT pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 1);
+ pg_get_acl
+------------
+
+(1 row)
+
+SELECT pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 2);
+ pg_get_acl
+------------
+
+(1 row)
+
+SELECT pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 3);
+ pg_get_acl
+------------
+
+(1 row)
+
+SELECT pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 4);
+ pg_get_acl
+------------
+
+(1 row)
+
GRANT SELECT (one), INSERT (two), UPDATE (three) ON atest5 TO regress_priv_user4;
GRANT ALL (one) ON atest5 TO regress_priv_user3;
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 1));
+ unnest
+--------------------------------------------
+ regress_priv_user4=r/regress_priv_user1
+ regress_priv_user3=arwx/regress_priv_user1
+(2 rows)
+
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 2));
+ unnest
+-----------------------------------------
+ regress_priv_user4=a/regress_priv_user1
+(1 row)
+
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 3));
+ unnest
+-----------------------------------------
+ regress_priv_user4=w/regress_priv_user1
+(1 row)
+
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 4));
+ unnest
+--------
+(0 rows)
+
INSERT INTO atest5 VALUES (1,2,3);
SET SESSION AUTHORIZATION regress_priv_user4;
SELECT * FROM atest5; -- fail
diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql
index 980d19bde5..ea5c93cc57 100644
--- a/src/test/regress/sql/privileges.sql
+++ b/src/test/regress/sql/privileges.sql
@@ -183,16 +183,16 @@ GRANT SELECT ON atest1 TO regress_priv_user3, regress_priv_user4;
SELECT * FROM atest1;
CREATE TABLE atest2 (col1 varchar(10), col2 boolean);
-SELECT pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid);
+SELECT pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid, 0);
GRANT SELECT ON atest2 TO regress_priv_user2;
GRANT UPDATE ON atest2 TO regress_priv_user3;
GRANT INSERT ON atest2 TO regress_priv_user4 GRANTED BY CURRENT_USER;
GRANT TRUNCATE ON atest2 TO regress_priv_user5 GRANTED BY CURRENT_ROLE;
-SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid));
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid, 0));
-- Invalid inputs
-SELECT pg_get_acl('pg_class'::regclass, 0); -- null
-SELECT pg_get_acl(0, 0); -- null
+SELECT pg_get_acl('pg_class'::regclass, 0, 0); -- null
+SELECT pg_get_acl(0, 0, 0); -- null
GRANT TRUNCATE ON atest2 TO regress_priv_user4 GRANTED BY regress_priv_user5; -- error
@@ -437,8 +437,16 @@ SELECT * FROM atestv2; -- fail (even though regress_priv_user2 can access underl
SET SESSION AUTHORIZATION regress_priv_user1;
CREATE TABLE atest5 (one int, two int unique, three int, four int unique);
CREATE TABLE atest6 (one int, two int, blue int);
+SELECT pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 1);
+SELECT pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 2);
+SELECT pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 3);
+SELECT pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 4);
GRANT SELECT (one), INSERT (two), UPDATE (three) ON atest5 TO regress_priv_user4;
GRANT ALL (one) ON atest5 TO regress_priv_user3;
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 1));
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 2));
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 3));
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 4));
INSERT INTO atest5 VALUES (1,2,3);
--
2.45.1
^ permalink raw reply [nested|flat] 26+ messages in thread
* Re: pgsql: Add pg_get_acl() to get the ACL for a database object
2024-07-04 20:53 Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
2024-07-04 23:18 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Michael Paquier <[email protected]>
2024-07-05 08:40 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
@ 2024-07-08 08:34 ` Michael Paquier <[email protected]>
2024-07-08 09:55 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
0 siblings, 1 reply; 26+ messages in thread
From: Michael Paquier @ 2024-07-08 08:34 UTC (permalink / raw)
To: Joel Jacobson <[email protected]>; +Cc: Tom Lane <[email protected]>; Postgres hackers <[email protected]>
On Fri, Jul 05, 2024 at 10:40:39AM +0200, Joel Jacobson wrote:
> OK, I made an attempt to implement this, based on adapting code from
> recordExtObjInitPriv() in aclchk.c, which retrieves ACL based on ATTNUM.
>
> There are now two different code paths for columns and non-columns.
>
> It sounds like a bigger refactoring in this area would be nice,
> which would enable cleaning up code in other functions as well,
> but maybe that's better to do as a separate project.
Thanks for the patch. I have been looking at it for a few hours,
eyeing a bit on the ObjectProperty parts a bit if we were to extend it
for sub-object IDs, and did not like the complexity this introduces,
so I'd be OK to live with the extra handling in pg_get_acl() itself.
+ /* ignore dropped columns */
+ if (atttup->attisdropped)
+ {
+ ReleaseSysCache(tup);
+ PG_RETURN_NULL();
+ }
Hmm. This is an important bit and did not consider it first. That
makes the use of ObjectProperty less flexible because we want to look
at the data in the pg_attribute tuple to be able to return NULL in
this case.
I've tweaked a bit what you are proposing, simplifying the code and
removing the first batch of queries in the tests as these were less
interesting. How does that look?
--
Michael
Attachments:
[text/x-diff] v2-0001-Extend-pg_get_acl-to-handle-sub-object-IDs.patch (9.4K, ../../[email protected]/2-v2-0001-Extend-pg_get_acl-to-handle-sub-object-IDs.patch)
download | inline diff:
From 07b65a78fb660f6a27ef464870a3e27f788c5e28 Mon Sep 17 00:00:00 2001
From: Michael Paquier <[email protected]>
Date: Mon, 8 Jul 2024 16:24:42 +0900
Subject: [PATCH v2] Extend pg_get_acl to handle sub-object IDs.
This patch modifies the pg_get_acl function to accept a third objsubid
param. This enables the retrieval of ACLs for columns within a table.
---
src/include/catalog/pg_proc.dat | 2 +-
src/backend/catalog/objectaddress.c | 60 +++++++++++++++++++-----
src/test/regress/expected/privileges.out | 32 +++++++++++--
src/test/regress/sql/privileges.sql | 12 +++--
doc/src/sgml/func.sgml | 6 +--
5 files changed, 87 insertions(+), 25 deletions(-)
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 0bf413fe05..0a0f6aa198 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -6364,7 +6364,7 @@
{ oid => '8730', descr => 'get ACL for SQL object',
proname => 'pg_get_acl', provolatile => 's', prorettype => '_aclitem',
- proargtypes => 'oid oid', proargnames => '{classid,objid}',
+ proargtypes => 'oid oid int4', proargnames => '{classid,objid,objsubid}',
prosrc => 'pg_get_acl' },
{ oid => '3839',
diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c
index 2983b9180f..fac3922964 100644
--- a/src/backend/catalog/objectaddress.c
+++ b/src/backend/catalog/objectaddress.c
@@ -4364,19 +4364,19 @@ pg_identify_object_as_address(PG_FUNCTION_ARGS)
/*
* SQL-level callable function to obtain the ACL of a specified object, given
- * its catalog OID and object OID.
+ * its catalog OID, object OID and sub-object ID.
*/
Datum
pg_get_acl(PG_FUNCTION_ARGS)
{
Oid classId = PG_GETARG_OID(0);
Oid objectId = PG_GETARG_OID(1);
+ int32 objsubid = PG_GETARG_INT32(2);
Oid catalogId;
AttrNumber Anum_acl;
- Relation rel;
- HeapTuple tup;
Datum datum;
bool isnull;
+ HeapTuple tup;
/* for "pinned" items in pg_depend, return null */
if (!OidIsValid(classId) && !OidIsValid(objectId))
@@ -4391,18 +4391,52 @@ pg_get_acl(PG_FUNCTION_ARGS)
if (Anum_acl == InvalidAttrNumber)
PG_RETURN_NULL();
- rel = table_open(catalogId, AccessShareLock);
-
- tup = get_catalog_object_by_oid(rel, get_object_attnum_oid(catalogId),
- objectId);
- if (!HeapTupleIsValid(tup))
+ /*
+ * If dealing with a relation's attribute (objsubid is set), the ACL is
+ * retrieved from pg_attribute.
+ */
+ if (classId == RelationRelationId && objsubid != 0)
{
- table_close(rel, AccessShareLock);
- PG_RETURN_NULL();
- }
+ AttrNumber attnum = (AttrNumber) objsubid;
+ Form_pg_attribute atttup;
- datum = heap_getattr(tup, Anum_acl, RelationGetDescr(rel), &isnull);
- table_close(rel, AccessShareLock);
+ tup = SearchSysCache2(ATTNUM, ObjectIdGetDatum(objectId),
+ Int16GetDatum(attnum));
+
+ if (!HeapTupleIsValid(tup))
+ PG_RETURN_NULL();
+
+ atttup = (Form_pg_attribute) GETSTRUCT(tup);
+
+ /* ignore dropped columns */
+ if (atttup->attisdropped)
+ {
+ ReleaseSysCache(tup);
+ PG_RETURN_NULL();
+ }
+
+ datum = SysCacheGetAttr(ATTNUM, tup,
+ Anum_pg_attribute_attacl,
+ &isnull);
+ ReleaseSysCache(tup);
+ }
+ else
+ {
+ Relation rel;
+
+ rel = table_open(catalogId, AccessShareLock);
+
+ tup = get_catalog_object_by_oid(rel, get_object_attnum_oid(catalogId),
+ objectId);
+ if (!HeapTupleIsValid(tup))
+ {
+ table_close(rel, AccessShareLock);
+ PG_RETURN_NULL();
+ }
+
+ datum = heap_getattr(tup, Anum_acl, RelationGetDescr(rel), &isnull);
+ table_close(rel, AccessShareLock);
+ }
if (isnull)
PG_RETURN_NULL();
diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out
index 332bc584eb..fab0cc800f 100644
--- a/src/test/regress/expected/privileges.out
+++ b/src/test/regress/expected/privileges.out
@@ -213,7 +213,7 @@ SELECT * FROM atest1;
(0 rows)
CREATE TABLE atest2 (col1 varchar(10), col2 boolean);
-SELECT pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid);
+SELECT pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid, 0);
pg_get_acl
------------
@@ -223,7 +223,7 @@ GRANT SELECT ON atest2 TO regress_priv_user2;
GRANT UPDATE ON atest2 TO regress_priv_user3;
GRANT INSERT ON atest2 TO regress_priv_user4 GRANTED BY CURRENT_USER;
GRANT TRUNCATE ON atest2 TO regress_priv_user5 GRANTED BY CURRENT_ROLE;
-SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid));
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid, 0));
unnest
------------------------------------------------
regress_priv_user1=arwdDxtm/regress_priv_user1
@@ -234,13 +234,13 @@ SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid));
(5 rows)
-- Invalid inputs
-SELECT pg_get_acl('pg_class'::regclass, 0); -- null
+SELECT pg_get_acl('pg_class'::regclass, 0, 0); -- null
pg_get_acl
------------
(1 row)
-SELECT pg_get_acl(0, 0); -- null
+SELECT pg_get_acl(0, 0, 0); -- null
pg_get_acl
------------
@@ -653,6 +653,30 @@ CREATE TABLE atest5 (one int, two int unique, three int, four int unique);
CREATE TABLE atest6 (one int, two int, blue int);
GRANT SELECT (one), INSERT (two), UPDATE (three) ON atest5 TO regress_priv_user4;
GRANT ALL (one) ON atest5 TO regress_priv_user3;
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 1));
+ unnest
+--------------------------------------------
+ regress_priv_user4=r/regress_priv_user1
+ regress_priv_user3=arwx/regress_priv_user1
+(2 rows)
+
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 2));
+ unnest
+-----------------------------------------
+ regress_priv_user4=a/regress_priv_user1
+(1 row)
+
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 3));
+ unnest
+-----------------------------------------
+ regress_priv_user4=w/regress_priv_user1
+(1 row)
+
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 4));
+ unnest
+--------
+(0 rows)
+
INSERT INTO atest5 VALUES (1,2,3);
SET SESSION AUTHORIZATION regress_priv_user4;
SELECT * FROM atest5; -- fail
diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql
index 980d19bde5..ae338e8cc8 100644
--- a/src/test/regress/sql/privileges.sql
+++ b/src/test/regress/sql/privileges.sql
@@ -183,16 +183,16 @@ GRANT SELECT ON atest1 TO regress_priv_user3, regress_priv_user4;
SELECT * FROM atest1;
CREATE TABLE atest2 (col1 varchar(10), col2 boolean);
-SELECT pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid);
+SELECT pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid, 0);
GRANT SELECT ON atest2 TO regress_priv_user2;
GRANT UPDATE ON atest2 TO regress_priv_user3;
GRANT INSERT ON atest2 TO regress_priv_user4 GRANTED BY CURRENT_USER;
GRANT TRUNCATE ON atest2 TO regress_priv_user5 GRANTED BY CURRENT_ROLE;
-SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid));
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest2'::regclass::oid, 0));
-- Invalid inputs
-SELECT pg_get_acl('pg_class'::regclass, 0); -- null
-SELECT pg_get_acl(0, 0); -- null
+SELECT pg_get_acl('pg_class'::regclass, 0, 0); -- null
+SELECT pg_get_acl(0, 0, 0); -- null
GRANT TRUNCATE ON atest2 TO regress_priv_user4 GRANTED BY regress_priv_user5; -- error
@@ -439,6 +439,10 @@ CREATE TABLE atest5 (one int, two int unique, three int, four int unique);
CREATE TABLE atest6 (one int, two int, blue int);
GRANT SELECT (one), INSERT (two), UPDATE (three) ON atest5 TO regress_priv_user4;
GRANT ALL (one) ON atest5 TO regress_priv_user3;
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 1));
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 2));
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 3));
+SELECT unnest(pg_get_acl('pg_class'::regclass, 'atest5'::regclass::oid, 4));
INSERT INTO atest5 VALUES (1,2,3);
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 93ee3d4b60..aad944979f 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -26592,12 +26592,12 @@ SELECT currval(pg_get_serial_sequence('sometable', 'id'));
<indexterm>
<primary>pg_get_acl</primary>
</indexterm>
- <function>pg_get_acl</function> ( <parameter>classid</parameter> <type>oid</type>, <parameter>objid</parameter> <type>oid</type> )
+ <function>pg_get_acl</function> ( <parameter>classid</parameter> <type>oid</type>, <parameter>objid</parameter> <type>oid</type>, <parameter>objsubid</parameter> <type>integer</type> )
<returnvalue>aclitem[]</returnvalue>
</para>
<para>
Returns the <acronym>ACL</acronym> for a database object, specified
- by catalog OID and object OID. This function returns
+ by catalog OID, object OID and sub-object ID. This function returns
<literal>NULL</literal> values for undefined objects.
</para></entry>
</row>
@@ -26723,7 +26723,7 @@ SELECT currval(pg_get_serial_sequence('sometable', 'id'));
<programlisting>
postgres=# SELECT
(pg_identify_object(s.classid,s.objid,s.objsubid)).*,
- pg_catalog.pg_get_acl(s.classid,s.objid) AS acl
+ pg_catalog.pg_get_acl(s.classid,s.objid,s.objsubid) AS acl
FROM pg_catalog.pg_shdepend AS s
JOIN pg_catalog.pg_database AS d
ON d.datname = current_database() AND
--
2.45.2
[application/pgp-signature] signature.asc (833B, ../../[email protected]/3-signature.asc)
download
^ permalink raw reply [nested|flat] 26+ messages in thread
* Re: pgsql: Add pg_get_acl() to get the ACL for a database object
2024-07-04 20:53 Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
2024-07-04 23:18 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Michael Paquier <[email protected]>
2024-07-05 08:40 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
2024-07-08 08:34 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Michael Paquier <[email protected]>
@ 2024-07-08 09:55 ` Joel Jacobson <[email protected]>
2024-07-10 01:25 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Michael Paquier <[email protected]>
0 siblings, 1 reply; 26+ messages in thread
From: Joel Jacobson @ 2024-07-08 09:55 UTC (permalink / raw)
To: Michael Paquier <[email protected]>; +Cc: Tom Lane <[email protected]>; Postgres hackers <[email protected]>
On Mon, Jul 8, 2024, at 10:34, Michael Paquier wrote:
> Thanks for the patch. I have been looking at it for a few hours,
> eyeing a bit on the ObjectProperty parts a bit if we were to extend it
> for sub-object IDs, and did not like the complexity this introduces,
> so I'd be OK to live with the extra handling in pg_get_acl() itself.
>
> + /* ignore dropped columns */
> + if (atttup->attisdropped)
> + {
> + ReleaseSysCache(tup);
> + PG_RETURN_NULL();
> + }
>
> Hmm. This is an important bit and did not consider it first. That
> makes the use of ObjectProperty less flexible because we want to look
> at the data in the pg_attribute tuple to be able to return NULL in
> this case.
>
> I've tweaked a bit what you are proposing, simplifying the code and
> removing the first batch of queries in the tests as these were less
> interesting. How does that look?
Thanks, nice simplifications.
I agree the tests you removed are not that interesting.
Looks good to me.
Patch didn't apply to HEAD nor on top of any of the previous commits either,
but I couldn't figure out why based on the .rej files, strange.
I copy/pasted the parts from the patch to test it. Let me know if you need a
rebased version of it, in case you will need to do the same, to save some work.
Also noted the below in your last commit:
a6417078c414 has introduced as project policy that new features
committed during the development cycle should use new OIDs in the
[8000,9999] range.
4564f1cebd43 did not respect that rule, so let's renumber pg_get_acl()
to use an OID in the correct range.
Thanks for the info!
Will make sure to use the `src/include/catalog/renumber_oids.pl` tool
for future patches.
Regards,
Joel
^ permalink raw reply [nested|flat] 26+ messages in thread
* Re: pgsql: Add pg_get_acl() to get the ACL for a database object
2024-07-04 20:53 Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
2024-07-04 23:18 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Michael Paquier <[email protected]>
2024-07-05 08:40 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
2024-07-08 08:34 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Michael Paquier <[email protected]>
2024-07-08 09:55 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
@ 2024-07-10 01:25 ` Michael Paquier <[email protected]>
0 siblings, 0 replies; 26+ messages in thread
From: Michael Paquier @ 2024-07-10 01:25 UTC (permalink / raw)
To: Joel Jacobson <[email protected]>; +Cc: Tom Lane <[email protected]>; Postgres hackers <[email protected]>
On Mon, Jul 08, 2024 at 11:55:28AM +0200, Joel Jacobson wrote:
> Thanks, nice simplifications.
> I agree the tests you removed are not that interesting.
>
> Looks good to me.
On second review, I have spotted a use-after-free for the case of an
attribute ACL in both v1 and v2, as we would finish by releasing the
syscache entry before returning the ACL datum. For builds with the
flags -DRELCACHE_FORCE_RELEASE -DCATCACHE_FORCE_RELEASE, like the
buildfarm member prion, this would cause lookup failures in the
function when building the result because the datum is borked.
At the end, I have settled down on using SearchSysCacheCopyAttNum().
It requires a heap_freetuple(), which we already don't care much about
in the existing callers of get_catalog_object_by_oid() because these
are short-lived, with bonus points because this routine uses
SearchSysCacheAttNum() that has a check for attisdropped, making the
code of pg_get_acl() even simpler.
The usual trick I use to check a fix with this configuration is to use
two builds because initdb is insanely slow if caches are released: one
with the flags and one without them. I have used the build without
the flags to initialize a cluster with the objects and their ACLs.
Then, the second build is used only to execute all the scenarios of
pg_get_acl(), which are much cheaper to execute.
--
Michael
Attachments:
[application/pgp-signature] signature.asc (833B, ../../[email protected]/2-signature.asc)
download
^ permalink raw reply [nested|flat] 26+ messages in thread
end of thread, other threads:[~2024-07-10 01:25 UTC | newest]
Thread overview: 26+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2018-10-22 12:34 BUG #15448: server process (PID 22656) was terminated by exception 0xC0000005 PG Bug reporting form <[email protected]>
2018-10-23 02:00 ` Amit Langote <[email protected]>
2018-10-23 03:16 ` Michael Paquier <[email protected]>
2018-10-23 03:27 ` Amit Langote <[email protected]>
2018-10-23 11:46 ` Andrew Dunstan <[email protected]>
2018-10-23 13:44 ` Amit Langote <[email protected]>
2018-10-24 23:00 ` Michael Banck <[email protected]>
2018-10-24 23:43 ` Andrew Dunstan <[email protected]>
2024-01-07 21:53 [PATCH v3 09/17] Separate tuple pre freeze checks and invoke earlier Melanie Plageman <[email protected]>
2024-01-07 21:53 [PATCH v4 11/19] Separate tuple pre freeze checks and invoke earlier Melanie Plageman <[email protected]>
2024-01-07 21:53 [PATCH v3 09/17] Separate tuple pre freeze checks and invoke earlier Melanie Plageman <[email protected]>
2024-01-07 21:53 [PATCH v4 11/19] Separate tuple pre freeze checks and invoke earlier Melanie Plageman <[email protected]>
2024-01-07 21:53 [PATCH v2 09/17] Separate tuple pre freeze checks and invoke earlier Melanie Plageman <[email protected]>
2024-01-07 21:53 [PATCH v4 11/19] Separate tuple pre freeze checks and invoke earlier Melanie Plageman <[email protected]>
2024-01-07 21:53 [PATCH v2 09/17] Separate tuple pre freeze checks and invoke earlier Melanie Plageman <[email protected]>
2024-01-07 21:53 [PATCH v2 09/17] Separate tuple pre freeze checks and invoke earlier Melanie Plageman <[email protected]>
2024-01-07 21:53 [PATCH v3 09/17] Separate tuple pre freeze checks and invoke earlier Melanie Plageman <[email protected]>
2024-03-26 00:54 [PATCH v7 10/16] Separate tuple pre freeze checks and invoke earlier Melanie Plageman <[email protected]>
2024-03-26 00:54 [PATCH v9 10/21] Separate tuple pre freeze checks and invoke earlier Melanie Plageman <[email protected]>
2024-03-26 00:54 [PATCH v7 10/16] Separate tuple pre freeze checks and invoke earlier Melanie Plageman <[email protected]>
2024-07-04 20:53 Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
2024-07-04 23:18 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Michael Paquier <[email protected]>
2024-07-05 08:40 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
2024-07-08 08:34 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Michael Paquier <[email protected]>
2024-07-08 09:55 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Joel Jacobson <[email protected]>
2024-07-10 01:25 ` Re: pgsql: Add pg_get_acl() to get the ACL for a database object Michael Paquier <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox