plancat.c 26.6 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * plancat.c
4
 *	   routines for accessing the system catalogs
5 6
 *
 *
7
 * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
B
Add:  
Bruce Momjian 已提交
8
 * Portions Copyright (c) 1994, Regents of the University of California
9 10 11
 *
 *
 * IDENTIFICATION
12
 *	  $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.139 2008/01/01 19:45:50 momjian Exp $
13 14 15
 *
 *-------------------------------------------------------------------------
 */
16
#include "postgres.h"
17

18 19
#include <math.h>

B
Bruce Momjian 已提交
20 21
#include "access/genam.h"
#include "access/heapam.h"
22
#include "access/transam.h"
23
#include "catalog/pg_inherits.h"
24
#include "nodes/makefuncs.h"
25
#include "optimizer/clauses.h"
26
#include "optimizer/plancat.h"
27
#include "optimizer/predtest.h"
28
#include "optimizer/prep.h"
29
#include "parser/parse_expr.h"
30
#include "parser/parse_relation.h"
31
#include "parser/parsetree.h"
32
#include "rewrite/rewriteManip.h"
33
#include "utils/fmgroids.h"
34
#include "utils/lsyscache.h"
35
#include "utils/relcache.h"
36
#include "utils/syscache.h"
H
Hiroshi Inoue 已提交
37 38
#include "catalog/catalog.h"
#include "miscadmin.h"
39 40


41 42 43
/* GUC parameter */
bool		constraint_exclusion = false;

44 45 46
/* Hook for plugins to get control in get_relation_info() */
get_relation_info_hook_type get_relation_info_hook = NULL;

47

48
static void estimate_rel_size(Relation rel, int32 *attr_widths,
B
Bruce Momjian 已提交
49
				  BlockNumber *pages, double *tuples);
50
static List *get_relation_constraints(Oid relationObjectId, RelOptInfo *rel);
51 52


53
/*
54
 * get_relation_info -
55
 *	  Retrieves catalog information for a given relation.
56 57 58 59
 *
 * Given the Oid of the relation, return the following info into fields
 * of the RelOptInfo struct:
 *
60 61
 *	min_attr	lowest valid AttrNumber
 *	max_attr	highest valid AttrNumber
62 63 64
 *	indexlist	list of IndexOptInfos for relation's indexes
 *	pages		number of pages
 *	tuples		number of tuples
65 66 67 68
 *
 * Also, initialize the attr_needed[] and attr_widths[] arrays.  In most
 * cases these are left as zeroes, but sometimes we need to compute attr
 * widths here, and we may as well cache the results for costsize.c.
69 70 71 72 73
 *
 * If inhparent is true, all we need to do is set up the attr arrays:
 * the RelOptInfo actually represents the appendrel formed by an inheritance
 * tree, and so the parent rel's physical size and index information isn't
 * important for it.
74 75
 */
void
76 77
get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
				  RelOptInfo *rel)
