mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
Remove now-dead sort modules.
This commit is contained in:
parent
26c48b5e8c
commit
887afac1f5
@ -1,355 +0,0 @@
|
|||||||
/*-------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* lselect.c
|
|
||||||
* leftist tree selection algorithm (linked priority queue--Knuth, Vol.3,
|
|
||||||
* pp.150-52)
|
|
||||||
*
|
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* IDENTIFICATION
|
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/sort/Attic/lselect.c,v 1.19 1999/07/17 20:18:16 momjian Exp $
|
|
||||||
*
|
|
||||||
*-------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "postgres.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include "access/heapam.h"
|
|
||||||
#include "utils/lselect.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* lmerge - merges two leftist trees into one
|
|
||||||
*
|
|
||||||
* Note:
|
|
||||||
* Enforcing the rule that pt->lt_dist >= qt->lt_dist may
|
|
||||||
* simplifify much of the code. Removing recursion will not
|
|
||||||
* speed up code significantly.
|
|
||||||
*/
|
|
||||||
struct leftist *
|
|
||||||
lmerge(struct leftist * pt, struct leftist * qt, LeftistContext context)
|
|
||||||
{
|
|
||||||
struct leftist *root,
|
|
||||||
*majorLeftist,
|
|
||||||
*minorLeftist;
|
|
||||||
int dist;
|
|
||||||
|
|
||||||
if (tuplecmp(pt->lt_tuple, qt->lt_tuple, context))
|
|
||||||
{
|
|
||||||
root = pt;
|
|
||||||
majorLeftist = qt;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
root = qt;
|
|
||||||
majorLeftist = pt;
|
|
||||||
}
|
|
||||||
if (root->lt_left == NULL)
|
|
||||||
root->lt_left = majorLeftist;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((minorLeftist = root->lt_right) != NULL)
|
|
||||||
majorLeftist = lmerge(majorLeftist, minorLeftist, context);
|
|
||||||
if ((dist = root->lt_left->lt_dist) < majorLeftist->lt_dist)
|
|
||||||
{
|
|
||||||
root->lt_dist = 1 + dist;
|
|
||||||
root->lt_right = root->lt_left;
|
|
||||||
root->lt_left = majorLeftist;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
root->lt_dist = 1 + majorLeftist->lt_dist;
|
|
||||||
root->lt_right = majorLeftist;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return root;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct leftist *
|
|
||||||
linsert(struct leftist * root, struct leftist * new1, LeftistContext context)
|
|
||||||
{
|
|
||||||
struct leftist *left,
|
|
||||||
*right;
|
|
||||||
|
|
||||||
if (!tuplecmp(root->lt_tuple, new1->lt_tuple, context))
|
|
||||||
{
|
|
||||||
new1->lt_left = root;
|
|
||||||
return new1;
|
|
||||||
}
|
|
||||||
left = root->lt_left;
|
|
||||||
right = root->lt_right;
|
|
||||||
if (right == NULL)
|
|
||||||
{
|
|
||||||
if (left == NULL)
|
|
||||||
root->lt_left = new1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
root->lt_right = new1;
|
|
||||||
root->lt_dist = 2;
|
|
||||||
}
|
|
||||||
return root;
|
|
||||||
}
|
|
||||||
right = linsert(right, new1, context);
|
|
||||||
if (right->lt_dist < left->lt_dist)
|
|
||||||
{
|
|
||||||
root->lt_dist = 1 + left->lt_dist;
|
|
||||||
root->lt_left = right;
|
|
||||||
root->lt_right = left;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
root->lt_dist = 1 + right->lt_dist;
|
|
||||||
root->lt_right = right;
|
|
||||||
}
|
|
||||||
return root;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* gettuple - returns tuple at top of tree (Tuples)
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* tuple at top of tree, NULL if failed ALLOC()
|
|
||||||
* *devnum is set to the devnum of tuple returned
|
|
||||||
* *treep is set to the new tree
|
|
||||||
*
|
|
||||||
* Note:
|
|
||||||
* *treep must not be NULL
|
|
||||||
* NULL is currently never returned BUG
|
|
||||||
*/
|
|
||||||
HeapTuple
|
|
||||||
gettuple(struct leftist ** treep,
|
|
||||||
short *devnum, /* device from which tuple came */
|
|
||||||
LeftistContext context)
|
|
||||||
{
|
|
||||||
struct leftist *tp;
|
|
||||||
HeapTuple tup;
|
|
||||||
|
|
||||||
tp = *treep;
|
|
||||||
tup = tp->lt_tuple;
|
|
||||||
*devnum = tp->lt_devnum;
|
|
||||||
if (tp->lt_dist == 1) /* lt_left == NULL */
|
|
||||||
*treep = tp->lt_left;
|
|
||||||
else
|
|
||||||
*treep = lmerge(tp->lt_left, tp->lt_right, context);
|
|
||||||
|
|
||||||
pfree(tp);
|
|
||||||
return tup;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* puttuple - inserts new tuple into tree
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* NULL iff failed ALLOC()
|
|
||||||
*
|
|
||||||
* Note:
|
|
||||||
* Currently never returns NULL BUG
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
puttuple(struct leftist ** treep,
|
|
||||||
HeapTuple newtuple,
|
|
||||||
short devnum,
|
|
||||||
LeftistContext context)
|
|
||||||
{
|
|
||||||
struct leftist *new1;
|
|
||||||
struct leftist *tp;
|
|
||||||
|
|
||||||
new1 = (struct leftist *) palloc((unsigned) sizeof(struct leftist));
|
|
||||||
new1->lt_dist = 1;
|
|
||||||
new1->lt_devnum = devnum;
|
|
||||||
new1->lt_tuple = newtuple;
|
|
||||||
new1->lt_left = NULL;
|
|
||||||
new1->lt_right = NULL;
|
|
||||||
if ((tp = *treep) == NULL)
|
|
||||||
*treep = new1;
|
|
||||||
else
|
|
||||||
*treep = linsert(tp, new1, context);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* tuplecmp - Compares two tuples with respect CmpList
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* 1 if left < right ;0 otherwise
|
|
||||||
* Assumtions:
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
tuplecmp(HeapTuple ltup, HeapTuple rtup, LeftistContext context)
|
|
||||||
{
|
|
||||||
int nkey;
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
if (ltup == (HeapTuple) NULL)
|
|
||||||
return 0;
|
|
||||||
if (rtup == (HeapTuple) NULL)
|
|
||||||
return 1;
|
|
||||||
for (nkey = 0; nkey < context->nKeys; nkey++)
|
|
||||||
{
|
|
||||||
ScanKey thisKey = & context->scanKeys[nkey];
|
|
||||||
Datum lattr,
|
|
||||||
rattr;
|
|
||||||
bool lisnull,
|
|
||||||
risnull;
|
|
||||||
|
|
||||||
lattr = heap_getattr(ltup, thisKey->sk_attno,
|
|
||||||
context->tupDesc, &lisnull);
|
|
||||||
rattr = heap_getattr(rtup, thisKey->sk_attno,
|
|
||||||
context->tupDesc, &risnull);
|
|
||||||
if (lisnull)
|
|
||||||
{
|
|
||||||
if (risnull)
|
|
||||||
continue; /* treat two nulls as equal */
|
|
||||||
return 0; /* else, a null sorts after all else */
|
|
||||||
}
|
|
||||||
if (risnull)
|
|
||||||
return 1;
|
|
||||||
if (thisKey->sk_flags & SK_COMMUTE)
|
|
||||||
{
|
|
||||||
if (!(result =
|
|
||||||
(long) (*fmgr_faddr(&thisKey->sk_func)) (rattr, lattr)))
|
|
||||||
result =
|
|
||||||
-(long) (*fmgr_faddr(&thisKey->sk_func)) (lattr, rattr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!(result =
|
|
||||||
(long) (*fmgr_faddr(&thisKey->sk_func)) (lattr, rattr)))
|
|
||||||
result =
|
|
||||||
-(long) (*fmgr_faddr(&thisKey->sk_func)) (rattr, lattr);
|
|
||||||
}
|
|
||||||
if (result)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return result == 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef EBUG
|
|
||||||
void
|
|
||||||
checktree(struct leftist * tree, LeftistContext context)
|
|
||||||
{
|
|
||||||
int lnodes;
|
|
||||||
int rnodes;
|
|
||||||
|
|
||||||
if (tree == NULL)
|
|
||||||
{
|
|
||||||
puts("Null tree.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
lnodes = checktreer(tree->lt_left, 1, context);
|
|
||||||
rnodes = checktreer(tree->lt_right, 1, context);
|
|
||||||
if (lnodes < 0)
|
|
||||||
{
|
|
||||||
lnodes = -lnodes;
|
|
||||||
puts("0:\tBad left side.");
|
|
||||||
}
|
|
||||||
if (rnodes < 0)
|
|
||||||
{
|
|
||||||
rnodes = -rnodes;
|
|
||||||
puts("0:\tBad right side.");
|
|
||||||
}
|
|
||||||
if (lnodes == 0)
|
|
||||||
{
|
|
||||||
if (rnodes != 0)
|
|
||||||
puts("0:\tLeft and right reversed.");
|
|
||||||
if (tree->lt_dist != 1)
|
|
||||||
puts("0:\tDistance incorrect.");
|
|
||||||
}
|
|
||||||
else if (rnodes == 0)
|
|
||||||
{
|
|
||||||
if (tree->lt_dist != 1)
|
|
||||||
puts("0:\tDistance incorrect.");
|
|
||||||
}
|
|
||||||
else if (tree->lt_left->lt_dist < tree->lt_right->lt_dist)
|
|
||||||
{
|
|
||||||
puts("0:\tLeft and right reversed.");
|
|
||||||
if (tree->lt_dist != 1 + tree->lt_left->lt_dist)
|
|
||||||
puts("0:\tDistance incorrect.");
|
|
||||||
}
|
|
||||||
else if (tree->lt_dist != 1 + tree->lt_right->lt_dist)
|
|
||||||
puts("0:\tDistance incorrect.");
|
|
||||||
if (lnodes > 0)
|
|
||||||
if (tuplecmp(tree->lt_left->lt_tuple, tree->lt_tuple, context))
|
|
||||||
printf("%d:\tLeft child < parent.\n");
|
|
||||||
if (rnodes > 0)
|
|
||||||
if (tuplecmp(tree->lt_right->lt_tuple, tree->lt_tuple, context))
|
|
||||||
printf("%d:\tRight child < parent.\n");
|
|
||||||
printf("Tree has %d nodes\n", 1 + lnodes + rnodes);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
checktreer(struct leftist * tree, int level, LeftistContext context)
|
|
||||||
{
|
|
||||||
int lnodes,
|
|
||||||
rnodes;
|
|
||||||
int error = 0;
|
|
||||||
|
|
||||||
if (tree == NULL)
|
|
||||||
return 0;
|
|
||||||
lnodes = checktreer(tree->lt_left, level + 1, context);
|
|
||||||
rnodes = checktreer(tree->lt_right, level + 1, context);
|
|
||||||
if (lnodes < 0)
|
|
||||||
{
|
|
||||||
error = 1;
|
|
||||||
lnodes = -lnodes;
|
|
||||||
printf("%d:\tBad left side.\n", level);
|
|
||||||
}
|
|
||||||
if (rnodes < 0)
|
|
||||||
{
|
|
||||||
error = 1;
|
|
||||||
rnodes = -rnodes;
|
|
||||||
printf("%d:\tBad right side.\n", level);
|
|
||||||
}
|
|
||||||
if (lnodes == 0)
|
|
||||||
{
|
|
||||||
if (rnodes != 0)
|
|
||||||
{
|
|
||||||
error = 1;
|
|
||||||
printf("%d:\tLeft and right reversed.\n", level);
|
|
||||||
}
|
|
||||||
if (tree->lt_dist != 1)
|
|
||||||
{
|
|
||||||
error = 1;
|
|
||||||
printf("%d:\tDistance incorrect.\n", level);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (rnodes == 0)
|
|
||||||
{
|
|
||||||
if (tree->lt_dist != 1)
|
|
||||||
{
|
|
||||||
error = 1;
|
|
||||||
printf("%d:\tDistance incorrect.\n", level);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (tree->lt_left->lt_dist < tree->lt_right->lt_dist)
|
|
||||||
{
|
|
||||||
error = 1;
|
|
||||||
printf("%d:\tLeft and right reversed.\n", level);
|
|
||||||
if (tree->lt_dist != 1 + tree->lt_left->lt_dist)
|
|
||||||
printf("%d:\tDistance incorrect.\n", level);
|
|
||||||
}
|
|
||||||
else if (tree->lt_dist != 1 + tree->lt_right->lt_dist)
|
|
||||||
{
|
|
||||||
error = 1;
|
|
||||||
printf("%d:\tDistance incorrect.\n", level);
|
|
||||||
}
|
|
||||||
if (lnodes > 0)
|
|
||||||
if (tuplecmp(tree->lt_left->lt_tuple, tree->lt_tuple, context))
|
|
||||||
{
|
|
||||||
error = 1;
|
|
||||||
printf("%d:\tLeft child < parent.\n");
|
|
||||||
}
|
|
||||||
if (rnodes > 0)
|
|
||||||
if (tuplecmp(tree->lt_right->lt_tuple, tree->lt_tuple, context))
|
|
||||||
{
|
|
||||||
error = 1;
|
|
||||||
printf("%d:\tRight child < parent.\n");
|
|
||||||
}
|
|
||||||
if (error)
|
|
||||||
return -1 + -lnodes + -rnodes;
|
|
||||||
return 1 + lnodes + rnodes;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
File diff suppressed because it is too large
Load Diff
@ -1,22 +0,0 @@
|
|||||||
/*-------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* qsort.h
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
|
||||||
*
|
|
||||||
* $Id: qsort.h,v 1.7 1999/02/13 23:21:32 momjian Exp $
|
|
||||||
*
|
|
||||||
*-------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
#ifndef QSORT_H
|
|
||||||
#define QSORT_H
|
|
||||||
|
|
||||||
|
|
||||||
extern void pg_qsort(void *bot,
|
|
||||||
size_t nmemb,
|
|
||||||
size_t size,
|
|
||||||
int (*compar) (void *, void *));
|
|
||||||
|
|
||||||
#endif /* QSORT_H */
|
|
@ -1,51 +0,0 @@
|
|||||||
/*-------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* lselect.h
|
|
||||||
* definitions for the replacement selection algorithm.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
|
||||||
*
|
|
||||||
* $Id: lselect.h,v 1.14 1999/07/17 20:18:36 momjian Exp $
|
|
||||||
*
|
|
||||||
*-------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
#ifndef LSELECT_H
|
|
||||||
#define LSELECT_H
|
|
||||||
|
|
||||||
#include "utils/syscache.h"
|
|
||||||
|
|
||||||
struct leftist
|
|
||||||
{
|
|
||||||
short lt_dist; /* distance to leaf/empty node */
|
|
||||||
short lt_devnum; /* device number of tuple */
|
|
||||||
HeapTuple lt_tuple;
|
|
||||||
struct leftist *lt_left;
|
|
||||||
struct leftist *lt_right;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* replaces global variables in lselect.c to make it reentrant */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
TupleDesc tupDesc;
|
|
||||||
int nKeys;
|
|
||||||
ScanKey scanKeys;
|
|
||||||
int sortMem; /* needed for psort */
|
|
||||||
} LeftistContextData;
|
|
||||||
typedef LeftistContextData *LeftistContext;
|
|
||||||
|
|
||||||
extern struct leftist *lmerge(struct leftist * pt, struct leftist * qt,
|
|
||||||
LeftistContext context);
|
|
||||||
extern HeapTuple gettuple(struct leftist ** treep, short *devnum,
|
|
||||||
LeftistContext context);
|
|
||||||
extern void puttuple(struct leftist ** treep, HeapTuple newtuple, short devnum,
|
|
||||||
LeftistContext context);
|
|
||||||
extern int tuplecmp(HeapTuple ltup, HeapTuple rtup, LeftistContext context);
|
|
||||||
|
|
||||||
#ifdef EBUG
|
|
||||||
extern void checktree(struct leftist * tree, LeftistContext context);
|
|
||||||
extern int checktreer(struct leftist * tree, int level, LeftistContext context);
|
|
||||||
|
|
||||||
#endif /* EBUG */
|
|
||||||
|
|
||||||
#endif /* LSELECT_H */
|
|
@ -1,26 +0,0 @@
|
|||||||
/*-------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* psort.h
|
|
||||||
* Polyphase merge sort.
|
|
||||||
*
|
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
|
||||||
*
|
|
||||||
* $Id: psort.h,v 1.23 1999/10/16 19:49:28 tgl Exp $
|
|
||||||
*
|
|
||||||
*-------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
#ifndef PSORT_H
|
|
||||||
#define PSORT_H
|
|
||||||
|
|
||||||
#include "access/htup.h"
|
|
||||||
#include "access/skey.h"
|
|
||||||
#include "nodes/plannodes.h"
|
|
||||||
|
|
||||||
extern bool psort_begin(Sort *node, int nkeys, ScanKey key);
|
|
||||||
extern HeapTuple psort_grabtuple(Sort *node, bool *should_free);
|
|
||||||
extern void psort_markpos(Sort *node);
|
|
||||||
extern void psort_restorepos(Sort *node);
|
|
||||||
extern void psort_end(Sort *node);
|
|
||||||
extern void psort_rescan(Sort *node);
|
|
||||||
|
|
||||||
#endif /* PSORT_H */
|
|
Loading…
x
Reference in New Issue
Block a user