On Thu, Jun 22, 2017 at 11:23 AM, Craig Ringer <cr...@2ndquadrant.com> wrote:
> On 22 June 2017 at 16:05, Kang Yuzhe <tiggree...@gmail.com> wrote:
>> Dear PG hackers,
>>
>> First my apology if I appear to be a jerk or not following the policy.
>>
>> I emailed Boxuan Zhai who was  in charge of the SQL Merge keyword in
>> 2010 of GSoC but without reply.
>>
>> I want to apply merge_v201.patch to specific PG version.
>>
>> It failed saying 1 or 2 of 5 hunk failed.
>>
>> My question is:
>>  1. Given x old patch of PG, is it possible to know  to which PG
>> version can be applied?
>
> If it's produced by git-format-patch you can look at the git ref
> information in the patch. Otherwise you have to rely on what's in the
> email thread.

If you were having merge_v201.patch, how would you determine whether
it was produced by git-format-patch ow email thread?

I just downloaded the patch from GSoC site.

A code snippet from the merge_v201.patch is shown below:

diff --git a/src/backend/executor/nodeModifyTable.c
b/src/backend/executor/nodeModifyTable.c
index 8619ce3..e3ac758 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -582,6 +582,113 @@ lreplace:;
     return NULL;
 }

+static TupleTableSlot *
+MergeRaiseErr(void)
+{
+    elog(NOTICE, "one tuple is ERROR");
+    return NULL;
+}
+
+static TupleTableSlot *
+ExecMerge(ItemPointer tupleid,
+           TupleTableSlot *slot,
+           TupleTableSlot *planSlot,
+           MergeActionSet *actset,
+           EState *estate)
+{
+
+    TupleTableSlot *actslot = NULL;
+    ListCell *each;
+
+    /*
+     * Try the merge actions one by one until we have a match.
+     */
+    foreach(each, actset->actions)
+    {
+        ModifyTableState *mt_pstate;
+        MergeActionState *action_pstate;
+        ExprContext *econtext;
+        bool matched;
+
+        mt_pstate = (ModifyTableState *) lfirst(each);
+        Assert(IsA(mt_pstate, ModifyTableState));
+
+        /*
+         * mt_pstate is supposed to have only ONE mt_plans,
+         * which is a MergeActionState
+         */
+        action_pstate = (MergeActionState *) mt_pstate->mt_plans[0];
+        matched = ((MergeAction *)action_pstate->ps.plan)->matched;
+
+        /*
+         * If tupleid == NULL, it is a NOT MATCHED case,
+         * else, it is a MATCHED case,
+         */
+        if ((tupleid == NULL && matched) ||
+            (tupleid != NULL && !matched))
+            continue;
+
+        /* Setup the expression context. */
+        econtext = action_pstate->ps.ps_ExprContext;
+
+        /*
+         * Check that additional quals match, if any.
+         */
+        if (action_pstate->ps.qual)
+        {
+            ResetExprContext(econtext);
+
+            econtext->ecxt_scantuple = slot;
+            econtext->ecxt_outertuple = planSlot;
+
+            if (!ExecQual(action_pstate->ps.qual, econtext, false))
+                continue;
+        }
+
+        /* Ok, we have a match. Perform the action */
+
+        /* First project any RETURNING result tuple slot, if needed */
+        if (action_pstate->operation == CMD_INSERT ||
+            action_pstate->operation == CMD_UPDATE)
+            actslot = ExecProcessReturning(action_pstate->ps.ps_ProjInfo,
+                                           slot, planSlot);
+
+        switch (action_pstate->operation)
+        {
+            case CMD_INSERT:
+                return ExecInsert(actslot, planSlot, estate);
+
+            case CMD_UPDATE:
+                return ExecUpdate(tupleid,
+                                  actslot,
+                                  planSlot,
+                                  &mt_pstate->mt_epqstate,
+                                  estate);
+
+            case CMD_DELETE:
+                return ExecDelete(tupleid,
+                                  planSlot,
+                                  &mt_pstate->mt_epqstate,
+                                  estate);
+
+            case CMD_DONOTHING:
+                return NULL;
+
+            case CMD_RAISEERR:
+                return MergeRaiseErr();
+
+            default:
+                elog(ERROR, "unknown merge action type for excute");
+                break;
+        }
+    }
+
+    /*
+     * No matching action found. Perform the default action, which is
+     * RAISE ERROR.
+     */
+    return MergeRaiseErr();
+}



Now, is it possible to extract info from this code snippet whether it
was by git-format-patch or email thread?

Regards,
Zeray


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to