[ 
https://issues.apache.org/jira/browse/DERBY-6496?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13922188#comment-13922188
 ] 

Knut Anders Hatlen commented on DERBY-6496:
-------------------------------------------

I think I understand why the compiler context is sometimes available at 
execution time. It shouldn't be available, but there is an optimization that 
prevents the topmost compiler context from being removed from the stack when 
it's popped. Instead, it just marks the context as unused so that it can be 
reused later. See the methods firstOnStack(), isFirstOnStack(), setInUse(), 
getInUse() in CompilerContext.

If the connection has done some compilation before the procedure is executed, 
the compiler context will be available. (But its getInUse() method will return 
false, so it's not in a valid state.) In the failing case, a fresh connection 
has been opened, and the compiled statement is already available in the 
statement cache, so no compilation happens before the procedure is executed, 
and the compiler context won't be available.

> Optional tool registration may fail because the CompilerContext is not always 
> available at execution time.
> ----------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-6496
>                 URL: https://issues.apache.org/jira/browse/DERBY-6496
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.11.0.0
>            Reporter: Rick Hillegas
>            Assignee: Rick Hillegas
>         Attachments: derby-6496-01-aa-useClassFactoryContext.diff, 
> derby-6496-01-ab-useClassFactoryContext.diff
>
>
> For reasons which elude me, the CompilerContext is sometimes available at 
> execution time and sometimes not. When the CompilerContext is not available 
> at execution time, optional tool loading fails on an NPE:
> Caused by: java.lang.NullPointerException
>       at 
> org.apache.derby.catalog.Java5SystemProcedures.SYSCS_REGISTER_TOOL(Java5SystemProcedures.java:104)
>       at 
> org.apache.derby.exe.ac4d3680a5x0144x93adx0136xffffe1d7aa3e0.g0(Unknown 
> Source)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at 
> org.apache.derby.impl.services.reflect.ReflectMethod.invoke(ReflectMethod.java:46)
>       at 
> org.apache.derby.impl.sql.execute.CallStatementResultSet.open(CallStatementResultSet.java:75)
>       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)



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to