|
9 | 9 | *
|
10 | 10 | *
|
11 | 11 | * IDENTIFICATION
|
12 |
| - * $PostgreSQL: pgsql/src/backend/optimizer/util/predtest.c,v 1.24 2009/01/09 15:46:10 tgl Exp $ |
| 12 | + * $PostgreSQL: pgsql/src/backend/optimizer/util/predtest.c,v 1.25 2009/05/10 22:45:28 tgl Exp $ |
13 | 13 | *
|
14 | 14 | *-------------------------------------------------------------------------
|
15 | 15 | */
|
@@ -124,14 +124,31 @@ static void InvalidateOprProofCacheCallBack(Datum arg, int cacheid, ItemPointer
|
124 | 124 | bool
|
125 | 125 | predicate_implied_by(List *predicate_list, List *restrictinfo_list)
|
126 | 126 | {
|
| 127 | + Node *p, |
| 128 | + *r; |
| 129 | + |
127 | 130 | if (predicate_list == NIL)
|
128 | 131 | return true; /* no predicate: implication is vacuous */
|
129 | 132 | if (restrictinfo_list == NIL)
|
130 | 133 | return false; /* no restriction: implication must fail */
|
131 | 134 |
|
132 |
| - /* Otherwise, away we go ... */ |
133 |
| - return predicate_implied_by_recurse((Node *) restrictinfo_list, |
134 |
| - (Node *) predicate_list); |
| 135 | + /* |
| 136 | + * If either input is a single-element list, replace it with its lone |
| 137 | + * member; this avoids one useless level of AND-recursion. We only need |
| 138 | + * to worry about this at top level, since eval_const_expressions should |
| 139 | + * have gotten rid of any trivial ANDs or ORs below that. |
| 140 | + */ |
| 141 | + if (list_length(predicate_list) == 1) |
| 142 | + p = (Node *) linitial(predicate_list); |
| 143 | + else |
| 144 | + p = (Node *) predicate_list; |
| 145 | + if (list_length(restrictinfo_list) == 1) |
| 146 | + r = (Node *) linitial(restrictinfo_list); |
| 147 | + else |
| 148 | + r = (Node *) restrictinfo_list; |
| 149 | + |
| 150 | + /* And away we go ... */ |
| 151 | + return predicate_implied_by_recurse(r, p); |
135 | 152 | }
|
136 | 153 |
|
137 | 154 | /*
|
@@ -165,14 +182,31 @@ predicate_implied_by(List *predicate_list, List *restrictinfo_list)
|
165 | 182 | bool
|
166 | 183 | predicate_refuted_by(List *predicate_list, List *restrictinfo_list)
|
167 | 184 | {
|
| 185 | + Node *p, |
| 186 | + *r; |
| 187 | + |
168 | 188 | if (predicate_list == NIL)
|
169 | 189 | return false; /* no predicate: no refutation is possible */
|
170 | 190 | if (restrictinfo_list == NIL)
|
171 | 191 | return false; /* no restriction: refutation must fail */
|
172 | 192 |
|
173 |
| - /* Otherwise, away we go ... */ |
174 |
| - return predicate_refuted_by_recurse((Node *) restrictinfo_list, |
175 |
| - (Node *) predicate_list); |
| 193 | + /* |
| 194 | + * If either input is a single-element list, replace it with its lone |
| 195 | + * member; this avoids one useless level of AND-recursion. We only need |
| 196 | + * to worry about this at top level, since eval_const_expressions should |
| 197 | + * have gotten rid of any trivial ANDs or ORs below that. |
| 198 | + */ |
| 199 | + if (list_length(predicate_list) == 1) |
| 200 | + p = (Node *) linitial(predicate_list); |
| 201 | + else |
| 202 | + p = (Node *) predicate_list; |
| 203 | + if (list_length(restrictinfo_list) == 1) |
| 204 | + r = (Node *) linitial(restrictinfo_list); |
| 205 | + else |
| 206 | + r = (Node *) restrictinfo_list; |
| 207 | + |
| 208 | + /* And away we go ... */ |
| 209 | + return predicate_refuted_by_recurse(r, p); |
176 | 210 | }
|
177 | 211 |
|
178 | 212 | /*----------
|
|
0 commit comments