Skip to main content

pg_blast_radius/
parse.rs

1use anyhow::Result;
2use pg_query::protobuf;
3
4pub fn parse(sql: &str) -> Result<pg_query::ParseResult> {
5    pg_query::parse(sql).map_err(|e| anyhow::anyhow!("Parse error: {e}"))
6}
7
8pub fn extract_statement_sql(source: &str, stmt: &protobuf::RawStmt) -> String {
9    let start = stmt.stmt_location as usize;
10    let len = if stmt.stmt_len > 0 {
11        stmt.stmt_len as usize
12    } else {
13        source.len() - start
14    };
15    let end = (start + len).min(source.len());
16    source[start..end].trim().to_string()
17}
18
19pub fn format_relation(r: &protobuf::RangeVar) -> String {
20    if r.schemaname.is_empty() {
21        r.relname.clone()
22    } else {
23        format!("{}.{}", r.schemaname, r.relname)
24    }
25}