aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java60
-rw-r--r--src/interfaces/jdbc/org/postgresql/test/jdbc2/ConnectionTest.java24
2 files changed, 72 insertions, 12 deletions
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java
index 463cfb2cca2..dbf785709b1 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java
@@ -14,7 +14,7 @@ import org.postgresql.largeobject.LargeObjectManager;
import org.postgresql.util.*;
-/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/Attic/AbstractJdbc1Connection.java,v 1.10 2002/10/01 00:39:01 davec Exp $
+/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/Attic/AbstractJdbc1Connection.java,v 1.11 2002/10/17 05:33:52 barry Exp $
* This class defines methods of the jdbc1 specification. This class is
* extended by org.postgresql.jdbc2.AbstractJdbc2Connection which adds the jdbc2
* methods. The real Connection class (for jdbc1) is org.postgresql.jdbc1.Jdbc1Connection
@@ -362,6 +362,29 @@ public abstract class AbstractJdbc1Connection implements org.postgresql.PGConnec
String dbEncoding = resultSet.getString(2);
encoding = Encoding.getEncoding(dbEncoding, info.getProperty("charSet"));
+ //In 7.3 we are forced to do a second roundtrip to handle the case
+ //where a database may not be running in autocommit mode
+ //jdbc by default assumes autocommit is on until setAutoCommit(false)
+ //is called. Therefore we need to ensure a new connection is
+ //initialized to autocommit on.
+ if (haveMinimumServerVersion("7.3"))
+ {
+ java.sql.ResultSet acRset =
+ ExecSQL("show autocommit");
+
+ if (!acRset.next())
+ {
+ throw new PSQLException("postgresql.con.failed", "failed getting autocommit status");
+ }
+ //if autocommit is currently off we need to turn it on
+ //note that we will be in a transaction because the select above
+ //will have initiated the transaction so we need a commit
+ //to make the setting permanent
+ if (acRset.getString(1).equals("off"))
+ {
+ ExecSQL("set autocommit = on; commit;");
+ }
+ }
// Initialise object handling
initObjectTypes();
@@ -896,10 +919,26 @@ public abstract class AbstractJdbc1Connection implements org.postgresql.PGConnec
if (this.autoCommit == autoCommit)
return ;
if (autoCommit)
- ExecSQL("end");
+ {
+ if (haveMinimumServerVersion("7.3"))
+ {
+ //We do the select to ensure a transaction is in process
+ //before we do the commit to avoid warning messages
+ //from issuing a commit without a transaction in process
+ ExecSQL("select 1; commit; set autocommit = on;");
+ }
+ else
+ {
+ ExecSQL("end");
+ }
+ }
else
{
- if (haveMinimumServerVersion("7.1"))
+ if (haveMinimumServerVersion("7.3"))
+ {
+ ExecSQL("set autocommit = off; " + getIsolationLevelSQL());
+ }
+ else if (haveMinimumServerVersion("7.1"))
{
ExecSQL("begin;" + getIsolationLevelSQL());
}
@@ -938,7 +977,11 @@ public abstract class AbstractJdbc1Connection implements org.postgresql.PGConnec
{
if (autoCommit)
return ;
- if (haveMinimumServerVersion("7.1"))
+ if (haveMinimumServerVersion("7.3"))
+ {
+ ExecSQL("commit; " + getIsolationLevelSQL());
+ }
+ else if (haveMinimumServerVersion("7.1"))
{
ExecSQL("commit;begin;" + getIsolationLevelSQL());
}
@@ -962,7 +1005,14 @@ public abstract class AbstractJdbc1Connection implements org.postgresql.PGConnec
{
if (autoCommit)
return ;
- if (haveMinimumServerVersion("7.1"))
+ if (haveMinimumServerVersion("7.3"))
+ {
+ //we don't automatically start a transaction
+ //but let the server functionality automatically start
+ //one when the first statement is executed
+ ExecSQL("rollback; " + getIsolationLevelSQL());
+ }
+ else if (haveMinimumServerVersion("7.1"))
{
ExecSQL("rollback; begin;" + getIsolationLevelSQL());
}
diff --git a/src/interfaces/jdbc/org/postgresql/test/jdbc2/ConnectionTest.java b/src/interfaces/jdbc/org/postgresql/test/jdbc2/ConnectionTest.java
index e2f70f1b642..1d79463eb16 100644
--- a/src/interfaces/jdbc/org/postgresql/test/jdbc2/ConnectionTest.java
+++ b/src/interfaces/jdbc/org/postgresql/test/jdbc2/ConnectionTest.java
@@ -10,7 +10,7 @@ import java.sql.*;
*
* PS: Do you know how difficult it is to type on a train? ;-)
*
- * $Id: ConnectionTest.java,v 1.9 2002/08/14 20:35:40 barry Exp $
+ * $Id: ConnectionTest.java,v 1.10 2002/10/17 05:33:52 barry Exp $
*/
public class ConnectionTest extends TestCase
@@ -244,18 +244,28 @@ public class ConnectionTest extends TestCase
assertEquals(Connection.TRANSACTION_READ_COMMITTED,
con.getTransactionIsolation());
+
+ // Note the behavior on when a transaction starts is different
+ // under 7.3 than previous versions. In 7.3 a transaction
+ // starts with the first sql command, whereas previously
+ // you were always in a transaction in autocommit=false
+ // so we issue a select to ensure we are in a transaction
+ Statement stmt = con.createStatement();
+ stmt.executeQuery("select 1");
+
// Now change the default for future transactions
con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
// Since the call to setTransactionIsolation() above was made
- // inside the transaction, the isolation level of the current
- // transaction did not change. It affects only future transactions.
- // This behaviour is recommended by the JDBC spec.
- assertEquals(Connection.TRANSACTION_READ_COMMITTED,
+ // inside the transaction, the isolation level of the current
+ // transaction did not change. It affects only future ones.
+ // This behaviour is recommended by the JDBC spec.
+ assertEquals(Connection.TRANSACTION_READ_COMMITTED,
con.getTransactionIsolation());
- // Begin a new transaction
- con.commit();
+ // Begin a new transaction
+ con.commit();
+ stmt.executeQuery("select 1");
// Now we should see the new isolation level
assertEquals(Connection.TRANSACTION_SERIALIZABLE,