78
{
79
	Index		varno = rel->relid;
80
	Relation	relation;
81 82
	bool		hasindex;
	List	   *indexinfos = NIL;
83

84
	/*
B
Bruce Momjian 已提交
85 86 87
	 * We need not lock the relation since it was already locked, either by
	 * the rewriter or when expand_inherited_rtentry() added it to the query's
	 * rangetable.
88
	 */
89
	relation = heap_open(relationObjectId, NoLock);
90

91 92
	rel->min_attr = FirstLowInvalidHeapAttributeNumber + 1;
	rel->max_attr = RelationGetNumberOfAttributes(relation);
93

94 95 96 97 98 99 100
	Assert(rel->max_attr >= rel->min_attr);
	rel->attr_needed = (Relids *)
		palloc0((rel->max_attr - rel->min_attr + 1) * sizeof(Relids));
	rel->attr_widths = (int32 *)
		palloc0((rel->max_attr - rel->min_attr + 1) * sizeof(int32));

	/*
101
	 * Estimate relation size --- unless it's an inheritance parent, in which
B
Bruce Momjian 已提交
102 103
	 * case the size will be computed later in set_append_rel_pathlist, and we
	 * must leave it zero for now to avoid bollixing the total_table_pages
104
	 * calculation.
105
	 */
106 107 108
	if (!inhparent)
		estimate_rel_size(relation, rel->attr_widths - rel->min_attr,
						  &rel->pages, &rel->tuples);
109

110
	/*
B
Bruce Momjian 已提交
111
	 * Make list of indexes.  Ignore indexes on system catalogs if told to.
112
	 * Don't bother with indexes for an inheritance parent, either.
113
	 */
114 115
	if (inhparent ||
		(IgnoreSystemIndexes && IsSystemClass(relation->rd_rel)))
116 117 118
		hasindex = false;
	else
		hasindex = relation->rd_rel->relhasindex;
119

120
	if (hasindex)
121
	{
122 123
		List	   *indexoidlist;
		ListCell   *l;
124
		LOCKMODE	lmode;
125

126
		indexoidlist = RelationGetIndexList(relation);
127

128 129 130 131 132 133 134 135 136 137 138 139 140
		/*
		 * For each index, we get the same type of lock that the executor will
		 * need, and do not release it.  This saves a couple of trips to the
		 * shared lock manager while not creating any real loss of
		 * concurrency, because no schema changes could be happening on the
		 * index while we hold lock on the parent rel, and neither lock type
		 * blocks any other kind of index operation.
		 */
		if (rel->relid == root->parse->resultRelation)
			lmode = RowExclusiveLock;
		else
			lmode = AccessShareLock;

141
		foreach(l, indexoidlist)
142
		{
143
			Oid			indexoid = lfirst_oid(l);
144 145 146
			Relation	indexRelation;
			Form_pg_index index;
			IndexOptInfo *info;
147
			int			ncolumns;
148 149
			int			i;

150 151 152
			/*
			 * Extract info from the relation descriptor for the index.
			 */
153
			indexRelation = index_open(indexoid, lmode);
154
			index = indexRelation->rd_index;
155

156 157
			/*
			 * Ignore invalid indexes, since they can't safely be used for
B
Bruce Momjian 已提交
158 159 160
			 * queries.  Note that this is OK because the data structure we
			 * are constructing is only used by the planner --- the executor
			 * still needs to insert into "invalid" indexes!
161 162 163 164 165 166 167
			 */
			if (!index->indisvalid)
			{
				index_close(indexRelation, NoLock);
				continue;
			}

168
			/*
B
Bruce Momjian 已提交
169 170 171
			 * If the index is valid, but cannot yet be used, ignore it; but
			 * mark the plan we are generating as transient. See
			 * src/backend/access/heap/README.HOT for discussion.
172 173 174 175 176 177 178 179 180 181
			 */
			if (index->indcheckxmin &&
				!TransactionIdPrecedes(HeapTupleHeaderGetXmin(indexRelation->rd_indextuple->t_data),
									   TransactionXmin))
			{
				root->glob->transientPlan = true;
				index_close(indexRelation, NoLock);
				continue;
			}

182 183 184
			info = makeNode(IndexOptInfo);

			info->indexoid = index->indexrelid;
185
			info->rel = rel;
186
			info->ncolumns = ncolumns = index->indnatts;
187

188
			/*
189
			 * Allocate per-column info arrays.  To save a few palloc cycles
B
Bruce Momjian 已提交
190
			 * we allocate all the Oid-type arrays in one request.	Note that
191 192
			 * the opfamily array needs an extra, terminating zero at the end.
			 * We pre-zero the ordering info in case the index is unordered.
193 194
			 */
			info->indexkeys = (int *) palloc(sizeof(int) * ncolumns);
195 196 197 198
			info->opfamily = (Oid *) palloc0(sizeof(Oid) * (4 * ncolumns + 1));
			info->opcintype = info->opfamily + (ncolumns + 1);
			info->fwdsortop = info->opcintype + ncolumns;
			info->revsortop = info->fwdsortop + ncolumns;
199
			info->nulls_first = (bool *) palloc0(sizeof(bool) * ncolumns);
200

201
			for (i = 0; i < ncolumns; i++)
202
			{
203
				info->indexkeys[i] = index->indkey.values[i];
204 205
				info->opfamily[i] = indexRelation->rd_opfamily[i];
				info->opcintype[i] = indexRelation->rd_opcintype[i];
206 207 208
			}

			info->relam = indexRelation->rd_rel->relam;
209 210
			info->amcostestimate = indexRelation->rd_am->amcostestimate;
			info->amoptionalkey = indexRelation->rd_am->amoptionalkey;
211
			info->amsearchnulls = indexRelation->rd_am->amsearchnulls;
212 213

			/*
B
Bruce Momjian 已提交
214
			 * Fetch the ordering operators associated with the index, if any.
215 216
			 * We expect that all ordering-capable indexes use btree's
			 * strategy numbers for the ordering operators.
217
			 */
218
			if (indexRelation->rd_am->amcanorder)
219
			{
220
				int			nstrat = indexRelation->rd_am->amstrategies;
221

222
				for (i = 0; i < ncolumns; i++)
223
				{
B
Bruce Momjian 已提交
224 225 226
					int16		opt = indexRelation->rd_indoption[i];
					int			fwdstrat;
					int			revstrat;
227 228 229

					if (opt & INDOPTION_DESC)
					{
230 231
						fwdstrat = BTGreaterStrategyNumber;
						revstrat = BTLessStrategyNumber;
232 233 234
					}
					else
					{
235 236
						fwdstrat = BTLessStrategyNumber;
						revstrat = BTGreaterStrategyNumber;
237
					}
B
Bruce Momjian 已提交
238

239
					/*
B
Bruce Momjian 已提交
240 241 242
					 * Index AM must have a fixed set of strategies for it to
					 * make sense to specify amcanorder, so we need not allow
					 * the case amstrategies == 0.
243 244 245 246 247 248 249 250 251 252 253 254
					 */
					if (fwdstrat > 0)
					{
						Assert(fwdstrat <= nstrat);
						info->fwdsortop[i] = indexRelation->rd_operator[i * nstrat + fwdstrat - 1];
					}
					if (revstrat > 0)
					{
						Assert(revstrat <= nstrat);
						info->revsortop[i] = indexRelation->rd_operator[i * nstrat + revstrat - 1];
					}
					info->nulls_first[i] = (opt & INDOPTION_NULLS_FIRST) != 0;
255 256
				}
			}
257

258 259 260
			/*
			 * Fetch the index expressions and predicate, if any.  We must
			 * modify the copies we obtain from the relcache to have the
B
Bruce Momjian 已提交
261 262
			 * correct varno for the parent relation, so that they match up
			 * correctly against qual clauses.
263 264 265 266 267 268 269
			 */
			info->indexprs = RelationGetIndexExpressions(indexRelation);
			info->indpred = RelationGetIndexPredicate(indexRelation);
			if (info->indexprs && varno != 1)
				ChangeVarNodes((Node *) info->indexprs, 1, varno, 0);
			if (info->indpred && varno != 1)
				ChangeVarNodes((Node *) info->indpred, 1, varno, 0);
B
Bruce Momjian 已提交
270
			info->predOK = false;		/* set later in indxpath.c */
271 272
			info->unique = index->indisunique;

273
			/*
B
Bruce Momjian 已提交
274 275 276 277 278
			 * Estimate the index size.  If it's not a partial index, we lock
			 * the number-of-tuples estimate to equal the parent table; if it
			 * is partial then we have to use the same methods as we would for
			 * a table, except we can be sure that the index is not larger
			 * than the table.
279 280 281 282 283 284 285 286 287 288 289 290 291 292
			 */
			if (info->indpred == NIL)
			{
				info->pages = RelationGetNumberOfBlocks(indexRelation);
				info->tuples = rel->tuples;
			}
			else
			{
				estimate_rel_size(indexRelation, NULL,
								  &info->pages, &info->tuples);
				if (info->tuples > rel->tuples)
					info->tuples = rel->tuples;
			}

293
			index_close(indexRelation, NoLock);
294 295 296 297

			indexinfos = lcons(info, indexinfos);
		}

298
		list_free(indexoidlist);
299
	}
300

301 302
	rel->indexlist = indexinfos;

303
	heap_close(relation, NoLock);
304 305 306 307 308 309 310 311

	/*
	 * Allow a plugin to editorialize on the info we obtained from the
	 * catalogs.  Actions might include altering the assumed relation size,
	 * removing an index, or adding a hypothetical index to the indexlist.
	 */
	if (get_relation_info_hook)
		(*get_relation_info_hook) (root, relationObjectId, inhparent, rel);
312 313
}

