mirror of
https://github.com/postgres/postgres.git
synced 2025-04-22 23:02:54 +03:00
Final optimizer cleanups.
This commit is contained in:
parent
47dd11bdd0
commit
1ed5cbbfd8
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/nodes/list.c,v 1.17 1999/02/13 23:15:57 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/nodes/list.c,v 1.18 1999/02/22 05:26:18 momjian Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* XXX a few of the following functions are duplicated to handle
|
* XXX a few of the following functions are duplicated to handle
|
||||||
@ -109,6 +109,7 @@ nconc(List *l1, List *l2)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef NOT_USED
|
||||||
List *
|
List *
|
||||||
nreverse(List *list)
|
nreverse(List *list)
|
||||||
{
|
{
|
||||||
@ -128,6 +129,7 @@ nreverse(List *list)
|
|||||||
lnext(list) = lnext(rlist);
|
lnext(list) = lnext(rlist);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
Value *
|
Value *
|
||||||
makeInteger(long i)
|
makeInteger(long i)
|
||||||
@ -245,6 +247,7 @@ append(List *l1, List *l2)
|
|||||||
return newlist;
|
return newlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef NOT_USED
|
||||||
/*
|
/*
|
||||||
* below are for backwards compatibility
|
* below are for backwards compatibility
|
||||||
*/
|
*/
|
||||||
@ -266,6 +269,7 @@ intAppend(List *l1, List *l2)
|
|||||||
lnext(p) = newlist2;
|
lnext(p) = newlist2;
|
||||||
return newlist;
|
return newlist;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* same
|
* same
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.43 1999/02/21 03:48:41 scrappy Exp $
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.44 1999/02/22 05:26:18 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -126,7 +126,7 @@ set_base_rel_pathlist(Query *root, List *rels)
|
|||||||
|
|
||||||
rel->pathlist = add_pathlist(rel,
|
rel->pathlist = add_pathlist(rel,
|
||||||
sequential_scan_list,
|
sequential_scan_list,
|
||||||
append(rel_index_scan_list,
|
nconc(rel_index_scan_list,
|
||||||
or_index_scan_list));
|
or_index_scan_list));
|
||||||
|
|
||||||
set_cheapest(rel, rel->pathlist);
|
set_cheapest(rel, rel->pathlist);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/hashutils.c,v 1.13 1999/02/13 23:16:16 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/hashutils.c,v 1.14 1999/02/22 05:26:18 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -83,9 +83,7 @@ group_clauses_by_hashop(List *restrictinfo_list,
|
|||||||
xhashinfo->jmethod.jmkeys = NIL;
|
xhashinfo->jmethod.jmkeys = NIL;
|
||||||
xhashinfo->jmethod.clauses = NIL;
|
xhashinfo->jmethod.clauses = NIL;
|
||||||
|
|
||||||
/* XXX was push */
|
hashinfo_list = lcons(xhashinfo, hashinfo_list);
|
||||||
hashinfo_list = lappend(hashinfo_list, xhashinfo);
|
|
||||||
hashinfo_list = nreverse(hashinfo_list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
xhashinfo->jmethod.clauses = lcons(clause, xhashinfo->jmethod.clauses);
|
xhashinfo->jmethod.clauses = lcons(clause, xhashinfo->jmethod.clauses);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.52 1999/02/21 03:48:44 scrappy Exp $
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.53 1999/02/22 05:26:19 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -1384,7 +1384,7 @@ create_index_path_group(Query *root,
|
|||||||
static List *
|
static List *
|
||||||
add_index_paths(List *indexpaths, List *new_indexpaths)
|
add_index_paths(List *indexpaths, List *new_indexpaths)
|
||||||
{
|
{
|
||||||
return append(indexpaths, new_indexpaths);
|
return nconc(indexpaths, new_indexpaths);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.31 1999/02/21 01:55:02 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.32 1999/02/22 05:26:20 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -104,7 +104,8 @@ update_rels_pathlist_for_joins(Query *root, List *joinrels)
|
|||||||
lfirsti(innerrel->relids));
|
lfirsti(innerrel->relids));
|
||||||
|
|
||||||
/* need to flatten the relids list */
|
/* need to flatten the relids list */
|
||||||
joinrel->relids = intAppend(outerrelids, innerrelids);
|
joinrel->relids = nconc(listCopy(outerrelids),
|
||||||
|
listCopy(innerrelids));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 1. Consider mergejoin paths where both relations must be
|
* 1. Consider mergejoin paths where both relations must be
|
||||||
@ -213,11 +214,11 @@ sort_inner_and_outer(RelOptInfo *joinrel,
|
|||||||
{
|
{
|
||||||
xmergeinfo = (MergeInfo *) lfirst(i);
|
xmergeinfo = (MergeInfo *) lfirst(i);
|
||||||
|
|
||||||
outerkeys = extract_path_keys(xmergeinfo->jmethod.jmkeys,
|
outerkeys = make_pathkeys_from_joinkeys(xmergeinfo->jmethod.jmkeys,
|
||||||
outerrel->targetlist,
|
outerrel->targetlist,
|
||||||
OUTER);
|
OUTER);
|
||||||
|
|
||||||
innerkeys = extract_path_keys(xmergeinfo->jmethod.jmkeys,
|
innerkeys = make_pathkeys_from_joinkeys(xmergeinfo->jmethod.jmkeys,
|
||||||
innerrel->targetlist,
|
innerrel->targetlist,
|
||||||
INNER);
|
INNER);
|
||||||
|
|
||||||
@ -352,7 +353,7 @@ match_unsorted_outer(RelOptInfo *joinrel,
|
|||||||
innerrel->width, false))));
|
innerrel->width, false))));
|
||||||
if (!path_is_cheaper_than_sort)
|
if (!path_is_cheaper_than_sort)
|
||||||
{
|
{
|
||||||
varkeys = extract_path_keys(matchedJoinKeys,
|
varkeys = make_pathkeys_from_joinkeys(matchedJoinKeys,
|
||||||
innerrel->targetlist,
|
innerrel->targetlist,
|
||||||
INNER);
|
INNER);
|
||||||
}
|
}
|
||||||
@ -473,7 +474,7 @@ match_unsorted_inner(RelOptInfo *joinrel,
|
|||||||
|
|
||||||
if (temp2)
|
if (temp2)
|
||||||
{
|
{
|
||||||
List *outerkeys = extract_path_keys(matchedJoinKeys,
|
List *outerkeys = make_pathkeys_from_joinkeys(matchedJoinKeys,
|
||||||
outerrel->targetlist,
|
outerrel->targetlist,
|
||||||
OUTER);
|
OUTER);
|
||||||
List *merge_pathkeys = new_join_pathkeys(outerkeys,
|
List *merge_pathkeys = new_join_pathkeys(outerkeys,
|
||||||
@ -551,10 +552,12 @@ hash_inner_and_outer(RelOptInfo *joinrel,
|
|||||||
foreach(i, hashinfo_list)
|
foreach(i, hashinfo_list)
|
||||||
{
|
{
|
||||||
xhashinfo = (HashInfo *) lfirst(i);
|
xhashinfo = (HashInfo *) lfirst(i);
|
||||||
outerkeys = extract_path_keys(((JoinMethod *) xhashinfo)->jmkeys,
|
outerkeys = make_pathkeys_from_joinkeys(
|
||||||
|
((JoinMethod *) xhashinfo)->jmkeys,
|
||||||
outerrel->targetlist,
|
outerrel->targetlist,
|
||||||
OUTER);
|
OUTER);
|
||||||
innerkeys = extract_path_keys(((JoinMethod *) xhashinfo)->jmkeys,
|
innerkeys = make_pathkeys_from_joinkeys(
|
||||||
|
((JoinMethod *) xhashinfo)->jmkeys,
|
||||||
innerrel->targetlist,
|
innerrel->targetlist,
|
||||||
INNER);
|
INNER);
|
||||||
hash_pathkeys = new_join_pathkeys(outerkeys,
|
hash_pathkeys = new_join_pathkeys(outerkeys,
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinrels.c,v 1.30 1999/02/18 06:00:46 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinrels.c,v 1.31 1999/02/22 05:26:20 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -62,7 +62,7 @@ make_rels_by_joins(Query *root, List *old_rels)
|
|||||||
joined_rels = make_rels_by_clauseless_joins(old_rel,
|
joined_rels = make_rels_by_clauseless_joins(old_rel,
|
||||||
root->base_rel_list);
|
root->base_rel_list);
|
||||||
joined_rels = append(joined_rels,
|
joined_rels = append(joined_rels,
|
||||||
make_rels_by_clauseless_joins(old_rel,
|
make_rels_by_clauseless_joins(old_rel,
|
||||||
old_rels));
|
old_rels));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -235,9 +235,11 @@ make_join_rel(RelOptInfo *outer_rel, RelOptInfo *inner_rel, JoinInfo *joininfo)
|
|||||||
if (joininfo)
|
if (joininfo)
|
||||||
joinrel->restrictinfo = joininfo->jinfo_restrictinfo;
|
joinrel->restrictinfo = joininfo->jinfo_restrictinfo;
|
||||||
|
|
||||||
joinrel_joininfo_list = new_joininfo_list(append(outer_rel->joininfo,
|
joinrel_joininfo_list = new_joininfo_list(
|
||||||
inner_rel->joininfo),
|
append(outer_rel->joininfo,
|
||||||
intAppend(outer_rel->relids, inner_rel->relids));
|
inner_rel->joininfo),
|
||||||
|
nconc(listCopy(outer_rel->relids),
|
||||||
|
listCopy(inner_rel->relids)));
|
||||||
|
|
||||||
joinrel->joininfo = joinrel_joininfo_list;
|
joinrel->joininfo = joinrel_joininfo_list;
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/pathkeys.c,v 1.6 1999/02/21 01:55:02 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/pathkeys.c,v 1.7 1999/02/22 05:26:20 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -27,9 +27,9 @@
|
|||||||
|
|
||||||
static int match_pathkey_joinkeys(List *pathkey, List *joinkeys,
|
static int match_pathkey_joinkeys(List *pathkey, List *joinkeys,
|
||||||
int outer_or_inner);
|
int outer_or_inner);
|
||||||
static List *new_join_pathkey(List *subkeys, List *considered_subkeys,
|
static List *new_join_pathkey(List *pathkeys, List *join_rel_tlist,
|
||||||
List *join_rel_tlist, List *joinclauses);
|
List *joinclauses);
|
||||||
static List *new_matching_subkeys(Var *subkey, List *considered_subkeys,
|
static List *get_joinvars_for_var(Var *pathkey, List **considered_pathkeys,
|
||||||
List *join_rel_tlist, List *joinclauses);
|
List *join_rel_tlist, List *joinclauses);
|
||||||
|
|
||||||
|
|
||||||
@ -86,7 +86,7 @@ static List *new_matching_subkeys(Var *subkey, List *considered_subkeys,
|
|||||||
* ( (outer inner) (outer inner) ... )
|
* ( (outer inner) (outer inner) ... )
|
||||||
* 'joinclauses' is a list of clauses corresponding to the join keys in
|
* 'joinclauses' is a list of clauses corresponding to the join keys in
|
||||||
* 'joinkeys'
|
* 'joinkeys'
|
||||||
* 'outer_or_inner' is a flag that selects the desired subkey of a join key
|
* 'outer_or_inner' is a flag that selects the desired pathkey of a join key
|
||||||
* in 'joinkeys'
|
* in 'joinkeys'
|
||||||
*
|
*
|
||||||
* Returns the join keys and corresponding join clauses in a list if all
|
* Returns the join keys and corresponding join clauses in a list if all
|
||||||
@ -133,10 +133,11 @@ order_joinkeys_by_pathkeys(List *pathkeys,
|
|||||||
matched_joinkeys = lappend(matched_joinkeys, joinkey);
|
matched_joinkeys = lappend(matched_joinkeys, joinkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (matchedJoinClausesPtr && joinclauses)
|
if (matchedJoinClausesPtr)
|
||||||
{
|
{
|
||||||
Expr *joinclause = nth(matched_joinkey_index,
|
Expr *joinclause = nth(matched_joinkey_index,
|
||||||
joinclauses);
|
joinclauses);
|
||||||
|
Assert(joinclauses);
|
||||||
matched_joinclauses = lappend(matched_joinclauses, joinclause);
|
matched_joinclauses = lappend(matched_joinclauses, joinclause);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -169,7 +170,7 @@ order_joinkeys_by_pathkeys(List *pathkeys,
|
|||||||
/*
|
/*
|
||||||
* match_pathkey_joinkeys
|
* match_pathkey_joinkeys
|
||||||
* Returns the 0-based index into 'joinkeys' of the first joinkey whose
|
* Returns the 0-based index into 'joinkeys' of the first joinkey whose
|
||||||
* outer or inner subkey matches any subkey of 'pathkey'.
|
* outer or inner pathkey matches any subkey of 'pathkey'.
|
||||||
*
|
*
|
||||||
* All these keys are equivalent, so any of them can match. See above.
|
* All these keys are equivalent, so any of them can match. See above.
|
||||||
*/
|
*/
|
||||||
@ -178,19 +179,19 @@ match_pathkey_joinkeys(List *pathkey,
|
|||||||
List *joinkeys,
|
List *joinkeys,
|
||||||
int outer_or_inner)
|
int outer_or_inner)
|
||||||
{
|
{
|
||||||
Var *path_subkey;
|
Var *key;
|
||||||
int pos;
|
int pos;
|
||||||
List *i, *x;
|
List *i, *x;
|
||||||
JoinKey *jk;
|
JoinKey *jk;
|
||||||
|
|
||||||
foreach(i, pathkey)
|
foreach(i, pathkey)
|
||||||
{
|
{
|
||||||
path_subkey = (Var *) lfirst(i);
|
key = (Var *) lfirst(i);
|
||||||
pos = 0;
|
pos = 0;
|
||||||
foreach(x, joinkeys)
|
foreach(x, joinkeys)
|
||||||
{
|
{
|
||||||
jk = (JoinKey *) lfirst(x);
|
jk = (JoinKey *) lfirst(x);
|
||||||
if (var_equal(path_subkey, extract_join_key(jk, outer_or_inner)))
|
if (equal(key, extract_join_key(jk, outer_or_inner)))
|
||||||
return pos;
|
return pos;
|
||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
@ -204,9 +205,9 @@ match_pathkey_joinkeys(List *pathkey,
|
|||||||
* Attempts to find a path in 'paths' whose keys match a set of join
|
* Attempts to find a path in 'paths' whose keys match a set of join
|
||||||
* keys 'joinkeys'. To match,
|
* keys 'joinkeys'. To match,
|
||||||
* 1. the path node ordering must equal 'ordering'.
|
* 1. the path node ordering must equal 'ordering'.
|
||||||
* 2. each subkey of a given path must match(i.e., be(var_equal) to) the
|
* 2. each pathkey of a given path must match(i.e., be(equal) to) the
|
||||||
* appropriate subkey of the corresponding join key in 'joinkeys',
|
* appropriate pathkey of the corresponding join key in 'joinkeys',
|
||||||
* i.e., the Nth path key must match its subkeys against the subkey of
|
* i.e., the Nth path key must match its pathkeys against the pathkey of
|
||||||
* the Nth join key in 'joinkeys'.
|
* the Nth join key in 'joinkeys'.
|
||||||
*
|
*
|
||||||
* 'joinkeys' is the list of key pairs to which the path keys must be
|
* 'joinkeys' is the list of key pairs to which the path keys must be
|
||||||
@ -215,7 +216,7 @@ match_pathkey_joinkeys(List *pathkey,
|
|||||||
* must correspond
|
* must correspond
|
||||||
* 'paths' is a list of(inner) paths which are to be matched against
|
* 'paths' is a list of(inner) paths which are to be matched against
|
||||||
* each join key in 'joinkeys'
|
* each join key in 'joinkeys'
|
||||||
* 'outer_or_inner' is a flag that selects the desired subkey of a join key
|
* 'outer_or_inner' is a flag that selects the desired pathkey of a join key
|
||||||
* in 'joinkeys'
|
* in 'joinkeys'
|
||||||
*
|
*
|
||||||
* Find the cheapest path that matches the join keys
|
* Find the cheapest path that matches the join keys
|
||||||
@ -232,7 +233,7 @@ get_cheapest_path_for_joinkeys(List *joinkeys,
|
|||||||
foreach(i, paths)
|
foreach(i, paths)
|
||||||
{
|
{
|
||||||
Path *path = (Path *) lfirst(i);
|
Path *path = (Path *) lfirst(i);
|
||||||
int better_sort, better_key;
|
int better_sort;
|
||||||
|
|
||||||
if (order_joinkeys_by_pathkeys(path->pathkeys, joinkeys, NIL,
|
if (order_joinkeys_by_pathkeys(path->pathkeys, joinkeys, NIL,
|
||||||
outer_or_inner, NULL, NULL) &&
|
outer_or_inner, NULL, NULL) &&
|
||||||
@ -251,23 +252,23 @@ get_cheapest_path_for_joinkeys(List *joinkeys,
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* extract_path_keys
|
* make_pathkeys_from_joinkeys
|
||||||
* Builds a subkey list for a path by pulling one of the subkeys from
|
* Builds a pathkey list for a path by pulling one of the pathkeys from
|
||||||
* a list of join keys 'joinkeys' and then finding the var node in the
|
* a list of join keys 'joinkeys' and then finding the var node in the
|
||||||
* target list 'tlist' that corresponds to that subkey.
|
* target list 'tlist' that corresponds to that pathkey.
|
||||||
*
|
*
|
||||||
* 'joinkeys' is a list of join key pairs
|
* 'joinkeys' is a list of join key pairs
|
||||||
* 'tlist' is a relation target list
|
* 'tlist' is a relation target list
|
||||||
* 'outer_or_inner' is a flag that selects the desired subkey of a join key
|
* 'outer_or_inner' is a flag that selects the desired pathkey of a join key
|
||||||
* in 'joinkeys'
|
* in 'joinkeys'
|
||||||
*
|
*
|
||||||
* Returns a list of pathkeys: ((tlvar1)(tlvar2)...(tlvarN)).
|
* Returns a list of pathkeys: ((tlvar1)(tlvar2)...(tlvarN)).
|
||||||
* It is a list of lists because of multi-key indexes.
|
* It is a list of lists because of multi-key indexes.
|
||||||
*/
|
*/
|
||||||
List *
|
List *
|
||||||
extract_path_keys(List *joinkeys,
|
make_pathkeys_from_joinkeys(List *joinkeys,
|
||||||
List *tlist,
|
List *tlist,
|
||||||
int outer_or_inner)
|
int outer_or_inner)
|
||||||
{
|
{
|
||||||
List *pathkeys = NIL;
|
List *pathkeys = NIL;
|
||||||
List *jk;
|
List *jk;
|
||||||
@ -275,30 +276,38 @@ extract_path_keys(List *joinkeys,
|
|||||||
foreach(jk, joinkeys)
|
foreach(jk, joinkeys)
|
||||||
{
|
{
|
||||||
JoinKey *jkey = (JoinKey *) lfirst(jk);
|
JoinKey *jkey = (JoinKey *) lfirst(jk);
|
||||||
Var *var,
|
Var *key;
|
||||||
*key;
|
List *p, *p2;
|
||||||
List *p;
|
bool found = false;
|
||||||
|
|
||||||
/*
|
key = (Var *) extract_join_key(jkey, outer_or_inner);
|
||||||
* find the right Var in the target list for this key
|
|
||||||
*/
|
|
||||||
var = (Var *) extract_join_key(jkey, outer_or_inner);
|
|
||||||
key = (Var *) matching_tlist_var(var, tlist);
|
|
||||||
|
|
||||||
/*
|
/* check to see if it is in the target list */
|
||||||
* Include it in the pathkeys list if we haven't already done so
|
if (matching_tlist_var(key, tlist))
|
||||||
*/
|
|
||||||
foreach(p, pathkeys)
|
|
||||||
{
|
{
|
||||||
Var *pkey = lfirst((List *) lfirst(p)); /* XXX fix me */
|
/*
|
||||||
|
* Include it in the pathkeys list if we haven't already done so
|
||||||
if (key == pkey)
|
*/
|
||||||
break;
|
foreach(p, pathkeys)
|
||||||
|
{
|
||||||
|
List *pathkey = lfirst(p);
|
||||||
|
|
||||||
|
foreach(p2, pathkey)
|
||||||
|
{
|
||||||
|
Var *pkey = lfirst(p2);
|
||||||
|
|
||||||
|
if (equal(key, pkey))
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
pathkeys = lappend(pathkeys, lcons(key, NIL));
|
||||||
}
|
}
|
||||||
if (p != NIL)
|
|
||||||
continue; /* key already in pathkeys */
|
|
||||||
|
|
||||||
pathkeys = lappend(pathkeys, lcons(key, NIL));
|
|
||||||
}
|
}
|
||||||
return pathkeys;
|
return pathkeys;
|
||||||
}
|
}
|
||||||
@ -331,99 +340,100 @@ new_join_pathkeys(List *outer_pathkeys,
|
|||||||
List *joinclauses)
|
List *joinclauses)
|
||||||
{
|
{
|
||||||
List *outer_pathkey = NIL;
|
List *outer_pathkey = NIL;
|
||||||
List *t_list = NIL;
|
List *final_pathkeys = NIL;
|
||||||
List *x;
|
List *new_pathkey;
|
||||||
List *i = NIL;
|
List *i = NIL;
|
||||||
|
|
||||||
foreach(i, outer_pathkeys)
|
foreach(i, outer_pathkeys)
|
||||||
{
|
{
|
||||||
outer_pathkey = lfirst(i);
|
outer_pathkey = lfirst(i);
|
||||||
x = new_join_pathkey(outer_pathkey, NIL, join_rel_tlist, joinclauses);
|
new_pathkey = new_join_pathkey(outer_pathkey, join_rel_tlist,
|
||||||
if (x != NIL)
|
joinclauses);
|
||||||
t_list = lappend(t_list, x);
|
if (new_pathkey != NIL)
|
||||||
|
final_pathkeys = lappend(final_pathkeys, new_pathkey);
|
||||||
}
|
}
|
||||||
return t_list;
|
return final_pathkeys;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* new_join_pathkey
|
* new_join_pathkey
|
||||||
* Finds new vars that become subkeys due to qualification clauses that
|
* Finds new vars that become pathkeys due to qualification clauses that
|
||||||
* contain any previously considered subkeys. These new subkeys plus the
|
* contain any previously considered pathkeys. These new pathkeys plus the
|
||||||
* subkeys from 'subkeys' form a new pathkey for the join relation.
|
* pathkeys from 'pathkeys' form a new pathkey for the join relation.
|
||||||
*
|
*
|
||||||
* Note that each returned subkey is the var node found in
|
* Note that each returned pathkey is the var node found in
|
||||||
* 'join_rel_tlist' rather than the joinclause var node.
|
* 'join_rel_tlist' rather than the joinclause var node.
|
||||||
*
|
*
|
||||||
* 'subkeys' is a list of subkeys for which matching subkeys are to be
|
* 'pathkeys' is a list of pathkeys for which matching pathkeys are to be
|
||||||
* found
|
* found
|
||||||
* 'considered_subkeys' is the current list of all subkeys corresponding
|
* 'considered_pathkeys' is the current list of all pathkeys corresponding
|
||||||
* to a given pathkey
|
* to a given pathkey
|
||||||
*
|
*
|
||||||
* Returns a new pathkey(list of subkeys).
|
* Returns a new pathkey(list of pathkeys).
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static List *
|
static List *
|
||||||
new_join_pathkey(List *subkeys,
|
new_join_pathkey(List *pathkey,
|
||||||
List *considered_subkeys,
|
|
||||||
List *join_rel_tlist,
|
List *join_rel_tlist,
|
||||||
List *joinclauses)
|
List *joinclauses)
|
||||||
{
|
{
|
||||||
List *t_list = NIL;
|
List *final_pathkey = NIL;
|
||||||
Var *subkey;
|
|
||||||
List *i = NIL;
|
List *i = NIL;
|
||||||
List *matched_subkeys = NIL;
|
List *considered_pathkeys = NIL;
|
||||||
Expr *tlist_key = (Expr *) NULL;
|
|
||||||
List *newly_considered_subkeys = NIL;
|
|
||||||
|
|
||||||
foreach(i, subkeys)
|
foreach(i, pathkey)
|
||||||
{
|
{
|
||||||
subkey = (Var *) lfirst(i);
|
Var *key = (Var *) lfirst(i);
|
||||||
if (subkey == NULL)
|
List *joined_keys;
|
||||||
break; /* XXX something is wrong */
|
Expr *tlist_key;
|
||||||
matched_subkeys = new_matching_subkeys(subkey, considered_subkeys,
|
|
||||||
join_rel_tlist, joinclauses);
|
|
||||||
tlist_key = matching_tlist_var(subkey, join_rel_tlist);
|
|
||||||
newly_considered_subkeys = NIL;
|
|
||||||
|
|
||||||
if (tlist_key)
|
Assert(key);
|
||||||
|
joined_keys = get_joinvars_for_var(key, &considered_pathkeys,
|
||||||
|
join_rel_tlist, joinclauses);
|
||||||
|
if (joined_keys)
|
||||||
{
|
{
|
||||||
if (!member(tlist_key, matched_subkeys))
|
considered_pathkeys = nconc(considered_pathkeys, joined_keys);
|
||||||
newly_considered_subkeys = lcons(tlist_key, matched_subkeys);
|
final_pathkey = nconc(final_pathkey, joined_keys);
|
||||||
|
}
|
||||||
|
|
||||||
|
tlist_key = matching_tlist_var(key, join_rel_tlist);
|
||||||
|
if (tlist_key && !member(tlist_key, considered_pathkeys))
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* If pathkey is in the target list, and not considered,
|
||||||
|
* add it
|
||||||
|
*/
|
||||||
|
considered_pathkeys = lcons(tlist_key, considered_pathkeys);
|
||||||
|
final_pathkey = lcons(tlist_key, final_pathkey);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
newly_considered_subkeys = matched_subkeys;
|
|
||||||
|
|
||||||
considered_subkeys = append(considered_subkeys, newly_considered_subkeys);
|
|
||||||
|
|
||||||
t_list = nconc(t_list, newly_considered_subkeys);
|
|
||||||
}
|
}
|
||||||
return t_list;
|
return copyObject(final_pathkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* new_matching_subkeys
|
* get_joinvars_for_var
|
||||||
* Returns a list of new subkeys:
|
* Returns a list of new pathkeys:
|
||||||
* (1) which are not listed in 'considered_subkeys'
|
* (1) which are not listed in 'considered_pathkeys'
|
||||||
* (2) for which the "other" variable in some clause in 'joinclauses' is
|
* (2) for which the "other" variable in some clause in 'joinclauses' is
|
||||||
* 'subkey'
|
* 'pathkey'
|
||||||
* (3) which are mentioned in 'join_rel_tlist'
|
* (3) which are mentioned in 'join_rel_tlist'
|
||||||
*
|
*
|
||||||
* Note that each returned subkey is the var node found in
|
* Note that each returned pathkey is the var node found in
|
||||||
* 'join_rel_tlist' rather than the joinclause var node.
|
* 'join_rel_tlist' rather than the joinclause var node.
|
||||||
*
|
*
|
||||||
* 'subkey' is the var node for which we are trying to find matching
|
* 'pathkey' is the var node for which we are trying to find matching
|
||||||
* clauses
|
* clauses
|
||||||
*
|
*
|
||||||
* Returns a list of new subkeys.
|
* Returns a list of new pathkeys.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static List *
|
static List *
|
||||||
new_matching_subkeys(Var *subkey,
|
get_joinvars_for_var(Var *key,
|
||||||
List *considered_subkeys,
|
List **considered_pathkeys,
|
||||||
List *join_rel_tlist,
|
List *join_rel_tlist,
|
||||||
List *joinclauses)
|
List *joinclauses)
|
||||||
{
|
{
|
||||||
List *t_list = NIL;
|
List *final_pathkey = NIL;
|
||||||
Expr *joinclause;
|
Expr *joinclause;
|
||||||
List *i;
|
List *i;
|
||||||
Expr *tlist_other_var;
|
Expr *tlist_other_var;
|
||||||
@ -431,25 +441,20 @@ new_matching_subkeys(Var *subkey,
|
|||||||
foreach(i, joinclauses)
|
foreach(i, joinclauses)
|
||||||
{
|
{
|
||||||
joinclause = lfirst(i);
|
joinclause = lfirst(i);
|
||||||
|
|
||||||
tlist_other_var = matching_tlist_var(
|
tlist_other_var = matching_tlist_var(
|
||||||
other_join_clause_var(subkey, joinclause),
|
other_join_clause_var(key, joinclause),
|
||||||
join_rel_tlist);
|
join_rel_tlist);
|
||||||
|
|
||||||
if (tlist_other_var &&
|
if (tlist_other_var &&
|
||||||
!(member(tlist_other_var, considered_subkeys)))
|
!member(tlist_other_var, *considered_pathkeys))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* XXX was "push" function */
|
|
||||||
considered_subkeys = lappend(considered_subkeys,
|
|
||||||
tlist_other_var);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* considered_subkeys = nreverse(considered_subkeys); XXX -- I
|
* The key has a join variable that is in the target list,
|
||||||
* am not sure of this.
|
* and has not been considered.
|
||||||
*/
|
*/
|
||||||
|
*considered_pathkeys = lcons(tlist_other_var, *considered_pathkeys);
|
||||||
t_list = lappend(t_list, tlist_other_var);
|
final_pathkey = lcons(tlist_other_var, final_pathkey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return t_list;
|
return final_pathkey;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.28 1999/02/18 00:49:26 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.29 1999/02/22 05:26:21 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -72,7 +72,7 @@ make_var_only_tlist(Query *root, List *tlist)
|
|||||||
{
|
{
|
||||||
TargetEntry *entry = (TargetEntry *) lfirst(l);
|
TargetEntry *entry = (TargetEntry *) lfirst(l);
|
||||||
|
|
||||||
tlist_vars = append(tlist_vars, pull_var_clause(entry->expr));
|
tlist_vars = nconc(tlist_vars, pull_var_clause(entry->expr));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now, the target list only contains Var nodes */
|
/* now, the target list only contains Var nodes */
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/joininfo.c,v 1.18 1999/02/18 00:49:37 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/joininfo.c,v 1.19 1999/02/22 05:26:26 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -101,9 +101,9 @@ other_join_clause_var(Var *var, Expr *clause)
|
|||||||
l = (Var *) get_leftop(clause);
|
l = (Var *) get_leftop(clause);
|
||||||
r = (Var *) get_rightop(clause);
|
r = (Var *) get_rightop(clause);
|
||||||
|
|
||||||
if (var_equal(var, l))
|
if (equal(var, l))
|
||||||
retval = r;
|
retval = r;
|
||||||
else if (var_equal(var, r))
|
else if (equal(var, r))
|
||||||
retval = l;
|
retval = l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.16 1999/02/13 23:16:50 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.17 1999/02/22 05:26:27 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -235,6 +235,9 @@ pull_var_clause(Node *clause)
|
|||||||
/*
|
/*
|
||||||
* var_equal
|
* var_equal
|
||||||
*
|
*
|
||||||
|
* The only difference between this an equal() is that this does not
|
||||||
|
* test varnoold and varoattno.
|
||||||
|
*
|
||||||
* Returns t iff two var nodes correspond to the same attribute.
|
* Returns t iff two var nodes correspond to the same attribute.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
|
@ -242,7 +242,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/Attic/gram.c,v 2.73 1999/02/14 05:14:09 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/Attic/gram.c,v 2.74 1999/02/22 05:26:33 momjian Exp $
|
||||||
*
|
*
|
||||||
* HISTORY
|
* HISTORY
|
||||||
* AUTHOR DATE MAJOR EVENT
|
* AUTHOR DATE MAJOR EVENT
|
||||||
@ -11574,7 +11574,7 @@ makeRowExpr(char *opr, List *largs, List *rargs)
|
|||||||
elog(ERROR,"Operator '%s' not implemented for row expressions",opr);
|
elog(ERROR,"Operator '%s' not implemented for row expressions",opr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if FALSE
|
#ifdef NOT_USED
|
||||||
while ((largs != NIL) && (rargs != NIL))
|
while ((largs != NIL) && (rargs != NIL))
|
||||||
{
|
{
|
||||||
larg = lfirst(largs);
|
larg = lfirst(largs);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.36 1999/02/21 03:49:18 scrappy Exp $
|
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.37 1999/02/22 05:26:46 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -97,7 +97,7 @@ gatherRewriteMeta(Query *parsetree,
|
|||||||
info->current_varno = rt_index;
|
info->current_varno = rt_index;
|
||||||
info->rt = parsetree->rtable;
|
info->rt = parsetree->rtable;
|
||||||
rt_length = length(info->rt);
|
rt_length = length(info->rt);
|
||||||
info->rt = append(info->rt, info->rule_action->rtable);
|
info->rt = nconc(info->rt, copyObject(info->rule_action->rtable));
|
||||||
|
|
||||||
info->new_varno = PRS2_NEW_VARNO + rt_length;
|
info->new_varno = PRS2_NEW_VARNO + rt_length;
|
||||||
OffsetVarNodes(info->rule_action->qual, rt_length, 0);
|
OffsetVarNodes(info->rule_action->qual, rt_length, 0);
|
||||||
@ -2206,7 +2206,7 @@ CopyAndAddQual(Query *parsetree,
|
|||||||
|
|
||||||
rtable = new_tree->rtable;
|
rtable = new_tree->rtable;
|
||||||
rt_length = length(rtable);
|
rt_length = length(rtable);
|
||||||
rtable = append(rtable, listCopy(rule_action->rtable));
|
rtable = nconc(rtable, copyObject(rule_action->rtable));
|
||||||
new_tree->rtable = rtable;
|
new_tree->rtable = rtable;
|
||||||
OffsetVarNodes(new_qual, rt_length, 0);
|
OffsetVarNodes(new_qual, rt_length, 0);
|
||||||
ChangeVarNodes(new_qual, PRS2_CURRENT_VARNO + rt_length, rt_index, 0);
|
ChangeVarNodes(new_qual, PRS2_CURRENT_VARNO + rt_length, rt_index, 0);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: pg_list.h,v 1.10 1999/02/13 23:21:39 momjian Exp $
|
* $Id: pg_list.h,v 1.11 1999/02/22 05:26:47 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -82,7 +82,6 @@ typedef struct List
|
|||||||
* function prototypes in nodes/list.c
|
* function prototypes in nodes/list.c
|
||||||
*/
|
*/
|
||||||
extern int length(List *list);
|
extern int length(List *list);
|
||||||
extern List *append(List *list1, List *list2);
|
|
||||||
extern List *nconc(List *list1, List *list2);
|
extern List *nconc(List *list1, List *list2);
|
||||||
extern List *lcons(void *datum, List *list);
|
extern List *lcons(void *datum, List *list);
|
||||||
extern bool member(void *foo, List *bar);
|
extern bool member(void *foo, List *bar);
|
||||||
@ -101,11 +100,9 @@ extern void set_nth(List *l, int n, void *elem);
|
|||||||
List *lconsi(int datum, List *list);
|
List *lconsi(int datum, List *list);
|
||||||
List *lappendi(List *list, int datum);
|
List *lappendi(List *list, int datum);
|
||||||
extern bool intMember(int, List *);
|
extern bool intMember(int, List *);
|
||||||
extern List *intAppend(List *list1, List *list2);
|
|
||||||
|
|
||||||
extern int nthi(int n, List *l);
|
extern int nthi(int n, List *l);
|
||||||
|
|
||||||
extern List *nreverse(List *);
|
|
||||||
extern List *set_difference(List *, List *);
|
extern List *set_difference(List *, List *);
|
||||||
extern List *set_differencei(List *, List *);
|
extern List *set_differencei(List *, List *);
|
||||||
extern List *LispUnion(List *foo, List *bar);
|
extern List *LispUnion(List *foo, List *bar);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: paths.h,v 1.25 1999/02/21 01:55:03 momjian Exp $
|
* $Id: paths.h,v 1.26 1999/02/22 05:26:52 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -58,8 +58,8 @@ extern bool order_joinkeys_by_pathkeys(List *pathkeys,
|
|||||||
List *joinkeys, List *joinclauses, int outer_or_inner,
|
List *joinkeys, List *joinclauses, int outer_or_inner,
|
||||||
List **matchedJoinKeysPtr,
|
List **matchedJoinKeysPtr,
|
||||||
List **matchedJoinClausesPtr);
|
List **matchedJoinClausesPtr);
|
||||||
extern List *extract_path_keys(List *joinkeys, List *tlist,
|
extern List *make_pathkeys_from_joinkeys(List *joinkeys, List *tlist,
|
||||||
int outer_or_inner);
|
int outer_or_inner);
|
||||||
extern Path *get_cheapest_path_for_joinkeys(List *joinkeys,
|
extern Path *get_cheapest_path_for_joinkeys(List *joinkeys,
|
||||||
PathOrder *ordering, List *paths, int outer_or_inner);
|
PathOrder *ordering, List *paths, int outer_or_inner);
|
||||||
extern List *new_join_pathkeys(List *outer_pathkeys,
|
extern List *new_join_pathkeys(List *outer_pathkeys,
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.22 1998/09/20 04:51:12 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.23 1999/02/22 05:26:53 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -438,8 +438,8 @@ tryAgain2:
|
|||||||
definitelyFailed:
|
definitelyFailed:
|
||||||
sprintf(conn->errorMessage,
|
sprintf(conn->errorMessage,
|
||||||
"pqReadData() -- backend closed the channel unexpectedly.\n"
|
"pqReadData() -- backend closed the channel unexpectedly.\n"
|
||||||
"\tThis probably means the backend terminated abnormally"
|
"\tThis probably means the backend terminated abnormally\n"
|
||||||
" before or while processing the request.\n");
|
"\tbefore or while processing the request.\n");
|
||||||
conn->status = CONNECTION_BAD; /* No more connection to backend */
|
conn->status = CONNECTION_BAD; /* No more connection to backend */
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
closesocket(conn->sock);
|
closesocket(conn->sock);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
.\" This is -*-nroff-*-
|
.\" This is -*-nroff-*-
|
||||||
.\" XXX standard disclaimer belongs here....
|
.\" XXX standard disclaimer belongs here....
|
||||||
.\" $Header: /cvsroot/pgsql/src/man/Attic/postmaster.1,v 1.14 1999/02/21 03:17:31 tgl Exp $
|
.\" $Header: /cvsroot/pgsql/src/man/Attic/postmaster.1,v 1.15 1999/02/22 05:26:58 momjian Exp $
|
||||||
.TH POSTMASTER UNIX 02/20/99 PostgreSQL PostgreSQL
|
.TH POSTMASTER UNIX 02/20/99 PostgreSQL PostgreSQL
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
postmaster - run the Postgres postmaster
|
postmaster - run the Postgres postmaster
|
||||||
@ -13,17 +13,17 @@ n_buffers]
|
|||||||
.BR "-D"
|
.BR "-D"
|
||||||
data_dir]
|
data_dir]
|
||||||
[\c
|
[\c
|
||||||
|
.BR "-N"
|
||||||
|
n_backends]
|
||||||
|
.br
|
||||||
|
.in +5n
|
||||||
|
[\c
|
||||||
.BR "-S" \c
|
.BR "-S" \c
|
||||||
]
|
]
|
||||||
[\c
|
[\c
|
||||||
.BR "-a"
|
.BR "-a"
|
||||||
system]
|
system]
|
||||||
[\c
|
[\c
|
||||||
.BR "-N"
|
|
||||||
n_backends]
|
|
||||||
.br
|
|
||||||
.in +5n
|
|
||||||
[\c
|
|
||||||
.BR "-b"
|
.BR "-b"
|
||||||
backend_pathname]
|
backend_pathname]
|
||||||
[\c
|
[\c
|
||||||
@ -35,7 +35,6 @@ backend_pathname]
|
|||||||
[\c
|
[\c
|
||||||
.BR "-n" \c
|
.BR "-n" \c
|
||||||
]
|
]
|
||||||
.br
|
|
||||||
[\c
|
[\c
|
||||||
.BR "-o"
|
.BR "-o"
|
||||||
backend_options]
|
backend_options]
|
||||||
@ -81,6 +80,14 @@ is not set, then the directory used is
|
|||||||
option is not specified, the default directory that was
|
option is not specified, the default directory that was
|
||||||
set at compile-time is used.
|
set at compile-time is used.
|
||||||
.TP
|
.TP
|
||||||
|
.BR "-N" " n_backends"
|
||||||
|
.IR "n_backends"
|
||||||
|
is the maximum number of backend server processes that this postmaster
|
||||||
|
is allowed to start. In the stock configuration, this value defaults
|
||||||
|
to 64, and can be set as high as 1024 if your system will support that
|
||||||
|
many processes. Both the default and upper limit values can be altered
|
||||||
|
when building Postgres.
|
||||||
|
.TP
|
||||||
.BR "-S"
|
.BR "-S"
|
||||||
Specifies that the
|
Specifies that the
|
||||||
.IR "postmaster"
|
.IR "postmaster"
|
||||||
@ -108,14 +115,6 @@ connections, use
|
|||||||
.BR "-a nounauth .
|
.BR "-a nounauth .
|
||||||
This option no longer has any effect.
|
This option no longer has any effect.
|
||||||
.TP
|
.TP
|
||||||
.BR "-N" " n_backends"
|
|
||||||
.IR "n_backends"
|
|
||||||
is the maximum number of backend server processes that this postmaster
|
|
||||||
is allowed to start. In the stock configuration, this value defaults
|
|
||||||
to 64, and can be set as high as 1024 if your system will support that
|
|
||||||
many processes. Both the default and upper limit values can be altered
|
|
||||||
when building Postgres.
|
|
||||||
.TP
|
|
||||||
.BR "-b" " backend_pathname"
|
.BR "-b" " backend_pathname"
|
||||||
.IR "backend_pathname"
|
.IR "backend_pathname"
|
||||||
is the full pathname of the Postgres backend server executable file that
|
is the full pathname of the Postgres backend server executable file that
|
||||||
|
Loading…
x
Reference in New Issue
Block a user