On 12/22/2014 03:15 AM, Michael Paquier wrote:
On Thu, Dec 18, 2014 at 4:13 AM, Heikki Linnakangas
<hlinnakan...@vmware.com> wrote:
On 10/22/2014 01:55 PM, Teodor Sigaev wrote:
Suggested patch adds GIN support contains operator for ranges over scalar
column.
It allows more effective GIN scan. Currently, queries like
SELECT * FROM test_int4 WHERE i <= 1 and i >= 1
will be excuted by GIN with two scans: one is from mines infinity to 1 and
another is from -1 to plus infinity. That's because GIN is "generalized"
and it
doesn't know a semantics of operation.
With patch it's possible to rewrite query with ranges
SELECT * FROM test_int4 WHERE i <@ '[-1, 1]'::int4range
and GIN index will support this query with single scan from -1 to 1.
Patch provides index support only for existing range types: int4, int8,
numeric,
date and timestamp with and without time zone.
I started to look at this, but very quickly got carried away into
refactoring away the macros. Defining long functions as macros makes
debugging quite difficult, and it's not nice to read or edit the source code
either.
I propose the attached refactoring (it doesn't include your range-patch yet,
just refactoring the existing code). It turns the bulk of the macros into
static functions. GIN_SUPPORT macro still defines the datatype-specific
functions, but they are now very thin wrappers that just call the
corresponding generic static functions.
It's annoying that we need the concept of a leftmost value, for the < and <=
queries. Without that, we could have the support functions look up the
required datatype information from the type cache, based on the datatype of
the passed argument. Then you could easily use the btree_gin support
functions also for user-defined datatypes. But that needs bigger changes,
and this is a step in the right direction anyway.
I just had a look at the refactoring patch and ISTM that this is a
good step forward in terms of readability. Teodor, I am noticing that
your patch cannot apply once the refactoring is done. Could you rebase
your patch once the refactoring is pushed?s
I've pushed the refactoring patch. Here's a version of Teodor's patch,
rebased over the pushed patch.
Teodor's patch could use some more comments. The
STOP_SCAN/MATCH_SCAN/CONT_SCAN macros are a good idea, but they probably
should go into src/include/access/gin.h so that they can be used in all
compare_partial implementations.
- Heikki
commit 51217bac66009f876d44ee547c25523a1b0eaeb3
Author: Heikki Linnakangas <heikki.linnakan...@iki.fi>
Date: Mon Dec 22 17:38:40 2014 +0200
Rebase Teodor's btree_gin_range-1.patch over my refactorings.
diff --git a/contrib/btree_gin/Makefile b/contrib/btree_gin/Makefile
index 0492091..b85c390 100644
--- a/contrib/btree_gin/Makefile
+++ b/contrib/btree_gin/Makefile
@@ -4,7 +4,7 @@ MODULE_big = btree_gin
OBJS = btree_gin.o $(WIN32RES)
EXTENSION = btree_gin
-DATA = btree_gin--1.0.sql btree_gin--unpackaged--1.0.sql
+DATA = btree_gin--1.1.sql btree_gin--1.0--1.1.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 \
diff --git a/contrib/btree_gin/btree_gin--1.0--1.1.sql b/contrib/btree_gin/btree_gin--1.0--1.1.sql
new file mode 100644
index 0000000..a7f0e54
--- /dev/null
+++ b/contrib/btree_gin/btree_gin--1.0--1.1.sql
@@ -0,0 +1,7 @@
+ALTER OPERATOR FAMILY int4_ops USING gin ADD OPERATOR 8 <@(anyelement, anyrange);
+ALTER OPERATOR FAMILY int8_ops USING gin ADD OPERATOR 8 <@(anyelement, anyrange);
+ALTER OPERATOR FAMILY timestamp_ops USING gin ADD OPERATOR 8 <@(anyelement, anyrange);
+ALTER OPERATOR FAMILY timestamptz_ops USING gin ADD OPERATOR 8 <@(anyelement, anyrange);
+ALTER OPERATOR FAMILY date_ops USING gin ADD OPERATOR 8 <@(anyelement, anyrange);
+ALTER OPERATOR FAMILY numeric_ops USING gin ADD OPERATOR 8 <@(anyelement, anyrange);
+
diff --git a/contrib/btree_gin/btree_gin--1.0.sql b/contrib/btree_gin/btree_gin--1.0.sql
deleted file mode 100644
index cf867ef..0000000
--- a/contrib/btree_gin/btree_gin--1.0.sql
+++ /dev/null
@@ -1,689 +0,0 @@
-/* contrib/btree_gin/btree_gin--1.0.sql */
-
--- complain if script is sourced in psql, rather than via CREATE EXTENSION
-\echo Use "CREATE EXTENSION btree_gin" to load this file. \quit
-
-CREATE FUNCTION gin_btree_consistent(internal, int2, anyelement, int4, internal, internal)
-RETURNS bool
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_value_int2(int2, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_int2(int2, int2, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_int2(int2, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS int2_ops
-DEFAULT FOR TYPE int2 USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 btint2cmp(int2,int2),
- FUNCTION 2 gin_extract_value_int2(int2, internal),
- FUNCTION 3 gin_extract_query_int2(int2, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_int2(int2,int2,int2, internal),
-STORAGE int2;
-
-CREATE FUNCTION gin_extract_value_int4(int4, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_int4(int4, int4, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_int4(int4, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS int4_ops
-DEFAULT FOR TYPE int4 USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 btint4cmp(int4,int4),
- FUNCTION 2 gin_extract_value_int4(int4, internal),
- FUNCTION 3 gin_extract_query_int4(int4, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_int4(int4,int4,int2, internal),
-STORAGE int4;
-
-CREATE FUNCTION gin_extract_value_int8(int8, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_int8(int8, int8, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_int8(int8, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS int8_ops
-DEFAULT FOR TYPE int8 USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 btint8cmp(int8,int8),
- FUNCTION 2 gin_extract_value_int8(int8, internal),
- FUNCTION 3 gin_extract_query_int8(int8, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_int8(int8,int8,int2, internal),
-STORAGE int8;
-
-CREATE FUNCTION gin_extract_value_float4(float4, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_float4(float4, float4, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_float4(float4, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS float4_ops
-DEFAULT FOR TYPE float4 USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 btfloat4cmp(float4,float4),
- FUNCTION 2 gin_extract_value_float4(float4, internal),
- FUNCTION 3 gin_extract_query_float4(float4, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_float4(float4,float4,int2, internal),
-STORAGE float4;
-
-CREATE FUNCTION gin_extract_value_float8(float8, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_float8(float8, float8, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_float8(float8, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS float8_ops
-DEFAULT FOR TYPE float8 USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 btfloat8cmp(float8,float8),
- FUNCTION 2 gin_extract_value_float8(float8, internal),
- FUNCTION 3 gin_extract_query_float8(float8, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_float8(float8,float8,int2, internal),
-STORAGE float8;
-
-CREATE FUNCTION gin_extract_value_money(money, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_money(money, money, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_money(money, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS money_ops
-DEFAULT FOR TYPE money USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 cash_cmp(money,money),
- FUNCTION 2 gin_extract_value_money(money, internal),
- FUNCTION 3 gin_extract_query_money(money, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_money(money,money,int2, internal),
-STORAGE money;
-
-CREATE FUNCTION gin_extract_value_oid(oid, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_oid(oid, oid, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_oid(oid, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS oid_ops
-DEFAULT FOR TYPE oid USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 btoidcmp(oid,oid),
- FUNCTION 2 gin_extract_value_oid(oid, internal),
- FUNCTION 3 gin_extract_query_oid(oid, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_oid(oid,oid,int2, internal),
-STORAGE oid;
-
-CREATE FUNCTION gin_extract_value_timestamp(timestamp, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_timestamp(timestamp, timestamp, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_timestamp(timestamp, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS timestamp_ops
-DEFAULT FOR TYPE timestamp USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 timestamp_cmp(timestamp,timestamp),
- FUNCTION 2 gin_extract_value_timestamp(timestamp, internal),
- FUNCTION 3 gin_extract_query_timestamp(timestamp, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_timestamp(timestamp,timestamp,int2, internal),
-STORAGE timestamp;
-
-CREATE FUNCTION gin_extract_value_timestamptz(timestamptz, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_timestamptz(timestamptz, timestamptz, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_timestamptz(timestamptz, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS timestamptz_ops
-DEFAULT FOR TYPE timestamptz USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 timestamptz_cmp(timestamptz,timestamptz),
- FUNCTION 2 gin_extract_value_timestamptz(timestamptz, internal),
- FUNCTION 3 gin_extract_query_timestamptz(timestamptz, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_timestamptz(timestamptz,timestamptz,int2, internal),
-STORAGE timestamptz;
-
-CREATE FUNCTION gin_extract_value_time(time, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_time(time, time, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_time(time, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS time_ops
-DEFAULT FOR TYPE time USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 time_cmp(time,time),
- FUNCTION 2 gin_extract_value_time(time, internal),
- FUNCTION 3 gin_extract_query_time(time, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_time(time,time,int2, internal),
-STORAGE time;
-
-CREATE FUNCTION gin_extract_value_timetz(timetz, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_timetz(timetz, timetz, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_timetz(timetz, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS timetz_ops
-DEFAULT FOR TYPE timetz USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 timetz_cmp(timetz,timetz),
- FUNCTION 2 gin_extract_value_timetz(timetz, internal),
- FUNCTION 3 gin_extract_query_timetz(timetz, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_timetz(timetz,timetz,int2, internal),
-STORAGE timetz;
-
-CREATE FUNCTION gin_extract_value_date(date, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_date(date, date, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_date(date, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS date_ops
-DEFAULT FOR TYPE date USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 date_cmp(date,date),
- FUNCTION 2 gin_extract_value_date(date, internal),
- FUNCTION 3 gin_extract_query_date(date, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_date(date,date,int2, internal),
-STORAGE date;
-
-CREATE FUNCTION gin_extract_value_interval(interval, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_interval(interval, interval, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_interval(interval, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS interval_ops
-DEFAULT FOR TYPE interval USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 interval_cmp(interval,interval),
- FUNCTION 2 gin_extract_value_interval(interval, internal),
- FUNCTION 3 gin_extract_query_interval(interval, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_interval(interval,interval,int2, internal),
-STORAGE interval;
-
-CREATE FUNCTION gin_extract_value_macaddr(macaddr, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_macaddr(macaddr, macaddr, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_macaddr(macaddr, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS macaddr_ops
-DEFAULT FOR TYPE macaddr USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 macaddr_cmp(macaddr,macaddr),
- FUNCTION 2 gin_extract_value_macaddr(macaddr, internal),
- FUNCTION 3 gin_extract_query_macaddr(macaddr, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_macaddr(macaddr,macaddr,int2, internal),
-STORAGE macaddr;
-
-CREATE FUNCTION gin_extract_value_inet(inet, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_inet(inet, inet, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_inet(inet, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS inet_ops
-DEFAULT FOR TYPE inet USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 network_cmp(inet,inet),
- FUNCTION 2 gin_extract_value_inet(inet, internal),
- FUNCTION 3 gin_extract_query_inet(inet, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_inet(inet,inet,int2, internal),
-STORAGE inet;
-
-CREATE FUNCTION gin_extract_value_cidr(cidr, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_cidr(cidr, cidr, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_cidr(cidr, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS cidr_ops
-DEFAULT FOR TYPE cidr USING gin
-AS
- OPERATOR 1 <(inet,inet),
- OPERATOR 2 <=(inet,inet),
- OPERATOR 3 =(inet,inet),
- OPERATOR 4 >=(inet,inet),
- OPERATOR 5 >(inet,inet),
- FUNCTION 1 network_cmp(inet,inet),
- FUNCTION 2 gin_extract_value_cidr(cidr, internal),
- FUNCTION 3 gin_extract_query_cidr(cidr, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_cidr(cidr,cidr,int2, internal),
-STORAGE cidr;
-
-CREATE FUNCTION gin_extract_value_text(text, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_text(text, text, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_text(text, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS text_ops
-DEFAULT FOR TYPE text USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 bttextcmp(text,text),
- FUNCTION 2 gin_extract_value_text(text, internal),
- FUNCTION 3 gin_extract_query_text(text, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_text(text,text,int2, internal),
-STORAGE text;
-
-CREATE OPERATOR CLASS varchar_ops
-DEFAULT FOR TYPE varchar USING gin
-AS
- OPERATOR 1 <(text,text),
- OPERATOR 2 <=(text,text),
- OPERATOR 3 =(text,text),
- OPERATOR 4 >=(text,text),
- OPERATOR 5 >(text,text),
- FUNCTION 1 bttextcmp(text,text),
- FUNCTION 2 gin_extract_value_text(text, internal),
- FUNCTION 3 gin_extract_query_text(text, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_text(text,text,int2, internal),
-STORAGE varchar;
-
-CREATE FUNCTION gin_extract_value_char("char", internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_char("char", "char", int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_char("char", internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS char_ops
-DEFAULT FOR TYPE "char" USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 btcharcmp("char","char"),
- FUNCTION 2 gin_extract_value_char("char", internal),
- FUNCTION 3 gin_extract_query_char("char", internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_char("char","char",int2, internal),
-STORAGE "char";
-
-CREATE FUNCTION gin_extract_value_bytea(bytea, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_bytea(bytea, bytea, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_bytea(bytea, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS bytea_ops
-DEFAULT FOR TYPE bytea USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 byteacmp(bytea,bytea),
- FUNCTION 2 gin_extract_value_bytea(bytea, internal),
- FUNCTION 3 gin_extract_query_bytea(bytea, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_bytea(bytea,bytea,int2, internal),
-STORAGE bytea;
-
-CREATE FUNCTION gin_extract_value_bit(bit, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_bit(bit, bit, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_bit(bit, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS bit_ops
-DEFAULT FOR TYPE bit USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 bitcmp(bit,bit),
- FUNCTION 2 gin_extract_value_bit(bit, internal),
- FUNCTION 3 gin_extract_query_bit(bit, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_bit(bit,bit,int2, internal),
-STORAGE bit;
-
-CREATE FUNCTION gin_extract_value_varbit(varbit, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_varbit(varbit, varbit, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_varbit(varbit, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS varbit_ops
-DEFAULT FOR TYPE varbit USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 varbitcmp(varbit,varbit),
- FUNCTION 2 gin_extract_value_varbit(varbit, internal),
- FUNCTION 3 gin_extract_query_varbit(varbit, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_varbit(varbit,varbit,int2, internal),
-STORAGE varbit;
-
-CREATE FUNCTION gin_extract_value_numeric(numeric, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_compare_prefix_numeric(numeric, numeric, int2, internal)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_extract_query_numeric(numeric, internal, int2, internal, internal)
-RETURNS internal
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE FUNCTION gin_numeric_cmp(numeric, numeric)
-RETURNS int4
-AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT IMMUTABLE;
-
-CREATE OPERATOR CLASS numeric_ops
-DEFAULT FOR TYPE numeric USING gin
-AS
- OPERATOR 1 <,
- OPERATOR 2 <=,
- OPERATOR 3 =,
- OPERATOR 4 >=,
- OPERATOR 5 >,
- FUNCTION 1 gin_numeric_cmp(numeric,numeric),
- FUNCTION 2 gin_extract_value_numeric(numeric, internal),
- FUNCTION 3 gin_extract_query_numeric(numeric, internal, int2, internal, internal),
- FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
- FUNCTION 5 gin_compare_prefix_numeric(numeric,numeric,int2, internal),
-STORAGE numeric;
diff --git a/contrib/btree_gin/btree_gin--1.1.sql b/contrib/btree_gin/btree_gin--1.1.sql
new file mode 100644
index 0000000..c5980a1
--- /dev/null
+++ b/contrib/btree_gin/btree_gin--1.1.sql
@@ -0,0 +1,695 @@
+/* contrib/btree_gin/btree_gin--1.1.sql */
+
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION btree_gin" to load this file. \quit
+
+CREATE FUNCTION gin_btree_consistent(internal, int2, anyelement, int4, internal, internal)
+RETURNS bool
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_value_int2(int2, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_int2(int2, int2, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_int2(int2, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS int2_ops
+DEFAULT FOR TYPE int2 USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 btint2cmp(int2,int2),
+ FUNCTION 2 gin_extract_value_int2(int2, internal),
+ FUNCTION 3 gin_extract_query_int2(int2, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_int2(int2,int2,int2, internal),
+STORAGE int2;
+
+CREATE FUNCTION gin_extract_value_int4(int4, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_int4(int4, int4, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_int4(int4, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS int4_ops
+DEFAULT FOR TYPE int4 USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ OPERATOR 8 <@(anyelement, anyrange),
+ FUNCTION 1 btint4cmp(int4,int4),
+ FUNCTION 2 gin_extract_value_int4(int4, internal),
+ FUNCTION 3 gin_extract_query_int4(int4, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_int4(int4,int4,int2, internal),
+STORAGE int4;
+
+CREATE FUNCTION gin_extract_value_int8(int8, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_int8(int8, int8, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_int8(int8, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS int8_ops
+DEFAULT FOR TYPE int8 USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ OPERATOR 8 <@(anyelement, anyrange),
+ FUNCTION 1 btint8cmp(int8,int8),
+ FUNCTION 2 gin_extract_value_int8(int8, internal),
+ FUNCTION 3 gin_extract_query_int8(int8, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_int8(int8,int8,int2, internal),
+STORAGE int8;
+
+CREATE FUNCTION gin_extract_value_float4(float4, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_float4(float4, float4, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_float4(float4, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS float4_ops
+DEFAULT FOR TYPE float4 USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 btfloat4cmp(float4,float4),
+ FUNCTION 2 gin_extract_value_float4(float4, internal),
+ FUNCTION 3 gin_extract_query_float4(float4, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_float4(float4,float4,int2, internal),
+STORAGE float4;
+
+CREATE FUNCTION gin_extract_value_float8(float8, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_float8(float8, float8, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_float8(float8, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS float8_ops
+DEFAULT FOR TYPE float8 USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 btfloat8cmp(float8,float8),
+ FUNCTION 2 gin_extract_value_float8(float8, internal),
+ FUNCTION 3 gin_extract_query_float8(float8, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_float8(float8,float8,int2, internal),
+STORAGE float8;
+
+CREATE FUNCTION gin_extract_value_money(money, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_money(money, money, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_money(money, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS money_ops
+DEFAULT FOR TYPE money USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 cash_cmp(money,money),
+ FUNCTION 2 gin_extract_value_money(money, internal),
+ FUNCTION 3 gin_extract_query_money(money, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_money(money,money,int2, internal),
+STORAGE money;
+
+CREATE FUNCTION gin_extract_value_oid(oid, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_oid(oid, oid, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_oid(oid, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS oid_ops
+DEFAULT FOR TYPE oid USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 btoidcmp(oid,oid),
+ FUNCTION 2 gin_extract_value_oid(oid, internal),
+ FUNCTION 3 gin_extract_query_oid(oid, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_oid(oid,oid,int2, internal),
+STORAGE oid;
+
+CREATE FUNCTION gin_extract_value_timestamp(timestamp, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_timestamp(timestamp, timestamp, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_timestamp(timestamp, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS timestamp_ops
+DEFAULT FOR TYPE timestamp USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ OPERATOR 8 <@(anyelement, anyrange),
+ FUNCTION 1 timestamp_cmp(timestamp,timestamp),
+ FUNCTION 2 gin_extract_value_timestamp(timestamp, internal),
+ FUNCTION 3 gin_extract_query_timestamp(timestamp, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_timestamp(timestamp,timestamp,int2, internal),
+STORAGE timestamp;
+
+CREATE FUNCTION gin_extract_value_timestamptz(timestamptz, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_timestamptz(timestamptz, timestamptz, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_timestamptz(timestamptz, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS timestamptz_ops
+DEFAULT FOR TYPE timestamptz USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ OPERATOR 8 <@(anyelement, anyrange),
+ FUNCTION 1 timestamptz_cmp(timestamptz,timestamptz),
+ FUNCTION 2 gin_extract_value_timestamptz(timestamptz, internal),
+ FUNCTION 3 gin_extract_query_timestamptz(timestamptz, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_timestamptz(timestamptz,timestamptz,int2, internal),
+STORAGE timestamptz;
+
+CREATE FUNCTION gin_extract_value_time(time, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_time(time, time, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_time(time, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS time_ops
+DEFAULT FOR TYPE time USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 time_cmp(time,time),
+ FUNCTION 2 gin_extract_value_time(time, internal),
+ FUNCTION 3 gin_extract_query_time(time, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_time(time,time,int2, internal),
+STORAGE time;
+
+CREATE FUNCTION gin_extract_value_timetz(timetz, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_timetz(timetz, timetz, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_timetz(timetz, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS timetz_ops
+DEFAULT FOR TYPE timetz USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 timetz_cmp(timetz,timetz),
+ FUNCTION 2 gin_extract_value_timetz(timetz, internal),
+ FUNCTION 3 gin_extract_query_timetz(timetz, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_timetz(timetz,timetz,int2, internal),
+STORAGE timetz;
+
+CREATE FUNCTION gin_extract_value_date(date, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_date(date, date, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_date(date, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS date_ops
+DEFAULT FOR TYPE date USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ OPERATOR 8 <@(anyelement, anyrange),
+ FUNCTION 1 date_cmp(date,date),
+ FUNCTION 2 gin_extract_value_date(date, internal),
+ FUNCTION 3 gin_extract_query_date(date, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_date(date,date,int2, internal),
+STORAGE date;
+
+CREATE FUNCTION gin_extract_value_interval(interval, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_interval(interval, interval, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_interval(interval, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS interval_ops
+DEFAULT FOR TYPE interval USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 interval_cmp(interval,interval),
+ FUNCTION 2 gin_extract_value_interval(interval, internal),
+ FUNCTION 3 gin_extract_query_interval(interval, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_interval(interval,interval,int2, internal),
+STORAGE interval;
+
+CREATE FUNCTION gin_extract_value_macaddr(macaddr, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_macaddr(macaddr, macaddr, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_macaddr(macaddr, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS macaddr_ops
+DEFAULT FOR TYPE macaddr USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 macaddr_cmp(macaddr,macaddr),
+ FUNCTION 2 gin_extract_value_macaddr(macaddr, internal),
+ FUNCTION 3 gin_extract_query_macaddr(macaddr, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_macaddr(macaddr,macaddr,int2, internal),
+STORAGE macaddr;
+
+CREATE FUNCTION gin_extract_value_inet(inet, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_inet(inet, inet, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_inet(inet, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS inet_ops
+DEFAULT FOR TYPE inet USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 network_cmp(inet,inet),
+ FUNCTION 2 gin_extract_value_inet(inet, internal),
+ FUNCTION 3 gin_extract_query_inet(inet, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_inet(inet,inet,int2, internal),
+STORAGE inet;
+
+CREATE FUNCTION gin_extract_value_cidr(cidr, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_cidr(cidr, cidr, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_cidr(cidr, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS cidr_ops
+DEFAULT FOR TYPE cidr USING gin
+AS
+ OPERATOR 1 <(inet,inet),
+ OPERATOR 2 <=(inet,inet),
+ OPERATOR 3 =(inet,inet),
+ OPERATOR 4 >=(inet,inet),
+ OPERATOR 5 >(inet,inet),
+ FUNCTION 1 network_cmp(inet,inet),
+ FUNCTION 2 gin_extract_value_cidr(cidr, internal),
+ FUNCTION 3 gin_extract_query_cidr(cidr, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_cidr(cidr,cidr,int2, internal),
+STORAGE cidr;
+
+CREATE FUNCTION gin_extract_value_text(text, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_text(text, text, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_text(text, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS text_ops
+DEFAULT FOR TYPE text USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 bttextcmp(text,text),
+ FUNCTION 2 gin_extract_value_text(text, internal),
+ FUNCTION 3 gin_extract_query_text(text, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_text(text,text,int2, internal),
+STORAGE text;
+
+CREATE OPERATOR CLASS varchar_ops
+DEFAULT FOR TYPE varchar USING gin
+AS
+ OPERATOR 1 <(text,text),
+ OPERATOR 2 <=(text,text),
+ OPERATOR 3 =(text,text),
+ OPERATOR 4 >=(text,text),
+ OPERATOR 5 >(text,text),
+ FUNCTION 1 bttextcmp(text,text),
+ FUNCTION 2 gin_extract_value_text(text, internal),
+ FUNCTION 3 gin_extract_query_text(text, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_text(text,text,int2, internal),
+STORAGE varchar;
+
+CREATE FUNCTION gin_extract_value_char("char", internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_char("char", "char", int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_char("char", internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS char_ops
+DEFAULT FOR TYPE "char" USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 btcharcmp("char","char"),
+ FUNCTION 2 gin_extract_value_char("char", internal),
+ FUNCTION 3 gin_extract_query_char("char", internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_char("char","char",int2, internal),
+STORAGE "char";
+
+CREATE FUNCTION gin_extract_value_bytea(bytea, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_bytea(bytea, bytea, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_bytea(bytea, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS bytea_ops
+DEFAULT FOR TYPE bytea USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 byteacmp(bytea,bytea),
+ FUNCTION 2 gin_extract_value_bytea(bytea, internal),
+ FUNCTION 3 gin_extract_query_bytea(bytea, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_bytea(bytea,bytea,int2, internal),
+STORAGE bytea;
+
+CREATE FUNCTION gin_extract_value_bit(bit, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_bit(bit, bit, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_bit(bit, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS bit_ops
+DEFAULT FOR TYPE bit USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 bitcmp(bit,bit),
+ FUNCTION 2 gin_extract_value_bit(bit, internal),
+ FUNCTION 3 gin_extract_query_bit(bit, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_bit(bit,bit,int2, internal),
+STORAGE bit;
+
+CREATE FUNCTION gin_extract_value_varbit(varbit, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_varbit(varbit, varbit, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_varbit(varbit, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS varbit_ops
+DEFAULT FOR TYPE varbit USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ FUNCTION 1 varbitcmp(varbit,varbit),
+ FUNCTION 2 gin_extract_value_varbit(varbit, internal),
+ FUNCTION 3 gin_extract_query_varbit(varbit, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_varbit(varbit,varbit,int2, internal),
+STORAGE varbit;
+
+CREATE FUNCTION gin_extract_value_numeric(numeric, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_compare_prefix_numeric(numeric, numeric, int2, internal)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_extract_query_numeric(numeric, internal, int2, internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE FUNCTION gin_numeric_cmp(numeric, numeric)
+RETURNS int4
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT IMMUTABLE;
+
+CREATE OPERATOR CLASS numeric_ops
+DEFAULT FOR TYPE numeric USING gin
+AS
+ OPERATOR 1 <,
+ OPERATOR 2 <=,
+ OPERATOR 3 =,
+ OPERATOR 4 >=,
+ OPERATOR 5 >,
+ OPERATOR 8 <@(anyelement, anyrange),
+ FUNCTION 1 gin_numeric_cmp(numeric,numeric),
+ FUNCTION 2 gin_extract_value_numeric(numeric, internal),
+ FUNCTION 3 gin_extract_query_numeric(numeric, internal, int2, internal, internal),
+ FUNCTION 4 gin_btree_consistent(internal, int2, anyelement, int4, internal, internal),
+ FUNCTION 5 gin_compare_prefix_numeric(numeric,numeric,int2, internal),
+STORAGE numeric;
diff --git a/contrib/btree_gin/btree_gin.c b/contrib/btree_gin/btree_gin.c
index 80521fb..95ce9a6 100644
--- a/contrib/btree_gin/btree_gin.c
+++ b/contrib/btree_gin/btree_gin.c
@@ -5,6 +5,8 @@
#include <limits.h>
+#include "access/gin.h"
+#include "access/gist.h"
#include "access/skey.h"
#include "utils/builtins.h"
#include "utils/bytea.h"
@@ -12,6 +14,7 @@
#include "utils/date.h"
#include "utils/inet.h"
#include "utils/numeric.h"
+#include "utils/rangetypes.h"
#include "utils/timestamp.h"
#include "utils/varbit.h"
@@ -21,6 +24,8 @@ typedef struct QueryInfo
{
StrategyNumber strategy;
Datum datum;
+ RangeBound lower;
+ RangeBound upper;
bool is_varlena;
Datum (*typecmp) (FunctionCallInfo);
} QueryInfo;
@@ -28,6 +33,23 @@ typedef struct QueryInfo
/*** GIN support functions shared by all datatypes ***/
+static void
+get_bounds(Datum r, QueryInfo *data)
+{
+ RangeType *range = DatumGetRangeType(r);
+ TypeCacheEntry *typcache;
+ bool empty;
+
+ typcache = lookup_type_cache(RangeTypeGetOid(range), TYPECACHE_RANGE_INFO);
+ if (typcache->rngelemtype == NULL)
+ elog(ERROR, "type %u is not a range type", RangeTypeGetOid(range));
+
+ range_deserialize(typcache, range, &data->lower, &data->upper, &empty);
+
+ if (empty)
+ data->lower.infinite = data->upper.infinite = true;
+}
+
static Datum
gin_btree_extract_value(FunctionCallInfo fcinfo, bool is_varlena)
{
@@ -62,15 +84,19 @@ gin_btree_extract_query(FunctionCallInfo fcinfo,
StrategyNumber strategy = PG_GETARG_UINT16(2);
bool **partialmatch = (bool **) PG_GETARG_POINTER(3);
Pointer **extra_data = (Pointer **) PG_GETARG_POINTER(4);
+ int32 *searchMode = (int32 *) PG_GETARG_POINTER(6);
Datum *entries = (Datum *) palloc(sizeof(Datum));
QueryInfo *data = (QueryInfo *) palloc(sizeof(QueryInfo));
bool *ptr_partialmatch;
+ if (strategy == RTContainedByStrategyNumber /* range type */ ||
+ is_varlena)
+ datum = PointerGetDatum(PG_DETOAST_DATUM(datum));
+
*nentries = 1;
ptr_partialmatch = *partialmatch = (bool *) palloc(sizeof(bool));
*ptr_partialmatch = false;
- if (is_varlena)
- datum = PointerGetDatum(PG_DETOAST_DATUM(datum));
+ *searchMode = GIN_SEARCH_MODE_DEFAULT;
data->strategy = strategy;
data->datum = datum;
data->is_varlena = is_varlena;
@@ -78,7 +104,37 @@ gin_btree_extract_query(FunctionCallInfo fcinfo,
*extra_data = (Pointer *) palloc(sizeof(Pointer));
**extra_data = (Pointer) data;
- switch (strategy)
+ if (strategy == RTContainedByStrategyNumber)
+ {
+ get_bounds(datum, data);
+
+ if (data->lower.infinite && data->upper.infinite)
+ {
+ *nentries = 0;
+ *searchMode = GIN_SEARCH_MODE_ALL;
+ PG_RETURN_POINTER(entries);
+ }
+ else if (data->lower.infinite)
+ {
+ data->strategy = data->upper.inclusive ?
+ BTLessEqualStrategyNumber : BTLessStrategyNumber;
+ data->datum = data->upper.val;
+ }
+ else if (data->upper.infinite)
+ {
+ data->strategy = data->lower.inclusive ?
+ BTGreaterEqualStrategyNumber : BTGreaterStrategyNumber;
+ data->datum = data->lower.val;
+ }
+ else
+ {
+ *ptr_partialmatch = true;
+ entries[0] = data->lower.val;
+ PG_RETURN_POINTER(entries);
+ }
+ }
+
+ switch (data->strategy)
{
case BTLessStrategyNumber:
case BTLessEqualStrategyNumber:
@@ -89,7 +145,7 @@ gin_btree_extract_query(FunctionCallInfo fcinfo,
case BTGreaterStrategyNumber:
*ptr_partialmatch = true;
case BTEqualStrategyNumber:
- entries[0] = datum;
+ entries[0] = data->datum;
break;
default:
elog(ERROR, "unrecognized strategy number: %d", strategy);
@@ -98,6 +154,10 @@ gin_btree_extract_query(FunctionCallInfo fcinfo,
PG_RETURN_POINTER(entries);
}
+#define STOP_SCAN (1)
+#define MATCH_SCAN (0)
+#define CONT_SCAN (-1)
+
/*
* Datum a is a value from extract_query method and for BTLess*
* strategy it is a left-most value. So, use original datum from QueryInfo
@@ -112,6 +172,36 @@ gin_btree_compare_prefix(FunctionCallInfo fcinfo)
int32 res,
cmp;
+ if (data->strategy == RTContainedByStrategyNumber)
+ {
+ cmp = DatumGetInt32(DirectFunctionCall2Coll(
+ data->typecmp,
+ PG_GET_COLLATION(), a, b));
+
+ if (cmp < 0)
+ {
+ cmp = DatumGetInt32(DirectFunctionCall2Coll(
+ data->typecmp,
+ PG_GET_COLLATION(), data->upper.val, b));
+ if (cmp < 0)
+ res = STOP_SCAN;
+ else if (cmp == 0)
+ res = (data->upper.inclusive) ? MATCH_SCAN : STOP_SCAN;
+ else
+ res = MATCH_SCAN;
+ }
+ else if (cmp == 0)
+ {
+ res = (data->lower.inclusive) ? MATCH_SCAN : CONT_SCAN;
+ }
+ else
+ {
+ res = STOP_SCAN;
+ }
+
+ PG_RETURN_INT32(res);
+ }
+
cmp = DatumGetInt32(DirectFunctionCall2Coll(
data->typecmp,
PG_GET_COLLATION(),
@@ -125,44 +215,44 @@ gin_btree_compare_prefix(FunctionCallInfo fcinfo)
case BTLessStrategyNumber:
/* If original datum > indexed one then return match */
if (cmp > 0)
- res = 0;
+ res = MATCH_SCAN;
else
- res = 1;
+ res = STOP_SCAN;
break;
case BTLessEqualStrategyNumber:
/* The same except equality */
if (cmp >= 0)
- res = 0;
+ res = MATCH_SCAN;
else
- res = 1;
+ res = STOP_SCAN;
break;
case BTEqualStrategyNumber:
if (cmp != 0)
- res = 1;
+ res = STOP_SCAN;
else
- res = 0;
+ res = MATCH_SCAN;
break;
case BTGreaterEqualStrategyNumber:
/* If original datum <= indexed one then return match */
if (cmp <= 0)
- res = 0;
+ res = MATCH_SCAN;
else
- res = 1;
+ res = STOP_SCAN;
break;
case BTGreaterStrategyNumber:
/* If original datum <= indexed one then return match */
/* If original datum == indexed one then continue scan */
if (cmp < 0)
- res = 0;
+ res = MATCH_SCAN;
else if (cmp == 0)
- res = -1;
+ res = CONT_SCAN;
else
- res = 1;
+ res = STOP_SCAN;
break;
default:
elog(ERROR, "unrecognized strategy number: %d",
data->strategy);
- res = 0;
+ res = MATCH_SCAN;
}
PG_RETURN_INT32(res);
diff --git a/contrib/btree_gin/btree_gin.control b/contrib/btree_gin/btree_gin.control
index 3b2cb2d..d96436e 100644
--- a/contrib/btree_gin/btree_gin.control
+++ b/contrib/btree_gin/btree_gin.control
@@ -1,5 +1,5 @@
# btree_gin extension
comment = 'support for indexing common datatypes in GIN'
-default_version = '1.0'
+default_version = '1.1'
module_pathname = '$libdir/btree_gin'
relocatable = true
diff --git a/contrib/btree_gin/expected/date.out b/contrib/btree_gin/expected/date.out
index 40dfa30..162759f 100644
--- a/contrib/btree_gin/expected/date.out
+++ b/contrib/btree_gin/expected/date.out
@@ -49,3 +49,73 @@ SELECT * FROM test_date WHERE i>'2004-10-26'::date ORDER BY i;
10-28-2004
(2 rows)
+SELECT * FROM test_date WHERE i <@ '[2004-10-24, 2004-10-27]'::daterange ORDER BY i;
+ i
+------------
+ 10-24-2004
+ 10-25-2004
+ 10-26-2004
+ 10-27-2004
+(4 rows)
+
+SELECT * FROM test_date WHERE i <@ '(2004-10-24, 2004-10-27]'::daterange ORDER BY i;
+ i
+------------
+ 10-25-2004
+ 10-26-2004
+ 10-27-2004
+(3 rows)
+
+SELECT * FROM test_date WHERE i <@ '[2004-10-24, 2004-10-27)'::daterange ORDER BY i;
+ i
+------------
+ 10-24-2004
+ 10-25-2004
+ 10-26-2004
+(3 rows)
+
+SELECT * FROM test_date WHERE i <@ '(2004-10-24, 2004-10-27)'::daterange ORDER BY i;
+ i
+------------
+ 10-25-2004
+ 10-26-2004
+(2 rows)
+
+SELECT * FROM test_date WHERE i <@ daterange('2004-10-24', '2004-10-27') ORDER BY i;
+ i
+------------
+ 10-24-2004
+ 10-25-2004
+ 10-26-2004
+(3 rows)
+
+SELECT * FROM test_date WHERE i <@ daterange(NULL, '2004-10-27') ORDER BY i;
+ i
+------------
+ 10-23-2004
+ 10-24-2004
+ 10-25-2004
+ 10-26-2004
+(4 rows)
+
+SELECT * FROM test_date WHERE i <@ daterange('2004-10-24', NULL) ORDER BY i;
+ i
+------------
+ 10-24-2004
+ 10-25-2004
+ 10-26-2004
+ 10-27-2004
+ 10-28-2004
+(5 rows)
+
+SELECT * FROM test_date WHERE i <@ daterange(NULL, NULL) ORDER BY i;
+ i
+------------
+ 10-23-2004
+ 10-24-2004
+ 10-25-2004
+ 10-26-2004
+ 10-27-2004
+ 10-28-2004
+(6 rows)
+
diff --git a/contrib/btree_gin/expected/int4.out b/contrib/btree_gin/expected/int4.out
index 0f0122c..923a56c 100644
--- a/contrib/btree_gin/expected/int4.out
+++ b/contrib/btree_gin/expected/int4.out
@@ -42,3 +42,67 @@ SELECT * FROM test_int4 WHERE i>1::int4 ORDER BY i;
3
(2 rows)
+SELECT * FROM test_int4 WHERE i <@ '[-1, 1]'::int4range ORDER BY i;
+ i
+----
+ -1
+ 0
+ 1
+(3 rows)
+
+SELECT * FROM test_int4 WHERE i <@ '(-1, 1]'::int4range ORDER BY i;
+ i
+---
+ 0
+ 1
+(2 rows)
+
+SELECT * FROM test_int4 WHERE i <@ '[-1, 1)'::int4range ORDER BY i;
+ i
+----
+ -1
+ 0
+(2 rows)
+
+SELECT * FROM test_int4 WHERE i <@ '(-1, 1)'::int4range ORDER BY i;
+ i
+---
+ 0
+(1 row)
+
+SELECT * FROM test_int4 WHERE i <@ int4range(-1, 1) ORDER BY i;
+ i
+----
+ -1
+ 0
+(2 rows)
+
+SELECT * FROM test_int4 WHERE i <@ int4range(NULL, 1) ORDER BY i;
+ i
+----
+ -2
+ -1
+ 0
+(3 rows)
+
+SELECT * FROM test_int4 WHERE i <@ int4range(-1, NULL) ORDER BY i;
+ i
+----
+ -1
+ 0
+ 1
+ 2
+ 3
+(5 rows)
+
+SELECT * FROM test_int4 WHERE i <@ int4range(NULL, NULL) ORDER BY i;
+ i
+----
+ -2
+ -1
+ 0
+ 1
+ 2
+ 3
+(6 rows)
+
diff --git a/contrib/btree_gin/expected/int8.out b/contrib/btree_gin/expected/int8.out
index 307e19e..c7067eb 100644
--- a/contrib/btree_gin/expected/int8.out
+++ b/contrib/btree_gin/expected/int8.out
@@ -42,3 +42,67 @@ SELECT * FROM test_int8 WHERE i>1::int8 ORDER BY i;
3
(2 rows)
+SELECT * FROM test_int8 WHERE i <@ '[-1, 1]'::int8range ORDER BY i;
+ i
+----
+ -1
+ 0
+ 1
+(3 rows)
+
+SELECT * FROM test_int8 WHERE i <@ '(-1, 1]'::int8range ORDER BY i;
+ i
+---
+ 0
+ 1
+(2 rows)
+
+SELECT * FROM test_int8 WHERE i <@ '[-1, 1)'::int8range ORDER BY i;
+ i
+----
+ -1
+ 0
+(2 rows)
+
+SELECT * FROM test_int8 WHERE i <@ '(-1, 1)'::int8range ORDER BY i;
+ i
+---
+ 0
+(1 row)
+
+SELECT * FROM test_int8 WHERE i <@ int8range(-1, 1) ORDER BY i;
+ i
+----
+ -1
+ 0
+(2 rows)
+
+SELECT * FROM test_int8 WHERE i <@ int8range(NULL, 1) ORDER BY i;
+ i
+----
+ -2
+ -1
+ 0
+(3 rows)
+
+SELECT * FROM test_int8 WHERE i <@ int8range(-1, NULL) ORDER BY i;
+ i
+----
+ -1
+ 0
+ 1
+ 2
+ 3
+(5 rows)
+
+SELECT * FROM test_int8 WHERE i <@ int8range(NULL, NULL) ORDER BY i;
+ i
+----
+ -2
+ -1
+ 0
+ 1
+ 2
+ 3
+(6 rows)
+
diff --git a/contrib/btree_gin/expected/numeric.out b/contrib/btree_gin/expected/numeric.out
index f10a672..461f9d1 100644
--- a/contrib/btree_gin/expected/numeric.out
+++ b/contrib/btree_gin/expected/numeric.out
@@ -42,3 +42,67 @@ SELECT * FROM test_numeric WHERE i>'1'::numeric ORDER BY i;
3
(2 rows)
+SELECT * FROM test_numeric WHERE i <@ '[-1, 1]'::numrange ORDER BY i;
+ i
+----
+ -1
+ 0
+ 1
+(3 rows)
+
+SELECT * FROM test_numeric WHERE i <@ '(-1, 1]'::numrange ORDER BY i;
+ i
+---
+ 0
+ 1
+(2 rows)
+
+SELECT * FROM test_numeric WHERE i <@ '[-1, 1)'::numrange ORDER BY i;
+ i
+----
+ -1
+ 0
+(2 rows)
+
+SELECT * FROM test_numeric WHERE i <@ '(-1, 1)'::numrange ORDER BY i;
+ i
+---
+ 0
+(1 row)
+
+SELECT * FROM test_numeric WHERE i <@ numrange(-1, 1) ORDER BY i;
+ i
+----
+ -1
+ 0
+(2 rows)
+
+SELECT * FROM test_numeric WHERE i <@ numrange(NULL, 1) ORDER BY i;
+ i
+----
+ -2
+ -1
+ 0
+(3 rows)
+
+SELECT * FROM test_numeric WHERE i <@ numrange(-1, NULL) ORDER BY i;
+ i
+----
+ -1
+ 0
+ 1
+ 2
+ 3
+(5 rows)
+
+SELECT * FROM test_numeric WHERE i <@ numrange(NULL, NULL) ORDER BY i;
+ i
+----
+ -2
+ -1
+ 0
+ 1
+ 2
+ 3
+(6 rows)
+
diff --git a/contrib/btree_gin/expected/timestamp.out b/contrib/btree_gin/expected/timestamp.out
index a236cdc..1feb7e9 100644
--- a/contrib/btree_gin/expected/timestamp.out
+++ b/contrib/btree_gin/expected/timestamp.out
@@ -49,3 +49,73 @@ SELECT * FROM test_timestamp WHERE i>'2004-10-26 08:55:08'::timestamp ORDER BY i
Tue Oct 26 10:55:08 2004
(2 rows)
+SELECT * FROM test_timestamp WHERE i <@ '[2004-10-26 04:55:08, 2004-10-26 09:55:08]'::tsrange ORDER BY i;
+ i
+--------------------------
+ Tue Oct 26 04:55:08 2004
+ Tue Oct 26 05:55:08 2004
+ Tue Oct 26 08:55:08 2004
+ Tue Oct 26 09:55:08 2004
+(4 rows)
+
+SELECT * FROM test_timestamp WHERE i <@ '(2004-10-26 04:55:08, 2004-10-26 09:55:08]'::tsrange ORDER BY i;
+ i
+--------------------------
+ Tue Oct 26 05:55:08 2004
+ Tue Oct 26 08:55:08 2004
+ Tue Oct 26 09:55:08 2004
+(3 rows)
+
+SELECT * FROM test_timestamp WHERE i <@ '[2004-10-26 04:55:08, 2004-10-26 09:55:08)'::tsrange ORDER BY i;
+ i
+--------------------------
+ Tue Oct 26 04:55:08 2004
+ Tue Oct 26 05:55:08 2004
+ Tue Oct 26 08:55:08 2004
+(3 rows)
+
+SELECT * FROM test_timestamp WHERE i <@ '(2004-10-26 04:55:08, 2004-10-26 09:55:08)'::tsrange ORDER BY i;
+ i
+--------------------------
+ Tue Oct 26 05:55:08 2004
+ Tue Oct 26 08:55:08 2004
+(2 rows)
+
+SELECT * FROM test_timestamp WHERE i <@ tsrange('2004-10-26 04:55:08', '2004-10-26 09:55:08') ORDER BY i;
+ i
+--------------------------
+ Tue Oct 26 04:55:08 2004
+ Tue Oct 26 05:55:08 2004
+ Tue Oct 26 08:55:08 2004
+(3 rows)
+
+SELECT * FROM test_timestamp WHERE i <@ tsrange(NULL, '2004-10-26 09:55:08') ORDER BY i;
+ i
+--------------------------
+ Tue Oct 26 03:55:08 2004
+ Tue Oct 26 04:55:08 2004
+ Tue Oct 26 05:55:08 2004
+ Tue Oct 26 08:55:08 2004
+(4 rows)
+
+SELECT * FROM test_timestamp WHERE i <@ tsrange('2004-10-26 04:55:08', NULL) ORDER BY i;
+ i
+--------------------------
+ Tue Oct 26 04:55:08 2004
+ Tue Oct 26 05:55:08 2004
+ Tue Oct 26 08:55:08 2004
+ Tue Oct 26 09:55:08 2004
+ Tue Oct 26 10:55:08 2004
+(5 rows)
+
+SELECT * FROM test_timestamp WHERE i <@ tsrange(NULL, NULL) ORDER BY i;
+ i
+--------------------------
+ Tue Oct 26 03:55:08 2004
+ Tue Oct 26 04:55:08 2004
+ Tue Oct 26 05:55:08 2004
+ Tue Oct 26 08:55:08 2004
+ Tue Oct 26 09:55:08 2004
+ Tue Oct 26 10:55:08 2004
+(6 rows)
+
diff --git a/contrib/btree_gin/expected/timestamptz.out b/contrib/btree_gin/expected/timestamptz.out
index d53963d..de2087b 100644
--- a/contrib/btree_gin/expected/timestamptz.out
+++ b/contrib/btree_gin/expected/timestamptz.out
@@ -49,3 +49,73 @@ SELECT * FROM test_timestamptz WHERE i>'2004-10-26 08:55:08'::timestamptz ORDER
Tue Oct 26 10:55:08 2004 PDT
(2 rows)
+SELECT * FROM test_timestamptz WHERE i <@ '[2004-10-26 04:55:08, 2004-10-26 09:55:08]'::tstzrange ORDER BY i;
+ i
+------------------------------
+ Tue Oct 26 04:55:08 2004 PDT
+ Tue Oct 26 05:55:08 2004 PDT
+ Tue Oct 26 08:55:08 2004 PDT
+ Tue Oct 26 09:55:08 2004 PDT
+(4 rows)
+
+SELECT * FROM test_timestamptz WHERE i <@ '(2004-10-26 04:55:08, 2004-10-26 09:55:08]'::tstzrange ORDER BY i;
+ i
+------------------------------
+ Tue Oct 26 05:55:08 2004 PDT
+ Tue Oct 26 08:55:08 2004 PDT
+ Tue Oct 26 09:55:08 2004 PDT
+(3 rows)
+
+SELECT * FROM test_timestamptz WHERE i <@ '[2004-10-26 04:55:08, 2004-10-26 09:55:08)'::tstzrange ORDER BY i;
+ i
+------------------------------
+ Tue Oct 26 04:55:08 2004 PDT
+ Tue Oct 26 05:55:08 2004 PDT
+ Tue Oct 26 08:55:08 2004 PDT
+(3 rows)
+
+SELECT * FROM test_timestamptz WHERE i <@ '(2004-10-26 04:55:08, 2004-10-26 09:55:08)'::tstzrange ORDER BY i;
+ i
+------------------------------
+ Tue Oct 26 05:55:08 2004 PDT
+ Tue Oct 26 08:55:08 2004 PDT
+(2 rows)
+
+SELECT * FROM test_timestamptz WHERE i <@ tstzrange('2004-10-26 04:55:08', '2004-10-26 09:55:08') ORDER BY i;
+ i
+------------------------------
+ Tue Oct 26 04:55:08 2004 PDT
+ Tue Oct 26 05:55:08 2004 PDT
+ Tue Oct 26 08:55:08 2004 PDT
+(3 rows)
+
+SELECT * FROM test_timestamptz WHERE i <@ tstzrange(NULL, '2004-10-26 09:55:08') ORDER BY i;
+ i
+------------------------------
+ Tue Oct 26 03:55:08 2004 PDT
+ Tue Oct 26 04:55:08 2004 PDT
+ Tue Oct 26 05:55:08 2004 PDT
+ Tue Oct 26 08:55:08 2004 PDT
+(4 rows)
+
+SELECT * FROM test_timestamptz WHERE i <@ tstzrange('2004-10-26 04:55:08', NULL) ORDER BY i;
+ i
+------------------------------
+ Tue Oct 26 04:55:08 2004 PDT
+ Tue Oct 26 05:55:08 2004 PDT
+ Tue Oct 26 08:55:08 2004 PDT
+ Tue Oct 26 09:55:08 2004 PDT
+ Tue Oct 26 10:55:08 2004 PDT
+(5 rows)
+
+SELECT * FROM test_timestamptz WHERE i <@ tstzrange(NULL, NULL) ORDER BY i;
+ i
+------------------------------
+ Tue Oct 26 03:55:08 2004 PDT
+ Tue Oct 26 04:55:08 2004 PDT
+ Tue Oct 26 05:55:08 2004 PDT
+ Tue Oct 26 08:55:08 2004 PDT
+ Tue Oct 26 09:55:08 2004 PDT
+ Tue Oct 26 10:55:08 2004 PDT
+(6 rows)
+
diff --git a/contrib/btree_gin/sql/date.sql b/contrib/btree_gin/sql/date.sql
index 35086f6..79f329a 100644
--- a/contrib/btree_gin/sql/date.sql
+++ b/contrib/btree_gin/sql/date.sql
@@ -20,3 +20,14 @@ SELECT * FROM test_date WHERE i<='2004-10-26'::date ORDER BY i;
SELECT * FROM test_date WHERE i='2004-10-26'::date ORDER BY i;
SELECT * FROM test_date WHERE i>='2004-10-26'::date ORDER BY i;
SELECT * FROM test_date WHERE i>'2004-10-26'::date ORDER BY i;
+
+SELECT * FROM test_date WHERE i <@ '[2004-10-24, 2004-10-27]'::daterange ORDER BY i;
+SELECT * FROM test_date WHERE i <@ '(2004-10-24, 2004-10-27]'::daterange ORDER BY i;
+SELECT * FROM test_date WHERE i <@ '[2004-10-24, 2004-10-27)'::daterange ORDER BY i;
+SELECT * FROM test_date WHERE i <@ '(2004-10-24, 2004-10-27)'::daterange ORDER BY i;
+
+SELECT * FROM test_date WHERE i <@ daterange('2004-10-24', '2004-10-27') ORDER BY i;
+SELECT * FROM test_date WHERE i <@ daterange(NULL, '2004-10-27') ORDER BY i;
+SELECT * FROM test_date WHERE i <@ daterange('2004-10-24', NULL) ORDER BY i;
+SELECT * FROM test_date WHERE i <@ daterange(NULL, NULL) ORDER BY i;
+
diff --git a/contrib/btree_gin/sql/int4.sql b/contrib/btree_gin/sql/int4.sql
index 6499c29..af96aa5 100644
--- a/contrib/btree_gin/sql/int4.sql
+++ b/contrib/btree_gin/sql/int4.sql
@@ -13,3 +13,14 @@ SELECT * FROM test_int4 WHERE i<=1::int4 ORDER BY i;
SELECT * FROM test_int4 WHERE i=1::int4 ORDER BY i;
SELECT * FROM test_int4 WHERE i>=1::int4 ORDER BY i;
SELECT * FROM test_int4 WHERE i>1::int4 ORDER BY i;
+
+SELECT * FROM test_int4 WHERE i <@ '[-1, 1]'::int4range ORDER BY i;
+SELECT * FROM test_int4 WHERE i <@ '(-1, 1]'::int4range ORDER BY i;
+SELECT * FROM test_int4 WHERE i <@ '[-1, 1)'::int4range ORDER BY i;
+SELECT * FROM test_int4 WHERE i <@ '(-1, 1)'::int4range ORDER BY i;
+
+SELECT * FROM test_int4 WHERE i <@ int4range(-1, 1) ORDER BY i;
+SELECT * FROM test_int4 WHERE i <@ int4range(NULL, 1) ORDER BY i;
+SELECT * FROM test_int4 WHERE i <@ int4range(-1, NULL) ORDER BY i;
+SELECT * FROM test_int4 WHERE i <@ int4range(NULL, NULL) ORDER BY i;
+
diff --git a/contrib/btree_gin/sql/int8.sql b/contrib/btree_gin/sql/int8.sql
index 4d9c287..0e3cf5f 100644
--- a/contrib/btree_gin/sql/int8.sql
+++ b/contrib/btree_gin/sql/int8.sql
@@ -13,3 +13,14 @@ SELECT * FROM test_int8 WHERE i<=1::int8 ORDER BY i;
SELECT * FROM test_int8 WHERE i=1::int8 ORDER BY i;
SELECT * FROM test_int8 WHERE i>=1::int8 ORDER BY i;
SELECT * FROM test_int8 WHERE i>1::int8 ORDER BY i;
+
+SELECT * FROM test_int8 WHERE i <@ '[-1, 1]'::int8range ORDER BY i;
+SELECT * FROM test_int8 WHERE i <@ '(-1, 1]'::int8range ORDER BY i;
+SELECT * FROM test_int8 WHERE i <@ '[-1, 1)'::int8range ORDER BY i;
+SELECT * FROM test_int8 WHERE i <@ '(-1, 1)'::int8range ORDER BY i;
+
+SELECT * FROM test_int8 WHERE i <@ int8range(-1, 1) ORDER BY i;
+SELECT * FROM test_int8 WHERE i <@ int8range(NULL, 1) ORDER BY i;
+SELECT * FROM test_int8 WHERE i <@ int8range(-1, NULL) ORDER BY i;
+SELECT * FROM test_int8 WHERE i <@ int8range(NULL, NULL) ORDER BY i;
+
diff --git a/contrib/btree_gin/sql/numeric.sql b/contrib/btree_gin/sql/numeric.sql
index dbaaa2c..6289ccf 100644
--- a/contrib/btree_gin/sql/numeric.sql
+++ b/contrib/btree_gin/sql/numeric.sql
@@ -13,3 +13,14 @@ SELECT * FROM test_numeric WHERE i<='1'::numeric ORDER BY i;
SELECT * FROM test_numeric WHERE i='1'::numeric ORDER BY i;
SELECT * FROM test_numeric WHERE i>='1'::numeric ORDER BY i;
SELECT * FROM test_numeric WHERE i>'1'::numeric ORDER BY i;
+
+SELECT * FROM test_numeric WHERE i <@ '[-1, 1]'::numrange ORDER BY i;
+SELECT * FROM test_numeric WHERE i <@ '(-1, 1]'::numrange ORDER BY i;
+SELECT * FROM test_numeric WHERE i <@ '[-1, 1)'::numrange ORDER BY i;
+SELECT * FROM test_numeric WHERE i <@ '(-1, 1)'::numrange ORDER BY i;
+
+SELECT * FROM test_numeric WHERE i <@ numrange(-1, 1) ORDER BY i;
+SELECT * FROM test_numeric WHERE i <@ numrange(NULL, 1) ORDER BY i;
+SELECT * FROM test_numeric WHERE i <@ numrange(-1, NULL) ORDER BY i;
+SELECT * FROM test_numeric WHERE i <@ numrange(NULL, NULL) ORDER BY i;
+
diff --git a/contrib/btree_gin/sql/timestamp.sql b/contrib/btree_gin/sql/timestamp.sql
index 56727e8..8876257 100644
--- a/contrib/btree_gin/sql/timestamp.sql
+++ b/contrib/btree_gin/sql/timestamp.sql
@@ -20,3 +20,14 @@ SELECT * FROM test_timestamp WHERE i<='2004-10-26 08:55:08'::timestamp ORDER BY
SELECT * FROM test_timestamp WHERE i='2004-10-26 08:55:08'::timestamp ORDER BY i;
SELECT * FROM test_timestamp WHERE i>='2004-10-26 08:55:08'::timestamp ORDER BY i;
SELECT * FROM test_timestamp WHERE i>'2004-10-26 08:55:08'::timestamp ORDER BY i;
+
+SELECT * FROM test_timestamp WHERE i <@ '[2004-10-26 04:55:08, 2004-10-26 09:55:08]'::tsrange ORDER BY i;
+SELECT * FROM test_timestamp WHERE i <@ '(2004-10-26 04:55:08, 2004-10-26 09:55:08]'::tsrange ORDER BY i;
+SELECT * FROM test_timestamp WHERE i <@ '[2004-10-26 04:55:08, 2004-10-26 09:55:08)'::tsrange ORDER BY i;
+SELECT * FROM test_timestamp WHERE i <@ '(2004-10-26 04:55:08, 2004-10-26 09:55:08)'::tsrange ORDER BY i;
+
+SELECT * FROM test_timestamp WHERE i <@ tsrange('2004-10-26 04:55:08', '2004-10-26 09:55:08') ORDER BY i;
+SELECT * FROM test_timestamp WHERE i <@ tsrange(NULL, '2004-10-26 09:55:08') ORDER BY i;
+SELECT * FROM test_timestamp WHERE i <@ tsrange('2004-10-26 04:55:08', NULL) ORDER BY i;
+SELECT * FROM test_timestamp WHERE i <@ tsrange(NULL, NULL) ORDER BY i;
+
diff --git a/contrib/btree_gin/sql/timestamptz.sql b/contrib/btree_gin/sql/timestamptz.sql
index e6cfdb1..7058e4a 100644
--- a/contrib/btree_gin/sql/timestamptz.sql
+++ b/contrib/btree_gin/sql/timestamptz.sql
@@ -20,3 +20,14 @@ SELECT * FROM test_timestamptz WHERE i<='2004-10-26 08:55:08'::timestamptz ORDER
SELECT * FROM test_timestamptz WHERE i='2004-10-26 08:55:08'::timestamptz ORDER BY i;
SELECT * FROM test_timestamptz WHERE i>='2004-10-26 08:55:08'::timestamptz ORDER BY i;
SELECT * FROM test_timestamptz WHERE i>'2004-10-26 08:55:08'::timestamptz ORDER BY i;
+
+SELECT * FROM test_timestamptz WHERE i <@ '[2004-10-26 04:55:08, 2004-10-26 09:55:08]'::tstzrange ORDER BY i;
+SELECT * FROM test_timestamptz WHERE i <@ '(2004-10-26 04:55:08, 2004-10-26 09:55:08]'::tstzrange ORDER BY i;
+SELECT * FROM test_timestamptz WHERE i <@ '[2004-10-26 04:55:08, 2004-10-26 09:55:08)'::tstzrange ORDER BY i;
+SELECT * FROM test_timestamptz WHERE i <@ '(2004-10-26 04:55:08, 2004-10-26 09:55:08)'::tstzrange ORDER BY i;
+
+SELECT * FROM test_timestamptz WHERE i <@ tstzrange('2004-10-26 04:55:08', '2004-10-26 09:55:08') ORDER BY i;
+SELECT * FROM test_timestamptz WHERE i <@ tstzrange(NULL, '2004-10-26 09:55:08') ORDER BY i;
+SELECT * FROM test_timestamptz WHERE i <@ tstzrange('2004-10-26 04:55:08', NULL) ORDER BY i;
+SELECT * FROM test_timestamptz WHERE i <@ tstzrange(NULL, NULL) ORDER BY i;
+
diff --git a/doc/src/sgml/btree-gin.sgml b/doc/src/sgml/btree-gin.sgml
index 42b9e97..92b1573 100644
--- a/doc/src/sgml/btree-gin.sgml
+++ b/doc/src/sgml/btree-gin.sgml
@@ -11,12 +11,19 @@
<filename>btree_gin</> provides sample GIN operator classes that
implement B-tree equivalent behavior for the data types
<type>int2</>, <type>int4</>, <type>int8</>, <type>float4</>,
- <type>float8</>, <type>timestamp with time zone</>,
+ <type>float8</>, <type>numeric</>, <type>timestamp with time zone</>,
<type>timestamp without time zone</>, <type>time with time zone</>,
<type>time without time zone</>, <type>date</>, <type>interval</>,
<type>oid</>, <type>money</>, <type>"char"</>,
<type>varchar</>, <type>text</>, <type>bytea</>, <type>bit</>,
- <type>varbit</>, <type>macaddr</>, <type>inet</>, and <type>cidr</>.
+ <type>varbit</>, <type>macaddr</>, <type>inet</> and <type>cidr</>.
+ </para>
+
+ <para>
+ <filename>btree_gin</> also provides GIN index support for
+ <@ <type>range</> operations for types <type>int4</>, <type>int8</>,
+ <type>numeric</>, <type>timestamp with time zone</>,
+ <type>timestamp without time zone</> and <type>date</>.
</para>
<para>
@@ -47,7 +54,7 @@ SELECT * FROM test WHERE a < 10;
<title>Authors</title>
<para>
- Teodor Sigaev (<email>teo...@stack.net</email>) and
+ Teodor Sigaev (<email>teo...@sigaev.ru</email>) and
Oleg Bartunov (<email>o...@sai.msu.su</email>). See
<ulink url="http://www.sai.msu.su/~megera/oddmuse/index.cgi/Gin"></ulink>
for additional information.
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers