On Thu, 7 Mar 2019 at 11:37, Andres Freund <and...@anarazel.de> wrote: > > On 2019-03-07 11:31:15 +1300, David Rowley wrote: > > Do you think it's fine to reword the docs to make this point more > > clear, or do you see this as a fundamental problem with the patch? > > Hm, both? I mean I wouldn't necessarily characterize it as "fundamental" > problem, but ...
Okay, so if I understand you correctly, you're complaining about the fact that if the user does: CREATE TABLE p (a int) PARTITION BY LIST(a) TABLESPACE pg_default; that the user intended that all future partitions go to pg_default and not whatever default_tablespace is set to at the time? If so, that seems like a genuine concern. I see in heap_create() we do; /* * Never allow a pg_class entry to explicitly specify the database's * default tablespace in reltablespace; force it to zero instead. This * ensures that if the database is cloned with a different default * tablespace, the pg_class entry will still match where CREATE DATABASE * will put the physically copied relation. * * Yes, this is a bit of a hack. */ if (reltablespace == MyDatabaseTableSpace) reltablespace = InvalidOid; which will zero pg_class.reltablespace if the specified tablespace happens to match pg_database.dattablespace. This causes future partitions to think that no tablespace was specified and therefore DefineRelation() consults the default_tablespace. I see that this same problem exists for partitioned indexes too: create table listp (a int) partition by list(a); create index on listp (a) tablespace pg_default; set default_Tablespace = n; create table listp1 partition of listp for values in(1); \d listp1 Table "public.listp1" Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- a | integer | | | Partition of: listp FOR VALUES IN (1) Indexes: "listp1_a_idx" btree (a), tablespace "n" Tablespace: "n" If I understand what you're saying correctly, then the listp1_a_idx should have been created in pg_default since that's what the default partitioned index tablespace was set to. > I don't think the argument that the user intended to explicitly set a > tablespace holds much water if it was just set via default_tablespace, > rather than an explicit TABLESPACE. I think iff you really want > something like this feature, you'd have to mark a partition's > reltablespace as 0 unless an *explicit* assignment of the tablespace > happened. In which case you also would need to explicitly emit a > TABLESPACE for the partitioned table in pg_dump, to restore that. I think emitting an explicit tablespace in pg_dump for partitioned tables (when non-zero) might have issues for pg_restore's --no-tablespaces option. -- David Rowley http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services