[hibernate-commits] Hibernate SVN: r11304 - in branches/Branch_3_2/Hibernate3: src/org/hibernate/id and 6 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Mar 19 18:06:45 EDT 2007


Author: steve.ebersole at jboss.com
Date: 2007-03-19 18:06:45 -0400 (Mon, 19 Mar 2007)
New Revision: 11304

Added:
   branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/TeradataDialect.java
Modified:
   branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/Dialect.java
   branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/SQLServerDialect.java
   branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/SybaseDialect.java
   branches/Branch_3_2/Hibernate3/src/org/hibernate/id/MultipleHiLoPerTableGenerator.java
   branches/Branch_3_2/Hibernate3/src/org/hibernate/id/TableGenerator.java
   branches/Branch_3_2/Hibernate3/src/org/hibernate/id/enhanced/SegmentedTableGenerator.java
   branches/Branch_3_2/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java
   branches/Branch_3_2/Hibernate3/src/org/hibernate/mapping/Column.java
   branches/Branch_3_2/Hibernate3/src/org/hibernate/mapping/Table.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/jpa/lock/JPALockTest.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/jpa/lock/RepeatableReadTest.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/optlock/OptimisticLockTest.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/tm/CMTTest.java
Log:
HHH-2500 : terradata certification

Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/Dialect.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/Dialect.java	2007-03-19 22:06:14 UTC (rev 11303)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/Dialect.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -970,6 +970,32 @@
 	}
 
 
+	// table support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	/**
+	 * Command used to create a table.
+	 *
+	 * @return The command used to create a table.
+	 */
+	public String getCreateTableString() {
+		return "create table";
+	}
+
+	/**
+	 * Slight variation on {@link #getCreateTableString}.  Here, we have the
+	 * command used to create a table when there is no primary key and
+	 * duplicate rows are expected.
+	 * <p/>
+	 * Most databases do not care about the distinction; originally added for
+	 * Teradata support which does care.
+	 *
+	 * @return The command used to create a multiset table.
+	 */
+	public String getCreateMultisetTableString() {
+		return getCreateTableString();
+	}
+
+
 	// temporary table support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 	/**

Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/SQLServerDialect.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/SQLServerDialect.java	2007-03-19 22:06:14 UTC (rev 11303)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/SQLServerDialect.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -127,4 +127,12 @@
 		// note: at least my local SQL Server 2005 Express shows this not working...
 		return false;
 	}
+
+	public boolean doesReadCommittedCauseWritersToBlockReaders() {
+		return false; // here assume SQLServer2005 using snapshot isolation, which does not have this problem
+	}
+
+	public boolean doesRepeatableReadCauseReadersToBlockWriters() {
+		return false; // here assume SQLServer2005 using snapshot isolation, which does not have this problem
+	}
 }

Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/SybaseDialect.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/SybaseDialect.java	2007-03-19 22:06:14 UTC (rev 11303)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/SybaseDialect.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -227,4 +227,12 @@
 	public boolean supportsExistsInSelect() {
 		return false;
 	}
+
+	public boolean doesReadCommittedCauseWritersToBlockReaders() {
+		return true;
+	}
+
+	public boolean doesRepeatableReadCauseReadersToBlockWriters() {
+		return true;
+	}
 }

