Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
9e964f90
G
Gpdb
项目概览
Greenplum
/
Gpdb
通知
7
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
Gpdb
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9e964f90
编写于
7月 15, 1998
作者:
B
Bruce Momjian
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix explain for union and inheritance. Rename Append structure
members to be clearer. Fix cost computation for these.
上级
9fdbbdc8
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
185 addition
and
128 deletion
+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
未找到文件。
src/backend/commands/explain.c
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
;
/*
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录