Re: UPDATE of partition key
Greg Stark <stark@mit.edu>
On 24 February 2017 at 14:57, David G. Johnston <david.g.johnston@gmail.com> wrote: > I dislike an error. I'd say that making partition "just work" here is > material for another patch. In this one an update of the partition key can > be documented as shorthand for delete-returning-insert with all the > limitations that go with that. If someone acceptably solves the ctid > following logic later it can be committed - I'm assuming there would be no > complaints to making things just work in a case where they only sorta > worked. Personally I don't think there's any hope that there will ever be cross-table ctids links. Maybe one day there will be a major new table storage format with very different capabilities than today but in the current architecture it seems like an impossible leap. I would expect everyone to come to terms with the basic idea that partition key updates are always going to be a corner case. The user defined the partition key and the docs should carefully explain to them the impact of that definition. As long as that explanation gives them something they can work with and manage the consequences of that's going to be fine. What I'm concerned about is that silently giving "wrong" answers in regular queries -- not even ones doing the partition key updates -- is something the user can't really manage. They have no way to rewrite the query to avoid the problem if some other user or part of their system is updating partition keys. They have no way to know the problem is even occurring. Just to spell it out -- it's not just "no-op updates" where the user sees 0 records updated. If I update all records where username='stark', perhaps to set the "user banned" flag and get back "9 records updated" and later find out that I missed a record because someone changed the department_id while my query was running -- how would I even know? How could I possibly rewrite my query to avoid that? The reason I suggested throwing a serialization failure was because I thought that would be the easiest short-cut to the problem. I had imagined having a bit pattern that indicated such a move would actually be a pretty minor change actually. I would actually consider using a normal update bitmask with InvalidBlockId in the ctid to indicate the tuple was updated and the target of the chain isn't available. That may be something we'll need in the future for other cases too. Throwing an error means the user has to retry their query but that's at least something they can do. Even if they don't do it automatically the ultimate user will probably just retry whatever operation errored out anyways. But at least their database isn't logically corrupted. -- greg
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