aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2000-07-27 23:16:04 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2000-07-27 23:16:04 +0000
commitff7da2f49801e1e47ed116491f7bd6711946dc6a (patch)
treea64ddf4b2b7091a1a40d7ead648fd2f10eebf920
parentfaa41717280a51ca869ac8f44e1a3249cab9b1b5 (diff)
downloadpostgresql-ff7da2f49801e1e47ed116491f7bd6711946dc6a.tar.gz
postgresql-ff7da2f49801e1e47ed116491f7bd6711946dc6a.zip
Make planner safe for recursive calls --- needed for cases where
eval_const_expressions tries to simplify an SQL function.
-rw-r--r--src/backend/optimizer/path/indxpath.c4
-rw-r--r--src/backend/optimizer/plan/planner.c24
-rw-r--r--src/backend/optimizer/util/plancat.c58
3 files changed, 32 insertions, 54 deletions
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c
index 068ba771ea8..a675963005d 100644
--- a/src/backend/optimizer/path/indxpath.c
+++ b/src/backend/optimizer/path/indxpath.c
@@ -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},
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 84f9c322c42..42545750d39 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -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;
}
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index 1bec741c48b..750a463122f 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -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