On Thu, Sep 7, 2017 at 3:15 PM, Rajkumar Raghuwanshi < rajkumar.raghuwan...@enterprisedb.com> wrote:
> On Wed, Sep 6, 2017 at 5:25 PM, Jeevan Ladhe < > jeevan.la...@enterprisedb.com> wrote: > >> Hi, >> >> Attached is the rebased set of patches. >> Robert has committed[1] patch 0001 in V26 series, hence the patch >> numbering >> in V27 is now decreased by 1 for each patch as compared to V26. >> > > Hi, > > I have applied v27 patches and while testing got below observation. > > Observation: in below partition table, d1 constraints not allowing NULL to > be inserted in b column > but I am able to insert it. > > steps to reproduce: > create table d0 (a int, b int) partition by range(a,b); > create table d1 partition of d0 for values from (0,0) to > (maxvalue,maxvalue); > > postgres=# insert into d0 values (0,null); > INSERT 0 1 > postgres=# \d+ d1 > Table "public.d1" > Column | Type | Collation | Nullable | Default | Storage | Stats > target | Description > --------+---------+-----------+----------+---------+-------- > -+--------------+------------- > a | integer | | | | plain > | | > b | integer | | | | plain > | | > Partition of: d0 FOR VALUES FROM (0, 0) TO (MAXVALUE, MAXVALUE) > Partition constraint: ((a IS NOT NULL) AND *(b IS NOT NULL) *AND ((a > 0) > OR ((a = 0) AND (b >= 0)))) > > postgres=# select tableoid::regclass,* from d0; > tableoid | a | b > ----------+---+--- > *d1 | 0 | * > (1 row) > Good catch. Thanks Rajkumar. This seems to be happening because of the following changes made in get_partition_for_tuple() for default range partition support as part of patch 0002. @@ -1971,27 +2204,10 @@ get_partition_for_tuple(PartitionDispatch *pd, ecxt->ecxt_scantuple = slot; FormPartitionKeyDatum(parent, slot, estate, values, isnull); - if (key->strategy == PARTITION_STRATEGY_RANGE) - { - /* - * Since we cannot route tuples with NULL partition keys through a - * range-partitioned table, simply return that no partition exists - */ - for (i = 0; i < key->partnatts; i++) - { - if (isnull[i]) - { - *failed_at = parent; - *failed_slot = slot; - result = -1; - goto error_exit; - } - } - } Instead of getting rid of this. If there isn't a default partition then we still do not have any range partition to route a null partition key and the routing should fail. I will work on a fix and send a patch shortly. Regards, Jeevan Ladhe