summaryrefslogtreecommitdiff
path: root/contrib/array
diff options
context:
space:
mode:
authorTom Lane2002-08-26 17:54:02 +0000
committerTom Lane2002-08-26 17:54:02 +0000
commit5cabcfccce4b8b826c9b30828f3012b7926a6946 (patch)
tree3e14c0710a45b4195734dd3189eb89eac4969073 /contrib/array
parent8009c275925dda90f1275ba70f5c2a63abaa520b (diff)
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/array')
-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
4 files changed, 106 insertions, 149 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,