[hibernate-issues] [Hibernate-JIRA] Created: (HHH-4023) Fix for an issue where alias references are incorrectly replaced by the table name in an INSERT
John Trimble (JIRA)
noreply at atlassian.com
Mon Jul 6 19:48:12 EDT 2009
Fix for an issue where alias references are incorrectly replaced by the table name in an INSERT
-----------------------------------------------------------------------------------------------
Key: HHH-4023
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4023
Project: Hibernate Core
Issue Type: Patch
Components: query-hql
Affects Versions: 3.3.2, 3.2.7
Environment: Hibernate versions 3.2.7 and 3.3.2 on MySQL and HSQLDB.
Reporter: John Trimble
Attachments: branch_3_2_r17009_insert_subquery_alias_fix.patch, branch_3_3_r17009_insert_subquery_alias_fix.patch
In an INSERT, aliases defined in the top most FROM clause incorrectly have their references in subqueries replaced by the table name. For example, a query such as:
HQL: insert into Foo (id, someInt) select bar.id as id, bar.someInt as someInt from Bar bar where exists ( select innerbar from Bar innerbar where innerbar.id=bar.id )
becomes,
HSQLDB SQL: insert into Foo ( id, someInt ) select aliastable0_.id as col_0_0_, aliastable0_.someInt as col_1_0_ from Bar aliastable0_ where exists (select id from Bar aliastable1_ where aliastable1_.id=Bar.id)
Note the use of 'Bar.id' instead of 'aliastable0_.id' resulting in the following exception:
org.hibernate.exception.SQLGrammarException: could not execute update query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:87)
at org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:398)
at org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:259)
at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1142)
at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:94)
...
Caused by: java.sql.SQLException: Column not found: BAR.ID in statement [insert into Foo ( id, someInt ) select aliastable0_.id as col_0_0_, aliastable0_.someInt as col_1_0_ from Bar aliastable0_ where exists (select id from Bar aliastable1_ where aliastable1_.id=Bar.id)]
at org.hsqldb.jdbc.Util.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:528)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:95)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:88)
at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:65)
... 27 more
This substitution is not always inappropriate, for example DELETE requires the replacement:
HQL: delete from Bar bar where exists ( select innerbar from Bar innerbar where bar.id=innerbar.id )
HSQLDB SQL: delete from Bar where exists ( select id from Bar insertinto1_ where Bar.id=insertinto1_.id)
However, I cannot think of a case where this behavior would be necessary for an INSERT, but perhaps there is one I haven't considered. Judging from the logs, it looks as though this may have worked at one point but broke due to a fix for http://opensource.atlassian.com/projects/hibernate/browse/HHH-1419.
I have attached a patch for this issue, which includes an added test for it. The fix causes aliases in an INSERT to be handled in the same manner as for a SELECT. Tested on HSQLDB and MySQL with all tests passing. The issue exists in both the http://anonsvn.jboss.org/repos/hibernate/core/branches/Branch_3_2/ and http://anonsvn.jboss.org/repos/hibernate/core/branches/Branch_3_3/ branches (both of which I've included patches for), and may exist in the http://anonsvn.jboss.org/repos/hibernate/core/trunk/ as well, but I couldn't get it to build for me.
Let me know if there are any issues with the patch--especially with regard to unintended side effects--and I'll gladly look into resolving them.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list