mirror of
https://github.com/postgres/postgres.git
synced 2025-10-25 13:17:41 +03:00
Cross-data-type comparisons are now indexable by btrees, pursuant to my
pghackers proposal of 8-Nov. All the existing cross-type comparison operators (int2/int4/int8 and float4/float8) have appropriate support. The original proposal of storing the right-hand-side datatype as part of the primary key for pg_amop and pg_amproc got modified a bit in the event; it is easier to store zero as the 'default' case and only store a nonzero when the operator is actually cross-type. Along the way, remove the long-since-defunct bigbox_ops operator class.
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: nbtree.h,v 1.72 2003/11/09 21:30:37 tgl Exp $
|
||||
* $Id: nbtree.h,v 1.73 2003/11/12 21:15:57 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -341,7 +341,7 @@ typedef struct xl_btree_newpage
|
||||
|
||||
/*
|
||||
* Operator strategy numbers for B-tree have been moved to access/skey.h,
|
||||
* because many places need to use them in ScanKeyEntryInitialize() calls.
|
||||
* because many places need to use them in ScanKeyInit() calls.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -404,12 +404,12 @@ typedef struct BTScanOpaqueData
|
||||
Buffer btso_mrkbuf;
|
||||
ItemPointerData curHeapIptr;
|
||||
ItemPointerData mrkHeapIptr;
|
||||
/* these fields are set by _bt_orderkeys(), which see for more info: */
|
||||
/* these fields are set by _bt_preprocess_keys(): */
|
||||
bool qual_ok; /* false if qual can never be satisfied */
|
||||
int numberOfKeys; /* number of scan keys */
|
||||
int numberOfKeys; /* number of preprocessed scan keys */
|
||||
int numberOfRequiredKeys; /* number of keys that must be
|
||||
* matched to continue the scan */
|
||||
ScanKey keyData; /* array of scan keys */
|
||||
ScanKey keyData; /* array of preprocessed scan keys */
|
||||
} BTScanOpaqueData;
|
||||
|
||||
typedef BTScanOpaqueData *BTScanOpaque;
|
||||
@@ -424,7 +424,6 @@ extern Datum btinsert(PG_FUNCTION_ARGS);
|
||||
extern Datum btgettuple(PG_FUNCTION_ARGS);
|
||||
extern Datum btbeginscan(PG_FUNCTION_ARGS);
|
||||
extern Datum btrescan(PG_FUNCTION_ARGS);
|
||||
extern void btmovescan(IndexScanDesc scan, Datum v);
|
||||
extern Datum btendscan(PG_FUNCTION_ARGS);
|
||||
extern Datum btmarkpos(PG_FUNCTION_ARGS);
|
||||
extern Datum btrestrpos(PG_FUNCTION_ARGS);
|
||||
@@ -480,7 +479,7 @@ extern ScanKey _bt_mkscankey(Relation rel, IndexTuple itup);
|
||||
extern ScanKey _bt_mkscankey_nodata(Relation rel);
|
||||
extern void _bt_freeskey(ScanKey skey);
|
||||
extern void _bt_freestack(BTStack stack);
|
||||
extern void _bt_orderkeys(IndexScanDesc scan);
|
||||
extern void _bt_preprocess_keys(IndexScanDesc scan);
|
||||
extern bool _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple,
|
||||
ScanDirection dir, bool *continuescan);
|
||||
extern BTItem _bt_formitem(IndexTuple itup);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: skey.h,v 1.23 2003/11/09 21:30:37 tgl Exp $
|
||||
* $Id: skey.h,v 1.24 2003/11/12 21:15:57 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -20,7 +20,8 @@
|
||||
|
||||
/*
|
||||
* Strategy numbers identify the semantics that particular operators have
|
||||
* with respect to particular operator classes.
|
||||
* with respect to particular operator classes. In some cases a strategy
|
||||
* subtype (an OID) is used as further information.
|
||||
*/
|
||||
typedef uint16 StrategyNumber;
|
||||
|
||||
@@ -47,23 +48,23 @@ typedef uint16 StrategyNumber;
|
||||
* (The data structure can support unary indexable operators too; in that
|
||||
* case sk_argument would go unused. This is not currently implemented.)
|
||||
*
|
||||
* For an index scan, sk_strategy must be set correctly for the operator.
|
||||
* When using a ScanKey in a heap scan, sk_strategy is not used and may be
|
||||
* set to InvalidStrategy.
|
||||
* For an index scan, sk_strategy and sk_subtype must be set correctly for
|
||||
* the operator. When using a ScanKey in a heap scan, these fields are not
|
||||
* used and may be set to InvalidStrategy/InvalidOid.
|
||||
*
|
||||
* Note: in some places, ScanKeys are used as a convenient representation
|
||||
* for the invocation of an access method support procedure. In this case
|
||||
* sk_strategy is not meaningful, and sk_func may refer to a function that
|
||||
* returns something other than boolean.
|
||||
* sk_strategy/sk_subtype are not meaningful, and sk_func may refer to a
|
||||
* function that returns something other than boolean.
|
||||
*/
|
||||
typedef struct ScanKeyData
|
||||
{
|
||||
int sk_flags; /* flags, see below */
|
||||
AttrNumber sk_attno; /* table or index column number */
|
||||
StrategyNumber sk_strategy; /* operator strategy number */
|
||||
Oid sk_subtype; /* strategy subtype */
|
||||
FmgrInfo sk_func; /* lookup info for function to call */
|
||||
Datum sk_argument; /* data to compare */
|
||||
Oid sk_argtype; /* datatype of sk_argument */
|
||||
} ScanKeyData;
|
||||
|
||||
typedef ScanKeyData *ScanKey;
|
||||
@@ -76,19 +77,24 @@ typedef ScanKeyData *ScanKey;
|
||||
/*
|
||||
* prototypes for functions in access/common/scankey.c
|
||||
*/
|
||||
extern void ScanKeyInit(ScanKey entry,
|
||||
AttrNumber attributeNumber,
|
||||
StrategyNumber strategy,
|
||||
RegProcedure procedure,
|
||||
Datum argument);
|
||||
extern void ScanKeyEntryInitialize(ScanKey entry,
|
||||
int flags,
|
||||
AttrNumber attributeNumber,
|
||||
StrategyNumber strategy,
|
||||
Oid subtype,
|
||||
RegProcedure procedure,
|
||||
Datum argument,
|
||||
Oid argtype);
|
||||
Datum argument);
|
||||
extern void ScanKeyEntryInitializeWithInfo(ScanKey entry,
|
||||
int flags,
|
||||
AttrNumber attributeNumber,
|
||||
StrategyNumber strategy,
|
||||
Oid subtype,
|
||||
FmgrInfo *finfo,
|
||||
Datum argument,
|
||||
Oid argtype);
|
||||
Datum argument);
|
||||
|
||||
#endif /* SKEY_H */
|
||||
|
||||
Reference in New Issue
Block a user