plancat.c 24.4 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * plancat.c
4
 *	   routines for accessing the system catalogs
5 6
 *
 *
7
 * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
B
Add:  
Bruce Momjian 已提交
8
 * Portions Copyright (c) 1994, Regents of the University of California
9 10 11
 *
 *
 * IDENTIFICATION
B
Bruce Momjian 已提交
12
 *	  $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.127 2006/10/04 00:29:55 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 "catalog/pg_inherits.h"
23
#include "nodes/makefuncs.h"
24
#include "optimizer/clauses.h"
25
#include "optimizer/plancat.h"
26
#include "optimizer/predtest.h"
27
#include "optimizer/prep.h"
28
#include "parser/parse_expr.h"
29
#include "parser/parse_relation.h"
30
#include "parser/parsetree.h"
31
#include "rewrite/rewriteManip.h"
32
#include "utils/fmgroids.h"
33
#include "utils/lsyscache.h"
34
#include "utils/relcache.h"
35
#include "utils/syscache.h"
H
Hiroshi Inoue 已提交
36 37
#include "catalog/catalog.h"
#include "miscadmin.h"
38 39


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


44
static void estimate_rel_size(Relation rel, int32 *attr_widths,
B
Bruce Momjian 已提交
45
				  BlockNumber *pages, double *tuples);
46
static List *get_relation_constraints(Oid relationObjectId, RelOptInfo *rel);
47 48


49
/*
50
 * get_relation_info -
51
 *	  Retrieves catalog information for a given relation.
52 53 54 55
 *
 * Given the Oid of the relation, return the following info into fields
 * of the RelOptInfo struct:
 *
56 57
 *	min_attr	lowest valid AttrNumber
 *	max_attr	highest valid AttrNumber
58 59 60
 *	indexlist	list of IndexOptInfos for relation's indexes
 *	pages		number of pages
 *	tuples		number of tuples
61 62 63 64
 *
 * 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.
65 66 67 68 69
 *
 * 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.
70 71
 */
void
72 73
get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
				  RelOptInfo *rel)
74
{
75
	Index		varno = rel->relid;
76
	Relation	relation;
77 78
	bool		hasindex;
	List	   *indexinfos = NIL;
79

80
	/*
B
Bruce Momjian 已提交
81 82 83
	 * 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.
84
	 */
85
	relation = heap_open(relationObjectId, NoLock);
86

87 88
	rel->min_attr = FirstLowInvalidHeapAttributeNumber + 1;
	rel->max_attr = RelationGetNumberOfAttributes(relation);
89

90 91 92 93 94 95 96
	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));

	/*
97
	 * Estimate relation size --- unless it's an inheritance parent, in which
B
Bruce Momjian 已提交
98 99
	 * 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
100
	 * calculation.
101
	 */
102 103 104
	if (!inhparent)
		estimate_rel_size(relation, rel->attr_widths - rel->min_attr,
						  &rel->pages, &rel->tuples);
105

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

116
	if (hasindex)
