|
8 | 8 | * |
9 | 9 | * |
10 | 10 | * IDENTIFICATION |
11 | | - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.75 2000/02/15 20:49:18 tgl Exp $ |
| 11 | + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.76 2000/02/21 01:13:04 tgl Exp $ |
12 | 12 | * |
13 | 13 | *------------------------------------------------------------------------- |
14 | 14 | */ |
@@ -291,30 +291,46 @@ union_planner(Query *parse, |
291 | 291 | /* Initial assumption is we need all the tuples */ |
292 | 292 | tuple_fraction=0.0; |
293 | 293 | /* |
294 | | - * Check for a LIMIT. |
295 | | - * |
296 | | - * For now, we deliberately ignore the OFFSET clause, so that |
297 | | - * queries with the same LIMIT and different OFFSETs will get |
298 | | - * the same queryplan and therefore generate consistent results |
299 | | - * (to the extent the planner can guarantee that, anyway). |
300 | | - * XXX Perhaps it would be better to use the OFFSET too, and tell |
301 | | - * users to specify ORDER BY if they want consistent results |
302 | | - * across different LIMIT queries. |
| 294 | + * Check for a LIMIT clause. |
303 | 295 | */ |
304 | 296 | if (parse->limitCount!=NULL) |
305 | 297 | { |
306 | 298 | if (IsA(parse->limitCount,Const)) |
307 | 299 | { |
308 | | -Const*ccount= (Const*)parse->limitCount; |
309 | | -tuple_fraction= (double) ((int) (ccount->constvalue)); |
310 | | -/* the constant can legally be either 0 ("ALL") or a |
311 | | - * positive integer; either is consistent with our |
312 | | - * conventions for tuple_fraction. |
| 300 | +Const*limitc= (Const*)parse->limitCount; |
| 301 | +intcount= (int) (limitc->constvalue); |
| 302 | + |
| 303 | +/* |
| 304 | + * The constant can legally be either 0 ("ALL") or a |
| 305 | + * positive integer. If it is not ALL, we also need |
| 306 | + * to consider the OFFSET part of LIMIT. |
313 | 307 | */ |
| 308 | +if (count>0) |
| 309 | +{ |
| 310 | +tuple_fraction= (double)count; |
| 311 | +if (parse->limitOffset!=NULL) |
| 312 | +{ |
| 313 | +if (IsA(parse->limitOffset,Const)) |
| 314 | +{ |
| 315 | +intoffset; |
| 316 | + |
| 317 | +limitc= (Const*)parse->limitOffset; |
| 318 | +offset= (int) (limitc->constvalue); |
| 319 | +if (offset>0) |
| 320 | +tuple_fraction+= (double)offset; |
| 321 | +} |
| 322 | +else |
| 323 | +{ |
| 324 | +/* It's a PARAM ... punt ... */ |
| 325 | +tuple_fraction=0.10; |
| 326 | +} |
| 327 | +} |
| 328 | +} |
314 | 329 | } |
315 | 330 | else |
316 | 331 | { |
317 | | -/* It's a PARAM ... don't know exactly what the limit |
| 332 | +/* |
| 333 | + * COUNT is a PARAM ... don't know exactly what the limit |
318 | 334 | * will be, but for lack of a better idea assume 10% |
319 | 335 | * of the plan's result is wanted. |
320 | 336 | */ |
|