diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2002-08-26 17:54:02 +0000 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2002-08-26 17:54:02 +0000 |
| commit | 5cabcfccce4b8b826c9b30828f3012b7926a6946 (patch) | |
| tree | 3e14c0710a45b4195734dd3189eb89eac4969073 /contrib | |
| parent | 8009c275925dda90f1275ba70f5c2a63abaa520b (diff) | |
| download | postgresql-5cabcfccce4b8b826c9b30828f3012b7926a6946.tar.gz | |
Modify array operations to include array's element type OID in the
array header, and to compute sizing and alignment of array elements
the same way normal tuple access operations do --- viz, using the
tupmacs.h macros att_addlength and att_align. This makes the world
safe for arrays of cstrings or intervals, and should make it much
easier to write array-type-polymorphic functions; as examples see
the cleanups of array_out and contrib/array_iterator. By Joe Conway
and Tom Lane.
Diffstat (limited to 'contrib')
| -rw-r--r-- | contrib/array/README.array_iterator | 8 | ||||
| -rw-r--r-- | contrib/array/array_iterator.c | 144 | ||||
| -rw-r--r-- | contrib/array/array_iterator.h | 43 | ||||
| -rw-r--r-- | contrib/array/array_iterator.sql.in | 60 | ||||
| -rw-r--r-- | contrib/dblink/dblink.c | 5 | ||||
| -rw-r--r-- | contrib/intagg/int_aggregate.c | 8 | ||||
| -rw-r--r-- | contrib/ltree/_ltree_gist.c | 2 | ||||
| -rw-r--r-- | contrib/ltree/_ltree_op.c | 18 |
8 files changed, 126 insertions, 162 deletions
diff --git a/contrib/array/README.array_iterator b/contrib/array/README.array_iterator index b072ebe397..b9e037ed85 100644 --- a/contrib/array/README.array_iterator +++ b/contrib/array/README.array_iterator @@ -41,9 +41,9 @@ attribute equal to a given value or matching a regular expression: The scheme is quite general, each operator which operates on a base type can be iterated over the elements of an array. It seem to work well but -defining each new operators requires writing a different C function. -Furthermore in each function there are two hardcoded OIDs which reference -a base type and a procedure. Not very portable. Can anyone suggest a -better and more portable way to do it ? +defining each new operator requires writing a different C function. +This is tedious, and error-prone since one must take care that the correct +datatypes are associated with the selected underlying function. +Can anyone suggest a better and more portable way to do it ? See also array_iterator.sql for an example on how to use this module. diff --git a/contrib/array/array_iterator.c b/contrib/array/array_iterator.c index 5616350b3a..d2a9a3271e 100644 --- a/contrib/array/array_iterator.c +++ b/contrib/array/array_iterator.c @@ -27,6 +27,7 @@ #include "miscadmin.h" #include "utils/array.h" #include "utils/builtins.h" +#include "utils/fmgroids.h" #include "utils/memutils.h" #include "utils/lsyscache.h" @@ -34,10 +35,12 @@ static int32 -array_iterator(Oid elemtype, Oid proc, int and, ArrayType *array, Datum value) +array_iterator(Oid proc, int and, ArrayType *array, Datum value) { + Oid elemtype; int16 typlen; bool typbyval; + char typalign; int nitems, i; Datum result; @@ -63,7 +66,8 @@ array_iterator(Oid elemtype, Oid proc, int and, ArrayType *array, Datum value) return (0); /* Lookup element type information */ - get_typlenbyval(elemtype, &typlen, &typbyval); + elemtype = ARR_ELEMTYPE(array); + get_typlenbyvalalign(elemtype, &typlen, &typbyval, &typalign); /* Lookup the function entry point */ fmgr_info(proc, &finfo); @@ -82,10 +86,8 @@ array_iterator(Oid elemtype, Oid proc, int and, ArrayType *array, Datum value) itemvalue = fetch_att(p, typbyval, typlen); - if (typlen > 0) - p += typlen; - else - p += INTALIGN(*(int32 *) p); + p = att_addlength(p, typlen, PointerGetDatum(p)); + p = (char *) att_align(p, typalign); result = FunctionCall2(&finfo, itemvalue, value); @@ -112,37 +114,33 @@ array_iterator(Oid elemtype, Oid proc, int and, ArrayType *array, Datum value) */ int32 -array_texteq(ArrayType *array, char *value) +array_texteq(ArrayType *array, void *value) { - return array_iterator((Oid) 25, /* text */ - (Oid) 67, /* texteq */ + return array_iterator(F_TEXTEQ, 0, /* logical or */ array, (Datum) value); } int32 -array_all_texteq(ArrayType *array, char *value) +array_all_texteq(ArrayType *array, void *value) { - return array_iterator((Oid) 25, /* text */ - (Oid) 67, /* texteq */ + return array_iterator(F_TEXTEQ, 1, /* logical and */ array, (Datum) value); } int32 -array_textregexeq(ArrayType *array, char *value) +array_textregexeq(ArrayType *array, void *value) { - return array_iterator((Oid) 25, /* text */ - (Oid) 1254, /* textregexeq */ + return array_iterator(F_TEXTREGEXEQ, 0, /* logical or */ array, (Datum) value); } int32 -array_all_textregexeq(ArrayType *array, char *value) +array_all_textregexeq(ArrayType *array, void *value) { - return array_iterator((Oid) 25, /* text */ - (Oid) 1254, /* textregexeq */ + return array_iterator(F_TEXTREGEXEQ, 1, /* logical and */ array, (Datum) value); } @@ -153,37 +151,33 @@ array_all_textregexeq(ArrayType *array, char *value) */ int32 -array_varchareq(ArrayType *array, char *value) +array_varchareq(ArrayType *array, void *value) { - return array_iterator((Oid) 1043, /* varchar */ - (Oid) 1070, /* varchareq */ + return array_iterator(F_VARCHAREQ, 0, /* logical or */ array, (Datum) value); } int32 -array_all_varchareq(ArrayType *array, char *value) +array_all_varchareq(ArrayType *array, void *value) { - return array_iterator((Oid) 1043, /* varchar */ - (Oid) 1070, /* varchareq */ + return array_iterator(F_VARCHAREQ, 1, /* logical and */ array, (Datum) value); } int32 -array_varcharregexeq(ArrayType *array, char *value) +array_varcharregexeq(ArrayType *array, void *value) { - return array_iterator((Oid) 1043, /* varchar */ - (Oid) 1254, /* textregexeq */ + return array_iterator(F_TEXTREGEXEQ, 0, /* logical or */ array, (Datum) value); } int32 -array_all_varcharregexeq(ArrayType *array, char *value) +array_all_varcharregexeq(ArrayType *array, void *value) { - return array_iterator((Oid) 1043, /* varchar */ - (Oid) 1254, /* textregexeq */ + return array_iterator(F_TEXTREGEXEQ, 1, /* logical and */ array, (Datum) value); } @@ -194,37 +188,33 @@ array_all_varcharregexeq(ArrayType *array, char *value) */ int32 -array_bpchareq(ArrayType *array, char *value) +array_bpchareq(ArrayType *array, void *value) { - return array_iterator((Oid) 1042, /* bpchar */ - (Oid) 1048, /* bpchareq */ + return array_iterator(F_BPCHAREQ, 0, /* logical or */ array, (Datum) value); } int32 -array_all_bpchareq(ArrayType *array, char *value) +array_all_bpchareq(ArrayType *array, void *value) { - return array_iterator((Oid) 1042, /* bpchar */ - (Oid) 1048, /* bpchareq */ + return array_iterator(F_BPCHAREQ, 1, /* logical and */ array, (Datum) value); } int32 -array_bpcharregexeq(ArrayType *array, char *value) +array_bpcharregexeq(ArrayType *array, void *value) { - return array_iterator((Oid) 1042, /* bpchar */ - (Oid) 1254, /* textregexeq */ + return array_iterator(F_TEXTREGEXEQ, 0, /* logical or */ array, (Datum) value); } int32 -array_all_bpcharregexeq(ArrayType *array, char *value) +array_all_bpcharregexeq(ArrayType *array, void *value) { - return array_iterator((Oid) 1042, /* bpchar */ - (Oid) 1254, /* textregexeq */ + return array_iterator(F_TEXTREGEXEQ, 1, /* logical and */ array, (Datum) value); } @@ -236,8 +226,7 @@ array_all_bpcharregexeq(ArrayType *array, char *value) int32 array_int4eq(ArrayType *array, int4 value) { - return array_iterator((Oid) 23, /* int4 */ - (Oid) 65, /* int4eq */ + return array_iterator(F_INT4EQ, 0, /* logical or */ array, (Datum) value); } @@ -245,8 +234,7 @@ array_int4eq(ArrayType *array, int4 value) int32 array_all_int4eq(ArrayType *array, int4 value) { - return array_iterator((Oid) 23, /* int4 */ - (Oid) 65, /* int4eq */ + return array_iterator(F_INT4EQ, 1, /* logical and */ array, (Datum) value); } @@ -254,8 +242,7 @@ array_all_int4eq(ArrayType *array, int4 value) int32 array_int4ne(ArrayType *array, int4 value) { - return array_iterator((Oid) 23, /* int4 */ - (Oid) 144, /* int4ne */ + return array_iterator(F_INT4NE, 0, /* logical or */ array, (Datum) value); } @@ -263,8 +250,7 @@ array_int4ne(ArrayType *array, int4 value) int32 array_all_int4ne(ArrayType *array, int4 value) { - return array_iterator((Oid) 23, /* int4 */ - (Oid) 144, /* int4ne */ + return array_iterator(F_INT4NE, 1, /* logical and */ array, (Datum) value); } @@ -272,8 +258,7 @@ array_all_int4ne(ArrayType *array, int4 value) int32 array_int4gt(ArrayType *array, int4 value) { - return array_iterator((Oid) 23, /* int4 */ - (Oid) 147, /* int4gt */ + return array_iterator(F_INT4GT, 0, /* logical or */ array, (Datum) value); } @@ -281,8 +266,7 @@ array_int4gt(ArrayType *array, int4 value) int32 array_all_int4gt(ArrayType *array, int4 value) { - return array_iterator((Oid) 23, /* int4 */ - (Oid) 147, /* int4gt */ + return array_iterator(F_INT4GT, 1, /* logical and */ array, (Datum) value); } @@ -290,8 +274,7 @@ array_all_int4gt(ArrayType *array, int4 value) int32 array_int4ge(ArrayType *array, int4 value) { - return array_iterator((Oid) 23, /* int4 */ - (Oid) 150, /* int4ge */ + return array_iterator(F_INT4GE, 0, /* logical or */ array, (Datum) value); } @@ -299,8 +282,7 @@ array_int4ge(ArrayType *array, int4 value) int32 array_all_int4ge(ArrayType *array, int4 value) { - return array_iterator((Oid) 23, /* int4 */ - (Oid) 150, /* int4ge */ + return array_iterator(F_INT4GE, 1, /* logical and */ array, (Datum) value); } @@ -308,8 +290,7 @@ array_all_int4ge(ArrayType *array, int4 value) int32 array_int4lt(ArrayType *array, int4 value) { - return array_iterator((Oid) 23, /* int4 */ - (Oid) 66, /* int4lt */ + return array_iterator(F_INT4LT, 0, /* logical or */ array, (Datum) value); } @@ -317,8 +298,7 @@ array_int4lt(ArrayType *array, int4 value) int32 array_all_int4lt(ArrayType *array, int4 value) { - return array_iterator((Oid) 23, /* int4 */ - (Oid) 66, /* int4lt */ + return array_iterator(F_INT4LT, 1, /* logical and */ array, (Datum) value); } @@ -326,8 +306,7 @@ array_all_int4lt(ArrayType *array, int4 value) int32 array_int4le(ArrayType *array, int4 value) { - return array_iterator((Oid) 23, /* int4 */ - (Oid) 149, /* int4le */ + return array_iterator(F_INT4LE, 0, /* logical or */ array, (Datum) value); } @@ -335,8 +314,7 @@ array_int4le(ArrayType *array, int4 value) int32 array_all_int4le(ArrayType *array, int4 value) { - return array_iterator((Oid) 23, /* int4 */ - (Oid) 149, /* int4le */ + return array_iterator(F_INT4LE, 1, /* logical and */ array, (Datum) value); } @@ -346,8 +324,7 @@ array_all_int4le(ArrayType *array, int4 value) int32 array_oideq(ArrayType *array, Oid value) { - return array_iterator((Oid) 26, /* oid */ - (Oid) 184, /* oideq */ + return array_iterator(F_OIDEQ, 0, /* logical or */ array, (Datum) value); } @@ -355,52 +332,39 @@ array_oideq(ArrayType *array, Oid value) int32 array_all_oidne(ArrayType *array, Oid value) { - return array_iterator((Oid) 26, /* int4 */ - (Oid) 185, /* oidne */ + return array_iterator(F_OIDNE, 1, /* logical and */ array, (Datum) value); } int32 -array_ineteq(ArrayType *array, Oid value) +array_ineteq(ArrayType *array, void *value) { - return array_iterator((Oid) 869, /* inet */ - (Oid) 920, /* network_eq */ + return array_iterator(F_NETWORK_EQ, 0, /* logical or */ array, (Datum) value); } int32 -array_all_ineteq(ArrayType *array, Oid value) +array_all_ineteq(ArrayType *array, void *value) { - return array_iterator((Oid) 869, /* inet */ - (Oid) 920, /* network_eq */ + return array_iterator(F_NETWORK_EQ, 1, /* logical and */ array, (Datum) value); } int32 -array_inetne(ArrayType *array, Oid value) +array_inetne(ArrayType *array, void *value) { - return array_iterator((Oid) 869, /* inet */ - (Oid) 925, /* network_ne */ + return array_iterator(F_NETWORK_NE, 0, /* logical and */ array, (Datum) value); } int32 -array_all_inetne(ArrayType *array, Oid value) +array_all_inetne(ArrayType *array, void *value) { - return array_iterator((Oid) 869, /* inet */ - (Oid) 925, /* network_ne */ + return array_iterator(F_NETWORK_NE, 1, /* logical and */ array, (Datum) value); } - -/* - * Local Variables: - * tab-width: 4 - * c-indent-level: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/contrib/array/array_iterator.h b/contrib/array/array_iterator.h index f959f09c7c..c85d68f27a 100644 --- a/contrib/array/array_iterator.h +++ b/contrib/array/array_iterator.h @@ -1,23 +1,23 @@ #ifndef ARRAY_ITERATOR_H #define ARRAY_ITERATOR_H -static int32 array_iterator(Oid elemtype, Oid proc, int and, +static int32 array_iterator(Oid proc, int and, ArrayType *array, Datum value); -int32 array_texteq(ArrayType *array, char *value); -int32 array_all_texteq(ArrayType *array, char *value); -int32 array_textregexeq(ArrayType *array, char *value); -int32 array_all_textregexeq(ArrayType *array, char *value); +int32 array_texteq(ArrayType *array, void *value); +int32 array_all_texteq(ArrayType *array, void *value); +int32 array_textregexeq(ArrayType *array, void *value); +int32 array_all_textregexeq(ArrayType *array, void *value); -int32 array_varchareq(ArrayType *array, char *value); -int32 array_all_varchareq(ArrayType *array, char *value); -int32 array_varcharregexeq(ArrayType *array, char *value); -int32 array_all_varcharregexeq(ArrayType *array, char *value); +int32 array_varchareq(ArrayType *array, void *value); +int32 array_all_varchareq(ArrayType *array, void *value); +int32 array_varcharregexeq(ArrayType *array, void *value); +int32 array_all_varcharregexeq(ArrayType *array, void *value); -int32 array_bpchareq(ArrayType *array, char *value); -int32 array_all_bpchareq(ArrayType *array, char *value); -int32 array_bpcharregexeq(ArrayType *array, char *value); -int32 array_all_bpcharregexeq(ArrayType *array, char *value); +int32 array_bpchareq(ArrayType *array, void *value); +int32 array_all_bpchareq(ArrayType *array, void *value); +int32 array_bpcharregexeq(ArrayType *array, void *value); +int32 array_all_bpcharregexeq(ArrayType *array, void *value); int32 array_int4eq(ArrayType *array, int4 value); int32 array_all_int4eq(ArrayType *array, int4 value); @@ -35,16 +35,9 @@ int32 array_all_int4le(ArrayType *array, int4 value); int32 array_oideq(ArrayType *array, Oid value); int32 array_all_oidne(ArrayType *array, Oid value); -int32 array_ineteq(ArrayType *array, Oid value); -int32 array_all_ineteq(ArrayType *array, Oid value); -int32 array_inetne(ArrayType *array, Oid value); -int32 array_all_inetne(ArrayType *array, Oid value); -#endif +int32 array_ineteq(ArrayType *array, void *value); +int32 array_all_ineteq(ArrayType *array, void *value); +int32 array_inetne(ArrayType *array, void *value); +int32 array_all_inetne(ArrayType *array, void *value); -/* - * Local Variables: - * tab-width: 4 - * c-indent-level: 4 - * c-basic-offset: 4 - * End: - */ +#endif diff --git a/contrib/array/array_iterator.sql.in b/contrib/array/array_iterator.sql.in index 806d010e72..342d728f9a 100644 --- a/contrib/array/array_iterator.sql.in +++ b/contrib/array/array_iterator.sql.in @@ -4,19 +4,19 @@ -- create or replace function array_texteq(_text, text) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_texteq(_text, text) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_textregexeq(_text, text) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_textregexeq(_text, text) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create operator *= ( leftarg=_text, @@ -45,19 +45,19 @@ create operator **~ ( -- create or replace function array_varchareq(_varchar, varchar) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_varchareq(_varchar, varchar) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_varcharregexeq(_varchar, varchar) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_varcharregexeq(_varchar, varchar) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create operator *= ( leftarg=_varchar, @@ -84,19 +84,19 @@ create operator **~ ( -- create or replace function array_bpchareq(_bpchar, bpchar) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_bpchareq(_bpchar, bpchar) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_bpcharregexeq(_bpchar, bpchar) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_bpcharregexeq(_bpchar, bpchar) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create operator *= ( leftarg=_bpchar, @@ -123,51 +123,51 @@ create operator **~ ( -- create or replace function array_int4eq(_int4, int4) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_int4eq(_int4, int4) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_int4ne(_int4, int4) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_int4ne(_int4, int4) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_int4gt(_int4, int4) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_int4gt(_int4, int4) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_int4ge(_int4, int4) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_int4ge(_int4, int4) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_int4lt(_int4, int4) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_int4lt(_int4, int4) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_int4le(_int4, int4) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_int4le(_int4, int4) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create operator *= ( leftarg=_int4, @@ -233,11 +233,11 @@ create operator **<= ( -- create or replace function array_oideq(_oid, oid) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_oidne(_oid, oid) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create operator *= ( leftarg=_oid, @@ -253,19 +253,19 @@ create operator **<> ( create or replace function array_ineteq(_inet, inet) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_ineteq(_inet, inet) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_inetne(_inet, inet) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create or replace function array_all_inetne(_inet, inet) returns bool as 'MODULE_PATHNAME' - language 'c'; + language C with (isStrict); create operator *= ( leftarg=_inet, diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index d396f070dd..0401e06f4f 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -502,6 +502,7 @@ dblink_build_sql_insert(PG_FUNCTION_ARGS) /* * get array of pointers to c-strings from the input source array */ + Assert(ARR_ELEMTYPE(src_pkattvals_arry) == TEXTOID); src_pkattvals = (char **) palloc(src_nitems * sizeof(char *)); ptr = ARR_DATA_PTR(src_pkattvals_arry); for (i = 0; i < src_nitems; i++) @@ -527,6 +528,7 @@ dblink_build_sql_insert(PG_FUNCTION_ARGS) /* * get array of pointers to c-strings from the input target array */ + Assert(ARR_ELEMTYPE(tgt_pkattvals_arry) == TEXTOID); tgt_pkattvals = (char **) palloc(tgt_nitems * sizeof(char *)); ptr = ARR_DATA_PTR(tgt_pkattvals_arry); for (i = 0; i < tgt_nitems; i++) @@ -621,6 +623,7 @@ dblink_build_sql_delete(PG_FUNCTION_ARGS) /* * get array of pointers to c-strings from the input target array */ + Assert(ARR_ELEMTYPE(tgt_pkattvals_arry) == TEXTOID); tgt_pkattvals = (char **) palloc(tgt_nitems * sizeof(char *)); ptr = ARR_DATA_PTR(tgt_pkattvals_arry); for (i = 0; i < tgt_nitems; i++) @@ -725,6 +728,7 @@ dblink_build_sql_update(PG_FUNCTION_ARGS) /* * get array of pointers to c-strings from the input source array */ + Assert(ARR_ELEMTYPE(src_pkattvals_arry) == TEXTOID); src_pkattvals = (char **) palloc(src_nitems * sizeof(char *)); ptr = ARR_DATA_PTR(src_pkattvals_arry); for (i = 0; i < src_nitems; i++) @@ -750,6 +754,7 @@ dblink_build_sql_update(PG_FUNCTION_ARGS) /* * get array of pointers to c-strings from the input target array */ + Assert(ARR_ELEMTYPE(tgt_pkattvals_arry) == TEXTOID); tgt_pkattvals = (char **) palloc(tgt_nitems * sizeof(char *)); ptr = ARR_DATA_PTR(tgt_pkattvals_arry); for (i = 0; i < tgt_nitems; i++) diff --git a/contrib/intagg/int_aggregate.c b/contrib/intagg/int_aggregate.c index 6e8d17b747..3801a3d91a 100644 --- a/contrib/intagg/int_aggregate.c +++ b/contrib/intagg/int_aggregate.c @@ -38,9 +38,9 @@ #include "utils/lsyscache.h" -/* This is actually a postgres version of a one dimentional array */ +/* This is actually a postgres version of a one dimensional array */ -typedef struct agg +typedef struct { ArrayType a; int items; @@ -95,8 +95,9 @@ static PGARRAY * GetPGArray(int4 state, int fAdd) } p->a.size = cb; - p->a.ndim= 0; + p->a.ndim = 0; p->a.flags = 0; + p->a.elmtype = INT4OID; p->items = 0; p->lower= START_NUM; } @@ -149,6 +150,7 @@ static PGARRAY *ShrinkPGArray(PGARRAY *p) pnew->a.size = cb; pnew->a.ndim=1; pnew->a.flags = 0; + pnew->a.elmtype = INT4OID; pnew->lower = 0; } else diff --git a/contrib/ltree/_ltree_gist.c b/contrib/ltree/_ltree_gist.c index 8b7420e6d9..27bd057a56 100644 --- a/contrib/ltree/_ltree_gist.c +++ b/contrib/ltree/_ltree_gist.c @@ -59,7 +59,7 @@ _ltree_compress(PG_FUNCTION_ARGS) { if ( entry->leafkey ) { /* ltree */ ltree_gist *key; - ArrayType *val = (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM(entry->key)); + ArrayType *val = DatumGetArrayTypeP(entry->key); int4 len = LTG_HDRSIZE + ASIGLEN; int num=ArrayGetNItems( ARR_NDIM(val), ARR_DIMS(val) ); ltree *item = (ltree*)ARR_DATA_PTR(val); diff --git a/contrib/ltree/_ltree_op.c b/contrib/ltree/_ltree_op.c index cc7a16c27e..336b83820c 100644 --- a/contrib/ltree/_ltree_op.c +++ b/contrib/ltree/_ltree_op.c @@ -61,7 +61,7 @@ array_iterator( ArrayType *la, PGCALL2 callback, void* param, ltree ** found) { Datum _ltree_isparent(PG_FUNCTION_ARGS) { - ArrayType *la = (ArrayType *)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0))); + ArrayType *la = PG_GETARG_ARRAYTYPE_P(0); ltree *query = PG_GETARG_LTREE(1); bool res = array_iterator( la, ltree_isparent, (void*)query, NULL ); PG_FREE_IF_COPY(la,0); @@ -79,7 +79,7 @@ _ltree_r_isparent(PG_FUNCTION_ARGS) { Datum _ltree_risparent(PG_FUNCTION_ARGS) { - ArrayType *la = (ArrayType *)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0))); + ArrayType *la = PG_GETARG_ARRAYTYPE_P(0); ltree *query = PG_GETARG_LTREE(1); bool res = array_iterator( la, ltree_risparent, (void*)query, NULL ); PG_FREE_IF_COPY(la,0); @@ -97,7 +97,7 @@ _ltree_r_risparent(PG_FUNCTION_ARGS) { Datum _ltq_regex(PG_FUNCTION_ARGS) { - ArrayType *la = (ArrayType *)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0))); + ArrayType *la = PG_GETARG_ARRAYTYPE_P(0); lquery *query = PG_GETARG_LQUERY(1); bool res = array_iterator( la, ltq_regex, (void*)query, NULL ); PG_FREE_IF_COPY(la,0); @@ -115,7 +115,7 @@ _ltq_rregex(PG_FUNCTION_ARGS) { Datum _ltxtq_exec(PG_FUNCTION_ARGS) { - ArrayType *la = (ArrayType *)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0))); + ArrayType *la = PG_GETARG_ARRAYTYPE_P(0); ltxtquery *query = PG_GETARG_LTXTQUERY(1); bool res = array_iterator( la, ltxtq_exec, (void*)query, NULL ); PG_FREE_IF_COPY(la,0); @@ -134,7 +134,7 @@ _ltxtq_rexec(PG_FUNCTION_ARGS) { Datum _ltree_extract_isparent(PG_FUNCTION_ARGS) { - ArrayType *la = (ArrayType *)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0))); + ArrayType *la = PG_GETARG_ARRAYTYPE_P(0); ltree *query = PG_GETARG_LTREE(1); ltree *found,*item; @@ -154,7 +154,7 @@ _ltree_extract_isparent(PG_FUNCTION_ARGS) { Datum _ltree_extract_risparent(PG_FUNCTION_ARGS) { - ArrayType *la = (ArrayType *)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0))); + ArrayType *la = PG_GETARG_ARRAYTYPE_P(0); ltree *query = PG_GETARG_LTREE(1); ltree *found,*item; @@ -174,7 +174,7 @@ _ltree_extract_risparent(PG_FUNCTION_ARGS) { Datum _ltq_extract_regex(PG_FUNCTION_ARGS) { - ArrayType *la = (ArrayType *)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0))); + ArrayType *la = PG_GETARG_ARRAYTYPE_P(0); lquery *query = PG_GETARG_LQUERY(1); ltree *found,*item; @@ -194,7 +194,7 @@ _ltq_extract_regex(PG_FUNCTION_ARGS) { Datum _ltxtq_extract_exec(PG_FUNCTION_ARGS) { - ArrayType *la = (ArrayType *)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0))); + ArrayType *la = PG_GETARG_ARRAYTYPE_P(0); ltxtquery *query = PG_GETARG_LTXTQUERY(1); ltree *found,*item; @@ -214,7 +214,7 @@ _ltxtq_extract_exec(PG_FUNCTION_ARGS) { Datum _lca(PG_FUNCTION_ARGS) { - ArrayType *la = (ArrayType *)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0))); + ArrayType *la = PG_GETARG_ARRAYTYPE_P(0); int num=ArrayGetNItems( ARR_NDIM(la), ARR_DIMS(la)); ltree *item = (ltree*)ARR_DATA_PTR(la); ltree **a,*res; |
