#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum AllowedQuery {
PgStatStatementsSnapshot,
PgStatActivitySnapshot,
PgStatIoSnapshot,
PgStatDatabaseSnapshot,
}
impl AllowedQuery {
pub const ALL: [AllowedQuery; 4] = [
Self::PgStatStatementsSnapshot,
Self::PgStatActivitySnapshot,
Self::PgStatIoSnapshot,
Self::PgStatDatabaseSnapshot,
];
pub fn sql(&self) -> &'static str {
match self {
Self::PgStatStatementsSnapshot => {
"SELECT \
extract(epoch from now())::float8 AS snapshot_t, \
md5(queryid::text) AS query_id, \
calls AS calls, \
total_exec_time AS total_exec_time_ms \
FROM pg_stat_statements"
}
Self::PgStatActivitySnapshot => {
"SELECT \
extract(epoch from now())::float8 AS snapshot_t, \
coalesce(wait_event_type, 'None') AS wait_event_type, \
coalesce(wait_event, 'None') AS wait_event, \
state AS state \
FROM pg_stat_activity \
WHERE pid <> pg_backend_pid()"
}
Self::PgStatIoSnapshot => {
"SELECT \
extract(epoch from now())::float8 AS snapshot_t, \
coalesce(backend_type, 'unknown') AS backend_type, \
coalesce(object, 'unknown') AS object, \
coalesce(context, 'unknown') AS context, \
coalesce(reads, 0) AS reads, \
coalesce(hits, 0) AS hits, \
coalesce(read_time, 0)::float8 AS read_time_ms \
FROM pg_stat_io"
}
Self::PgStatDatabaseSnapshot => {
"SELECT \
extract(epoch from now())::float8 AS snapshot_t, \
coalesce(datname, '(null)') AS datname, \
coalesce(blks_hit, 0) AS blks_hit, \
coalesce(blks_read, 0) AS blks_read \
FROM pg_stat_database \
WHERE datname IS NOT NULL"
}
}
}
pub fn sql_concat_for_lock() -> String {
let mut out = String::new();
for (i, q) in Self::ALL.iter().enumerate() {
if i > 0 {
out.push_str("\n---\n");
}
out.push_str(q.sql());
}
out
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_query_is_a_select_on_pg_catalog_or_pg_stat() {
for q in AllowedQuery::ALL.iter() {
let sql = q.sql();
let trimmed = sql.trim_start();
assert!(
trimmed.starts_with("SELECT"),
"allow-listed query {:?} is not a SELECT: {}",
q,
sql
);
assert!(
sql.contains("pg_stat_") || sql.contains("pg_catalog."),
"allow-listed query {:?} does not reference pg_stat_* or pg_catalog.*: {}",
q,
sql
);
for forbidden in [
"INSERT",
"UPDATE",
"DELETE",
"DROP",
"ALTER",
"CREATE",
"TRUNCATE",
"GRANT",
"REVOKE",
"COPY",
] {
assert!(
!sql.to_uppercase().contains(forbidden),
"allow-listed query {:?} contains forbidden keyword {}",
q,
forbidden
);
}
}
}
}