Re: UPDATE of partition key
Robert Haas <robertmhaas@gmail.com>
On Fri, Feb 24, 2017 at 3:24 PM, Simon Riggs <simon@2ndquadrant.com> wrote: > I'd give the view that we cannot silently ignore this issue, bearing > in mind the point that we're expecting partitioned tables to behave > exactly like normal tables. At the risk of repeating myself, I don't expect that, and I don't think it's a reasonable expectation. It's reasonable to expect partitioning to be notably better than inheritance (which I think it already is) and to provide a good base for future work (which I think it does), but I think getting them to behave exactly like normal tables (except for the things we want to be different) will take another ten years of development work. > In my understanding the issue is that UPDATEs will fail to update a > row when a valid row exists in the case where a row moved between > partitions; that behaviour will be different to a standard table. Right, when at READ COMMITTED and EvalPlanQual would have happened otherwise. > It is of course very good that we have something ready for this > release and can make a choice of what to do. > > Thoughts > > 1. Reuse the tuple state HEAP_MOVED_OFF which IIRC represent exactly > almost exactly the same thing. An UPDATE which gets to a > HEAP_MOVED_OFF tuple will know to re-find the tuple via the partition > metadata, or I might be persuaded that in-this-release it is > acceptable to fail when this occurs with an ERROR and a retryable > SQLCODE, since the UPDATE will succeed on next execution. I've got my doubts about whether we can make that bit work that way, considering that we still support pg_upgrade (possibly in multiple steps) from old releases that had VACUUM FULL. We really ought to put some work into reclaiming those old bits, but there's probably no time for that in v10. > 2. I know that DB2 handles this by having the user specify WITH ROW > MOVEMENT to explicitly indicate they accept the issue and want update > to work even with that. We could have an explicit option to allow > that. This appears to be the only way we could avoid silent errors for > foreign table partitions. Yeah, that's a thought. We could give people a choice between (a) updates that cause rows to move between partitions just fail and (b) such updates work but with EPQ-related deficiencies. I had previously thought that, given those two choices, everybody would like (b) better than (a), but maybe not. -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
Commits
-
Avoid referencing off the end of subplan_partition_offsets.
- 945f71db8452 11.0 landed
-
Allow UPDATE to move rows between partitions.
- 2f178441044b 11.0 landed
-
Remove useless lookup of root partitioned rel in ExecInitModifyTable().
- dca48d145e0e 11.0 cited
-
Factor error generation out of ExecPartitionCheck.
- 19c47e7c8202 11.0 landed
-
Minor preparatory refactoring for UPDATE row movement.
- ef6087ee5fa8 11.0 landed
-
Simplify and encapsulate tuple routing support code.
- cc6337d2fed5 11.0 landed
-
Avoid coercing a whole-row variable that is already coerced.
- 1c497fa72df7 11.0 landed
-
Use ResultRelInfo ** rather than ResultRelInfo * for tuple routing.
- 60f7c0abef03 11.0 landed
-
Make RelationGetPartitionDispatchInfo expand depth-first.
- 77b6b5e9ceca 11.0 cited
-
Expand partitioned tables in PartDesc order.
- 30833ba154e0 11.0 cited
-
Use a real RT index when setting up partition tuple routing.
- f81a91db4d1c 10.0 cited
-
Fix transition tables for partition/inheritance.
- 501ed02cf6f4 10.0 cited
-
Fix confusion about number of subplans in partitioned INSERT setup.
- 78a030a44196 10.0 cited
-
Prevent BEFORE triggers from violating partitioning constraints.
- 15ce775faa42 10.0 cited
-
Fire per-statement triggers on partitioned tables.
- e180c8aa8caf 10.0 cited
-
Fix reporting of violations in ExecConstraints, again.
- c0a8ae7be392 10.0 cited
-
Don't scan partitioned tables.
- d3cc37f1d801 10.0 cited
-
Allow FDWs to push down quals without breaking EvalPlanQual rechecks.
- 5fc4c26db512 9.6.0 cited