set_mod_stmt_from_original_statement_type.patch
text/x-diff
Filename: set_mod_stmt_from_original_statement_type.patch
Type: text/x-diff
Part: 0
Message:
Re: rule-related crash in v11
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/pl/plpgsql/src/pl_exec.c | 0 | 0 |
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index 1eb421b..ef013bc 100644
*** a/src/pl/plpgsql/src/pl_exec.c
--- b/src/pl/plpgsql/src/pl_exec.c
*************** exec_stmt_execsql(PLpgSQL_execstate *est
*** 4031,4049 ****
foreach(l, SPI_plan_get_plan_sources(expr->plan))
{
CachedPlanSource *plansource = (CachedPlanSource *) lfirst(l);
- ListCell *l2;
! foreach(l2, plansource->query_list)
{
! Query *q = lfirst_node(Query, l2);
!
! if (q->canSetTag)
! {
! if (q->commandType == CMD_INSERT ||
! q->commandType == CMD_UPDATE ||
! q->commandType == CMD_DELETE)
! stmt->mod_stmt = true;
! }
}
}
}
--- 4031,4050 ----
foreach(l, SPI_plan_get_plan_sources(expr->plan))
{
CachedPlanSource *plansource = (CachedPlanSource *) lfirst(l);
! /*
! * We could look at the raw_parse_tree, but it seems simpler to
! * check the command tag. Note we should *not* look at the Query
! * tree(s), since those are the result of rewriting and could have
! * been transmogrified into something else entirely.
! */
! if (plansource->commandTag &&
! (strcmp(plansource->commandTag, "INSERT") == 0 ||
! strcmp(plansource->commandTag, "UPDATE") == 0 ||
! strcmp(plansource->commandTag, "DELETE") == 0))
{
! stmt->mod_stmt = true;
! break;
}
}
}
*************** exec_stmt_execsql(PLpgSQL_execstate *est
*** 4108,4119 ****
break;
case SPI_OK_REWRITTEN:
- Assert(!stmt->mod_stmt);
/*
* The command was rewritten into another kind of command. It's
* not clear what FOUND would mean in that case (and SPI doesn't
! * return the row count either), so just set it to false.
*/
exec_set_found(estate, false);
break;
--- 4109,4120 ----
break;
case SPI_OK_REWRITTEN:
/*
* The command was rewritten into another kind of command. It's
* not clear what FOUND would mean in that case (and SPI doesn't
! * return the row count either), so just set it to false. Note
! * that we can't assert anything about mod_stmt here.
*/
exec_set_found(estate, false);
break;