@@ -182,10 +182,7 @@ var (
182182 prometheus.Labels {},
183183 )
184184
185- statUserTablesQuery = `
186- WITH server_version AS (
187- SELECT current_setting('server_version_num')::int AS ver
188- )
185+ statUserTablesQueryPrePG18 = `
189186 SELECT
190187 current_database() datname,
191188 schemaname,
@@ -210,19 +207,54 @@ var (
210207 analyze_count,
211208 autoanalyze_count,
212209 pg_total_relation_size(relid) as total_size,
213- CASE WHEN server_version.ver >= 180000 THEN total_vacuum_time ELSE NULL END as total_vacuum_time,
214- CASE WHEN server_version.ver >= 180000 THEN total_autovacuum_time ELSE NULL END as total_autovacuum_time,
215- CASE WHEN server_version.ver >= 180000 THEN total_analyze_time ELSE NULL END as total_analyze_time,
216- CASE WHEN server_version.ver >= 180000 THEN total_autoanalyze_time ELSE NULL END as total_autoanalyze_time
217- FROM
218- pg_stat_user_tables, server_version;`
210+ NULL::double as total_vacuum_time,
211+ NULL::double as total_autovacuum_time,
212+ NULL::double as total_analyze_time,
213+ NULL::double as total_autoanalyze_time
214+ FROM pg_stat_user_tables;`
215+
216+ statUserTablesQueryPostPG18 = `
217+ SELECT
218+ current_database() datname,
219+ schemaname,
220+ relname,
221+ seq_scan,
222+ seq_tup_read,
223+ idx_scan,
224+ idx_tup_fetch,
225+ n_tup_ins,
226+ n_tup_upd,
227+ n_tup_del,
228+ n_tup_hot_upd,
229+ n_live_tup,
230+ n_dead_tup,
231+ n_mod_since_analyze,
232+ COALESCE(last_vacuum, '1970-01-01Z') as last_vacuum,
233+ COALESCE(last_autovacuum, '1970-01-01Z') as last_autovacuum,
234+ COALESCE(last_analyze, '1970-01-01Z') as last_analyze,
235+ COALESCE(last_autoanalyze, '1970-01-01Z') as last_autoanalyze,
236+ vacuum_count,
237+ autovacuum_count,
238+ analyze_count,
239+ autoanalyze_count,
240+ pg_total_relation_size(relid) as total_size,
241+ total_vacuum_time,
242+ total_autovacuum_time,
243+ total_analyze_time,
244+ total_autoanalyze_time
245+ FROM pg_stat_user_tables;`
219246)
220247
221248func (c * PGStatUserTablesCollector ) Update (ctx context.Context , instance * instance , ch chan <- prometheus.Metric ) error {
222249 db := instance .getDB ()
223250
224251 v18plus := instance .version .GTE (semver.Version {Major : 18 })
225252
253+ statUserTablesQuery := statUserTablesQueryPrePG18
254+ if v18plus {
255+ statUserTablesQuery = statUserTablesQueryPostPG18
256+ }
257+
226258 rows , err := db .QueryContext (ctx , statUserTablesQuery )
227259
228260 if err != nil {
0 commit comments