Hello,

 

I encounter a StackOverflowError while running a simple selection. I'll
try to explain as clearly as possible the context where the bug occurs:

 

Here are my objects:

A is persisted entity.

A has a name field.

A contains a tree structure of B.

B is a persisted entity.

B may have a B parent and may have B children.

B has a name field.

B has a path field which is build by collapsing all the parent names.

 

 

Here is an example (syntax used: instanceName = className{attributeName:
attributeValue, attributeName: attributeValue, ...};) :

A = A{name: "A"};

rootB = B{parentA: A, name: rootB};

B1 = {parentA: A, name: "B1", parentB: rootB, path: "B1"};

B11 = {parentA: A, name: "B11", parentB: B1, path: "B1.B11"};

B12 = {parentA: A, name: "B12", parentB: B1, path: "B1.B12"};

B111 = {parentA: A, name: "B11", parentB: B11, path: "B1.B11.B111"};

 

 

Here is the query that I run:

SELECT DISTINCT b from B b1, B b2 WHERE (LOCATE(b2.path, b1.path) = 1 OR
b1.path = b2.path) AND (b2.name LIKE :arg1) AND (b1.parentA IN (SELECT
DISTINCT a from A a WHERE a.name LIKE :arg2)) AND (b2.parentA IN (SELECT
DISTINCT a from A a WHERE a.name LIKE :arg2))



 

Here is the stacktrace:

java.lang.StackOverflowError
                at
org.apache.openjpa.jdbc.sql.SelectImpl.aliasSize(SelectImpl.java:2132)
                at
org.apache.openjpa.jdbc.sql.SelectImpl.aliasSize(SelectImpl.java:2140)
                at
org.apache.openjpa.jdbc.sql.SelectImpl.aliasSize(SelectImpl.java:2132)
                at
org.apache.openjpa.jdbc.sql.SelectImpl.aliasSize(SelectImpl.java:2140)
                at
org.apache.openjpa.jdbc.sql.SelectImpl.aliasSize(SelectImpl.java:2132)
                at
org.apache.openjpa.jdbc.sql.SelectImpl.aliasSize(SelectImpl.java:2140)

                at ...



Here is the method into the JPA sources where the loop occurs:

2128:    /**

2129:     * Calculate total number of aliases.

2130:     */

2131:    private int aliasSize(SelectImpl fromSub) {

2132:        int aliases = (_parent == null) ? 0

2133:            : _parent.aliasSize(this);

2134:        aliases += (_aliases == null) ? 0 : _aliases.size();

2135:        if (_subsels != null) {

2136:            SelectImpl sub;

2137:            for (int i = 0; i < _subsels.size(); i++) {

2138:                sub = (SelectImpl) _subsels.get(i);

2139:                if (sub != fromSub)

2140:                    aliases += sub.aliasSize(null);

2141:            }

2142:        }

2143:        return aliases;

2144:    } 



 

The problem seems to occur when multiple subqueries are present.

If I remove the second IN clause, the problem does not occur.

I also suspect the problem occurs when multiple subqueries select the
same object. I may be wrong, though.

 

Any help is welcomed.

Thanks.

 

-- 

Lionel Savouillan

Reply via email to