[ 
https://issues.apache.org/jira/browse/DERBY-738?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kathey Marsden updated DERBY-738:
---------------------------------

    Fix Version/s: 10.1.3.2

Merged fix 354142 to 10.1 for this issue.

> Initialize parameters within activation without using generated code.
> ---------------------------------------------------------------------
>
>                 Key: DERBY-738
>                 URL: https://issues.apache.org/jira/browse/DERBY-738
>             Project: Derby
>          Issue Type: Sub-task
>          Components: SQL
>    Affects Versions: 10.1.3.2
>            Reporter: Daniel John Debrunner
>            Assignee: Daniel John Debrunner
>            Priority: Minor
>             Fix For: 10.1.3.2, 10.2.1.6
>
>
> For each parameter in a query the following code is generated, e.g. for the 
> 23rd parameter INT parameter.
> this.pvs.setStorableDataValue(
>     this.getDataValueFactory().getNullInteger(),
>     22, // parameter number
>     4, // Types.INTEGER
>      "java.lang.Integer");
> Apart being a significant amount of code per parameter , each of these will 
> result in a new class pool entry for:
>  - each parameter number (beyond 5)
>  - each unique Types.XXX value (beyond 5)
>  -  each unique class name for a type
> (integer constants -1 through 5 are special cased as instructions in the JVM 
> bytecode and do not require constant pool entries)
> This code is generated in the post constructor method of the generated class 
> and its purpose is to allocate a holder DataValueDescriptor of the correct 
> type to the ParameterValueSet for the statement. These are the parameters 
> that will be directly set by the JDBC application.
> This code is generated by the method ParameterNode.generateHolder();
> The actual instanceof the ParameterValueSet is generated with a single call, 
> by the generated code passing in the number of parameters to 
> BaseActivation.setParameterValueSet. This then generates the structure for 
> the parameters but does not create the DataValueDescriptors since the types 
> are not known.
> The fix is to use the type definitions stored in the associated language 
> PreparedStatement (prepared plan) DataTypeDescriptor[] to generate the null 
> values and initalize the parameters.
> I'm looking at replacing the ParameterValueSet.setStorableDataValue with an 
> initialize method like:
>       public void initialize(DataTypeDescriptor[] types)
>       {
>               for (int i = 0; i < parms.length; i++)
>               {
>                       DataTypeDescriptor dtd = types[i];
>                       
>                       parms[i].initialize(dtd.getNull(),
>                                       dtd.getJDBCTypeId(),
>                                         
> dtd.getTypeId().getCorrespondingJavaTypeName());
>               }
>       }
> With this, no code is required in the postConstructor() for a parameter. The 
> initialize method is called when
> the activation is linked to its prepared statement.. With my prototype the 
> generated code size for the DERBY-732 query dropped from around 70k to 60k. 
> Of course this does not fix DERBY-732, since it is not reducing code in the 
> where clause method.
>     
>  

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to