Added: branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/TeradataDialect.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/TeradataDialect.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/TeradataDialect.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -0,0 +1,237 @@
+package org.hibernate.dialect;
+
+import java.sql.Types;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.cfg.Environment;
+import org.hibernate.dialect.function.SQLFunctionTemplate;
+import org.hibernate.dialect.function.VarArgsSQLFunction;
+
+/**
+ * A dialect for the Teradata database created by MCR as part of the
+ * dialect certification process.
+ *
+ * @author Jay Nance
+ */
+public class TeradataDialect extends Dialect {
+
+	/**
+	 * Constructor
+	 */
+	public TeradataDialect() {
+		super();
+		//registerColumnType data types
+		registerColumnType( Types.NUMERIC, "NUMERIC($p,$s)" );
+		registerColumnType( Types.DOUBLE, "DOUBLE PRECISION" );
+		registerColumnType( Types.BIGINT, "NUMERIC(18,0)" );
+		registerColumnType( Types.BIT, "BYTEINT" );
+		registerColumnType( Types.TINYINT, "BYTEINT" );
+		registerColumnType( Types.VARBINARY, "VARBYTE($l)" );
+		registerColumnType( Types.BINARY, "BYTEINT" );
+		registerColumnType( Types.LONGVARCHAR, "LONG VARCHAR" );
+		registerColumnType( Types.CHAR, "CHAR(1)" );
+		registerColumnType( Types.DECIMAL, "DECIMAL" );
+		registerColumnType( Types.INTEGER, "INTEGER" );
+		registerColumnType( Types.SMALLINT, "SMALLINT" );
+		registerColumnType( Types.FLOAT, "FLOAT" );
+		registerColumnType( Types.VARCHAR, "VARCHAR($l)" );
+		registerColumnType( Types.DATE, "DATE" );
+		registerColumnType( Types.TIME, "TIME" );
+		registerColumnType( Types.TIMESTAMP, "TIMESTAMP" );
+		registerColumnType( Types.BOOLEAN, "BYTEINT" );  // hibernate seems to ignore this type...
+		registerColumnType( Types.BLOB, "BLOB" );
+		registerColumnType( Types.CLOB, "CLOB" );
+
+		registerFunction( "year", new SQLFunctionTemplate( Hibernate.INTEGER, "extract(year from ?1)" ) );
+		registerFunction( "length", new SQLFunctionTemplate( Hibernate.INTEGER, "character_length(?1)" ) );
+		registerFunction( "concat", new VarArgsSQLFunction( Hibernate.STRING, "(", "||", ")" ) );
+		registerFunction( "substring", new SQLFunctionTemplate( Hibernate.STRING, "substring(?1 from ?2 for ?3)" ) );
+		registerFunction( "locate", new SQLFunctionTemplate( Hibernate.STRING, "position(?1 in ?2)" ) );
+		registerFunction( "mod", new SQLFunctionTemplate( Hibernate.STRING, "?1 mod ?2" ) );
+		registerFunction( "str", new SQLFunctionTemplate( Hibernate.STRING, "cast(?1 as varchar(255))" ) );
+
+		// bit_length feels a bit broken to me. We have to cast to char in order to
+		// pass when a numeric value is supplied. But of course the answers given will
+		// be wildly different for these two datatypes. 1234.5678 will be 9 bytes as
+		// a char string but will be 8 or 16 bytes as a true numeric.
+		// Jay Nance 2006-09-22
+		registerFunction(
+				"bit_length", new SQLFunctionTemplate( Hibernate.INTEGER, "octet_length(cast(?1 as char))*4" )
+		);
+
+		// The preference here would be
+		//   SQLFunctionTemplate( Hibernate.TIMESTAMP, "current_timestamp(?1)", false)
+		// but this appears not to work.
+		// Jay Nance 2006-09-22
+		registerFunction( "current_timestamp", new SQLFunctionTemplate( Hibernate.TIMESTAMP, "current_timestamp" ) );
+		registerFunction( "current_time", new SQLFunctionTemplate( Hibernate.TIMESTAMP, "current_time" ) );
+		registerFunction( "current_date", new SQLFunctionTemplate( Hibernate.TIMESTAMP, "current_date" ) );
+		// IBID for current_time and current_date
+
+		registerKeyword( "password" );
+		registerKeyword( "type" );
+		registerKeyword( "title" );
+		registerKeyword( "year" );
+		registerKeyword( "month" );
+		registerKeyword( "summary" );
+		registerKeyword( "alias" );
+		registerKeyword( "value" );
+		registerKeyword( "first" );
+		registerKeyword( "role" );
+		registerKeyword( "account" );
+		registerKeyword( "class" );
+
+		// Tell hibernate to use getBytes instead of getBinaryStream
+		getDefaultProperties().setProperty( Environment.USE_STREAMS_FOR_BINARY, "false" );
+		// No batch statements
+		getDefaultProperties().setProperty( Environment.STATEMENT_BATCH_SIZE, NO_BATCH );
+	}
+
+	/**
+	 * Does this dialect support the <tt>FOR UPDATE</tt> syntax?
+	 *
+	 * @return empty string ... Teradata does not support <tt>FOR UPDATE<tt> syntax
+	 */
+	public String getForUpdateString() {
+		return "";
+	}
+
+	public boolean supportsIdentityColumns() {
+		return false;
+	}
+
+	public boolean supportsSequences() {
+		return false;
+	}
+
+	public String getAddColumnString() {
+		return "Add Column";
+	}
+
+	public boolean supportsTemporaryTables() {
+		return true;
+	}
+
+	public String getCreateTemporaryTableString() {
+		return "create global temporary table";
+	}
+
+	public String getCreateTemporaryTablePostfix() {
+		return " on commit preserve rows";
+	}
+
+	public Boolean performTemporaryTableDDLInIsolation() {
+		return Boolean.TRUE;
+	}
+
+	public boolean dropTemporaryTableAfterUse() {
+		return false;
+	}
+
+	/**
+	 * Get the name of the database type associated with the given
+	 * <tt>java.sql.Types</tt> typecode.
+	 *
+	 * @param code <tt>java.sql.Types</tt> typecode
+	 * @param length the length or precision of the column
+	 * @param precision the precision of the column
+	 * @param scale the scale of the column
+	 *
+	 * @return the database type name
+	 *
+	 * @throws HibernateException
+	 */
+	public String getTypeName(int code, int length, int precision, int scale) throws HibernateException {
+		/*
+		 * We might want a special case for 19,2. This is very common for money types
+		 * and here it is converted to 18,1
+		 */
+		float f = precision > 0 ? ( float ) scale / ( float ) precision : 0;
+		int p = ( precision > 18 ? 18 : precision );
+		int s = ( precision > 18 ? ( int ) ( 18.0 * f ) : ( scale > 18 ? 18 : scale ) );
+
+		return super.getTypeName( code, length, p, s );
+	}
+
+	public boolean supportsCascadeDelete() {
+		return false;
+	}
+
+	public boolean supportsCircularCascadeDeleteConstraints() {
+		return false;
+	}
+
+	public boolean areStringComparisonsCaseInsensitive() {
+		return true;
+	}
+
+	public boolean supportsEmptyInList() {
+		return false;
+	}
+
+	public String getSelectClauseNullString(int sqlType) {
+		String v = "null";
+
+		switch ( sqlType ) {
+			case Types.BIT:
+			case Types.TINYINT:
+			case Types.SMALLINT:
+			case Types.INTEGER:
+			case Types.BIGINT:
+			case Types.FLOAT:
+			case Types.REAL:
+			case Types.DOUBLE:
+			case Types.NUMERIC:
+			case Types.DECIMAL:
+				v = "cast(null as decimal)";
+				break;
+			case Types.CHAR:
+			case Types.VARCHAR:
+			case Types.LONGVARCHAR:
+				v = "cast(null as varchar(255))";
+				break;
+			case Types.DATE:
+			case Types.TIME:
+			case Types.TIMESTAMP:
+				v = "cast(null as timestamp)";
+				break;
+			case Types.BINARY:
+			case Types.VARBINARY:
+			case Types.LONGVARBINARY:
+			case Types.NULL:
+			case Types.OTHER:
+			case Types.JAVA_OBJECT:
+			case Types.DISTINCT:
+			case Types.STRUCT:
+			case Types.ARRAY:
+			case Types.BLOB:
+			case Types.CLOB:
+			case Types.REF:
+			case Types.DATALINK:
+			case Types.BOOLEAN:
+				break;
+		}
+		return v;
+	}
+
+	public String getCreateMultisetTableString() {
+		return "create multiset table ";
+	}
+
+	public boolean supportsLobValueChangePropogation() {
+		return false;
+	}
+
+	public boolean doesReadCommittedCauseWritersToBlockReaders() {
+		return true;
+	}
+
+	public boolean doesRepeatableReadCauseReadersToBlockWriters() {
+		return true;
+	}
+
+	public boolean supportsBindAsCallableArgument() {
+		return false;
+	}
+}
\ No newline at end of file

Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/id/MultipleHiLoPerTableGenerator.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/id/MultipleHiLoPerTableGenerator.java	2007-03-19 22:06:14 UTC (rev 11303)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/id/MultipleHiLoPerTableGenerator.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -89,28 +89,30 @@
 	public String[] sqlCreateStrings(Dialect dialect) throws HibernateException {
 		return new String[] {
 			new StringBuffer()
-				.append("create table ")
-				.append(tableName)
-				.append(" ( ")
-				.append(pkColumnName)
-				.append(" ")
-				.append( dialect.getTypeName(Types.VARCHAR, keySize, 0, 0) )
-				.append(",  ")
-				.append(valueColumnName)
-				.append(" ")
-				.append( dialect.getTypeName(Types.INTEGER) )
-				.append(" ) ")
+				.append( dialect.getCreateTableString() )
+				.append( tableName )
+				.append( " ( " )
+				.append( pkColumnName )
+				.append( ' ' )
+				.append( dialect.getTypeName( Types.VARCHAR, keySize, 0, 0 ) )
+				.append( ",  " )
+				.append( valueColumnName )
+				.append( ' ' )
+				.append( dialect.getTypeName( Types.INTEGER ) )
+				.append( " ) " )
 				.toString()
 		};
 	}
 
 	public String[] sqlDropStrings(Dialect dialect) throws HibernateException {
-		StringBuffer sqlDropString = new StringBuffer()
-			.append("drop table ");
-		if ( dialect.supportsIfExistsBeforeTableName() ) sqlDropString.append("if exists ");
-		sqlDropString.append(tableName)
-			.append( dialect.getCascadeConstraintsString() );
-		if ( dialect.supportsIfExistsAfterTableName() ) sqlDropString.append(" if exists");
+		StringBuffer sqlDropString = new StringBuffer( "drop table " );
+		if ( dialect.supportsIfExistsBeforeTableName() ) {
+			sqlDropString.append( "if exists " );
+		}
+		sqlDropString.append( tableName ).append( dialect.getCascadeConstraintsString() );
+		if ( dialect.supportsIfExistsAfterTableName() ) {
+			sqlDropString.append( " if exists" );
+		}
 		return new String[] { sqlDropString.toString() };
 	}
 

Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/id/TableGenerator.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/id/TableGenerator.java	2007-03-19 22:06:14 UTC (rev 11303)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/id/TableGenerator.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -96,21 +96,22 @@
 	}
 
 
