Skip to content

Commit da8d5e6

Browse files
authored
Clear prepared statement cache on discard/deallocate all (#508)
1 parent e8559b3 commit da8d5e6

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

pgdog/src/backend/server.rs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ impl Server {
417417
let cmd = CommandComplete::from_bytes(message.to_bytes()?)?;
418418
match cmd.command() {
419419
"PREPARE" | "DEALLOCATE" => self.sync_prepared = true,
420+
"DEALLOCATE ALL" | "DISCARD ALL" => self.prepared_statements.clear(),
420421
"RESET" => self.client_params.clear(), // Someone reset params, we're gonna need to re-sync.
421422
_ => (),
422423
}
@@ -1974,4 +1975,82 @@ pub mod test {
19741975
}
19751976
}
19761977
}
1978+
1979+
#[tokio::test]
1980+
async fn test_deallocate_all_clears_cache() {
1981+
let mut server = test_server().await;
1982+
1983+
server
1984+
.send(
1985+
&vec![
1986+
Parse::named("__pgdog_1", "SELECT $1::bigint").into(),
1987+
Parse::named("__pgdog_2", "SELECT 123").into(),
1988+
Parse::named("__pgdog_3", "SELECT 1234").into(),
1989+
Parse::named("__pgdog_4", "SELECT 12345").into(),
1990+
Flush.into(),
1991+
]
1992+
.into(),
1993+
)
1994+
.await
1995+
.unwrap();
1996+
1997+
for _ in 0..4 {
1998+
let msg = server.read().await.unwrap();
1999+
assert_eq!(msg.code(), '1');
2000+
}
2001+
2002+
assert_eq!(server.prepared_statements.len(), 4);
2003+
2004+
server
2005+
.send(&vec![Query::new("DEALLOCATE ALL").into(), Sync.into()].into())
2006+
.await
2007+
.unwrap();
2008+
2009+
for c in ['C', 'Z', 'Z'] {
2010+
let msg = server.read().await.unwrap();
2011+
assert_eq!(msg.code(), c);
2012+
}
2013+
2014+
assert_eq!(server.prepared_statements.len(), 0);
2015+
assert!(server.done());
2016+
}
2017+
2018+
#[tokio::test]
2019+
async fn test_discard_all_clears_cache() {
2020+
let mut server = test_server().await;
2021+
2022+
server
2023+
.send(
2024+
&vec![
2025+
Parse::named("__pgdog_1", "SELECT $1::bigint").into(),
2026+
Parse::named("__pgdog_2", "SELECT 123").into(),
2027+
Parse::named("__pgdog_3", "SELECT 1234").into(),
2028+
Parse::named("__pgdog_4", "SELECT 12345").into(),
2029+
Flush.into(),
2030+
]
2031+
.into(),
2032+
)
2033+
.await
2034+
.unwrap();
2035+
2036+
for _ in 0..4 {
2037+
let msg = server.read().await.unwrap();
2038+
assert_eq!(msg.code(), '1');
2039+
}
2040+
2041+
assert_eq!(server.prepared_statements.len(), 4);
2042+
2043+
server
2044+
.send(&vec![Query::new("DISCARD ALL").into(), Sync.into()].into())
2045+
.await
2046+
.unwrap();
2047+
2048+
for c in ['C', 'Z', 'Z'] {
2049+
let msg = server.read().await.unwrap();
2050+
assert_eq!(msg.code(), c);
2051+
}
2052+
2053+
assert_eq!(server.prepared_statements.len(), 0);
2054+
assert!(server.done());
2055+
}
19772056
}

0 commit comments

Comments
 (0)