Re: UPDATE of partition key
Amit Khandekar <amitdkhan.pg@gmail.com>
On 21 September 2017 at 19:52, amul sul <sulamul@gmail.com> wrote: > On Wed, Sep 20, 2017 at 9:27 PM, Amit Khandekar <amitdkhan.pg@gmail.com> > wrote: >> >> On 20 September 2017 at 00:06, Robert Haas <robertmhaas@gmail.com> wrote: >> > On Fri, Sep 15, 2017 at 7:25 AM, Amit Khandekar <amitdkhan.pg@gmail.com> >> > wrote: >> >> [ new patch ] > > > 86 - (event == TRIGGER_EVENT_UPDATE && > !trigdesc->trig_update_after_row)) > 87 + (event == TRIGGER_EVENT_UPDATE && > !trigdesc->trig_update_after_row) || > 88 + (event == TRIGGER_EVENT_UPDATE && (oldtup == NULL || newtup > == NULL))) > 89 return; > 90 } > > > Either of oldtup or newtup will be valid at a time & vice versa. Can we > improve > this check accordingly? > > For e.g.: > (event == TRIGGER_EVENT_UPDATE && )(HeapTupleIsValid(oldtup) ^ > ItemPointerIsValid(newtup))))) Ok, I will be doing this as below : - (event == TRIGGER_EVENT_UPDATE && (oldtup == NULL || newtup == NULL))) + (event == TRIGGER_EVENT_UPDATE && ((oldtup == NULL) ^ (newtup == NULL)))) At other places in the function, oldtup and newtup are checked for NULL, so to be consistent, I haven't used HeapTupleIsValid. Actually, it won't happen that both oldtup and newtup are NULL ... in either of delete, insert, or update, but I haven't added an Assert for this, because that has been true even on HEAD. Will include the above minor change in the next patch when more changes come in. > > > 247 > 248 + /* > 249 + * EDB: In case this is part of update tuple routing, put this row > into the > 250 + * transition NEW TABLE if we are capturing transition tables. We > need to > 251 + * do this separately for DELETE and INSERT because they happen on > 252 + * different tables. > 253 + */ > 254 + if (mtstate->operation == CMD_UPDATE && > mtstate->mt_transition_capture) > 255 + ExecARUpdateTriggers(estate, resultRelInfo, NULL, > 256 + NULL, > 257 + tuple, > 258 + NULL, > 259 + mtstate->mt_transition_capture); > 260 + > 261 list_free(recheckIndexes); > > 267 > 268 + /* > 269 + * EDB: In case this is part of update tuple routing, put this row > into the > 270 + * transition OLD TABLE if we are capturing transition tables. We > need to > 271 + * do this separately for DELETE and INSERT because they happen on > 272 + * different tables. > 273 + */ > 274 + if (mtstate->operation == CMD_UPDATE && > mtstate->mt_transition_capture) > 275 + ExecARUpdateTriggers(estate, resultRelInfo, tupleid, > 276 + oldtuple, > 277 + NULL, > 278 + NULL, > 279 + mtstate->mt_transition_capture); > 280 + > > Initially, I wondered that why can't we have above code right after > ExecInsert() & ExecIDelete() in ExecUpdate respectively? > > We can do that for ExecIDelete() but not easily in the ExecInsert() case, > because ExecInsert() internally searches the correct partition's > resultRelInfo > for an insert and before returning to ExecUpdate resultRelInfo is restored > to the old one. That's why current logic seems to be reasonable for now. > Is there anything that we can do? Yes, resultRelInfo is different when we return from ExecInsert(). Also, I think the trigger and transition capture be done immediately after the rows are inserted. This is true for existing code also. Furthermore, there is a dependency of ExecARUpdateTriggers() on ExecARInsertTriggers(). transition_capture is passed NULL if we already captured the tuple in ExecARUpdateTriggers(). It looks simpler to do all this at a single place. -- Thanks, -Amit Khandekar EnterpriseDB Corporation The Postgres Database 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