[hibernate-commits] Hibernate SVN: r21068 - in core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821: core/src/main/java/org/hibernate/hql/ast/tree and 2 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Sep 7 11:34:29 EDT 2012


Author: ShaunA
Date: 2012-09-07 11:34:29 -0400 (Fri, 07 Sep 2012)
New Revision: 21068

Modified:
   core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821/
   core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821/core/src/main/java/org/hibernate/hql/ast/tree/FromElementType.java
   core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821/testsuite/src/test/java/org/hibernate/test/hqlfetchscroll/HQLScrollFetchTest.java
   core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821/testsuite/src/test/java/org/hibernate/test/joinedsubclass/JoinedSubclassTest.java
Log:
JBPAPP-9821: Backport fix for HHH-1657 hql update generate wrong sql with joined subclass hierarchy to EAP 5.1.2


Property changes on: core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821
___________________________________________________________________
Added: svn:mergeinfo
   + /core/branches/Branch_3_3_2_GA_CP:21037-21038

Modified: core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821/core/src/main/java/org/hibernate/hql/ast/tree/FromElementType.java
===================================================================
--- core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821/core/src/main/java/org/hibernate/hql/ast/tree/FromElementType.java	2012-09-05 12:19:48 UTC (rev 21067)
+++ core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821/core/src/main/java/org/hibernate/hql/ast/tree/FromElementType.java	2012-09-07 15:34:29 UTC (rev 21068)
@@ -335,13 +335,13 @@
 			if ( forceAlias ) {
 				return propertyMapping.toColumns( tableAlias, path );
 			}
