Samarth created PHOENIX-115:
-------------------------------

             Summary: IN clause doesn't return the matching rows in the order 
they were given in the clause
                 Key: PHOENIX-115
                 URL: https://issues.apache.org/jira/browse/PHOENIX-115
             Project: Phoenix
          Issue Type: Bug
    Affects Versions: 3.0.0
            Reporter: Samarth
            Assignee: James Taylor


Consider the following query:
SELECT * FROM TEST_TABLE WHERE  TEST_ID IN ('9FIxx00000000oT', 
'9FIxx00000000oS') 

The rows returned are in the order 9FIxx00000000oS and 9FIxx00000000oT. This 
could be problematic in cases when the IN clause is formed dynamically by 
fetching the ids from another query and the output of the above query is 
expected to be in the order of IDs provided in the IN clause.

Test case to exhibit the problem. It uses row value constructor. Although as 
illustrated above, the problem is not confined to RVC. 

Please add the test below in RowValueConstructorTest.java. 

@Test
    public void testQueryMoreWithInListRowValueConstructor() throws Exception {
        long ts = nextTimestamp();
        String tenantId = getOrganizationId();
        Date date = new Date(System.currentTimeMillis());
        initEntityHistoryTableValues(tenantId, getDefaultSplits(tenantId), 
date, ts);
        Properties props = new Properties(TEST_PROPERTIES);
        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 
2));
        Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
        
        PreparedStatement statement = conn.prepareStatement("select parent_id 
from " + ENTITY_HISTORY_TABLE_NAME + 
                     " WHERE (organization_id, parent_id, created_date, 
entity_history_id) IN ((?, ?, ?, ?),(?,?,?,?))");
        statement.setString(1, tenantId);
        statement.setString(2, PARENTID7);
        statement.setDate(3, date);
        statement.setString(4, ENTITYHISTID7);
        statement.setString(5, tenantId);
        statement.setString(6, PARENTID3);
        statement.setDate(7, date);
        statement.setString(8, ENTITYHISTID3);
        
        ResultSet rs = statement.executeQuery();
        
        assertTrue(rs.next());
        assertEquals(PARENTID7, rs.getString(1));
        assertTrue(rs.next());
        assertEquals(PARENTID3, rs.getString(1));
        assertFalse(rs.next());
     }





--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to