2008-05-17 03:28:26 +02:00
|
|
|
/*
|
2010-09-20 22:08:53 +02:00
|
|
|
* contrib/btree_gist/btree_text.c
|
2008-05-17 03:28:26 +02:00
|
|
|
*/
|
2011-08-27 03:16:24 +02:00
|
|
|
#include "postgres.h"
|
|
|
|
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
#include "btree_gist.h"
|
|
|
|
#include "btree_utils_var.h"
|
|
|
|
#include "utils/builtins.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
** Text ops
|
|
|
|
*/
|
|
|
|
PG_FUNCTION_INFO_V1(gbt_text_compress);
|
|
|
|
PG_FUNCTION_INFO_V1(gbt_bpchar_compress);
|
|
|
|
PG_FUNCTION_INFO_V1(gbt_text_union);
|
|
|
|
PG_FUNCTION_INFO_V1(gbt_text_picksplit);
|
|
|
|
PG_FUNCTION_INFO_V1(gbt_text_consistent);
|
|
|
|
PG_FUNCTION_INFO_V1(gbt_bpchar_consistent);
|
|
|
|
PG_FUNCTION_INFO_V1(gbt_text_penalty);
|
|
|
|
PG_FUNCTION_INFO_V1(gbt_text_same);
|
|
|
|
|
|
|
|
|
|
|
|
/* define for comparison */
|
|
|
|
|
2004-08-29 07:07:03 +02:00
|
|
|
static bool
|
2017-03-21 14:53:35 +01:00
|
|
|
gbt_textgt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
{
|
2011-04-13 01:19:24 +02:00
|
|
|
return DatumGetBool(DirectFunctionCall2Coll(text_gt,
|
2011-04-23 02:19:58 +02:00
|
|
|
collation,
|
2011-04-13 01:19:24 +02:00
|
|
|
PointerGetDatum(a),
|
|
|
|
PointerGetDatum(b)));
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
}
|
|
|
|
|
2004-08-29 07:07:03 +02:00
|
|
|
static bool
|
2017-03-21 14:53:35 +01:00
|
|
|
gbt_textge(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
{
|
2011-04-13 01:19:24 +02:00
|
|
|
return DatumGetBool(DirectFunctionCall2Coll(text_ge,
|
2011-04-23 02:19:58 +02:00
|
|
|
collation,
|
2011-04-13 01:19:24 +02:00
|
|
|
PointerGetDatum(a),
|
|
|
|
PointerGetDatum(b)));
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
}
|
|
|
|
|
2004-08-29 07:07:03 +02:00
|
|
|
static bool
|
2017-03-21 14:53:35 +01:00
|
|
|
gbt_texteq(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
{
|
2011-04-13 01:19:24 +02:00
|
|
|
return DatumGetBool(DirectFunctionCall2Coll(texteq,
|
2011-04-23 02:19:58 +02:00
|
|
|
collation,
|
2011-04-13 01:19:24 +02:00
|
|
|
PointerGetDatum(a),
|
|
|
|
PointerGetDatum(b)));
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
}
|
|
|
|
|
2004-08-29 07:07:03 +02:00
|
|
|
static bool
|
2017-03-21 14:53:35 +01:00
|
|
|
gbt_textle(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
{
|
2011-04-13 01:19:24 +02:00
|
|
|
return DatumGetBool(DirectFunctionCall2Coll(text_le,
|
2011-04-23 02:19:58 +02:00
|
|
|
collation,
|
2011-04-13 01:19:24 +02:00
|
|
|
PointerGetDatum(a),
|
|
|
|
PointerGetDatum(b)));
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
}
|
|
|
|
|
2004-08-29 07:07:03 +02:00
|
|
|
static bool
|
2017-03-21 14:53:35 +01:00
|
|
|
gbt_textlt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
{
|
2011-04-13 01:19:24 +02:00
|
|
|
return DatumGetBool(DirectFunctionCall2Coll(text_lt,
|
2011-04-23 02:19:58 +02:00
|
|
|
collation,
|
2011-04-13 01:19:24 +02:00
|
|
|
PointerGetDatum(a),
|
|
|
|
PointerGetDatum(b)));
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
}
|
|
|
|
|
2004-08-29 07:07:03 +02:00
|
|
|
static int32
|
2017-03-21 14:53:35 +01:00
|
|
|
gbt_textcmp(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
{
|
2011-04-13 01:19:24 +02:00
|
|
|
return DatumGetInt32(DirectFunctionCall2Coll(bttextcmp,
|
2011-04-23 02:19:58 +02:00
|
|
|
collation,
|
2011-04-13 01:19:24 +02:00
|
|
|
PointerGetDatum(a),
|
|
|
|
PointerGetDatum(b)));
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
}
|
2004-08-29 07:07:03 +02:00
|
|
|
|
2005-07-01 15:44:56 +02:00
|
|
|
static gbtree_vinfo tinfo =
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
{
|
2004-08-29 07:07:03 +02:00
|
|
|
gbt_t_text,
|
2005-07-01 15:44:56 +02:00
|
|
|
0,
|
2017-08-16 06:22:32 +02:00
|
|
|
false,
|
2004-08-29 07:07:03 +02:00
|
|
|
gbt_textgt,
|
|
|
|
gbt_textge,
|
|
|
|
gbt_texteq,
|
|
|
|
gbt_textle,
|
|
|
|
gbt_textlt,
|
|
|
|
gbt_textcmp,
|
2005-03-01 16:40:04 +01:00
|
|
|
NULL
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
};
|
|
|
|
|
Fix results of index-only scans on btree_gist char(N) indexes.
If contrib/btree_gist is used to make a GIST index on a char(N)
(bpchar) column, and that column is retrieved via an index-only
scan, what came out had all trailing spaces removed. Since
that doesn't happen in any other kind of table scan, this is
clearly a bug. The cause is that gbt_bpchar_compress() strips
trailing spaces (using rtrim1) before a new index entry is made.
That was probably a good idea when this code was first written,
but since we invented index-only scans, it's not so good.
One answer could be to mark this opclass as incapable of index-only
scans. But to do so, we'd need an extension module version bump,
followed by manual action by DBAs to install the updated version
of btree_gist. And it's not really a desirable place to end up,
anyway.
Instead, let's fix the code by removing the unwanted space-stripping
action and adjusting the opclass's comparison logic to ignore
trailing spaces as bpchar normally does. This will not hinder
cases that work today, since index searches with this logic will
act the same whether trailing spaces are stored or not. It will
not by itself fix the problem of getting space-stripped results
from index-only scans, of course. Users who care about that can
REINDEX affected indexes after installing this update, to immediately
replace all improperly-truncated index entries. Otherwise, it can
be expected that the index's behavior will change incrementally as
old entries are replaced by new ones.
Per report from Alexander Lakhin. Back-patch to all supported branches.
Discussion: https://postgr.es/m/696c995b-b37f-5526-f45d-04abe713179f@gmail.com
2022-01-08 20:54:39 +01:00
|
|
|
/* bpchar needs its own comparison rules */
|
|
|
|
|
|
|
|
static bool
|
|
|
|
gbt_bpchargt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
|
|
|
|
{
|
|
|
|
return DatumGetBool(DirectFunctionCall2Coll(bpchargt,
|
|
|
|
collation,
|
|
|
|
PointerGetDatum(a),
|
|
|
|
PointerGetDatum(b)));
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool
|
|
|
|
gbt_bpcharge(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
|
|
|
|
{
|
|
|
|
return DatumGetBool(DirectFunctionCall2Coll(bpcharge,
|
|
|
|
collation,
|
|
|
|
PointerGetDatum(a),
|
|
|
|
PointerGetDatum(b)));
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool
|
|
|
|
gbt_bpchareq(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
|
|
|
|
{
|
|
|
|
return DatumGetBool(DirectFunctionCall2Coll(bpchareq,
|
|
|
|
collation,
|
|
|
|
PointerGetDatum(a),
|
|
|
|
PointerGetDatum(b)));
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool
|
|
|
|
gbt_bpcharle(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
|
|
|
|
{
|
|
|
|
return DatumGetBool(DirectFunctionCall2Coll(bpcharle,
|
|
|
|
collation,
|
|
|
|
PointerGetDatum(a),
|
|
|
|
PointerGetDatum(b)));
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool
|
|
|
|
gbt_bpcharlt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
|
|
|
|
{
|
|
|
|
return DatumGetBool(DirectFunctionCall2Coll(bpcharlt,
|
|
|
|
collation,
|
|
|
|
PointerGetDatum(a),
|
|
|
|
PointerGetDatum(b)));
|
|
|
|
}
|
|
|
|
|
|
|
|
static int32
|
|
|
|
gbt_bpcharcmp(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
|
|
|
|
{
|
|
|
|
return DatumGetInt32(DirectFunctionCall2Coll(bpcharcmp,
|
|
|
|
collation,
|
|
|
|
PointerGetDatum(a),
|
|
|
|
PointerGetDatum(b)));
|
|
|
|
}
|
|
|
|
|
|
|
|
static gbtree_vinfo bptinfo =
|
|
|
|
{
|
|
|
|
gbt_t_bpchar,
|
|
|
|
0,
|
|
|
|
false,
|
|
|
|
gbt_bpchargt,
|
|
|
|
gbt_bpcharge,
|
|
|
|
gbt_bpchareq,
|
|
|
|
gbt_bpcharle,
|
|
|
|
gbt_bpcharlt,
|
|
|
|
gbt_bpcharcmp,
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
|
|
|
|
/**************************************************
|
|
|
|
* Text ops
|
|
|
|
**************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
Datum
|
2004-08-29 07:07:03 +02:00
|
|
|
gbt_text_compress(PG_FUNCTION_ARGS)
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
{
|
2004-08-29 07:07:03 +02:00
|
|
|
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
|
|
|
|
|
2005-10-15 04:49:52 +02:00
|
|
|
if (tinfo.eml == 0)
|
2005-07-01 15:44:56 +02:00
|
|
|
{
|
|
|
|
tinfo.eml = pg_database_encoding_max_length();
|
|
|
|
}
|
|
|
|
|
2004-08-29 07:07:03 +02:00
|
|
|
PG_RETURN_POINTER(gbt_var_compress(entry, &tinfo));
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Datum
|
2004-08-29 07:07:03 +02:00
|
|
|
gbt_bpchar_compress(PG_FUNCTION_ARGS)
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
{
|
Fix results of index-only scans on btree_gist char(N) indexes.
If contrib/btree_gist is used to make a GIST index on a char(N)
(bpchar) column, and that column is retrieved via an index-only
scan, what came out had all trailing spaces removed. Since
that doesn't happen in any other kind of table scan, this is
clearly a bug. The cause is that gbt_bpchar_compress() strips
trailing spaces (using rtrim1) before a new index entry is made.
That was probably a good idea when this code was first written,
but since we invented index-only scans, it's not so good.
One answer could be to mark this opclass as incapable of index-only
scans. But to do so, we'd need an extension module version bump,
followed by manual action by DBAs to install the updated version
of btree_gist. And it's not really a desirable place to end up,
anyway.
Instead, let's fix the code by removing the unwanted space-stripping
action and adjusting the opclass's comparison logic to ignore
trailing spaces as bpchar normally does. This will not hinder
cases that work today, since index searches with this logic will
act the same whether trailing spaces are stored or not. It will
not by itself fix the problem of getting space-stripped results
from index-only scans, of course. Users who care about that can
REINDEX affected indexes after installing this update, to immediately
replace all improperly-truncated index entries. Otherwise, it can
be expected that the index's behavior will change incrementally as
old entries are replaced by new ones.
Per report from Alexander Lakhin. Back-patch to all supported branches.
Discussion: https://postgr.es/m/696c995b-b37f-5526-f45d-04abe713179f@gmail.com
2022-01-08 20:54:39 +01:00
|
|
|
/* This should never have been distinct from gbt_text_compress */
|
|
|
|
return gbt_text_compress(fcinfo);
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Datum
|
|
|
|
gbt_text_consistent(PG_FUNCTION_ARGS)
|
|
|
|
{
|
2004-08-29 07:07:03 +02:00
|
|
|
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
|
|
|
|
void *query = (void *) DatumGetTextP(PG_GETARG_DATUM(1));
|
|
|
|
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
|
2009-06-11 16:49:15 +02:00
|
|
|
|
2008-04-14 19:05:34 +02:00
|
|
|
/* Oid subtype = PG_GETARG_OID(3); */
|
|
|
|
bool *recheck = (bool *) PG_GETARG_POINTER(4);
|
|
|
|
bool retval;
|
|
|
|
GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
|
2004-08-29 07:07:03 +02:00
|
|
|
GBT_VARKEY_R r = gbt_var_key_readable(key);
|
|
|
|
|
2008-04-14 19:05:34 +02:00
|
|
|
/* All cases served by this function are exact */
|
|
|
|
*recheck = false;
|
|
|
|
|
2005-10-15 04:49:52 +02:00
|
|
|
if (tinfo.eml == 0)
|
2005-07-01 15:44:56 +02:00
|
|
|
{
|
|
|
|
tinfo.eml = pg_database_encoding_max_length();
|
|
|
|
}
|
|
|
|
|
2011-04-23 02:19:58 +02:00
|
|
|
retval = gbt_var_consistent(&r, query, strategy, PG_GET_COLLATION(),
|
2017-03-21 14:53:35 +01:00
|
|
|
GIST_LEAF(entry), &tinfo, fcinfo->flinfo);
|
2004-08-29 07:07:03 +02:00
|
|
|
|
|
|
|
PG_RETURN_BOOL(retval);
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Datum
|
|
|
|
gbt_bpchar_consistent(PG_FUNCTION_ARGS)
|
|
|
|
{
|
2004-08-29 07:07:03 +02:00
|
|
|
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
|
2017-09-18 21:21:23 +02:00
|
|
|
void *query = (void *) DatumGetTextP(PG_GETARG_DATUM(1));
|
2004-08-29 07:07:03 +02:00
|
|
|
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
|
2009-06-11 16:49:15 +02:00
|
|
|
|
2008-04-14 19:05:34 +02:00
|
|
|
/* Oid subtype = PG_GETARG_OID(3); */
|
|
|
|
bool *recheck = (bool *) PG_GETARG_POINTER(4);
|
2005-05-21 14:08:06 +02:00
|
|
|
bool retval;
|
2008-04-14 19:05:34 +02:00
|
|
|
GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
|
2004-08-29 07:07:03 +02:00
|
|
|
GBT_VARKEY_R r = gbt_var_key_readable(key);
|
2008-04-14 19:05:34 +02:00
|
|
|
|
|
|
|
/* All cases served by this function are exact */
|
|
|
|
*recheck = false;
|
2004-08-29 07:07:03 +02:00
|
|
|
|
Fix results of index-only scans on btree_gist char(N) indexes.
If contrib/btree_gist is used to make a GIST index on a char(N)
(bpchar) column, and that column is retrieved via an index-only
scan, what came out had all trailing spaces removed. Since
that doesn't happen in any other kind of table scan, this is
clearly a bug. The cause is that gbt_bpchar_compress() strips
trailing spaces (using rtrim1) before a new index entry is made.
That was probably a good idea when this code was first written,
but since we invented index-only scans, it's not so good.
One answer could be to mark this opclass as incapable of index-only
scans. But to do so, we'd need an extension module version bump,
followed by manual action by DBAs to install the updated version
of btree_gist. And it's not really a desirable place to end up,
anyway.
Instead, let's fix the code by removing the unwanted space-stripping
action and adjusting the opclass's comparison logic to ignore
trailing spaces as bpchar normally does. This will not hinder
cases that work today, since index searches with this logic will
act the same whether trailing spaces are stored or not. It will
not by itself fix the problem of getting space-stripped results
from index-only scans, of course. Users who care about that can
REINDEX affected indexes after installing this update, to immediately
replace all improperly-truncated index entries. Otherwise, it can
be expected that the index's behavior will change incrementally as
old entries are replaced by new ones.
Per report from Alexander Lakhin. Back-patch to all supported branches.
Discussion: https://postgr.es/m/696c995b-b37f-5526-f45d-04abe713179f@gmail.com
2022-01-08 20:54:39 +01:00
|
|
|
if (bptinfo.eml == 0)
|
2005-07-01 15:44:56 +02:00
|
|
|
{
|
Fix results of index-only scans on btree_gist char(N) indexes.
If contrib/btree_gist is used to make a GIST index on a char(N)
(bpchar) column, and that column is retrieved via an index-only
scan, what came out had all trailing spaces removed. Since
that doesn't happen in any other kind of table scan, this is
clearly a bug. The cause is that gbt_bpchar_compress() strips
trailing spaces (using rtrim1) before a new index entry is made.
That was probably a good idea when this code was first written,
but since we invented index-only scans, it's not so good.
One answer could be to mark this opclass as incapable of index-only
scans. But to do so, we'd need an extension module version bump,
followed by manual action by DBAs to install the updated version
of btree_gist. And it's not really a desirable place to end up,
anyway.
Instead, let's fix the code by removing the unwanted space-stripping
action and adjusting the opclass's comparison logic to ignore
trailing spaces as bpchar normally does. This will not hinder
cases that work today, since index searches with this logic will
act the same whether trailing spaces are stored or not. It will
not by itself fix the problem of getting space-stripped results
from index-only scans, of course. Users who care about that can
REINDEX affected indexes after installing this update, to immediately
replace all improperly-truncated index entries. Otherwise, it can
be expected that the index's behavior will change incrementally as
old entries are replaced by new ones.
Per report from Alexander Lakhin. Back-patch to all supported branches.
Discussion: https://postgr.es/m/696c995b-b37f-5526-f45d-04abe713179f@gmail.com
2022-01-08 20:54:39 +01:00
|
|
|
bptinfo.eml = pg_database_encoding_max_length();
|
2005-07-01 15:44:56 +02:00
|
|
|
}
|
|
|
|
|
Fix results of index-only scans on btree_gist char(N) indexes.
If contrib/btree_gist is used to make a GIST index on a char(N)
(bpchar) column, and that column is retrieved via an index-only
scan, what came out had all trailing spaces removed. Since
that doesn't happen in any other kind of table scan, this is
clearly a bug. The cause is that gbt_bpchar_compress() strips
trailing spaces (using rtrim1) before a new index entry is made.
That was probably a good idea when this code was first written,
but since we invented index-only scans, it's not so good.
One answer could be to mark this opclass as incapable of index-only
scans. But to do so, we'd need an extension module version bump,
followed by manual action by DBAs to install the updated version
of btree_gist. And it's not really a desirable place to end up,
anyway.
Instead, let's fix the code by removing the unwanted space-stripping
action and adjusting the opclass's comparison logic to ignore
trailing spaces as bpchar normally does. This will not hinder
cases that work today, since index searches with this logic will
act the same whether trailing spaces are stored or not. It will
not by itself fix the problem of getting space-stripped results
from index-only scans, of course. Users who care about that can
REINDEX affected indexes after installing this update, to immediately
replace all improperly-truncated index entries. Otherwise, it can
be expected that the index's behavior will change incrementally as
old entries are replaced by new ones.
Per report from Alexander Lakhin. Back-patch to all supported branches.
Discussion: https://postgr.es/m/696c995b-b37f-5526-f45d-04abe713179f@gmail.com
2022-01-08 20:54:39 +01:00
|
|
|
retval = gbt_var_consistent(&r, query, strategy, PG_GET_COLLATION(),
|
|
|
|
GIST_LEAF(entry), &bptinfo, fcinfo->flinfo);
|
2004-08-29 07:07:03 +02:00
|
|
|
PG_RETURN_BOOL(retval);
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Datum
|
|
|
|
gbt_text_union(PG_FUNCTION_ARGS)
|
|
|
|
{
|
2004-08-29 07:07:03 +02:00
|
|
|
GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
|
|
|
|
int32 *size = (int *) PG_GETARG_POINTER(1);
|
|
|
|
|
2011-04-23 02:19:58 +02:00
|
|
|
PG_RETURN_POINTER(gbt_var_union(entryvec, size, PG_GET_COLLATION(),
|
2017-03-21 14:53:35 +01:00
|
|
|
&tinfo, fcinfo->flinfo));
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
}
|
2004-08-29 07:07:03 +02:00
|
|
|
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
|
|
|
|
Datum
|
|
|
|
gbt_text_picksplit(PG_FUNCTION_ARGS)
|
|
|
|
{
|
2004-08-29 07:07:03 +02:00
|
|
|
GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
|
|
|
|
GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);
|
|
|
|
|
2011-04-23 02:19:58 +02:00
|
|
|
gbt_var_picksplit(entryvec, v, PG_GET_COLLATION(),
|
2017-03-21 14:53:35 +01:00
|
|
|
&tinfo, fcinfo->flinfo);
|
2004-08-29 07:07:03 +02:00
|
|
|
PG_RETURN_POINTER(v);
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Datum
|
|
|
|
gbt_text_same(PG_FUNCTION_ARGS)
|
|
|
|
{
|
2004-08-29 07:07:03 +02:00
|
|
|
Datum d1 = PG_GETARG_DATUM(0);
|
|
|
|
Datum d2 = PG_GETARG_DATUM(1);
|
|
|
|
bool *result = (bool *) PG_GETARG_POINTER(2);
|
|
|
|
|
2017-03-21 14:53:35 +01:00
|
|
|
*result = gbt_var_same(d1, d2, PG_GET_COLLATION(), &tinfo, fcinfo->flinfo);
|
2011-04-23 02:19:58 +02:00
|
|
|
PG_RETURN_POINTER(result);
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Datum
|
|
|
|
gbt_text_penalty(PG_FUNCTION_ARGS)
|
|
|
|
{
|
2004-08-29 07:07:03 +02:00
|
|
|
GISTENTRY *o = (GISTENTRY *) PG_GETARG_POINTER(0);
|
|
|
|
GISTENTRY *n = (GISTENTRY *) PG_GETARG_POINTER(1);
|
2005-05-12 02:39:37 +02:00
|
|
|
float *result = (float *) PG_GETARG_POINTER(2);
|
New version. Add support for int2, int8, float4, float8, timestamp with/without time zone, time with/without time zone, date, interval, oid, money and macaddr, char, varchar/text, bytea, numeric, bit, varbit, inet/cidr types for GiST
2004-05-28 12:43:32 +02:00
|
|
|
|
2011-04-23 02:19:58 +02:00
|
|
|
PG_RETURN_POINTER(gbt_var_penalty(result, o, n, PG_GET_COLLATION(),
|
2017-03-21 14:53:35 +01:00
|
|
|
&tinfo, fcinfo->flinfo));
|
2004-08-29 07:07:03 +02:00
|
|
|
}
|