I replied off the list with a link to download a test case.

- mike


On Tue, Sep 24, 2013 at 6:29 PM, Thomas Mueller <
[email protected]> wrote:

> Hi,
>
> There were a few issues about parameter indexes in combination with views
> or subqueries in the past, it's possible that there are remaining issues.
>
> >  I can provide a standalone, albeit complicated test case for this issue.
>
> That would be great! I wouldn't want to change the code without having a
> proper test case.
>
> Regards,
> Thomas
> Hi,
>
> I have found what I believe to be an issue with parameter handling in a
> complex query. It seems it is possible for the incorrect parameter to be
> returned as a value when evaluating the query (in my case a timestamp
> parameter was evaluating to a long - using the value of a separate
> parameter of from the query).
>
> The query itself is generated and quite complex with a fair amount of
> context so it is not trivial to make a stand alone test case for this.
> Below is the error.
>
> LIMIT 10000 [22007-173]
>     at org.h2.message.DbException.getJdbcSQLException(DbException.java:331)
>     at org.h2.message.DbException.get(DbException.java:160)
>     at org.h2.value.ValueTimestamp.parse(ValueTimestamp.java:87)
>     at org.h2.value.Value.convertTo(Value.java:834)
>     at org.h2.value.Value.getTimestamp(Value.java:395)
>     at org.h2.expression.Function.getValueWithArgs(Function.java:1161)
>     at org.h2.expression.Function.getValue(Function.java:466)
>     at org.h2.expression.Operation.getValue(Operation.java:110)
>     at org.h2.expression.Aggregate.updateAggregate(Aggregate.java:246)
>     at org.h2.expression.Function.updateAggregate(Function.java:2117)
>     at org.h2.expression.Function.updateAggregate(Function.java:2117)
>     at org.h2.expression.Alias.updateAggregate(Alias.java:88)
>     at org.h2.command.dml.Select.queryGroup(Select.java:344)
>     at org.h2.command.dml.Select.queryWithoutCache(Select.java:620)
>     at org.h2.command.dml.Query.query(Query.java:314)
>     at org.h2.command.dml.Query.query(Query.java:284)
>     at org.h2.index.ViewIndex.find(ViewIndex.java:253)
>     at org.h2.index.BaseIndex.find(BaseIndex.java:126)
>     at org.h2.index.IndexCursor.find(IndexCursor.java:155)
>     at org.h2.table.TableFilter.next(TableFilter.java:328)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.command.dml.Select.queryGroup(Select.java:316)
>     at org.h2.command.dml.Select.queryWithoutCache(Select.java:620)
>     at org.h2.command.dml.Query.query(Query.java:314)
>     at org.h2.command.dml.Query.query(Query.java:284)
>     at org.h2.expression.Subquery.getValue(Subquery.java:37)
>     at org.h2.expression.Function.getNullOrValue(Function.java:974)
>     at org.h2.expression.Function.getSimpleValue(Function.java:815)
>     at org.h2.expression.Function.getValueWithArgs(Function.java:992)
>     at org.h2.expression.Function.getValue(Function.java:466)
>     at org.h2.expression.Operation.getValue(Operation.java:110)
>     at org.h2.expression.Function.getNullOrValue(Function.java:974)
>     at org.h2.expression.Function.getValueWithArgs(Function.java:991)
>     at org.h2.expression.Function.getValue(Function.java:466)
>     at
> org.h2.engine.FunctionAlias$JavaMethod.getValue(FunctionAlias.java:361)
>     at org.h2.expression.JavaFunction.getValue(JavaFunction.java:39)
>     at org.h2.expression.ExpressionList.getValue(ExpressionList.java:33)
>     at
> org.h2.expression.JavaAggregate.updateAggregate(JavaAggregate.java:194)
>     at org.h2.expression.Function.updateAggregate(Function.java:2117)
>     at org.h2.expression.Alias.updateAggregate(Alias.java:88)
>     at org.h2.command.dml.Select.queryGroupSorted(Select.java:189)
>     at org.h2.command.dml.Select.queryWithoutCache(Select.java:618)
>     at org.h2.command.dml.Query.query(Query.java:314)
>     at org.h2.command.dml.Query.query(Query.java:284)
>     at org.h2.index.ViewIndex.find(ViewIndex.java:253)
>     at org.h2.index.BaseIndex.find(BaseIndex.java:126)
>     at org.h2.index.IndexCursor.find(IndexCursor.java:155)
>     at org.h2.table.TableFilter.next(TableFilter.java:328)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.table.TableFilter.next(TableFilter.java:398)
>     at org.h2.command.dml.Select.queryFlat(Select.java:518)
>     at org.h2.command.dml.Select.queryWithoutCache(Select.java:625)
>     at org.h2.command.dml.Query.query(Query.java:314)
>     at org.h2.command.dml.Query.query(Query.java:284)
>     at org.h2.command.dml.Query.query(Query.java:1)
>     at org.h2.command.CommandContainer.query(CommandContainer.java:91)
>     at org.h2.command.Command.executeQuery(Command.java:195)
>     at
> org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:106)
>     ...
> Caused by: java.lang.IllegalArgumentException: -5665000565650751172
>     at org.h2.util.DateTimeUtils.parseDateValue(DateTimeUtils.java:270)
>     at org.h2.value.ValueTimestamp.parseTry(ValueTimestamp.java:105)
>     at org.h2.value.ValueTimestamp.parse(ValueTimestamp.java:85)
>
>
> Debugging it I can make interventions at several points to fix the issue.
> In my case parameter 23 was receiving the value from I think one of its
> neighbours(22 or 24) in the ViewIndex. I believe the offset it receives
> here is incorrect.
>
> ViewIndex:234:
>
>         int idx = originalParameters == null ? 0 :
> originalParameters.size();
>         idx += view.getParameterOffset();
>
>
> The parameter list the offset was calculated from contained a duplicate
> last parameter. So I can intervene here to remove the duplicate parameter
> (in my case it is the last parameter that is duplicated). This worked in
> this case and didn't break anything else for me, but I am not sure which
> invariants hold true about parameter lists in general (e.g. can the contain
> duplicates?, are they always in ascending order).
>
> TableView:72:
>
>     public TableView(Schema schema, int id, String name, String querySQL,
> ArrayList<Parameter> params, String[] columnNames,
>             Session session, boolean recursive) {
>         super(schema, id, name, false, true);
>         // remove duplicate parameter
>         if(containsDuplicate(params)){
>             params = new ArrayList(new LinkedHashSet(params));
>         }
>         init(querySQL, params, columnNames, session, recursive);
>     }
>
>
> I tracked the duplicate down to the Parser
>
> Parser:2493:         (In the 'PARAMETER' case of the 'readTerm' method).
>             parameters.add(p);
>
> And changed it to:-
>             // check parameter is not a duplicate before adding it
>             if(!parameters.contains(p)){
>                 parameters.add(p);
>             }
>
> At this point I think it is because of SQL which is being generated
> internally by h2 which is reusing the parameter and its index as nothing I
> send directly to h2 contains the index in the parameter (i.e. I always use
> '?' and not '?23' for parameters), as this is only way a duplicate can be
> added.
>
> If one of the developers would like to have a look I can provide a
> standalone, albeit complicated test case for this issue.
>
> Alternatively I can make further investigations if you have any
> suggestions,
>
>
> many thanks,
>
> mike
>
>
>  --
> You received this message because you are subscribed to the Google Groups
> "H2 Database" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/h2-database.
> For more options, visit https://groups.google.com/groups/opt_out.
>
> --
> You received this message because you are subscribed to the Google Groups
> "H2 Database" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/h2-database.
> For more options, visit https://groups.google.com/groups/opt_out.
>

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to