[ https://issues.apache.org/jira/browse/PHOENIX-2613?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
chenglei updated PHOENIX-2613: ------------------------------ Description: In pheonix 4.6,any column of multi-part primary key can be null.If a table has one row which has a column of multi-part primary key is null, and the java assert is disable, when we do a query,the Skip Scan may cause RegionServer scan indefinite loop,just as the follow unit test: {code:borderStyle=solid} @Test public void testNullInfiniteLoop() throws Exception { this.jdbcTemplate.update("drop table if exists NULL_TEST "); this.jdbcTemplate.update( "create table NULL_TEST"+ "("+ "CREATETIME VARCHAR,"+ "ACCOUNTID VARCHAR,"+ "SERVICENAME VARCHAR,"+ "SPAN.APPID VARCHAR,"+ "CONSTRAINT pk PRIMARY KEY(CREATETIME,ACCOUNTID,SERVICENAME)"+ ")"); this.jdbcTemplate.update("upsert into NULL_TEST(CREATETIME,SERVICENAME,SPAN.APPID) values('20160116141006','servlet','android')"); this.jdbcTemplate.update("upsert into NULL_TEST(CREATETIME,ACCOUNTID,SERVICENAME,SPAN.APPID) values('20160116151006','2404787','jdbc','ios')"); this.jdbcTemplate.queryForList("select * from NULL_TEST where CREATETIME>='20160116121006' and CREATETIME<='20160116181006' and ACCOUNTID='2404787'"); } {code} As above unit test explained,we create a NULL_TEST table, and insert a row which ACCOUNT column is null, When we do a query which condition is CREATETIME column and ACCOUNTID column, Phoenix will use SkipScanFilter to scan the table. Unfortunately,the query will run forever,can not return result. If we construct a SkipScanFilter using the above query condition,and we can see after the SkipScanFilter's filterKeyValue method is called on the KeyValue which rowKey is "20160116141006\\x00\\x00servlet"(the ACCOUNT column is null), the SkipScanFilter may return a erroneous NextHintCell value "20160116141006\\x00\\x002404787",which should be "20160116141006\\x002404787" was: In pheonix 4.6,any column of multi-part primary key can be null.If a table has one row which has a column of multi-part primary key is null, when we do a query,the Skip Scan may cause RegionServer scan indefinite loop,just as the follow unit test: {code:borderStyle=solid} @Test public void testNullInfiniteLoop() throws Exception { this.jdbcTemplate.update("drop table if exists NULL_TEST "); this.jdbcTemplate.update( "create table NULL_TEST"+ "("+ "CREATETIME VARCHAR,"+ "ACCOUNTID VARCHAR,"+ "SERVICENAME VARCHAR,"+ "SPAN.APPID VARCHAR,"+ "CONSTRAINT pk PRIMARY KEY(CREATETIME,ACCOUNTID,SERVICENAME)"+ ")"); this.jdbcTemplate.update("upsert into NULL_TEST(CREATETIME,SERVICENAME,SPAN.APPID) values('20160116141006','servlet','android')"); this.jdbcTemplate.update("upsert into NULL_TEST(CREATETIME,ACCOUNTID,SERVICENAME,SPAN.APPID) values('20160116151006','2404787','jdbc','ios')"); this.jdbcTemplate.queryForList("select * from NULL_TEST where CREATETIME>='20160116121006' and CREATETIME<='20160116181006' and ACCOUNTID='2404787'"); } {code} as above unit test explained,we create a NULL_TEST table, and insert a row which ACCOUNT column is null, When we do a query which condition is CREATETIME column and ACCOUNTID column, Phoenix will use SkipScanFilter to scan the table. Unfortunately,the query will run forever,can not return result. > if any column of multi-part primary key is null, the Skip Scan may cause > RegionServer scan indefinite loop > ---------------------------------------------------------------------------------------------------------- > > Key: PHOENIX-2613 > URL: https://issues.apache.org/jira/browse/PHOENIX-2613 > Project: Phoenix > Issue Type: Bug > Affects Versions: 4.6.0 > Environment: HBase 0.98.6-cdh5.3.2, Phoenix 4.6.0-HBase-0.98 > Reporter: chenglei > > In pheonix 4.6,any column of multi-part primary key can be null.If a table > has one row which has a column of multi-part primary key is null, and the > java assert is disable, when we do a query,the Skip Scan may cause > RegionServer scan indefinite loop,just as the follow unit test: > {code:borderStyle=solid} > @Test > public void testNullInfiniteLoop() throws Exception > { > this.jdbcTemplate.update("drop table if exists NULL_TEST "); > > this.jdbcTemplate.update( > "create table NULL_TEST"+ > "("+ > "CREATETIME VARCHAR,"+ > "ACCOUNTID VARCHAR,"+ > "SERVICENAME VARCHAR,"+ > "SPAN.APPID VARCHAR,"+ > "CONSTRAINT pk PRIMARY > KEY(CREATETIME,ACCOUNTID,SERVICENAME)"+ > ")"); > > this.jdbcTemplate.update("upsert into > NULL_TEST(CREATETIME,SERVICENAME,SPAN.APPID) > values('20160116141006','servlet','android')"); > this.jdbcTemplate.update("upsert into > NULL_TEST(CREATETIME,ACCOUNTID,SERVICENAME,SPAN.APPID) > values('20160116151006','2404787','jdbc','ios')"); > this.jdbcTemplate.queryForList("select * from NULL_TEST where > CREATETIME>='20160116121006' and CREATETIME<='20160116181006' and > ACCOUNTID='2404787'"); > > } > {code} > As above unit test explained,we create a NULL_TEST table, and insert a row > which ACCOUNT column is null, When we do a query which condition is > CREATETIME column and ACCOUNTID column, Phoenix will use SkipScanFilter to > scan the table. Unfortunately,the query will run forever,can not return > result. > If we construct a SkipScanFilter using the above query condition,and we can > see after the SkipScanFilter's filterKeyValue method is called on the > KeyValue which rowKey is "20160116141006\\x00\\x00servlet"(the ACCOUNT column > is null), the SkipScanFilter may return a erroneous NextHintCell value > "20160116141006\\x00\\x002404787",which should be > "20160116141006\\x002404787" -- This message was sent by Atlassian JIRA (v6.3.4#6332)