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() {
|
public String getSQL() {
|
||||||
return getSQL(false);
|
return getSQL(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the SQL for this buffer.
|
* Returns the SQL for this buffer.
|
||||||
*
|
*
|
||||||
|
@ -382,22 +382,7 @@ public final class SQLBuffer
|
||||||
* actual parameter values
|
* actual parameter values
|
||||||
*/
|
*/
|
||||||
public String getSQL(boolean replaceParams) {
|
public String getSQL(boolean replaceParams) {
|
||||||
if (_subsels != null && !_subsels.isEmpty()) {
|
resolveSubselects();
|
||||||
// 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();
|
|
||||||
}
|
|
||||||
|
|
||||||
String sql = _sql.toString();
|
String sql = _sql.toString();
|
||||||
if (!replaceParams || _params == null || _params.isEmpty())
|
if (!replaceParams || _params == null || _params.isEmpty())
|
||||||
return sql;
|
return sql;
|
||||||
|
@ -423,6 +408,29 @@ public final class SQLBuffer
|
||||||
return buf.toString();
|
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
|
* Create and populate the parameters of a prepared statement using
|
||||||
* the SQL in this buffer.
|
* the SQL in this buffer.
|
||||||
|
@ -606,4 +614,3 @@ public final class SQLBuffer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -821,10 +821,14 @@ class JPQLExpressionBuilder
|
||||||
|
|
||||||
while (inIterator.hasNext()) {
|
while (inIterator.hasNext()) {
|
||||||
val2 = getValue((JPQLNode) inIterator.next());
|
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
|
// this is currently a sequence of OR expressions, since we
|
||||||
// do not have support for IN expressions
|
// do not have support for IN expressions
|
||||||
|
setImplicitTypes(val1, val2, null);
|
||||||
if (inExp == null)
|
if (inExp == null)
|
||||||
inExp = factory.equal(val1, val2);
|
inExp = factory.equal(val1, val2);
|
||||||
else
|
else
|
||||||
|
|
|
@ -86,7 +86,6 @@ public class Localizer {
|
||||||
String key = file + locale.toString();
|
String key = file + locale.toString();
|
||||||
|
|
||||||
// no locking; ok if bundle created multiple times
|
// no locking; ok if bundle created multiple times
|
||||||
|
|
||||||
// check for cached version
|
// check for cached version
|
||||||
Localizer loc = (Localizer) _localizers.get(key);
|
Localizer loc = (Localizer) _localizers.get(key);
|
||||||
if (loc != null)
|
if (loc != null)
|
||||||
|
|
Loading…
Reference in New Issue