@@ -1978,7 +1978,21 @@ defmodule QueryTest do
19781978 assert { :ok , _ } = P . prepare ( pid , "42" , "SELECT 42" )
19791979 end
19801980
1981- test "disconnect_and_retry with transaction" do
1981+ test "disconnect_and_retry with prepare in transaction" do
1982+ # Start new connection so we can retry on disconnect
1983+ opts = [ database: "postgrex_test" , backoff_min: 1 , backoff_max: 1 ]
1984+ { :ok , pid } = P . start_link ( opts )
1985+
1986+ # Dropping socket in middle of transaction should return error
1987+ fun = fn conn ->
1988+ disconnect ( conn )
1989+ P . prepare ( conn , "42" , "SELECT 42" )
1990+ end
1991+
1992+ assert { :error , :rollback } = P . transaction ( pid , fun )
1993+ end
1994+
1995+ test "disconnect_and_retry with begin transaction" do
19821996 # Start new connection so we can retry on disconnect
19831997 opts = [ database: "postgrex_test" , backoff_min: 1 , backoff_max: 1 ]
19841998 { :ok , pid } = P . start_link ( opts )
@@ -2005,7 +2019,24 @@ defmodule QueryTest do
20052019 assert :ok = P . close ( pid , query )
20062020 end
20072021
2008- test "disconnect_and_retry on attempting execution of prepared statement" do
2022+ test "disconnect_and_retry with closing prepared statement in transaction" do
2023+ # Start new connection so we can retry on disconnect
2024+ opts = [ database: "postgrex_test" , backoff_min: 1 , backoff_max: 1 ]
2025+ { :ok , pid } = P . start_link ( opts )
2026+
2027+ # Prepare query that we wil try to close after disconnecting
2028+ { :ok , query } = P . prepare ( pid , "42" , "SELECT 42" )
2029+
2030+ # Dropping socket in middle of transaction should return error
2031+ fun = fn conn ->
2032+ disconnect ( conn )
2033+ P . close ( conn , query )
2034+ end
2035+
2036+ assert { :error , :rollback } = P . transaction ( pid , fun )
2037+ end
2038+
2039+ test "disconnect_and_retry with binding prepared statement" do
20092040 # Start new connection so we can retry on disconnect
20102041 opts = [ database: "postgrex_test" , backoff_min: 1 , backoff_max: 1 ]
20112042 { :ok , pid } = P . start_link ( opts )
@@ -2020,6 +2051,28 @@ defmodule QueryTest do
20202051 assert { :ok , _ , _ } = P . execute ( pid , query , [ ] )
20212052 end
20222053
2054+ test "disconnect_and_retry with binding prepared statement in transaction" do
2055+ # Start new connection so we can retry on disconnect
2056+ opts = [ database: "postgrex_test" , backoff_min: 1 , backoff_max: 1 ]
2057+ { :ok , pid } = P . start_link ( opts )
2058+
2059+ # Prepare query that we wil try to execute after disconnecting
2060+ { :ok , query } = P . prepare ( pid , "42" , "SELECT 42" )
2061+
2062+ # Dropping socket in middle of transaction should return error
2063+ fun = fn conn ->
2064+ disconnect ( conn )
2065+ P . execute ( conn , query , [ ] )
2066+ end
2067+
2068+ assert { :error , :rollback } = P . transaction ( pid , fun )
2069+ end
2070+
2071+ defp disconnect ( % DBConnection { } = conn ) do
2072+ sock = get_socket ( conn )
2073+ :gen_tcp . shutdown ( sock , :read_write )
2074+ end
2075+
20232076 defp disconnect ( pid ) do
20242077 sock = DBConnection . run ( pid , & get_socket / 1 )
20252078 :gen_tcp . shutdown ( sock , :read_write )
0 commit comments