-			else if ( fromElement.getWalker().getStatementType() == HqlSqlTokenTypes.SELECT ) {
+			if ( fromElement.getWalker().getStatementType() == HqlSqlTokenTypes.SELECT ) {
 				return propertyMapping.toColumns( tableAlias, path );
 			}
-			else if ( fromElement.getWalker().getCurrentClauseType() == HqlSqlTokenTypes.SELECT ) {
+			if ( fromElement.getWalker().getCurrentClauseType() == HqlSqlTokenTypes.SELECT ) {
 				return propertyMapping.toColumns( tableAlias, path );
 			}
-			else if ( fromElement.getWalker().isSubQuery() ) {
+			if ( fromElement.getWalker().isSubQuery() ) {
 				// for a subquery, the alias to use depends on a few things (we
 				// already know this is not an overall SELECT):
 				//      1) if this FROM_ELEMENT represents a correlation to the
@@ -367,14 +367,29 @@
 					return propertyMapping.toColumns( tableAlias, path );
 				}
 			}
-			else {
-				String[] columns = propertyMapping.toColumns( path );
-				log.trace( "Using non-qualified column reference [" + path + " -> (" + ArrayHelper.toString( columns ) + ")]" );
-				return columns;
+			if ( isManipulationQuery() && isMultiTable() && inWhereClause() ) {
+				// the actual where-clause will end up being ripped out the update/delete and used in
+				// a select to populate the temp table, so its ok to use the table alias to qualify the table refs
+				// and safer to do so to protect from same-named columns
+				return propertyMapping.toColumns( tableAlias, path );
+
 			}
+			String[] columns = propertyMapping.toColumns( path );
+			log.trace( String.format( "Using non-qualified column reference [%s -> (%s)]", path, ArrayHelper.toString( columns ) ) );
+			return columns;
+
 		}
 	}
 
+	private boolean isManipulationQuery() {
+		return fromElement.getWalker().getStatementType() == HqlSqlTokenTypes.UPDATE
+				|| fromElement.getWalker().getStatementType() == HqlSqlTokenTypes.DELETE;
+	}
+
+	private boolean inWhereClause() {
+		return fromElement.getWalker().getCurrentTopLevelClauseType() == HqlSqlTokenTypes.WHERE;
+	}
+
 	private boolean isCorrelation() {
 		FromClause top = fromElement.getWalker().getFinalFromClause();
 		return fromElement.getFromClause() != fromElement.getWalker().getCurrentFromClause() &&

Modified: core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821/testsuite/src/test/java/org/hibernate/test/hqlfetchscroll/HQLScrollFetchTest.java
===================================================================
--- core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821/testsuite/src/test/java/org/hibernate/test/hqlfetchscroll/HQLScrollFetchTest.java	2012-09-05 12:19:48 UTC (rev 21067)
+++ core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821/testsuite/src/test/java/org/hibernate/test/hqlfetchscroll/HQLScrollFetchTest.java	2012-09-07 15:34:29 UTC (rev 21068)
@@ -7,6 +7,7 @@
 import org.hibernate.ScrollableResults;
 import org.hibernate.Session;
 import org.hibernate.Transaction;
+import org.hibernate.dialect.DB2Dialect;
 import org.hibernate.dialect.Oracle8iDialect;
 import org.hibernate.dialect.SQLServerDialect;
 import org.hibernate.junit.functional.FunctionalTestCase;
@@ -34,22 +35,24 @@
 	}
 
 	public void testScroll() {
-		if( getDialect() instanceof SQLServerDialect || getDialect() instanceof Oracle8iDialect ){
+		if( getDialect() instanceof SQLServerDialect || getDialect() instanceof Oracle8iDialect || getDialect() instanceof DB2Dialect){
 			reportSkip( "SQL Server and Oracle do not sort the result set automatically, so failure as expected","HQLScrollFetchTest" );
 			return;
 		}
+		insertTestData();
+		Session s = openSession();
 		try {
-			insertTestData();
-			Session s = openSession();
+			s.beginTransaction();
 			ScrollableResults results = s.createQuery( QUERY ).scroll();
 			List list = new ArrayList();
 			while ( results.next() ) {
 				list.add( results.get( 0 ) );
 			}
 			assertResultFromAllUsers( list );
-			s.close();
 		}
 		finally {
+			s.getTransaction().rollback();
+			s.close();
 			deleteAll();
 		}
 	}
@@ -139,7 +142,7 @@
 		Transaction t = s.beginTransaction();
 		List list = s.createQuery( "from Parent" ).list();
 		for ( Iterator i = list.iterator(); i.hasNext(); ) {
-			s.delete( (Parent) i.next() );
+			s.delete( i.next() );
 		}
 		t.commit();
 		s.close();

Modified: core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821/testsuite/src/test/java/org/hibernate/test/joinedsubclass/JoinedSubclassTest.java
===================================================================
--- core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821/testsuite/src/test/java/org/hibernate/test/joinedsubclass/JoinedSubclassTest.java	2012-09-05 12:19:48 UTC (rev 21067)
+++ core/patches/hibernate-3.3.2.GA_CP04_JBPAPP-9821/testsuite/src/test/java/org/hibernate/test/joinedsubclass/JoinedSubclassTest.java	2012-09-07 15:34:29 UTC (rev 21068)
@@ -33,6 +33,53 @@
 		return new FunctionalTestClassTestSuite( JoinedSubclassTest.class );
 	}
 
+	public void testHqlDeleteOnJoinedSubclass() {
+		Session s = openSession();
+		s.beginTransaction();
+		// syntax checking on the database...
+		s.createQuery( "delete from Employee" ).executeUpdate();
+		s.createQuery( "delete from Person" ).executeUpdate();
+		s.createQuery( "delete from Employee e" ).executeUpdate();
+		s.createQuery( "delete from Person p" ).executeUpdate();
+		s.createQuery( "delete from Employee where name like 'S%'" ).executeUpdate();
+		s.createQuery( "delete from Employee e where e.name like 'S%'" ).executeUpdate();
+		s.createQuery( "delete from Person where name like 'S%'" ).executeUpdate();
+		s.createQuery( "delete from Person p where p.name like 'S%'" ).executeUpdate();
+
+		// now the forms that actually fail from problem underlying HHH-1657
+		// which is limited to references to properties mapped to column names existing in both tables
+		// which is normally just the pks.  super critical ;)
+
+		s.createQuery( "delete from Employee where id = 1" ).executeUpdate();
+		s.createQuery( "delete from Employee e where e.id = 1" ).executeUpdate();
+		s.createQuery( "delete from Person where id = 1" ).executeUpdate();
+		s.createQuery( "delete from Person p where p.id = 1" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testHqlUpdateOnJoinedSubclass() {
+		Session s = openSession();
+		s.beginTransaction();
+		// syntax checking on the database...
+		s.createQuery( "update Employee set name = 'Some Other Name' where title like 'A%'" ).executeUpdate();
+		s.createQuery( "update Employee e set e.name = 'Some Other Name' where e.title like 'A%'" ).executeUpdate();
+		s.createQuery( "update Person set name = 'Some Other Name' where name like 'S%'" ).executeUpdate();
+		s.createQuery( "update Person p set p.name = 'Some Other Name' where p.name like 'S%'" ).executeUpdate();
+
+		// now the forms that actually fail from problem underlying HHH-1657
+		// which is limited to references to properties mapped to column names existing in both tables
+		// which is normally just the pks.  super critical ;)
+
+		s.createQuery( "update Employee set name = 'Some Other Name' where id = 1" ).executeUpdate();
+		s.createQuery( "update Employee e set e.name = 'Some Other Name' where e.id = 1" ).executeUpdate();
+		s.createQuery( "update Person set name = 'Some Other Name' where id = 1" ).executeUpdate();
+		s.createQuery( "update Person p set p.name = 'Some Other Name' where p.id = 1" ).executeUpdate();
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
 	public void testJoinedSubclass() {
 		Session s = openSession();
 		Transaction t = s.beginTransaction();



More information about the hibernate-commits mailing list