mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Create real array comparison functions (that use the element datatype's
comparison functions), replacing the highly bogus bitwise array_eq. Create a btree index opclass for ANYARRAY --- it is now possible to create indexes on array columns. Arrange to cache the results of catalog lookups across multiple array operations, instead of repeating the lookups on every call. Add string_to_array and array_to_string functions. Remove singleton_array, array_accum, array_assign, and array_subscript functions, since these were for proof-of-concept and not intended to become supported functions. Minor adjustments to behavior in some corner cases with empty or zero-dimensional arrays. Joe Conway (with some editorializing by Tom Lane).
This commit is contained in:
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: acl.h,v 1.54 2003/06/25 21:30:33 momjian Exp $
|
||||
* $Id: acl.h,v 1.55 2003/06/27 00:33:26 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* For backward-compatibility purposes we have to allow there
|
||||
@ -192,6 +192,7 @@ extern Datum aclinsert(PG_FUNCTION_ARGS);
|
||||
extern Datum aclremove(PG_FUNCTION_ARGS);
|
||||
extern Datum aclcontains(PG_FUNCTION_ARGS);
|
||||
extern Datum makeaclitem(PG_FUNCTION_ARGS);
|
||||
extern Datum aclitem_eq(PG_FUNCTION_ARGS);
|
||||
|
||||
/*
|
||||
* prototypes for functions in aclchk.c
|
||||
|
@ -10,7 +10,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: array.h,v 1.40 2003/06/25 21:30:33 momjian Exp $
|
||||
* $Id: array.h,v 1.41 2003/06/27 00:33:26 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -32,6 +32,37 @@ typedef struct
|
||||
Oid elemtype; /* element type OID */
|
||||
} ArrayType;
|
||||
|
||||
typedef struct ArrayBuildState
|
||||
{
|
||||
MemoryContext mcontext; /* where all the temp stuff is kept */
|
||||
Datum *dvalues; /* array of accumulated Datums */
|
||||
/*
|
||||
* The allocated size of dvalues[] is always a multiple of
|
||||
* ARRAY_ELEMS_CHUNKSIZE
|
||||
*/
|
||||
#define ARRAY_ELEMS_CHUNKSIZE 64
|
||||
int nelems; /* number of valid Datums in dvalues[] */
|
||||
Oid element_type; /* data type of the Datums */
|
||||
int16 typlen; /* needed info about datatype */
|
||||
bool typbyval;
|
||||
char typalign;
|
||||
} ArrayBuildState;
|
||||
|
||||
/*
|
||||
* structure to cache type metadata needed for array manipulation
|
||||
*/
|
||||
typedef struct ArrayMetaState
|
||||
{
|
||||
Oid element_type;
|
||||
int16 typlen;
|
||||
bool typbyval;
|
||||
char typalign;
|
||||
char typdelim;
|
||||
Oid typelem;
|
||||
Oid typiofunc;
|
||||
FmgrInfo proc;
|
||||
} ArrayMetaState;
|
||||
|
||||
/*
|
||||
* fmgr macros for array objects
|
||||
*/
|
||||
@ -86,11 +117,15 @@ extern Datum array_recv(PG_FUNCTION_ARGS);
|
||||
extern Datum array_send(PG_FUNCTION_ARGS);
|
||||
extern Datum array_length_coerce(PG_FUNCTION_ARGS);
|
||||
extern Datum array_eq(PG_FUNCTION_ARGS);
|
||||
extern Datum array_ne(PG_FUNCTION_ARGS);
|
||||
extern Datum array_lt(PG_FUNCTION_ARGS);
|
||||
extern Datum array_gt(PG_FUNCTION_ARGS);
|
||||
extern Datum array_le(PG_FUNCTION_ARGS);
|
||||
extern Datum array_ge(PG_FUNCTION_ARGS);
|
||||
extern Datum btarraycmp(PG_FUNCTION_ARGS);
|
||||
extern Datum array_dims(PG_FUNCTION_ARGS);
|
||||
extern Datum array_lower(PG_FUNCTION_ARGS);
|
||||
extern Datum array_upper(PG_FUNCTION_ARGS);
|
||||
extern Datum array_assign(PG_FUNCTION_ARGS);
|
||||
extern Datum array_subscript(PG_FUNCTION_ARGS);
|
||||
extern Datum array_type_coerce(PG_FUNCTION_ARGS);
|
||||
|
||||
extern Datum array_ref(ArrayType *array, int nSubscripts, int *indx,
|
||||
@ -124,7 +159,14 @@ extern void deconstruct_array(ArrayType *array,
|
||||
Oid elmtype,
|
||||
int elmlen, bool elmbyval, char elmalign,
|
||||
Datum **elemsp, int *nelemsp);
|
||||
|
||||
extern ArrayBuildState *accumArrayResult(ArrayBuildState *astate,
|
||||
Datum dvalue, bool disnull,
|
||||
Oid element_type,
|
||||
MemoryContext rcontext);
|
||||
extern Datum makeArrayResult(ArrayBuildState *astate,
|
||||
MemoryContext rcontext);
|
||||
extern Datum makeMdArrayResult(ArrayBuildState *astate, int ndims,
|
||||
int *dims, int *lbs, MemoryContext rcontext);
|
||||
|
||||
/*
|
||||
* prototypes for functions defined in arrayutils.c
|
||||
@ -141,12 +183,11 @@ extern int mda_next_tuple(int n, int *curr, int *span);
|
||||
/*
|
||||
* prototypes for functions defined in array_userfuncs.c
|
||||
*/
|
||||
extern Datum singleton_array(PG_FUNCTION_ARGS);
|
||||
extern Datum array_push(PG_FUNCTION_ARGS);
|
||||
extern Datum array_accum(PG_FUNCTION_ARGS);
|
||||
extern Datum array_cat(PG_FUNCTION_ARGS);
|
||||
|
||||
extern ArrayType *create_singleton_array(Oid element_type,
|
||||
extern ArrayType *create_singleton_array(FunctionCallInfo fcinfo,
|
||||
Oid element_type,
|
||||
Datum element,
|
||||
int ndims);
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: builtins.h,v 1.222 2003/06/25 21:30:33 momjian Exp $
|
||||
* $Id: builtins.h,v 1.223 2003/06/27 00:33:26 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -530,6 +530,8 @@ extern bool SplitIdentifierString(char *rawstring, char separator,
|
||||
List **namelist);
|
||||
extern Datum replace_text(PG_FUNCTION_ARGS);
|
||||
extern Datum split_text(PG_FUNCTION_ARGS);
|
||||
extern Datum text_to_array(PG_FUNCTION_ARGS);
|
||||
extern Datum array_to_text(PG_FUNCTION_ARGS);
|
||||
extern Datum to_hex32(PG_FUNCTION_ARGS);
|
||||
extern Datum to_hex64(PG_FUNCTION_ARGS);
|
||||
extern Datum md5_text(PG_FUNCTION_ARGS);
|
||||
|
@ -6,7 +6,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: lsyscache.h,v 1.74 2003/06/25 21:30:33 momjian Exp $
|
||||
* $Id: lsyscache.h,v 1.75 2003/06/27 00:33:26 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -15,6 +15,15 @@
|
||||
|
||||
#include "access/htup.h"
|
||||
|
||||
/* I/O function selector for get_type_io_data */
|
||||
typedef enum IOFuncSelector
|
||||
{
|
||||
IOFunc_input,
|
||||
IOFunc_output,
|
||||
IOFunc_receive,
|
||||
IOFunc_send
|
||||
} IOFuncSelector;
|
||||
|
||||
extern bool op_in_opclass(Oid opno, Oid opclass);
|
||||
extern bool op_requires_recheck(Oid opno, Oid opclass);
|
||||
extern Oid get_opclass_member(Oid opclass, int16 strategy);
|
||||
@ -56,6 +65,14 @@ extern bool get_typbyval(Oid typid);
|
||||
extern void get_typlenbyval(Oid typid, int16 *typlen, bool *typbyval);
|
||||
extern void get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval,
|
||||
char *typalign);
|
||||
extern void get_type_io_data(Oid typid,
|
||||
IOFuncSelector which_func,
|
||||
int16 *typlen,
|
||||
bool *typbyval,
|
||||
char *typalign,
|
||||
char *typdelim,
|
||||
Oid *typelem,
|
||||
Oid *func);
|
||||
extern char get_typstorage(Oid typid);
|
||||
extern int32 get_typtypmod(Oid typid);
|
||||
extern Node *get_typdefault(Oid typid);
|
||||
|
Reference in New Issue
Block a user