Sorry for bug spam, just want to get feedback (if any) before I JIRA

If you just create the first 10 rows in the scripts below, most functions work 
fine.  If you create records that are in just one group, that contain any 
nulls, then exceptions are thrown:

So try with first 10, confirm stuff works
Then add last 5 rows, confirm stuff breaks

NOTE: PERCENTILE_CONT shows none of these errors, so whatever that function 
does is maybe of interest!

Cheers

Simon

-- If a GROUP BY clause results in a single row with a NULL value then 
Exceptions are thrown
-- If the column is INTEGER then the exception is: NumberFormatException: 
Infinite or NaN
-- If the column is DECIMAL then the exception is: ArithmeticException: 
Division undefined

-- 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);

-- 5 Unique groups - These cause the issue.  Try running all the queries below 
BEFORE creating these records to see that some bugs only occur if a grouping 
results in a single row with a null column value
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, 
INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('K', 'C', 1, 1, 1.1, 1.1);
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, 
INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('L', 'D', null, 2, 2.2, 
2.2);
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, 
INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('M', 'E', 2, null, 2.2, 
2.2);
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, 
INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('N', 'F', 3, 3, null, 
3.3);
UPSERT INTO TEST.TESTEXCEPTIONS(KEYCOL, GROUPNAME, INTEGERCOLUMN, 
INTEGERCOLUMN2, DECIMALCOLUMN, DECIMALCOLUMN2) VALUES('O', 'G', 4, 4, 4.4, 
null);

-- to remove these problem rows
DELETE FROM TEST.TESTEXCEPTIONS WHERE KEYCOL = 'K' OR KEYCOL = 'L' OR KEYCOL = 
'M' OR KEYCOL = 'N' OR KEYCOL = 'O';


-- rows exist
SELECT count(*) FROM TEST.TESTEXCEPTIONS ;

-- 
======================================================================================================================================
-- PERCENTILE_DISC
-- ======================

-- 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 (already reported separately)
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)

-- ==================
-- With Grouping
-- shows various exceptions when last 5 rows are added to mix
-- ==================

SELECT GROUPNAME, PERCENTILE_DISC (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN 
ASC) FROM TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;
-- Integer two columns works
SELECT GROUPNAME, PERCENTILE_DISC (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN 
ASC), PERCENTILE_DISC (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN2 ASC) FROM 
TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;
-- Decimal - Same exception as above
SELECT GROUPNAME, PERCENTILE_DISC (0.5) WITHIN GROUP (ORDER BY DECIMALCOLUMN 
ASC) FROM TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;


-- 
======================================================================================================================================

-- PERCENT_RANK
-- Grouping Issues. Create the 5 unique grouped records to show error

-- single integer
SELECT PERCENT_RANK (100) WITHIN GROUP (ORDER BY INTEGERCOLUMN ASC) FROM 
TEST.TESTEXCEPTIONS;
-- two integers
SELECT PERCENT_RANK (100) WITHIN GROUP (ORDER BY INTEGERCOLUMN ASC), 
PERCENT_RANK (100) WITHIN GROUP (ORDER BY INTEGERCOLUMN2 ASC) FROM 
TEST.TESTEXCEPTIONS;
-- single decimal
SELECT PERCENT_RANK (100) WITHIN GROUP (ORDER BY DECIMALCOLUMN ASC) FROM 
TEST.TESTEXCEPTIONS;
-- two decmals
SELECT PERCENT_RANK (100) WITHIN GROUP (ORDER BY DECIMALCOLUMN ASC), 
PERCENT_RANK (100) WITHIN GROUP (ORDER BY DECIMALCOLUMN2 ASC) FROM 
TEST.TESTEXCEPTIONS;
-- combination
SELECT PERCENT_RANK (100) WITHIN GROUP (ORDER BY DECIMALCOLUMN ASC), 
PERCENT_RANK (100) WITHIN GROUP (ORDER BY INTEGERCOLUMN ASC) FROM 
TEST.TESTEXCEPTIONS;

-- ==================
-- With Grouping
-- Exceptions thrown if an grouping contains a single row with a null value
-- Use the unique group rows at the top of this file to cause this bug.
-- ==================

SELECT GROUPNAME, PERCENT_RANK (100) WITHIN GROUP (ORDER BY INTEGERCOLUMN ASC) 
FROM TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;
-- two integers
SELECT GROUPNAME, PERCENT_RANK (100) WITHIN GROUP (ORDER BY INTEGERCOLUMN ASC), 
PERCENT_RANK (100) WITHIN GROUP (ORDER BY INTEGERCOLUMN2 ASC) FROM 
TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;
-- single decimal
SELECT GROUPNAME, PERCENT_RANK (100) WITHIN GROUP (ORDER BY DECIMALCOLUMN ASC) 
FROM TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;
-- two decmals
SELECT GROUPNAME, PERCENT_RANK (100) WITHIN GROUP (ORDER BY DECIMALCOLUMN ASC), 
PERCENT_RANK (100) WITHIN GROUP (ORDER BY DECIMALCOLUMN2 ASC) FROM 
TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;
-- combination
SELECT GROUPNAME, PERCENT_RANK (100) WITHIN GROUP (ORDER BY DECIMALCOLUMN ASC), 
PERCENT_RANK (100) WITHIN GROUP (ORDER BY INTEGERCOLUMN ASC) FROM 
TEST.TESTEXCEPTIONS GROUP BY GROUPNAME  ;


-- 
======================================================================================================================================
-- STDDEV_SAMP
-- Grouping Issues. Create the 5 unique grouped records to show error

