All,

and this totally should have gone to -hackers instead, sorry about that.
Please ignore the one to -committers, if possible.

Tom, all,

* Tom Lane (t...@sss.pgh.pa.us) wrote:
> My vote would be to rename and reposition the field in HEAD and 9.5
> and accept the corresponding initdb.  We already forced an initdb
> since alpha2, so it's basically free as far as testers are concerned,
> and keeping 9.5 in sync with HEAD in this area seems like a really
> good idea for awhile to come.

Alright, attached is an attempt at doing these renames.  I went a bit
farther since it seemed to make sense to me (at least at the time, I'm
wondering a bit about it now), so, please provide any thoughts or
feedback you have regarding these changes.

Thanks!

Stephen
From 579dcfb80ffb922cabf10590219de221bb12267a Mon Sep 17 00:00:00 2001
From: Stephen Frost <sfr...@snowman.net>
Date: Thu, 24 Sep 2015 10:21:42 -0400
Subject: [PATCH] Rename withCheckOptions to insertedCheckClauses

CHECK clauses which are generated from the WITH CHECK OPTION being
specified on a view or from RLS WITH CHECK policies are always inserted
by the rewriter and therefore don't ever need to be persisted out on
disk for a given query.

This modifies outfuncs to no longer output the rewriter-added nodes for
a Query or a ModifyTable, and readfuncs to no longer read them in.

Further, rename 'withCheckOptions' in Query and ModifyTable to
'insertedCheckClauses', ExecWithCheckOption to ExecCheckClauses,
ri_WithCheckOptions and ri_WithCheckOptionExprs to
ri_InsertedCheckClauses and ri_InsertedCheckExprs, respectively, all to
make it clear that these are the check clauses which were added by the
rewriter, not the actual WITH CHECK OPTION indication for a view (which
is stored in reloptions for the view) nor the WITH CHECK expressions for
a policy (which are stored in pg_policy).

Requires a catversion bump.

Per discussion with Tom and Alvaro.

Backpatch to 9.5 since we're still in alpha.
---
 src/backend/executor/execMain.c           | 16 +++++------
 src/backend/executor/nodeModifyTable.c    | 45 +++++++++++++++----------------
 src/backend/nodes/copyfuncs.c             |  4 +--
 src/backend/nodes/equalfuncs.c            |  2 +-
 src/backend/nodes/nodeFuncs.c             |  4 +--
 src/backend/nodes/outfuncs.c              |  2 --
 src/backend/nodes/readfuncs.c             | 21 ---------------
 src/backend/optimizer/plan/createplan.c   |  8 +++---
 src/backend/optimizer/plan/planner.c      | 42 +++++++++++++++++------------
 src/backend/optimizer/plan/setrefs.c      |  4 +--
 src/backend/optimizer/prep/prepsecurity.c |  2 +-
 src/backend/rewrite/rewriteHandler.c      | 37 ++++++++++++-------------
 src/backend/rewrite/rowsecurity.c         | 28 +++++++++----------
 src/include/executor/executor.h           |  2 +-
 src/include/nodes/execnodes.h             |  8 +++---
 src/include/nodes/parsenodes.h            |  8 ++++--
 src/include/nodes/plannodes.h             |  2 +-
 src/include/optimizer/planmain.h          |  2 +-
 src/include/rewrite/rowsecurity.h         |  2 +-
 19 files changed, 114 insertions(+), 125 deletions(-)

diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 85ff46b..d344b09 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -1738,17 +1738,17 @@ ExecConstraints(ResultRelInfo *resultRelInfo,
 }
 
 /*
- * ExecWithCheckOptions -- check that tuple satisfies any WITH CHECK OPTIONs
+ * ExecCheckClauses -- check that tuple satisfies any inserted CHECK clauses,
  * of the specified kind.
  *
  * Note that this needs to be called multiple times to ensure that all kinds of
- * WITH CHECK OPTIONs are handled (both those from views which have the WITH
- * CHECK OPTION set and from row level security policies).  See ExecInsert()
- * and ExecUpdate().
+ * CHECK clauses are handled (both those from views which have the WITH CHECK
+ * OPTION set and from row level security policies).  See ExecInsert() and
+ * ExecUpdate().
  */
 void
