Fix for deeply nested subqueries, and for the JPQL IN(<subquery>) construct.

git-svn-id: https://svn.apache.org/repos/asf/incubator/openjpa/trunk@473140 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
A. Abram White 2006-11-09 23:55:41 +00:00
parent fd57bd62dd
commit fb770599b0
3 changed files with 30 additions and 20 deletions

View File

@ -382,22 +382,7 @@ public final class SQLBuffer
* actual parameter values
*/
public String getSQL(boolean replaceParams) {
if (_subsels != null && !_subsels.isEmpty()) {
// add subsels backwards so that the stored insertion points of
// later subsels remain valid
Subselect sub;
SQLBuffer buf;
for (int i = _subsels.size() - 1; i >= 0; i--) {
sub = (Subselect) _subsels.get(i);
if (sub.count)
buf = sub.select.toSelectCount();
else
buf = sub.select.toSelect(false, sub.fetch);
append(buf, sub.sqlIndex, sub.paramIndex, false);
}
_subsels.clear();
}
resolveSubselects();
String sql = _sql.toString();
if (!replaceParams || _params == null || _params.isEmpty())
return sql;
@ -423,6 +408,29 @@ public final class SQLBuffer
return buf.toString();
}
/**
* Resolve our delayed subselects.
*/
private void resolveSubselects() {
if (_subsels == null || _subsels.isEmpty())
return;
// add subsels backwards so that the stored insertion points of
// later subsels remain valid
Subselect sub;
SQLBuffer buf;
for (int i = _subsels.size() - 1; i >= 0; i--) {
sub = (Subselect) _subsels.get(i);
if (sub.count)
buf = sub.select.toSelectCount();
else
buf = sub.select.toSelect(false, sub.fetch);
buf.resolveSubselects();
append(buf, sub.sqlIndex, sub.paramIndex, false);
}
_subsels.clear();
}
/**
* Create and populate the parameters of a prepared statement using
* the SQL in this buffer.
@ -606,4 +614,3 @@ public final class SQLBuffer
}
}
}

View File

@ -821,10 +821,14 @@ class JPQLExpressionBuilder
while (inIterator.hasNext()) {
val2 = getValue((JPQLNode) inIterator.next());
setImplicitTypes(val1, val2, null);
// special case for <value> IN (<subquery>)
if (val2 instanceof Subquery && node.getChildCount() == 2)
return factory.contains(val2, val1);
// this is currently a sequence of OR expressions, since we
// do not have support for IN expressions
setImplicitTypes(val1, val2, null);
if (inExp == null)
inExp = factory.equal(val1, val2);
else

View File

@ -86,7 +86,6 @@ public class Localizer {
String key = file + locale.toString();
// no locking; ok if bundle created multiple times
// check for cached version
Localizer loc = (Localizer) _localizers.get(key);
if (loc != null)