[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