Hi,

I am transforming queries writen in a kind of relational algebra (I receive 
them as a JSON object) into SQL using Derby. So, I have implemented a 
transformation that should do something similar to the Derby SQL Parser 
(instantiatin the objects of org.apache.derby.impl.sql.compile). Right now, I 
can build and run simple SELECT queries, LEFT/RIGHT-JOINS, but I have a problem 
with the INNER-JOINs. I Instantiate them in this way:

node = new JoinNode(
                        (org.apache.derby.impl.sql.compile.ResultSetNode) 
left.getVisitorResult(),
                        (org.apache.derby.impl.sql.compile.ResultSetNode) 
right.getVisitorResult(), 
                        (ValueNode) condition.getVisitorResult(), null, null, 
null,null, getContextManager());


I'm trying to emulate:
 SELECT T1.a, T1.b, T2.c FROM T1 JOIN T2 ON T1.a = T2.a

The query compiles perfectly and the result colums are perferttly inferred, but 
when it is evaluated, the system produces a NullPointerException it check if 
the first row satisfies the clause (T1.a = T2.a) from a . The clause is a 
simple BinaryRelationalOperation with 2 ColumReferences and the stack trace is 
as follows:

ERROR 38000: Se ha devuelto la excepción 'java.lang.NullPointerException' al 
evaluar una expresión.
        at 
org.apache.derby.iapi.error.StandardException.newException(StandardException.java:290)
        at 
org.apache.derby.iapi.error.StandardException.unexpectedUserException(StandardException.java:509)
        at 
org.apache.derby.impl.services.reflect.DirectCall.invoke(ReflectGeneratedClass.java:126)
        at 
org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(ProjectRestrictResultSet.java:302)
        at 
org.apache.derby.impl.sql.execute.JoinResultSet.openCore(JoinResultSet.java:149)
        at 
org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.openCore(ProjectRestrictResultSet.java:182)
        at 
org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.open(BasicNoPutResultSetImpl.java:266)
        at 
org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(GenericPreparedStatement.java:470)
        at 
org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:349)
        at 
org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1338)
        at 
org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(EmbedPreparedStatement.java:1864)
        at 
org.apache.derby.impl.jdbc.EmbedPreparedStatement.execute(EmbedPreparedStatement.java:1540)
        at 
org.apache.derby.impl.drda.DRDAStatement.execute(DRDAStatement.java:707)
        at 
org.apache.derby.impl.drda.DRDAConnThread.parseEXCSQLSTT(DRDAConnThread.java:4080)
        at 
org.apache.derby.impl.drda.DRDAConnThread.processCommands(DRDAConnThread.java:1043)
        at 
org.apache.derby.impl.drda.DRDAConnThread.run(DRDAConnThread.java:296)
Caused by: java.lang.NullPointerException
        at 
org.apache.derby.exe.acf55fc0a6x014cx2864xeb0bx000006520dc01.e0(Unknown Source)
        at 
org.apache.derby.impl.services.reflect.DirectCall.invoke(ReflectGeneratedClass.java:101)
        ... 13 more

As you can see, I can't check exactly which is the error. However, I have 
detected that the table T2 is has been never resolved (because T1 and T2 are 
function tables, and while T1 is invoked, T2 is not ). Any ideas? I have been 
comparing my instantiation vs what derby instantiates with the SQL Parser and I 
don't found any differences.

Thanks,

Raquel

 

Reply via email to