1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-10 17:42:29 +03:00

Repair erroneous use of hashvarlena() for MACADDR, which is not a

varlena type.  (I did not force initdb, but you won't see the fix
unless you do one.)  Also, make sure all index support operators and
functions are careful not to leak memory for toasted inputs; I had
missed some hash and rtree support ops on this point before.
This commit is contained in:
Tom Lane
2000-12-08 23:57:03 +00:00
parent fb47385fc8
commit 376784cf8a
8 changed files with 116 additions and 31 deletions

View File

@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/hash/hashfunc.c,v 1.27 2000/06/19 03:54:17 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/access/hash/hashfunc.c,v 1.28 2000/12/08 23:57:02 tgl Exp $
*
* NOTES
* These functions are stored in pg_amproc. For each operator class
@@ -106,8 +106,14 @@ Datum
hashvarlena(PG_FUNCTION_ARGS)
{
struct varlena *key = PG_GETARG_VARLENA_P(0);
Datum result;
return hash_any(VARDATA(key), VARSIZE(key) - VARHDRSZ);
result = hash_any(VARDATA(key), VARSIZE(key) - VARHDRSZ);
/* Avoid leaking memory for toasted inputs */
PG_FREE_IF_COPY(key, 0);
return result;
}

View File

@@ -15,7 +15,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtproc.c,v 1.29 2000/07/30 20:43:40 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtproc.c,v 1.30 2000/12/08 23:57:01 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -183,5 +183,8 @@ rt_poly_size(PG_FUNCTION_ARGS)
*size = (float) (xdim * ydim);
}
/* Avoid leaking memory when handed toasted input. */
PG_FREE_IF_COPY(a, 0);
PG_RETURN_VOID();
}

View File

