Hi all. On Wed, Mar 21, 2018 at 1:47 PM, Tomas Vondra <tomas.von...@2ndquadrant.com> wrote:
> > Do you plan to post an updated version of the patch, of what is your > response to the points raised last week? > > Very sorry about the long delay. I've been in a long trip, no time to look that carefully. > I still haven't made my mind regarding usefulness of range opclasses, so > I suggest to split the patch into two parts - 0001 for the opclasses > we're confident are useful, and 0002 for those extras. The committer > then may apply either 0001 or 0001+0002, depending on his judgment. > > I liked the idea. So, follows the patches: - 0001-btree_gin-uuid--base.v2.patch - all types but anyrange, and with the adjustments on comments you proposed - 0002-btree_gin-uuid--anyrange.v2.patch - adding the anyrange type (must be applied after 0001) Anything else missing? Best regards, -- Matheus de Oliveira
diff --git a/contrib/btree_gin/Makefile b/contrib/btree_gin/Makefile index 690e1d7..a9e9925 100644 *** a/contrib/btree_gin/Makefile --- b/contrib/btree_gin/Makefile *************** *** 5,17 **** OBJS = btree_gin.o $(WIN32RES) EXTENSION = btree_gin DATA = btree_gin--1.0.sql btree_gin--1.0--1.1.sql btree_gin--1.1--1.2.sql \ ! btree_gin--unpackaged--1.0.sql PGFILEDESC = "btree_gin - B-tree equivalent GIN operator classes" REGRESS = install_btree_gin int2 int4 int8 float4 float8 money oid \ timestamp timestamptz time timetz date interval \ macaddr macaddr8 inet cidr text varchar char bytea bit varbit \ ! numeric enum ifdef USE_PGXS PG_CONFIG = pg_config --- 5,17 ---- EXTENSION = btree_gin DATA = btree_gin--1.0.sql btree_gin--1.0--1.1.sql btree_gin--1.1--1.2.sql \ ! btree_gin--1.2--1.3.sql btree_gin--unpackaged--1.0.sql PGFILEDESC = "btree_gin - B-tree equivalent GIN operator classes" REGRESS = install_btree_gin int2 int4 int8 float4 float8 money oid \ timestamp timestamptz time timetz date interval \ macaddr macaddr8 inet cidr text varchar char bytea bit varbit \ ! numeric enum uuid name bool bpchar ifdef USE_PGXS PG_CONFIG = pg_config diff --git a/contrib/btree_gin/btnew file mode 100644 index 0000000..db675b7 *** /dev/null --- b/contrib/btree_gin/btree_gin--1.2--1.3.sql *************** *** 0 **** --- 1,128 ---- + /* contrib/btree_gin/btree_gin--1.2--1.3.sql */ + + -- complain if script is sourced in psql, rather than via CREATE EXTENSION + \echo Use "ALTER EXTENSION btree_gin UPDATE TO '1.3'" to load this file. \quit + + -- uuid datatype support new in 1.3. + CREATE FUNCTION gin_extract_value_uuid(uuid, internal) + RETURNS internal + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE FUNCTION gin_compare_prefix_uuid(uuid, uuid, int2, internal) + RETURNS int4 + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE FUNCTION gin_extract_query_uuid(uuid, internal, int2, internal, internal) + RETURNS internal + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE OPERATOR CLASS uuid_ops + DEFAULT FOR TYPE uuid USING gin + AS + OPERATOR 1 <, + OPERATOR 2 <=, + OPERATOR 3 =, + OPERATOR 4 >=, + OPERATOR 5 >, + FUNCTION 1 uuid_cmp(uuid,uuid), + FUNCTION 2 gin_extract_value_uuid(uuid, internal), + FUNCTION 3 gin_extract_query_uuid(uuid, internal, int2, internal, internal), + FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal), + FUNCTION 5 gin_compare_prefix_uuid(uuid,uuid,int2, internal), + STORAGE uuid; + + -- name datatype support new in 1.3. + CREATE FUNCTION gin_extract_value_name(name, internal) + RETURNS internal + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE FUNCTION gin_compare_prefix_name(name, name, int2, internal) + RETURNS int4 + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE FUNCTION gin_extract_query_name(name, internal, int2, internal, internal) + RETURNS internal + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE OPERATOR CLASS name_ops + DEFAULT FOR TYPE name USING gin + AS + OPERATOR 1 <, + OPERATOR 2 <=, + OPERATOR 3 =, + OPERATOR 4 >=, + OPERATOR 5 >, + FUNCTION 1 btnamecmp(name,name), + FUNCTION 2 gin_extract_value_name(name, internal), + FUNCTION 3 gin_extract_query_name(name, internal, int2, internal, internal), + FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal), + FUNCTION 5 gin_compare_prefix_name(name,name,int2, internal), + STORAGE name; + + -- bool datatype support new in 1.3. + CREATE FUNCTION gin_extract_value_bool(bool, internal) + RETURNS internal + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE FUNCTION gin_compare_prefix_bool(bool, bool, int2, internal) + RETURNS int4 + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE FUNCTION gin_extract_query_bool(bool, internal, int2, internal, internal) + RETURNS internal + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE OPERATOR CLASS bool_ops + DEFAULT FOR TYPE bool USING gin + AS + OPERATOR 1 <, + OPERATOR 2 <=, + OPERATOR 3 =, + OPERATOR 4 >=, + OPERATOR 5 >, + FUNCTION 1 btboolcmp(bool,bool), + FUNCTION 2 gin_extract_value_bool(bool, internal), + FUNCTION 3 gin_extract_query_bool(bool, internal, int2, internal, internal), + FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal), + FUNCTION 5 gin_compare_prefix_bool(bool,bool,int2, internal), + STORAGE bool; + + -- bpchar datatype support new in 1.3. + CREATE FUNCTION gin_extract_value_bpchar(bpchar, internal) + RETURNS internal + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE FUNCTION gin_compare_prefix_bpchar(bpchar, bpchar, int2, internal) + RETURNS int4 + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE FUNCTION gin_extract_query_bpchar(bpchar, internal, int2, internal, internal) + RETURNS internal + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE OPERATOR CLASS bpchar_ops + DEFAULT FOR TYPE bpchar USING gin + AS + OPERATOR 1 <, + OPERATOR 2 <=, + OPERATOR 3 =, + OPERATOR 4 >=, + OPERATOR 5 >, + FUNCTION 1 bpcharcmp(bpchar, bpchar), + FUNCTION 2 gin_extract_value_bpchar(bpchar, internal), + FUNCTION 3 gin_extract_query_bpchar(bpchar, internal, int2, internal, internal), + FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal), + FUNCTION 5 gin_compare_prefix_bpchar(bpchar,bpchar,int2, internal), + STORAGE bpchar; diff --git a/contrib/btree_gin/btree_gin.c b/conindex 2473f79..a660681 100644 *** a/contrib/btree_gin/btree_gin.c --- b/contrib/btree_gin/btree_gin.c *************** *** 14,19 **** --- 14,20 ---- #include "utils/numeric.h" #include "utils/timestamp.h" #include "utils/varbit.h" + #include "utils/uuid.h" PG_MODULE_MAGIC; *************** *** 350,355 **** leftmostvalue_text(void) --- 351,358 ---- GIN_SUPPORT(text, true, leftmostvalue_text, bttextcmp) + GIN_SUPPORT(bpchar, true, leftmostvalue_text, bpcharcmp) + static Datum leftmostvalue_char(void) { *************** *** 437,443 **** GIN_SUPPORT(numeric, true, leftmostvalue_numeric, gin_numeric_cmp) * routines it needs it, so we can't use DirectFunctionCall2. */ - #define ENUM_IS_LEFTMOST(x) ((x) == InvalidOid) PG_FUNCTION_INFO_V1(gin_enum_cmp); --- 440,445 ---- diff --git a/contrib/btree_gin/btreeindex 3acc5af..d576da7 100644 *** a/contrib/btree_gin/btree_gin.control --- b/contrib/btree_gin/btree_gin.control *************** *** 1,5 **** # btree_gin extension comment = 'support for indexing common datatypes in GIN' ! default_version = '1.2' module_pathname = '$libdir/btree_gin' relocatable = true --- 1,5 ---- # btree_gin extension comment = 'support for indexing common datatypes in GIN' ! default_version = '1.3' module_pathname = '$libdir/btree_gin' relocatable = true diff --git a/contrib/btree_gin/expected/bonew file mode 100644 index 0000000..efb3e1e *** /dev/null --- b/contrib/btree_gin/expected/bool.out *************** *** 0 **** --- 1,119 ---- + set enable_seqscan=off; + CREATE TABLE test_bool ( + i boolean + ); + INSERT INTO test_bool VALUES (false),(true),(null); + CREATE INDEX idx_bool ON test_bool USING gin (i); + SELECT * FROM test_bool WHERE i<true ORDER BY i; + i + --- + f + (1 row) + + SELECT * FROM test_bool WHERE i<=true ORDER BY i; + i + --- + f + t + (2 rows) + + SELECT * FROM test_bool WHERE i=true ORDER BY i; + i + --- + t + (1 row) + + SELECT * FROM test_bool WHERE i>=true ORDER BY i; + i + --- + t + (1 row) + + SELECT * FROM test_bool WHERE i>true ORDER BY i; + i + --- + (0 rows) + + SELECT * FROM test_bool WHERE i<false ORDER BY i; + i + --- + (0 rows) + + SELECT * FROM test_bool WHERE i<=false ORDER BY i; + i + --- + f + (1 row) + + SELECT * FROM test_bool WHERE i=false ORDER BY i; + i + --- + f + (1 row) + + SELECT * FROM test_bool WHERE i>=false ORDER BY i; + i + --- + f + t + (2 rows) + + SELECT * FROM test_bool WHERE i>false ORDER BY i; + i + --- + t + (1 row) + + EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i<true ORDER BY i; + QUERY PLAN + ------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_bool + Recheck Cond: (i < true) + -> Bitmap Index Scan on idx_bool + Index Cond: (i < true) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i<=true ORDER BY i; + QUERY PLAN + ------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_bool + Recheck Cond: (i <= true) + -> Bitmap Index Scan on idx_bool + Index Cond: (i <= true) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i=true ORDER BY i; + QUERY PLAN + ----------------------------- + Sort + Sort Key: i + -> Seq Scan on test_bool + Filter: i + (4 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i>=true ORDER BY i; + QUERY PLAN + ------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_bool + Recheck Cond: (i >= true) + -> Bitmap Index Scan on idx_bool + Index Cond: (i >= true) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i>true ORDER BY i; + QUERY PLAN + ------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_bool + Recheck Cond: (i > true) + -> Bitmap Index Scan on idx_bool + Index Cond: (i > true) + (6 rows) + diff --git a/contrib/btree_gin/expected/bpnew file mode 100644 index 0000000..2eb8855 *** /dev/null --- b/contrib/btree_gin/expected/bpchar.out *************** *** 0 **** --- 1,109 ---- + set enable_seqscan=off; + CREATE TABLE test_bpchar ( + i char(10) + ); + INSERT INTO test_bpchar VALUES ('a'),('ab'),('abc'),('abc '),('abb'),('axy'),('xyz'),('xyz '); + CREATE INDEX idx_bpchar ON test_bpchar USING gin (i); + SELECT * FROM test_bpchar WHERE i<'abc' ORDER BY i; + i + ------------ + a + ab + abb + (3 rows) + + SELECT * FROM test_bpchar WHERE i<='abc' ORDER BY i; + i + ------------ + a + ab + abb + abc + abc + (5 rows) + + SELECT * FROM test_bpchar WHERE i='abc' ORDER BY i; + i + ------------ + abc + abc + (2 rows) + + SELECT * FROM test_bpchar WHERE i='abc ' ORDER BY i; + i + ------------ + abc + abc + (2 rows) + + SELECT * FROM test_bpchar WHERE i>='abc' ORDER BY i; + i + ------------ + abc + abc + axy + xyz + xyz + (5 rows) + + SELECT * FROM test_bpchar WHERE i>'abc' ORDER BY i; + i + ------------ + axy + xyz + xyz + (3 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_bpchar WHERE i<'abc' ORDER BY i; + QUERY PLAN + ----------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_bpchar + Recheck Cond: (i < 'abc'::bpchar) + -> Bitmap Index Scan on idx_bpchar + Index Cond: (i < 'abc'::bpchar) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_bpchar WHERE i<='abc' ORDER BY i; + QUERY PLAN + ------------------------------------------------ + Sort + Sort Key: i + -> Bitmap Heap Scan on test_bpchar + Recheck Cond: (i <= 'abc'::bpchar) + -> Bitmap Index Scan on idx_bpchar + Index Cond: (i <= 'abc'::bpchar) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_bpchar WHERE i='abc' ORDER BY i; + QUERY PLAN + ----------------------------------------- + Bitmap Heap Scan on test_bpchar + Recheck Cond: (i = 'abc'::bpchar) + -> Bitmap Index Scan on idx_bpchar + Index Cond: (i = 'abc'::bpchar) + (4 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_bpchar WHERE i>='abc' ORDER BY i; + QUERY PLAN + ------------------------------------------------ + Sort + Sort Key: i + -> Bitmap Heap Scan on test_bpchar + Recheck Cond: (i >= 'abc'::bpchar) + -> Bitmap Index Scan on idx_bpchar + Index Cond: (i >= 'abc'::bpchar) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_bpchar WHERE i>'abc' ORDER BY i; + QUERY PLAN + ----------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_bpchar + Recheck Cond: (i > 'abc'::bpchar) + -> Bitmap Index Scan on idx_bpchar + Index Cond: (i > 'abc'::bpchar) + (6 rows) + diff --git a/contrib/btree_gin/expected/namenew file mode 100644 index 0000000..174de65 *** /dev/null --- b/contrib/btree_gin/expected/name.out *************** *** 0 **** --- 1,97 ---- + set enable_seqscan=off; + CREATE TABLE test_name ( + i name + ); + INSERT INTO test_name VALUES ('a'),('ab'),('abc'),('abb'),('axy'),('xyz'); + CREATE INDEX idx_name ON test_name USING gin (i); + SELECT * FROM test_name WHERE i<'abc' ORDER BY i; + i + ----- + a + ab + abb + (3 rows) + + SELECT * FROM test_name WHERE i<='abc' ORDER BY i; + i + ----- + a + ab + abb + abc + (4 rows) + + SELECT * FROM test_name WHERE i='abc' ORDER BY i; + i + ----- + abc + (1 row) + + SELECT * FROM test_name WHERE i>='abc' ORDER BY i; + i + ----- + abc + axy + xyz + (3 rows) + + SELECT * FROM test_name WHERE i>'abc' ORDER BY i; + i + ----- + axy + xyz + (2 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_name WHERE i<'abc' ORDER BY i; + QUERY PLAN + --------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_name + Recheck Cond: (i < 'abc'::name) + -> Bitmap Index Scan on idx_name + Index Cond: (i < 'abc'::name) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_name WHERE i<='abc' ORDER BY i; + QUERY PLAN + ---------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_name + Recheck Cond: (i <= 'abc'::name) + -> Bitmap Index Scan on idx_name + Index Cond: (i <= 'abc'::name) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_name WHERE i='abc' ORDER BY i; + QUERY PLAN + --------------------------------------- + Bitmap Heap Scan on test_name + Recheck Cond: (i = 'abc'::name) + -> Bitmap Index Scan on idx_name + Index Cond: (i = 'abc'::name) + (4 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_name WHERE i>='abc' ORDER BY i; + QUERY PLAN + ---------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_name + Recheck Cond: (i >= 'abc'::name) + -> Bitmap Index Scan on idx_name + Index Cond: (i >= 'abc'::name) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_name WHERE i>'abc' ORDER BY i; + QUERY PLAN + --------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_name + Recheck Cond: (i > 'abc'::name) + -> Bitmap Index Scan on idx_name + Index Cond: (i > 'abc'::name) + (6 rows) + diff --git a/contrib/btree_gin/expected/uunew file mode 100644 index 0000000..60fd8d6 *** /dev/null --- b/contrib/btree_gin/expected/uuid.out *************** *** 0 **** --- 1,104 ---- + set enable_seqscan=off; + CREATE TABLE test_uuid ( + i uuid + ); + INSERT INTO test_uuid VALUES + ( '00000000-0000-0000-0000-000000000000' ), + ( '299bc99f-2f79-4e3e-bfea-2cbfd62a7c27' ), + ( '6264af33-0d43-4337-bf4e-43509b8a4be8' ), + ( 'ce41c936-6acb-4feb-8c91-852a673e5a5c' ), + ( 'd2ce731f-f2a8-4a2b-be37-8f0ba637427f' ), + ( 'ffffffff-ffff-ffff-ffff-ffffffffffff' ) + ; + CREATE INDEX idx_uuid ON test_uuid USING gin (i); + SELECT * FROM test_uuid WHERE i<'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + i + -------------------------------------- + 00000000-0000-0000-0000-000000000000 + 299bc99f-2f79-4e3e-bfea-2cbfd62a7c27 + 6264af33-0d43-4337-bf4e-43509b8a4be8 + (3 rows) + + SELECT * FROM test_uuid WHERE i<='ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + i + -------------------------------------- + 00000000-0000-0000-0000-000000000000 + 299bc99f-2f79-4e3e-bfea-2cbfd62a7c27 + 6264af33-0d43-4337-bf4e-43509b8a4be8 + ce41c936-6acb-4feb-8c91-852a673e5a5c + (4 rows) + + SELECT * FROM test_uuid WHERE i='ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + i + -------------------------------------- + ce41c936-6acb-4feb-8c91-852a673e5a5c + (1 row) + + SELECT * FROM test_uuid WHERE i>='ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + i + -------------------------------------- + ce41c936-6acb-4feb-8c91-852a673e5a5c + d2ce731f-f2a8-4a2b-be37-8f0ba637427f + ffffffff-ffff-ffff-ffff-ffffffffffff + (3 rows) + + SELECT * FROM test_uuid WHERE i>'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + i + -------------------------------------- + d2ce731f-f2a8-4a2b-be37-8f0ba637427f + ffffffff-ffff-ffff-ffff-ffffffffffff + (2 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_uuid WHERE i<'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + QUERY PLAN + ------------------------------------------------------------------------------ + Sort + Sort Key: i + -> Bitmap Heap Scan on test_uuid + Recheck Cond: (i < 'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid) + -> Bitmap Index Scan on idx_uuid + Index Cond: (i < 'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_uuid WHERE i<='ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + QUERY PLAN + ------------------------------------------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_uuid + Recheck Cond: (i <= 'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid) + -> Bitmap Index Scan on idx_uuid + Index Cond: (i <= 'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_uuid WHERE i='ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + QUERY PLAN + ------------------------------------------------------------------------ + Bitmap Heap Scan on test_uuid + Recheck Cond: (i = 'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid) + -> Bitmap Index Scan on idx_uuid + Index Cond: (i = 'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid) + (4 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_uuid WHERE i>='ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + QUERY PLAN + ------------------------------------------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_uuid + Recheck Cond: (i >= 'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid) + -> Bitmap Index Scan on idx_uuid + Index Cond: (i >= 'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_uuid WHERE i>'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + QUERY PLAN + ------------------------------------------------------------------------------ + Sort + Sort Key: i + -> Bitmap Heap Scan on test_uuid + Recheck Cond: (i > 'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid) + -> Bitmap Index Scan on idx_uuid + Index Cond: (i > 'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid) + (6 rows) + diff --git a/contrib/btree_gin/sql/bool.sqnew file mode 100644 index 0000000..dad2ff3 *** /dev/null --- b/contrib/btree_gin/sql/bool.sql *************** *** 0 **** --- 1,27 ---- + set enable_seqscan=off; + + CREATE TABLE test_bool ( + i boolean + ); + + INSERT INTO test_bool VALUES (false),(true),(null); + + CREATE INDEX idx_bool ON test_bool USING gin (i); + + SELECT * FROM test_bool WHERE i<true ORDER BY i; + SELECT * FROM test_bool WHERE i<=true ORDER BY i; + SELECT * FROM test_bool WHERE i=true ORDER BY i; + SELECT * FROM test_bool WHERE i>=true ORDER BY i; + SELECT * FROM test_bool WHERE i>true ORDER BY i; + + SELECT * FROM test_bool WHERE i<false ORDER BY i; + SELECT * FROM test_bool WHERE i<=false ORDER BY i; + SELECT * FROM test_bool WHERE i=false ORDER BY i; + SELECT * FROM test_bool WHERE i>=false ORDER BY i; + SELECT * FROM test_bool WHERE i>false ORDER BY i; + + EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i<true ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i<=true ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i=true ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i>=true ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_bool WHERE i>true ORDER BY i; diff --git a/contrib/btree_gin/sql/bpnew file mode 100644 index 0000000..4c951e3 *** /dev/null --- b/contrib/btree_gin/sql/bpchar.sql *************** *** 0 **** --- 1,22 ---- + set enable_seqscan=off; + + CREATE TABLE test_bpchar ( + i char(10) + ); + + INSERT INTO test_bpchar VALUES ('a'),('ab'),('abc'),('abc '),('abb'),('axy'),('xyz'),('xyz '); + + CREATE INDEX idx_bpchar ON test_bpchar USING gin (i); + + SELECT * FROM test_bpchar WHERE i<'abc' ORDER BY i; + SELECT * FROM test_bpchar WHERE i<='abc' ORDER BY i; + SELECT * FROM test_bpchar WHERE i='abc' ORDER BY i; + SELECT * FROM test_bpchar WHERE i='abc ' ORDER BY i; + SELECT * FROM test_bpchar WHERE i>='abc' ORDER BY i; + SELECT * FROM test_bpchar WHERE i>'abc' ORDER BY i; + + EXPLAIN (COSTS OFF) SELECT * FROM test_bpchar WHERE i<'abc' ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_bpchar WHERE i<='abc' ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_bpchar WHERE i='abc' ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_bpchar WHERE i>='abc' ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_bpchar WHERE i>'abc' ORDER BY i; diff --git a/contrib/btree_gin/sql/namenew file mode 100644 index 0000000..c11580c *** /dev/null --- b/contrib/btree_gin/sql/name.sql *************** *** 0 **** --- 1,21 ---- + set enable_seqscan=off; + + CREATE TABLE test_name ( + i name + ); + + INSERT INTO test_name VALUES ('a'),('ab'),('abc'),('abb'),('axy'),('xyz'); + + CREATE INDEX idx_name ON test_name USING gin (i); + + SELECT * FROM test_name WHERE i<'abc' ORDER BY i; + SELECT * FROM test_name WHERE i<='abc' ORDER BY i; + SELECT * FROM test_name WHERE i='abc' ORDER BY i; + SELECT * FROM test_name WHERE i>='abc' ORDER BY i; + SELECT * FROM test_name WHERE i>'abc' ORDER BY i; + + EXPLAIN (COSTS OFF) SELECT * FROM test_name WHERE i<'abc' ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_name WHERE i<='abc' ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_name WHERE i='abc' ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_name WHERE i>='abc' ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_name WHERE i>'abc' ORDER BY i; diff --git a/contrib/btree_gin/sql/uunew file mode 100644 index 0000000..3c141bd *** /dev/null --- b/contrib/btree_gin/sql/uuid.sql *************** *** 0 **** --- 1,28 ---- + set enable_seqscan=off; + + CREATE TABLE test_uuid ( + i uuid + ); + + INSERT INTO test_uuid VALUES + ( '00000000-0000-0000-0000-000000000000' ), + ( '299bc99f-2f79-4e3e-bfea-2cbfd62a7c27' ), + ( '6264af33-0d43-4337-bf4e-43509b8a4be8' ), + ( 'ce41c936-6acb-4feb-8c91-852a673e5a5c' ), + ( 'd2ce731f-f2a8-4a2b-be37-8f0ba637427f' ), + ( 'ffffffff-ffff-ffff-ffff-ffffffffffff' ) + ; + + CREATE INDEX idx_uuid ON test_uuid USING gin (i); + + SELECT * FROM test_uuid WHERE i<'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + SELECT * FROM test_uuid WHERE i<='ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + SELECT * FROM test_uuid WHERE i='ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + SELECT * FROM test_uuid WHERE i>='ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + SELECT * FROM test_uuid WHERE i>'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + + EXPLAIN (COSTS OFF) SELECT * FROM test_uuid WHERE i<'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_uuid WHERE i<='ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_uuid WHERE i='ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_uuid WHERE i>='ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_uuid WHERE i>'ce41c936-6acb-4feb-8c91-852a673e5a5c'::uuid ORDER BY i; diff --git a/doc/src/sgml/btree-gin.sindex e491fa7..314e001 100644 *** a/doc/src/sgml/btree-gin.sgml --- b/doc/src/sgml/btree-gin.sgml *************** *** 17,23 **** <type>oid</type>, <type>money</type>, <type>"char"</type>, <type>varchar</type>, <type>text</type>, <type>bytea</type>, <type>bit</type>, <type>varbit</type>, <type>macaddr</type>, <type>macaddr8</type>, <type>inet</type>, ! <type>cidr</type>, and all <type>enum</type> types. </para> <para> --- 17,24 ---- <type>oid</type>, <type>money</type>, <type>"char"</type>, <type>varchar</type>, <type>text</type>, <type>bytea</type>, <type>bit</type>, <type>varbit</type>, <type>macaddr</type>, <type>macaddr8</type>, <type>inet</type>, ! <type>cidr</type>, <type>uuid</type>, <type>name</type>, <type>bool</type>, ! <type>bpchar</type>, and all <type>enum</type> types. </para> <para>
diff --git a/contrib/btree_gin/Makefile b/contrib/btree_gin/Makefile index a9e9925..d36f5ad 100644 *** a/contrib/btree_gin/Makefile --- b/contrib/btree_gin/Makefile *************** *** 11,17 **** PGFILEDESC = "btree_gin - B-tree equivalent GIN operator classes" REGRESS = install_btree_gin int2 int4 int8 float4 float8 money oid \ timestamp timestamptz time timetz date interval \ macaddr macaddr8 inet cidr text varchar char bytea bit varbit \ ! numeric enum uuid name bool bpchar ifdef USE_PGXS PG_CONFIG = pg_config --- 11,17 ---- REGRESS = install_btree_gin int2 int4 int8 float4 float8 money oid \ timestamp timestamptz time timetz date interval \ macaddr macaddr8 inet cidr text varchar char bytea bit varbit \ ! numeric enum uuid name bool anyrange bpchar ifdef USE_PGXS PG_CONFIG = pg_config diff --git a/contrib/btree_gin/btindex db675b7..f7523a3 100644 *** a/contrib/btree_gin/btree_gin--1.2--1.3.sql --- b/contrib/btree_gin/btree_gin--1.2--1.3.sql *************** *** 96,101 **** AS --- 96,137 ---- FUNCTION 5 gin_compare_prefix_bool(bool,bool,int2, internal), STORAGE bool; + -- anyrange datatype support new in 1.3. + CREATE FUNCTION gin_anyrange_cmp(anyrange, anyrange) + RETURNS int4 + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE FUNCTION gin_extract_value_anyrange(anyrange, internal) + RETURNS internal + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE FUNCTION gin_compare_prefix_anyrange(anyrange, anyrange, int2, internal) + RETURNS int4 + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE FUNCTION gin_extract_query_anyrange(anyrange, internal, int2, internal, internal) + RETURNS internal + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT IMMUTABLE; + + CREATE OPERATOR CLASS anyrange_ops + DEFAULT FOR TYPE anyrange USING gin + AS + OPERATOR 1 <, + OPERATOR 2 <=, + OPERATOR 3 =, + OPERATOR 4 >=, + OPERATOR 5 >, + FUNCTION 1 gin_anyrange_cmp(anyrange,anyrange), + FUNCTION 2 gin_extract_value_anyrange(anyrange, internal), + FUNCTION 3 gin_extract_query_anyrange(anyrange, internal, int2, internal, internal), + FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal), + FUNCTION 5 gin_compare_prefix_anyrange(anyrange,anyrange,int2, internal), + STORAGE anyrange; + -- bpchar datatype support new in 1.3. CREATE FUNCTION gin_extract_value_bpchar(bpchar, internal) RETURNS internal diff --git a/contrib/btree_gin/btree_gin.c b/conindex a660681..37e0740 100644 *** a/contrib/btree_gin/btree_gin.c --- b/contrib/btree_gin/btree_gin.c *************** *** 15,20 **** --- 15,21 ---- #include "utils/timestamp.h" #include "utils/varbit.h" #include "utils/uuid.h" + #include "utils/rangetypes.h" PG_MODULE_MAGIC; *************** *** 506,508 **** leftmostvalue_bool(void) --- 507,560 ---- } GIN_SUPPORT(bool, false, leftmostvalue_bool, btboolcmp) + + /* + * Similarly to Numeric, we don't know the left-most value, although for + * different reasons (numeric does not have one, while for anyarray we + * don't even know the concrete type). We could try to build a fake empty + * range, but we simply use PointerGetDatum(NULL) just like for Numeric. + */ + #define ANYRANGE_IS_LEFTMOST(x) ((x) == NULL) + + PG_FUNCTION_INFO_V1(gin_anyrange_cmp); + + /* + * Note that we use CallerFInfoFunctionCall2 here so that range_cmp + * gets a valid fn_extra to work with. Unlike most other type comparison + * routines it needs it, so we can't use DirectFunctionCall2. + */ + Datum + gin_anyrange_cmp(PG_FUNCTION_ARGS) + { + RangeType *a = (RangeType *) PG_GETARG_POINTER(0); + RangeType *b = (RangeType *) PG_GETARG_POINTER(1); + int res = 0; + + if (ANYRANGE_IS_LEFTMOST(a)) + { + res = (ANYRANGE_IS_LEFTMOST(b)) ? 0 : -1; + } + else if (ANYRANGE_IS_LEFTMOST(b)) + { + res = 1; + } + else + { + res = DatumGetInt32(CallerFInfoFunctionCall2( + range_cmp, + fcinfo->flinfo, + PG_GET_COLLATION(), + RangeTypePGetDatum(a), + RangeTypePGetDatum(b))); + } + + PG_RETURN_INT32(res); + } + + static Datum + leftmostvalue_anyrange(void) + { + return PointerGetDatum(NULL); + } + + GIN_SUPPORT(anyrange, false, leftmostvalue_anyrange, gin_anyrange_cmp) diff --git a/contrib/btree_gin/expecnew file mode 100644 index 0000000..93b24f4 *** /dev/null --- b/contrib/btree_gin/expected/anyrange.out *************** *** 0 **** --- 1,113 ---- + set enable_seqscan=off; + CREATE TABLE test_tsrange ( + i tsrange + ); + INSERT INTO test_tsrange VALUES + ( 'empty' ), + ( '(,)' ), + ( '[2018-02-02 03:55:08,2018-04-02 03:55:08)' ), + ( '[2018-02-02 04:55:08,2018-04-02 04:55:08)' ), + ( '[2018-02-02 05:55:08,2018-04-02 05:55:08)' ), + ( '[2018-02-02 08:55:08,2018-04-02 08:55:08)' ), + ( '[2018-02-02 09:55:08,2018-04-02 09:55:08)' ), + ( '[2018-02-02 10:55:08,2018-04-02 10:55:08)' ), + ( '[infinity,infinity]' ) + ; + CREATE INDEX idx_tsrange ON test_tsrange USING gin (i); + SELECT * FROM test_tsrange WHERE i<'[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + i + --------------------------------------------------------- + empty + (,) + ["Fri Feb 02 03:55:08 2018","Mon Apr 02 03:55:08 2018") + ["Fri Feb 02 04:55:08 2018","Mon Apr 02 04:55:08 2018") + ["Fri Feb 02 05:55:08 2018","Mon Apr 02 05:55:08 2018") + (5 rows) + + SELECT * FROM test_tsrange WHERE i<='[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + i + --------------------------------------------------------- + empty + (,) + ["Fri Feb 02 03:55:08 2018","Mon Apr 02 03:55:08 2018") + ["Fri Feb 02 04:55:08 2018","Mon Apr 02 04:55:08 2018") + ["Fri Feb 02 05:55:08 2018","Mon Apr 02 05:55:08 2018") + ["Fri Feb 02 08:55:08 2018","Mon Apr 02 08:55:08 2018") + (6 rows) + + SELECT * FROM test_tsrange WHERE i='[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + i + --------------------------------------------------------- + ["Fri Feb 02 08:55:08 2018","Mon Apr 02 08:55:08 2018") + (1 row) + + SELECT * FROM test_tsrange WHERE i>='[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + i + --------------------------------------------------------- + ["Fri Feb 02 08:55:08 2018","Mon Apr 02 08:55:08 2018") + ["Fri Feb 02 09:55:08 2018","Mon Apr 02 09:55:08 2018") + ["Fri Feb 02 10:55:08 2018","Mon Apr 02 10:55:08 2018") + [infinity,infinity] + (4 rows) + + SELECT * FROM test_tsrange WHERE i>'[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + i + --------------------------------------------------------- + ["Fri Feb 02 09:55:08 2018","Mon Apr 02 09:55:08 2018") + ["Fri Feb 02 10:55:08 2018","Mon Apr 02 10:55:08 2018") + [infinity,infinity] + (3 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_tsrange WHERE i<'[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + QUERY PLAN + ---------------------------------------------------------------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_tsrange + Recheck Cond: (i < '["Fri Feb 02 08:55:08 2018","Mon Apr 02 08:55:08 2018")'::tsrange) + -> Bitmap Index Scan on idx_tsrange + Index Cond: (i < '["Fri Feb 02 08:55:08 2018","Mon Apr 02 08:55:08 2018")'::tsrange) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_tsrange WHERE i<='[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + QUERY PLAN + ----------------------------------------------------------------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_tsrange + Recheck Cond: (i <= '["Fri Feb 02 08:55:08 2018","Mon Apr 02 08:55:08 2018")'::tsrange) + -> Bitmap Index Scan on idx_tsrange + Index Cond: (i <= '["Fri Feb 02 08:55:08 2018","Mon Apr 02 08:55:08 2018")'::tsrange) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_tsrange WHERE i='[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + QUERY PLAN + ---------------------------------------------------------------------------------------------- + Bitmap Heap Scan on test_tsrange + Recheck Cond: (i = '["Fri Feb 02 08:55:08 2018","Mon Apr 02 08:55:08 2018")'::tsrange) + -> Bitmap Index Scan on idx_tsrange + Index Cond: (i = '["Fri Feb 02 08:55:08 2018","Mon Apr 02 08:55:08 2018")'::tsrange) + (4 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_tsrange WHERE i>='[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + QUERY PLAN + ----------------------------------------------------------------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_tsrange + Recheck Cond: (i >= '["Fri Feb 02 08:55:08 2018","Mon Apr 02 08:55:08 2018")'::tsrange) + -> Bitmap Index Scan on idx_tsrange + Index Cond: (i >= '["Fri Feb 02 08:55:08 2018","Mon Apr 02 08:55:08 2018")'::tsrange) + (6 rows) + + EXPLAIN (COSTS OFF) SELECT * FROM test_tsrange WHERE i>'[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + QUERY PLAN + ---------------------------------------------------------------------------------------------------- + Sort + Sort Key: i + -> Bitmap Heap Scan on test_tsrange + Recheck Cond: (i > '["Fri Feb 02 08:55:08 2018","Mon Apr 02 08:55:08 2018")'::tsrange) + -> Bitmap Index Scan on idx_tsrange + Index Cond: (i > '["Fri Feb 02 08:55:08 2018","Mon Apr 02 08:55:08 2018")'::tsrange) + (6 rows) + diff --git a/contrib/btree_gin/sql/anyrange.sqnew file mode 100644 index 0000000..97157ad *** /dev/null --- b/contrib/btree_gin/sql/anyrange.sql *************** *** 0 **** --- 1,31 ---- + set enable_seqscan=off; + + CREATE TABLE test_tsrange ( + i tsrange + ); + + INSERT INTO test_tsrange VALUES + ( 'empty' ), + ( '(,)' ), + ( '[2018-02-02 03:55:08,2018-04-02 03:55:08)' ), + ( '[2018-02-02 04:55:08,2018-04-02 04:55:08)' ), + ( '[2018-02-02 05:55:08,2018-04-02 05:55:08)' ), + ( '[2018-02-02 08:55:08,2018-04-02 08:55:08)' ), + ( '[2018-02-02 09:55:08,2018-04-02 09:55:08)' ), + ( '[2018-02-02 10:55:08,2018-04-02 10:55:08)' ), + ( '[infinity,infinity]' ) + ; + + CREATE INDEX idx_tsrange ON test_tsrange USING gin (i); + + SELECT * FROM test_tsrange WHERE i<'[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + SELECT * FROM test_tsrange WHERE i<='[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + SELECT * FROM test_tsrange WHERE i='[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + SELECT * FROM test_tsrange WHERE i>='[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + SELECT * FROM test_tsrange WHERE i>'[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + + EXPLAIN (COSTS OFF) SELECT * FROM test_tsrange WHERE i<'[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_tsrange WHERE i<='[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_tsrange WHERE i='[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_tsrange WHERE i>='[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; + EXPLAIN (COSTS OFF) SELECT * FROM test_tsrange WHERE i>'[2018-02-02 08:55:08,2018-04-02 08:55:08)'::tsrange ORDER BY i; diff --git a/doc/src/sgml/btree-gin.sgml index 314e001..e1315da 100644 *** a/doc/src/sgml/btree-gin.sgml --- b/doc/src/sgml/btree-gin.sgml *************** *** 18,24 **** <type>varchar</type>, <type>text</type>, <type>bytea</type>, <type>bit</type>, <type>varbit</type>, <type>macaddr</type>, <type>macaddr8</type>, <type>inet</type>, <type>cidr</type>, <type>uuid</type>, <type>name</type>, <type>bool</type>, ! <type>bpchar</type>, and all <type>enum</type> types. </para> <para> --- 18,24 ---- <type>varchar</type>, <type>text</type>, <type>bytea</type>, <type>bit</type>, <type>varbit</type>, <type>macaddr</type>, <type>macaddr8</type>, <type>inet</type>, <type>cidr</type>, <type>uuid</type>, <type>name</type>, <type>bool</type>, ! <type>bpchar</type>, and all <type>enum</type> and <type>anyrange</type> types. </para> <para>