summaryrefslogtreecommitdiff
path: root/src/include/access/rtree.h
blob: 846090204aaa90dbbe0fa67db8ed2e4685b4ba09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*-------------------------------------------------------------------------
 *
 * rtree.h
 *	  common declarations for the rtree access method code.
 *
 *
 * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * $Id: rtree.h,v 1.31 2003/11/09 21:30:37 tgl Exp $
 *
 *-------------------------------------------------------------------------
 */
#ifndef RTREE_H
#define RTREE_H

#include "access/itup.h"
#include "access/sdir.h"
#include "access/skey.h"
#include "access/xlog.h"
#include "utils/rel.h"

/* see rtstrat.c for what all this is about */
#define RTNStrategies					8
#define RTLeftStrategyNumber			1
#define RTOverLeftStrategyNumber		2
#define RTOverlapStrategyNumber			3
#define RTOverRightStrategyNumber		4
#define RTRightStrategyNumber			5
#define RTSameStrategyNumber			6
#define RTContainsStrategyNumber		7
#define RTContainedByStrategyNumber		8

#define RTNProcs						3
#define RT_UNION_PROC					1
#define RT_INTER_PROC					2
#define RT_SIZE_PROC					3

#define F_LEAF			(1 << 0)

typedef struct RTreePageOpaqueData
{
	uint32		flags;
} RTreePageOpaqueData;

typedef RTreePageOpaqueData *RTreePageOpaque;

/*
 *	When we descend a tree, we keep a stack of parent pointers.
 */

typedef struct RTSTACK
{
	struct RTSTACK *rts_parent;
	OffsetNumber rts_child;
	BlockNumber rts_blk;
} RTSTACK;

/*
 *	When we're doing a scan, we need to keep track of the parent stack
 *	for the marked and current items.  Also, rtrees have the following
 *	property:  if you're looking for the box (1,1,2,2), on the internal
 *	nodes you have to search for all boxes that *contain* (1,1,2,2), and
 *	not the ones that match it.  We have a private scan key for internal
 *	nodes in the opaque structure for rtrees for this reason.  See
 *	access/index-rtree/rtscan.c and rtstrat.c for how it gets initialized.
 */

typedef struct RTreeScanOpaqueData
{
	struct RTSTACK *s_stack;
	struct RTSTACK *s_markstk;
	uint16		s_flags;
	int			s_internalNKey;
	ScanKey		s_internalKey;
} RTreeScanOpaqueData;

typedef RTreeScanOpaqueData *RTreeScanOpaque;

/*
 *	When we're doing a scan and updating a tree at the same time, the
 *	updates may affect the scan.  We use the flags entry of the scan's
 *	opaque space to record our actual position in response to updates
 *	that we can't handle simply by adjusting pointers.
 */

#define RTS_CURBEFORE	((uint16) (1 << 0))
#define RTS_MRKBEFORE	((uint16) (1 << 1))

/* root page of an rtree */
#define P_ROOT			0

/*
 *	When we update a relation on which we're doing a scan, we need to
 *	check the scan and fix it if the update affected any of the pages it
 *	touches.  Otherwise, we can miss records that we should see.  The only
 *	times we need to do this are for deletions and splits.	See the code in
 *	rtscan.c for how the scan is fixed.  These two contants tell us what sort
 *	of operation changed the index.
 */

#define RTOP_DEL		0
#define RTOP_SPLIT		1

/* defined in rtree.c */
extern void freestack(RTSTACK *s);

/*
 *		RTree code.
 *		Defined in access/rtree/
 */
extern Datum rtinsert(PG_FUNCTION_ARGS);
extern Datum rtbulkdelete(PG_FUNCTION_ARGS);

extern Datum rtgettuple(PG_FUNCTION_ARGS);
extern Datum rtbeginscan(PG_FUNCTION_ARGS);

extern Datum rtendscan(PG_FUNCTION_ARGS);
extern Datum rtmarkpos(PG_FUNCTION_ARGS);
extern Datum rtrestrpos(PG_FUNCTION_ARGS);
extern Datum rtrescan(PG_FUNCTION_ARGS);
extern Datum rtbuild(PG_FUNCTION_ARGS);
extern void _rtdump(Relation r);

extern void rtree_redo(XLogRecPtr lsn, XLogRecord *record);
extern void rtree_undo(XLogRecPtr lsn, XLogRecord *record);
extern void rtree_desc(char *buf, uint8 xl_info, char *rec);

/* rtscan.c */
extern void rtadjscans(Relation r, int op, BlockNumber blkno,
		   OffsetNumber offnum);
extern void AtEOXact_rtree(void);

/* rtstrat.c */
extern StrategyNumber RTMapToInternalOperator(StrategyNumber strat);

#endif   /* RTREE_H */