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

-- define the array operators *=, **=, *~ and **~ for type _text
--

-- Adjust this setting to control where the objects get created.
SET search_path = public;

SET autocommit TO 'on';

CREATE OR REPLACE FUNCTION array_texteq(_text, text)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_texteq(_text, text)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_textregexeq(_text, text)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_textregexeq(_text, text)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

DROP OPERATOR *=(_text,text);
CREATE OPERATOR *= (
	LEFTARG=_text, 
	RIGHTARG=text, 
	PROCEDURE=array_texteq
);

DROP OPERATOR **=(_text,text);
CREATE OPERATOR **= (
	LEFTARG=_text,
	RIGHTARG=text,
	PROCEDURE=array_all_texteq
);

DROP OPERATOR *~(_text,text);
CREATE OPERATOR *~ (
	LEFTARG=_text,
	RIGHTARG=text,
	PROCEDURE=array_textregexeq
);

DROP OPERATOR **~(_text,text);
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' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_varchareq(_varchar, varchar)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_varcharregexeq(_varchar, varchar)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_varcharregexeq(_varchar, varchar)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

DROP OPERATOR *=(_varchar,"varchar");
CREATE OPERATOR *= (
	LEFTARG=_varchar, 
	RIGHTARG="varchar", 
	PROCEDURE=array_varchareq
);

DROP OPERATOR **=(_varchar,"varchar");
CREATE OPERATOR **= (
	LEFTARG=_varchar,
	RIGHTARG="varchar",
	PROCEDURE=array_all_varchareq
);

DROP OPERATOR *~(_varchar,"varchar");
CREATE OPERATOR *~ (
	LEFTARG=_varchar,
	RIGHTARG="varchar",
	PROCEDURE=array_varcharregexeq
);

DROP OPERATOR **~(_varchar,"varchar");
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' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_bpchareq(_bpchar, bpchar)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_bpcharregexeq(_bpchar, bpchar)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_bpcharregexeq(_bpchar, bpchar)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

DROP OPERATOR *=(_bpchar,bpchar);
CREATE OPERATOR *= (
	LEFTARG=_bpchar, 
	RIGHTARG=bpchar, 
	PROCEDURE=array_bpchareq
);

DROP OPERATOR **=(_bpchar,bpchar);
CREATE OPERATOR **= (
	LEFTARG=_bpchar,
	RIGHTARG=bpchar,
	PROCEDURE=array_all_bpchareq
);

DROP OPERATOR *~(_bpchar,bpchar);
CREATE OPERATOR *~ (
	LEFTARG=_bpchar,
	RIGHTARG=bpchar,
	PROCEDURE=array_bpcharregexeq
);

DROP OPERATOR **~(_bpchar,bpchar);
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' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_int4eq(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_int4ne(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_int4ne(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_int4gt(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_int4gt(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_int4ge(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_int4ge(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_int4lt(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_int4lt(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_int4le(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_int4le(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

DROP OPERATOR *=(_int4,int4);
CREATE OPERATOR *= (
	LEFTARG=_int4,
	RIGHTARG=int4,
	PROCEDURE=array_int4eq
);

DROP OPERATOR **=(_int4,int4);
CREATE OPERATOR **= (
	LEFTARG=_int4,
	RIGHTARG=int4,
	PROCEDURE=array_all_int4eq
);

DROP OPERATOR *<>(_int4,int4);
CREATE OPERATOR *<> (
	LEFTARG=_int4,
	RIGHTARG=int4,
	PROCEDURE=array_int4ne
);

DROP OPERATOR **<>(_int4,int4);
CREATE OPERATOR **<> (
	LEFTARG=_int4,
	RIGHTARG=int4,
	PROCEDURE=array_all_int4ne
);

DROP OPERATOR *>(_int4,int4);
CREATE OPERATOR *> (
	LEFTARG=_int4,
	RIGHTARG=int4,
	PROCEDURE=array_int4gt
);

DROP OPERATOR **>(_int4,int4);
CREATE OPERATOR **> (
	LEFTARG=_int4,
	RIGHTARG=int4,
	PROCEDURE=array_all_int4gt
);

DROP OPERATOR *>=(_int4,int4);
CREATE OPERATOR *>= (
	LEFTARG=_int4,
	RIGHTARG=int4,
	PROCEDURE=array_int4ge
);

DROP OPERATOR **>=(_int4,int4);
CREATE OPERATOR **>= (
	LEFTARG=_int4,
	RIGHTARG=int4,
	PROCEDURE=array_all_int4ge
);

DROP OPERATOR *<(_int4,int4);
CREATE OPERATOR *< (
	LEFTARG=_int4,
	RIGHTARG=int4,
	PROCEDURE=array_int4lt
);

DROP OPERATOR **<(_int4,int4);
CREATE OPERATOR **< (
	LEFTARG=_int4,
	RIGHTARG=int4,
	PROCEDURE=array_all_int4lt
);

DROP OPERATOR *<=(_int4,int4);
CREATE OPERATOR *<= (
	LEFTARG=_int4,
	RIGHTARG=int4,
	PROCEDURE=array_int4le
);

DROP OPERATOR **<=(_int4,int4);
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' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_oidne(_oid, oid)
RETURNS bool
AS 'MODULE_PATHNAME' 
LANGUAGE 'C' IMMUTABLE STRICT;

DROP OPERATOR *=(_oid,oid);
CREATE OPERATOR *= (
	LEFTARG=_oid, 
	RIGHTARG=oid, 
	PROCEDURE=array_oideq
);

DROP OPERATOR **<>(_oid,oid);
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' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_ineteq(_inet, inet)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_inetne(_inet, inet)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION array_all_inetne(_inet, inet)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;

DROP OPERATOR *=(_inet,inet);
CREATE OPERATOR *= (
	LEFTARG=_inet,
	RIGHTARG=inet,
	PROCEDURE=array_ineteq
);

DROP OPERATOR **=(_inet,inet);
CREATE OPERATOR **= (
	LEFTARG=_inet,
	RIGHTARG=inet,
	PROCEDURE=array_all_ineteq
);

DROP OPERATOR *<>(_inet,inet);
CREATE OPERATOR *<> (
	LEFTARG=_inet,
	RIGHTARG=inet,
	PROCEDURE=array_inetne
);

DROP OPERATOR **<>(_inet,inet);
CREATE OPERATOR **<> (
	LEFTARG=_inet,
	RIGHTARG=inet,
	PROCEDURE=array_all_inetne
);