314 315 316 317 318 319 320 321 322 323 324
/*
 * estimate_rel_size - estimate # pages and # tuples in a table or index
 *
 * If attr_widths isn't NULL, it points to the zero-index entry of the
 * relation's attr_width[] cache; we fill this in if we have need to compute
 * the attribute widths for estimation purposes.
 */
static void
estimate_rel_size(Relation rel, int32 *attr_widths,
				  BlockNumber *pages, double *tuples)
{
B
Bruce Momjian 已提交
325 326
	BlockNumber curpages;
	BlockNumber relpages;
327 328 329 330 331 332 333 334 335
	double		reltuples;
	double		density;

	switch (rel->rd_rel->relkind)
	{
		case RELKIND_RELATION:
		case RELKIND_INDEX:
		case RELKIND_TOASTVALUE:
			/* it has storage, ok to call the smgr */
336 337 338 339
			curpages = RelationGetNumberOfBlocks(rel);

			/*
			 * HACK: if the relation has never yet been vacuumed, use a
B
Bruce Momjian 已提交
340 341 342 343 344 345 346 347 348 349
			 * minimum estimate of 10 pages.  This emulates a desirable aspect
			 * of pre-8.0 behavior, which is that we wouldn't assume a newly
			 * created relation is really small, which saves us from making
			 * really bad plans during initial data loading.  (The plans are
			 * not wrong when they are made, but if they are cached and used
			 * again after the table has grown a lot, they are bad.) It would
			 * be better to force replanning if the table size has changed a
			 * lot since the plan was made ... but we don't currently have any
			 * infrastructure for redoing cached plans at all, so we have to
			 * kluge things here instead.
350
			 *
351 352 353 354 355
			 * We approximate "never vacuumed" by "has relpages = 0", which
			 * means this will also fire on genuinely empty relations.	Not
			 * great, but fortunately that's a seldom-seen case in the real
			 * world, and it shouldn't degrade the quality of the plan too
			 * much anyway to err in this direction.
356 357 358 359 360 361
			 */
			if (curpages < 10 && rel->rd_rel->relpages == 0)
				curpages = 10;

			/* report estimated # pages */
			*pages = curpages;
362 363 364 365 366 367 368 369 370
			/* quick exit if rel is clearly empty */
			if (curpages == 0)
			{
				*tuples = 0;
				break;
			}
			/* coerce values in pg_class to more desirable types */
			relpages = (BlockNumber) rel->rd_rel->relpages;
			reltuples = (double) rel->rd_rel->reltuples;
B
Bruce Momjian 已提交
371

372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
			/*
			 * If it's an index, discount the metapage.  This is a kluge
			 * because it assumes more than it ought to about index contents;
			 * it's reasonably OK for btrees but a bit suspect otherwise.
			 */
			if (rel->rd_rel->relkind == RELKIND_INDEX &&
				relpages > 0)
			{
				curpages--;
				relpages--;
			}
			/* estimate number of tuples from previous tuple density */
			if (relpages > 0)
				density = reltuples / (double) relpages;
			else
			{
				/*
				 * When we have no data because the relation was truncated,
				 * estimate tuple width from attribute datatypes.  We assume
				 * here that the pages are completely full, which is OK for
B
Bruce Momjian 已提交
392 393
				 * tables (since they've presumably not been VACUUMed yet) but
				 * is probably an overestimate for indexes.  Fortunately
394 395
				 * get_relation_info() can clamp the overestimate to the
				 * parent table's size.
396 397
				 *
				 * Note: this code intentionally disregards alignment
B
Bruce Momjian 已提交
398 399 400 401
				 * considerations, because (a) that would be gilding the lily
				 * considering how crude the estimate is, and (b) it creates
				 * platform dependencies in the default plans which are kind
				 * of a headache for regression testing.
402
				 */
B
Bruce Momjian 已提交
403 404
				int32		tuple_width = 0;
				int			i;
405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424

				for (i = 1; i <= RelationGetNumberOfAttributes(rel); i++)
				{
					Form_pg_attribute att = rel->rd_att->attrs[i - 1];
					int32		item_width;

					if (att->attisdropped)
						continue;
					/* This should match set_rel_width() in costsize.c */
					item_width = get_attavgwidth(RelationGetRelid(rel), i);
					if (item_width <= 0)
					{
						item_width = get_typavgwidth(att->atttypid,
													 att->atttypmod);
						Assert(item_width > 0);
					}
					if (attr_widths != NULL)
						attr_widths[i] = item_width;
					tuple_width += item_width;
				}
425
				tuple_width += sizeof(HeapTupleHeaderData);
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444
				tuple_width += sizeof(ItemPointerData);
				/* note: integer division is intentional here */
				density = (BLCKSZ - sizeof(PageHeaderData)) / tuple_width;
			}
			*tuples = rint(density * (double) curpages);
			break;
		case RELKIND_SEQUENCE:
			/* Sequences always have a known size */
			*pages = 1;
			*tuples = 1;
			break;
		default:
			/* else it has no disk storage; probably shouldn't get here? */
			*pages = 0;
			*tuples = 0;
			break;
	}
}

