mirror of
https://github.com/postgres/postgres.git
synced 2025-07-14 08:21:07 +03:00
Create a 'type cache' that keeps track of the data needed for any particular
datatype by array_eq and array_cmp; use this to solve problems with memory leaks in array indexing support. The parser's equality_oper and ordering_oper routines also use the cache. Change the operator search algorithms to look for appropriate btree or hash index opclasses, instead of assuming operators named '<' or '=' have the right semantics. (ORDER BY ASC/DESC now also look at opclasses, instead of assuming '<' and '>' are the right things.) Add several more index opclasses so that there is no regression in functionality for base datatypes. initdb forced due to catalog additions.
This commit is contained in:
66
src/include/utils/typcache.h
Normal file
66
src/include/utils/typcache.h
Normal file
@ -0,0 +1,66 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* typcache.h
|
||||
* Type cache definitions.
|
||||
*
|
||||
* The type cache exists to speed lookup of certain information about data
|
||||
* types that is not directly available from a type's pg_type row.
|
||||
*
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: typcache.h,v 1.1 2003/08/17 19:58:06 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef TYPCACHE_H
|
||||
#define TYPCACHE_H
|
||||
|
||||
#include "fmgr.h"
|
||||
|
||||
|
||||
typedef struct TypeCacheEntry
|
||||
{
|
||||
/* typeId is the hash lookup key and MUST BE FIRST */
|
||||
Oid type_id; /* OID of the data type */
|
||||
|
||||
/* some subsidiary information copied from the pg_type row */
|
||||
int16 typlen;
|
||||
bool typbyval;
|
||||
char typalign;
|
||||
|
||||
/*
|
||||
* Information obtained from opclass entries
|
||||
*
|
||||
* These will be InvalidOid if no match could be found, or if the
|
||||
* information hasn't yet been requested.
|
||||
*/
|
||||
Oid btree_opc; /* OID of the default btree opclass */
|
||||
Oid hash_opc; /* OID of the default hash opclass */
|
||||
Oid eq_opr; /* OID of the equality operator */
|
||||
Oid lt_opr; /* OID of the less-than operator */
|
||||
Oid gt_opr; /* OID of the greater-than operator */
|
||||
Oid cmp_proc; /* OID of the btree comparison function */
|
||||
|
||||
/*
|
||||
* Pre-set-up fmgr call info for the equality operator and the btree
|
||||
* comparison function. These are kept in the type cache to avoid
|
||||
* problems with memory leaks in repeated calls to array_eq and array_cmp.
|
||||
* There is not currently a need to maintain call info for the lt_opr
|
||||
* or gt_opr.
|
||||
*/
|
||||
FmgrInfo eq_opr_finfo;
|
||||
FmgrInfo cmp_proc_finfo;
|
||||
} TypeCacheEntry;
|
||||
|
||||
/* Bit flags to indicate which fields a given caller needs to have set */
|
||||
#define TYPECACHE_EQ_OPR 0x0001
|
||||
#define TYPECACHE_LT_OPR 0x0002
|
||||
#define TYPECACHE_GT_OPR 0x0004
|
||||
#define TYPECACHE_CMP_PROC 0x0008
|
||||
#define TYPECACHE_EQ_OPR_FINFO 0x0010
|
||||
#define TYPECACHE_CMP_PROC_FINFO 0x0020
|
||||
|
||||
extern TypeCacheEntry *lookup_type_cache(Oid type_id, int flags);
|
||||
|
||||
#endif /* TYPCACHE_H */
|
Reference in New Issue
Block a user