diff --git a/Cargo.lock b/Cargo.lock
index 3ae92a7a1..22520deab 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3313,7 +3313,7 @@ dependencies = [
[[package]]
name = "pg_raw_parse"
version = "0.1.0"
-source = "git+https://github.com/pgdogdev/pg_raw_parse.git?rev=a4a2a2c#a4a2a2ce04ae22056fbcf7f65194412c216a2140"
+source = "git+https://github.com/pgdogdev/pg_raw_parse.git?rev=b2a15ec#b2a15ec8a4a3a0a9a8d702901e6e336c63aec72b"
dependencies = [
"bindgen 0.72.1",
"cc",
diff --git a/pgdog/Cargo.toml b/pgdog/Cargo.toml
index 8f58ad884..03d111e7f 100644
--- a/pgdog/Cargo.toml
+++ b/pgdog/Cargo.toml
@@ -80,7 +80,7 @@ smallvec = "1"
reqwest.workspace = true
hex = "0.4"
x509-parser = "0.18"
-pg_raw_parse = { git = "https://github.com/pgdogdev/pg_raw_parse.git", rev = "a4a2a2c", optional = true }
+pg_raw_parse = { git = "https://github.com/pgdogdev/pg_raw_parse.git", rev = "b2a15ec", optional = true }
itertools = "0.15.0"
[target.'cfg(unix)'.dependencies]
diff --git a/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/engine.rs b/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/engine.rs
index 4b2eb7d59..a4a1f6bc6 100644
--- a/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/engine.rs
+++ b/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/engine.rs
@@ -26,7 +26,7 @@ impl AggregatesRewrite {
/// Rewrite a SELECT query in-place, adding helper aggregates when necessary.
#[cfg(feature = "new_parser")]
pub(crate) fn rewrite_select<'a>(
- mut select: nodes::SelectStmtMut<'a, '_>,
+ select: &mut nodes::SelectStmtMut<'a, '_>,
mem: make::MemoryToken<'a>,
aggregate: &Aggregate,
) -> RewriteOutput {
@@ -455,7 +455,7 @@ mod tests {
let aggregate = Aggregate::parse(&*stmt, &Default::default());
output = Some(AggregatesRewrite::rewrite_select(
- stmt.as_mut(),
+ &mut stmt.as_mut(),
mem,
&aggregate,
));
diff --git a/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/mod.rs b/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/mod.rs
index 412b83a10..ca74a61ef 100644
--- a/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/mod.rs
+++ b/pgdog/src/frontend/router/parser/rewrite/statement/aggregate/mod.rs
@@ -17,7 +17,7 @@ impl StatementRewrite<'_> {
#[cfg(feature = "new_parser")]
pub(super) fn rewrite_aggregates<'a>(
&mut self,
- select: SelectStmtMut<'a, '_>,
+ select: &mut SelectStmtMut<'a, '_>,
mem: MemoryToken<'a>,
plan: &mut RewritePlan,
schema: &Schema,
diff --git a/pgdog/src/frontend/router/parser/rewrite/statement/mod.rs b/pgdog/src/frontend/router/parser/rewrite/statement/mod.rs
index a0caf845f..830d99f74 100644
--- a/pgdog/src/frontend/router/parser/rewrite/statement/mod.rs
+++ b/pgdog/src/frontend/router/parser/rewrite/statement/mod.rs
@@ -1,9 +1,10 @@
//! Statement rewriter.
+#[cfg(not(feature = "new_parser"))]
use pg_query::Node as PgNode;
use pg_query::protobuf::ParseResult;
#[cfg(feature = "new_parser")]
-use pg_raw_parse::{Node, NodeMut, make, walk};
+use pg_raw_parse::{Node, NodeMut, make, transform, walk};
#[cfg(not(feature = "new_parser"))]
use pgdog_config::QueryParserEngine;
@@ -142,47 +143,45 @@ impl<'a> StatementRewrite<'a> {
// Track the next parameter number to use
let mut next_param = plan.params as i32 + 1;
-
- self.stmt.stmts[0] = pg_query::parse(pg_raw_parse::deparse(node.as_ref())?.as_str())?
- .protobuf
- .stmts
- .pop()
- .unwrap();
- let extended = self.extended;
- visitor::visit_and_mutate_nodes(self.stmt, |node| -> Result