Much of this code has been silly for a long time now and I think that it just got too silly to keep around.
There are exactly 4 kinds of executors that need target tables -- seqscan and the 3 DML operators: insert, update, and delete.
We have defined a way for specific executors to do specialized init processing -- that's the p_init method -- so what is code specific to these 4 classes doing here in the base class -- it should be moved down into p_init functions, even if that means defining some new ones. If we are concerned about duplicating code -- some of it is already duplicated here line by line for scan_node vs. oper_node -- then we could consider having an abstractoperationexecutor class to be the parent of delete/insert/update, but it's really not that much duplicated code  -- especially compared to the other executor boilerplate code.

Here's more silliness: as far as I can tell we initialize a plannode tree and then we build and init one executor tree from it so that executor nodes map one-to-one to plannodes, but we never build a second executor tree/node to share the same plan tree/node.
Yet, at the top of this function there are calls to ..._node->getTargetTable() that seem to expect that this init function may already have been called, because that's the only way setTargetTable could have been called to set the value. So, then we check if the target_table is null -- of COURSE it's null.  Then we fetch the target_table from the engine only to make sure it's not null (for an error that should never occur). If this error ever did occur, it would return a false value which gets propagated up through several callers to the jni or ipc call to updateCatalog where the cause of the error will be complete mystery unless someone happened to notice a VOLT_ERROR fly by -- isn't this kind of situation what fatal exceptions are for?  In any case, now that this code is dealing with the delegate, maybe the target_table is not worth fetching. Maybe you should instead have something stronger than an assert for the case of (tcd == NULL).

So, now let's look at what we do with the delegate (what we used to do with the target_table). We pass it from the executor to the plan node so that later the executor can ask for it back.  The plan node has no other use for it. So maybe the delegate pointer can just be stored as a member on the executor (subtypes) and we don't need to involve the plan node except to ask the target table name.