changeset 343:48ee2ca98975

Added test and fix for bug 6782, ie set the connection's query timeout explicitly at the end of isValid method. The previous value must be set whenever the an exception is thrown or not during the method.
author Pedro Ferreira <pedro.ferreira@monetdbsolutions.com>
date Tue, 05 Nov 2019 14:50:16 +0100 (2019-11-05)
parents 83c93be405b6
children 8985d2409c10
files src/main/java/nl/cwi/monetdb/jdbc/MonetConnection.java tests/Bug_IsValid_Timeout_Bug_6782.java tests/build.xml
diffstat 3 files changed, 65 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/nl/cwi/monetdb/jdbc/MonetConnection.java
+++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetConnection.java
@@ -1297,10 +1297,11 @@ public class MonetConnection
 		Statement stmt = null;
 		ResultSet rs = null;
 		boolean isValid = false;
+		int original_timeout = 0;
 		try {
 			stmt = createStatement();
 			if (stmt != null) {
-				final int original_timeout = stmt.getQueryTimeout();
+				original_timeout = stmt.getQueryTimeout();
 				if (timeout > 0 && original_timeout != timeout) {
 					// we need to change the requested timeout for this test query
 					stmt.setQueryTimeout(timeout);
@@ -1309,10 +1310,6 @@ public class MonetConnection
 				if (rs != null && rs.next()) {
 					isValid = true;
 				}
-				if (timeout > 0 && original_timeout != timeout) {
-					// restore the original server timeout value
-					stmt.setQueryTimeout(original_timeout);
-				}
 			}
 		} catch (SQLException se) {
 			String msg = se.getMessage();
@@ -1325,6 +1322,24 @@ public class MonetConnection
 			}
 			/* ignore stmt errors/exceptions, we are only testing if the connection is still alive and usable */
 		} finally {
+			/* restore the original server timeout value, whenever an Exception has occurred or not */
+			if (timeout > 0 && original_timeout != timeout) {
+				Statement stmt2 = null;
+				this.lastSetQueryTimeout = original_timeout;
+				try {
+					/* we have to set in the server explicitly, because the test 'queryTimeout != connection.lastSetQueryTimeout' 
+					   on 'internalExecute' won't pass and the server won't be set back */
+					stmt2 = this.createStatement();
+					stmt2.execute("CALL \"sys\".\"settimeout\"(" + this.lastSetQueryTimeout + ")");
+				} catch (SQLException se) {
+					String msg = se.getMessage();
+					if (msg != null && msg.equalsIgnoreCase("Current transaction is aborted (please ROLLBACK)")) {
+						isValid = true;
+					}
+				} finally {
+					closeResultsetStatement(null, stmt2);
+				}
+			}
 			closeResultsetStatement(rs, stmt);
 		}
 		return isValid;
new file mode 100644
--- /dev/null
+++ b/tests/Bug_IsValid_Timeout_Bug_6782.java
@@ -0,0 +1,38 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0.  If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V.
+ */
+
+import java.sql.*;
+
+public class Bug_IsValid_Timeout_Bug_6782 {
+	public static void main(String[] args) throws Exception {
+		// Class.forName("nl.cwi.monetdb.jdbc.MonetDriver");	// not needed anymore for self registering JDBC drivers
+		Connection con = DriverManager.getConnection(args[0]);
+		Statement st = null;
+
+		st = con.createStatement();
+		st.setQueryTimeout(5);
+		System.out.println("getQueryTimeout must give 5: " + st.getQueryTimeout());
+		st.close();
+
+		con.isValid(3);
+
+		st = con.createStatement();
+		System.out.println("getQueryTimeout must give 0: " + st.getQueryTimeout());
+
+		con.isValid(3);
+		System.out.println("getQueryTimeout must give 0: " + st.getQueryTimeout());
+		st.close();
+
+		st.setQueryTimeout(5);
+		con.isValid(3);
+		System.out.println("getQueryTimeout must give 5: " + st.getQueryTimeout());
+		st.close();
+
+		con.close();
+	}
+}
--- a/tests/build.xml
+++ b/tests/build.xml
@@ -144,6 +144,7 @@ Copyright 1997 - July 2008 CWI, August 2
     <antcall target="Bug_Connect_as_voc_getMetaData_Failure_Bug_6388" />
     <antcall target="Bug_PrepStmtSetString_6382" />
     <antcall target="Bug_LargeQueries_6571_6693" />
+    <antcall target="Bug_IsValid_Timeout_Bug_6782" />
   </target>
 
   <target name="test_class" depends="compile,jdbc">
@@ -429,4 +430,10 @@ Copyright 1997 - July 2008 CWI, August 2
     </antcall>
   </target>
 
+  <target name="Bug_IsValid_Timeout_Bug_6782">
+    <antcall target="test_class">
+      <param name="test.class" value="Bug_IsValid_Timeout_Bug_6782" />
+    </antcall>
+  </target>
+
 </project>