445 446 447 448 449 450 451 452 453 454 455 456 457 458 459

/*
 * get_relation_constraints
 *
 * Retrieve the CHECK constraint expressions of the given relation.
 *
 * Returns a List (possibly empty) of constraint expressions.  Each one
 * has been canonicalized, and its Vars are changed to have the varno
 * indicated by rel->relid.  This allows the expressions to be easily
 * compared to expressions taken from WHERE.
 *
 * Note: at present this is invoked at most once per relation per planner
 * run, and in many cases it won't be invoked at all, so there seems no
 * point in caching the data in RelOptInfo.
 */
460
static List *
461 462 463 464 465 466 467 468 469 470 471 472 473 474 475
get_relation_constraints(Oid relationObjectId, RelOptInfo *rel)
{
	List	   *result = NIL;
	Index		varno = rel->relid;
	Relation	relation;
	TupleConstr *constr;

	/*
	 * We assume the relation has already been safely locked.
	 */
	relation = heap_open(relationObjectId, NoLock);

	constr = relation->rd_att->constr;
	if (constr != NULL)
	{
B
Bruce Momjian 已提交
476 477
		int			num_check = constr->num_check;
		int			i;
478 479 480

		for (i = 0; i < num_check; i++)
		{
B
Bruce Momjian 已提交
481
			Node	   *cexpr;
482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509

			cexpr = stringToNode(constr->check[i].ccbin);

			/*
			 * Run each expression through const-simplification and
			 * canonicalization.  This is not just an optimization, but is
			 * necessary, because we will be comparing it to
			 * similarly-processed qual clauses, and may fail to detect valid
			 * matches without this.  This must match the processing done to
			 * qual clauses in preprocess_expression()!  (We can skip the
			 * stuff involving subqueries, however, since we don't allow any
			 * in check constraints.)
			 */
			cexpr = eval_const_expressions(cexpr);

			cexpr = (Node *) canonicalize_qual((Expr *) cexpr);

			/*
			 * Also mark any coercion format fields as "don't care", so that
			 * we can match to both explicit and implicit coercions.
			 */
			set_coercionform_dontcare(cexpr);

			/* Fix Vars to have the desired varno */
			if (varno != 1)
				ChangeVarNodes(cexpr, 1, varno, 0);

			/*
B
Bruce Momjian 已提交
510 511
			 * Finally, convert to implicit-AND format (that is, a List) and
			 * append the resulting item(s) to our output list.
512 513 514 515 516 517 518 519 520 521 522 523
			 */
			result = list_concat(result,
								 make_ands_implicit((Expr *) cexpr));
		}
	}

	heap_close(relation, NoLock);

	return result;
}


