[
https://issues.apache.org/jira/browse/PHOENIX-3867?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16190899#comment-16190899
]
James Taylor commented on PHOENIX-3867:
---------------------------------------
Ping [~singamteja]?
> nth_value returns valid values for non-existing rows
> -----------------------------------------------------
>
> Key: PHOENIX-3867
> URL: https://issues.apache.org/jira/browse/PHOENIX-3867
> Project: Phoenix
> Issue Type: Bug
> Affects Versions: 4.10.0
> Reporter: Loknath Priyatham Teja Singamsetty
> Fix For: 4.12.0
>
>
> Assume a table with two rows as follows:
> id, page_id, date, value
> 2, 8 , 1 , 7
> 3, 8 , 2, 9
> Fetch 3rd most recent value of page_id 3 should not return any values.
> However, rs.next() succeeds and rs.getInt(1) returns 0 and the assertion
> fails. Below is the test case depicting the same.
> Issues:
> --------
> a) From sqline, the 3rd nth_value is returned as null
> b) When programatically accessed, it is coming as 0
> Test Case:
> -------------
> public void nonExistingNthRowTestWithGroupBy() throws Exception {
> Connection conn = DriverManager.getConnection(getUrl());
> String nthValue = generateUniqueName();
> String ddl = "CREATE TABLE IF NOT EXISTS " + nthValue + " "
> + "(id INTEGER NOT NULL PRIMARY KEY, page_id UNSIGNED_LONG,"
> + " dates INTEGER, val INTEGER)";
> conn.createStatement().execute(ddl);
> conn.createStatement().execute(
> "UPSERT INTO " + nthValue + " (id, page_id, dates, val) VALUES
> (2, 8, 1, 7)");
> conn.createStatement().execute(
> "UPSERT INTO " + nthValue + " (id, page_id, dates, val) VALUES
> (3, 8, 2, 9)");
> conn.commit();
> ResultSet rs = conn.createStatement().executeQuery(
> "SELECT NTH_VALUE(val, 3) WITHIN GROUP (ORDER BY dates DESC) FROM
> " + nthValue
> + " GROUP BY page_id");
> assertTrue(rs.next());
> assertEquals(rs.getInt(1), 4);
> assertFalse(rs.next());
> }
> Root Cause:
> ---------------
> The underlying issue seems to be with the way NTH_Value aggregation is done
> by the aggregator. The client aggregator is first populated with the top 'n'
> rows (if present) and during the iterator.next() never gets evaluated in
> BaseGroupedAggregatingResultIterator to see if the nth row is actually
> present or not. Once the iterator.next() succeeds, retrieving the value from
> the result set using the row projector triggers the client aggregators
> evaluate() method as part of schema.toBytes(..) which is defaulting to 0 for
> empty row if it is int when programmatically accessed.
>
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)