@@ -52,6 +52,7 @@ typedef struct
5252
5353 /* params for handle_modification_query() */
5454 ParamListInfo query_params ;
55+ SubLink * parent_sublink ;
5556} transform_query_cxt ;
5657
5758
@@ -183,6 +184,20 @@ pathman_transform_query_walker(Node *node, void *context)
183184 if (node == NULL )
184185 return false;
185186
187+ else if (IsA (node , SubLink ))
188+ {
189+ transform_query_cxt * current_context = context ,
190+ next_context ;
191+
192+ /* Initialize next context for bottom subqueries */
193+ next_context = * current_context ;
194+ next_context .parent_sublink = (SubLink * ) node ;
195+
196+ return expression_tree_walker (node ,
197+ pathman_transform_query_walker ,
198+ (void * ) & next_context );
199+ }
200+
186201 else if (IsA (node , Query ))
187202 {
188203 Query * query = (Query * ) node ;
@@ -238,11 +253,17 @@ disable_standard_inheritance(Query *parse, transform_query_cxt *context)
238253 Index current_rti ; /* current range table entry index */
239254
240255#ifdef LEGACY_ROWMARKS_95
241- /* Don't process non-topmost non-select queries */
242- if (parse -> commandType != CMD_SELECT ||
243- TRANSFORM_CONTEXT_HAS_PARENT (context , UPDATE ) ||
244- TRANSFORM_CONTEXT_HAS_PARENT (context , DELETE ))
245- return ;
256+ /* Don't process non-SELECT queries */
257+ if (parse -> commandType != CMD_SELECT )
258+ return ;
259+
260+ /* Don't process queries under UPDATE or DELETE (except for CTEs) */
261+ if ((TRANSFORM_CONTEXT_HAS_PARENT (context , UPDATE ) ||
262+ TRANSFORM_CONTEXT_HAS_PARENT (context , DELETE )) &&
263+ (context -> parent_sublink &&
264+ context -> parent_sublink -> subselect == (Node * ) parse &&
265+ context -> parent_sublink -> subLinkType != CTE_SUBLINK ))
266+ return ;
246267#endif
247268
248269 /* Walk through RangeTblEntries list */
0 commit comments