524 525 526
/*
 * relation_excluded_by_constraints
 *
527 528 529
 * Detect whether the relation need not be scanned because it has either
 * self-inconsistent restrictions, or restrictions inconsistent with the
 * relation's CHECK constraints.
530 531 532
 *
 * Note: this examines only rel->relid and rel->baserestrictinfo; therefore
 * it can be called before filling in other fields of the RelOptInfo.
533 534 535 536
 */
bool
relation_excluded_by_constraints(RelOptInfo *rel, RangeTblEntry *rte)
{
537
	List	   *safe_restrictions;
538
	List	   *constraint_pred;
539 540
	List	   *safe_constraints;
	ListCell   *lc;
541 542 543 544 545

	/* Skip the test if constraint exclusion is disabled */
	if (!constraint_exclusion)
		return false;

546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
	/*
	 * Check for self-contradictory restriction clauses.  We dare not make
	 * deductions with non-immutable functions, but any immutable clauses that
	 * are self-contradictory allow us to conclude the scan is unnecessary.
	 *
	 * Note: strip off RestrictInfo because predicate_refuted_by() isn't
	 * expecting to see any in its predicate argument.
	 */
	safe_restrictions = NIL;
	foreach(lc, rel->baserestrictinfo)
	{
		RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);

		if (!contain_mutable_functions((Node *) rinfo->clause))
			safe_restrictions = lappend(safe_restrictions, rinfo->clause);
	}

	if (predicate_refuted_by(safe_restrictions, safe_restrictions))
		return true;

