mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-05 12:47:08 +02:00
f933766ba7
pgsql-hackers. pg_opclass now has a row for each opclass supported by each index AM, not a row for each opclass name. This allows pg_opclass to show directly whether an AM supports an opclass, and furthermore makes it possible to store additional information about an opclass that might be AM-dependent. pg_opclass and pg_amop now store "lossy" and "haskeytype" information that we previously expected the user to remember to provide in CREATE INDEX commands. Lossiness is no longer an index-level property, but is associated with the use of a particular operator in a particular index opclass. Along the way, IndexSupportInitialize now uses the syscaches to retrieve pg_amop and pg_amproc entries. I find this reduces backend launch time by about ten percent, at the cost of a couple more special cases in catcache.c's IndexScanOK. Initial work by Oleg Bartunov and Teodor Sigaev, further hacking by Tom Lane. initdb forced.
361 lines
11 KiB
MySQL
361 lines
11 KiB
MySQL
-- Create the user-defined type for the 1-D integer arrays (_int4)
|
|
--
|
|
BEGIN TRANSACTION;
|
|
|
|
--
|
|
-- External C-functions for R-tree methods
|
|
--
|
|
|
|
-- Comparison methods
|
|
|
|
CREATE FUNCTION _int_contains(_int4, _int4) RETURNS bool
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
|
|
|
|
COMMENT ON FUNCTION _int_contains(_int4, _int4) IS 'contains';
|
|
|
|
CREATE FUNCTION _int_contained(_int4, _int4) RETURNS bool
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
|
|
|
|
COMMENT ON FUNCTION _int_contained(_int4, _int4) IS 'contained in';
|
|
|
|
CREATE FUNCTION _int_overlap(_int4, _int4) RETURNS bool
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
|
|
|
|
COMMENT ON FUNCTION _int_overlap(_int4, _int4) IS 'overlaps';
|
|
|
|
CREATE FUNCTION _int_same(_int4, _int4) RETURNS bool
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
|
|
|
|
COMMENT ON FUNCTION _int_same(_int4, _int4) IS 'same as';
|
|
|
|
CREATE FUNCTION _int_different(_int4, _int4) RETURNS bool
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
|
|
|
|
COMMENT ON FUNCTION _int_different(_int4, _int4) IS 'different';
|
|
|
|
-- support routines for indexing
|
|
|
|
CREATE FUNCTION _int_union(_int4, _int4) RETURNS _int4
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
|
|
|
|
CREATE FUNCTION _int_inter(_int4, _int4) RETURNS _int4
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
|
|
|
|
--
|
|
-- OPERATORS
|
|
--
|
|
|
|
CREATE OPERATOR && (
|
|
LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_overlap,
|
|
COMMUTATOR = '&&',
|
|
RESTRICT = contsel, JOIN = contjoinsel
|
|
);
|
|
|
|
--CREATE OPERATOR = (
|
|
-- LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_same,
|
|
-- COMMUTATOR = '=', NEGATOR = '<>',
|
|
-- RESTRICT = eqsel, JOIN = eqjoinsel,
|
|
-- SORT1 = '<', SORT2 = '<'
|
|
--);
|
|
|
|
CREATE OPERATOR <> (
|
|
LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_different,
|
|
COMMUTATOR = '<>', NEGATOR = '=',
|
|
RESTRICT = neqsel, JOIN = neqjoinsel
|
|
);
|
|
|
|
CREATE OPERATOR @ (
|
|
LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_contains,
|
|
COMMUTATOR = '~', RESTRICT = contsel, JOIN = contjoinsel
|
|
);
|
|
|
|
CREATE OPERATOR ~ (
|
|
LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_contained,
|
|
COMMUTATOR = '@', RESTRICT = contsel, JOIN = contjoinsel
|
|
);
|
|
|
|
|
|
-- define the GiST support methods
|
|
CREATE FUNCTION g_int_consistent(opaque,_int4,int4) RETURNS bool
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c';
|
|
|
|
CREATE FUNCTION g_int_compress(opaque) RETURNS opaque
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c';
|
|
|
|
CREATE FUNCTION g_int_decompress(opaque) RETURNS opaque
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c';
|
|
|
|
CREATE FUNCTION g_int_penalty(opaque,opaque,opaque) RETURNS opaque
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c';
|
|
|
|
CREATE FUNCTION g_int_picksplit(opaque, opaque) RETURNS opaque
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c';
|
|
|
|
CREATE FUNCTION g_int_union(bytea, opaque) RETURNS _int4
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c';
|
|
|
|
CREATE FUNCTION g_int_same(_int4, _int4, opaque) RETURNS opaque
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c';
|
|
|
|
|
|
-- register the default opclass for indexing
|
|
INSERT INTO pg_opclass (opcamid, opcname, opcintype, opcdefault, opckeytype)
|
|
VALUES (
|
|
(SELECT oid FROM pg_am WHERE amname = 'gist'),
|
|
'gist__int_ops',
|
|
(SELECT oid FROM pg_type WHERE typname = '_int4'),
|
|
true,
|
|
(SELECT oid FROM pg_type WHERE typname = '_int4'));
|
|
|
|
|
|
-- get the comparators for _intments and store them in a tmp table
|
|
SELECT o.oid AS opoid, o.oprname
|
|
INTO TEMP TABLE _int_ops_tmp
|
|
FROM pg_operator o, pg_type t
|
|
WHERE o.oprleft = t.oid and o.oprright = t.oid
|
|
and t.typname = '_int4';
|
|
|
|
-- make sure we have the right operators
|
|
-- SELECT * from _int_ops_tmp;
|
|
|
|
-- using the tmp table, generate the amop entries
|
|
-- note: these operators are all lossy
|
|
|
|
-- _int_overlap
|
|
INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
|
|
SELECT opcl.oid, 3, true, c.opoid
|
|
FROM pg_opclass opcl, _int_ops_tmp c
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__int_ops'
|
|
and c.oprname = '&&';
|
|
|
|
-- _int_same
|
|
INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
|
|
SELECT opcl.oid, 6, true, c.opoid
|
|
FROM pg_opclass opcl, _int_ops_tmp c
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__int_ops'
|
|
and c.oprname = '=';
|
|
|
|
-- _int_contains
|
|
INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
|
|
SELECT opcl.oid, 7, true, c.opoid
|
|
FROM pg_opclass opcl, _int_ops_tmp c
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__int_ops'
|
|
and c.oprname = '@';
|
|
|
|
-- _int_contained
|
|
INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
|
|
SELECT opcl.oid, 8, true, c.opoid
|
|
FROM pg_opclass opcl, _int_ops_tmp c
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__int_ops'
|
|
and c.oprname = '~';
|
|
|
|
DROP TABLE _int_ops_tmp;
|
|
|
|
|
|
-- add the entries to amproc for the support methods
|
|
-- note the amprocnum numbers associated with each are specific!
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 1, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__int_ops'
|
|
and proname = 'g_int_consistent';
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 2, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__int_ops'
|
|
and proname = 'g_int_union';
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 3, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__int_ops'
|
|
and proname = 'g_int_compress';
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 4, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__int_ops'
|
|
and proname = 'g_int_decompress';
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 5, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__int_ops'
|
|
and proname = 'g_int_penalty';
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 6, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__int_ops'
|
|
and proname = 'g_int_picksplit';
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 7, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__int_ops'
|
|
and proname = 'g_int_same';
|
|
|
|
|
|
---------------------------------------------
|
|
-- intbig
|
|
---------------------------------------------
|
|
-- define the GiST support methods
|
|
CREATE FUNCTION g_intbig_consistent(opaque,_int4,int4) RETURNS bool
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c';
|
|
|
|
CREATE FUNCTION g_intbig_compress(opaque) RETURNS opaque
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c';
|
|
|
|
CREATE FUNCTION g_intbig_decompress(opaque) RETURNS opaque
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c';
|
|
|
|
CREATE FUNCTION g_intbig_penalty(opaque,opaque,opaque) RETURNS opaque
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
|
|
|
|
CREATE FUNCTION g_intbig_picksplit(opaque, opaque) RETURNS opaque
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c';
|
|
|
|
CREATE FUNCTION g_intbig_union(bytea, opaque) RETURNS _int4
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c';
|
|
|
|
CREATE FUNCTION g_intbig_same(_int4, _int4, opaque) RETURNS opaque
|
|
AS 'MODULE_PATHNAME' LANGUAGE 'c';
|
|
|
|
-- register the opclass for indexing (not as default)
|
|
INSERT INTO pg_opclass (opcamid, opcname, opcintype, opcdefault, opckeytype)
|
|
VALUES (
|
|
(SELECT oid FROM pg_am WHERE amname = 'gist'),
|
|
'gist__intbig_ops',
|
|
(SELECT oid FROM pg_type WHERE typname = '_int4'),
|
|
false,
|
|
(SELECT oid FROM pg_type WHERE typname = '_int4'));
|
|
|
|
|
|
-- get the comparators for _intments and store them in a tmp table
|
|
SELECT o.oid AS opoid, o.oprname
|
|
INTO TEMP TABLE _int_ops_tmp
|
|
FROM pg_operator o, pg_type t
|
|
WHERE o.oprleft = t.oid and o.oprright = t.oid
|
|
and t.typname = '_int4';
|
|
|
|
-- make sure we have the right operators
|
|
-- SELECT * from _int_ops_tmp;
|
|
|
|
-- using the tmp table, generate the amop entries
|
|
-- note: these operators are all lossy
|
|
|
|
-- _int_overlap
|
|
INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
|
|
SELECT opcl.oid, 3, true, c.opoid
|
|
FROM pg_opclass opcl, _int_ops_tmp c
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__intbig_ops'
|
|
and c.oprname = '&&';
|
|
|
|
-- _int_contains
|
|
INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
|
|
SELECT opcl.oid, 7, true, c.opoid
|
|
FROM pg_opclass opcl, _int_ops_tmp c
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__intbig_ops'
|
|
and c.oprname = '@';
|
|
|
|
-- _int_contained
|
|
INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
|
|
SELECT opcl.oid, 8, true, c.opoid
|
|
FROM pg_opclass opcl, _int_ops_tmp c
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__intbig_ops'
|
|
and c.oprname = '~';
|
|
|
|
DROP TABLE _int_ops_tmp;
|
|
|
|
|
|
-- add the entries to amproc for the support methods
|
|
-- note the amprocnum numbers associated with each are specific!
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 1, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__intbig_ops'
|
|
and proname = 'g_intbig_consistent';
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 2, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__intbig_ops'
|
|
and proname = 'g_intbig_union';
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 3, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__intbig_ops'
|
|
and proname = 'g_intbig_compress';
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 4, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__intbig_ops'
|
|
and proname = 'g_intbig_decompress';
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 5, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__intbig_ops'
|
|
and proname = 'g_intbig_penalty';
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 6, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__intbig_ops'
|
|
and proname = 'g_intbig_picksplit';
|
|
|
|
INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
|
|
SELECT opcl.oid, 7, pro.oid
|
|
FROM pg_opclass opcl, pg_proc pro
|
|
WHERE
|
|
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
|
|
and opcname = 'gist__intbig_ops'
|
|
and proname = 'g_intbig_same';
|
|
|
|
END TRANSACTION;
|