Issue Details (XML | Word | Printable)

Key: DERBY-3279
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: A B
Reporter: Ajay Bhala
Votes: 0
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
Derby

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.

Created: 14/Dec/07 09:21 PM   Updated: 30/Jun/09 03:55 PM
Return to search
Component/s: SQL
Affects Version/s: 10.3.1.4, 10.3.2.1
Fix Version/s: 10.3.3.0, 10.4.1.3

Time Tracking:
Not Specified

File Attachments:
  Size
File Licensed for inclusion in ASF works cheese2.sql 2008-01-29 09:24 PM Ajay Bhala 2 kB
Text File Licensed for inclusion in ASF works d3279_10_3_merge.patch 2008-02-06 12:09 AM A B 44 kB
Text File Licensed for inclusion in ASF works d3279_ix2brnode_v1.patch 2008-01-30 09:38 PM A B 18 kB
Text File Licensed for inclusion in ASF works d3279_v1.patch 2008-01-23 10:05 PM A B 29 kB
HTML File Licensed for inclusion in ASF works releaseNote.html 2008-04-02 03:37 AM A B 7 kB
Environment: Rational Application Developer 7.0.0.2 (Eclipse 3.2.2), J2RE 1.5.0 IBM J9 2.3 Windows XP
Issue Links:
Reference
 

Urgency: Urgent
Bug behavior facts: Regression
Resolution Date: 07/Feb/08 07:03 PM


 Description  « Hide
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;

 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Repository Revision Date User Message
ASF #616126 Tue Jan 29 00:58:37 UTC 2008 abrown DERBY-3279: Add logic for execution-time sorting of IN list values
into DESCENDING order when required. This is necessary when doing
IN-list "multi-probing" on some column C for which a DESC sort has
been eliminated (by the optimizer). In such a case the row values
will come back in the order in which they appear in the IN List,
which means the IN list values must themselves be sorted in the
correct (descending) order.
Files Changed
MODIFY /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/InListMultiProbeTest.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OrderByList.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromBaseTable.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/BaseTableNumbersVisitor.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/InListOperatorNode.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericResultSetFactory.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/SingleChildResultSetNode.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/compile/OptimizablePredicateList.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/execute/ResultSetFactory.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultSetNode.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/MultiProbeTableScanResultSet.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/PredicateList.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/SelectNode.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/TableOperatorNode.java

Repository Revision Date User Message
ASF #617548 Fri Feb 01 16:26:32 UTC 2008 abrown DERBY-3279: Add logic for execution-time sorting of IN list values
into DESCENDING order when required.

This is a follow-up patch to add an implementation of the
adjustForSortElimination(RequiredRowOrdering) to IndexToBaseRowNode,
which was missing from the previous commit (svn # 616126). This
commit also adds more test cases to InListMultiProbeTest.java.
Files Changed
MODIFY /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/InListMultiProbeTest.java
MODIFY /db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/JDBC.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/IndexToBaseRowNode.java

Repository Revision Date User Message
ASF #619568 Thu Feb 07 18:58:10 UTC 2008 abrown DERBY-3279: Add logic for execution-time sorting of IN list values
into DESCENDING order when required. This is necessary when doing
IN-list "multi-probing" on some column C for which a DESC sort has
been eliminated (by the optimizer). In such a case the row values
will come back in the order in which they appear in the IN List,
which means the IN list values must themselves be sorted in the
correct (descending) order.

Merge from 10.4 trunk to 10.3 branch:

 svn merge -r 616125:616126 https://svn.apache.org/repos/asf/db/derby/code/trunk
 svn merge -r 617547:617548 https://svn.apache.org/repos/asf/db/derby/code/trunk

This commit encapsulates the above merge commands plus a two-line
manual conflict resolution in JDBC.java; i.e. d3279_10_3_merge.patch
as attached to the Jira.
Files Changed
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/OrderByList.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/BaseTableNumbersVisitor.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/GenericResultSetFactory.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/SingleChildResultSetNode.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/iapi/sql/execute/ResultSetFactory.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/MultiProbeTableScanResultSet.java
MODIFY /db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/lang/InListMultiProbeTest.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/PredicateList.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/TableOperatorNode.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/FromBaseTable.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/InListOperatorNode.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/iapi/sql/compile/OptimizablePredicateList.java
MODIFY /db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/junit/JDBC.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/ResultSetNode.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/SelectNode.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/IndexToBaseRowNode.java