566 567 568 569 570 571 572 573 574 575
	/* Only plain relations have constraints */
	if (rte->rtekind != RTE_RELATION || rte->inh)
		return false;

	/* OK to fetch the constraint expressions */
	constraint_pred = get_relation_constraints(rte->relid, rel);

	/*
	 * We do not currently enforce that CHECK constraints contain only
	 * immutable functions, so it's necessary to check here. We daren't draw
B
Bruce Momjian 已提交
576 577 578
	 * conclusions from plan-time evaluation of non-immutable functions. Since
	 * they're ANDed, we can just ignore any mutable constraints in the list,
	 * and reason about the rest.
579
	 */
580 581 582
	safe_constraints = NIL;
	foreach(lc, constraint_pred)
	{
B
Bruce Momjian 已提交
583
		Node	   *pred = (Node *) lfirst(lc);
584 585 586 587

		if (!contain_mutable_functions(pred))
			safe_constraints = lappend(safe_constraints, pred);
	}
588 589 590 591 592

	/*
	 * The constraints are effectively ANDed together, so we can just try to
	 * refute the entire collection at once.  This may allow us to make proofs
	 * that would fail if we took them individually.
593
	 *
B
Bruce Momjian 已提交
594 595 596
	 * Note: we use rel->baserestrictinfo, not safe_restrictions as might seem
	 * an obvious optimization.  Some of the clauses might be OR clauses that
	 * have volatile and nonvolatile subclauses, and it's OK to make
597
	 * deductions with the nonvolatile parts.
598
	 */
599
	if (predicate_refuted_by(safe_constraints, rel->baserestrictinfo))
600 601 602 603 604 605
		return true;

	return false;
}


606 607 608 609 610 611 612 613 614 615
/*
 * build_physical_tlist
 *
 * Build a targetlist consisting of exactly the relation's user attributes,
 * in order.  The executor can special-case such tlists to avoid a projection
 * step at runtime, so we use such tlists preferentially for scan nodes.
 *
 * Exception: if there are any dropped columns, we punt and return NIL.
 * Ideally we would like to handle the dropped-column case too.  However this
 * creates problems for ExecTypeFromTL, which may be asked to build a tupdesc
B
Bruce Momjian 已提交
616
 * for a tlist that includes vars of no-longer-existent types.	In theory we
617 618 619 620
 * could dig out the required info from the pg_attribute entries of the
 * relation, but that data is not readily available to ExecTypeFromTL.
 * For now, we don't apply the physical-tlist optimization when there are
 * dropped cols.
621
 *
622 623 624
 * We also support building a "physical" tlist for subqueries, functions,
 * and values lists, since the same optimization can occur in SubqueryScan,
 * FunctionScan, and ValuesScan nodes.
625 626
 */
