Narrowed it down to be caused by a corrupt database. Sigh....

>>>>>>>>>>>> Bernt M. Johnsen wrote (2007-04-19 17:28:54):
> Hi,
> 
> I have a case where I get ArrayIndexOutOfBoundsException in
> GenericParameterValueSet.initialize after a call to
> DatabaseMetaData.getIndexInfo() in 10.2.2.0. I am completely unable to
> reproduce the bug (I create the exact same schema with the exact same
> number of sesions and the same different metadata calls). The actual
> case bails out each time while my repro code works every time (on the
> same VM the same OS). The stack dump is at the end.
> 
> I have found that the cause is a call to
> ExecPreparedStatement.getParameterTypes() returning a zero length
> array when called from BaseActivation.setupActivation. The app in
> quiestion works for Derby 10.1.2. I have also found that
> BaseActivation.setupActivation was changed in Dec 2005. 
> 
> Does anyone have any ideas of how I can track down this one?
> 
> $ svn diff -r354141:354142 BaseActivation.java 
> ------------------------------------------------------------------------
> r354142 | djd | 2005-12-05 20:33:06 +0100 (Mon, 05 Dec 2005) | 7 lines
> 
> DERBY-738 Remove use of generated code per parameter for initiailizing 
> parameters.
> Previously the language compiler would generate some amount of code per 
> paramter
> in order to set up the parameter with a holder DataValueDescriptor of the 
> correct type.
> This patch changes the parameter set to be initialized when the activation is 
> linked
> to the language PreparedStatement (plan) utilizing the list of parameter 
> types the plan has.
> Thus no generated code is needed per parameter for set up.
> 
> ------------------------------------------------------------------------
> 
> $ svn diff -r354141:354142 BaseActivation.java 
> Index: BaseActivation.java
> ===================================================================
> --- BaseActivation.java        (revision 354141)
> +++ BaseActivation.java        (revision 354142)
> @@ -274,11 +274,17 @@
>   */
>       public final void setupActivation(ExecPreparedStatement ps, boolean 
> scrollable) {
>                preStmt = ps;
> -
> +                         
>                 if (ps != null) {
>                        // get the result set description
>                        resultDescription = ps.getResultDescription();
>                   this.scrollable = scrollable;
> +                  
> +                       // Initialize the parameter set to have allocated
> +                      // DataValueDescriptor objects for each parameter.
> +                     if (pvs != null && pvs.getParameterCount() != 0)
> +                               pvs.initialize(ps.getParameterTypes());
> +
>                 } else {
>                         resultDescription = null;
>                        this.scrollable = false;
> @@ -1215,7 +1221,7 @@
>            pvs = lcc.getLanguageFactory().newParameterValueSet(
>                     
> lcc.getLanguageConnectionFactory().getClassFactory().getClassInspector(),
>                        paramCount, hasReturnParam);
> -   }
> +              }
>  
>       /**
>       return the parameters.
> 
> 
> 
> ==========================================================================
> 
> 
> 2007-04-17 16:20:20.191 GMT Thread[DRDAConnThread_5,5,main] (XID = 1554), 
> (SESSIONID = 10), (DATABASE = communitymc_portal1), (DRDAID = 
> C0124DC3.H92B-954198994222304164{11}), Failed Statement is: CALL 
> SYSIBM.SQLSTATISTICS(?,?,?,?,?,?) with 6 parameters begin parameter #1: null 
> :end parameter begin parameter #2: PORTAL :end parameter begin parameter #3: 
> COMMUNITY :end parameter begin parameter #4: 1 :end parameter begin parameter 
> #5: 1 :end parameter begin parameter #6: 
> DATATYPE='JDBC';DYNAMIC=0;REPORTPUBLICPRIVILEGES=1;CURSORHOLD=1 :end 
> parameter 
> java.lang.ArrayIndexOutOfBoundsException: 0
>       at 
> org.apache.derby.impl.sql.GenericParameterValueSet.initialize(Unknown Source)
>       at 
> org.apache.derby.impl.sql.execute.BaseActivation.setupActivation(Unknown 
> Source)
>       at org.apache.derby.impl.sql.GenericActivationHolder.<init>(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.GenericPreparedStatement.getActivation(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(Unknown 
> Source)
>       at org.apache.derby.jdbc.Driver30.newEmbedPreparedStatement(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.EmbedConnection.prepareMetaDataStatement(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.prepareSPS(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.getPreparedQueryUsingSystemTables(Unknown
>  Source)
>       at 
> org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.getPreparedQuery(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.getPreparedQuery(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.doGetIndexInfo(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.getIndexInfo(Unknown Source)
>       at org.apache.derby.catalog.SystemProcedures.SQLSTATISTICS(Unknown 
> Source)
>       at 
> org.apache.derby.exe.ac72e9c096x0112x0056x2b09xffffcd3424e39.g0(Unknown 
> Source)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at java.lang.reflect.Method.invoke(Method.java:585)
>       at org.apache.derby.impl.services.reflect.ReflectMethod.invoke(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.execute.CallStatementResultSet.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.EmbedCallableStatement.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.parseEXCSQLSTTobjects(Unknown 
> Source)
>       at org.apache.derby.impl.drda.DRDAConnThread.parseEXCSQLSTT(Unknown 
> Source)
>       at org.apache.derby.impl.drda.DRDAConnThread.processCommands(Unknown 
> Source)
>       at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source)
> 
> -- 
> Bernt Marius Johnsen, Database Technology Group, 
> Staff Engineer, Technical Lead Derby/Java DB
> Sun Microsystems, Trondheim, Norway



-- 
Bernt Marius Johnsen, Database Technology Group, 
Staff Engineer, Technical Lead Derby/Java DB
Sun Microsystems, Trondheim, Norway

Attachment: pgpo2cxCDXagC.pgp
Description: PGP signature

Reply via email to