117
	{
118 119
		List	   *indexoidlist;
		ListCell   *l;
120
		LOCKMODE	lmode;
121

122
		indexoidlist = RelationGetIndexList(relation);
123

124 125 126 127 128 129 130 131 132 133 134 135 136
		/*
		 * 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;

137
		foreach(l, indexoidlist)
138
		{
139
			Oid			indexoid = lfirst_oid(l);
140 141 142
			Relation	indexRelation;
			Form_pg_index index;
			IndexOptInfo *info;
143
			int			ncolumns;
144 145 146
			int			i;
			int16		amorderstrategy;

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

153 154
			/*
			 * Ignore invalid indexes, since they can't safely be used for
B
Bruce Momjian 已提交
155 156 157
			 * 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!
158 159 160 161 162 163 164
			 */
			if (!index->indisvalid)
			{
				index_close(indexRelation, NoLock);
				continue;
			}

165 166 167
			info = makeNode(IndexOptInfo);

			info->indexoid = index->indexrelid;
168
			info->rel = rel;
169
			info->ncolumns = ncolumns = index->indnatts;
170

171
			/*
B
Bruce Momjian 已提交
172 173
			 * Need to make classlist and ordering arrays large enough to put
			 * a terminating 0 at the end of each one.
174 175 176 177
			 */
			info->indexkeys = (int *) palloc(sizeof(int) * ncolumns);
			info->classlist = (Oid *) palloc0(sizeof(Oid) * (ncolumns + 1));
			info->ordering = (Oid *) palloc0(sizeof(Oid) * (ncolumns + 1));
178

179
			for (i = 0; i < ncolumns; i++)
180
			{
181 182
				info->classlist[i] = indexRelation->rd_indclass->values[i];
				info->indexkeys[i] = index->indkey.values[i];
183 184 185
			}

			info->relam = indexRelation->rd_rel->relam;
186 187
			info->amcostestimate = indexRelation->rd_am->amcostestimate;
			info->amoptionalkey = indexRelation->rd_am->amoptionalkey;
188 189

			/*
B
Bruce Momjian 已提交
190
			 * Fetch the ordering operators associated with the index, if any.
191
			 */
192
			amorderstrategy = indexRelation->rd_am->amorderstrategy;
193 194 195 196
			if (amorderstrategy != 0)
			{
				int			oprindex = amorderstrategy - 1;

197
				for (i = 0; i < ncolumns; i++)
198 199 200 201 202
				{
					info->ordering[i] = indexRelation->rd_operator[oprindex];
					oprindex += indexRelation->rd_am->amstrategies;
				}
			}
203

204 205 206
			/*
			 * Fetch the index expressions and predicate, if any.  We must
			 * modify the copies we obtain from the relcache to have the
B
Bruce Momjian 已提交
207 208
			 * correct varno for the parent relation, so that they match up
			 * correctly against qual clauses.
209 210 211 212 213 214 215
			 */
			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 已提交
216
			info->predOK = false;		/* set later in indxpath.c */
217 218
			info->unique = index->indisunique;

219
			/*
B
Bruce Momjian 已提交
220 221 222 223 224
			 * 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.
225 226 227 228 229 230 231 232 233 234 235 236 237 238
			 */
			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;
			}

239
			index_close(indexRelation, NoLock);
240 241 242 243

			indexinfos = lcons(info, indexinfos);
		}

244
		list_free(indexoidlist);
245
	}
246

247 248
	rel->indexlist = indexinfos;

249
	heap_close(relation, NoLock);
250 251
}

252 253 254 255 256 257 258 259 260 261 262
/*
 * 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 已提交
263 264
	BlockNumber curpages;
	BlockNumber relpages;
265 266 267 268 269 270 271 272 273
	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 */
274 275 276 277
			curpages = RelationGetNumberOfBlocks(rel);

			/*
			 * HACK: if the relation has never yet been vacuumed, use a
B
Bruce Momjian 已提交
278 279 280 281 282 283 284 285 286 287
			 * 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.
288
			 *
289 290 291 292 293
			 * 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.
294 295 296 297 298 299
			 */
			if (curpages < 10 && rel->rd_rel->relpages == 0)
				curpages = 10;

			/* report estimated # pages */
			*pages = curpages;
300 301 302 303 304 305 306 307 308
			/* 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 已提交
309

310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
			/*
			 * 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 已提交
330 331
				 * tables (since they've presumably not been VACUUMed yet) but
				 * is probably an overestimate for indexes.  Fortunately
332 333
				 * get_relation_info() can clamp the overestimate to the
				 * parent table's size.
334 335
				 *
				 * Note: this code intentionally disregards alignment
B
Bruce Momjian 已提交
336 337 338 339
				 * 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.
340
				 */
B
Bruce Momjian 已提交
341 342
				int32		tuple_width = 0;
				int			i;
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362

				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;
				}
363
				tuple_width += sizeof(HeapTupleHeaderData);
364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
				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;
	}
}

383 384 385 386 387 388 389 390 391 392 393 394 395 396 397

/*
 * 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.
 */
398
static List *
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413
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 已提交
414 415
		int			num_check = constr->num_check;
		int			i;
416 417 418

		for (i = 0; i < num_check; i++)
		{
B
Bruce Momjian 已提交
419
			Node	   *cexpr;
420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447

			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 已提交
448 449
			 * Finally, convert to implicit-AND format (that is, a List) and
			 * append the resulting item(s) to our output list.
450 451 452 453 454 455 456 457 458 459 460 461
			 */
			result = list_concat(result,
								 make_ands_implicit((Expr *) cexpr));
		}
	}

	heap_close(relation, NoLock);

	return result;
}


462 463 464
/*
 * relation_excluded_by_constraints
 *
465 466 467
 * Detect whether the relation need not be scanned because it has either
 * self-inconsistent restrictions, or restrictions inconsistent with the
 * relation's CHECK constraints.
468 469 470 471
 */