List *
627
build_physical_tlist(PlannerInfo *root, RelOptInfo *rel)
628
{
629
	List	   *tlist = NIL;
630
	Index		varno = rel->relid;
631
	RangeTblEntry *rte = planner_rt_fetch(varno, root);
632
	Relation	relation;
633 634 635
	Query	   *subquery;
	Var		   *var;
	ListCell   *l;
636 637
	int			attrno,
				numattrs;
638
	List	   *colvars;
639

640 641 642
	switch (rte->rtekind)
	{
		case RTE_RELATION:
643 644
			/* Assume we already have adequate lock */
			relation = heap_open(rte->relid, NoLock);
645

646 647 648 649
			numattrs = RelationGetNumberOfAttributes(relation);
			for (attrno = 1; attrno <= numattrs; attrno++)
			{
				Form_pg_attribute att_tup = relation->rd_att->attrs[attrno - 1];
650

651 652 653 654 655 656
				if (att_tup->attisdropped)
				{
					/* found a dropped col, so punt */
					tlist = NIL;
					break;
				}
657

658 659 660 661 662 663 664 665 666 667 668 669
				var = makeVar(varno,
							  attrno,
							  att_tup->atttypid,
							  att_tup->atttypmod,
							  0);

				tlist = lappend(tlist,
								makeTargetEntry((Expr *) var,
												attrno,
												NULL,
												false));
			}
670

671
			heap_close(relation, NoLock);
672 673
			break;

674 675 676 677 678 679
		case RTE_SUBQUERY:
			subquery = rte->subquery;
			foreach(l, subquery->targetList)
			{
				TargetEntry *tle = (TargetEntry *) lfirst(l);

680 681 682 683
				/*
				 * A resjunk column of the subquery can be reflected as
				 * resjunk in the physical tlist; we need not punt.
				 */
684 685 686 687 688 689 690 691 692 693 694 695 696
				var = makeVar(varno,
							  tle->resno,
							  exprType((Node *) tle->expr),
							  exprTypmod((Node *) tle->expr),
							  0);

				tlist = lappend(tlist,
								makeTargetEntry((Expr *) var,
												tle->resno,
												NULL,
												tle->resjunk));
			}
			break;
697

698
		case RTE_FUNCTION:
B
Bruce Momjian 已提交
699
			expandRTE(rte, varno, 0, true /* include dropped */ ,
700 701 702 703
					  NULL, &colvars);
			foreach(l, colvars)
			{
				var = (Var *) lfirst(l);
B
Bruce Momjian 已提交
704

705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722
				/*
				 * A non-Var in expandRTE's output means a dropped column;
				 * must punt.
				 */
				if (!IsA(var, Var))
				{
					tlist = NIL;
					break;
				}

				tlist = lappend(tlist,
								makeTargetEntry((Expr *) var,
												var->varattno,
												NULL,
												false));
			}
			break;

723 724 725 726 727 728 729 730 731 732 733 734 735 736 737
		case RTE_VALUES:
			expandRTE(rte, varno, 0, false /* dropped not applicable */ ,
					  NULL, &colvars);
			foreach(l, colvars)
			{
				var = (Var *) lfirst(l);

				tlist = lappend(tlist,
								makeTargetEntry((Expr *) var,
												var->varattno,
												NULL,
												false));
			}
			break;

738 739 740 741 742 743
		default:
			/* caller error */
			elog(ERROR, "unsupported RTE kind %d in build_physical_tlist",
				 (int) rte->rtekind);
			break;
	}
744

745
	return tlist;
746 747
}

748
/*
749
 * restriction_selectivity
750
 *
751
 * Returns the selectivity of a specified restriction operator clause.
752 753 754
 * This code executes registered procedures stored in the
 * operator relation, by calling the function manager.
 *
755
 * See clause_selectivity() for the meaning of the additional parameters.
756
 */
757
Selectivity
758
restriction_selectivity(PlannerInfo *root,
759 760 761
						Oid operator,
						List *args,
						int varRelid)
762
{
763
	RegProcedure oprrest = get_oprrest(operator);
764 765
	float8		result;

766
	/*
767 768
	 * if the oprrest procedure is missing for whatever reason, use a
	 * selectivity of 0.5
769 770 771 772 773 774 775 776 777
	 */
	if (!oprrest)
		return (Selectivity) 0.5;

	result = DatumGetFloat8(OidFunctionCall4(oprrest,
											 PointerGetDatum(root),
											 ObjectIdGetDatum(operator),
											 PointerGetDatum(args),
											 Int32GetDatum(varRelid)));
778 779

	if (result < 0.0 || result > 1.0)
780
		elog(ERROR, "invalid restriction selectivity: %f", result);
781 782

	return (Selectivity) result;
783 784 785
}

/*
786
 * join_selectivity
787
 *
788 789 790
 * Returns the selectivity of a specified join operator clause.
 * This code executes registered procedures stored in the
 * operator relation, by calling the function manager.
791
 */
792
Selectivity
793
join_selectivity(PlannerInfo *root,
794
				 Oid operator,
795 796
				 List *args,
				 JoinType jointype)
797
{
798
	RegProcedure oprjoin = get_oprjoin(operator);
799 800
	float8		result;

801
	/*
802 803
	 * if the oprjoin procedure is missing for whatever reason, use a
	 * selectivity of 0.5
804 805 806 807
	 */
	if (!oprjoin)
		return (Selectivity) 0.5;

808
	result = DatumGetFloat8(OidFunctionCall4(oprjoin,
809 810
											 PointerGetDatum(root),
											 ObjectIdGetDatum(operator),
811 812
											 PointerGetDatum(args),
											 Int16GetDatum(jointype)));
813 814

	if (result < 0.0 || result > 1.0)
815
		elog(ERROR, "invalid join selectivity: %f", result);
816 817

	return (Selectivity) result;
818 819 820
}