-- single integer
SELECT STDDEV_SAMP(INTEGERCOLUMN) FROM TEST.TESTEXCEPTIONS;
-- two integers
SELECT STDDEV_SAMP(INTEGERCOLUMN), STDDEV_SAMP(INTEGERCOLUMN2) FROM 
TEST.TESTEXCEPTIONS;
-- single decimal
SELECT STDDEV_SAMP(DECIMALCOLUMN) FROM TEST.TESTEXCEPTIONS;
-- two decimals
SELECT STDDEV_SAMP(DECIMALCOLUMN), STDDEV_SAMP(DECIMALCOLUMN2) FROM 
TEST.TESTEXCEPTIONS;
-- integer and decimal
SELECT STDDEV_SAMP(INTEGERCOLUMN), STDDEV_SAMP(DECIMALCOLUMN2) FROM 
TEST.TESTEXCEPTIONS;

-- ==================
-- With Grouping
-- Exceptions thrown if an grouping contains a single row with a null value
-- Use the unique group rows at the top of this file to cause this bug.
-- ==================

-- single integer
SELECT GROUPNAME, STDDEV_SAMP(INTEGERCOLUMN) FROM TEST.TESTEXCEPTIONS GROUP BY 
GROUPNAME ;
-- two integers
SELECT GROUPNAME, STDDEV_SAMP(INTEGERCOLUMN), STDDEV_SAMP(INTEGERCOLUMN2) FROM 
TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;
-- single decimal
SELECT GROUPNAME, STDDEV_SAMP(DECIMALCOLUMN) FROM TEST.TESTEXCEPTIONS GROUP BY 
GROUPNAME ;
-- two decimals
SELECT GROUPNAME, STDDEV_SAMP(DECIMALCOLUMN), STDDEV_SAMP(DECIMALCOLUMN2) FROM 
TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;
-- integer and decimal
SELECT GROUPNAME, STDDEV_SAMP(INTEGERCOLUMN), STDDEV_SAMP(DECIMALCOLUMN2) FROM 
TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;

-- 
======================================================================================================================================
-- STDDEV_POP
-- Grouping Issues. Create the 5 unique grouped records to show error

-- single integer
SELECT STDDEV_POP(INTEGERCOLUMN) FROM TEST.TESTEXCEPTIONS;
-- two integers
SELECT STDDEV_POP(INTEGERCOLUMN), STDDEV_POP(INTEGERCOLUMN2) FROM 
TEST.TESTEXCEPTIONS;
-- Single decimal column works
SELECT STDDEV_POP(DECIMALCOLUMN) FROM TEST.TESTEXCEPTIONS;
-- two decimal columns works
SELECT STDDEV_POP(DECIMALCOLUMN), STDDEV_POP(DECIMALCOLUMN2) FROM 
TEST.TESTEXCEPTIONS;
-- integer and decimal work
SELECT STDDEV_POP(INTEGERCOLUMN), STDDEV_POP(DECIMALCOLUMN2) FROM 
TEST.TESTEXCEPTIONS;

-- ==================
-- With Grouping
-- Exceptions thrown if an grouping contains a single row with a null value
-- Use the unique group rows at the top of this file to cause this bug.
-- ==================

-- single integer
SELECT GROUPNAME, STDDEV_POP(INTEGERCOLUMN) FROM TEST.TESTEXCEPTIONS GROUP BY 
GROUPNAME ;
-- two integers
SELECT GROUPNAME, STDDEV_POP(INTEGERCOLUMN), STDDEV_POP(INTEGERCOLUMN2) FROM 
TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;
-- Single decimal column
SELECT GROUPNAME, STDDEV_POP(DECIMALCOLUMN) FROM TEST.TESTEXCEPTIONS GROUP BY 
GROUPNAME ;
-- two decimal columns
SELECT GROUPNAME, STDDEV_POP(DECIMALCOLUMN), STDDEV_POP(DECIMALCOLUMN2) FROM 
TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;
-- integer and decimal
SELECT GROUPNAME, STDDEV_POP(INTEGERCOLUMN), STDDEV_POP(DECIMALCOLUMN2) FROM 
TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;


-- 
======================================================================================================================================
-- PERCENTILE_CONT  just including for completeness, no issues here

-- No issues

-- single integer
SELECT PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN ASC) FROM 
TEST.TESTEXCEPTIONS;
-- two integers
SELECT PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN ASC), 
PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN2 ASC) FROM 
TEST.TESTEXCEPTIONS;
-- single decimal
SELECT PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY DECIMALCOLUMN ASC) FROM 
TEST.TESTEXCEPTIONS;
-- two decmals
SELECT PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY DECIMALCOLUMN ASC), 
PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY DECIMALCOLUMN2 ASC) FROM 
TEST.TESTEXCEPTIONS;
-- combination
SELECT PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY DECIMALCOLUMN ASC), 
PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN ASC) FROM 
TEST.TESTEXCEPTIONS;

-- ==================
-- With Grouping
-- No issues, whatever this function does, the others should copy!
-- ==================

-- single integer
SELECT GROUPNAME, PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN 
ASC) FROM TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;
-- two integers
SELECT GROUPNAME, PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN 
ASC), PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN2 ASC) FROM 
TEST.TESTEXCEPTIONS GROUP BY GROUPNAME;
-- single decimal
SELECT GROUPNAME, PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY DECIMALCOLUMN 
ASC) FROM TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;
-- two decmals
SELECT GROUPNAME, PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY DECIMALCOLUMN 
ASC), PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY DECIMALCOLUMN2 ASC) FROM 
TEST.TESTEXCEPTIONS  GROUP BY GROUPNAME ;
-- combination
SELECT GROUPNAME, PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY DECIMALCOLUMN 
ASC), PERCENTILE_CONT (0.5) WITHIN GROUP (ORDER BY INTEGERCOLUMN ASC) FROM 
TEST.TESTEXCEPTIONS GROUP BY GROUPNAME ;

Reply via email to