mirror of https://github.com/apache/openjpa.git
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:
parent
fd57bd62dd
commit
fb770599b0
|
@ -374,7 +374,7 @@ public final class SQLBuffer
|
|||
public String getSQL() {
|
||||
return getSQL(false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the SQL for this buffer.
|
||||
*
|
||||
|
@ -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
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue