@@ -297,7 +297,7 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
297
297
PartRelationInfo * prel ;
298
298
299
299
Node * node ;
300
- ListCell * lc ;
300
+ ListCell * lc , * lc2 ;
301
301
302
302
prel = (PartRelationInfo * )
303
303
hash_search (relations , (const void * ) & rte -> relid , HASH_FIND , 0 );
@@ -328,18 +328,24 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
328
328
329
329
/* copy restrictions */
330
330
childrel -> baserestrictinfo = NIL ;
331
- foreach (lc , wrappers )
331
+ forboth (lc , wrappers , lc2 , rel -> baserestrictinfo )
332
332
{
333
333
bool alwaysTrue ;
334
334
WrapperNode * wrap = (WrapperNode * ) lfirst (lc );
335
- Node * new_rinfo = wrapper_make_expression (wrap , index , & alwaysTrue );
335
+ Node * new_clause = wrapper_make_expression (wrap , index , & alwaysTrue );
336
+ RestrictInfo * new_rinfo ;
336
337
337
338
if (alwaysTrue )
338
339
continue ;
339
- Assert (new_rinfo );
340
+ Assert (new_clause );
341
+
342
+ /* TODO: evade double copy of clause */
343
+
344
+ new_rinfo = copyObject ((Node * ) lfirst (lc2 ));
345
+ new_rinfo -> clause = (Expr * )new_clause ;
340
346
341
347
/* replace old relids with new ones */
342
- change_varnos (new_rinfo , rel -> relid , childrel -> relid );
348
+ change_varnos (( Node * ) new_rinfo , rel -> relid , childrel -> relid );
343
349
344
350
childrel -> baserestrictinfo = lappend (childrel -> baserestrictinfo ,
345
351
new_rinfo );
@@ -380,20 +386,24 @@ wrapper_make_expression(WrapperNode *wrap, int index, bool *alwaysTrue)
380
386
if (expr -> boolop == OR_EXPR || expr -> boolop == AND_EXPR )
381
387
{
382
388
ListCell * lc ;
383
- List * args ;
389
+ List * args = NIL ;
384
390
385
391
foreach (lc , wrap -> args )
386
392
{
387
393
Node * arg ;
388
394
389
395
arg = wrapper_make_expression ((WrapperNode * )lfirst (lc ), index , alwaysTrue );
390
- Assert (!(* alwaysTrue ));
391
- Assert (arg || * alwaysTrue );
396
+ #ifdef USE_ASSERT_CHECKING
397
+ if (expr -> boolop == OR_EXPR )
398
+ Assert (!(* alwaysTrue ));
399
+ if (expr -> boolop == AND_EXPR )
400
+ Assert (arg || * alwaysTrue );
401
+ #endif
392
402
if (arg )
393
403
args = lappend (args , arg );
394
404
}
395
405
396
- Assert (list_length (args ) > 1 );
406
+ Assert (list_length (args ) >= 1 );
397
407
if (list_length (args ) == 1 )
398
408
return (Node * ) linitial (args );
399
409
0 commit comments