Hi, Attached is a script to run through psql to update dak to use the new libapt-based debversion type and operators. This is based upon the patch I posted a few days back with the following changes: 1) Change the version columns type back to text 2) Drop the debversion domain and associated functions 3) Create the new debversion type, operators, operator class and hash and aggregate functions [this is identical bar cosmetic changes] 4) Change the version columns type to debversion I've done a few queries to test, and it looks like Postgres is clever enough to rebuild the indexes using the new type. It looks like sorting works correctly, and queries on package/version do use the index correctly when I check with EXPLAIN. If someone (dato/Ganneff?) would like to double check that this is OK and is working correctly for the queries which were previously broken, I can then write an update script to go in dak/dakdb based upon this script. Testing on a scratch db based on a projectb dump, it looks OK, but it would be great if this could be confirmed independently :-) Thanks, Roger -- .''`. Roger Leigh : :' : Debian GNU/Linux http://people.debian.org/~rleigh/ `. `' Printing on GNU/Linux? http://gutenprint.sourceforge.net/ `- GPG Public Key: 0x25BFB848 Please GPG sign your mail.
--- WannaBuild Database Schema for PostgreSQL -*- sql -*-
--- Debian version type and operators
---
--- Code derived from Dpkg::Version:
--- Copyright © Colin Watson <cjwatson@debian.org>
--- Copyright © Ian Jackson <iwj@debian.org>
--- Copyright © 2007 by Don Armstrong <don@donarmstrong.com>
---
--- PostgreSQL SQL, PL/pgSQL and PL/Perl:
--- Copyright © 2008 Roger Leigh <rleigh@debian.org>
---
--- This program is free software: you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation, either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful, but
--- WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
--- General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program. If not, see
--- <http://www.gnu.org/licenses/>.
ALTER TABLE source ALTER COLUMN version TYPE text;
ALTER TABLE binaries ALTER COLUMN version TYPE text;
DROP DOMAIN debversion CASCADE;
DROP FUNCTION debversion_compare_single(text,text);
SET search_path = public;
CREATE TYPE debversion;
CREATE OR REPLACE FUNCTION debversionin(cstring)
RETURNS debversion
AS 'textin'
LANGUAGE 'internal'
IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION debversionout(debversion)
RETURNS cstring
AS 'textout'
LANGUAGE 'internal'
IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION debversionrecv(internal)
RETURNS debversion
AS 'textrecv'
LANGUAGE 'internal'
STABLE STRICT;
CREATE OR REPLACE FUNCTION debversionsend(debversion)
RETURNS bytea
AS 'textsend'
LANGUAGE 'internal'
STABLE STRICT;
CREATE TYPE debversion (
INPUT = debversionin,
OUTPUT = debversionout,
RECEIVE = debversionrecv,
SEND = debversionsend,
INTERNALLENGTH = VARIABLE,
STORAGE = extended,
-- make it a non-preferred member of string type category
CATEGORY = 'S',
PREFERRED = false
);
COMMENT ON TYPE debversion IS 'Debian package version number';
CREATE OR REPLACE FUNCTION debversion(bpchar)
RETURNS debversion
AS 'rtrim1'
LANGUAGE 'internal'
IMMUTABLE STRICT;
CREATE CAST (debversion AS text) WITHOUT FUNCTION AS IMPLICIT;
CREATE CAST (debversion AS varchar) WITHOUT FUNCTION AS IMPLICIT;
CREATE CAST (debversion AS bpchar) WITHOUT FUNCTION AS ASSIGNMENT;
CREATE CAST (text AS debversion) WITHOUT FUNCTION AS ASSIGNMENT;
CREATE CAST (varchar AS debversion) WITHOUT FUNCTION AS ASSIGNMENT;
CREATE CAST (bpchar AS debversion) WITH FUNCTION debversion(bpchar);
CREATE OR REPLACE FUNCTION debversion_cmp (version1 debversion,
version2 debversion)
RETURNS integer AS '$libdir/debversion'
LANGUAGE 'C'
IMMUTABLE STRICT;
COMMENT ON FUNCTION debversion_cmp (debversion, debversion)
IS 'Compare Debian versions';
CREATE OR REPLACE FUNCTION debversion_eq (version1 debversion,
version2 debversion)
RETURNS boolean AS '$libdir/debversion'
LANGUAGE 'C'
IMMUTABLE STRICT;
COMMENT ON FUNCTION debversion_eq (debversion, debversion)
IS 'debversion equal';
CREATE OR REPLACE FUNCTION debversion_ne (version1 debversion,
version2 debversion)
RETURNS boolean AS '$libdir/debversion'
LANGUAGE 'C'
IMMUTABLE STRICT;
COMMENT ON FUNCTION debversion_ne (debversion, debversion)
IS 'debversion not equal';
CREATE OR REPLACE FUNCTION debversion_lt (version1 debversion,
version2 debversion)
RETURNS boolean AS '$libdir/debversion'
LANGUAGE 'C'
IMMUTABLE STRICT;
COMMENT ON FUNCTION debversion_lt (debversion, debversion)
IS 'debversion less-than';
CREATE OR REPLACE FUNCTION debversion_gt (version1 debversion,
version2 debversion)
RETURNS boolean AS '$libdir/debversion'
LANGUAGE 'C'
IMMUTABLE STRICT;
COMMENT ON FUNCTION debversion_gt (debversion, debversion)
IS 'debversion greater-than';
CREATE OR REPLACE FUNCTION debversion_le (version1 debversion,
version2 debversion)
RETURNS boolean AS '$libdir/debversion'
LANGUAGE 'C'
IMMUTABLE STRICT;
COMMENT ON FUNCTION debversion_le (debversion, debversion)
IS 'debversion less-than-or-equal';
CREATE OR REPLACE FUNCTION debversion_ge (version1 debversion,
version2 debversion)
RETURNS boolean AS '$libdir/debversion'
LANGUAGE 'C'
IMMUTABLE STRICT;
COMMENT ON FUNCTION debversion_ge (debversion, debversion)
IS 'debversion greater-than-or-equal';
CREATE OPERATOR = (
PROCEDURE = debversion_eq,
LEFTARG = debversion,
RIGHTARG = debversion,
COMMUTATOR = =,
NEGATOR = !=
);
COMMENT ON OPERATOR = (debversion, debversion)
IS 'debversion equal';
CREATE OPERATOR != (
PROCEDURE = debversion_ne,
LEFTARG = debversion,
RIGHTARG = debversion,
COMMUTATOR = !=,
NEGATOR = =
);
COMMENT ON OPERATOR != (debversion, debversion)
IS 'debversion not equal';
CREATE OPERATOR < (
PROCEDURE = debversion_lt,
LEFTARG = debversion,
RIGHTARG = debversion,
COMMUTATOR = >,
NEGATOR = >=
);
COMMENT ON OPERATOR < (debversion, debversion)
IS 'debversion less-than';
CREATE OPERATOR > (
PROCEDURE = debversion_gt,
LEFTARG = debversion,
RIGHTARG = debversion,
COMMUTATOR = <,
NEGATOR = >=
);
COMMENT ON OPERATOR > (debversion, debversion)
IS 'debversion greater-than';
CREATE OPERATOR <= (
PROCEDURE = debversion_le,
LEFTARG = debversion,
RIGHTARG = debversion,
COMMUTATOR = >=,
NEGATOR = >
);
COMMENT ON OPERATOR <= (debversion, debversion)
IS 'debversion less-than-or-equal';
CREATE OPERATOR >= (
PROCEDURE = debversion_ge,
LEFTARG = debversion,
RIGHTARG = debversion,
COMMUTATOR = <=,
NEGATOR = <
);
COMMENT ON OPERATOR >= (debversion, debversion)
IS 'debversion greater-than-or-equal';
CREATE OPERATOR CLASS debversion_ops
DEFAULT FOR TYPE debversion USING btree AS
OPERATOR 1 < (debversion, debversion),
OPERATOR 2 <= (debversion, debversion),
OPERATOR 3 = (debversion, debversion),
OPERATOR 4 >= (debversion, debversion),
OPERATOR 5 > (debversion, debversion),
FUNCTION 1 debversion_cmp(debversion, debversion);
CREATE OR REPLACE FUNCTION debversion_hash(debversion)
RETURNS int4
AS '$libdir/debversion'
LANGUAGE 'C'
IMMUTABLE STRICT;
CREATE OPERATOR CLASS debversion_ops
DEFAULT FOR TYPE debversion USING hash AS
OPERATOR 1 = (debversion, debversion),
FUNCTION 1 debversion_hash(debversion);
CREATE OR REPLACE FUNCTION debversion_smaller(version1 debversion,
version2 debversion)
RETURNS debversion
AS '$libdir/debversion'
LANGUAGE 'C'
IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION debversion_larger(version1 debversion,
version2 debversion)
RETURNS debversion
AS '$libdir/debversion'
LANGUAGE 'C'
IMMUTABLE STRICT;
CREATE AGGREGATE min(debversion) (
SFUNC = debversion_smaller,
STYPE = debversion,
SORTOP = <
);
CREATE AGGREGATE max(debversion) (
SFUNC = debversion_larger,
STYPE = debversion,
SORTOP = >
);
ALTER TABLE source ALTER COLUMN version TYPE debversion;
ALTER TABLE binaries ALTER COLUMN version TYPE debversion;
Attachment:
signature.asc
Description: Digital signature