/*
821
 * find_inheritance_children
822
 *
823
 * Returns a list containing the OIDs of all relations which
824
 * inherit *directly* from the relation with OID 'inhparent'.
825 826 827 828 829
 *
 * XXX might be a good idea to create an index on pg_inherits' inhparent
 * field, so that we can use an indexscan instead of sequential scan here.
 * However, in typical databases pg_inherits won't have enough entries to
 * justify an indexscan...
830
 */
831
List *
832 833
find_inheritance_children(Oid inhparent)
{
834
	List	   *list = NIL;
835 836
	Relation	relation;
	HeapScanDesc scan;
837
	HeapTuple	inheritsTuple;
838
	Oid			inhrelid;
B
Bruce Momjian 已提交
839
	ScanKeyData key[1];
840

841
	/*
B
Bruce Momjian 已提交
842 843
	 * Can skip the scan if pg_class shows the relation has never had a
	 * subclass.
844
	 */
B
Bruce Momjian 已提交
845
	if (!has_subclass(inhparent))
846 847
		return NIL;

848 849 850 851
	ScanKeyInit(&key[0],
				Anum_pg_inherits_inhparent,
				BTEqualStrategyNumber, F_OIDEQ,
				ObjectIdGetDatum(inhparent));
852
	relation = heap_open(InheritsRelationId, AccessShareLock);
853 854
	scan = heap_beginscan(relation, SnapshotNow, 1, key);
	while ((inheritsTuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
855
	{
856
		inhrelid = ((Form_pg_inherits) GETSTRUCT(inheritsTuple))->inhrelid;
857
		list = lappend_oid(list, inhrelid);
858 859
	}
	heap_endscan(scan);
860
	heap_close(relation, AccessShareLock);
861
	return list;
862 863
}

864
/*
865 866
 * has_subclass
 *
B
Bruce Momjian 已提交
867
 * In the current implementation, has_subclass returns whether a
868 869
 * particular class *might* have a subclass. It will not return the
 * correct result if a class had a subclass which was later dropped.
870 871 872 873 874
 * This is because relhassubclass in pg_class is not updated when a
 * subclass is dropped, primarily because of concurrency concerns.
 *
 * Currently has_subclass is only used as an efficiency hack to skip
 * unnecessary inheritance searches, so this is OK.
875
 */
876 877
bool
has_subclass(Oid relationId)
878
{
879 880
	HeapTuple	tuple;
	bool		result;
881

882 883 884
	tuple = SearchSysCache(RELOID,
						   ObjectIdGetDatum(relationId),
						   0, 0, 0);
885
	if (!HeapTupleIsValid(tuple))
886
		elog(ERROR, "cache lookup failed for relation %u", relationId);
887 888 889 890

	result = ((Form_pg_class) GETSTRUCT(tuple))->relhassubclass;
	ReleaseSysCache(tuple);
	return result;
891
}
892 893 894 895 896 897 898 899 900 901 902

/*
 * has_unique_index
 *
 * Detect whether there is a unique index on the specified attribute
 * of the specified relation, thus allowing us to conclude that all
 * the (non-null) values of the attribute are distinct.
 */
bool
has_unique_index(RelOptInfo *rel, AttrNumber attno)
{
903
	ListCell   *ilist;
904 905 906 907 908 909

	foreach(ilist, rel->indexlist)
	{
		IndexOptInfo *index = (IndexOptInfo *) lfirst(ilist);

		/*
B
Bruce Momjian 已提交
910 911 912 913 914
		 * Note: ignore partial indexes, since they don't allow us to conclude
		 * that all attr values are distinct.  We don't take any interest in
		 * expressional indexes either. Also, a multicolumn unique index
		 * doesn't allow us to conclude that just the specified attr is
		 * unique.
915 916
		 */
		if (index->unique &&
917
			index->ncolumns == 1 &&
918
			index->indexkeys[0] == attno &&
919
			index->indpred == NIL)
920 921 922 923
			return true;
	}
	return false;
}