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;
