David On 2017/12/21 21:04, David Rowley wrote: > On 21 December 2017 at 23:38, Amit Langote > <langote_amit...@lab.ntt.co.jp> wrote: >> Attached updated set of patches. > > Looks like the new not equals code does not properly take into account > a missing NULL partition. > > create table ta (a int not null) partition by list (a); > create table ta1 partition of ta for values in(1,2); > create table ta2 partition of ta for values in(3,4); > explain select * from ta where a <> 1 and a <> 2; > ERROR: negative bitmapset member not allowed > > -- Add null partition > create table ta_null partition of ta for values in(null); > explain select * from ta where a <> 1 and a <> 2; -- works now. > QUERY PLAN > ------------------------------------------------------------- > Append (cost=0.00..48.25 rows=2525 width=4) > -> Seq Scan on ta2 (cost=0.00..48.25 rows=2525 width=4) > Filter: ((a <> 1) AND (a <> 2)) > (3 rows) > > This code appears to be at fault: > > /* > * Also, exclude the "null-only" partition, because strict clauses in > * ne_clauses will not select any rows from it. > */ > if (count_partition_datums(relation, boundinfo->null_index) == 0) > excluded_parts = bms_add_member(excluded_parts, > boundinfo->null_index);
Oops, must check before going to count datums that a null-partition exists at all. Will post the fixed version shortly, thanks. Regards, Amit