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
78a055a6
Commit
78a055a6
authored
Dec 21, 1997
by
Bruce Momjian
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove some recursion in optimizer and clean up some code there.
parent
0808e658
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
128 additions
and
121 deletions
+128
-121
src/backend/optimizer/path/allpaths.c
src/backend/optimizer/path/allpaths.c
+81
-87
src/backend/optimizer/path/prune.c
src/backend/optimizer/path/prune.c
+37
-28
src/backend/optimizer/prep/prepunion.c
src/backend/optimizer/prep/prepunion.c
+8
-4
src/include/optimizer/paths.h
src/include/optimizer/paths.h
+2
-2
No files found.
src/backend/optimizer/path/allpaths.c
View file @
78a055a6
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.1
3 1997/09/08 21:44:44
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.1
4 1997/12/21 05:18:18
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -44,7 +44,7 @@ int32 _use_geqo_rels_ = GEQO_RELS;
static
void
find_rel_paths
(
Query
*
root
,
List
*
rels
);
static
List
*
find_join_paths
(
Query
*
root
,
List
*
outer_rels
,
int
levels_
left
);
static
List
*
find_join_paths
(
Query
*
root
,
List
*
outer_rels
,
int
levels_
needed
);
/*
* find-paths--
...
...
@@ -56,14 +56,14 @@ static List *find_join_paths(Query *root, List *outer_rels, int levels_left);
List
*
find_paths
(
Query
*
root
,
List
*
rels
)
{
int
levels_
left
;
int
levels_
needed
;
/*
* Set the number of join (not nesting) levels yet to be processed.
*/
levels_
left
=
length
(
rels
);
levels_
needed
=
length
(
rels
);
if
(
levels_
left
<=
0
)
if
(
levels_
needed
<=
0
)
return
NIL
;
/*
...
...
@@ -71,13 +71,13 @@ find_paths(Query *root, List *rels)
*/
find_rel_paths
(
root
,
rels
);
if
(
levels_
left
<=
1
)
if
(
levels_
needed
<=
1
)
{
/*
* Unsorted single relation, no more processing is required.
*/
return
(
rels
)
;
return
rels
;
}
else
{
...
...
@@ -88,7 +88,7 @@ find_paths(Query *root, List *rels)
*/
set_rest_relselec
(
root
,
rels
);
return
(
find_join_paths
(
root
,
rels
,
levels_left
-
1
)
);
return
find_join_paths
(
root
,
rels
,
levels_needed
);
}
}
...
...
@@ -165,17 +165,16 @@ find_rel_paths(Query *root, List *rels)
* 'outer-rels' is the current list of relations for which join paths
* are to be found, i.e., he current list of relations that
* have already been derived.
* 'levels-left' is the current join level being processed, where '1' is
* the "last" level
* 'levels-needed' is the number of iterations needed
*
* Returns the final level of join relations, i.e., the relation that is
* the result of joining all the original relations toge
ht
er.
* the result of joining all the original relations toge
th
er.
*/
static
List
*
find_join_paths
(
Query
*
root
,
List
*
outer_rels
,
int
levels_
left
)
find_join_paths
(
Query
*
root
,
List
*
outer_rels
,
int
levels_
needed
)
{
List
*
x
;
List
*
new_rels
;
List
*
new_rels
=
NIL
;
Rel
*
rel
;
/*******************************************
...
...
@@ -190,89 +189,84 @@ find_join_paths(Query *root, List *outer_rels, int levels_left)
* rest will be deprecated in case of GEQO *
*******************************************/
/*
* Determine all possible pairs of relations to be joined at this
* level. Determine paths for joining these relation pairs and modify
* 'new-rels' accordingly, then eliminate redundant join relations.
*/
new_rels
=
find_join_rels
(
root
,
outer_rels
);
find_all_join_paths
(
root
,
new_rels
);
new_rels
=
prune_joinrels
(
new_rels
);
while
(
--
levels_needed
)
{
/*
* Determine all possible pairs of relations to be joined at this
* level. Determine paths for joining these relation pairs and modify
* 'new-rels' accordingly, then eliminate redundant join relations.
*/
new_rels
=
find_join_rels
(
root
,
outer_rels
);
find_all_join_paths
(
root
,
new_rels
);
prune_joinrels
(
new_rels
);
#if 0
/*
* * for each expensive predicate in each path in each distinct rel, *
* consider doing pullup -- JMH
*/
if (XfuncMode != XFUNC_NOPULL && XfuncMode != XFUNC_OFF)
foreach(x, new_rels)
xfunc_trypullup((Rel *) lfirst(x));
#endif
prune_rel_paths
(
new_rels
);
if
(
BushyPlanFlag
)
{
/*
* In case of bushy trees if there is still a join between a join
* relation and another relation, add a new joininfo that involves
* the join relation to the joininfo list of the other relation
* * for each expensive predicate in each path in each distinct rel, *
* consider doing pullup -- JMH
*/
add_new_joininfos
(
root
,
new_rels
,
outer_rels
);
}
foreach
(
x
,
new_rels
)
{
rel
=
(
Rel
*
)
lfirst
(
x
);
if
(
rel
->
size
<=
0
)
rel
->
size
=
compute_rel_size
(
rel
);
rel
->
width
=
compute_rel_width
(
rel
);
/*#define OPTIMIZER_DEBUG*/
if (XfuncMode != XFUNC_NOPULL && XfuncMode != XFUNC_OFF)
foreach(x, new_rels)
xfunc_trypullup((Rel *) lfirst(x));
#endif
prune_rel_paths
(
new_rels
);
if
(
BushyPlanFlag
)
{
/*
* In case of bushy trees if there is still a join between a join
* relation and another relation, add a new joininfo that involves
* the join relation to the joininfo list of the other relation
*/
add_new_joininfos
(
root
,
new_rels
,
outer_rels
);
}
foreach
(
x
,
new_rels
)
{
rel
=
(
Rel
*
)
lfirst
(
x
);
if
(
rel
->
size
<=
0
)
rel
->
size
=
compute_rel_size
(
rel
);
rel
->
width
=
compute_rel_width
(
rel
);
/*#define OPTIMIZER_DEBUG*/
#ifdef OPTIMIZER_DEBUG
printf
(
"levels left: %d
\n
"
,
levels_left
);
debug_print_rel
(
root
,
rel
);
printf
(
"levels left: %d
\n
"
,
levels_left
);
debug_print_rel
(
root
,
rel
);
#endif
}
if
(
BushyPlanFlag
)
{
/*
* prune rels that have been completely incorporated into new join
* rels
*/
outer_rels
=
prune_oldrels
(
outer_rels
);
/*
* merge join rels if then contain the same list of base rels
*/
outer_rels
=
merge_joinrels
(
new_rels
,
outer_rels
);
root
->
join_relation_list_
=
outer_rels
;
}
else
{
root
->
join_relation_list_
=
new_rels
;
}
if
(
levels_left
==
1
)
{
}
if
(
BushyPlanFlag
)
return
(
final_join_rels
(
outer_rels
));
{
/*
* prune rels that have been completely incorporated into new join
* rels
*/
outer_rels
=
prune_oldrels
(
outer_rels
);
/*
* merge join rels if then contain the same list of base rels
*/
outer_rels
=
merge_joinrels
(
new_rels
,
outer_rels
);
root
->
join_relation_list_
=
outer_rels
;
}
else
return
(
new_rels
);
{
root
->
join_relation_list_
=
new_rels
;
}
if
(
!
BushyPlanFlag
)
outer_rels
=
new_rels
;
}
if
(
BushyPlanFlag
)
return
final_join_rels
(
outer_rels
);
else
{
if
(
BushyPlanFlag
)
return
(
find_join_paths
(
root
,
outer_rels
,
levels_left
-
1
));
else
return
(
find_join_paths
(
root
,
new_rels
,
levels_left
-
1
));
}
return
new_rels
;
}
/*****************************************************************************
...
...
src/backend/optimizer/path/prune.c
View file @
78a055a6
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/prune.c,v 1.
6 1997/09/08 21:45:08
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/prune.c,v 1.
7 1997/12/21 05:18:21
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -29,23 +29,21 @@ static List *prune_joinrel(Rel *rel, List *other_rels);
/*
* prune-joinrels--
* Removes any redundant relation entries from a list of rel nodes
* 'rel-list'.
* 'rel-list'.
Obviosly, the first relation can't be a duplicate.
*
* Returns the resulting list.
*
*/
List
*
void
prune_joinrels
(
List
*
rel_list
)
{
List
*
temp_list
=
NIL
;
List
*
i
;
if
(
rel_list
!=
NIL
)
{
temp_list
=
lcons
(
lfirst
(
rel_list
),
prune_joinrels
(
prune_joinrel
((
Rel
*
)
lfirst
(
rel_list
),
lnext
(
rel_list
))));
}
return
(
temp_list
);
/*
* rel_list can shorten while running as duplicate relations are deleted
*/
foreach
(
i
,
rel_list
)
lnext
(
i
)
=
prune_joinrel
((
Rel
*
)
lfirst
(
i
),
lnext
(
i
));
}
/*
...
...
@@ -62,28 +60,39 @@ prune_joinrels(List *rel_list)
static
List
*
prune_joinrel
(
Rel
*
rel
,
List
*
other_rels
)
{
List
*
i
=
NIL
;
List
*
t_list
=
NIL
;
List
*
temp_node
=
NIL
;
Rel
*
other_rel
=
(
Rel
*
)
NULL
;
List
*
cur
=
NIL
;
List
*
return_list
=
NIL
;
foreach
(
i
,
other_rels
)
/* find first relation that doesn't match */
foreach
(
cur
,
other_rels
)
{
other_rel
=
(
Rel
*
)
lfirst
(
i
);
if
(
same
(
rel
->
relids
,
other_rel
->
relids
))
{
rel
->
pathlist
=
add_pathlist
(
rel
,
rel
->
pathlist
,
other_rel
->
pathlist
);
t_list
=
nconc
(
t_list
,
NIL
);
/* XXX is this right ? */
}
else
Rel
*
other_rel
=
(
Rel
*
)
lfirst
(
cur
);
if
(
!
same
(
rel
->
relids
,
other_rel
->
relids
))
break
;
}
/* we now know cur doesn't match, or is NIL */
return_list
=
cur
;
/* remove relations that do match, we use lnext so we can remove easily */
if
(
cur
!=
NIL
)
{
while
(
lnext
(
cur
)
!=
NIL
)
{
temp_node
=
lcons
(
other_rel
,
NIL
);
t_list
=
nconc
(
t_list
,
temp_node
);
Rel
*
other_rel
=
(
Rel
*
)
lfirst
(
lnext
(
cur
));
if
(
same
(
rel
->
relids
,
other_rel
->
relids
))
{
rel
->
pathlist
=
add_pathlist
(
rel
,
rel
->
pathlist
,
other_rel
->
pathlist
);
lnext
(
cur
)
=
lnext
(
lnext
(
cur
));
/* delete it */
}
cur
=
lnext
(
cur
);
}
}
return
(
t_list
)
;
return
return_list
;
}
/*
...
...
src/backend/optimizer/prep/prepunion.c
View file @
78a055a6
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.1
1 1997/12/20 07:59:33
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.1
2 1997/12/21 05:18:28
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -236,9 +236,13 @@ plan_union_query(List *relids,
new_root
->
uniqueFlag
=
NULL
;
new_root
->
sortClause
=
NULL
;
new_root
->
groupClause
=
NULL
;
new_root
->
qry_numAgg
=
0
;
new_root
->
qry_aggs
=
NULL
;
del_agg_tlist_references
(
new_root
->
targetList
);
if
(
new_root
->
qry_numAgg
!=
0
)
{
new_root
->
qry_numAgg
=
0
;
pfree
(
new_root
->
qry_aggs
);
new_root
->
qry_aggs
=
NULL
;
del_agg_tlist_references
(
new_root
->
targetList
);
}
fix_parsetree_attnums
(
rt_index
,
rt_entry
->
relid
,
relid
,
...
...
src/include/optimizer/paths.h
View file @
78a055a6
...
...
@@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: paths.h,v 1.
5 1997/11/26 01:13:47
momjian Exp $
* $Id: paths.h,v 1.
6 1997/12/21 05:18:48
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -92,7 +92,7 @@ extern List *final_join_rels(List *join_rel_list);
/*
* prototypes for path/prune.c
*/
extern
List
*
prune_joinrels
(
List
*
rel_list
);
extern
void
prune_joinrels
(
List
*
rel_list
);
extern
void
prune_rel_paths
(
List
*
rel_list
);
extern
Path
*
prune_rel_path
(
Rel
*
rel
,
Path
*
unorderedpath
);
extern
List
*
merge_joinrels
(
List
*
rel_list1
,
List
*
rel_list2
);
...
...
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