[
https://issues.apache.org/jira/browse/PHOENIX-2647?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Ankit Singhal updated PHOENIX-2647:
-----------------------------------
Attachment: PHOENIX-2647.patch
[~jamestaylor] , PFA, patch for review.
Actually start key created for reverse scan seems to be crossing region
boundaries.
As they are altered/reversed at the server level so scan doesn't mind when
reading complete region as they are gonna read till boundaries only but it
affects when scan is within region.
[[email protected]], the problem is basically seen with a
reverse scan done with specific range in a region only and can affect queries
without guidePosts also . example like below.
{code}
@Test
public void testReverseScanForSpecificRangeInRegion() throws Exception {
Connection conn;
ResultSet rs;
Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
conn = DriverManager.getConnection(getUrl(), props);
conn.createStatement()
.execute("CREATE TABLE T" + " ( k VARCHAR, c1.a bigint,c2.b
bigint CONSTRAINT pk PRIMARY KEY (k)) ");
conn.createStatement().execute("upsert into T values ('a',1,3)");
conn.createStatement().execute("upsert into T values ('b',1,3)");
conn.createStatement().execute("upsert into T values ('c',1,3)");
conn.createStatement().execute("upsert into T values ('d',1,3)");
conn.createStatement().execute("upsert into T values ('e',1,3)");
conn.commit();
rs = conn.createStatement().executeQuery("SELECT k FROM T where k>'b'
and k<'d' order by k desc");
assertTrue(rs.next());
assertEquals("c", rs.getString(1));
assertTrue(!rs.next());
conn.close();
}
{code}
> Duplicate results in reverse scan when guideposts are traversed
> ---------------------------------------------------------------
>
> Key: PHOENIX-2647
> URL: https://issues.apache.org/jira/browse/PHOENIX-2647
> Project: Phoenix
> Issue Type: Bug
> Affects Versions: 4.4.0
> Reporter: Maryann Xue
> Assignee: Ankit Singhal
> Fix For: 4.7.0
>
> Attachments: PHOENIX-2647.patch, PHOENIX-2647_wip.patch
>
>
> This problem seems to only occur with reverse scan not forward scan. Adding
> the below tests and settings in OrderByIT can reproduce the issue. I ended up
> getting two rows of "ROW7" instead of one.
> {code}
>
> @BeforeClass
> public static void doSetup() throws Exception {
> Map<String,String> props = getDefaultProps();
> props.put(QueryServices.RUN_UPDATE_STATS_ASYNC,
> Boolean.FALSE.toString());
> props.put(QueryServices.COMMIT_STATS_ASYNC, Boolean.FALSE.toString());
> props.put(QueryServices.STATS_GUIDEPOST_WIDTH_BYTES_ATTRIB,
> Long.toString(1000));
> setUpTestDriver(new ReadOnlyProps(props.entrySet().iterator()));
> }
> @Test
> public void testReverseScan() throws Exception {
> long ts = nextTimestamp();
> String tenantId = getOrganizationId();
> initATableValues(tenantId, getDefaultSplits(tenantId), null, ts);
> String query = "SELECT entity_id FROM aTable ORDER BY organization_id
> desc";
> Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
> props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts
> + 2)); // Execute at timestamp 2
> Connection conn = DriverManager.getConnection(getUrl(), props);
> conn.createStatement().execute("UPDATE STATISTICS ATABLE");
> conn.commit();
> conn.close();
> props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts
> + 5)); // Execute at timestamp 2
> conn = DriverManager.getConnection(getUrl(), props);
> try {
> PreparedStatement statement = conn.prepareStatement(query);
> ResultSet rs = statement.executeQuery();
> assertTrue (rs.next());
> assertEquals(ROW9,rs.getString(1));
> assertTrue (rs.next());
> assertEquals(ROW8,rs.getString(1));
> assertTrue (rs.next());
> assertEquals(ROW7,rs.getString(1));
> assertTrue (rs.next());
> assertEquals(ROW6,rs.getString(1));
> assertTrue (rs.next());
> assertEquals(ROW5,rs.getString(1));
> assertTrue (rs.next());
> assertEquals(ROW4,rs.getString(1));
> assertTrue (rs.next());
> assertEquals(ROW3,rs.getString(1));
> assertTrue (rs.next());
> assertEquals(ROW2,rs.getString(1));
> assertTrue (rs.next());
> assertEquals(ROW1,rs.getString(1));
> assertFalse(rs.next());
> } finally {
> conn.close();
> }
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)