summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-08-26 17:54:02 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-08-26 17:54:02 +0000
commit5cabcfccce4b8b826c9b30828f3012b7926a6946 (patch)
tree3e14c0710a45b4195734dd3189eb89eac4969073 /contrib
parent8009c275925dda90f1275ba70f5c2a63abaa520b (diff)
downloadpostgresql-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_iterator8
-rw-r--r--contrib/array/array_iterator.c144
-rw-r--r--contrib/array/array_iterator.h43
-rw-r--r--contrib/array/array_iterator.sql.in60
-rw-r--r--contrib/dblink/dblink.c5
-rw-r--r--contrib/intagg/int_aggregate.c8
-rw-r--r--contrib/ltree/_ltree_gist.c2
-rw-r--r--contrib/ltree/_ltree_op.c18
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;