* Process an OR clause -- this can do a UNION between sets learned from child clauses */
| 2272 | * Process an OR clause -- this can do a UNION between sets learned from child clauses |
| 2273 | */ |
| 2274 | static PossibleValueSet |
| 2275 | ProcessOrClauseForPossibleValues( PredIterInfoData *clauseInfo, Node *clause, Node *variable, Oid opfamily) |
| 2276 | { |
| 2277 | PossibleValueSet result; |
| 2278 | InitPossibleValueSetData(&result); |
| 2279 | |
| 2280 | iterate_begin(child, clause, *clauseInfo) |
| 2281 | { |
| 2282 | PossibleValueSet childPossible = DeterminePossibleValueSet( child, variable, opfamily); |
| 2283 | if ( childPossible.isAnyValuePossible) |
| 2284 | { |
| 2285 | /* any value is possible for the entire AND */ |
| 2286 | DeletePossibleValueSetData( &childPossible ); |
| 2287 | DeletePossibleValueSetData( &result ); |
| 2288 | |
| 2289 | /* it can't improve once a part of the OR accepts all, so just quit */ |
| 2290 | result.isAnyValuePossible = true; |
| 2291 | break; |
| 2292 | } |
| 2293 | |
| 2294 | if ( result.isAnyValuePossible ) |
| 2295 | { |
| 2296 | /* first one in loop so just take it */ |
| 2297 | result = childPossible; |
| 2298 | } |
| 2299 | else |
| 2300 | { |
| 2301 | /* result.set OR childPossible.set --> do union into result */ |
| 2302 | AddUnmatchingValues( &result, &childPossible ); |
| 2303 | DeletePossibleValueSetData( &childPossible); |
| 2304 | } |
| 2305 | } |
| 2306 | iterate_end(*clauseInfo); |
| 2307 | |
| 2308 | return result; |
| 2309 | } |
| 2310 | |
| 2311 | |
| 2312 | /** |
no test coverage detected