-- SQL code to define the new array iterator functions and operators

-- define the array operators *=, **=, *~ and **~ for type _text
--
create or replace function array_texteq(_text, text) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_all_texteq(_text, text) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_textregexeq(_text, text) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_all_textregexeq(_text, text) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create operator *= (
  leftarg=_text, 
  rightarg=text, 
  procedure=array_texteq);

create operator **= (
  leftarg=_text,
  rightarg=text,
  procedure=array_all_texteq);

create operator *~ (
  leftarg=_text,
  rightarg=text,
  procedure=array_textregexeq);

create operator **~ (
  leftarg=_text,
  rightarg=text,
  procedure=array_all_textregexeq);


-- define the array operators *=, **=, *~ and **~ for type _varchar
--
-- NOTE: "varchar" is also a reserved word and must be quoted.
--
create or replace function array_varchareq(_varchar, varchar) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_all_varchareq(_varchar, varchar) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_varcharregexeq(_varchar, varchar) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_all_varcharregexeq(_varchar, varchar) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create operator *= (
  leftarg=_varchar, 
  rightarg="varchar", 
  procedure=array_varchareq);

create operator **= (
  leftarg=_varchar,
  rightarg="varchar",
  procedure=array_all_varchareq);

create operator *~ (
  leftarg=_varchar,
  rightarg="varchar",
  procedure=array_varcharregexeq);

create operator **~ (
  leftarg=_varchar,
  rightarg="varchar",
  procedure=array_all_varcharregexeq);


-- define the array operators *=, **=, *~ and **~ for type _bpchar
--
create or replace function array_bpchareq(_bpchar, bpchar) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_all_bpchareq(_bpchar, bpchar) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_bpcharregexeq(_bpchar, bpchar) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_all_bpcharregexeq(_bpchar, bpchar) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create operator *= (
  leftarg=_bpchar, 
  rightarg=bpchar, 
  procedure=array_bpchareq);

create operator **= (
  leftarg=_bpchar,
  rightarg=bpchar,
  procedure=array_all_bpchareq);

create operator *~ (
  leftarg=_bpchar,
  rightarg=bpchar,
  procedure=array_bpcharregexeq);

create operator **~ (
  leftarg=_bpchar,
  rightarg=bpchar,
  procedure=array_all_bpcharregexeq);


-- define the array operators *=, **=, *> and **> for type _int4
--
create or replace function array_int4eq(_int4, int4) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_all_int4eq(_int4, int4) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_int4ne(_int4, int4) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_all_int4ne(_int4, int4) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_int4gt(_int4, int4) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_all_int4gt(_int4, int4) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_int4ge(_int4, int4) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_all_int4ge(_int4, int4) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_int4lt(_int4, int4) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_all_int4lt(_int4, int4) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_int4le(_int4, int4) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_all_int4le(_int4, int4) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create operator *= (
  leftarg=_int4,
  rightarg=int4,
  procedure=array_int4eq);

create operator **= (
  leftarg=_int4,
  rightarg=int4,
  procedure=array_all_int4eq);

create operator *<> (
  leftarg=_int4,
  rightarg=int4,
  procedure=array_int4ne);

create operator **<> (
  leftarg=_int4,
  rightarg=int4,
  procedure=array_all_int4ne);

create operator *> (
  leftarg=_int4,
  rightarg=int4,
  procedure=array_int4gt);

create operator **> (
  leftarg=_int4,
  rightarg=int4,
  procedure=array_all_int4gt);

create operator *>= (
  leftarg=_int4,
  rightarg=int4,
  procedure=array_int4ge);

create operator **>= (
  leftarg=_int4,
  rightarg=int4,
  procedure=array_all_int4ge);

create operator *< (
  leftarg=_int4,
  rightarg=int4,
  procedure=array_int4lt);

create operator **< (
  leftarg=_int4,
  rightarg=int4,
  procedure=array_all_int4lt);

create operator *<= (
  leftarg=_int4,
  rightarg=int4,
  procedure=array_int4le);

create operator **<= (
  leftarg=_int4,
  rightarg=int4,
  procedure=array_all_int4le);

-- define the array operators *=, **<>  for type _oid  (added tobias 1. 1999)
--
create or replace function array_oideq(_oid, oid) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create or replace function array_all_oidne(_oid, oid) returns bool
  as 'MODULE_PATHNAME' 
  language C with (isStrict);

create operator *= (
  leftarg=_oid, 
  rightarg=oid, 
  procedure=array_oideq);

create operator **<> (
  leftarg=_oid,
  rightarg=oid,
  procedure=array_all_oidne);

-- define the array operators *=, **=, *<>, **<> for type _inet

create or replace function array_ineteq(_inet, inet) returns bool
  as 'MODULE_PATHNAME'
  language C with (isStrict);

create or replace function array_all_ineteq(_inet, inet) returns bool
  as 'MODULE_PATHNAME'
  language C with (isStrict);

create or replace function array_inetne(_inet, inet) returns bool
  as 'MODULE_PATHNAME'
  language C with (isStrict);

create or replace function array_all_inetne(_inet, inet) returns bool
  as 'MODULE_PATHNAME'
  language C with (isStrict);

create operator *= (
  leftarg=_inet,
  rightarg=inet,
  procedure=array_ineteq);

create operator **= (
  leftarg=_inet,
  rightarg=inet,
  procedure=array_all_ineteq);

create operator *<> (
  leftarg=_inet,
  rightarg=inet,
  procedure=array_inetne);

create operator **<> (
  leftarg=_inet,
  rightarg=inet,
  procedure=array_all_inetne);
