Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
ad4b27ac
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,发现更多精彩内容 >>
提交
ad4b27ac
编写于
2月 12, 1999
作者:
B
Bruce Momjian
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Optimizer cleanup.
上级
c0d17c7a
变更
13
显示空白变更内容
内联
并排
Showing
13 changed file
with
88 addition
and
84 deletion
+88
-84
src/backend/optimizer/geqo/geqo_misc.c
src/backend/optimizer/geqo/geqo_misc.c
+4
-4
src/backend/optimizer/geqo/geqo_paths.c
src/backend/optimizer/geqo/geqo_paths.c
+2
-2
src/backend/optimizer/path/allpaths.c
src/backend/optimizer/path/allpaths.c
+4
-4
src/backend/optimizer/path/costsize.c
src/backend/optimizer/path/costsize.c
+2
-2
src/backend/optimizer/path/joinpath.c
src/backend/optimizer/path/joinpath.c
+2
-1
src/backend/optimizer/path/predmig.c
src/backend/optimizer/path/predmig.c
+26
-26
src/backend/optimizer/path/prune.c
src/backend/optimizer/path/prune.c
+4
-4
src/backend/optimizer/path/xfunc.c
src/backend/optimizer/path/xfunc.c
+21
-21
src/backend/optimizer/plan/createplan.c
src/backend/optimizer/plan/createplan.c
+4
-4
src/include/executor/nodeNestloop.h
src/include/executor/nodeNestloop.h
+3
-2
src/include/nodes/relation.h
src/include/nodes/relation.h
+6
-4
src/include/optimizer/cost.h
src/include/optimizer/cost.h
+2
-2
src/include/optimizer/xfunc.h
src/include/optimizer/xfunc.h
+8
-8
未找到文件。
src/backend/optimizer/geqo/geqo_misc.c
浏览文件 @
ad4b27ac
...
...
@@ -5,7 +5,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: geqo_misc.c,v 1.1
5 1999/02/12 06:43:26
momjian Exp $
* $Id: geqo_misc.c,v 1.1
6 1999/02/12 17:24:47
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -158,7 +158,7 @@ void
geqo_print_path
(
Query
*
root
,
Path
*
path
,
int
indent
)
{
char
*
ptype
=
NULL
;
Nest
Path
*
jp
;
Join
Path
*
jp
;
bool
join
=
false
;
int
i
;
...
...
@@ -194,7 +194,7 @@ geqo_print_path(Query *root, Path *path, int indent)
{
int
size
=
path
->
parent
->
size
;
jp
=
(
Nest
Path
*
)
path
;
jp
=
(
Join
Path
*
)
path
;
printf
(
"%s size=%d cost=%f
\n
"
,
ptype
,
size
,
path
->
path_cost
);
switch
(
nodeTag
(
path
))
{
...
...
@@ -203,7 +203,7 @@ geqo_print_path(Query *root, Path *path, int indent)
for
(
i
=
0
;
i
<
indent
+
1
;
i
++
)
printf
(
"
\t
"
);
printf
(
" clauses=("
);
geqo_print_joinclauses
(
root
,
((
Nest
Path
*
)
path
)
->
pathinfo
);
geqo_print_joinclauses
(
root
,
((
Join
Path
*
)
path
)
->
pathinfo
);
printf
(
")
\n
"
);
if
(
nodeTag
(
path
)
==
T_MergePath
)
...
...
src/backend/optimizer/geqo/geqo_paths.c
浏览文件 @
ad4b27ac
...
...
@@ -5,7 +5,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: geqo_paths.c,v 1.1
8 1999/02/12 06:43:26
momjian Exp $
* $Id: geqo_paths.c,v 1.1
9 1999/02/12 17:24:47
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -98,7 +98,7 @@ geqo_prune_rel(RelOptInfo *rel, List *other_rels)
void
geqo_set_cheapest
(
RelOptInfo
*
rel
)
{
NestPath
*
cheapest
=
(
Nest
Path
*
)
set_cheapest
(
rel
,
rel
->
pathlist
);
JoinPath
*
cheapest
=
(
Join
Path
*
)
set_cheapest
(
rel
,
rel
->
pathlist
);
if
(
IsA_JoinPath
(
cheapest
))
rel
->
size
=
compute_joinrel_size
(
cheapest
);
...
...
src/backend/optimizer/path/allpaths.c
浏览文件 @
ad4b27ac
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.
29 1999/02/12 06:43:2
8 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.
30 1999/02/12 17:24:4
8 momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -302,7 +302,7 @@ static void
print_path
(
Query
*
root
,
Path
*
path
,
int
indent
)
{
char
*
ptype
=
NULL
;
Nest
Path
*
jp
;
Join
Path
*
jp
;
bool
join
=
false
;
int
i
;
...
...
@@ -338,7 +338,7 @@ print_path(Query *root, Path *path, int indent)
{
int
size
=
path
->
parent
->
size
;
jp
=
(
Nest
Path
*
)
path
;
jp
=
(
Join
Path
*
)
path
;
printf
(
"%s size=%d cost=%f
\n
"
,
ptype
,
size
,
path
->
path_cost
);
switch
(
nodeTag
(
path
))
{
...
...
@@ -347,7 +347,7 @@ print_path(Query *root, Path *path, int indent)
for
(
i
=
0
;
i
<
indent
+
1
;
i
++
)
printf
(
"
\t
"
);
printf
(
" clauses=("
);
print_joinclauses
(
root
,
((
Nest
Path
*
)
path
)
->
pathinfo
);
print_joinclauses
(
root
,
((
Join
Path
*
)
path
)
->
pathinfo
);
printf
(
")
\n
"
);
if
(
nodeTag
(
path
)
==
T_MergePath
)
...
...
src/backend/optimizer/path/costsize.c
浏览文件 @
ad4b27ac
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.3
0 1999/02/12 06:43:28
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.3
1 1999/02/12 17:24:49
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -435,7 +435,7 @@ compute_attribute_width(TargetEntry *tlistentry)
* Returns a fixnum.
*/
int
compute_joinrel_size
(
Nest
Path
*
joinpath
)
compute_joinrel_size
(
Join
Path
*
joinpath
)
{
Cost
temp
=
1
.
0
;
int
temp1
=
0
;
...
...
src/backend/optimizer/path/joinpath.c
浏览文件 @
ad4b27ac
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.2
1 1999/02/12 06:43:30
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.2
2 1999/02/12 17:24:49
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -372,6 +372,7 @@ match_unsorted_outer(RelOptInfo *joinrel,
innerrel
->
pathlist
,
INNER
);
/* Should we use the mergeinner, or sort the cheapest inner? */
path_is_cheaper_than_sort
=
(
bool
)
(
mergeinnerpath
&&
(
mergeinnerpath
->
path_cost
<
(
cheapest_inner
->
path_cost
+
...
...
src/backend/optimizer/path/predmig.c
浏览文件 @
ad4b27ac
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/predmig.c,v 1.1
6 1999/02/12 06:43:31
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/predmig.c,v 1.1
7 1999/02/12 17:24:50
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -53,13 +53,13 @@
* (not a join) iff it has
* a non-NULL cinfo field */
static
void
xfunc_predmig
(
Nest
Path
pathnode
,
Stream
streamroot
,
static
void
xfunc_predmig
(
Join
Path
pathnode
,
Stream
streamroot
,
Stream
laststream
,
bool
*
progressp
);
static
bool
xfunc_series_llel
(
Stream
stream
);
static
bool
xfunc_llel_chains
(
Stream
root
,
Stream
bottom
);
static
Stream
xfunc_complete_stream
(
Stream
stream
);
static
bool
xfunc_prdmig_pullup
(
Stream
origstream
,
Stream
pullme
,
Nest
Path
joinpath
);
Join
Path
joinpath
);
static
void
xfunc_form_groups
(
Stream
root
,
Stream
bottom
);
static
void
xfunc_free_stream
(
Stream
root
);
static
Stream
xfunc_add_clauses
(
Stream
current
);
...
...
@@ -91,8 +91,8 @@ xfunc_do_predmig(Path root)
do
{
progress
=
false
;
Assert
(
IsA
(
root
,
Nest
Path
));
xfunc_predmig
((
Nest
Path
)
root
,
(
Stream
)
NULL
,
(
Stream
)
NULL
,
Assert
(
IsA
(
root
,
Join
Path
));
xfunc_predmig
((
Join
Path
)
root
,
(
Stream
)
NULL
,
(
Stream
)
NULL
,
&
progress
);
if
(
changed
&&
progress
)
elog
(
DEBUG
,
"Needed to do a second round of predmig!
\n
"
);
...
...
@@ -111,7 +111,7 @@ xfunc_do_predmig(Path root)
** Destructively modifies the join tree (via predicate pullup).
*/
static
void
xfunc_predmig
(
Nest
Path
pathnode
,
/* root of the join tree */
xfunc_predmig
(
Join
Path
pathnode
,
/* root of the join tree */
Stream
streamroot
,
Stream
laststream
,
/* for recursive calls -- these are the
* root of the stream under construction,
...
...
@@ -161,11 +161,11 @@ xfunc_predmig(NestPath pathnode,/* root of the join tree */
else
{
/* visit left child */
xfunc_predmig
((
Nest
Path
)
get_outerjoinpath
(
pathnode
),
xfunc_predmig
((
Join
Path
)
get_outerjoinpath
(
pathnode
),
streamroot
,
newstream
,
progressp
);
/* visit right child */
xfunc_predmig
((
Nest
Path
)
get_innerjoinpath
(
pathnode
),
xfunc_predmig
((
Join
Path
)
get_innerjoinpath
(
pathnode
),
streamroot
,
newstream
,
progressp
);
}
...
...
@@ -257,7 +257,7 @@ xfunc_llel_chains(Stream root, Stream bottom)
*/
Assert
(
xfunc_num_relids
(
pathstream
)
>
xfunc_num_relids
(
tmpstream
));
progress
=
xfunc_prdmig_pullup
(
origstream
,
tmpstream
,
(
Nest
Path
)
get_pathptr
(
pathstream
));
(
Join
Path
)
get_pathptr
(
pathstream
));
}
if
(
get_downstream
(
tmpstream
))
pathstream
=
(
Stream
)
xfunc_get_downjoin
((
Stream
)
get_downstream
(
tmpstream
));
...
...
@@ -304,14 +304,14 @@ xfunc_complete_stream(Stream stream)
/*
** xfunc_prdmig_pullup
** pullup a clause in a path above joinpath. Since the
Nest
Path tree
** pullup a clause in a path above joinpath. Since the
Join
Path tree
** doesn't have upward pointers, it's difficult to deal with. Thus we
** require the original stream, which maintains pointers to all the path
** nodes. We use the original stream to find out what joins are
** above the clause.
*/
static
bool
xfunc_prdmig_pullup
(
Stream
origstream
,
Stream
pullme
,
Nest
Path
joinpath
)
xfunc_prdmig_pullup
(
Stream
origstream
,
Stream
pullme
,
Join
Path
joinpath
)
{
RestrictInfo
restrictinfo
=
get_cinfo
(
pullme
);
bool
progress
=
false
;
...
...
@@ -333,7 +333,7 @@ xfunc_prdmig_pullup(Stream origstream, Stream pullme, NestPath joinpath)
/* pull up this node as far as it should go */
for
(
upjoin
=
(
Stream
)
xfunc_get_upjoin
(
orignode
);
upjoin
!=
(
Stream
)
NULL
&&
(
Nest
Path
)
get_pathptr
((
Stream
)
xfunc_get_downjoin
(
upjoin
))
&&
(
Join
Path
)
get_pathptr
((
Stream
)
xfunc_get_downjoin
(
upjoin
))
!=
joinpath
;
upjoin
=
(
Stream
)
xfunc_get_upjoin
(
upjoin
))
{
...
...
@@ -342,12 +342,12 @@ xfunc_prdmig_pullup(Stream origstream, Stream pullme, NestPath joinpath)
#endif
/* move clause up in path */
if
(
get_pathptr
((
Stream
)
get_downstream
(
upjoin
))
==
(
pathPtr
)
get_outerjoinpath
((
Nest
Path
)
get_pathptr
(
upjoin
)))
==
(
pathPtr
)
get_outerjoinpath
((
Join
Path
)
get_pathptr
(
upjoin
)))
whichchild
=
OUTER
;
else
whichchild
=
INNER
;
restrictinfo
=
xfunc_pullup
((
Path
)
get_pathptr
((
Stream
)
get_downstream
(
upjoin
)),
(
Nest
Path
)
get_pathptr
(
upjoin
),
(
Join
Path
)
get_pathptr
(
upjoin
),
restrictinfo
,
whichchild
,
get_clausetype
(
orignode
));
...
...
@@ -366,10 +366,10 @@ xfunc_prdmig_pullup(Stream origstream, Stream pullme, NestPath joinpath)
temp
=
(
Stream
)
get_downstream
(
temp
))
set_pathptr
(
temp
,
(
pathPtr
)
get_outerjoinpath
((
Nest
Path
)
get_pathptr
(
upjoin
)));
get_outerjoinpath
((
Join
Path
)
get_pathptr
(
upjoin
)));
set_pathptr
(
temp
,
(
pathPtr
)
get_outerjoinpath
((
Nest
Path
)
get_pathptr
(
upjoin
)));
(
pathPtr
)
get_outerjoinpath
((
Join
Path
)
get_pathptr
(
upjoin
)));
}
else
{
...
...
@@ -377,10 +377,10 @@ xfunc_prdmig_pullup(Stream origstream, Stream pullme, NestPath joinpath)
temp
=
(
Stream
)
get_downstream
(
temp
))
set_pathptr
(
temp
,
(
pathPtr
)
get_innerjoinpath
((
Nest
Path
)
get_pathptr
(
upjoin
)));
get_innerjoinpath
((
Join
Path
)
get_pathptr
(
upjoin
)));
set_pathptr
(
temp
,
(
pathPtr
)
get_innerjoinpath
((
Nest
Path
)
get_pathptr
(
upjoin
)));
get_innerjoinpath
((
Join
Path
)
get_pathptr
(
upjoin
)));
}
progress
=
true
;
}
...
...
@@ -425,14 +425,14 @@ xfunc_form_groups(Query *queryInfo, Stream root, Stream bottom)
if
(
!
is_clause
(
temp
))
{
if
(
get_pathptr
((
Stream
)
get_downstream
(
temp
))
==
(
pathPtr
)
get_outerjoinpath
((
Nest
Path
)
get_pathptr
(
temp
)))
==
(
pathPtr
)
get_outerjoinpath
((
Join
Path
)
get_pathptr
(
temp
)))
whichchild
=
OUTER
;
else
whichchild
=
INNER
;
set_groupcost
(
temp
,
xfunc_join_expense
((
Nest
Path
)
get_pathptr
(
temp
),
xfunc_join_expense
((
Join
Path
)
get_pathptr
(
temp
),
whichchild
));
if
(
primjoin
=
xfunc_primary_join
((
Nest
Path
)
get_pathptr
(
temp
)))
if
(
primjoin
=
xfunc_primary_join
((
Join
Path
)
get_pathptr
(
temp
)))
{
set_groupsel
(
temp
,
compute_clause_selec
(
queryInfo
,
...
...
@@ -529,10 +529,10 @@ xfunc_add_clauses(Stream current)
}
/* and add in the join clauses */
if
(
IsA
(
get_pathptr
(
current
),
Nest
Path
))
if
(
IsA
(
get_pathptr
(
current
),
Join
Path
))
{
primjoin
=
xfunc_primary_join
((
Nest
Path
)
get_pathptr
(
current
));
foreach
(
temp
,
get_pathrestrictinfo
((
Nest
Path
)
get_pathptr
(
current
)))
primjoin
=
xfunc_primary_join
((
Join
Path
)
get_pathptr
(
current
));
foreach
(
temp
,
get_pathrestrictinfo
((
Join
Path
)
get_pathptr
(
current
)))
{
if
(
!
equal
(
get_clause
((
RestrictInfo
)
lfirst
(
temp
)),
primjoin
))
topnode
=
xfunc_streaminsert
((
RestrictInfo
)
lfirst
(
temp
),
topnode
,
...
...
@@ -615,11 +615,11 @@ xfunc_streaminsert(RestrictInfo restrictinfo,
static
int
xfunc_num_relids
(
Stream
node
)
{
if
(
!
node
||
!
IsA
(
get_pathptr
(
node
),
Nest
Path
))
if
(
!
node
||
!
IsA
(
get_pathptr
(
node
),
Join
Path
))
return
0
;
else
return
(
length
(
get_relids
(
get_parent
((
Nest
Path
)
get_pathptr
(
node
)))));
(
get_relids
(
get_parent
((
Join
Path
)
get_pathptr
(
node
)))));
}
/*
...
...
src/backend/optimizer/path/prune.c
浏览文件 @
ad4b27ac
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/prune.c,v 1.
29 1999/02/12 06:43:32
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/prune.c,v 1.
30 1999/02/12 17:24:50
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -92,17 +92,17 @@ rels_set_cheapest(List *rel_list)
{
List
*
x
=
NIL
;
RelOptInfo
*
rel
=
(
RelOptInfo
*
)
NULL
;
Nest
Path
*
cheapest
;
Join
Path
*
cheapest
;
foreach
(
x
,
rel_list
)
{
rel
=
(
RelOptInfo
*
)
lfirst
(
x
);
cheapest
=
(
Nest
Path
*
)
set_cheapest
(
rel
,
rel
->
pathlist
);
cheapest
=
(
Join
Path
*
)
set_cheapest
(
rel
,
rel
->
pathlist
);
if
(
IsA_JoinPath
(
cheapest
))
rel
->
size
=
compute_joinrel_size
(
cheapest
);
else
elog
(
ERROR
,
"non
Nest
Path called"
);
elog
(
ERROR
,
"non
Join
Path called"
);
}
}
...
...
src/backend/optimizer/path/xfunc.c
浏览文件 @
ad4b27ac
...
...
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/xfunc.c,v 1.2
6 1999/02/12 06:43:32
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/xfunc.c,v 1.2
7 1999/02/12 17:24:50
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -61,7 +61,7 @@ xfunc_trypullup(RelOptInfo rel)
LispValue
y
;
/* list ptr */
RestrictInfo
maxcinfo
;
/* The RestrictInfo to pull up, as
* calculated by xfunc_shouldpull() */
Nest
Path
curpath
;
/* current path in list */
Join
Path
curpath
;
/* current path in list */
int
progress
;
/* has progress been made this time
* through? */
int
clausetype
;
...
...
@@ -71,7 +71,7 @@ xfunc_trypullup(RelOptInfo rel)
progress
=
false
;
/* no progress yet in this iteration */
foreach
(
y
,
get_pathlist
(
rel
))
{
curpath
=
(
Nest
Path
)
lfirst
(
y
);
curpath
=
(
Join
Path
)
lfirst
(
y
);
/*
* * for each operand, attempt to pullup predicates until
...
...
@@ -142,7 +142,7 @@ xfunc_trypullup(RelOptInfo rel)
int
xfunc_shouldpull
(
Query
*
queryInfo
,
Path
childpath
,
Nest
Path
parentpath
,
Join
Path
parentpath
,
int
whichchild
,
RestrictInfo
*
maxcinfopt
)
/* Out: pointer to clause
* to pullup */
...
...
@@ -184,8 +184,8 @@ xfunc_shouldpull(Query *queryInfo,
* see if any join clause has even higher rank than the highest *
* local predicate
*/
if
(
is_join
(
childpath
)
&&
xfunc_num_join_clauses
((
Nest
Path
)
childpath
)
>
1
)
for
(
tmplist
=
get_pathrestrictinfo
((
Nest
Path
)
childpath
);
if
(
is_join
(
childpath
)
&&
xfunc_num_join_clauses
((
Join
Path
)
childpath
)
>
1
)
for
(
tmplist
=
get_pathrestrictinfo
((
Join
Path
)
childpath
);
tmplist
!=
LispNil
;
tmplist
=
lnext
(
tmplist
))
{
...
...
@@ -263,7 +263,7 @@ xfunc_shouldpull(Query *queryInfo,
RestrictInfo
xfunc_pullup
(
Query
*
queryInfo
,
Path
childpath
,
Nest
Path
parentpath
,
Join
Path
parentpath
,
RestrictInfo
cinfo
,
/* clause to pull up */
int
whichchild
,
/* whether child is INNER or OUTER of join */
int
clausetype
)
/* whether clause to pull is join or local */
...
...
@@ -285,9 +285,9 @@ xfunc_pullup(Query *queryInfo,
else
{
set_pathrestrictinfo
((
Nest
Path
)
newkid
,
((
Join
Path
)
newkid
,
xfunc_LispRemove
((
LispValue
)
cinfo
,
(
List
)
get_pathrestrictinfo
((
Nest
Path
)
newkid
)));
(
List
)
get_pathrestrictinfo
((
Join
Path
)
newkid
)));
}
/*
...
...
@@ -390,7 +390,7 @@ LispValue clause;
** Find global expense of a join clause
*/
Cost
xfunc_join_expense
(
Query
*
queryInfo
,
Nest
Path
path
,
int
whichchild
)
xfunc_join_expense
(
Query
*
queryInfo
,
Join
Path
path
,
int
whichchild
)
{
LispValue
primjoinclause
=
xfunc_primary_join
(
path
);
...
...
@@ -854,7 +854,7 @@ xfunc_find_references(LispValue clause)
** min rank pathclause
*/
LispValue
xfunc_primary_join
(
Nest
Path
pathnode
)
xfunc_primary_join
(
Join
Path
pathnode
)
{
LispValue
joinclauselist
=
get_pathrestrictinfo
(
pathnode
);
RestrictInfo
mincinfo
;
...
...
@@ -947,13 +947,13 @@ xfunc_get_path_cost(Query *queryInfo, Path pathnode)
* * Now add in any node-specific expensive function costs. * Again,
* we must ensure that the clauses are sorted by rank.
*/
if
(
IsA
(
pathnode
,
Nest
Path
))
if
(
IsA
(
pathnode
,
Join
Path
))
{
if
(
XfuncMode
!=
XFUNC_OFF
)
set_pathrestrictinfo
((
Nest
Path
)
pathnode
,
lisp_qsort
(
get_pathrestrictinfo
((
Nest
Path
)
pathnode
),
set_pathrestrictinfo
((
Join
Path
)
pathnode
,
lisp_qsort
(
get_pathrestrictinfo
((
Join
Path
)
pathnode
),
xfunc_cinfo_compare
));
for
(
tmplist
=
get_pathrestrictinfo
((
Nest
Path
)
pathnode
),
selec
=
1
.
0
;
for
(
tmplist
=
get_pathrestrictinfo
((
Join
Path
)
pathnode
),
selec
=
1
.
0
;
tmplist
!=
LispNil
;
tmplist
=
lnext
(
tmplist
))
{
...
...
@@ -1006,14 +1006,14 @@ xfunc_get_path_cost(Query *queryInfo, Path pathnode)
** Recalculate the cost of a path node. This includes the basic cost of the
** node, as well as the cost of its expensive functions.
** We need to do this to the parent after pulling a clause from a child into a
** parent. Thus we should only be calling this function on
Nest
Paths.
** parent. Thus we should only be calling this function on
Join
Paths.
*/
Cost
xfunc_total_path_cost
(
Nest
Path
pathnode
)
xfunc_total_path_cost
(
Join
Path
pathnode
)
{
Cost
cost
=
xfunc_get_path_cost
((
Path
)
pathnode
);
Assert
(
IsA
(
pathnode
,
Nest
Path
));
Assert
(
IsA
(
pathnode
,
Join
Path
));
if
(
IsA
(
pathnode
,
MergePath
))
{
MergePath
mrgnode
=
(
MergePath
)
pathnode
;
...
...
@@ -1089,7 +1089,7 @@ xfunc_total_path_cost(NestPath pathnode)
*/
Cost
xfunc_expense_per_tuple
(
Nest
Path
joinnode
,
int
whichchild
)
xfunc_expense_per_tuple
(
Join
Path
joinnode
,
int
whichchild
)
{
RelOptInfo
outerrel
=
get_parent
((
Path
)
get_outerjoinpath
(
joinnode
));
RelOptInfo
innerrel
=
get_parent
((
Path
)
get_innerjoinpath
(
joinnode
));
...
...
@@ -1118,7 +1118,7 @@ xfunc_expense_per_tuple(NestPath joinnode, int whichchild)
else
/* nestloop */
{
Assert
(
IsA
(
joinnode
,
Nest
Path
));
Assert
(
IsA
(
joinnode
,
Join
Path
));
return
_CPU_PAGE_WEIGHT_
;
}
}
...
...
@@ -1375,7 +1375,7 @@ xfunc_tuple_width(Relation rd)
** Find the number of join clauses associated with this join path
*/
int
xfunc_num_join_clauses
(
Nest
Path
path
)
xfunc_num_join_clauses
(
Join
Path
path
)
{
int
num
=
length
(
get_pathrestrictinfo
(
path
));
...
...
src/backend/optimizer/plan/createplan.c
浏览文件 @
ad4b27ac
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.4
4 1999/02/12 06:43:33
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.4
5 1999/02/12 17:24:51
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -45,7 +45,7 @@
static
List
*
switch_outer
(
List
*
clauses
);
static
Scan
*
create_scan_node
(
Path
*
best_path
,
List
*
tlist
);
static
Join
*
create_join_node
(
Nest
Path
*
best_path
,
List
*
tlist
);
static
Join
*
create_join_node
(
Join
Path
*
best_path
,
List
*
tlist
);
static
SeqScan
*
create_seqscan_node
(
Path
*
best_path
,
List
*
tlist
,
List
*
scan_clauses
);
static
IndexScan
*
create_indexscan_node
(
IndexPath
*
best_path
,
List
*
tlist
,
...
...
@@ -117,7 +117,7 @@ create_plan(Path *best_path)
case
T_HashJoin
:
case
T_MergeJoin
:
case
T_NestLoop
:
plan_node
=
(
Plan
*
)
create_join_node
((
Nest
Path
*
)
best_path
,
tlist
);
plan_node
=
(
Plan
*
)
create_join_node
((
Join
Path
*
)
best_path
,
tlist
);
break
;
default:
/* do nothing */
...
...
@@ -204,7 +204,7 @@ create_scan_node(Path *best_path, List *tlist)
* Returns the join node.
*/
static
Join
*
create_join_node
(
Nest
Path
*
best_path
,
List
*
tlist
)
create_join_node
(
Join
Path
*
best_path
,
List
*
tlist
)
{
Plan
*
outer_node
;
List
*
outer_tlist
;
...
...
src/include/executor/nodeNestloop.h
浏览文件 @
ad4b27ac
...
...
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: nodeNestloop.h,v 1.
7 1998/09/01 04:36:03
momjian Exp $
* $Id: nodeNestloop.h,v 1.
8 1999/02/12 17:24:55
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -21,6 +21,7 @@ extern TupleTableSlot *ExecNestLoop(NestLoop *node, Plan *parent);
extern
bool
ExecInitNestLoop
(
NestLoop
*
node
,
EState
*
estate
,
Plan
*
parent
);
extern
int
ExecCountSlotsNestLoop
(
NestLoop
*
node
);
extern
void
ExecEndNestLoop
(
NestLoop
*
node
);
extern
void
ExecReScanNestLoop
(
NestLoop
*
node
,
ExprContext
*
exprCtxt
,
Plan
*
parent
);
extern
void
ExecReScanNestLoop
(
NestLoop
*
node
,
ExprContext
*
exprCtxt
,
Plan
*
parent
);
#endif
/* NODENESTLOOP_H */
src/include/nodes/relation.h
浏览文件 @
ad4b27ac
...
...
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: relation.h,v 1.2
1 1999/02/12 06:43:47
momjian Exp $
* $Id: relation.h,v 1.2
2 1999/02/12 17:24:59
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -168,9 +168,11 @@ typedef struct NestPath
Path
*
innerjoinpath
;
}
NestPath
;
typedef
NestPath
JoinPath
;
typedef
struct
MergePath
{
Nest
Path
jpath
;
Join
Path
jpath
;
List
*
path_mergeclauses
;
List
*
outersortkeys
;
List
*
innersortkeys
;
...
...
@@ -178,7 +180,7 @@ typedef struct MergePath
typedef
struct
HashPath
{
Nest
Path
jpath
;
Join
Path
jpath
;
List
*
path_hashclauses
;
List
*
outerhashkeys
;
List
*
innerhashkeys
;
...
...
@@ -262,7 +264,7 @@ typedef struct Iter
/*
** Stream:
** A stream represents a root-to-leaf path in a plan tree (i.e. a tree of
**
Nest
Paths and Paths). The stream includes pointers to all Path nodes,
**
Join
Paths and Paths). The stream includes pointers to all Path nodes,
** as well as to any clauses that reside above Path nodes. This structure
** is used to make Path nodes and clauses look similar, so that Predicate
** Migration can run.
...
...
src/include/optimizer/cost.h
浏览文件 @
ad4b27ac
...
...
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: cost.h,v 1.1
5 1999/02/12 06:43:52
momjian Exp $
* $Id: cost.h,v 1.1
6 1999/02/12 17:25:05
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -45,7 +45,7 @@ extern Cost cost_hashjoin(Cost outercost, Cost innercost, List *outerkeys,
int
outerwidth
,
int
innerwidth
);
extern
int
compute_rel_size
(
RelOptInfo
*
rel
);
extern
int
compute_rel_width
(
RelOptInfo
*
rel
);
extern
int
compute_joinrel_size
(
Nest
Path
*
joinpath
);
extern
int
compute_joinrel_size
(
Join
Path
*
joinpath
);
extern
int
page_size
(
int
tuples
,
int
width
);
/*
...
...
src/include/optimizer/xfunc.h
浏览文件 @
ad4b27ac
...
...
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: xfunc.h,v 1.1
3 1999/02/12 06:43:53
momjian Exp $
* $Id: xfunc.h,v 1.1
4 1999/02/12 17:25:05
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -50,13 +50,13 @@ extern int XfuncMode; /* defined in tcop/postgres.c */
/* function prototypes from planner/path/xfunc.c */
extern
void
xfunc_trypullup
(
RelOptInfo
*
rel
);
extern
int
xfunc_shouldpull
(
Path
*
childpath
,
Nest
Path
*
parentpath
,
extern
int
xfunc_shouldpull
(
Path
*
childpath
,
Join
Path
*
parentpath
,
int
whichchild
,
RestrictInfo
*
maxcinfopt
);
extern
RestrictInfo
*
xfunc_pullup
(
Path
*
childpath
,
Nest
Path
*
parentpath
,
RestrictInfo
*
cinfo
,
extern
RestrictInfo
*
xfunc_pullup
(
Path
*
childpath
,
Join
Path
*
parentpath
,
RestrictInfo
*
cinfo
,
int
whichchild
,
int
clausetype
);
extern
Cost
xfunc_rank
(
Expr
*
clause
);
extern
Cost
xfunc_expense
(
Query
*
queryInfo
,
Expr
*
clause
);
extern
Cost
xfunc_join_expense
(
Nest
Path
*
path
,
int
whichchild
);
extern
Cost
xfunc_join_expense
(
Join
Path
*
path
,
int
whichchild
);
extern
Cost
xfunc_local_expense
(
Expr
*
clause
);
extern
Cost
xfunc_func_expense
(
Expr
*
node
,
List
*
args
);
extern
int
xfunc_width
(
Expr
*
clause
);
...
...
@@ -65,10 +65,10 @@ extern int xfunc_width(Expr *clause);
/* extern int xfunc_card_unreferenced(Expr *clause, Relid referenced); */
extern
int
xfunc_card_product
(
Relid
relids
);
extern
List
*
xfunc_find_references
(
List
*
clause
);
extern
List
*
xfunc_primary_join
(
Nest
Path
*
pathnode
);
extern
List
*
xfunc_primary_join
(
Join
Path
*
pathnode
);
extern
Cost
xfunc_get_path_cost
(
Path
*
pathnode
);
extern
Cost
xfunc_total_path_cost
(
Nest
Path
*
pathnode
);
extern
Cost
xfunc_expense_per_tuple
(
Nest
Path
*
joinnode
,
int
whichchild
);
extern
Cost
xfunc_total_path_cost
(
Join
Path
*
pathnode
);
extern
Cost
xfunc_expense_per_tuple
(
Join
Path
*
joinnode
,
int
whichchild
);
extern
void
xfunc_fixvars
(
Expr
*
clause
,
RelOptInfo
*
rel
,
int
varno
);
extern
int
xfunc_cinfo_compare
(
void
*
arg1
,
void
*
arg2
);
extern
int
xfunc_clause_compare
(
void
*
arg1
,
void
*
arg2
);
...
...
@@ -76,7 +76,7 @@ extern void xfunc_disjunct_sort(List *clause_list);
extern
int
xfunc_disjunct_compare
(
void
*
arg1
,
void
*
arg2
);
extern
int
xfunc_func_width
(
RegProcedure
funcid
,
List
*
args
);
extern
int
xfunc_tuple_width
(
Relation
rd
);
extern
int
xfunc_num_join_clauses
(
Nest
Path
*
path
);
extern
int
xfunc_num_join_clauses
(
Join
Path
*
path
);
extern
List
*
xfunc_LispRemove
(
List
*
foo
,
List
*
bar
);
extern
bool
xfunc_copyrel
(
RelOptInfo
*
from
,
RelOptInfo
**
to
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录