Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
9e964f90
Commit
9e964f90
authored
Jul 15, 1998
by
Bruce Momjian
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix explain for union and inheritance. Rename Append structure
members to be clearer. Fix cost computation for these.
parent
9fdbbdc8
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
185 additions
and
128 deletions
+185
-128
src/backend/commands/explain.c
src/backend/commands/explain.c
+36
-1
src/backend/executor/execTuples.c
src/backend/executor/execTuples.c
+7
-7
src/backend/executor/nodeAppend.c
src/backend/executor/nodeAppend.c
+69
-73
src/backend/nodes/copyfuncs.c
src/backend/nodes/copyfuncs.c
+6
-6
src/backend/nodes/outfuncs.c
src/backend/nodes/outfuncs.c
+8
-8
src/backend/nodes/print.c
src/backend/nodes/print.c
+18
-1
src/backend/nodes/readfuncs.c
src/backend/nodes/readfuncs.c
+10
-10
src/backend/optimizer/plan/subselect.c
src/backend/optimizer/plan/subselect.c
+1
-1
src/backend/optimizer/prep/prepunion.c
src/backend/optimizer/prep/prepunion.c
+17
-14
src/include/nodes/plannodes.h
src/include/nodes/plannodes.h
+13
-7
No files found.
src/backend/commands/explain.c
View file @
9e964f90
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.
19 1998/04/27 16:57:09 scrappy
Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.
20 1998/07/15 14:54:29 momjian
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -20,6 +20,7 @@
#include <tcop/tcopprot.h>
#include <lib/stringinfo.h>
#include <commands/explain.h>
#include <parser/parsetree.h>
#include <parser/parse_node.h>
#include <optimizer/planner.h>
#include <access/xact.h>
...
...
@@ -269,6 +270,40 @@ explain_outNode(StringInfo str, Plan *plan, int indent, ExplainState *es)
}
es
->
rtable
=
saved_rtable
;
}
if
(
nodeTag
(
plan
)
==
T_Append
)
{
List
*
saved_rtable
=
es
->
rtable
;
List
*
lst
;
int
whichplan
=
0
;
Append
*
appendplan
=
(
Append
*
)
plan
;
foreach
(
lst
,
appendplan
->
appendplans
)
{
Plan
*
subnode
=
(
Plan
*
)
lfirst
(
lst
);
if
(
appendplan
->
inheritrelid
>
0
)
{
ResTarget
*
rtentry
;
es
->
rtable
=
appendplan
->
inheritrtable
;
rtentry
=
nth
(
whichplan
,
appendplan
->
inheritrtable
);
Assert
(
rtentry
!=
NULL
);
rt_store
(
appendplan
->
inheritrelid
,
es
->
rtable
,
rtentry
);
}
else
es
->
rtable
=
nth
(
whichplan
,
appendplan
->
unionrtables
);
for
(
i
=
0
;
i
<
indent
;
i
++
)
appendStringInfo
(
str
,
" "
);
appendStringInfo
(
str
,
" -> "
);
explain_outNode
(
str
,
subnode
,
indent
+
4
,
es
);
whichplan
++
;
}
es
->
rtable
=
saved_rtable
;
}
return
;
}
...
...
src/backend/executor/execTuples.c
View file @
9e964f90
...
...
@@ -14,7 +14,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/execTuples.c,v 1.1
8 1998/04/24 14:41:46
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/executor/execTuples.c,v 1.1
9 1998/07/15 14:54:29
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -712,16 +712,16 @@ NodeGetResultTupleSlot(Plan *node)
case
T_Append
:
{
Append
*
n
=
(
Append
*
)
node
;
AppendState
*
union
state
;
List
*
union
plans
;
AppendState
*
append
state
;
List
*
append
plans
;
int
whichplan
;
Plan
*
subplan
;
unionstate
=
n
->
union
state
;
unionplans
=
n
->
union
plans
;
whichplan
=
union
state
->
as_whichplan
;
appendstate
=
n
->
append
state
;
appendplans
=
n
->
append
plans
;
whichplan
=
append
state
->
as_whichplan
;
subplan
=
(
Plan
*
)
nth
(
whichplan
,
union
plans
);
subplan
=
(
Plan
*
)
nth
(
whichplan
,
append
plans
);
slot
=
NodeGetResultTupleSlot
(
subplan
);
break
;
}
...
...
src/backend/executor/nodeAppend.c
View file @
9e964f90
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/nodeAppend.c,v 1.1
2 1998/06/15 19:28:21
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/executor/nodeAppend.c,v 1.1
3 1998/07/15 14:54:30
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -79,31 +79,29 @@ static bool
exec_append_initialize_next
(
Append
*
node
)
{
EState
*
estate
;
AppendState
*
union
state
;
AppendState
*
append
state
;
TupleTableSlot
*
result_slot
;
List
*
rangeTable
;
int
whichplan
;
int
nplans
;
List
*
rts
;
List
*
rt
entries
;
List
*
rt
able
s
;
List
*
rt
able
;
ResTarget
*
rtentry
;
Index
unionrelid
;
/* ----------------
* get information from the append node
* ----------------
*/
estate
=
node
->
plan
.
state
;
unionstate
=
node
->
union
state
;
result_slot
=
union
state
->
cstate
.
cs_ResultTupleSlot
;
appendstate
=
node
->
append
state
;
result_slot
=
append
state
->
cstate
.
cs_ResultTupleSlot
;
rangeTable
=
estate
->
es_range_table
;
whichplan
=
union
state
->
as_whichplan
;
nplans
=
union
state
->
as_nplans
;
rt
s
=
node
->
unionrt
s
;
rt
entries
=
node
->
unionrtentries
;
whichplan
=
append
state
->
as_whichplan
;
nplans
=
append
state
->
as_nplans
;
rt
ables
=
node
->
unionrtable
s
;
rt
able
=
node
->
inheritrtable
;
if
(
whichplan
<
0
)
{
...
...
@@ -115,7 +113,7 @@ exec_append_initialize_next(Append *node)
* at the end of the line by returning FALSE
* ----------------
*/
union
state
->
as_whichplan
=
0
;
append
state
->
as_whichplan
=
0
;
return
FALSE
;
}
...
...
@@ -126,7 +124,7 @@ exec_append_initialize_next(Append *node)
* the last scan in our list..
* ----------------
*/
union
state
->
as_whichplan
=
nplans
-
1
;
append
state
->
as_whichplan
=
nplans
-
1
;
return
FALSE
;
}
...
...
@@ -139,29 +137,27 @@ exec_append_initialize_next(Append *node)
* of the Append node??? - jolly )
* ----------------
*/
if
(
node
->
union
relid
>
0
)
if
(
node
->
inherit
relid
>
0
)
{
rtentry
=
nth
(
whichplan
,
rt
entries
);
rtentry
=
nth
(
whichplan
,
rt
able
);
Assert
(
rtentry
!=
NULL
);
unionrelid
=
node
->
unionrelid
;
rt_store
(
unionrelid
,
rangeTable
,
rtentry
);
rt_store
(
node
->
inheritrelid
,
rangeTable
,
rtentry
);
}
else
estate
->
es_range_table
=
nth
(
whichplan
,
rts
);
estate
->
es_range_table
=
nth
(
whichplan
,
rt
able
s
);
if
(
union
state
->
as_junkFilter_list
)
if
(
append
state
->
as_junkFilter_list
)
{
estate
->
es_junkFilter
=
(
JunkFilter
*
)
nth
(
whichplan
,
union
state
->
as_junkFilter_list
);
append
state
->
as_junkFilter_list
);
}
if
(
union
state
->
as_result_relation_info_list
)
if
(
append
state
->
as_result_relation_info_list
)
{
estate
->
es_result_relation_info
=
(
RelationInfo
*
)
nth
(
whichplan
,
union
state
->
as_result_relation_info_list
);
append
state
->
as_result_relation_info_list
);
}
result_slot
->
ttc_whichplan
=
whichplan
;
...
...
@@ -187,11 +183,11 @@ exec_append_initialize_next(Append *node)
bool
ExecInitAppend
(
Append
*
node
,
EState
*
estate
,
Plan
*
parent
)
{
AppendState
*
union
state
;
AppendState
*
append
state
;
int
nplans
;
List
*
resultList
=
NULL
;
List
*
rt
entries
;
List
*
union
plans
;
List
*
rt
able
;
List
*
append
plans
;
bool
*
initialized
;
int
i
;
Plan
*
initNode
;
...
...
@@ -205,9 +201,9 @@ ExecInitAppend(Append *node, EState *estate, Plan *parent)
*/
node
->
plan
.
state
=
estate
;
unionplans
=
node
->
union
plans
;
nplans
=
length
(
union
plans
);
rt
entries
=
node
->
unionrtentries
;
appendplans
=
node
->
append
plans
;
nplans
=
length
(
append
plans
);
rt
able
=
node
->
inheritrtable
;
CXT1_printf
(
"ExecInitAppend: context is %d
\n
"
,
CurrentMemoryContext
);
initialized
=
(
bool
*
)
palloc
(
nplans
*
sizeof
(
bool
));
...
...
@@ -216,13 +212,13 @@ ExecInitAppend(Append *node, EState *estate, Plan *parent)
* create new AppendState for our append node
* ----------------
*/
union
state
=
makeNode
(
AppendState
);
union
state
->
as_whichplan
=
0
;
union
state
->
as_nplans
=
nplans
;
union
state
->
as_initialized
=
initialized
;
unionstate
->
as_rtentries
=
rtentries
;
append
state
=
makeNode
(
AppendState
);
append
state
->
as_whichplan
=
0
;
append
state
->
as_nplans
=
nplans
;
append
state
->
as_initialized
=
initialized
;
appendstate
->
as_rtentries
=
rtable
;
node
->
unionstate
=
union
state
;
node
->
appendstate
=
append
state
;
/* ----------------
* Miscellanious initialization
...
...
@@ -234,7 +230,7 @@ ExecInitAppend(Append *node, EState *estate, Plan *parent)
* never call ExecQual or ExecTargetList.
* ----------------
*/
ExecAssignNodeBaseInfo
(
estate
,
&
union
state
->
cstate
,
parent
);
ExecAssignNodeBaseInfo
(
estate
,
&
append
state
->
cstate
,
parent
);
#define APPEND_NSLOTS 1
/* ----------------
...
...
@@ -242,7 +238,7 @@ ExecInitAppend(Append *node, EState *estate, Plan *parent)
* to tuples, so we have to initialize them..
* ----------------
*/
ExecInitResultTupleSlot
(
estate
,
&
union
state
->
cstate
);
ExecInitResultTupleSlot
(
estate
,
&
append
state
->
cstate
);
/*
* If the inherits rtentry is the result relation, we have to make a
...
...
@@ -252,12 +248,12 @@ ExecInitAppend(Append *node, EState *estate, Plan *parent)
* e.g. replace p (age = p.age + 1) from p in person*
*/
if
((
es_rri
!=
(
RelationInfo
*
)
NULL
)
&&
(
node
->
union
relid
==
es_rri
->
ri_RangeTableIndex
))
(
node
->
inherit
relid
==
es_rri
->
ri_RangeTableIndex
))
{
RelationInfo
*
rri
;
List
*
rtentryP
;
foreach
(
rtentryP
,
rt
entries
)
foreach
(
rtentryP
,
rt
able
)
{
Oid
reloid
;
RangeTblEntry
*
rtentry
=
lfirst
(
rtentryP
);
...
...
@@ -273,7 +269,7 @@ ExecInitAppend(Append *node, EState *estate, Plan *parent)
resultList
=
lcons
(
rri
,
resultList
);
ExecOpenIndices
(
reloid
,
rri
);
}
union
state
->
as_result_relation_info_list
=
resultList
;
append
state
->
as_result_relation_info_list
=
resultList
;
}
/* ----------------
* call ExecInitNode on each of the plans in our list
...
...
@@ -294,10 +290,10 @@ ExecInitAppend(Append *node, EState *estate, Plan *parent)
* since it may use the range table.
* ----------------
*/
union
state
->
as_whichplan
=
i
;
append
state
->
as_whichplan
=
i
;
exec_append_initialize_next
(
node
);
initNode
=
(
Plan
*
)
nth
(
i
,
union
plans
);
initNode
=
(
Plan
*
)
nth
(
i
,
append
plans
);
initialized
[
i
]
=
ExecInitNode
(
initNode
,
estate
,
(
Plan
*
)
node
);
/* ---------------
...
...
@@ -308,7 +304,7 @@ ExecInitAppend(Append *node, EState *estate, Plan *parent)
* ---------------
*/
if
((
es_rri
!=
(
RelationInfo
*
)
NULL
)
&&
(
node
->
union
relid
==
es_rri
->
ri_RangeTableIndex
))
(
node
->
inherit
relid
==
es_rri
->
ri_RangeTableIndex
))
{
targetList
=
initNode
->
targetlist
;
...
...
@@ -317,7 +313,7 @@ ExecInitAppend(Append *node, EState *estate, Plan *parent)
}
}
union
state
->
as_junkFilter_list
=
junkList
;
append
state
->
as_junkFilter_list
=
junkList
;
if
(
junkList
!=
NIL
)
estate
->
es_junkFilter
=
(
JunkFilter
*
)
lfirst
(
junkList
);
...
...
@@ -325,17 +321,17 @@ ExecInitAppend(Append *node, EState *estate, Plan *parent)
* initialize the return type from the appropriate subplan.
* ----------------
*/
initNode
=
(
Plan
*
)
nth
(
0
,
union
plans
);
ExecAssignResultType
(
&
union
state
->
cstate
,
initNode
=
(
Plan
*
)
nth
(
0
,
append
plans
);
ExecAssignResultType
(
&
append
state
->
cstate
,
/* ExecGetExecTupDesc(initNode), */
ExecGetTupType
(
initNode
));
union
state
->
cstate
.
cs_ProjInfo
=
NULL
;
append
state
->
cstate
.
cs_ProjInfo
=
NULL
;
/* ----------------
* return the result from the first subplan's initialization
* ----------------
*/
union
state
->
as_whichplan
=
0
;
append
state
->
as_whichplan
=
0
;
exec_append_initialize_next
(
node
);
#if 0
result = (List *) initialized[0];
...
...
@@ -347,10 +343,10 @@ int
ExecCountSlotsAppend
(
Append
*
node
)
{
List
*
plan
;
List
*
unionplans
=
node
->
union
plans
;
List
*
appendplans
=
node
->
append
plans
;
int
nSlots
=
0
;
foreach
(
plan
,
union
plans
)
foreach
(
plan
,
append
plans
)
nSlots
+=
ExecCountSlotsNode
((
Plan
*
)
lfirst
(
plan
));
return
nSlots
+
APPEND_NSLOTS
;
}
...
...
@@ -367,10 +363,10 @@ TupleTableSlot *
ExecProcAppend
(
Append
*
node
)
{
EState
*
estate
;
AppendState
*
union
state
;
AppendState
*
append
state
;
int
whichplan
;
List
*
union
plans
;
List
*
append
plans
;
Plan
*
subnode
;
TupleTableSlot
*
result
;
TupleTableSlot
*
result_slot
;
...
...
@@ -380,19 +376,19 @@ ExecProcAppend(Append *node)
* get information from the node
* ----------------
*/
unionstate
=
node
->
union
state
;
appendstate
=
node
->
append
state
;
estate
=
node
->
plan
.
state
;
direction
=
estate
->
es_direction
;
unionplans
=
node
->
union
plans
;
whichplan
=
union
state
->
as_whichplan
;
result_slot
=
union
state
->
cstate
.
cs_ResultTupleSlot
;
appendplans
=
node
->
append
plans
;
whichplan
=
append
state
->
as_whichplan
;
result_slot
=
append
state
->
cstate
.
cs_ResultTupleSlot
;
/* ----------------
* figure out which subplan we are currently processing
* ----------------
*/
subnode
=
(
Plan
*
)
nth
(
whichplan
,
union
plans
);
subnode
=
(
Plan
*
)
nth
(
whichplan
,
append
plans
);
if
(
subnode
==
NULL
)
elog
(
DEBUG
,
"ExecProcAppend: subnode is NULL"
);
...
...
@@ -421,12 +417,12 @@ ExecProcAppend(Append *node)
* direction and try processing again (recursively)
* ----------------
*/
whichplan
=
union
state
->
as_whichplan
;
whichplan
=
append
state
->
as_whichplan
;
if
(
ScanDirectionIsForward
(
direction
))
union
state
->
as_whichplan
=
whichplan
+
1
;
append
state
->
as_whichplan
=
whichplan
+
1
;
else
union
state
->
as_whichplan
=
whichplan
-
1
;
append
state
->
as_whichplan
=
whichplan
-
1
;
/* ----------------
* return something from next node or an empty slot
...
...
@@ -454,9 +450,9 @@ ExecProcAppend(Append *node)
void
ExecEndAppend
(
Append
*
node
)
{
AppendState
*
union
state
;
AppendState
*
append
state
;
int
nplans
;
List
*
union
plans
;
List
*
append
plans
;
bool
*
initialized
;
int
i
;
List
*
resultRelationInfoList
;
...
...
@@ -466,10 +462,10 @@ ExecEndAppend(Append *node)
* get information from the node
* ----------------
*/
unionstate
=
node
->
union
state
;
unionplans
=
node
->
union
plans
;
nplans
=
union
state
->
as_nplans
;
initialized
=
union
state
->
as_initialized
;
appendstate
=
node
->
append
state
;
appendplans
=
node
->
append
plans
;
nplans
=
append
state
->
as_nplans
;
initialized
=
append
state
->
as_initialized
;
/* ----------------
* shut down each of the subscans
...
...
@@ -478,14 +474,14 @@ ExecEndAppend(Append *node)
for
(
i
=
0
;
i
<
nplans
;
i
++
)
{
if
(
initialized
[
i
]
==
TRUE
)
ExecEndNode
((
Plan
*
)
nth
(
i
,
union
plans
),
(
Plan
*
)
node
);
ExecEndNode
((
Plan
*
)
nth
(
i
,
append
plans
),
(
Plan
*
)
node
);
}
/* ----------------
* close out the different result relations
* ----------------
*/
resultRelationInfoList
=
union
state
->
as_result_relation_info_list
;
resultRelationInfoList
=
append
state
->
as_result_relation_info_list
;
while
(
resultRelationInfoList
!=
NIL
)
{
Relation
resultRelationDesc
;
...
...
@@ -496,11 +492,11 @@ ExecEndAppend(Append *node)
pfree
(
resultRelationInfo
);
resultRelationInfoList
=
lnext
(
resultRelationInfoList
);
}
if
(
union
state
->
as_result_relation_info_list
)
pfree
(
union
state
->
as_result_relation_info_list
);
if
(
append
state
->
as_result_relation_info_list
)
pfree
(
append
state
->
as_result_relation_info_list
);
/*
* XXX should free
union
state->as_rtentries and
*
union
state->as_junkfilter_list here
* XXX should free
append
state->as_rtentries and
*
append
state->as_junkfilter_list here
*/
}
src/backend/nodes/copyfuncs.c
View file @
9e964f90
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.4
2 1998/06/15 19:28:30
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.4
3 1998/07/15 14:54:31
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -162,11 +162,11 @@ _copyAppend(Append *from)
* copy remainder of node
* ----------------
*/
Node_Copy
(
from
,
newnode
,
union
plans
);
Node_Copy
(
from
,
newnode
,
unionrts
);
newnode
->
unionrelid
=
from
->
union
relid
;
Node_Copy
(
from
,
newnode
,
unionrtentries
);
Node_Copy
(
from
,
newnode
,
union
state
);
Node_Copy
(
from
,
newnode
,
append
plans
);
Node_Copy
(
from
,
newnode
,
unionrt
able
s
);
newnode
->
inheritrelid
=
from
->
inherit
relid
;
Node_Copy
(
from
,
newnode
,
inheritrtable
);
Node_Copy
(
from
,
newnode
,
append
state
);
return
newnode
;
}
...
...
src/backend/nodes/outfuncs.c
View file @
9e964f90
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.
39 1998/07/14 01:45:24
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.
40 1998/07/15 14:54:32
momjian Exp $
*
* NOTES
* Every (plan) node in POSTGRES has an associated "out" routine which
...
...
@@ -354,17 +354,17 @@ _outAppend(StringInfo str, Append *node)
appendStringInfo
(
str
,
" APPEND "
);
_outPlanInfo
(
str
,
(
Plan
*
)
node
);
appendStringInfo
(
str
,
" :
union
plans "
);
_outNode
(
str
,
node
->
union
plans
);
appendStringInfo
(
str
,
" :
append
plans "
);
_outNode
(
str
,
node
->
append
plans
);
appendStringInfo
(
str
,
" :unionrts "
);
_outNode
(
str
,
node
->
unionrts
);
appendStringInfo
(
str
,
" :unionrt
able
s "
);
_outNode
(
str
,
node
->
unionrt
able
s
);
sprintf
(
buf
,
" :
unionrelid %d "
,
node
->
union
relid
);
sprintf
(
buf
,
" :
inheritrelid %d "
,
node
->
inherit
relid
);
appendStringInfo
(
str
,
buf
);
appendStringInfo
(
str
,
" :
unionrtentries
"
);
_outNode
(
str
,
node
->
unionrtentries
);
appendStringInfo
(
str
,
" :
inheritrtable
"
);
_outNode
(
str
,
node
->
inheritrtable
);
}
...
...
src/backend/nodes/print.c
View file @
9e964f90
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.1
5 1998/06/15 19:28:32
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.1
6 1998/07/15 14:54:33
momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
...
...
@@ -387,6 +387,23 @@ print_plan_recursive(Plan *p, Query *parsetree, int indentLevel, char *label)
printf
(
"
\n
"
);
print_plan_recursive
(
p
->
lefttree
,
parsetree
,
indentLevel
+
3
,
"l: "
);
print_plan_recursive
(
p
->
righttree
,
parsetree
,
indentLevel
+
3
,
"r: "
);
if
(
nodeTag
(
p
)
==
T_Append
)
{
List
*
lst
;
int
whichplan
=
0
;
Append
*
appendplan
=
(
Append
*
)
p
;
foreach
(
lst
,
appendplan
->
appendplans
)
{
Plan
*
subnode
=
(
Plan
*
)
lfirst
(
lst
);
/* I don't think we need to fiddle with the range table here, bjm */
print_plan_recursive
(
subnode
,
parsetree
,
indentLevel
+
3
,
"a: "
);
whichplan
++
;
}
}
}
/* print_plan
...
...
src/backend/nodes/readfuncs.c
View file @
9e964f90
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.3
1 1998/07/14 01:45:2
4 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.3
2 1998/07/15 14:54:3
4 momjian Exp $
*
* NOTES
* Most of the read functions for plan nodes are tested. (In fact, they
...
...
@@ -322,18 +322,18 @@ _readAppend()
_getPlan
((
Plan
*
)
local_node
);
token
=
lsptok
(
NULL
,
&
length
);
/* eat :
union
plans */
local_node
->
union
plans
=
nodeRead
(
true
);
/* now read it */
token
=
lsptok
(
NULL
,
&
length
);
/* eat :
append
plans */
local_node
->
append
plans
=
nodeRead
(
true
);
/* now read it */
token
=
lsptok
(
NULL
,
&
length
);
/* eat :unionrts */
local_node
->
unionrts
=
nodeRead
(
true
);
/* now read it */
token
=
lsptok
(
NULL
,
&
length
);
/* eat :unionrt
able
s */
local_node
->
unionrt
able
s
=
nodeRead
(
true
);
/* now read it */
token
=
lsptok
(
NULL
,
&
length
);
/* eat :
union
relid */
token
=
lsptok
(
NULL
,
&
length
);
/* get
union
relid */
local_node
->
union
relid
=
strtoul
(
token
,
NULL
,
10
);
token
=
lsptok
(
NULL
,
&
length
);
/* eat :
inherit
relid */
token
=
lsptok
(
NULL
,
&
length
);
/* get
inherit
relid */
local_node
->
inherit
relid
=
strtoul
(
token
,
NULL
,
10
);
token
=
lsptok
(
NULL
,
&
length
);
/* eat :
unionrtentries
*/
local_node
->
unionrtentries
=
nodeRead
(
true
);
/* now read it */
token
=
lsptok
(
NULL
,
&
length
);
/* eat :
inheritrtable
*/
local_node
->
inheritrtable
=
nodeRead
(
true
);
/* now read it */
return
(
local_node
);
}
...
...
src/backend/optimizer/plan/subselect.c
View file @
9e964f90
...
...
@@ -432,7 +432,7 @@ SS_finalize_plan(Plan *plan)
break
;
case
T_Append
:
foreach
(
lst
,
((
Append
*
)
plan
)
->
union
plans
)
foreach
(
lst
,
((
Append
*
)
plan
)
->
append
plans
)
param_list
=
set_unioni
(
param_list
,
SS_finalize_plan
((
Plan
*
)
lfirst
(
lst
)));
break
;
...
...
src/backend/optimizer/prep/prepunion.c
View file @
9e964f90
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.2
4 1998/06/15 19:28:46
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.2
5 1998/07/15 14:54:37
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -48,8 +48,8 @@ static void
fix_parsetree_attnums
(
Index
rt_index
,
Oid
old_relid
,
Oid
new_relid
,
Query
*
parsetree
);
static
Append
*
make_append
(
List
*
unionplans
,
List
*
unionrt
s
,
Index
rt_index
,
List
*
union_rt_entries
,
List
*
tlist
);
make_append
(
List
*
appendplans
,
List
*
unionrtable
s
,
Index
rt_index
,
List
*
inheritrtable
,
List
*
tlist
);
/*
...
...
@@ -224,7 +224,7 @@ plan_inherit_queries(Query *parse, Index rt_index)
List
*
rangetable
=
parse
->
rtable
;
RangeTblEntry
*
rt_entry
=
rt_fetch
(
rt_index
,
rangetable
);
List
*
union_rt_entries
=
NIL
;
List
*
inheritrtable
=
NIL
;
List
*
union_relids
=
NIL
;
union_relids
=
...
...
@@ -239,12 +239,12 @@ plan_inherit_queries(Query *parse, Index rt_index)
rt_fetch
(
rt_index
,
rangetable
)
->
inh
=
false
;
union_plans
=
plan_inherit_query
(
union_relids
,
rt_index
,
rt_entry
,
parse
,
&
union_rt_entries
);
parse
,
&
inheritrtable
);
return
(
make_append
(
union_plans
,
NULL
,
rt_index
,
union_rt_entries
,
inheritrtable
,
((
Plan
*
)
lfirst
(
union_plans
))
->
targetlist
));
}
...
...
@@ -494,19 +494,22 @@ fix_parsetree_attnums(Index rt_index,
}
static
Append
*
make_append
(
List
*
union
plans
,
List
*
unionrts
,
make_append
(
List
*
append
plans
,
List
*
unionrt
able
s
,
Index
rt_index
,
List
*
union_rt_entries
,
List
*
inheritrtable
,
List
*
tlist
)
{
Append
*
node
=
makeNode
(
Append
);
node
->
unionplans
=
unionplans
;
node
->
unionrts
=
unionrts
;
node
->
unionrelid
=
rt_index
;
node
->
unionrtentries
=
union_rt_entries
;
List
*
subnode
;
node
->
appendplans
=
appendplans
;
node
->
unionrtables
=
unionrtables
;
node
->
inheritrelid
=
rt_index
;
node
->
inheritrtable
=
inheritrtable
;
node
->
plan
.
cost
=
0
.
0
;
foreach
(
subnode
,
appendplans
)
node
->
plan
.
cost
+=
((
Plan
*
)
lfirst
(
subnode
))
->
cost
;
node
->
plan
.
state
=
(
EState
*
)
NULL
;
node
->
plan
.
targetlist
=
tlist
;
node
->
plan
.
qual
=
NIL
;
...
...
src/include/nodes/plannodes.h
View file @
9e964f90
...
...
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: plannodes.h,v 1.1
5 1998/02/26 04:42:01
momjian Exp $
* $Id: plannodes.h,v 1.1
6 1998/07/15 14:54:39
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -24,7 +24,7 @@
* control nodes
*
* Result ResultState resstate;
* Append AppendState
union
state;
* Append AppendState
append
state;
*
* scan nodes
*
...
...
@@ -138,11 +138,17 @@ typedef struct Result
typedef
struct
Append
{
Plan
plan
;
List
*
unionplans
;
List
*
unionrts
;
Index
unionrelid
;
List
*
unionrtentries
;
AppendState
*
unionstate
;
List
*
appendplans
;
List
*
unionrtables
;
/*
* List of range tables, one for each
* union query.
*/
Index
inheritrelid
;
/*
* The range table has to be changed for
* inheritance.
*/
List
*
inheritrtable
;
AppendState
*
appendstate
;
}
Append
;
/*
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment