[prev in list] [next in list] [prev in thread] [next in thread] 

List:       monetdb-checkins
Subject:    monetdb-java: default - Correcting implementation of Statement.s...
From:       Martin_van_Dinther <commits+martin.van.dinther=monetdbsolutions
Date:       2022-06-30 16:40:56
Message-ID: hg.849f99124e32.1656607256.4031123252673426993 () dev ! monetdb ! org
[Download RAW message or body]

Changeset: 849f99124e32 for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/849f99124e32
Modified Files:
	src/main/java/org/monetdb/jdbc/MonetConnection.java
	tests/JDBC_API_Tester.java
Branch: default
Log Message:

Correcting implementation of Statement.setQueryTimeout(int seconds).
According to the webdocumentation the procedures sys.settimeout(query bigint) and \
sys.setquerytimeout(query int) expect a timeout in milliseconds but the JDBC method \
Statement.setQueryTimeout(int) gets a timeout in seconds. See  \
https://www.monetdb.org/documentation-Jan2022/admin-guide/monitoring/session-procedures/
 and  https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#setQueryTimeout-int-
 So we need to multiply the int value by 1000 before calling the procedure.


diffs (91 lines):

diff --git a/src/main/java/org/monetdb/jdbc/MonetConnection.java \
                b/src/main/java/org/monetdb/jdbc/MonetConnection.java
--- a/src/main/java/org/monetdb/jdbc/MonetConnection.java
+++ b/src/main/java/org/monetdb/jdbc/MonetConnection.java
@@ -1730,25 +1730,27 @@ public class MonetConnection
 	 * Utility method to call sys.setquerytimeout(int); procedure on the connected \
                server.
 	 * It is called from: MonetConnection.isValid() and \
                MonetStatement.internalExecute()
 	 */
-	void setQueryTimeout(final int millis) throws SQLException {
-		if (millis < 0)
-			throw new SQLException("query timeout milliseconds is less than zero", "M1M05");
+	void setQueryTimeout(final int seconds) throws SQLException {
+		if (seconds < 0)
+			throw new SQLException("query timeout seconds is less than zero", "M1M05");
 
 		checkNotClosed();
 		Statement st = null;
 		try {
 			final String callstmt;
-			// as of release Jun2020 (11.37.7) the function sys.settimeout(bigint) is \
deprecated and replaced by new sys.setquerytimeout(int) +			final int msecs = \
(seconds <= 2147483) ? seconds * 1000 : seconds;	// prevent overflow of int +
+			// as of release Jun2020 (11.37.7) the function sys.settimeout(msecs bigint) is \
deprecated and replaced by new sys.setquerytimeout(msecs int)  if \
                ((getDatabaseMajorVersion() == 11) && (getDatabaseMinorVersion() < \
                37))
-				callstmt = "CALL sys.\"settimeout\"(" + millis + ")";
+				callstmt = "CALL sys.\"settimeout\"(" + msecs + ")";
 			else
-				callstmt = "CALL sys.\"setquerytimeout\"(" + millis + ")";
+				callstmt = "CALL sys.\"setquerytimeout\"(" + msecs + ")";
 			// for debug: System.out.println("Before: " + callstmt);
 			st = createStatement();
 			st.execute(callstmt);
 			// for debug: System.out.println("After : " + callstmt);
 
-			this.lastSetQueryTimeout = millis;
+			this.lastSetQueryTimeout = seconds;
 		}
 		/* do not catch SQLException here, as we want to know it when it fails */
 		finally {
diff --git a/tests/JDBC_API_Tester.java b/tests/JDBC_API_Tester.java
--- a/tests/JDBC_API_Tester.java
+++ b/tests/JDBC_API_Tester.java
@@ -5129,7 +5129,7 @@ final public class JDBC_API_Tester {
 	private void BugSetQueryTimeout_Bug_3357() {
 		sb.setLength(0);	// clear the output log buffer
 
-		int originalQueryTimeout = 1;
+		int originalQueryTimeout = 0;
 		Statement st = null;
 		try {
 			st = con.createStatement();
@@ -5138,16 +5138,20 @@ final public class JDBC_API_Tester {
 
 			testTimeout_3357(st, 123);
 			testTimeout_3357(st, 123456);
-			testTimeout_3357(st, 2134567890);
+			testTimeout_3357(st, 2147483);
+			testTimeout_3357(st, 2147484);
+			testTimeout_3357(st, Integer.MAX_VALUE);
 			testTimeout_3357(st, 0);
 			testTimeout_3357(st, 10);
+			testTimeout_3357(st, 1);
 			testTimeout_3357(st, -1);	// to generate an SQLException as negative timeouts are \
invalid  } catch (SQLException se) {
-			sb.append("\n SQLException: setQueryTimeout(timeout_value) throws: \
").append(se).append("\n"); +			sb.append("SQLException: \
setQueryTimeout(timeout_value) throws: ").append(se).append("\n");  }
 
 		// restore originalQueryTimeout
 		try {
+			sb.append("Restore original QueryTimeout = \
").append(originalQueryTimeout).append("\n");  testTimeout_3357(st, \
originalQueryTimeout);  } catch (SQLException se) {
 			sb.append("setQueryTimeout(timeout_value) throws: ").append(se).append("\n");
@@ -5158,11 +5162,14 @@ final public class JDBC_API_Tester {
 				"original getQueryTimeout = 0\n" +
 				"setQueryTimeout = 123. getQueryTimeout = 123\n" +
 				"setQueryTimeout = 123456. getQueryTimeout = 123456\n" +
-				"setQueryTimeout = 2134567890. getQueryTimeout = 2134567890\n" +
+				"setQueryTimeout = 2147483. getQueryTimeout = 2147483\n" +
+				"setQueryTimeout = 2147484. getQueryTimeout = 2147484\n" +
+				"setQueryTimeout = 2147483647. getQueryTimeout = 2147483647\n" +
 				"setQueryTimeout = 0. getQueryTimeout = 0\n" +
 				"setQueryTimeout = 10. getQueryTimeout = 10\n" +
-				"setQueryTimeout = -1. \n" +
-				" SQLException: setQueryTimeout(timeout_value) throws: java.sql.SQLException: \
Illegal timeout value: -1\n" + +				"setQueryTimeout = 1. getQueryTimeout = 1\n" +
+				"setQueryTimeout = -1. SQLException: setQueryTimeout(timeout_value) throws: \
java.sql.SQLException: Illegal timeout value: -1\n" + +				"Restore original \
QueryTimeout = 0\n" +  "setQueryTimeout = 0. getQueryTimeout = 0\n");
 	}
 
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-leave@monetdb.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic