fixcharNN.sql.in
text/plain
-- User type charNN: space saving replacement for char(NN)
CREATE FUNCTION charNN_in(opaque)
RETURNS charNN
AS '$libdir/fixchar'
LANGUAGE 'c';
CREATE FUNCTION charNN_out(opaque)
RETURNS opaque
AS '$libdir/fixchar'
LANGUAGE 'c';
CREATE TYPE charNN (
INPUT = charNN_in,
OUTPUT = charNN_out,
INTERNALLENGTH = NN,
ALIGNMENT = char
);
-- Operators
CREATE FUNCTION charNN_lt(charNN, charNN)
RETURNS boolean
AS '$libdir/fixchar'
LANGUAGE 'c';
CREATE FUNCTION charNN_le(charNN, charNN)
RETURNS boolean
AS '$libdir/fixchar'
LANGUAGE 'c';
CREATE FUNCTION charNN_eq(charNN, charNN)
RETURNS boolean
AS '$libdir/fixchar'
LANGUAGE 'c';
CREATE FUNCTION charNN_ge(charNN, charNN)
RETURNS boolean
AS '$libdir/fixchar'
LANGUAGE 'c';
CREATE FUNCTION charNN_gt(charNN, charNN)
RETURNS boolean
AS '$libdir/fixchar'
LANGUAGE 'c';
CREATE FUNCTION charNN_ne(charNN, charNN)
RETURNS boolean
AS '$libdir/fixchar'
LANGUAGE 'c';
CREATE OPERATOR < ( LEFTARG = charNN, RIGHTARG = charNN,
PROCEDURE = charNN_lt,
COMMUTATOR = >,
NEGATOR = >=,
RESTRICT = scalarltsel, JOIN = scalarltjoinsel
);
CREATE OPERATOR <= ( LEFTARG = charNN, RIGHTARG = charNN,
PROCEDURE = charNN_le,
COMMUTATOR = >=,
NEGATOR = >,
RESTRICT = scalarltsel, JOIN = scalarltjoinsel
);
CREATE OPERATOR = ( LEFTARG = charNN, RIGHTARG = charNN,
PROCEDURE = charNN_eq,
COMMUTATOR = =,
NEGATOR = !=,
RESTRICT = eqsel, JOIN = eqjoinsel
);
CREATE OPERATOR >= ( LEFTARG = charNN, RIGHTARG = charNN,
PROCEDURE = charNN_ge,
COMMUTATOR = <=,
NEGATOR = <,
RESTRICT = scalargtsel, JOIN = scalargtjoinsel
);
CREATE OPERATOR > ( LEFTARG = charNN, RIGHTARG = charNN,
PROCEDURE = charNN_gt,
COMMUTATOR = <,
NEGATOR = <=,
RESTRICT = scalargtsel, JOIN = scalargtjoinsel
);
CREATE OPERATOR != ( LEFTARG = charNN, RIGHTARG = charNN,
PROCEDURE = charNN_ne,
COMMUTATOR = !=,
NEGATOR = =,
RESTRICT = neqsel, JOIN = neqjoinsel
);
-- btree opclass
INSERT INTO pg_opclass (opcamid, opcname, opcintype, opcdefault, opckeytype)
SELECT a.oid, 'charNN_ops', t.oid, true, 0
FROM pg_am a, pg_type t
WHERE a.amname = 'btree'
AND t.typname = 'charNN';
--btree strategies
CREATE TEMP TABLE charNN_strat (
strat smallint,
opr name
);
INSERT INTO charNN_strat VALUES (1, '<');
INSERT INTO charNN_strat VALUES (2, '<=');
INSERT INTO charNN_strat VALUES (3, '=');
INSERT INTO charNN_strat VALUES (4, '>=');
INSERT INTO charNN_strat VALUES (5, '>');
SELECT o.oid AS opoid, s.strat
INTO TEMP TABLE charNN_ops_tmp
FROM pg_operator o, pg_type t, charNN_strat s
WHERE t.typname = 'charNN'
AND o.oprleft = t.oid
AND o.oprright = t.oid
AND o.oprname = s.opr;
INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
SELECT oc.oid, c.strat, false, c.opoid
FROM pg_opclass oc, charNN_ops_tmp c, pg_am a
WHERE opcamid = a.oid
AND opcname = 'charNN_ops'
AND a.amname = 'btree';
-- support routine
CREATE FUNCTION charNN_cmp(charNN, charNN)
RETURNS integer
AS '$libdir/fixchar'
LANGUAGE 'c';
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
SELECT oc.oid, 1, p.oid
FROM pg_opclass oc, pg_proc p, pg_am a
WHERE a.amname = 'btree'
AND oc.opcamid = a.oid
AND oc.opcname = 'charNN_ops'
AND p.proname = 'charNN_cmp';