bool
relation_excluded_by_constraints(RelOptInfo *rel, RangeTblEntry *rte)
{
472
	List	   *safe_restrictions;
473
	List	   *constraint_pred;
474 475
	List	   *safe_constraints;
	ListCell   *lc;
476 477 478 479 480

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

481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500
	/*
	 * 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;

501 502 503 504 505 506 507 508 509 510
	/* 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 已提交
511 512 513
	 * 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.
514
	 */
515 516 517
	safe_constraints = NIL;
	foreach(lc, constraint_pred)
	{
B
Bruce Momjian 已提交
518
		Node	   *pred = (Node *) lfirst(lc);
519 520 521 522

		if (!contain_mutable_functions(pred))
			safe_constraints = lappend(safe_constraints, pred);
	}
523 524 525 526 527

	/*
	 * 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.
528
	 *
B
Bruce Momjian 已提交
529 530 531
	 * 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
532
	 * deductions with the nonvolatile parts.
533
	 */
534
	if (predicate_refuted_by(safe_constraints, rel->baserestrictinfo))
535 536 537 538 539 540
		return true;

	return false;
}


541 542 543 544 545 546 547 548 549 550
/*
 * 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 已提交
551
 * for a tlist that includes vars of no-longer-existent types.	In theory we
552 553 554 555
 * 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.
556
 *
557 558 559
 * 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.
560 561
 */
