[
https://issues.apache.org/jira/browse/DERBY-3279?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12562125#action_12562125
]
A B commented on DERBY-3279:
----------------------------
> What if there was a multi-column index [...] if we decided to do in-list
> multi-probing
> against the NAME_IDX, would we have an ambiguity about whether we wanted to
> sort the (LAST_NAME,FIRST_NAME) values in ASC or DESC order?
Great question, Bryan. Thanks for bringing it up!
I think the answer is, in fact, that "this isn't possible". A given
multi-probing result set only ever works with a single column--even if that
column is part of a multi-column index. See the following comments from
TableScanResultSet:
* Note that it *is* possible for a start/stop key to contain more
* than one column (ex. if we're scanning a multi-column index). In
* that case we plug probeValue into the first column of the start
* and/or stop key and leave the rest of the key as it is. As an
* example, assume we have the following predicates:
*
* ... where d in (1, 20000) and b > 200 and b <= 500
*
* And assume further that we have an index defined on (d, b).
* In this case it's possible that we have TWO start predicates
* and TWO stop predicates: the IN list will give us "d = probeVal",
* which is a start predicate and a stop predicate; then "b > 200"
* may give us a second start predicate, while "b <= 500" may give
* us a second stop predicate. So in this situation we want our
* start key to be:
*
* (probeValue, 200)
*
* and our stop key to be:
*
* (probeValue, 500).
*
* This will effectively limit the scan so that it only returns
* rows whose "D" column equals probeValue and whose "B" column
* falls in the range of 200 thru 500.
*
* Note: Derby currently only allows a single start/stop predicate
* per column. See PredicateList.orderUsefulPredicates().
It's also worth noting that Derby will only do multi-probing IF the column in
question is the FIRST column in the index. This comes from the comments in
PredicateList.orderUsefulPredicates():
else if (pred.isInListProbePredicate()
&& (indexPosition > 0))
{
/* If the predicate is an IN-list probe predicate
* then we only consider it to be useful if the
* referenced column is the *first* one in the
* index (i.e. if (indexPosition == 0)). Otherwise
* the predicate would be treated as a qualifier
* for store, which could lead to incorrect
* results.
*/
indexCol = null;
}
So in the example you gave above, we would (should) never do multi-probing for
FIRST_NAME. We would either do multi-probing based on LAST_NAME, in which case
the sort would have to be ASC, or we would do no multi-probing at all. The
FIRST_NAME IN list would be treated as a "normal" (non-probing) IN list
operator.
At least, that's the theory. If you'd like me to add a test case for that,
just to be sure, let me know and I can certainly do so.
If this still isnt' clear, please feel free to ask again. And thanks, as
always, for your great comments!
> Derby 10.3.X ignores ORDER BY DESC when target column has an index and is
> used in an OR clause or an IN list.
> -------------------------------------------------------------------------------------------------------------
>
> Key: DERBY-3279
> URL: https://issues.apache.org/jira/browse/DERBY-3279
> Project: Derby
> Issue Type: Bug
> Components: SQL
> Affects Versions: 10.3.1.4, 10.3.2.1
> Environment: Rational Application Developer 7.0.0.2 (Eclipse 3.2.2),
> J2RE 1.5.0 IBM J9 2.3 Windows XP
> Reporter: Ajay Bhala
> Assignee: A B
> Attachments: d3279_v1.patch
>
>
> Running the following produces the error seen in Derby 10.3.X but not in
> 10.2.X nor in 10.1.X.
> Don't know if this related to DERBY-3231.
> First query is incorrectly sorted whereas the second one is okay when there
> is an index on the table.
> If the table is not indexed, the sort works correctly in DESC order.
> ------
> create table CHEESE (
> CHEESE_CODE VARCHAR(5),
> CHEESE_NAME VARCHAR(20),
> CHEESE_COST DECIMAL(7,4)
> );
> create index cheese_index on CHEESE (CHEESE_CODE DESC, CHEESE_NAME DESC,
> CHEESE_COST DESC);
> INSERT INTO CHEESE (
> CHEESE_CODE,
> CHEESE_NAME,
> CHEESE_COST)
> VALUES ('00000', 'GOUDA', 001.1234),
> ('00000', 'EDAM', 002.1111),
> ('54321', 'EDAM', 008.5646),
> ('12345', 'GORGONZOLA', 888.2309),
> ('AAAAA', 'EDAM', 999.8888),
> ('54321', 'MUENSTER', 077.9545);
> SELECT * FROM CHEESE
> WHERE (CHEESE_CODE='00000' OR CHEESE_CODE='54321') AND CHEESE_NAME='EDAM'
> ORDER BY CHEESE_CODE DESC, CHEESE_NAME DESC, CHEESE_COST DESC;
> SELECT * FROM CHEESE
> WHERE (CHEESE_CODE='AAAAA' OR CHEESE_CODE='54321') AND CHEESE_NAME='EDAM'
> ORDER BY CHEESE_CODE DESC, CHEESE_NAME DESC, CHEESE_COST DESC;
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.