mirror of https://github.com/postgres/postgres
This will allow enums to be used in exclusion constraints. The code uses the new CallerFInfoFunctionCall infrastructure in fmgr, and the support for it added to btree_gist in commit 393bb504d7. Reviewed by Tom Lane and Anastasia Lubennikova Discussion: http://postgr.es/m/56EA8A71.8060107@dunslane.netpull/17/merge
parent
65a9138b9b
commit
f7946a92b6
@ -0,0 +1,187 @@ |
||||
/*
|
||||
* contrib/btree_gist/btree_enum.c |
||||
*/ |
||||
#include "postgres.h" |
||||
#include "fmgr.h" |
||||
#include "utils/builtins.h" |
||||
|
||||
#include "btree_gist.h" |
||||
#include "btree_utils_num.h" |
||||
|
||||
/* enums are really Oids, so we just use the same structure */ |
||||
|
||||
typedef struct |
||||
{ |
||||
Oid lower; |
||||
Oid upper; |
||||
} oidKEY; |
||||
|
||||
/*
|
||||
** enum ops |
||||
*/ |
||||
PG_FUNCTION_INFO_V1(gbt_enum_compress); |
||||
PG_FUNCTION_INFO_V1(gbt_enum_fetch); |
||||
PG_FUNCTION_INFO_V1(gbt_enum_union); |
||||
PG_FUNCTION_INFO_V1(gbt_enum_picksplit); |
||||
PG_FUNCTION_INFO_V1(gbt_enum_consistent); |
||||
PG_FUNCTION_INFO_V1(gbt_enum_penalty); |
||||
PG_FUNCTION_INFO_V1(gbt_enum_same); |
||||
|
||||
|
||||
static bool |
||||
gbt_enumgt(const void *a, const void *b, FmgrInfo *flinfo) |
||||
{ |
||||
return DatumGetBool( |
||||
CallerFInfoFunctionCall2(enum_gt, flinfo, InvalidOid, ObjectIdGetDatum(*((const Oid *) a)), ObjectIdGetDatum(*((const Oid *) b))) |
||||
); |
||||
} |
||||
static bool |
||||
gbt_enumge(const void *a, const void *b, FmgrInfo *flinfo) |
||||
{ |
||||
return DatumGetBool( |
||||
CallerFInfoFunctionCall2(enum_ge, flinfo, InvalidOid, ObjectIdGetDatum(*((const Oid *) a)), ObjectIdGetDatum(*((const Oid *) b))) |
||||
); |
||||
} |
||||
static bool |
||||
gbt_enumeq(const void *a, const void *b, FmgrInfo *flinfo) |
||||
{ |
||||
return (*((const Oid *) a) == *((const Oid *) b)); |
||||
} |
||||
static bool |
||||
gbt_enumle(const void *a, const void *b, FmgrInfo *flinfo) |
||||
{ |
||||
return DatumGetBool( |
||||
CallerFInfoFunctionCall2(enum_le, flinfo, InvalidOid, ObjectIdGetDatum(*((const Oid *) a)), ObjectIdGetDatum(*((const Oid *) b))) |
||||
); |
||||
} |
||||
static bool |
||||
gbt_enumlt(const void *a, const void *b, FmgrInfo *flinfo) |
||||
{ |
||||
return DatumGetBool( |
||||
CallerFInfoFunctionCall2(enum_lt, flinfo, InvalidOid, ObjectIdGetDatum(*((const Oid *) a)), ObjectIdGetDatum(*((const Oid *) b))) |
||||
); |
||||
} |
||||
|
||||
static int |
||||
gbt_enumkey_cmp(const void *a, const void *b, FmgrInfo *flinfo) |
||||
{ |
||||
oidKEY *ia = (oidKEY *) (((const Nsrt *) a)->t); |
||||
oidKEY *ib = (oidKEY *) (((const Nsrt *) b)->t); |
||||
|
||||
if (ia->lower == ib->lower) |
||||
{ |
||||
if (ia->upper == ib->upper) |
||||
return 0; |
||||
|
||||
return DatumGetInt32( |
||||
CallerFInfoFunctionCall2(enum_cmp, flinfo, InvalidOid, ObjectIdGetDatum(ia->upper), ObjectIdGetDatum(ib->upper)) |
||||
); |
||||
} |
||||
|
||||
return DatumGetInt32( |
||||
CallerFInfoFunctionCall2(enum_cmp, flinfo, InvalidOid, ObjectIdGetDatum(ia->lower), ObjectIdGetDatum(ib->lower)) |
||||
); |
||||
} |
||||
|
||||
static const gbtree_ninfo tinfo = |
||||
{ |
||||
gbt_t_enum, |
||||
sizeof(Oid), |
||||
8, /* sizeof(gbtreekey8) */ |
||||
gbt_enumgt, |
||||
gbt_enumge, |
||||
gbt_enumeq, |
||||
gbt_enumle, |
||||
gbt_enumlt, |
||||
gbt_enumkey_cmp, |
||||
NULL /* no KNN support at least for now */ |
||||
}; |
||||
|
||||
|
||||
/**************************************************
|
||||
* Enum ops |
||||
**************************************************/ |
||||
|
||||
|
||||
Datum |
||||
gbt_enum_compress(PG_FUNCTION_ARGS) |
||||
{ |
||||
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); |
||||
|
||||
PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo)); |
||||
} |
||||
|
||||
Datum |
||||
gbt_enum_fetch(PG_FUNCTION_ARGS) |
||||
{ |
||||
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); |
||||
|
||||
PG_RETURN_POINTER(gbt_num_fetch(entry, &tinfo)); |
||||
} |
||||
|
||||
Datum |
||||
gbt_enum_consistent(PG_FUNCTION_ARGS) |
||||
{ |
||||
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); |
||||
Oid query = PG_GETARG_OID(1); |
||||
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); |
||||
|
||||
/* Oid subtype = PG_GETARG_OID(3); */ |
||||
bool *recheck = (bool *) PG_GETARG_POINTER(4); |
||||
oidKEY *kkk = (oidKEY *) DatumGetPointer(entry->key); |
||||
GBT_NUMKEY_R key; |
||||
|
||||
/* All cases served by this function are exact */ |
||||
*recheck = false; |
||||
|
||||
key.lower = (GBT_NUMKEY *) &kkk->lower; |
||||
key.upper = (GBT_NUMKEY *) &kkk->upper; |
||||
|
||||
PG_RETURN_BOOL( |
||||
gbt_num_consistent(&key, (void *) &query, &strategy, GIST_LEAF(entry), &tinfo, fcinfo->flinfo) |
||||
); |
||||
} |
||||
|
||||
Datum |
||||
gbt_enum_union(PG_FUNCTION_ARGS) |
||||
{ |
||||
GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); |
||||
void *out = palloc(sizeof(oidKEY)); |
||||
|
||||
*(int *) PG_GETARG_POINTER(1) = sizeof(oidKEY); |
||||
PG_RETURN_POINTER(gbt_num_union((void *) out, entryvec, &tinfo, fcinfo->flinfo)); |
||||
} |
||||
|
||||
|
||||
Datum |
||||
gbt_enum_penalty(PG_FUNCTION_ARGS) |
||||
{ |
||||
oidKEY *origentry = (oidKEY *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(0))->key); |
||||
oidKEY *newentry = (oidKEY *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(1))->key); |
||||
float *result = (float *) PG_GETARG_POINTER(2); |
||||
|
||||
penalty_num(result, origentry->lower, origentry->upper, newentry->lower, newentry->upper); |
||||
|
||||
PG_RETURN_POINTER(result); |
||||
} |
||||
|
||||
Datum |
||||
gbt_enum_picksplit(PG_FUNCTION_ARGS) |
||||
{ |
||||
PG_RETURN_POINTER(gbt_num_picksplit( |
||||
(GistEntryVector *) PG_GETARG_POINTER(0), |
||||
(GIST_SPLITVEC *) PG_GETARG_POINTER(1), |
||||
&tinfo, fcinfo->flinfo |
||||
)); |
||||
} |
||||
|
||||
Datum |
||||
gbt_enum_same(PG_FUNCTION_ARGS) |
||||
{ |
||||
oidKEY *b1 = (oidKEY *) PG_GETARG_POINTER(0); |
||||
oidKEY *b2 = (oidKEY *) PG_GETARG_POINTER(1); |
||||
bool *result = (bool *) PG_GETARG_POINTER(2); |
||||
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo); |
||||
PG_RETURN_POINTER(result); |
||||
} |
@ -0,0 +1,69 @@ |
||||
/* contrib/btree_gist/btree_gist--1.4--1.5.sql */ |
||||
|
||||
-- complain if script is sourced in psql, rather than via CREATE EXTENSION |
||||
\echo Use "ALTER EXTENSION btree_gist UPDATE TO '1.5'" to load this file. \quit |
||||
|
||||
-- |
||||
-- |
||||
-- |
||||
-- enum ops |
||||
-- |
||||
-- |
||||
-- |
||||
-- define the GiST support methods |
||||
CREATE FUNCTION gbt_enum_consistent(internal,anyenum,int2,oid,internal) |
||||
RETURNS bool |
||||
AS 'MODULE_PATHNAME' |
||||
LANGUAGE C IMMUTABLE STRICT; |
||||
|
||||
CREATE FUNCTION gbt_enum_compress(internal) |
||||
RETURNS internal |
||||
AS 'MODULE_PATHNAME' |
||||
LANGUAGE C IMMUTABLE STRICT; |
||||
|
||||
CREATE FUNCTION gbt_enum_fetch(internal) |
||||
RETURNS internal |
||||
AS 'MODULE_PATHNAME' |
||||
LANGUAGE C IMMUTABLE STRICT; |
||||
|
||||
CREATE FUNCTION gbt_enum_penalty(internal,internal,internal) |
||||
RETURNS internal |
||||
AS 'MODULE_PATHNAME' |
||||
LANGUAGE C IMMUTABLE STRICT; |
||||
|
||||
CREATE FUNCTION gbt_enum_picksplit(internal, internal) |
||||
RETURNS internal |
||||
AS 'MODULE_PATHNAME' |
||||
LANGUAGE C IMMUTABLE STRICT; |
||||
|
||||
CREATE FUNCTION gbt_enum_union(internal, internal) |
||||
RETURNS gbtreekey8 |
||||
AS 'MODULE_PATHNAME' |
||||
LANGUAGE C IMMUTABLE STRICT; |
||||
|
||||
CREATE FUNCTION gbt_enum_same(gbtreekey8, gbtreekey8, internal) |
||||
RETURNS internal |
||||
AS 'MODULE_PATHNAME' |
||||
LANGUAGE C IMMUTABLE STRICT; |
||||
|
||||
-- Create the operator class |
||||
CREATE OPERATOR CLASS gist_enum_ops |
||||
DEFAULT FOR TYPE anyenum USING gist |
||||
AS |
||||
OPERATOR 1 < , |
||||
OPERATOR 2 <= , |
||||
OPERATOR 3 = , |
||||
OPERATOR 4 >= , |
||||
OPERATOR 5 > , |
||||
FUNCTION 1 gbt_enum_consistent (internal, anyenum, int2, oid, internal), |
||||
FUNCTION 2 gbt_enum_union (internal, internal), |
||||
FUNCTION 3 gbt_enum_compress (internal), |
||||
FUNCTION 4 gbt_decompress (internal), |
||||
FUNCTION 5 gbt_enum_penalty (internal, internal, internal), |
||||
FUNCTION 6 gbt_enum_picksplit (internal, internal), |
||||
FUNCTION 7 gbt_enum_same (gbtreekey8, gbtreekey8, internal), |
||||
STORAGE gbtreekey8; |
||||
|
||||
ALTER OPERATOR FAMILY gist_enum_ops USING gist ADD |
||||
OPERATOR 6 <> (anyenum, anyenum) , |
||||
FUNCTION 9 (anyenum, anyenum) gbt_enum_fetch (internal) ; |
@ -1,5 +1,5 @@ |
||||
# btree_gist extension |
||||
comment = 'support for indexing common datatypes in GiST' |
||||
default_version = '1.4' |
||||
default_version = '1.5' |
||||
module_pathname = '$libdir/btree_gist' |
||||
relocatable = true |
||||
|
@ -0,0 +1,595 @@ |
||||
r |
||||
v |
||||
i |
||||
b |
||||
r |
||||
\N |
||||
y |
||||
v |
||||
g |
||||
o |
||||
y |
||||
b |
||||
o |
||||
o |
||||
o |
||||
o |
||||
v |
||||
r |
||||
i |
||||
o |
||||
b |
||||
r |
||||
g |
||||
b |
||||
i |
||||
o |
||||
r |
||||
r |
||||
r |
||||
\N |
||||
o |
||||
b |
||||
v |
||||
y |
||||
o |
||||
\N |
||||
i |
||||
o |
||||
o |
||||
g |
||||
g |
||||
b |
||||
y |
||||
v |
||||
g |
||||
g |
||||
\N |
||||
v |
||||
g |
||||
i |
||||
i |
||||
\N |
||||
v |
||||
y |
||||
i |
||||
r |
||||
\N |
||||
r |
||||
\N |
||||
g |
||||
\N |
||||
g |
||||
\N |
||||
v |
||||
g |
||||
y |
||||
v |
||||
r |
||||
v |
||||
r |
||||
v |
||||
y |
||||
i |
||||
i |
||||
v |
||||
y |
||||
v |
||||
i |
||||
b |
||||
i |
||||
i |
||||
r |
||||
r |
||||
\N |
||||
\N |
||||
y |
||||
r |
||||
g |
||||
i |
||||
y |
||||
i |
||||
i |
||||
r |
||||
g |
||||
y |
||||
\N |
||||
i |
||||
o |
||||
r |
||||
y |
||||
y |
||||
g |
||||
o |
||||
o |
||||
g |
||||
y |
||||
r |
||||
g |
||||
v |
||||
r |
||||
i |
||||
r |
||||
i |
||||
r |
||||
y |
||||
v |
||||
b |
||||
i |
||||
o |
||||
r |
||||
\N |
||||
o |
||||
i |
||||
v |
||||
o |
||||
b |
||||
\N |
||||
b |
||||
g |
||||
y |
||||
o |
||||
v |
||||
b |
||||
i |
||||
v |
||||
v |
||||
o |
||||
y |
||||
i |
||||
i |
||||
i |
||||
g |
||||
b |
||||
b |
||||
g |
||||
r |
||||
i |
||||
y |
||||
o |
||||
\N |
||||
r |
||||
\N |
||||
i |
||||
i |
||||
g |
||||
v |
||||
o |
||||
y |
||||
y |
||||
o |
||||
i |
||||
b |
||||
r |
||||
y |
||||
y |
||||
o |
||||
g |
||||
g |
||||
g |
||||
\N |
||||
y |
||||
o |
||||
v |
||||
g |
||||
y |
||||
g |
||||
v |
||||
\N |
||||
i |
||||
o |
||||
v |
||||
b |
||||
b |
||||
\N |
||||
y |
||||
v |
||||
\N |
||||
v |
||||
\N |
||||
i |
||||
\N |
||||
r |
||||
b |
||||
r |
||||
o |
||||
r |
||||
b |
||||
o |
||||
g |
||||
i |
||||
r |
||||
b |
||||
g |
||||
g |
||||
y |
||||
b |
||||
b |
||||
g |
||||
y |
||||
g |
||||
v |
||||
v |
||||
b |
||||
\N |
||||
i |
||||
v |
||||
y |
||||
b |
||||
b |
||||
o |
||||
g |
||||
b |
||||
v |
||||
g |
||||
g |
||||
b |
||||
\N |
||||
y |
||||
r |
||||
r |
||||
b |
||||
\N |
||||
r |
||||
g |
||||
i |
||||
o |
||||
v |
||||
\N |
||||
o |
||||
r |
||||
b |
||||
o |
||||
b |
||||
i |
||||
\N |
||||
\N |
||||
y |
||||
b |
||||
y |
||||
\N |
||||
i |
||||
i |
||||
i |
||||
o |
||||
y |
||||
o |
||||
i |
||||
b |
||||
o |
||||
g |
||||
r |
||||
\N |
||||
b |
||||
y |
||||
\N |
||||
g |
||||
b |
||||
y |
||||
y |
||||
o |
||||
o |
||||
b |
||||
g |
||||
i |
||||
i |
||||
v |
||||
b |
||||
o |
||||
o |
||||
v |
||||
i |
||||
g |
||||
i |
||||
o |
||||
r |
||||
o |
||||
i |
||||
i |
||||
r |
||||
b |
||||
g |
||||
o |
||||
o |
||||
y |
||||
v |
||||
g |
||||
g |
||||
g |
||||
r |
||||
o |
||||
i |
||||
i |
||||
g |
||||
\N |
||||
o |
||||
v |
||||
b |
||||
b |
||||
v |
||||
i |
||||
g |
||||
y |
||||
i |
||||
i |
||||
g |
||||
r |
||||
y |
||||
i |
||||
b |
||||
\N |
||||
g |
||||
y |
||||
o |
||||
\N |
||||
i |
||||
i |
||||
b |
||||
v |
||||
o |
||||
b |
||||
v |
||||
r |
||||
g |
||||
o |
||||
v |
||||
v |
||||
y |
||||
r |
||||
v |
||||
g |
||||
\N |
||||
v |
||||
v |
||||
b |
||||
y |
||||
o |
||||
g |
||||
i |
||||
o |
||||
b |
||||
r |
||||
y |
||||
r |
||||
v |
||||
b |
||||
b |
||||
\N |
||||
i |
||||
v |
||||
y |
||||
r |
||||
b |
||||
i |
||||
y |
||||
g |
||||
\N |
||||
g |
||||
r |
||||
y |
||||
y |
||||
g |
||||
b |
||||
o |
||||
v |
||||
r |
||||
i |
||||
g |
||||
r |
||||
b |
||||
b |
||||
b |
||||
\N |
||||
y |
||||
y |
||||
y |
||||
i |
||||
o |
||||
r |
||||
g |
||||
g |
||||
i |
||||
y |
||||
g |
||||
y |
||||
v |
||||
o |
||||
o |
||||
g |
||||
\N |
||||
b |
||||
v |
||||
o |
||||
y |
||||
r |
||||
\N |
||||
o |
||||
i |
||||
g |
||||
\N |
||||
i |
||||
i |
||||
i |
||||
o |
||||
b |
||||
\N |
||||
\N |
||||
b |
||||
\N |
||||
v |
||||
v |
||||
r |
||||
\N |
||||
o |
||||
b |
||||
r |
||||
o |
||||
b |
||||
o |
||||
r |
||||
y |
||||
\N |
||||
r |
||||
i |
||||
b |
||||
b |
||||
y |
||||
v |
||||
r |
||||
g |
||||
r |
||||
r |
||||
\N |
||||
g |
||||
\N |
||||
v |
||||
v |
||||
y |
||||
r |
||||
o |
||||
r |
||||
o |
||||
i |
||||
o |
||||
\N |
||||
r |
||||
\N |
||||
i |
||||
v |
||||
b |
||||
v |
||||
\N |
||||
b |
||||
r |
||||
v |
||||
o |
||||
\N |
||||
i |
||||
r |
||||
b |
||||
g |
||||
o |
||||
\N |
||||
o |
||||
g |
||||
r |
||||
v |
||||
y |
||||
g |
||||
v |
||||
r |
||||
b |
||||
r |
||||
v |
||||
o |
||||
g |
||||
i |
||||
i |
||||
g |
||||
i |
||||
y |
||||
b |
||||
i |
||||
y |
||||
r |
||||
y |
||||
o |
||||
r |
||||
b |
||||
y |
||||
y |
||||
b |
||||
y |
||||
g |
||||
b |
||||
\N |
||||
r |
||||
g |
||||
b |
||||
o |
||||
y |
||||
o |
||||
g |
||||
r |
||||
g |
||||
b |
||||
\N |
||||
v |
||||
v |
||||
v |
||||
g |
||||
b |
||||
y |
||||
v |
||||
o |
||||
v |
||||
g |
||||
o |
||||
g |
||||
i |
||||
b |
||||
v |
||||
i |
||||
r |
||||
r |
||||
i |
||||
b |
||||
i |
||||
b |
||||
o |
||||
\N |
||||
\N |
||||
y |
||||
r |
||||
g |
||||
v |
||||
o |
||||
y |
||||
\N |
||||
g |
||||
v |
||||
o |
||||
b |
||||
v |
||||
v |
||||
\N |
||||
r |
||||
v |
||||
y |
||||
g |
||||
b |
||||
o |
||||
v |
||||
b |
||||
v |
||||
b |
||||
r |
||||
r |
||||
i |
||||
r |
||||
v |
||||
y |
||||
v |
||||
y |
||||
o |
||||
v |
||||
g |
||||
i |
||||
r |
||||
o |
||||
o |
||||
i |
||||
y |
||||
r |
||||
\N |
||||
y |
||||
r |
||||
b |
||||
y |
||||
y |
||||
\N |
||||
b |
||||
\N |
||||
\N |
||||
i |
||||
v |
@ -0,0 +1,91 @@ |
||||
-- enum check |
||||
create type rainbow as enum ('r','o','y','g','b','i','v'); |
||||
CREATE TABLE enumtmp (a rainbow); |
||||
\copy enumtmp from 'data/enum.data' |
||||
SET enable_seqscan=on; |
||||
select a, count(*) from enumtmp group by a order by 1; |
||||
a | count |
||||
---+------- |
||||
r | 76 |
||||
o | 78 |
||||
y | 73 |
||||
g | 75 |
||||
b | 77 |
||||
i | 78 |
||||
v | 75 |
||||
| 63 |
||||
(8 rows) |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a < 'g'::rainbow; |
||||
count |
||||
------- |
||||
227 |
||||
(1 row) |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a <= 'g'::rainbow; |
||||
count |
||||
------- |
||||
302 |
||||
(1 row) |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a = 'g'::rainbow; |
||||
count |
||||
------- |
||||
75 |
||||
(1 row) |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a >= 'g'::rainbow; |
||||
count |
||||
------- |
||||
305 |
||||
(1 row) |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a > 'g'::rainbow; |
||||
count |
||||
------- |
||||
230 |
||||
(1 row) |
||||
|
||||
CREATE INDEX enumidx ON enumtmp USING gist ( a ); |
||||
SET enable_seqscan=off; |
||||
SELECT count(*) FROM enumtmp WHERE a < 'g'::rainbow; |
||||
count |
||||
------- |
||||
227 |
||||
(1 row) |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a <= 'g'::rainbow; |
||||
count |
||||
------- |
||||
302 |
||||
(1 row) |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a = 'g'::rainbow; |
||||
count |
||||
------- |
||||
75 |
||||
(1 row) |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a >= 'g'::rainbow; |
||||
count |
||||
------- |
||||
305 |
||||
(1 row) |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a > 'g'::rainbow; |
||||
count |
||||
------- |
||||
230 |
||||
(1 row) |
||||
|
||||
EXPLAIN (COSTS OFF) |
||||
SELECT count(*) FROM enumtmp WHERE a >= 'g'::rainbow; |
||||
QUERY PLAN |
||||
----------------------------------------------- |
||||
Aggregate |
||||
-> Bitmap Heap Scan on enumtmp |
||||
Recheck Cond: (a >= 'g'::rainbow) |
||||
-> Bitmap Index Scan on enumidx |
||||
Index Cond: (a >= 'g'::rainbow) |
||||
(5 rows) |
||||
|
@ -0,0 +1,38 @@ |
||||
-- enum check |
||||
|
||||
create type rainbow as enum ('r','o','y','g','b','i','v'); |
||||
|
||||
CREATE TABLE enumtmp (a rainbow); |
||||
|
||||
\copy enumtmp from 'data/enum.data' |
||||
|
||||
SET enable_seqscan=on; |
||||
|
||||
select a, count(*) from enumtmp group by a order by 1; |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a < 'g'::rainbow; |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a <= 'g'::rainbow; |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a = 'g'::rainbow; |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a >= 'g'::rainbow; |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a > 'g'::rainbow; |
||||
|
||||
CREATE INDEX enumidx ON enumtmp USING gist ( a ); |
||||
|
||||
SET enable_seqscan=off; |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a < 'g'::rainbow; |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a <= 'g'::rainbow; |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a = 'g'::rainbow; |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a >= 'g'::rainbow; |
||||
|
||||
SELECT count(*) FROM enumtmp WHERE a > 'g'::rainbow; |
||||
|
||||
EXPLAIN (COSTS OFF) |
||||
SELECT count(*) FROM enumtmp WHERE a >= 'g'::rainbow; |
Loading…
Reference in new issue