-	public String[] sqlCreateStrings(Dialect dialect) throws HibernateException {
+	public String[] sqlCreateStrings(Dialect dialect) {
 		return new String[] {
-			"create table " + tableName + " ( " + columnName + " " + dialect.getTypeName(Types.INTEGER) + " )",
+			dialect.getCreateTableString() + " " + tableName + " ( " + columnName + " " + dialect.getTypeName(Types.INTEGER) + " )",
 			"insert into " + tableName + " values ( 0 )"
 		};
 	}
 
 	public String[] sqlDropStrings(Dialect dialect) {
-		//return "drop table " + tableName + dialect.getCascadeConstraintsString();
-		StringBuffer sqlDropString = new StringBuffer()
-			.append("drop table ");
-		if ( dialect.supportsIfExistsBeforeTableName() ) sqlDropString.append("if exists ");
-		sqlDropString.append(tableName)
-			.append( dialect.getCascadeConstraintsString() );
-		if ( dialect.supportsIfExistsAfterTableName() ) sqlDropString.append(" if exists");
+		StringBuffer sqlDropString = new StringBuffer( "drop table " );
+		if ( dialect.supportsIfExistsBeforeTableName() ) {
+			sqlDropString.append( "if exists " );
+		}
+		sqlDropString.append( tableName ).append( dialect.getCascadeConstraintsString() );
+		if ( dialect.supportsIfExistsAfterTableName() ) {
+			sqlDropString.append( " if exists" );
+		}
 		return new String[] { sqlDropString.toString() };
 	}
 

Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/id/enhanced/SegmentedTableGenerator.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/id/enhanced/SegmentedTableGenerator.java	2007-03-19 22:06:14 UTC (rev 11303)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/id/enhanced/SegmentedTableGenerator.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -271,15 +271,15 @@
 	public String[] sqlCreateStrings(Dialect dialect) throws HibernateException {
 		return new String[] {
 				new StringBuffer()
-						.append( "create table " )
+						.append( dialect.getCreateTableString() )
 						.append( tableName )
 						.append( " ( " )
 						.append( segmentColumnName )
-						.append( " " )
+						.append( ' ' )
 						.append( dialect.getTypeName( Types.VARCHAR, segmentValueLength, 0, 0 ) )
 						.append( ",  " )
 						.append( valueColumnName )
-						.append( " " )
+						.append( ' ' )
 						.append( dialect.getTypeName( Types.BIGINT ) )
 						.append( " ) " )
 						.toString()

Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java	2007-03-19 22:06:14 UTC (rev 11303)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -186,7 +186,9 @@
 	 * @throws SQLException Can be thrown by the Connection.isAutoCommit() check.
 	 */
 	public boolean isAutoCommit() throws SQLException {
-		return connection == null || connection.getAutoCommit();
+		return connection == null 
+			|| connection.isClosed()
+			|| connection.getAutoCommit();
 	}
 
 	/**

Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/mapping/Column.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/mapping/Column.java	2007-03-19 22:06:14 UTC (rev 11303)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/mapping/Column.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -65,6 +65,10 @@
 			quoted=true;
 			this.name=name.substring( 1, name.length()-1 );
 		}
+		else if(Dialect.getDialect().getKeywords().contains(name)) {
+			quoted=true;
+			this.name = name;
+		}
 		else {
 			this.name = name;
 		}

Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/mapping/Table.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/mapping/Table.java	2007-03-19 22:06:14 UTC (rev 11303)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/mapping/Table.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -360,9 +360,8 @@
 		return buffer.toString();
 	}
 
-	public String sqlCreateString(Dialect dialect, Mapping p, String defaultCatalog, String defaultSchema)
-			throws HibernateException {
-		StringBuffer buf = new StringBuffer( "create table " )
+	public String sqlCreateString(Dialect dialect, Mapping p, String defaultCatalog, String defaultSchema) {
+		StringBuffer buf = new StringBuffer( hasPrimaryKey() ? dialect.getCreateTableString() : dialect.getCreateMultisetTableString() )
 				.append( getQualifiedName( dialect, defaultCatalog, defaultSchema ) )
 				.append( " (" );
 

Modified: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/jpa/lock/JPALockTest.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/jpa/lock/JPALockTest.java	2007-03-19 22:06:14 UTC (rev 11303)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/jpa/lock/JPALockTest.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -56,6 +56,10 @@
 		if ( ! readCommittedIsolationMaintained( "ejb3 lock tests" ) ) {
 			return;
 		}
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders() ) {
+			reportSkip( "write locks block readers", "jpa read locking" );
+			return;
+		}
 
 		final String initialName = "lock test";
 		// set up some test data
@@ -123,6 +127,11 @@
 		if ( ! readCommittedIsolationMaintained( "ejb3 lock tests" ) ) {
 			return;
 		}
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders() ) {
+			reportSkip( "write locks block readers", "jpa read locking" );
+			return;
+		}
+
 		final String initialName = "lock test";
 		// set up some test data
 		Session s1 = getSessions().openSession();

Modified: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/jpa/lock/RepeatableReadTest.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/jpa/lock/RepeatableReadTest.java	2007-03-19 22:06:14 UTC (rev 11303)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/jpa/lock/RepeatableReadTest.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -35,6 +35,10 @@
 	// versioned entity tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 	public void testStaleVersionedInstanceFoundInQueryResult() {
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders()) {
+			reportSkip( "write locks block readers", "stale versioned instance" );
+			return;
+		}
 		String check = "EJB3 Specification";
 		Session s1 = getSessions().openSession();
 		Transaction t1 = s1.beginTransaction();
@@ -83,6 +87,10 @@
 		if ( ! readCommittedIsolationMaintained( "repeatable read tests" ) ) {
 			return;
 		}
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders()) {
+			reportSkip( "lock blocking", "stale versioned instance" );
+			return;
+		}
 		String check = "EJB3 Specification";
 		Session s1 = getSessions().openSession();
 		Transaction t1 = s1.beginTransaction();
@@ -153,6 +161,10 @@
 	// non-versioned entity tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 	public void testStaleNonVersionedInstanceFoundInQueryResult() {
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders()) {
+			reportSkip( "lock blocking", "stale versioned instance" );
+			return;
+		}
 		String check = "Lock Modes";
 		Session s1 = getSessions().openSession();
 		Transaction t1 = s1.beginTransaction();
@@ -200,6 +212,10 @@
 		if ( ! readCommittedIsolationMaintained( "repeatable read tests" ) ) {
 			return;
 		}
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders()) {
+			reportSkip( "lock blocking", "stale versioned instance" );
+			return;
+		}
 		String check = "Lock Modes";
 		Session s1 = getSessions().openSession();
 		Transaction t1 = s1.beginTransaction();

Modified: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/optlock/OptimisticLockTest.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/optlock/OptimisticLockTest.java	2007-03-19 22:06:14 UTC (rev 11303)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/optlock/OptimisticLockTest.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -48,6 +48,10 @@
 	}
 
 	private void testUpdateOptimisticLockFailure(String entityName) {
+		if ( getDialect().doesRepeatableReadCauseReadersToBlockWriters() ) {
+			reportSkip( "read locks block writers", "update optimistic locking" );
+			return;
+		}
 		Session mainSession = openSession();
 		mainSession.beginTransaction();
 		Document doc = new Document();
@@ -107,6 +111,10 @@
 	}
 
 	private void testDeleteOptimisticLockFailure(String entityName) {
+		if ( getDialect().doesRepeatableReadCauseReadersToBlockWriters() ) {
+			reportSkip( "read locks block writers", "update optimistic locking" );
+			return;
+		}
 		Session mainSession = openSession();
 		mainSession.beginTransaction();
 		Document doc = new Document();

Modified: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/tm/CMTTest.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/tm/CMTTest.java	2007-03-19 22:06:14 UTC (rev 11303)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/tm/CMTTest.java	2007-03-19 22:06:45 UTC (rev 11304)
@@ -210,9 +210,8 @@
 	}
 
 	public void testConcurrentCachedDirtyQueries() throws Exception {
-		if ( getDialect() instanceof SybaseDialect ) {
-			// sybase and sqlserver have serious locking issues here...
-			reportSkip( "dead-lock bug", "concurrent queries" );
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders() ) {
+			reportSkip( "write locks block readers", "concurrent queries" );
 			return;
 		}
 




More information about the hibernate-commits mailing list