Lukas Benes created PHOENIX-965: ----------------------------------- Summary: Cannot aggregate on index with NULL values Key: PHOENIX-965 URL: https://issues.apache.org/jira/browse/PHOENIX-965 Project: Phoenix Issue Type: Bug Affects Versions: 3.0.0, 4.0.0 Reporter: Lukas Benes
I've found issue related to indexed NULL values (I've also applied PHOENIX-63 that writing NULL values to index ) CREATE TABLE tbl (id INTEGER, col INTEGER CONSTRAINT pk PRIMARY KEY (id)) CREATE index tbl_idx ON tbl (col, id) /* without index works ok */ UPSERT INTO tbl (id, col) VALUES (1, NULL) /* problematic line with NULL value */ UPSERT INTO tbl (id, col) VALUES (2, 4) UPSERT INTO tbl (id, col) VALUES (3, 5) SELECT SUM(col) FROM tbl SUM on index table with null values causes ServerAggregator exception, because empty byte array is send to aggregate function, due to evaluate expression [TO_INTEGER(PK[-1])] [\x00\x80\x00\x00\x01/0:_0/1398957414306/Put/vlen=0/ts=2] returns true and ptr is set to EMPTY_BYTE_ARRAY, because length is 0 https://github.com/apache/incubator-phoenix/blob/3.0/phoenix-core/src/main/java/org/apache/phoenix/expression/RowKeyColumnExpression.java#L116 I'm not sure if it is fixable by returning false when evaluated to NULL, but here is hotfix https://github.com/tzolkincz/incubator-phoenix/commit/adf24c887d7c5248ee12c7970580c187e8f5e436#diff-6d1bc085da39a4ee2e51c36a47a33e21R117 org.apache.phoenix.exception.PhoenixIOException: org.apache.phoenix.exception.PhoenixIOException: org.apache.hadoop.hbase.DoNotRetryIOException: TBL_IDX,,1399026966936.08f1d45504f9f6f2c9c3f01d5af612d0.: 0 at org.apache.phoenix.util.ServerUtil.parseServerException(ServerUtil.java:97) at org.apache.phoenix.iterate.ParallelIterators.getIterators(ParallelIterators.java:289) at org.apache.phoenix.iterate.ConcatResultIterator.getIterators(ConcatResultIterator.java:44) at org.apache.phoenix.iterate.ConcatResultIterator.currentIterator(ConcatResultIterator.java:66) at org.apache.phoenix.iterate.ConcatResultIterator.next(ConcatResultIterator.java:86) at org.apache.phoenix.iterate.GroupedAggregatingResultIterator.next(GroupedAggregatingResultIterator.java:68) at org.apache.phoenix.iterate.UngroupedAggregatingResultIterator.next(UngroupedAggregatingResultIterator.java:39) at org.apache.phoenix.jdbc.PhoenixResultSet.next(PhoenixResultSet.java:732) at org.apache.phoenix.end2end.IndexSumIT.testIndexSumAggregate(IndexSumIT.java:45) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: java.util.concurrent.ExecutionException: org.apache.phoenix.exception.PhoenixIOException: org.apache.hadoop.hbase.DoNotRetryIOException: TBL_IDX,,1399026966936.08f1d45504f9f6f2c9c3f01d5af612d0.: 0 at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:232) at java.util.concurrent.FutureTask.get(FutureTask.java:91) at org.apache.phoenix.iterate.ParallelIterators.getIterators(ParallelIterators.java:283) ... 33 more Caused by: org.apache.phoenix.exception.PhoenixIOException: org.apache.hadoop.hbase.DoNotRetryIOException: TBL_IDX,,1399026966936.08f1d45504f9f6f2c9c3f01d5af612d0.: 0 at org.apache.phoenix.util.ServerUtil.parseServerException(ServerUtil.java:97) at org.apache.phoenix.iterate.TableResultIterator.<init>(TableResultIterator.java:57) at org.apache.phoenix.iterate.ParallelIterators$2.call(ParallelIterators.java:251) at org.apache.phoenix.iterate.ParallelIterators$2.call(ParallelIterators.java:245) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:695) Caused by: org.apache.hadoop.hbase.DoNotRetryIOException: org.apache.hadoop.hbase.DoNotRetryIOException: TBL_IDX,,1399026966936.08f1d45504f9f6f2c9c3f01d5af612d0.: 0 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:95) at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:79) at org.apache.hadoop.hbase.client.ServerCallable.translateException(ServerCallable.java:256) at org.apache.hadoop.hbase.client.ServerCallable.withRetries(ServerCallable.java:166) at org.apache.hadoop.hbase.client.ClientScanner.nextScanner(ClientScanner.java:210) at org.apache.hadoop.hbase.client.ClientScanner.initializeScannerInConstruction(ClientScanner.java:125) at org.apache.hadoop.hbase.client.ClientScanner.<init>(ClientScanner.java:120) at org.apache.hadoop.hbase.client.HTable.getScanner(HTable.java:702) at org.apache.phoenix.iterate.TableResultIterator.<init>(TableResultIterator.java:54) ... 7 more Caused by: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hbase.DoNotRetryIOException: TBL_IDX,,1399026966936.08f1d45504f9f6f2c9c3f01d5af612d0.: 0 at org.apache.phoenix.util.ServerUtil.throwIOException(ServerUtil.java:73) at org.apache.phoenix.coprocessor.BaseScannerRegionObserver.postScannerOpen(BaseScannerRegionObserver.java:68) at org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost.postScannerOpen(RegionCoprocessorHost.java:1316) at org.apache.hadoop.hbase.regionserver.HRegionServer.internalOpenScanner(HRegionServer.java:2566) at org.apache.hadoop.hbase.regionserver.HRegionServer.openScanner(HRegionServer.java:2534) at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:323) at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1426) Caused by: java.lang.ArrayIndexOutOfBoundsException: 0 at org.apache.phoenix.schema.PDataType$IntCodec.decodeInt(PDataType.java:5709) at org.apache.phoenix.schema.PDataType$IntCodec.decodeLong(PDataType.java:5690) at org.apache.phoenix.schema.PDataType$BaseCodec.decodeLong(PDataType.java:5472) at org.apache.phoenix.expression.aggregator.NumberSumAggregator.aggregate(NumberSumAggregator.java:68) at org.apache.phoenix.expression.aggregator.ServerAggregators.aggregate(ServerAggregators.java:61) at org.apache.phoenix.coprocessor.UngroupedAggregateRegionObserver.doPostScannerOpen(UngroupedAggregateRegionObserver.java:277) at org.apache.phoenix.coprocessor.BaseScannerRegionObserver.postScannerOpen(BaseScannerRegionObserver.java:66) ... 8 more at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:1012) at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:87) at com.sun.proxy.$Proxy20.openScanner(Unknown Source) at org.apache.hadoop.hbase.client.ScannerCallable.openScanner(ScannerCallable.java:224) at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:126) at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:42) at org.apache.hadoop.hbase.client.ServerCallable.withRetries(ServerCallable.java:164) ... 12 more -- This message was sent by Atlassian JIRA (v6.2#6252)