typhon-project / typhonql

Typhon Query Language
Eclipse Public License 2.0
4 stars 1 forks source link

[BUG] Can't filter for empty reference #114

Open MarieSaphira opened 3 years ago

MarieSaphira commented 3 years ago

Describe the bug

Selecting entries that have an empty reference throws errors

Query

insert Foo {name: "first"}
insert Bar {name: "second"}

from Foo f select f where f.bar == null

Model

entity Foo {
    name : string[30]
    bar -> Bar[1]
}

entity Bar {
    name : string[30]
}

relationaldb FooDB {
    tables { 
        table { 
            fooData : Foo 
            index metadataIndex { 
                attributes ("name")  
            } 
            idSpec ("name") 
        }
    }
}

documentdb BarDB {
    collections {
        barData : Bar
    }
}

Expected behavior

Return all entries that have an empty reference

REST API

TyphonQL failed to handle request, msg:
Could not find source tbl for outer join: f with as("Bar.bar^-Foo.bar","junction_bar$1") on equ(column("junction_bar$1","Foo.bar"),column("f","Foo.@id"))
Trace:
|lib://typhonql/src/lang/typhonql/relational/Query2SQL.rsc|(4433,2,<139,79>,<139,81>): "Could not find source tbl for outer join: f with as(\"Bar.bar^-Foo.bar\",\"junction_bar$1\") on equ(column(\"junction_bar$1\",\"Foo.bar\"),column(\"f\",\"Foo.@id\"))"
    at addLeftOuterJoin(|lib://typhonql/src/lang/typhonql/relational/Query2SQL.rsc|(4091,349,<131,2>,<140,3>))
    at expr2sql(|lib://typhonql/src/lang/typhonql/relational/Query2SQL.rsc|(9834,176,<328,4>,<330,86>))
    at expr2sql(|lib://typhonql/src/lang/typhonql/relational/Query2SQL.rsc|(12851,126,<401,0>,<402,48>))
    at select2sql(|lib://typhonql/src/lang/typhonql/relational/Query2SQL.rsc|(7490,27,<262,8>,<262,35>))
    at compile2sql(|lib://typhonql/src/lang/typhonql/relational/Query2SQL.rsc|(2606,130,<90,0>,<91,35>))
    at compileQuery(|lib://typhonql/src/lang/typhonql/Query2Script.rsc|(3295,21,<95,22>,<95,43>))
    at request2script(|lib://typhonql/src/lang/typhonql/Request2Script.rsc|(2588,5,<83,22>,<83,27>))
    at runScriptForQuery(|lib://typhonql/src/lang/typhonql/RunUsingCompiler.rsc|(2970,34,<89,8>,<89,42>))
    at runQueryAndGetJava(|lib://typhonql/src/lang/typhonql/RunUsingCompiler.rsc|(3413,46,<103,1>,<103,47>))
    at runQueryAndGetJava(|lib://typhonql/src/lang/typhonql/RunUsingCompiler.rsc|(6731,47,<190,9>,<190,56>))
16:39:11.780 [qtp1681920301-18] ERROR engineering.swat.typhonql.server.QLRestServer - Failed to handle response
org.rascalmpl.interpreter.control_exceptions.Throw: |lib://typhonql/src/lang/typhonql/relational/Query2SQL.rsc|:139,79: "Could not find source tbl for outer join: f with as(\"Bar.bar^-Foo.bar\",\"junction_bar$1\") on equ(column(\"junction_bar$1\",\"Foo.bar\"),column(\"f\",\"Foo.@id\"))"
    at org.rascalmpl.interpreter.control_exceptions.ControlException.reallyFillInStackTrace(ControlException.java:42) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.control_exceptions.Throw.fillInStackTrace(Throw.java:138) ~[rascal-0.18.2.jar:?]
    at java.lang.Throwable.<init>(Throwable.java:266) ~[?:1.8.0_272]
    at java.lang.Exception.<init>(Exception.java:66) ~[?:1.8.0_272]
    at java.lang.RuntimeException.<init>(RuntimeException.java:62) ~[?:1.8.0_272]
    at org.rascalmpl.interpreter.control_exceptions.ControlException.<init>(ControlException.java:25) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.control_exceptions.Throw.<init>(Throw.java:73) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.control_exceptions.Throw.<init>(Throw.java:93) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Throw.interpret(Statement.java:920) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.runBody(RascalFunction.java:400) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.call(RascalFunction.java:333) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:533) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Expression.interpret(Statement.java:365) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$NonEmptyBlock.interpret(Statement.java:759) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$IfThenElse.interpret(Statement.java:679) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$IfThenElse.interpret(Statement.java:711) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$IfThenElse.interpret(Statement.java:711) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.runBody(RascalFunction.java:400) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.call(RascalFunction.java:333) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.ConcretePatternDispatchedFunction.call(ConcretePatternDispatchedFunction.java:200) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.ConcretePatternDispatchedFunction.call(ConcretePatternDispatchedFunction.java:177) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.OverloadedFunction.callWith(OverloadedFunction.java:416) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.OverloadedFunction.call(OverloadedFunction.java:394) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:533) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:495) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Expression.interpret(Statement.java:365) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Return.interpret(Statement.java:783) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.runBody(RascalFunction.java:400) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.call(RascalFunction.java:333) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.ConcretePatternDispatchedFunction.call(ConcretePatternDispatchedFunction.java:200) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.ConcretePatternDispatchedFunction.call(ConcretePatternDispatchedFunction.java:177) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.OverloadedFunction.callWith(OverloadedFunction.java:416) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.OverloadedFunction.call(OverloadedFunction.java:394) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:533) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:495) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Expression.interpret(Statement.java:365) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.utils.Cases$DefaultBlock.matchAndEval(Cases.java:252) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Switch.interpret(Statement.java:900) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$NonEmptyBlock.interpret(Statement.java:759) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$For.interpret(Statement.java:468) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.runBody(RascalFunction.java:400) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.call(RascalFunction.java:333) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.ConcretePatternDispatchedFunction.call(ConcretePatternDispatchedFunction.java:200) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.ConcretePatternDispatchedFunction.call(ConcretePatternDispatchedFunction.java:177) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.OverloadedFunction.callWith(OverloadedFunction.java:416) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.OverloadedFunction.call(OverloadedFunction.java:394) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:533) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Expression.interpret(Statement.java:365) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Return.interpret(Statement.java:783) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.runBody(RascalFunction.java:400) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.call(RascalFunction.java:333) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:533) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Expression.interpret(Statement.java:365) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Assignment.interpret(Statement.java:205) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.runBody(RascalFunction.java:400) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.call(RascalFunction.java:333) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.ConcretePatternDispatchedFunction.call(ConcretePatternDispatchedFunction.java:200) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.ConcretePatternDispatchedFunction.call(ConcretePatternDispatchedFunction.java:177) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.OverloadedFunction.callWith(OverloadedFunction.java:416) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.OverloadedFunction.call(OverloadedFunction.java:394) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:533) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.ListComprehensionWriter.append(ListComprehensionWriter.java:26) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Comprehension.evalComprehension(Comprehension.java:95) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Comprehension$List.interpret(Comprehension.java:39) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Expression$Comprehension.interpret(Expression.java:681) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:495) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Declarator$Default.interpret(Declarator.java:53) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.LocalVariableDeclaration$Default.interpret(LocalVariableDeclaration.java:36) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$VariableDeclaration.interpret(Statement.java:1005) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$NonEmptyBlock.interpret(Statement.java:759) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.utils.Cases.matchAndEval(Cases.java:423) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.utils.Cases$DefaultBlock.matchAndEval(Cases.java:261) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.utils.Cases$ConcreteBlock.matchAndEval(Cases.java:220) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Switch.interpret(Statement.java:900) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.runBody(RascalFunction.java:400) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.call(RascalFunction.java:333) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:533) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Expression.interpret(Statement.java:365) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Assignment.interpret(Statement.java:205) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$NonEmptyBlock.interpret(Statement.java:759) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$IfThenElse.interpret(Statement.java:679) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.runBody(RascalFunction.java:400) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.call(RascalFunction.java:333) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:533) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Expression.interpret(Statement.java:365) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.runBody(RascalFunction.java:400) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.call(RascalFunction.java:333) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.OverloadedFunction.callWith(OverloadedFunction.java:416) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.OverloadedFunction.call(OverloadedFunction.java:394) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Expression$CallOrTree.interpret(Expression.java:533) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Expression.interpret(Statement.java:365) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.semantics.dynamic.Statement$Return.interpret(Statement.java:783) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.runBody(RascalFunction.java:400) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.RascalFunction.call(RascalFunction.java:333) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.OverloadedFunction.callWith(OverloadedFunction.java:416) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.OverloadedFunction.call(OverloadedFunction.java:394) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.result.OverloadedFunction.call(OverloadedFunction.java:385) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.Evaluator.call(Evaluator.java:735) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.Evaluator.call(Evaluator.java:719) ~[rascal-0.18.2.jar:?]
    at org.rascalmpl.interpreter.Evaluator.call(Evaluator.java:708) ~[rascal-0.18.2.jar:?]
    at nl.cwi.swat.typhonql.client.XMIPolystoreConnection.lambda$12(XMIPolystoreConnection.java:154) ~[typhonql-0.1.0-SNAPSHOT.jar:?]
    at nl.cwi.swat.typhonql.client.XMIPolystoreConnection.lambda$20(XMIPolystoreConnection.java:368) ~[typhonql-0.1.0-SNAPSHOT.jar:?]
    at org.rascalmpl.util.ConcurrentSoftReferenceObjectPool.useAndReturn(ConcurrentSoftReferenceObjectPool.java:96) ~[rascal-0.18.2.jar:?]
    at nl.cwi.swat.typhonql.client.XMIPolystoreConnection.sessionCall(XMIPolystoreConnection.java:365) ~[typhonql-0.1.0-SNAPSHOT.jar:?]
    at nl.cwi.swat.typhonql.client.XMIPolystoreConnection.sessionCall(XMIPolystoreConnection.java:361) ~[typhonql-0.1.0-SNAPSHOT.jar:?]
    at nl.cwi.swat.typhonql.client.XMIPolystoreConnection.executeQuery(XMIPolystoreConnection.java:153) ~[typhonql-0.1.0-SNAPSHOT.jar:?]
    at engineering.swat.typhonql.server.QLRestServer.handleNewQuery(QLRestServer.java:274) ~[classes/:?]
    at engineering.swat.typhonql.server.QLRestServer.handle(QLRestServer.java:324) ~[classes/:?]
    at engineering.swat.typhonql.server.QLRestServer.access$400(QLRestServer.java:77) ~[classes/:?]
    at engineering.swat.typhonql.server.QLRestServer$3.doPost(QLRestServer.java:356) ~[classes/:?]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) ~[javax.servlet-api-3.1.0.jar:3.1.0]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[javax.servlet-api-3.1.0.jar:3.1.0]
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:755) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:547) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1297) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1212) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:767) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.Server.handle(Server.java:500) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547) [jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375) [jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:270) [jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [jetty-io-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) [jetty-io-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) [jetty-io-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:388) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_272]
tvdstorm commented 3 years ago

Thanks for the report. Just as an experiment can you try:

from Foo f, Bar b select f where f.bar == null
MarieSaphira commented 3 years ago

The error is the same

tvdstorm commented 3 years ago

i can't reproduce the behavior on dev (even with your exact model and query). However, even though the error is not thrown, the result will be wrong due to the semantics of outer joins in SQL. Currently, "null" means absence in the junction table. Outer join then puts nulls for referenced entities that, if their respective rows are indeed absent. However, adding where ... == null, restricts the junction table to the empty set of rows, hence the final result is always empty. This requires more thinking.