mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Make planner safe for recursive calls --- needed for cases where
eval_const_expressions tries to simplify an SQL function.
This commit is contained in:
		@@ -9,7 +9,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * IDENTIFICATION
 | 
			
		||||
 *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.89 2000/07/26 23:46:22 tgl Exp $
 | 
			
		||||
 *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.90 2000/07/27 23:15:56 tgl Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *-------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
@@ -1153,7 +1153,7 @@ one_pred_clause_test(Expr *predicate, Node *clause)
 | 
			
		||||
 * this test should always be considered false.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static StrategyNumber
 | 
			
		||||
static const StrategyNumber
 | 
			
		||||
			BT_implic_table[BTMaxStrategyNumber][BTMaxStrategyNumber] = {
 | 
			
		||||
	{2, 2, 0, 0, 0},
 | 
			
		||||
	{1, 2, 0, 0, 0},
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * IDENTIFICATION
 | 
			
		||||
 *	  $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.85 2000/06/20 04:22:21 tgl Exp $
 | 
			
		||||
 *	  $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.86 2000/07/27 23:15:57 tgl Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *-------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
@@ -50,6 +50,22 @@ Plan *
 | 
			
		||||
planner(Query *parse)
 | 
			
		||||
{
 | 
			
		||||
	Plan	   *result_plan;
 | 
			
		||||
	Index		save_PlannerQueryLevel;
 | 
			
		||||
	List	   *save_PlannerInitPlan;
 | 
			
		||||
	List	   *save_PlannerParamVar;
 | 
			
		||||
	int			save_PlannerPlanId;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * The planner can be called recursively (an example is when
 | 
			
		||||
	 * eval_const_expressions tries to simplify an SQL function).
 | 
			
		||||
	 * So, global state variables must be saved and restored.
 | 
			
		||||
	 *
 | 
			
		||||
	 * (Perhaps these should be moved into the Query structure instead?)
 | 
			
		||||
	 */
 | 
			
		||||
	save_PlannerQueryLevel = PlannerQueryLevel;
 | 
			
		||||
	save_PlannerInitPlan = PlannerInitPlan;
 | 
			
		||||
	save_PlannerParamVar = PlannerParamVar;
 | 
			
		||||
	save_PlannerPlanId = PlannerPlanId;
 | 
			
		||||
 | 
			
		||||
	/* Initialize state for subselects */
 | 
			
		||||
	PlannerQueryLevel = 1;
 | 
			
		||||
@@ -78,6 +94,12 @@ planner(Query *parse)
 | 
			
		||||
	/* final cleanup of the plan */
 | 
			
		||||
	set_plan_references(result_plan);
 | 
			
		||||
 | 
			
		||||
	/* restore state for outer planner, if any */
 | 
			
		||||
	PlannerQueryLevel = save_PlannerQueryLevel;
 | 
			
		||||
	PlannerInitPlan = save_PlannerInitPlan;
 | 
			
		||||
	PlannerParamVar = save_PlannerParamVar;
 | 
			
		||||
	PlannerPlanId = save_PlannerPlanId;
 | 
			
		||||
 | 
			
		||||
	return result_plan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * IDENTIFICATION
 | 
			
		||||
 *	  $Header: /cvsroot/pgsql/src/backend/optimizer/util/plancat.c,v 1.59 2000/07/05 23:11:26 tgl Exp $
 | 
			
		||||
 *	  $Header: /cvsroot/pgsql/src/backend/optimizer/util/plancat.c,v 1.60 2000/07/27 23:16:04 tgl Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *-------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
@@ -272,15 +272,12 @@ join_selectivity(Oid functionObjectId,
 | 
			
		||||
List *
 | 
			
		||||
find_inheritance_children(Oid inhparent)
 | 
			
		||||
{
 | 
			
		||||
	static ScanKeyData key[1] = {
 | 
			
		||||
		{0, Anum_pg_inherits_inhparent, F_OIDEQ}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	List	   *list = NIL;
 | 
			
		||||
	Relation	relation;
 | 
			
		||||
	HeapScanDesc scan;
 | 
			
		||||
	HeapTuple	inheritsTuple;
 | 
			
		||||
	Oid			inhrelid;
 | 
			
		||||
	ScanKeyData	key[1];
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Can skip the scan if pg_class shows the relation has never had
 | 
			
		||||
@@ -289,10 +286,11 @@ find_inheritance_children(Oid inhparent)
 | 
			
		||||
	if (! has_subclass(inhparent))
 | 
			
		||||
		return NIL;
 | 
			
		||||
 | 
			
		||||
	fmgr_info(F_OIDEQ, &key[0].sk_func);
 | 
			
		||||
	key[0].sk_nargs = key[0].sk_func.fn_nargs;
 | 
			
		||||
	key[0].sk_argument = ObjectIdGetDatum(inhparent);
 | 
			
		||||
 | 
			
		||||
	ScanKeyEntryInitialize(&key[0],
 | 
			
		||||
						   (bits16) 0x0,
 | 
			
		||||
						   (AttrNumber) Anum_pg_inherits_inhparent,
 | 
			
		||||
						   (RegProcedure) F_OIDEQ,
 | 
			
		||||
						   ObjectIdGetDatum(inhparent));
 | 
			
		||||
	relation = heap_openr(InheritsRelationName, AccessShareLock);
 | 
			
		||||
	scan = heap_beginscan(relation, 0, SnapshotNow, 1, key);
 | 
			
		||||
	while (HeapTupleIsValid(inheritsTuple = heap_getnext(scan, 0)))
 | 
			
		||||
@@ -330,45 +328,3 @@ has_subclass(Oid relationId)
 | 
			
		||||
			 relationId);
 | 
			
		||||
	return ((Form_pg_class) GETSTRUCT(tuple))->relhassubclass;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef NOT_USED
 | 
			
		||||
/*
 | 
			
		||||
 * VersionGetParents
 | 
			
		||||
 *
 | 
			
		||||
 * Returns a LISP list containing the OIDs of all relations which are
 | 
			
		||||
 * base relations of the relation with OID 'verrelid'.
 | 
			
		||||
 */
 | 
			
		||||
List *
 | 
			
		||||
VersionGetParents(Oid verrelid)
 | 
			
		||||
{
 | 
			
		||||
	static ScanKeyData key[1] = {
 | 
			
		||||
		{0, Anum_pg_version_verrelid, F_OIDEQ}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	HeapTuple	versionTuple;
 | 
			
		||||
	Relation	relation;
 | 
			
		||||
	HeapScanDesc scan;
 | 
			
		||||
	Oid			verbaseid;
 | 
			
		||||
	List	   *list = NIL;
 | 
			
		||||
 | 
			
		||||
	fmgr_info(F_OIDEQ, &key[0].sk_func);
 | 
			
		||||
	key[0].sk_nargs = key[0].sk_func.fn_nargs;
 | 
			
		||||
	key[0].sk_argument = ObjectIdGetDatum(verrelid);
 | 
			
		||||
	relation = heap_openr(VersionRelationName, AccessShareLock);
 | 
			
		||||
	scan = heap_beginscan(relation, 0, SnapshotNow, 1, key);
 | 
			
		||||
	while (HeapTupleIsValid(versionTuple = heap_getnext(scan, 0)))
 | 
			
		||||
	{
 | 
			
		||||
		verbaseid = ((Form_pg_version)
 | 
			
		||||
					 GETSTRUCT(versionTuple))->verbaseid;
 | 
			
		||||
 | 
			
		||||
		list = lconsi(verbaseid, list);
 | 
			
		||||
 | 
			
		||||
		key[0].sk_argument = ObjectIdGetDatum(verbaseid);
 | 
			
		||||
		heap_rescan(scan, 0, key);
 | 
			
		||||
	}
 | 
			
		||||
	heap_endscan(scan);
 | 
			
		||||
	heap_close(relation, AccessShareLock);
 | 
			
		||||
	return list;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user