summaryrefslogtreecommitdiff
path: root/src/backend/nodes
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/nodes')
-rw-r--r--src/backend/nodes/copyfuncs.c25
-rw-r--r--src/backend/nodes/equalfuncs.c35
-rw-r--r--src/backend/nodes/freefuncs.c22
-rw-r--r--src/backend/nodes/outfuncs.c65
-rw-r--r--src/backend/nodes/print.c12
-rw-r--r--src/backend/nodes/readfuncs.c120
6 files changed, 135 insertions, 144 deletions
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index adf0c7f198..5bf01e2272 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.105 2000/02/15 03:37:08 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.106 2000/02/15 20:49:09 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -75,7 +75,8 @@ listCopy(List *list)
static void
CopyPlanFields(Plan *from, Plan *newnode)
{
- newnode->cost = from->cost;
+ newnode->startup_cost = from->startup_cost;
+ newnode->total_cost = from->total_cost;
newnode->plan_rows = from->plan_rows;
newnode->plan_width = from->plan_width;
/* state is NOT copied */
@@ -981,8 +982,9 @@ _copyRelOptInfo(RelOptInfo *from)
Node_Copy(from, newnode, targetlist);
Node_Copy(from, newnode, pathlist);
- /* XXX cheapestpath should point to a member of pathlist? */
- Node_Copy(from, newnode, cheapestpath);
+ /* XXX cheapest-path fields should point to members of pathlist? */
+ Node_Copy(from, newnode, cheapest_startup_path);
+ Node_Copy(from, newnode, cheapest_total_path);
newnode->pruneable = from->pruneable;
newnode->indexed = from->indexed;
@@ -990,6 +992,7 @@ _copyRelOptInfo(RelOptInfo *from)
newnode->tuples = from->tuples;
Node_Copy(from, newnode, baserestrictinfo);
+ newnode->baserestrictcost = from->baserestrictcost;
Node_Copy(from, newnode, joininfo);
Node_Copy(from, newnode, innerjoin);
@@ -1045,6 +1048,7 @@ _copyIndexOptInfo(IndexOptInfo *from)
newnode->amcostestimate = from->amcostestimate;
newnode->indproc = from->indproc;
Node_Copy(from, newnode, indpred);
+ newnode->lossy = from->lossy;
return newnode;
}
@@ -1066,7 +1070,8 @@ CopyPathFields(Path *from, Path *newnode)
*/
newnode->parent = from->parent;
- newnode->path_cost = from->path_cost;
+ newnode->startup_cost = from->startup_cost;
+ newnode->total_cost = from->total_cost;
newnode->pathtype = from->pathtype;
@@ -1108,6 +1113,7 @@ _copyIndexPath(IndexPath *from)
*/
newnode->indexid = listCopy(from->indexid);
Node_Copy(from, newnode, indexqual);
+ newnode->indexscandir = from->indexscandir;
newnode->joinrelids = listCopy(from->joinrelids);
return newnode;
@@ -1339,8 +1345,7 @@ _copyRangeTblEntry(RangeTblEntry *from)
if (from->relname)
newnode->relname = pstrdup(from->relname);
- if (from->ref)
- Node_Copy(from, newnode, ref);
+ Node_Copy(from, newnode, ref);
newnode->relid = from->relid;
newnode->inh = from->inh;
newnode->inFromCl = from->inFromCl;
@@ -1449,8 +1454,10 @@ _copyQuery(Query *from)
Node_Copy(from, newnode, limitOffset);
Node_Copy(from, newnode, limitCount);
- /* we do not copy the planner internal fields: base_rel_list,
- * join_rel_list, query_pathkeys. Not entirely clear if this is right?
+ /*
+ * We do not copy the planner internal fields: base_rel_list,
+ * join_rel_list, equi_key_list, query_pathkeys.
+ * Not entirely clear if this is right?
*/
return newnode;
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 3ddc8d6c98..fadc282d1a 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.60 2000/02/15 03:37:08 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.61 2000/02/15 20:49:09 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -100,10 +100,10 @@ _equalAttr(Attr *a, Attr *b)
{
if (!strcmp(a->relname, b->relname))
return false;
- if (length(a->attrs) != length(b->attrs))
+ if (!equal(a->attrs, b->attrs))
return false;
- return equal(a->attrs, b->attrs);
+ return true;
}
static bool
@@ -342,8 +342,8 @@ _equalPath(Path *a, Path *b)
return false;
if (!equal(a->parent, b->parent))
return false;
- /* do not check path_cost, since it may not be set yet, and being
- * a float there are roundoff error issues anyway...
+ /* do not check path costs, since they may not be set yet, and being
+ * float values there are roundoff error issues anyway...
*/
if (!equal(a->pathkeys, b->pathkeys))
return false;
@@ -359,6 +359,8 @@ _equalIndexPath(IndexPath *a, IndexPath *b)
return false;
if (!equal(a->indexqual, b->indexqual))
return false;
+ if (a->indexscandir != b->indexscandir)
+ return false;
if (!equali(a->joinrelids, b->joinrelids))
return false;
return true;
@@ -625,8 +627,9 @@ _equalQuery(Query *a, Query *b)
/*
* We do not check the internal-to-the-planner fields: base_rel_list,
- * join_rel_list, query_pathkeys. They might not be set yet, and
- * in any case they should be derivable from the other fields.
+ * join_rel_list, equi_key_list, query_pathkeys.
+ * They might not be set yet, and in any case they should be derivable
+ * from the other fields.
*/
return true;
}
@@ -644,16 +647,8 @@ _equalRangeTblEntry(RangeTblEntry *a, RangeTblEntry *b)
if (a->relname != b->relname)
return false;
}
- if (a->ref && b->ref)
- {
- if (! equal(a->ref, b->ref))
- return false;
- }
- else
- {
- if (a->ref != b->ref)
- return false;
- }
+ if (!equal(a->ref, b->ref))
+ return false;
if (a->relid != b->relid)
return false;
if (a->inh != b->inh)
@@ -784,6 +779,9 @@ equal(void *a, void *b)
case T_Stream:
retval = _equalStream(a, b);
break;
+ case T_Attr:
+ retval = _equalAttr(a, b);
+ break;
case T_Var:
retval = _equalVar(a, b);
break;
@@ -856,9 +854,6 @@ equal(void *a, void *b)
case T_EState:
retval = _equalEState(a, b);
break;
- case T_Attr:
- retval = _equalAttr(a, b);
- break;
case T_Integer:
case T_String:
case T_Float:
diff --git a/src/backend/nodes/freefuncs.c b/src/backend/nodes/freefuncs.c
index 690da02de8..8eed80e61a 100644
--- a/src/backend/nodes/freefuncs.c
+++ b/src/backend/nodes/freefuncs.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.35 2000/02/15 03:37:08 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.36 2000/02/15 20:49:09 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -730,10 +730,11 @@ _freeRelOptInfo(RelOptInfo *node)
freeObject(node->targetlist);
freeObject(node->pathlist);
- /* XXX is this right? cheapestpath will typically be a pointer into
- * pathlist, won't it?
+ /* XXX is this right? cheapest-path fields will typically be pointers
+ * into pathlist, not separate structs...
*/
- freeObject(node->cheapestpath);
+ freeObject(node->cheapest_startup_path);
+ freeObject(node->cheapest_total_path);
freeObject(node->baserestrictinfo);
freeObject(node->joininfo);
@@ -1013,8 +1014,7 @@ _freeRangeTblEntry(RangeTblEntry *node)
{
if (node->relname)
pfree(node->relname);
- if (node->ref)
- freeObject(node->ref);
+ freeObject(node->ref);
pfree(node);
}
@@ -1024,8 +1024,7 @@ _freeAttr(Attr *node)
{
if (node->relname)
pfree(node->relname);
- if (node->attrs)
- freeObject(node->attrs);
+ freeObject(node->attrs);
pfree(node);
}
@@ -1346,10 +1345,3 @@ freeObject(void *node)
break;
}
}
-
-
-
-
-
-
-
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index e4c35cc277..c40ca9ff9c 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.107 2000/02/15 03:37:09 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.108 2000/02/15 20:49:09 tgl Exp $
*
* NOTES
* Every (plan) node in POSTGRES has an associated "out" routine which
@@ -321,8 +321,9 @@ static void
_outPlanInfo(StringInfo str, Plan *node)
{
appendStringInfo(str,
- ":cost %g :rows %.0f :width %d :state %s :qptargetlist ",
- node->cost,
+ ":startup_cost %.2f :total_cost %.2f :rows %.0f :width %d :state %s :qptargetlist ",
+ node->startup_cost,
+ node->total_cost,
node->plan_rows,
node->plan_width,
node->state ? "not-NULL" : "<>");
@@ -908,15 +909,13 @@ _outRelOptInfo(StringInfo str, RelOptInfo *node)
appendStringInfo(str, " :pathlist ");
_outNode(str, node->pathlist);
- /*
- * Not sure if these are nodes or not. They're declared as struct
- * Path *. Since i don't know, i'll just print the addresses for now.
- * This can be changed later, if necessary.
- */
+ appendStringInfo(str, " :cheapest_startup_path ");
+ _outNode(str, node->cheapest_startup_path);
+ appendStringInfo(str, " :cheapest_total_path ");
+ _outNode(str, node->cheapest_total_path);
appendStringInfo(str,
- " :cheapestpath @ 0x%x :pruneable %s :baserestrictinfo ",
- (int) node->cheapestpath,
+ " :pruneable %s :baserestrictinfo ",
node->pruneable ? "true" : "false");
_outNode(str, node->baserestrictinfo);
@@ -977,9 +976,11 @@ _outRowMark(StringInfo str, RowMark *node)
static void
_outPath(StringInfo str, Path *node)
{
- appendStringInfo(str, " PATH :pathtype %d :cost %.2f :pathkeys ",
+ appendStringInfo(str,
+ " PATH :pathtype %d :startup_cost %.2f :total_cost %.2f :pathkeys ",
node->pathtype,
- node->path_cost);
+ node->startup_cost,
+ node->total_cost);
_outNode(str, node->pathkeys);
}
@@ -990,9 +991,10 @@ static void
_outIndexPath(StringInfo str, IndexPath *node)
{
appendStringInfo(str,
- " INDEXPATH :pathtype %d :cost %.2f :pathkeys ",
+ " INDEXPATH :pathtype %d :startup_cost %.2f :total_cost %.2f :pathkeys ",
node->path.pathtype,
- node->path.path_cost);
+ node->path.startup_cost,
+ node->path.total_cost);
_outNode(str, node->path.pathkeys);
appendStringInfo(str, " :indexid ");
@@ -1001,7 +1003,8 @@ _outIndexPath(StringInfo str, IndexPath *node)
appendStringInfo(str, " :indexqual ");
_outNode(str, node->indexqual);
- appendStringInfo(str, " :joinrelids ");
+ appendStringInfo(str, " :indexscandir %d :joinrelids ",
+ (int) node->indexscandir);
_outIntList(str, node->joinrelids);
}
@@ -1012,9 +1015,10 @@ static void
_outTidPath(StringInfo str, TidPath *node)
{
appendStringInfo(str,
- " TIDPATH :pathtype %d :cost %.2f :pathkeys ",
+ " TIDPATH :pathtype %d :startup_cost %.2f :total_cost %.2f :pathkeys ",
node->path.pathtype,
- node->path.path_cost);
+ node->path.startup_cost,
+ node->path.total_cost);
_outNode(str, node->path.pathkeys);
appendStringInfo(str, " :tideval ");
@@ -1031,9 +1035,10 @@ static void
_outNestPath(StringInfo str, NestPath *node)
{
appendStringInfo(str,
- " NESTPATH :pathtype %d :cost %.2f :pathkeys ",
+ " NESTPATH :pathtype %d :startup_cost %.2f :total_cost %.2f :pathkeys ",
node->path.pathtype,
- node->path.path_cost);
+ node->path.startup_cost,
+ node->path.total_cost);
_outNode(str, node->path.pathkeys);
appendStringInfo(str, " :outerjoinpath ");
_outNode(str, node->outerjoinpath);
@@ -1050,9 +1055,10 @@ static void
_outMergePath(StringInfo str, MergePath *node)
{
appendStringInfo(str,
- " MERGEPATH :pathtype %d :cost %.2f :pathkeys ",
+ " MERGEPATH :pathtype %d :startup_cost %.2f :total_cost %.2f :pathkeys ",
node->jpath.path.pathtype,
- node->jpath.path.path_cost);
+ node->jpath.path.startup_cost,
+ node->jpath.path.total_cost);
_outNode(str, node->jpath.path.pathkeys);
appendStringInfo(str, " :outerjoinpath ");
_outNode(str, node->jpath.outerjoinpath);
@@ -1078,9 +1084,10 @@ static void
_outHashPath(StringInfo str, HashPath *node)
{
appendStringInfo(str,
- " HASHPATH :pathtype %d :cost %.2f :pathkeys ",
+ " HASHPATH :pathtype %d :startup_cost %.2f :total_cost %.2f :pathkeys ",
node->jpath.path.pathtype,
- node->jpath.path.path_cost);
+ node->jpath.path.startup_cost,
+ node->jpath.path.total_cost);
_outNode(str, node->jpath.path.pathkeys);
appendStringInfo(str, " :outerjoinpath ");
_outNode(str, node->jpath.outerjoinpath);
@@ -1364,7 +1371,7 @@ _outNode(StringInfo str, void *obj)
return;
}
- if (nodeTag(obj) == T_List)
+ if (IsA(obj, List))
{
List *l;
@@ -1377,6 +1384,11 @@ _outNode(StringInfo str, void *obj)
}
appendStringInfoChar(str, ')');
}
+ else if (IsA_Value(obj))
+ {
+ /* nodeRead does not want to see { } around these! */
+ _outValue(str, obj);
+ }
else
{
appendStringInfoChar(str, '{');
@@ -1550,11 +1562,6 @@ _outNode(StringInfo str, void *obj)
case T_Stream:
_outStream(str, obj);
break;
- case T_Integer:
- case T_String:
- case T_Float:
- _outValue(str, obj);
- break;
case T_A_Expr:
_outAExpr(str, obj);
break;
diff --git a/src/backend/nodes/print.c b/src/backend/nodes/print.c
index a84b829950..248991c092 100644
--- a/src/backend/nodes/print.c
+++ b/src/backend/nodes/print.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.36 2000/02/15 03:37:09 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.37 2000/02/15 20:49:12 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -175,9 +175,8 @@ print_expr(Node *expr, List *rtable)
{
rt = rt_fetch(var->varno, rtable);
relname = rt->relname;
- if (rt->ref)
- if (rt->ref->relname)
- relname = rt->relname; /* table renamed */
+ if (rt->ref && rt->ref->relname)
+ relname = rt->ref->relname; /* table renamed */
attname = get_attname(rt->relid, var->varattno);
}
break;
@@ -366,8 +365,9 @@ print_plan_recursive(Plan *p, Query *parsetree, int indentLevel, char *label)
return;
for (i = 0; i < indentLevel; i++)
printf(" ");
- printf("%s%s :c=%.4f :r=%.0f :w=%d ", label, plannode_type(p),
- p->cost, p->plan_rows, p->plan_width);
+ printf("%s%s :c=%.2f..%.2f :r=%.0f :w=%d ", label, plannode_type(p),
+ p->startup_cost, p->total_cost,
+ p->plan_rows, p->plan_width);
if (IsA(p, Scan) ||IsA(p, SeqScan))
{
RangeTblEntry *rte;
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 7d56b603b8..7d1e0b4ccc 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.83 2000/02/15 03:37:09 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.84 2000/02/15 20:49:12 tgl Exp $
*
* NOTES
* Most of the read functions for plan nodes are tested. (In fact, they
@@ -217,9 +217,13 @@ _getPlan(Plan *node)
char *token;
int length;
- token = lsptok(NULL, &length); /* first token is :cost */
+ token = lsptok(NULL, &length); /* first token is :startup_cost */
token = lsptok(NULL, &length); /* next is the actual cost */
- node->cost = (Cost) atof(token);
+ node->startup_cost = (Cost) atof(token);
+
+ token = lsptok(NULL, &length); /* skip the :total_cost */
+ token = lsptok(NULL, &length); /* next is the actual cost */
+ node->total_cost = (Cost) atof(token);
token = lsptok(NULL, &length); /* skip the :rows */
token = lsptok(NULL, &length); /* get the plan_rows */
@@ -520,7 +524,6 @@ _readIndexScan()
token = lsptok(NULL, &length); /* eat :indxorderdir */
token = lsptok(NULL, &length); /* get indxorderdir */
-
local_node->indxorderdir = atoi(token);
return local_node;
@@ -1275,18 +1278,15 @@ _readRelOptInfo()
token = lsptok(NULL, &length); /* get :pathlist */
local_node->pathlist = nodeRead(true); /* now read it */
- /*
- * Not sure if these are nodes or not. They're declared as struct
- * Path *. Since i don't know, i'll just print the addresses for now.
- * This can be changed later, if necessary.
- */
-
- token = lsptok(NULL, &length); /* get :cheapestpath */
- token = lsptok(NULL, &length); /* get @ */
- token = lsptok(NULL, &length); /* now read it */
+ token = lsptok(NULL, &length); /* get :cheapest_startup_path */
+ local_node->cheapest_startup_path = nodeRead(true); /* now read it */
- sscanf(token, "%x", (unsigned int *) &local_node->cheapestpath);
+ token = lsptok(NULL, &length); /* get :cheapest_total_path */
+ local_node->cheapest_total_path = nodeRead(true); /* now read it */
+ token = lsptok(NULL, &length); /* eat :pruneable */
+ token = lsptok(NULL, &length); /* get :pruneable */
+ local_node->pruneable = (token[0] == 't') ? true : false;
token = lsptok(NULL, &length); /* get :baserestrictinfo */
local_node->baserestrictinfo = nodeRead(true); /* now read it */
@@ -1322,29 +1322,6 @@ _readTargetEntry()
return local_node;
}
-static List *
-_readList()
-{
- List *local_node = NULL;
- char *token;
- int length;
-
- token = lsptok(NULL, &length); /* eat "(" */
- token = lsptok(NULL, &length); /* get "{" */
- while (strncmp(token, "{", length) == 0)
- {
- nconc(local_node, nodeRead(true));
-
- token = lsptok(NULL, &length); /* eat ")" */
- if (strncmp(token, "}", length) != 0)
- elog(ERROR, "badly formatted attribute list"
- " in planstring \"%.10s\"...\n", token);
- token = lsptok(NULL, &length); /* "{" or ")" */
- }
-
- return local_node;
-}
-
static Attr *
_readAttr()
{
@@ -1356,13 +1333,10 @@ _readAttr()
token = lsptok(NULL, &length); /* eat :relname */
token = lsptok(NULL, &length); /* get relname */
- if (length == 0)
- local_node->relname = pstrdup("");
- else
- local_node->relname = debackslash(token, length);
+ local_node->relname = debackslash(token, length);
token = lsptok(NULL, &length); /* eat :attrs */
- local_node->attrs = _readList();
+ local_node->attrs = nodeRead(true); /* now read it */
return local_node;
}
@@ -1388,7 +1362,7 @@ _readRangeTblEntry()
local_node->relname = debackslash(token, length);
token = lsptok(NULL, &length); /* eat :ref */
- local_node->ref = nodeRead(true);
+ local_node->ref = nodeRead(true); /* now read it */
token = lsptok(NULL, &length); /* eat :relid */
token = lsptok(NULL, &length); /* get :relid */
@@ -1450,9 +1424,13 @@ _readPath()
token = lsptok(NULL, &length); /* now read it */
local_node->pathtype = atol(token);
- token = lsptok(NULL, &length); /* get :cost */
+ token = lsptok(NULL, &length); /* get :startup_cost */
+ token = lsptok(NULL, &length); /* now read it */
+ local_node->startup_cost = (Cost) atof(token);
+
+ token = lsptok(NULL, &length); /* get :total_cost */
token = lsptok(NULL, &length); /* now read it */
- local_node->path_cost = (Cost) atof(token);
+ local_node->total_cost = (Cost) atof(token);
token = lsptok(NULL, &length); /* get :pathkeys */
local_node->pathkeys = nodeRead(true); /* now read it */
@@ -1479,9 +1457,13 @@ _readIndexPath()
token = lsptok(NULL, &length); /* now read it */
local_node->path.pathtype = atol(token);
- token = lsptok(NULL, &length); /* get :cost */
+ token = lsptok(NULL, &length); /* get :startup_cost */
token = lsptok(NULL, &length); /* now read it */
- local_node->path.path_cost = (Cost) atof(token);
+ local_node->path.startup_cost = (Cost) atof(token);
+
+ token = lsptok(NULL, &length); /* get :total_cost */
+ token = lsptok(NULL, &length); /* now read it */
+ local_node->path.total_cost = (Cost) atof(token);
token = lsptok(NULL, &length); /* get :pathkeys */
local_node->path.pathkeys = nodeRead(true); /* now read it */
@@ -1492,6 +1474,10 @@ _readIndexPath()
token = lsptok(NULL, &length); /* get :indexqual */
local_node->indexqual = nodeRead(true); /* now read it */
+ token = lsptok(NULL, &length); /* get :indexscandir */
+ token = lsptok(NULL, &length); /* now read it */
+ local_node->indexscandir = (ScanDirection) atoi(token);
+
token = lsptok(NULL, &length); /* get :joinrelids */
local_node->joinrelids = toIntList(nodeRead(true));
@@ -1517,9 +1503,13 @@ _readTidPath()
token = lsptok(NULL, &length); /* now read it */
local_node->path.pathtype = atol(token);
- token = lsptok(NULL, &length); /* get :cost */
+ token = lsptok(NULL, &length); /* get :startup_cost */
token = lsptok(NULL, &length); /* now read it */
- local_node->path.path_cost = (Cost) atof(token);
+ local_node->path.startup_cost = (Cost) atof(token);
+
+ token = lsptok(NULL, &length); /* get :total_cost */
+ token = lsptok(NULL, &length); /* now read it */
+ local_node->path.total_cost = (Cost) atof(token);
token = lsptok(NULL, &length); /* get :pathkeys */
local_node->path.pathkeys = nodeRead(true); /* now read it */
@@ -1552,9 +1542,13 @@ _readNestPath()
token = lsptok(NULL, &length); /* now read it */
local_node->path.pathtype = atol(token);
- token = lsptok(NULL, &length); /* get :cost */
+ token = lsptok(NULL, &length); /* get :startup_cost */
+ token = lsptok(NULL, &length); /* now read it */
+ local_node->path.startup_cost = (Cost) atof(token);
+
+ token = lsptok(NULL, &length); /* get :total_cost */
token = lsptok(NULL, &length); /* now read it */
- local_node->path.path_cost = (Cost) atof(token);
+ local_node->path.total_cost = (Cost) atof(token);
token = lsptok(NULL, &length); /* get :pathkeys */
local_node->path.pathkeys = nodeRead(true); /* now read it */
@@ -1588,13 +1582,15 @@ _readMergePath()
token = lsptok(NULL, &length); /* get :pathtype */
token = lsptok(NULL, &length); /* now read it */
-
local_node->jpath.path.pathtype = atol(token);
- token = lsptok(NULL, &length); /* get :cost */
+ token = lsptok(NULL, &length); /* get :startup_cost */
token = lsptok(NULL, &length); /* now read it */
+ local_node->jpath.path.startup_cost = (Cost) atof(token);
- local_node->jpath.path.path_cost = (Cost) atof(token);
+ token = lsptok(NULL, &length); /* get :total_cost */
+ token = lsptok(NULL, &length); /* now read it */
+ local_node->jpath.path.total_cost = (Cost) atof(token);
token = lsptok(NULL, &length); /* get :pathkeys */
local_node->jpath.path.pathkeys = nodeRead(true); /* now read it */
@@ -1637,13 +1633,15 @@ _readHashPath()
token = lsptok(NULL, &length); /* get :pathtype */
token = lsptok(NULL, &length); /* now read it */
-
local_node->jpath.path.pathtype = atol(token);
- token = lsptok(NULL, &length); /* get :cost */
+ token = lsptok(NULL, &length); /* get :startup_cost */
token = lsptok(NULL, &length); /* now read it */
+ local_node->jpath.path.startup_cost = (Cost) atof(token);
- local_node->jpath.path.path_cost = (Cost) atof(token);
+ token = lsptok(NULL, &length); /* get :total_cost */
+ token = lsptok(NULL, &length); /* now read it */
+ local_node->jpath.path.total_cost = (Cost) atof(token);
token = lsptok(NULL, &length); /* get :pathkeys */
local_node->jpath.path.pathkeys = nodeRead(true); /* now read it */
@@ -1886,14 +1884,6 @@ parsePlanString(void)
return_value = _readCaseWhen();
else if (length == 7 && strncmp(token, "ROWMARK", length) == 0)
return_value = _readRowMark();
-#if 0
- else if (length == 1 && strncmp(token, "{", length) == 0)
- {
- /* raw list (of strings?) found in Attr structure - thomas 2000-02-09 */
- return_value = nodeRead(true);
- token = lsptok(NULL, &length); /* eat trailing brace */
- }
-#endif
else
elog(ERROR, "badly formatted planstring \"%.10s\"...\n", token);