Hi all This is a very simple case, easy to repro, see the following SQLs:
create table tt (pk integer primary key, a integer, b integer); create index tti on tt (a); upsert into tt values (1, 2, 3); select /*+index(tt tti)*/ b from tt where a = 2; // will query back to data table //this SELECT works fine, will return b=3 create table tt2 (pk integer primary key desc, a integer, b integer); create index tt2i on tt2 (a); upsert into tt2 values (1, 2, 3); select /*+index(tt2 tt2i)*/ b from tt2 where a = 2; // this SELECT should return the same result set, but actually returned an empty ResultSet The only difference between tt2 and tt is that pk column of tt2 is in DESC order. But the same SELECT returns nothing for tt2. The reason of this bug is in HashCacheClient#evaluateKeyExpression(). In line 173, type.toObject() didn't take sort order as a param. All we have to do is to pass child.getSortOrder() to type.toObject() method. Just modify this line like this: values.add(LiteralExpression.newConstant(type.toObject(ptr, child.getSortOrder()), type)); I checked the code in trunk and this bug still exists. Are there any similar scenarios that failed considering the sort order information? Thanks. William