@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.55 2000/12/03 20:45:35 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.56 2000/12/08 23:57:03 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -3097,8 +3097,15 @@ poly_left(PG_FUNCTION_ARGS)
{
POLYGON *polya = PG_GETARG_POLYGON_P(0);
POLYGON *polyb = PG_GETARG_POLYGON_P(1);
bool result;
PG_RETURN_BOOL(polya->boundbox.high.x < polyb->boundbox.low.x);
result = polya->boundbox.high.x < polyb->boundbox.low.x;
/* Avoid leaking memory for toasted inputs ... needed for rtree indexes */
PG_FREE_IF_COPY(polya, 0);
PG_FREE_IF_COPY(polyb, 1);
PG_RETURN_BOOL(result);
}
/*-------------------------------------------------------
@@ -3111,8 +3118,15 @@ poly_overleft(PG_FUNCTION_ARGS)
{
POLYGON *polya = PG_GETARG_POLYGON_P(0);
POLYGON *polyb = PG_GETARG_POLYGON_P(1);
bool result;
PG_RETURN_BOOL(polya->boundbox.low.x <= polyb->boundbox.high.x);
result = polya->boundbox.low.x <= polyb->boundbox.high.x;
/* Avoid leaking memory for toasted inputs ... needed for rtree indexes */
PG_FREE_IF_COPY(polya, 0);
PG_FREE_IF_COPY(polyb, 1);
PG_RETURN_BOOL(result);
}
/*-------------------------------------------------------
@@ -3125,8 +3139,15 @@ poly_right(PG_FUNCTION_ARGS)
{
POLYGON *polya = PG_GETARG_POLYGON_P(0);
POLYGON *polyb = PG_GETARG_POLYGON_P(1);
bool result;
PG_RETURN_BOOL(polya->boundbox.low.x > polyb->boundbox.high.x);
result = polya->boundbox.low.x > polyb->boundbox.high.x;
/* Avoid leaking memory for toasted inputs ... needed for rtree indexes */
PG_FREE_IF_COPY(polya, 0);
PG_FREE_IF_COPY(polyb, 1);
PG_RETURN_BOOL(result);
}
/*-------------------------------------------------------
@@ -3139,8 +3160,15 @@ poly_overright(PG_FUNCTION_ARGS)
{
POLYGON *polya = PG_GETARG_POLYGON_P(0);
POLYGON *polyb = PG_GETARG_POLYGON_P(1);
bool result;
PG_RETURN_BOOL(polya->boundbox.high.x > polyb->boundbox.low.x);
result = polya->boundbox.high.x > polyb->boundbox.low.x;
/* Avoid leaking memory for toasted inputs ... needed for rtree indexes */
PG_FREE_IF_COPY(polya, 0);
PG_FREE_IF_COPY(polyb, 1);
PG_RETURN_BOOL(result);
}
/*-------------------------------------------------------
@@ -3155,11 +3183,18 @@ poly_same(PG_FUNCTION_ARGS)
{
POLYGON *polya = PG_GETARG_POLYGON_P(0);
POLYGON *polyb = PG_GETARG_POLYGON_P(1);
bool result;
if (polya->npts != polyb->npts)
PG_RETURN_BOOL(false);
result = false;
else
result = plist_same(polya->npts, polya->p, polyb->p);
PG_RETURN_BOOL(plist_same(polya->npts, polya->p, polyb->p));
/* Avoid leaking memory for toasted inputs ... needed for rtree indexes */
PG_FREE_IF_COPY(polya, 0);
PG_FREE_IF_COPY(polyb, 1);
PG_RETURN_BOOL(result);
}
/*-----------------------------------------------------------------
@@ -3173,8 +3208,15 @@ poly_overlap(PG_FUNCTION_ARGS)
{
POLYGON *polya = PG_GETARG_POLYGON_P(0);
POLYGON *polyb = PG_GETARG_POLYGON_P(1);
bool result;
PG_RETURN_BOOL(box_ov(&polya->boundbox, &polyb->boundbox));
result = box_ov(&polya->boundbox, &polyb->boundbox);
/* Avoid leaking memory for toasted inputs ... needed for rtree indexes */
PG_FREE_IF_COPY(polya, 0);
PG_FREE_IF_COPY(polyb, 1);
PG_RETURN_BOOL(result);
}
@@ -3186,6 +3228,7 @@ poly_contain(PG_FUNCTION_ARGS)
{
POLYGON *polya = PG_GETARG_POLYGON_P(0);
POLYGON *polyb = PG_GETARG_POLYGON_P(1);
bool result;
int i;
/*
@@ -3195,6 +3238,7 @@ poly_contain(PG_FUNCTION_ARGS)
BoxPGetDatum(&polya->boundbox),
BoxPGetDatum(&polyb->boundbox))))
{
result = true; /* assume true for now */
for (i = 0; i < polyb->npts; i++)
{
if (point_inside(&(polyb->p[i]), polya->npts, &(polya->p[0])) == 0)
@@ -3202,28 +3246,40 @@ poly_contain(PG_FUNCTION_ARGS)
#if GEODEBUG
printf("poly_contain- point (%f,%f) not in polygon\n", polyb->p[i].x, polyb->p[i].y);
#endif
PG_RETURN_BOOL(false);
result = false;
break;
}
}
for (i = 0; i < polya->npts; i++)
if (result)
{
if (point_inside(&(polya->p[i]), polyb->npts, &(polyb->p[0])) == 1)
for (i = 0; i < polya->npts; i++)
{
if (point_inside(&(polya->p[i]), polyb->npts, &(polyb->p[0])) == 1)
{
#if GEODEBUG
printf("poly_contain- point (%f,%f) in polygon\n", polya->p[i].x, polya->p[i].y);
printf("poly_contain- point (%f,%f) in polygon\n", polya->p[i].x, polya->p[i].y);
#endif
PG_RETURN_BOOL(false);
result = false;
break;
}
}
}
PG_RETURN_BOOL(true);
}
else
{
#if GEODEBUG
printf("poly_contain- bound box ((%f,%f),(%f,%f)) not inside ((%f,%f),(%f,%f))\n",
polyb->boundbox.low.x, polyb->boundbox.low.y, polyb->boundbox.high.x, polyb->boundbox.high.y,
polya->boundbox.low.x, polya->boundbox.low.y, polya->boundbox.high.x, polya->boundbox.high.y);
#endif
result = false;
}
#if GEODEBUG
printf("poly_contain- bound box ((%f,%f),(%f,%f)) not inside ((%f,%f),(%f,%f))\n",
polyb->boundbox.low.x, polyb->boundbox.low.y, polyb->boundbox.high.x, polyb->boundbox.high.y,
polya->boundbox.low.x, polya->boundbox.low.y, polya->boundbox.high.x, polya->boundbox.high.y);
#endif
PG_RETURN_BOOL(false);
/* Avoid leaking memory for toasted inputs ... needed for rtree indexes */
PG_FREE_IF_COPY(polya, 0);
PG_FREE_IF_COPY(polyb, 1);
PG_RETURN_BOOL(result);
}

View File

@@ -1,11 +1,12 @@
/*
* PostgreSQL type definitions for MAC addresses.
*
* $Header: /cvsroot/pgsql/src/backend/utils/adt/mac.c,v 1.18 2000/08/23 06:04:33 thomas Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/mac.c,v 1.19 2000/12/08 23:57:03 tgl Exp $
*/
#include "postgres.h"
#include "access/hash.h"
#include "utils/builtins.h"
#include "utils/inet.h"
@@ -236,11 +237,21 @@ macaddr_ne(PG_FUNCTION_ARGS)
PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) != 0);
}
/*
* Support function for hash indexes on macaddr.
*/
Datum
hashmacaddr(PG_FUNCTION_ARGS)
{
macaddr *key = PG_GETARG_MACADDR_P(0);
return hash_any((char *) key, sizeof(macaddr));
}
/*
* Truncation function to allow comparing mac manufacturers.
* From suggestion by Alex Pilosov <alex@pilosoft.com>
*/
Datum
macaddr_trunc(PG_FUNCTION_ARGS)
{

View File

@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.71 2000/11/26 11:35:23 ishii Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.72 2000/12/08 23:57:03 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -663,11 +663,17 @@ hashbpchar(PG_FUNCTION_ARGS)
BpChar *key = PG_GETARG_BPCHAR_P(0);
char *keydata;
int keylen;
Datum result;
keydata = VARDATA(key);
keylen = bcTruelen(key);
return hash_any(keydata, keylen);
result = hash_any(keydata, keylen);
/* Avoid leaking memory for toasted inputs */
PG_FREE_IF_COPY(key, 0);
return result;
}