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

Knut Anders Hatlen edited comment on DERBY-6477 at 2/11/14 3:40 PM:
--------------------------------------------------------------------

This is a problem with an optimization in the LIKE handling. The optimization 
is that predicates on the form

  x LIKE 'prefix%'

are converted into

  x >= 'prefix\u0000\u0000\u0000...' AND x < 'prefiy\u0000\u0000\u0000...' AND 
x LIKE 'prefix%'

in the hope that one of the two generated predicates will evaluate to false and 
avoid the need to evaluate the more expensive LIKE predicate.

The first predicate (the lower limit) is padded with \u0000 characters up to 
the maximum length of the column (because the string comparison algorithm 
otherwise will pad with space characters, so there are values that begin with 
'prefix' that don't match the predicate x >= 'prefix'). Similar padding is done 
with the upper limit. The problem is that the JAVACLASSNAME column in 
SYS.SYSALIASES is defined with maximum length Integer.MAX_VALUE, and creating 
such a long string for the predicate fails.

This optimization is disabled for CLOBs. I suppose the easiest solution is to 
disable it for all columns whose maximum length is greater than 
DB2_LONGVARCHAR_MAXWIDTH too. That would preserve the optimization in all 
user-defined tables, since users cannot declare CHAR, VARCHAR, LONG VARCHAR 
columns longer than that.

\[edit: corrected what the upper limit would look like after optimization\]


was (Author: knutanders):
This is a problem with an optimization in the LIKE handling. The optimization 
is that predicates on the form

  x LIKE 'prefix%'

are converted into

  x >= 'prefix\u0000\u0000\u0000...' AND x < 'prefix\uffff' AND x LIKE 'prefix%'

in the hope that one of the two generated predicates will evaluate to false and 
avoid the need to evaluate the more expensive LIKE predicate.

The first predicate (the lower limit) is padded with \u0000 characters up to 
the maximum length of the column (because the string comparison algorithm 
otherwise will pad with space characters, so there are values that begin with 
'prefix' that don't match the predicate x >= 'prefix'). The problem is that the 
JAVACLASSNAME column in SYS.SYSALIASES is defined with maximum length 
Integer.MAX_VALUE, and creating such a long string for the predicate fails.

This optimization is disabled for CLOBs. I suppose the easiest solution is to 
disable it for all columns whose maximum length is greater than 
DB2_LONGVARCHAR_MAXWIDTH too. That would preserve the optimization in all 
user-defined tables, since users cannot declare CHAR, VARCHAR, LONG VARCHAR 
columns longer than that.

> OutOfMemoryError selecting from SYS.SYSALIASES
> ----------------------------------------------
>
>                 Key: DERBY-6477
>                 URL: https://issues.apache.org/jira/browse/DERBY-6477
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.11.0.0
>            Reporter: Rick Hillegas
>            Assignee: Knut Anders Hatlen
>         Attachments: d6477-1a-disable-optimization.diff
>
>
> The following query raises an OutOfMemoryError:
> if> select a.alias, a.aliastype
> from sys.sysaliases a
> where a.javaclassname like 'org.apache.derby.catalog.SystemProcedures%';
> ERROR XJ001: Java exception: 'Requested array size exceeds VM limit: 
> java.lang.OutOfMemoryError'.



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to