You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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]
The text was updated successfully, but these errors were encountered:
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.
Describe the bug
Selecting entries that have an empty reference throws errors
Query
Model
Expected behavior
Return all entries that have an empty reference
REST API
The text was updated successfully, but these errors were encountered: