From 6d072d8fc7fdc1fe95ec562b292e200be173a767 Mon Sep 17 00:00:00 2001 From: David M Date: Sat, 27 May 2006 06:22:38 +0000 Subject: [PATCH] New data type for PostgreSQL users! varchar_ci allows for case insensitive recall of data. Works with all sorts of operations and sorts. This implementation was chosen over a user defined data type because we can easily avoid having to create our own operator class, an action that can only be done by a 'superuser'. Extending the varchar data type lets us use the internal indexing voodoo while still working on J. Random Admin's privileges. I hope it works, please post up any problems via the proper methods. git-svn-id: file:///svn/phpbb/trunk@5971 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/install/schemas/postgres_schema.sql | 78 ++++++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/phpBB/install/schemas/postgres_schema.sql b/phpBB/install/schemas/postgres_schema.sql index af0c194d47..adae3dcb51 100644 --- a/phpBB/install/schemas/postgres_schema.sql +++ b/phpBB/install/schemas/postgres_schema.sql @@ -6,6 +6,79 @@ BEGIN; +/* Domain definition */ +CREATE DOMAIN varchar_ci AS varchar(255) NOT NULL DEFAULT ''::character varying; +CREATE CAST (varchar_ci AS varchar) WITHOUT FUNCTION AS IMPLICIT; +CREATE CAST (varchar AS varchar_ci) WITHOUT FUNCTION AS IMPLICIT; +CREATE CAST (varchar_ci AS text) WITHOUT FUNCTION AS IMPLICIT; +CREATE CAST (text AS varchar_ci) WITHOUT FUNCTION AS IMPLICIT; + +/* Operation Functions */ +CREATE FUNCTION _varchar_ci_equal(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) = LOWER($2)' LANGUAGE SQL STRICT; +CREATE FUNCTION _varchar_ci_not_equal(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) != LOWER($2)' LANGUAGE SQL STRICT; +CREATE FUNCTION _varchar_ci_less_than(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) < LOWER($2)' LANGUAGE SQL STRICT; +CREATE FUNCTION _varchar_ci_less_equal(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) <= LOWER($2)' LANGUAGE SQL STRICT; +CREATE FUNCTION _varchar_ci_greater_than(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) > LOWER($2)' LANGUAGE SQL STRICT; +CREATE FUNCTION _varchar_ci_greater_equals(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) >= LOWER($2)' LANGUAGE SQL STRICT; + +/* Operators */ +CREATE OPERATOR <( + PROCEDURE = _varchar_ci_less_than, + LEFTARG = varchar_ci, + RIGHTARG = varchar_ci, + COMMUTATOR = >, + NEGATOR = >=, + RESTRICT = scalarltsel, + JOIN = scalarltjoinsel); + +CREATE OPERATOR <=( + PROCEDURE = _varchar_ci_less_equal, + LEFTARG = varchar_ci, + RIGHTARG = varchar_ci, + COMMUTATOR = >=, + NEGATOR = >, + RESTRICT = scalarltsel, + JOIN = scalarltjoinsel); + +CREATE OPERATOR >( + PROCEDURE = _varchar_ci_greater_than, + LEFTARG = varchar_ci, + RIGHTARG = varchar_ci, + COMMUTATOR = <, + NEGATOR = <=, + RESTRICT = scalargtsel, + JOIN = scalargtjoinsel); + +CREATE OPERATOR >=( + PROCEDURE = _varchar_ci_greater_equals, + LEFTARG = varchar_ci, + RIGHTARG = varchar_ci, + COMMUTATOR = <=, + NEGATOR = <, + RESTRICT = scalargtsel, + JOIN = scalargtjoinsel); + +CREATE OPERATOR <>( + PROCEDURE = _varchar_ci_not_equal, + LEFTARG = varchar_ci, + RIGHTARG = varchar_ci, + COMMUTATOR = <>, + NEGATOR = =, + RESTRICT = neqsel, + JOIN = neqjoinsel); + +CREATE OPERATOR =( + PROCEDURE = _varchar_ci_equal, + LEFTARG = varchar_ci, + RIGHTARG = varchar_ci, + COMMUTATOR = =, + NEGATOR = <>, + RESTRICT = eqsel, + JOIN = eqjoinsel, + HASHES, + MERGES, + SORT1= <); + /* Table: phpbb_attachments */ CREATE SEQUENCE phpbb_attachments_seq; @@ -387,7 +460,7 @@ CREATE SEQUENCE phpbb_groups_seq; CREATE TABLE phpbb_groups ( group_id INT4 DEFAULT nextval('phpbb_groups_seq'), group_type INT2 DEFAULT '1' NOT NULL, - group_name varchar(255) DEFAULT '' NOT NULL, + group_name varchar_ci, group_desc TEXT, group_desc_bitfield INT4 DEFAULT '0' NOT NULL, group_desc_uid varchar(5) DEFAULT '' NOT NULL, @@ -1222,7 +1295,7 @@ CREATE TABLE phpbb_users ( user_perm_from INT4 DEFAULT '0' NOT NULL, user_ip varchar(40) DEFAULT '' NOT NULL, user_regdate INT4 DEFAULT '0' NOT NULL, - username varchar(255) DEFAULT '' NOT NULL, + username varchar_ci, user_password varchar(40) DEFAULT '' NOT NULL, user_passchg INT4 DEFAULT '0' NULL, user_email varchar(100) DEFAULT '' NOT NULL, @@ -1295,6 +1368,7 @@ CREATE TABLE phpbb_users ( CREATE INDEX phpbb_users_user_birthday ON phpbb_users (user_birthday); CREATE INDEX phpbb_users_user_email_hash ON phpbb_users (user_email_hash); CREATE INDEX phpbb_users_username ON phpbb_users (username); +CREATE INDEX phpbb_users_lower_username ON phpbb_users (LOWER(username));