-ExecWithCheckOptions(WCOKind kind, ResultRelInfo *resultRelInfo,
-					 TupleTableSlot *slot, EState *estate)
+ExecCheckClauses(WCOKind kind, ResultRelInfo *resultRelInfo,
+				 TupleTableSlot *slot, EState *estate)
 {
 	Relation	rel = resultRelInfo->ri_RelationDesc;
 	TupleDesc	tupdesc = RelationGetDescr(rel);
@@ -1766,8 +1766,8 @@ ExecWithCheckOptions(WCOKind kind, ResultRelInfo *resultRelInfo,
 	econtext->ecxt_scantuple = slot;
 
 	/* Check each of the constraints */
-	forboth(l1, resultRelInfo->ri_WithCheckOptions,
-			l2, resultRelInfo->ri_WithCheckOptionExprs)
+	forboth(l1, resultRelInfo->ri_InsertedCheckClauses,
+			l2, resultRelInfo->ri_InsertedCheckClauseExprs)
 	{
 		WithCheckOption *wco = (WithCheckOption *) lfirst(l1);
 		ExprState  *wcoExpr = (ExprState *) lfirst(l2);
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 1ef76d0..a310299 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -321,12 +321,11 @@ ExecInsert(ModifyTableState *mtstate,
 		/*
 		 * Check any RLS INSERT WITH CHECK policies
 		 *
-		 * ExecWithCheckOptions() will skip any WCOs which are not of the kind
+		 * ExecCheckClauses() will skip any WCOs which are not of the kind
 		 * we are looking for at this point.
 		 */
-		if (resultRelInfo->ri_WithCheckOptions != NIL)
-			ExecWithCheckOptions(WCO_RLS_INSERT_CHECK,
-								 resultRelInfo, slot, estate);
+		if (resultRelInfo->ri_InsertedCheckClauses != NIL)
+			ExecCheckClauses(WCO_RLS_INSERT_CHECK, resultRelInfo, slot, estate);
 
 		/*
 		 * Check the constraints of the tuple
@@ -479,14 +478,14 @@ ExecInsert(ModifyTableState *mtstate,
 	 * violations per the SQL spec, so we do it after actually inserting the
 	 * record into the heap and all indexes.
 	 *
-	 * ExecWithCheckOptions will elog(ERROR) if a violation is found, so the
+	 * ExecCheckClauses will elog(ERROR) if a violation is found, so the
 	 * tuple will never be seen, if it violates the WITH CHECK OPTION.
 	 *
-	 * ExecWithCheckOptions() will skip any WCOs which are not of the kind we
+	 * ExecCheckClauses() will skip any WCOs which are not of the kind we
 	 * are looking for at this point.
 	 */
-	if (resultRelInfo->ri_WithCheckOptions != NIL)
-		ExecWithCheckOptions(WCO_VIEW_CHECK, resultRelInfo, slot, estate);
+	if (resultRelInfo->ri_InsertedCheckClauses != NIL)
+		ExecCheckClauses(WCO_VIEW_CHECK, resultRelInfo, slot, estate);
 
 	/* Process RETURNING if present */
 	if (resultRelInfo->ri_projectReturning)
@@ -858,13 +857,12 @@ ExecUpdate(ItemPointer tupleid,
 		 * triggers then trigger.c will have done heap_lock_tuple to lock the
 		 * correct tuple, so there's no need to do them again.)
 		 *
-		 * ExecWithCheckOptions() will skip any WCOs which are not of the kind
+		 * ExecCheckClauses() will skip any WCOs which are not of the kind
 		 * we are looking for at this point.
 		 */
 lreplace:;
-		if (resultRelInfo->ri_WithCheckOptions != NIL)
-			ExecWithCheckOptions(WCO_RLS_UPDATE_CHECK,
-								 resultRelInfo, slot, estate);
+		if (resultRelInfo->ri_InsertedCheckClauses != NIL)
+			ExecCheckClauses(WCO_RLS_UPDATE_CHECK, resultRelInfo, slot, estate);
 
 		/*
 		 * Check the constraints of the tuple
@@ -993,11 +991,11 @@ lreplace:;
 	 * violations per the SQL spec, so we do it after actually updating the
 	 * record in the heap and all indexes.
 	 *
-	 * ExecWithCheckOptions() will skip any WCOs which are not of the kind we
+	 * ExecCheckClauses() will skip any WCOs which are not of the kind we
 	 * are looking for at this point.
 	 */
-	if (resultRelInfo->ri_WithCheckOptions != NIL)
-		ExecWithCheckOptions(WCO_VIEW_CHECK, resultRelInfo, slot, estate);
+	if (resultRelInfo->ri_InsertedCheckClauses != NIL)
+		ExecCheckClauses(WCO_VIEW_CHECK, resultRelInfo, slot, estate);
 
 	/* Process RETURNING if present */
 	if (resultRelInfo->ri_projectReturning)
@@ -1156,7 +1154,7 @@ ExecOnConflictUpdate(ModifyTableState *mtstate,
 		return true;			/* done with the tuple */
 	}
 
-	if (resultRelInfo->ri_WithCheckOptions != NIL)
+	if (resultRelInfo->ri_InsertedCheckClauses != NIL)
 	{
 		/*
 		 * Check target's existing tuple against UPDATE-applicable USING
@@ -1173,9 +1171,9 @@ ExecOnConflictUpdate(ModifyTableState *mtstate,
 		 * kinds, so there is no danger of spurious over-enforcement in the
 		 * INSERT or UPDATE path.
 		 */
-		ExecWithCheckOptions(WCO_RLS_CONFLICT_CHECK, resultRelInfo,
-							 mtstate->mt_existing,
-							 mtstate->ps.state);
+		ExecCheckClauses(WCO_RLS_CONFLICT_CHECK, resultRelInfo,
+						 mtstate->mt_existing,
+						 mtstate->ps.state);
 	}
 
 	/* Project the new tuple version */
@@ -1570,11 +1568,12 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 	estate->es_result_relation_info = saved_resultRelInfo;
 
 	/*
-	 * Initialize any WITH CHECK OPTION constraints if needed.
+	 * Initialize any inserted CHECK clauses (which would have come from
+	 * view WITH CHECK OPTION constraints or RLS), if needed.
 	 */
 	resultRelInfo = mtstate->resultRelInfo;
 	i = 0;
-	foreach(l, node->withCheckOptionLists)
+	foreach(l, node->insertedCheckClauses)
 	{
 		List	   *wcoList = (List *) lfirst(l);
 		List	   *wcoExprs = NIL;
@@ -1589,8 +1588,8 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 			wcoExprs = lappend(wcoExprs, wcoExpr);
 		}
 
-		resultRelInfo->ri_WithCheckOptions = wcoList;
-		resultRelInfo->ri_WithCheckOptionExprs = wcoExprs;
+		resultRelInfo->ri_InsertedCheckClauses = wcoList;
+		resultRelInfo->ri_InsertedCheckClauseExprs = wcoExprs;
 		resultRelInfo++;
 		i++;
 	}
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 62355aa..3fbf21a 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -181,7 +181,6 @@ _copyModifyTable(const ModifyTable *from)
 	COPY_NODE_FIELD(resultRelations);
 	COPY_SCALAR_FIELD(resultRelIndex);
 	COPY_NODE_FIELD(plans);
-	COPY_NODE_FIELD(withCheckOptionLists);
 	COPY_NODE_FIELD(returningLists);
 	COPY_NODE_FIELD(fdwPrivLists);
 	COPY_NODE_FIELD(rowMarks);
@@ -192,6 +191,7 @@ _copyModifyTable(const ModifyTable *from)
 	COPY_NODE_FIELD(onConflictWhere);
 	COPY_SCALAR_FIELD(exclRelRTI);
 	COPY_NODE_FIELD(exclRelTlist);
+	COPY_NODE_FIELD(insertedCheckClauses);
 
 	return newnode;
 }
@@ -2702,7 +2702,6 @@ _copyQuery(const Query *from)
 	COPY_NODE_FIELD(rtable);
 	COPY_NODE_FIELD(jointree);
 	COPY_NODE_FIELD(targetList);
-	COPY_NODE_FIELD(withCheckOptions);
 	COPY_NODE_FIELD(onConflict);
 	COPY_NODE_FIELD(returningList);
 	COPY_NODE_FIELD(groupClause);
@@ -2716,6 +2715,7 @@ _copyQuery(const Query *from)
 	COPY_NODE_FIELD(rowMarks);
 	COPY_NODE_FIELD(setOperations);
 	COPY_NODE_FIELD(constraintDeps);
+	COPY_NODE_FIELD(insertedCheckClauses);
 
 	return newnode;
 }
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 8f16833..fd1a074 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -906,7 +906,6 @@ _equalQuery(const Query *a, const Query *b)
 	COMPARE_NODE_FIELD(rtable);
 	COMPARE_NODE_FIELD(jointree);
 	COMPARE_NODE_FIELD(targetList);
-	COMPARE_NODE_FIELD(withCheckOptions);
 	COMPARE_NODE_FIELD(onConflict);
 	COMPARE_NODE_FIELD(returningList);
 	COMPARE_NODE_FIELD(groupClause);
@@ -920,6 +919,7 @@ _equalQuery(const Query *a, const Query *b)
 	COMPARE_NODE_FIELD(rowMarks);
 	COMPARE_NODE_FIELD(setOperations);
 	COMPARE_NODE_FIELD(constraintDeps);
+	COMPARE_NODE_FIELD(insertedCheckClauses);
 
 	return true;
 }
diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c
index a11cb9f..521af70 100644
--- a/src/backend/nodes/nodeFuncs.c
+++ b/src/backend/nodes/nodeFuncs.c
@@ -2047,7 +2047,7 @@ query_tree_walker(Query *query,
 
 	if (walker((Node *) query->targetList, context))
 		return true;
-	if (walker((Node *) query->withCheckOptions, context))
+	if (walker((Node *) query->insertedCheckClauses, context))
 		return true;
 	if (walker((Node *) query->onConflict, context))
 		return true;
@@ -2853,7 +2853,7 @@ query_tree_mutator(Query *query,
 	}
 
 	MUTATE(query->targetList, query->targetList, List *);
-	MUTATE(query->withCheckOptions, query->withCheckOptions, List *);
+	MUTATE(query->insertedCheckClauses, query->insertedCheckClauses, List *);
 	MUTATE(query->onConflict, query->onConflict, OnConflictExpr *);
 	MUTATE(query->returningList, query->returningList, List *);
 	MUTATE(query->jointree, query->jointree, FromExpr *);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index c91273c..9a9855e 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -335,7 +335,6 @@ _outModifyTable(StringInfo str, const ModifyTable *node)
 	WRITE_NODE_FIELD(resultRelations);
 	WRITE_INT_FIELD(resultRelIndex);
 	WRITE_NODE_FIELD(plans);
-	WRITE_NODE_FIELD(withCheckOptionLists);
 	WRITE_NODE_FIELD(returningLists);
 	WRITE_NODE_FIELD(fdwPrivLists);
 	WRITE_NODE_FIELD(rowMarks);
@@ -2385,7 +2384,6 @@ _outQuery(StringInfo str, const Query *node)
 	WRITE_NODE_FIELD(rtable);
 	WRITE_NODE_FIELD(jointree);
 	WRITE_NODE_FIELD(targetList);
-	WRITE_NODE_FIELD(withCheckOptions);
 	WRITE_NODE_FIELD(onConflict);
 	WRITE_NODE_FIELD(returningList);
 	WRITE_NODE_FIELD(groupClause);
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 08519ed..5c82c42 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -244,7 +244,6 @@ _readQuery(void)
 	READ_NODE_FIELD(rtable);
 	READ_NODE_FIELD(jointree);
 	READ_NODE_FIELD(targetList);
-	READ_NODE_FIELD(withCheckOptions);
 	READ_NODE_FIELD(onConflict);
 	READ_NODE_FIELD(returningList);
 	READ_NODE_FIELD(groupClause);
@@ -292,23 +291,6 @@ _readDeclareCursorStmt(void)
 }
 
 /*
- * _readWithCheckOption
- */
-static WithCheckOption *
-_readWithCheckOption(void)
-{
-	READ_LOCALS(WithCheckOption);
-
-	READ_ENUM_FIELD(kind, WCOKind);
-	READ_STRING_FIELD(relname);
-	READ_STRING_FIELD(polname);
-	READ_NODE_FIELD(qual);
-	READ_BOOL_FIELD(cascaded);
-
-	READ_DONE();
-}
-
-/*
  * _readSortGroupClause
  */
 static SortGroupClause *
@@ -1466,7 +1448,6 @@ _readModifyTable(void)
 	READ_NODE_FIELD(resultRelations);
 	READ_INT_FIELD(resultRelIndex);
 	READ_NODE_FIELD(plans);
-	READ_NODE_FIELD(withCheckOptionLists);
 	READ_NODE_FIELD(returningLists);
 	READ_NODE_FIELD(fdwPrivLists);
 	READ_NODE_FIELD(rowMarks);
@@ -2180,8 +2161,6 @@ parseNodeString(void)
 
 	if (MATCH("QUERY", 5))
 		return_value = _readQuery();
-	else if (MATCH("WITHCHECKOPTION", 15))
-		return_value = _readWithCheckOption();
 	else if (MATCH("SORTGROUPCLAUSE", 15))
 		return_value = _readSortGroupClause();
 	else if (MATCH("GROUPINGSET", 11))
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index 404c6f5..1fc52de 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -4959,7 +4959,7 @@ make_modifytable(PlannerInfo *root,
 				 CmdType operation, bool canSetTag,
 				 Index nominalRelation,
 				 List *resultRelations, List *subplans,
-				 List *withCheckOptionLists, List *returningLists,
+				 List *insertedCheckClauses, List *returningLists,
 				 List *rowMarks, OnConflictExpr *onconflict, int epqParam)
 {
 	ModifyTable *node = makeNode(ModifyTable);
@@ -4971,8 +4971,8 @@ make_modifytable(PlannerInfo *root,
 	int			i;
 
 	Assert(list_length(resultRelations) == list_length(subplans));
-	Assert(withCheckOptionLists == NIL ||
-		   list_length(resultRelations) == list_length(withCheckOptionLists));
+	Assert(insertedCheckClauses == NIL ||
+		   list_length(resultRelations) == list_length(insertedCheckClauses));
 	Assert(returningLists == NIL ||
 		   list_length(resultRelations) == list_length(returningLists));
 
@@ -5036,7 +5036,7 @@ make_modifytable(PlannerInfo *root,
 		node->exclRelRTI = onconflict->exclRelIndex;
 		node->exclRelTlist = onconflict->exclRelTlist;
 	}
-	node->withCheckOptionLists = withCheckOptionLists;
+	node->insertedCheckClauses = insertedCheckClauses;
 	node->returningLists = returningLists;
 	node->rowMarks = rowMarks;
 	node->epqParam = epqParam;
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 06be922..f04b02e 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -378,7 +378,7 @@ subquery_planner(PlannerGlobal *glob, Query *parse,
 {
 	PlannerInfo *root;
 	Plan	   *plan;
-	List	   *newWithCheckOptions;
+	List	   *newCheckClauses;
 	List	   *newHaving;
 	bool		hasOuterJoins;
 	ListCell   *l;
@@ -508,17 +508,21 @@ subquery_planner(PlannerGlobal *glob, Query *parse,
 		preprocess_expression(root, (Node *) parse->targetList,
 							  EXPRKIND_TARGET);
 
-	newWithCheckOptions = NIL;
-	foreach(l, parse->withCheckOptions)
+	/*
+	 * Process any inserted CHECK clauses (built when WITH CHECK OPTION is
+	 * specified or RLS is used).
+	 */
+	newCheckClauses = NIL;
+	foreach(l, parse->insertedCheckClauses)
 	{
 		WithCheckOption *wco = (WithCheckOption *) lfirst(l);
 
 		wco->qual = preprocess_expression(root, wco->qual,
 										  EXPRKIND_QUAL);
 		if (wco->qual != NULL)
-			newWithCheckOptions = lappend(newWithCheckOptions, wco);
+			newCheckClauses = lappend(newCheckClauses, wco);
 	}
-	parse->withCheckOptions = newWithCheckOptions;
+	parse->insertedCheckClauses = newCheckClauses;
 
 	parse->returningList = (List *)
 		preprocess_expression(root, (Node *) parse->returningList,
@@ -677,18 +681,19 @@ subquery_planner(PlannerGlobal *glob, Query *parse,
 		/* If it's not SELECT, we need a ModifyTable node */
 		if (parse->commandType != CMD_SELECT)
 		{
-			List	   *withCheckOptionLists;
+			List	   *newCheckClausesList;
 			List	   *returningLists;
 			List	   *rowMarks;
 
 			/*
-			 * Set up the WITH CHECK OPTION and RETURNING lists-of-lists, if
+			 * Set up the inserted CHECK clauses (for when a view has WITH CHECK
+			 * specified or RLS is being used), and RETURNING lists-of-lists, if
 			 * needed.
 			 */
-			if (parse->withCheckOptions)
-				withCheckOptionLists = list_make1(parse->withCheckOptions);
+			if (parse->insertedCheckClauses)
+				newCheckClausesList = list_make1(parse->insertedCheckClauses);
 			else
-				withCheckOptionLists = NIL;
+				newCheckClausesList = NIL;
 
 			if (parse->returningList)
 				returningLists = list_make1(parse->returningList);
@@ -711,7 +716,7 @@ subquery_planner(PlannerGlobal *glob, Query *parse,
 											 parse->resultRelation,
 									   list_make1_int(parse->resultRelation),
 											 list_make1(plan),
-											 withCheckOptionLists,
+											 newCheckClausesList,
 											 returningLists,
 											 rowMarks,
 											 parse->onConflict,
@@ -909,7 +914,7 @@ inheritance_planner(PlannerInfo *root)
 	RelOptInfo **save_rel_array = NULL;
 	List	   *subplans = NIL;
 	List	   *resultRelations = NIL;
-	List	   *withCheckOptionLists = NIL;
+	List	   *insertedCheckClauses = NIL;
 	List	   *returningLists = NIL;
 	List	   *rowMarks;
 	ListCell   *lc;
@@ -1228,10 +1233,13 @@ inheritance_planner(PlannerInfo *root)
 		/* Build list of target-relation RT indexes */
 		resultRelations = lappend_int(resultRelations, appinfo->child_relid);
 
-		/* Build lists of per-relation WCO and RETURNING targetlists */
-		if (parse->withCheckOptions)
-			withCheckOptionLists = lappend(withCheckOptionLists,
-										   subroot.parse->withCheckOptions);
+		/*
+		 * Build lists of per-relation CHECK clauses (from views which have
+		 * WITH CHECK specified or if RLS is used) and RETURNING targetlists
+		 */
+		if (parse->insertedCheckClauses)
+			insertedCheckClauses = lappend(insertedCheckClauses,
+										   subroot.parse->insertedCheckClauses);
 		if (parse->returningList)
 			returningLists = lappend(returningLists,
 									 subroot.parse->returningList);
@@ -1283,7 +1291,7 @@ inheritance_planner(PlannerInfo *root)
 									 nominalRelation,
 									 resultRelations,
 									 subplans,
-									 withCheckOptionLists,
+									 insertedCheckClauses,
 									 returningLists,
 									 rowMarks,
 									 NULL,
diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c
index daeb584..b33cc96 100644
--- a/src/backend/optimizer/plan/setrefs.c
+++ b/src/backend/optimizer/plan/setrefs.c
@@ -710,8 +710,8 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset)
 				Assert(splan->plan.targetlist == NIL);
 				Assert(splan->plan.qual == NIL);
 
-				splan->withCheckOptionLists =
-					fix_scan_list(root, splan->withCheckOptionLists, rtoffset);
+				splan->insertedCheckClauses =
+					fix_scan_list(root, splan->insertedCheckClauses, rtoffset);
 
 				if (splan->returningLists)
 				{
diff --git a/src/backend/optimizer/prep/prepsecurity.c b/src/backend/optimizer/prep/prepsecurity.c
index c4b61df..ba65ebb 100644
--- a/src/backend/optimizer/prep/prepsecurity.c
+++ b/src/backend/optimizer/prep/prepsecurity.c
@@ -138,7 +138,7 @@ expand_security_quals(PlannerInfo *root, List *tlist)
 			ChangeVarNodes((Node *) parse->returningList, rt_index,
 						   parse->resultRelation, 0);
 
-			ChangeVarNodes((Node *) parse->withCheckOptions, rt_index,
+			ChangeVarNodes((Node *) parse->insertedCheckClauses, rt_index,
 						   parse->resultRelation, 0);
 		}
 
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index 1b8e7b0..6867372 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -1770,7 +1770,7 @@ fireRIRrules(Query *parsetree, List *activeRIRs, bool forUpdatePushedDown)
 		RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc);
 		Relation	rel;
 		List	   *securityQuals;
-		List	   *withCheckOptions;
+		List	   *insertedCheckClauses;
 		bool		hasRowSecurity;
 		bool		hasSubLinks;
 
@@ -1787,10 +1787,10 @@ fireRIRrules(Query *parsetree, List *activeRIRs, bool forUpdatePushedDown)
 		 * Fetch any new security quals that must be applied to this RTE.
 		 */
 		get_row_security_policies(parsetree, rte, rt_index,
-								  &securityQuals, &withCheckOptions,
+								  &securityQuals, &insertedCheckClauses,
 								  &hasRowSecurity, &hasSubLinks);
 
-		if (securityQuals != NIL || withCheckOptions != NIL)
+		if (securityQuals != NIL || insertedCheckClauses != NIL)
 		{
 			if (hasSubLinks)
 			{
@@ -1810,15 +1810,16 @@ fireRIRrules(Query *parsetree, List *activeRIRs, bool forUpdatePushedDown)
 
 				/*
 				 * get_row_security_policies just passed back securityQuals
-				 * and/or withCheckOptions, and there were SubLinks, make sure
-				 * we lock any relations which are referenced.
+				 * and/or insertedCheckClauses, and there were SubLinks, make
+				 * sure we lock any relations which are referenced.
 				 *
 				 * These locks would normally be acquired by the parser, but
-				 * securityQuals and withCheckOptions are added post-parsing.
+				 * securityQuals and insertedCheckClauses are added
+				 * post-parsing.
 				 */
 				context.for_execute = true;
 				(void) acquireLocksOnSubLinks((Node *) securityQuals, &context);
-				(void) acquireLocksOnSubLinks((Node *) withCheckOptions,
+				(void) acquireLocksOnSubLinks((Node *) insertedCheckClauses,
 											  &context);
 
 				/*
@@ -1828,7 +1829,7 @@ fireRIRrules(Query *parsetree, List *activeRIRs, bool forUpdatePushedDown)
 				expression_tree_walker((Node *) securityQuals,
 									   fireRIRonSubLink, (void *) activeRIRs);
 
-				expression_tree_walker((Node *) withCheckOptions,
+				expression_tree_walker((Node *) insertedCheckClauses,
 									   fireRIRonSubLink, (void *) activeRIRs);
 
 				activeRIRs = list_delete_first(activeRIRs);
@@ -1843,8 +1844,8 @@ fireRIRrules(Query *parsetree, List *activeRIRs, bool forUpdatePushedDown)
 			rte->securityQuals = list_concat(securityQuals,
 											 rte->securityQuals);
 
-			parsetree->withCheckOptions = list_concat(withCheckOptions,
-												parsetree->withCheckOptions);
+			parsetree->insertedCheckClauses = list_concat(insertedCheckClauses,
+											   parsetree->insertedCheckClauses);
 		}
 
 		/*
@@ -2983,7 +2984,7 @@ rewriteTargetView(Query *parsetree, Relation view)
 	/*
 	 * For INSERT/UPDATE, if the view has the WITH CHECK OPTION, or any parent
 	 * view specified WITH CASCADED CHECK OPTION, add the quals from the view
-	 * to the query's withCheckOptions list.
+	 * to the query's insertedCheckClauses list.
 	 */
 	if (parsetree->commandType != CMD_DELETE)
 	{
@@ -2994,14 +2995,14 @@ rewriteTargetView(Query *parsetree, Relation view)
 		 * If the parent view has a cascaded check option, treat this view as
 		 * if it also had a cascaded check option.
 		 *
-		 * New WithCheckOptions are added to the start of the list, so if
-		 * there is a cascaded check option, it will be the first item in the
-		 * list.
+		 * New WithCheckOptions are added to the start of the
+		 * insertedCheckClauses list, so if there is a cascaded check option,
+		 * it will be the first item in the list.
 		 */
-		if (parsetree->withCheckOptions != NIL)
+		if (parsetree->insertedCheckClauses != NIL)
 		{
 			WithCheckOption *parent_wco =
-			(WithCheckOption *) linitial(parsetree->withCheckOptions);
+			(WithCheckOption *) linitial(parsetree->insertedCheckClauses);
 
 			if (parent_wco->cascaded)
 			{
@@ -3030,8 +3031,8 @@ rewriteTargetView(Query *parsetree, Relation view)
 			wco->qual = NULL;
 			wco->cascaded = cascaded;
 
-			parsetree->withCheckOptions = lcons(wco,
-												parsetree->withCheckOptions);
+			parsetree->insertedCheckClauses = lcons(wco,
+											   parsetree->insertedCheckClauses);
 
 			if (viewquery->jointree->quals != NULL)
 			{
diff --git a/src/backend/rewrite/rowsecurity.c b/src/backend/rewrite/rowsecurity.c
index c20a178..42108af 100644
--- a/src/backend/rewrite/rowsecurity.c
+++ b/src/backend/rewrite/rowsecurity.c
@@ -77,7 +77,7 @@ static void add_with_check_options(Relation rel,
 								   WCOKind kind,
 								   List *permissive_policies,
 								   List *restrictive_policies,
-								   List **withCheckOptions,
+								   List **insertedCheckClauses,
 								   bool *hasSubLinks);
 
 static bool check_role_for_policy(ArrayType *policy_roles, Oid user_id);
@@ -104,7 +104,7 @@ row_security_policy_hook_type row_security_policy_hook_restrictive = NULL;
  */
 void
 get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index,
-						  List **securityQuals, List **withCheckOptions,
+						  List **securityQuals, List **insertedCheckClauses,
 						  bool *hasRowSecurity, bool *hasSubLinks)
 {
 	Oid			user_id;
@@ -116,7 +116,7 @@ get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index,
 
 	/* Defaults for the return values */
 	*securityQuals = NIL;
-	*withCheckOptions = NIL;
+	*insertedCheckClauses = NIL;
 	*hasRowSecurity = false;
 	*hasSubLinks = false;
 
@@ -214,7 +214,7 @@ get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index,
 	}
 
 	/*
-	 * For INSERT and UPDATE, add withCheckOptions to verify that any new
+	 * For INSERT and UPDATE, add insertedCheckClauses to verify that any new
 	 * records added are consistent with the security policies.  This will use
 	 * each policy's WITH CHECK clause, or its USING clause if no explicit
 	 * WITH CHECK clause is defined.
@@ -229,7 +229,7 @@ get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index,
 							   WCO_RLS_INSERT_CHECK : WCO_RLS_UPDATE_CHECK,
 							   permissive_policies,
 							   restrictive_policies,
-							   withCheckOptions,
+							   insertedCheckClauses,
 							   hasSubLinks);
 
 		/*
@@ -257,7 +257,7 @@ get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index,
 								   WCO_RLS_CONFLICT_CHECK,
 								   conflict_permissive_policies,
 								   conflict_restrictive_policies,
-								   withCheckOptions,
+								   insertedCheckClauses,
 								   hasSubLinks);
 
 			/*
@@ -276,7 +276,7 @@ get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index,
 									   WCO_RLS_CONFLICT_CHECK,
 									   conflict_returning_permissive_policies,
 									   conflict_returning_restrictive_policies,
-									   withCheckOptions,
+									   insertedCheckClauses,
 									   hasSubLinks);
 			}
 
@@ -285,7 +285,7 @@ get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index,
 								   WCO_RLS_UPDATE_CHECK,
 								   conflict_permissive_policies,
 								   conflict_restrictive_policies,
-								   withCheckOptions,
+								   insertedCheckClauses,
 								   hasSubLinks);
 		}
 	}
@@ -565,8 +565,8 @@ add_security_quals(int rt_index,
  * a WCO_RLS_CONFLICT_CHECK WithCheckOption, which always uses the USING
  * clauses from RLS policies.
  *
- * New WCOs are added to withCheckOptions, and hasSubLinks is set to true if
- * any of the check clauses added contain sublink subqueries.
+ * New WCOs are added to insertedCheckClauses, and hasSubLinks is set to true
+ * if any of the check clauses added contain sublink subqueries.
  */
 static void
 add_with_check_options(Relation rel,
@@ -574,7 +574,7 @@ add_with_check_options(Relation rel,
 					   WCOKind kind,
 					   List *permissive_policies,
 					   List *restrictive_policies,
-					   List **withCheckOptions,
+					   List **insertedCheckClauses,
 					   bool *hasSubLinks)
 {
 	ListCell   *item;
@@ -631,7 +631,7 @@ add_with_check_options(Relation rel,
 
 		ChangeVarNodes(wco->qual, 1, rt_index, 0);
 
-		*withCheckOptions = lappend(*withCheckOptions, wco);
+		*insertedCheckClauses = lappend(*insertedCheckClauses, wco);
 
 		/*
 		 * Now add WithCheckOptions for each of the restrictive policy clauses
@@ -657,7 +657,7 @@ add_with_check_options(Relation rel,
 				wco->qual = (Node *) qual;
 				wco->cascaded = false;
 
-				*withCheckOptions = lappend(*withCheckOptions, wco);
+				*insertedCheckClauses = lappend(*insertedCheckClauses, wco);
 				*hasSubLinks |= policy->hassublinks;
 			}
 		}
@@ -679,7 +679,7 @@ add_with_check_options(Relation rel,
 									   false, true);
 		wco->cascaded = false;
 
-		*withCheckOptions = lappend(*withCheckOptions, wco);
+		*insertedCheckClauses = lappend(*insertedCheckClauses, wco);
 	}
 }
 
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index 226f905..2363b8a 100644
--- a/src/include/executor/executor.h
+++ b/src/include/executor/executor.h
@@ -193,7 +193,7 @@ extern ResultRelInfo *ExecGetTriggerResultRel(EState *estate, Oid relid);
 extern bool ExecContextForcesOids(PlanState *planstate, bool *hasoids);
 extern void ExecConstraints(ResultRelInfo *resultRelInfo,
 				TupleTableSlot *slot, EState *estate);
-extern void ExecWithCheckOptions(WCOKind kind, ResultRelInfo *resultRelInfo,
+extern void ExecCheckClauses(WCOKind kind, ResultRelInfo *resultRelInfo,
 					 TupleTableSlot *slot, EState *estate);
 extern LockTupleMode ExecUpdateLockMode(EState *estate, ResultRelInfo *relinfo);
 extern ExecRowMark *ExecFindRowMark(EState *estate, Index rti, bool missing_ok);
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index 4ae2f3e..cbf4896 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -311,8 +311,8 @@ typedef struct JunkFilter
  *		TrigInstrument			optional runtime measurements for triggers
  *		FdwRoutine				FDW callback functions, if foreign table
  *		FdwState				available to save private state of FDW
- *		WithCheckOptions		list of WithCheckOption's to be checked
- *		WithCheckOptionExprs	list of WithCheckOption expr states
+ *		InsertedCheckClauses	list of WithCheckOption's to be checked
+ *		InsertedCheckClauseExprs	list of WithCheckOption expr states
  *		ConstraintExprs			array of constraint-checking expr states
  *		junkFilter				for removing junk attributes from tuples
  *		projectReturning		for computing a RETURNING list
@@ -334,8 +334,8 @@ typedef struct ResultRelInfo
 	Instrumentation *ri_TrigInstrument;
 	struct FdwRoutine *ri_FdwRoutine;
 	void	   *ri_FdwState;
-	List	   *ri_WithCheckOptions;
-	List	   *ri_WithCheckOptionExprs;
+	List	   *ri_InsertedCheckClauses;
+	List	   *ri_InsertedCheckClauseExprs;
 	List	  **ri_ConstraintExprs;
 	JunkFilter *ri_junkFilter;
 	ProjectionInfo *ri_projectReturning;
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 770866a..fe8597e 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -130,8 +130,6 @@ typedef struct Query
 
 	List	   *targetList;		/* target list (of TargetEntry) */
 
-	List	   *withCheckOptions;		/* a list of WithCheckOption's */
-
 	OnConflictExpr *onConflict; /* ON CONFLICT DO [NOTHING | UPDATE] */
 
 	List	   *returningList;	/* return-values list (of TargetEntry) */
@@ -158,6 +156,12 @@ typedef struct Query
 
 	List	   *constraintDeps; /* a list of pg_constraint OIDs that the query
 								 * depends on to be semantically valid */
+
+	List	   *insertedCheckClauses;	/* a list of WithCheckOption's, which
+										 * are added during rewrite, therefore
+										 * not written out as part of Query by
+										 * outfuncs or read in by readfuncs */
+
 } Query;
 
 
diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h
index cc259f1..6d03f8d 100644
--- a/src/include/nodes/plannodes.h
+++ b/src/include/nodes/plannodes.h
@@ -179,7 +179,6 @@ typedef struct ModifyTable
 	List	   *resultRelations;	/* integer list of RT indexes */
 	int			resultRelIndex; /* index of first resultRel in plan's list */
 	List	   *plans;			/* plan(s) producing source data */
-	List	   *withCheckOptionLists;	/* per-target-table WCO lists */
 	List	   *returningLists; /* per-target-table RETURNING tlists */
 	List	   *fdwPrivLists;	/* per-target-table FDW private data lists */
 	List	   *rowMarks;		/* PlanRowMarks (non-locking only) */
@@ -190,6 +189,7 @@ typedef struct ModifyTable
 	Node	   *onConflictWhere;	/* WHERE for ON CONFLICT UPDATE */
 	Index		exclRelRTI;		/* RTI of the EXCLUDED pseudo relation */
 	List	   *exclRelTlist;	/* tlist of the EXCLUDED pseudo relation */
+	List	   *insertedCheckClauses;	/* per-target-table WCO lists */
 } ModifyTable;
 
 /* ----------------
diff --git a/src/include/optimizer/planmain.h b/src/include/optimizer/planmain.h
index 52b077a..f8c9de0 100644
--- a/src/include/optimizer/planmain.h
+++ b/src/include/optimizer/planmain.h
@@ -86,7 +86,7 @@ extern ModifyTable *make_modifytable(PlannerInfo *root,
 				 CmdType operation, bool canSetTag,
 				 Index nominalRelation,
 				 List *resultRelations, List *subplans,
-				 List *withCheckOptionLists, List *returningLists,
+				 List *insertedCheckClauses, List *returningLists,
 				 List *rowMarks, OnConflictExpr *onconflict, int epqParam);
 extern bool is_projection_capable_plan(Plan *plan);
 
diff --git a/src/include/rewrite/rowsecurity.h b/src/include/rewrite/rowsecurity.h
index 4af244d..62823b7 100644
--- a/src/include/rewrite/rowsecurity.h
+++ b/src/include/rewrite/rowsecurity.h
@@ -42,7 +42,7 @@ extern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_restri
 
 extern void get_row_security_policies(Query *root,
 						  RangeTblEntry *rte, int rt_index,
-						  List **securityQuals, List **withCheckOptions,
+						  List **securityQuals, List **insertedCheckClauses,
 						  bool *hasRowSecurity, bool *hasSubLinks);
 
 #endif   /* ROWSECURITY_H */
-- 
1.9.1

Attachment: signature.asc
Description: Digital signature

Reply via email to