@@ -417,6 +417,7 @@ impl Server {
417
417
let cmd = CommandComplete :: from_bytes ( message. to_bytes ( ) ?) ?;
418
418
match cmd. command ( ) {
419
419
"PREPARE" | "DEALLOCATE" => self . sync_prepared = true ,
420
+ "DEALLOCATE ALL" | "DISCARD ALL" => self . prepared_statements . clear ( ) ,
420
421
"RESET" => self . client_params . clear ( ) , // Someone reset params, we're gonna need to re-sync.
421
422
_ => ( ) ,
422
423
}
@@ -1974,4 +1975,82 @@ pub mod test {
1974
1975
}
1975
1976
}
1976
1977
}
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
+ }
1977
2056
}
0 commit comments