PostgreSQL parser for Rust that uses the actual PostgreSQL server source to parse SQL queries and return the internal PostgreSQL parse tree.
Rust
102
57 commits
updated Jun 18, 2026
PostgreSQL parser for Rust that uses the actual PostgreSQL server source to parse SQL queries and return the internal PostgreSQL parse tree.
Add the following to your Cargo.toml
[dependencies]
pg_parse = "0.15"
use pg_parse::ast::Node;
let result = pg_parse::parse("SELECT * FROM contacts");
assert!(result.is_ok());
let result = result.unwrap();
assert!(matches!(*&result[0], Node::SelectStmt(_)));
// We can also convert back to a string, if the `str` feature is enabled (enabled by default).
#[cfg(feature = "str")]
assert_eq!(result[0].to_string(), "SELECT * FROM contacts");
The pganalyze organization maintains the official implementation:
pg_query.rs. This
closely resembles the name of the C library also published by the team (libpg_query). This implementation uses the
protobuf
interface introduced with version 13 of libpg_query.
This library similarly consumes libpg_query however utilizes the older JSON interface to manage parsing. The intention
of this library
is to maintain a dependency "light" implementation with serde and serde_json being the only required runtime
dependencies.
So which one should you use? You probably want to use the official pg_query.rs library as that will continue to be
kept closely up to date with libpg_query updates. This library will continue to be maintained however may not be as
up-to-date as the official implementation.
A huge thank you to Lukas Fittl for all of his amazing work creating libpg_query.
6,711 followers · starred Oct 2023
49 followers · starred May 2026
61 followers · starred Oct 2021
107 followers · starred Feb 2024
PostgreSQL parser for Rust that uses the actual PostgreSQL server source to parse SQL queries and return the internal PostgreSQL parse tree.
Rust
102
57 commits
updated Jun 18, 2026
PostgreSQL parser for Rust that uses the actual PostgreSQL server source to parse SQL queries and return the internal PostgreSQL parse tree.
Add the following to your Cargo.toml
[dependencies]
pg_parse = "0.15"
use pg_parse::ast::Node;
let result = pg_parse::parse("SELECT * FROM contacts");
assert!(result.is_ok());
let result = result.unwrap();
assert!(matches!(*&result[0], Node::SelectStmt(_)));
// We can also convert back to a string, if the `str` feature is enabled (enabled by default).
#[cfg(feature = "str")]
assert_eq!(result[0].to_string(), "SELECT * FROM contacts");
The pganalyze organization maintains the official implementation:
pg_query.rs. This
closely resembles the name of the C library also published by the team (libpg_query). This implementation uses the
protobuf
interface introduced with version 13 of libpg_query.
This library similarly consumes libpg_query however utilizes the older JSON interface to manage parsing. The intention
of this library
is to maintain a dependency "light" implementation with serde and serde_json being the only required runtime
dependencies.
So which one should you use? You probably want to use the official pg_query.rs library as that will continue to be
kept closely up to date with libpg_query updates. This library will continue to be maintained however may not be as
up-to-date as the official implementation.
A huge thank you to Lukas Fittl for all of his amazing work creating libpg_query.
6,711 followers · starred Oct 2023
49 followers · starred May 2026
61 followers · starred Oct 2021
107 followers · starred Feb 2024