List *
562
build_physical_tlist(PlannerInfo *root, RelOptInfo *rel)
563
{
564
	List	   *tlist = NIL;
565
	Index		varno = rel->relid;
566
	RangeTblEntry *rte = rt_fetch(varno, root->parse->rtable);
567
	Relation	relation;
568 569 570
	Query	   *subquery;
	Var		   *var;
	ListCell   *l;
571 572
	int			attrno,
				numattrs;
573
	List	   *colvars;
574

575 576 577
	switch (rte->rtekind)
	{
		case RTE_RELATION:
578 579
			/* Assume we already have adequate lock */
			relation = heap_open(rte->relid, NoLock);
580

581 582 583 584
			numattrs = RelationGetNumberOfAttributes(relation);
			for (attrno = 1; attrno <= numattrs; attrno++)
			{
				Form_pg_attribute att_tup = relation->rd_att->attrs[attrno - 1];
585

586 587 588 589 590 591
				if (att_tup->attisdropped)
				{
					/* found a dropped col, so punt */
					tlist = NIL;
					break;
				}
592

593 594 595 596 597 598 599 600 601 602 603 604
				var = makeVar(varno,
							  attrno,
							  att_tup->atttypid,
							  att_tup->atttypmod,
							  0);

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

606
			heap_close(relation, NoLock);
607 608
			break;

609 610 611 612 613 614
		case RTE_SUBQUERY:
			subquery = rte->subquery;
			foreach(l, subquery->targetList)
			{
				TargetEntry *tle = (TargetEntry *) lfirst(l);

615 616 617 618
				/*
				 * A resjunk column of the subquery can be reflected as
				 * resjunk in the physical tlist; we need not punt.
				 */
619 620 621 622 623 624 625 626 627 628 629 630 631
				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;
632

633
		case RTE_FUNCTION:
B
Bruce Momjian 已提交
634
			expandRTE(rte, varno, 0, true /* include dropped */ ,
635 636 637 638
					  NULL, &colvars);
			foreach(l, colvars)
			{
				var = (Var *) lfirst(l);
B
Bruce Momjian 已提交
639

640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657
				/*
				 * 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;

658 659 660 661 662 663 664 665 666 667 668 669 670 671 672
		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;

673 674 675 676 677 678
		default:
			/* caller error */
			elog(ERROR, "unsupported RTE kind %d in build_physical_tlist",
				 (int) rte->rtekind);
			break;
	}
679

680
	return tlist;
681 682
}

683
/*
684
 * restriction_selectivity
685
 *
686
 * Returns the selectivity of a specified restriction operator clause.
687 688 689
 * This code executes registered procedures stored in the
 * operator relation, by calling the function manager.
 *
690
 * See clause_selectivity() for the meaning of the additional parameters.
691
 */
692
Selectivity
693
restriction_selectivity(PlannerInfo *root,
694 695 696
						Oid operator,
						List *args,
						int varRelid)
697
{
698
	RegProcedure oprrest = get_oprrest(operator);
699 700
	float8		result;

701
	/*
702 703
	 * if the oprrest procedure is missing for whatever reason, use a
	 * selectivity of 0.5
704 705 706 707 708 709 710 711 712
	 */
	if (!oprrest)
		return (Selectivity) 0.5;

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

	if (result < 0.0 || result > 1.0)
715
		elog(ERROR, "invalid restriction selectivity: %f", result);
716 717

	return (Selectivity) result;
718 719 720
}

/*
721
 * join_selectivity
722
 *
723 724 725
 * Returns the selectivity of a specified join operator clause.
 * This code executes registered procedures stored in the
 * operator relation, by calling the function manager.
726
 */
727
Selectivity
728
join_selectivity(PlannerInfo *root,
729
				 Oid operator,
730 731
				 List *args,
				 JoinType jointype)
732
{
733
	RegProcedure oprjoin = get_oprjoin(operator);
734 735
	float8		result;

736
	/*
737 738
	 * if the oprjoin procedure is missing for whatever reason, use a
	 * selectivity of 0.5
739 740 741 742
	 */
	if (!oprjoin)
		return (Selectivity) 0.5;

743
	result = DatumGetFloat8(OidFunctionCall4(oprjoin,
744 745
											 PointerGetDatum(root),
											 ObjectIdGetDatum(operator),
746 747
											 PointerGetDatum(args),
											 Int16GetDatum(jointype)));
748 749

	if (result < 0.0 || result > 1.0)
750
		elog(ERROR, "invalid join selectivity: %f", result);
751 752

	return (Selectivity) result;
753 754 755
}

/*
756
 * find_inheritance_children
757
 *
758
 * Returns a list containing the OIDs of all relations which
759
 * inherit *directly* from the relation with OID 'inhparent'.
760 761 762 763 764
 *
 * 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...
765
 */
766
List *
767 768
find_inheritance_children(Oid inhparent)
{
769
	List	   *list = NIL;
770 771
	Relation	relation;
	HeapScanDesc scan;
772
	HeapTuple	inheritsTuple;
773
	Oid			inhrelid;
B
Bruce Momjian 已提交
774
	ScanKeyData key[1];
775

776
	/*
B
Bruce Momjian 已提交
777 778
	 * Can skip the scan if pg_class shows the relation has never had a
	 * subclass.
779
	 */
B
Bruce Momjian 已提交
780
	if (!has_subclass(inhparent))
781 782
		return NIL;

783 784 785 786
	ScanKeyInit(&key[0],
				Anum_pg_inherits_inhparent,
				BTEqualStrategyNumber, F_OIDEQ,
				ObjectIdGetDatum(inhparent));
787
	relation = heap_open(InheritsRelationId, AccessShareLock);
788 789
	scan = heap_beginscan(relation, SnapshotNow, 1, key);
	while ((inheritsTuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
790
	{
791
		inhrelid = ((Form_pg_inherits) GETSTRUCT(inheritsTuple))->inhrelid;
792
		list = lappend_oid(list, inhrelid);
793 794
	}
	heap_endscan(scan);
795
	heap_close(relation, AccessShareLock);
796
	return list;
797 798
}

799
/*
800 801
 * has_subclass
 *
B
Bruce Momjian 已提交
802
 * In the current implementation, has_subclass returns whether a
803 804
 * particular class *might* have a subclass. It will not return the
 * correct result if a class had a subclass which was later dropped.
805 806 807 808 809
 * 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.
810
 */
811 812
bool
has_subclass(Oid relationId)
813
{
814 815
	HeapTuple	tuple;
	bool		result;
816

817 818 819
	tuple = SearchSysCache(RELOID,
						   ObjectIdGetDatum(relationId),
						   0, 0, 0);
820
	if (!HeapTupleIsValid(tuple))
821
		elog(ERROR, "cache lookup failed for relation %u", relationId);
822 823 824 825

	result = ((Form_pg_class) GETSTRUCT(tuple))->relhassubclass;
	ReleaseSysCache(tuple);
	return result;
826
}
827 828 829 830 831 832 833 834 835 836 837

/*
 * 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)
{
838
	ListCell   *ilist;
839 840 841 842 843 844

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

		/*
B
Bruce Momjian 已提交
845 846 847 848 849
		 * 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.
850 851
		 */
		if (index->unique &&
852
			index->ncolumns == 1 &&
853
			index->indexkeys[0] == attno &&
854
			index->indpred == NIL)
855 856 857 858
			return true;
	}
	return false;
}