[
https://issues.apache.org/jira/browse/DERBY-3033?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12528498
]
Bryan Pendleton commented on DERBY-3033:
----------------------------------------
Hi Army, thanks for the feedback! I marked the issue as assigned to me, because
I'm trying to understand it, but progress is slow.
I believe that the null value in row[rsNumber] is coming from a request to
fetch column 1 of result set 5. Here's the original query for context:
select study_id, number_of_images from (select distinct st.study_id,
st.number_of_images, dsr.priority, st.creation_datetime from
dicom_send_requests dsr,
studies st where dsr.send_date is null and dsr.workstation_id = ? and
dsr.study_id = st.study_id and not exists ( select 1 from
dispatcher_locks where
dispatcher_locks.study_id = st.study_id and
dispatcher_locks.workstation_id = ? and
dispatcher_locks.dispatcher_id = ? )) temp
Result set 5, I believe, is the "select 1 from dispatcher_locks" nested query,
and column 1
of that result set is dispatcher_locks.study_id.
The null value occurs at the very beginning of the first time that we are
opening a TableScanResultSet.
We are setting up a NestedLoopJoinResultSet, and the right side of that join is
a index-to-base probe,
and so we are trying to set the start position for a particular "probe" into
the index for a particular
study_id value. sameStartStopPosition is true, as the join on study_id is a
simple equality join.
The code in question, near the top of TableScanResultSet.openCore(), is:
if (startKeyGetter != null)
{
startPosition = (ExecIndexRow)
startKeyGetter.invoke(activation);
if (sameStartStopPosition)
{
stopPosition = startPosition;
}
}
if (stopKeyGetter != null)
{
stopPosition = (ExecIndexRow)
stopKeyGetter.invoke(activation);
}
The TableScanResultSet instance that we are processing is for an index-to-base
probe of
the dicom_send_requests table via the sendreq_study_id_fk secondary index.
I'm thinking that, although the external form of the SQL SELECT statement is:
- dicom_send_requests joins to studies on study_id, and
- studies joins to dispatcher_locks on study_id
the optimizer may have re-arranged this and selected a different join order so
that the actual
query is more like:
- dispatcher_locks joins to dicom_send_requests on study_id, and
- dicom_send_requests joins to studies on study_id
And then, perhaps because the dispatcher_locks query is a "select 1" query, the
execution of the query against dispatcher_locks hasn't fetched any actual data,
and so
the column is coming back null.
So far, however, I haven't seen any code path that is going
through NoPutResultSetImpl.clearOrderableCache, so I don't any information
to share regarding the code comment that Kathey observed.
> select query results in nullpointer exception in skipScan()
> -----------------------------------------------------------
>
> Key: DERBY-3033
> URL: https://issues.apache.org/jira/browse/DERBY-3033
> Project: Derby
> Issue Type: Bug
> Components: SQL
> Affects Versions: 10.2.2.0
> Environment: Windows XP, Java 5.0, JDBC, Derby 10.2.2.0
> Reporter: Haolan Qin
> Assignee: Bryan Pendleton
> Attachments: bug4736.sql, d3033-sane-ij-session-10.3.1.5.txt,
> query_plan.new, query_plan.old, test.rar, test.zip, viewer_10_1.zip
>
>
> The following error was repeatedly thrown when we tried to run a select query
> via JDBC. Strangely, the exact same select query did not trigger any error
> when run from the command line console. After we added an index, the error
> went away completely.
> java.lang.NullPointerException
> at org.apache.derby.impl.sql.execute.NoPutResultSetImpl.skipScan(Unknown
> Source)
> at org.apache.derby.impl.sql.execute.TableScanResultSet.openCore(Unknown
> Source)
> at
> org.apache.derby.impl.sql.execute.IndexRowToBaseRowResultSet.openCore(Unknown
> Source)
> at
> org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.openCore(Unknown
> Source)
> at org.apache.derby.impl.sql.execute.JoinResultSet.openRight(Unknown Source)
> at org.apache.derby.impl.sql.execute.JoinResultSet.openCore(Unknown Source)
> at
> org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.openCore(Unknown
> Source)
> at org.apache.derby.impl.sql.execute.SortResultSet.openCore(Unknown Source)
> at
> org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.openCore(Unknown
> Source)
> at org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.open(Unknown
> Source)
> at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown Source)
> at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown Source)
> at
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(Unknown
> Source)
> at org.apache.derby.impl.jdbc.EmbedPreparedStatement.execute(Unknown Source)
> at org.apache.derby.impl.drda.DRDAStatement.execute(Unknown Source)
> at org.apache.derby.impl.drda.DRDAConnThread.processCommands(Unknown Source)
> at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.