You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@phoenix.apache.org by Simon Mottram <Si...@cucumber.co.nz> on 2022/03/16 03:36:12 UTC

PERCENTILE_DISC has problems with DECIMAL columns that may have nulls in

Just checking here for workarounds, mistakes on my part before I create a JIRA bug

-- Tested with both DBeaver and local new build of Phoenix

-- Phoenix sandbox.  HBase 2.4.9 Phoenix <version>5.2.0-SNAPSHOT</version> pulled from master 13/3/2022
-- DBeaver driver version - phoenix-5.0.0-HBase-2.0-thin-client.jar

DROP TABLE TEST.TESTEXCEPTIONS ;
CREATE TABLE IF NOT EXISTS TEST.TESTEXCEPTIONS ( KEYCOL VARCHAR NOT NULL PRIMARY KEY, GROUPNAME VARCHAR, INTEGERCOLUMN INTEGER , INTEGERCOLUMN2 INTEGER,  DECIMALCOLUMN DECIMAL(20,5), DECIMALCOLUMN2 DECIMAL(20,5));

-- 5 in group A
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('A', 'A', 1, 1, 1.1, 1.1);
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('B', 'A', null, 2, 2.2, 2.2);
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('C', 'A', 2, null, 2.2, 2.2);
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('D', 'A', 3, 3, null, 3.3);
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('E', 'A', 4, 4, 4.4, null);

-- 5 in group B
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('F', 'B', 1, 1, 1.1, 1.1);
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('G', 'B', null, 2, 2.2, 2.2);
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('H', 'B', 2, null, 2.2, 2.2);
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('I', 'B', 3, 3, null, 3.3);
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('J', 'B', 4, 4, 4.4, null);

-- Integer single columns works
SELECT PERCENTILE_DISC (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN ASC) FROM TEST.TESTEXCEPTIONS;
-- Integer two columns works
SELECT PERCENTILE_DISC (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN ASC), PERCENTILE_DISC (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN2 ASC) FROM TEST.TESTEXCEPTIONS;
-- BUG: Single Decimal columns throws exception
SELECT PERCENTILE_DISC (0.5) WITHIN GROUP (ORDER BY DECIMALCOLUMN ASC) FROM TEST.TESTEXCEPTIONS;

java.lang.ArrayIndexOutOfBoundsException: arraycopy: last source index 21 out of bounds for byte[3]
        at java.base/java.lang.System.arraycopy(Native Method)
        at org.apache.phoenix.expression.aggregator.PercentileDiscClientAggregator.evaluate(PercentileDiscClientAggregator.java:85)
        at org.apache.phoenix.schema.KeyValueSchema.toBytes(KeyValueSchema.java:113)
        at org.apache.phoenix.schema.KeyValueSchema.toBytes(KeyValueSchema.java:94)
        at org.apache.phoenix.expression.aggregator.Aggregators.toBytes(Aggregators.java:112)
        at org.apache.phoenix.iterate.UngroupedAggregatingResultIterator.next(UngroupedAggregatingResultIterator.java:65)
        at org.apache.phoenix.jdbc.PhoenixResultSet.next(PhoenixResultSet.java:853)
        at sqlline.BufferedRows.nextList(BufferedRows.java:109)
        at sqlline.BufferedRows.<init>(BufferedRows.java:52)
        at sqlline.SqlLine.print(SqlLine.java:1672)
        at sqlline.Commands.executeSingleQuery(Commands.java:1063)
        at sqlline.Commands.execute(Commands.java:1003)
        at sqlline.Commands.sql(Commands.java:967)
        at sqlline.SqlLine.dispatch(SqlLine.java:734)
        at sqlline.SqlLine.begin(SqlLine.java:541)
        at sqlline.SqlLine.start(SqlLine.java:267)
        at sqlline.SqlLine.main(SqlLine.java:206)