Header And Logo

PostgreSQL
| The world's most advanced open source database.

Data Structures | Defines | Functions | Variables

btree_interval.c File Reference

#include "postgres.h"
#include "btree_gist.h"
#include "btree_utils_num.h"
#include "utils/timestamp.h"
Include dependency graph for btree_interval.c:

Go to the source code of this file.

Data Structures

struct  intvKEY

Defines

#define INTERVALSIZE   16

Functions

 PG_FUNCTION_INFO_V1 (gbt_intv_compress)
 PG_FUNCTION_INFO_V1 (gbt_intv_decompress)
 PG_FUNCTION_INFO_V1 (gbt_intv_union)
 PG_FUNCTION_INFO_V1 (gbt_intv_picksplit)
 PG_FUNCTION_INFO_V1 (gbt_intv_consistent)
 PG_FUNCTION_INFO_V1 (gbt_intv_distance)
 PG_FUNCTION_INFO_V1 (gbt_intv_penalty)
 PG_FUNCTION_INFO_V1 (gbt_intv_same)
Datum gbt_intv_compress (PG_FUNCTION_ARGS)
Datum gbt_intv_decompress (PG_FUNCTION_ARGS)
Datum gbt_intv_union (PG_FUNCTION_ARGS)
Datum gbt_intv_picksplit (PG_FUNCTION_ARGS)
Datum gbt_intv_consistent (PG_FUNCTION_ARGS)
Datum gbt_intv_distance (PG_FUNCTION_ARGS)
Datum gbt_intv_penalty (PG_FUNCTION_ARGS)
Datum gbt_intv_same (PG_FUNCTION_ARGS)
static bool gbt_intvgt (const void *a, const void *b)
static bool gbt_intvge (const void *a, const void *b)
static bool gbt_intveq (const void *a, const void *b)
static bool gbt_intvle (const void *a, const void *b)
static bool gbt_intvlt (const void *a, const void *b)
static int gbt_intvkey_cmp (const void *a, const void *b)
static double intr2num (const Interval *i)
static float8 gbt_intv_dist (const void *a, const void *b)
Intervalabs_interval (Interval *a)
 PG_FUNCTION_INFO_V1 (interval_dist)
Datum interval_dist (PG_FUNCTION_ARGS)

Variables

static const gbtree_ninfo tinfo

Define Documentation

#define INTERVALSIZE   16

Definition at line 101 of file btree_interval.c.

Referenced by gbt_intv_compress(), and gbt_intv_decompress().


Function Documentation

Interval* abs_interval ( Interval a  ) 
Datum gbt_intv_compress ( PG_FUNCTION_ARGS   ) 

Definition at line 150 of file btree_interval.c.

References DatumGetIntervalP, DatumGetPointer, FALSE, gistentryinit, INTERVALSIZE, GISTENTRY::key, GISTENTRY::leafkey, intvKEY::lower, GISTENTRY::offset, GISTENTRY::page, palloc(), PG_GETARG_POINTER, PG_RETURN_POINTER, PointerGetDatum, GISTENTRY::rel, and intvKEY::upper.

{
    GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
    GISTENTRY  *retval = entry;

    if (entry->leafkey || INTERVALSIZE != sizeof(Interval))
    {
        char       *r = (char *) palloc(2 * INTERVALSIZE);

        retval = palloc(sizeof(GISTENTRY));

        if (entry->leafkey)
        {
            Interval   *key = DatumGetIntervalP(entry->key);

            memcpy((void *) r, (void *) key, INTERVALSIZE);
            memcpy((void *) (r + INTERVALSIZE), (void *) key, INTERVALSIZE);
        }
        else
        {
            intvKEY    *key = (intvKEY *) DatumGetPointer(entry->key);

            memcpy(r, &key->lower, INTERVALSIZE);
            memcpy(r + INTERVALSIZE, &key->upper, INTERVALSIZE);
        }
        gistentryinit(*retval, PointerGetDatum(r),
                      entry->rel, entry->page,
                      entry->offset, FALSE);
    }

    PG_RETURN_POINTER(retval);

}

Datum gbt_intv_consistent ( PG_FUNCTION_ARGS   ) 

Definition at line 208 of file btree_interval.c.

References DatumGetPointer, gbt_num_consistent(), GIST_LEAF, GISTENTRY::key, intvKEY::lower, GBT_NUMKEY_R::lower, PG_GETARG_INTERVAL_P, PG_GETARG_POINTER, PG_GETARG_UINT16, PG_RETURN_BOOL, intvKEY::upper, and GBT_NUMKEY_R::upper.

{
    GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
    Interval   *query = PG_GETARG_INTERVAL_P(1);
    StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);

    /* Oid      subtype = PG_GETARG_OID(3); */
    bool       *recheck = (bool *) PG_GETARG_POINTER(4);
    intvKEY    *kkk = (intvKEY *) 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)
        );
}

Datum gbt_intv_decompress ( PG_FUNCTION_ARGS   ) 

Definition at line 185 of file btree_interval.c.

References DatumGetPointer, FALSE, gistentryinit, INTERVALSIZE, GISTENTRY::key, intvKEY::lower, GISTENTRY::offset, GISTENTRY::page, palloc(), PG_GETARG_POINTER, PG_RETURN_POINTER, PointerGetDatum, GISTENTRY::rel, and intvKEY::upper.

{
    GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
    GISTENTRY  *retval = entry;

    if (INTERVALSIZE != sizeof(Interval))
    {
        intvKEY    *r = palloc(sizeof(intvKEY));
        char       *key = DatumGetPointer(entry->key);

        retval = palloc(sizeof(GISTENTRY));
        memcpy(&r->lower, key, INTERVALSIZE);
        memcpy(&r->upper, key + INTERVALSIZE, INTERVALSIZE);

        gistentryinit(*retval, PointerGetDatum(r),
                      entry->rel, entry->page,
                      entry->offset, FALSE);
    }
    PG_RETURN_POINTER(retval);
}

static float8 gbt_intv_dist ( const void *  a,
const void *  b 
) [static]

Definition at line 91 of file btree_interval.c.

References Abs, and intr2num().

{
    return (float8) Abs(intr2num((const Interval *) a) - intr2num((const Interval *) b));
}

Datum gbt_intv_distance ( PG_FUNCTION_ARGS   ) 
Datum gbt_intv_penalty ( PG_FUNCTION_ARGS   ) 

Definition at line 262 of file btree_interval.c.

References DatumGetPointer, intr2num(), intvKEY::lower, penalty_num, PG_GETARG_POINTER, PG_RETURN_POINTER, and intvKEY::upper.

{
    intvKEY    *origentry = (intvKEY *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(0))->key);
    intvKEY    *newentry = (intvKEY *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(1))->key);
    float      *result = (float *) PG_GETARG_POINTER(2);
    double      iorg[2],
                inew[2];

    iorg[0] = intr2num(&origentry->lower);
    iorg[1] = intr2num(&origentry->upper);
    inew[0] = intr2num(&newentry->lower);
    inew[1] = intr2num(&newentry->upper);

    penalty_num(result, iorg[0], iorg[1], inew[0], inew[1]);

    PG_RETURN_POINTER(result);

}

Datum gbt_intv_picksplit ( PG_FUNCTION_ARGS   ) 
Datum gbt_intv_same ( PG_FUNCTION_ARGS   ) 

Definition at line 292 of file btree_interval.c.

References gbt_num_same(), PG_GETARG_POINTER, and PG_RETURN_POINTER.

{
    intvKEY    *b1 = (intvKEY *) PG_GETARG_POINTER(0);
    intvKEY    *b2 = (intvKEY *) PG_GETARG_POINTER(1);
    bool       *result = (bool *) PG_GETARG_POINTER(2);

    *result = gbt_num_same((void *) b1, (void *) b2, &tinfo);
    PG_RETURN_POINTER(result);
}

Datum gbt_intv_union ( PG_FUNCTION_ARGS   ) 

Definition at line 251 of file btree_interval.c.

References gbt_num_union(), palloc(), PG_GETARG_POINTER, and PG_RETURN_POINTER.

{
    GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
    void       *out = palloc(sizeof(intvKEY));

    *(int *) PG_GETARG_POINTER(1) = sizeof(intvKEY);
    PG_RETURN_POINTER(gbt_num_union((void *) out, entryvec, &tinfo));
}

static bool gbt_intveq ( const void *  a,
const void *  b 
) [static]
static bool gbt_intvge ( const void *  a,
const void *  b 
) [static]
static bool gbt_intvgt ( const void *  a,
const void *  b 
) [static]
static int gbt_intvkey_cmp ( const void *  a,
const void *  b 
) [static]

Definition at line 70 of file btree_interval.c.

References DatumGetInt32, DirectFunctionCall2, interval_cmp(), IntervalPGetDatum, intvKEY::lower, and intvKEY::upper.

{
    intvKEY    *ia = (intvKEY *) (((const Nsrt *) a)->t);
    intvKEY    *ib = (intvKEY *) (((const Nsrt *) b)->t);
    int         res;

    res = DatumGetInt32(DirectFunctionCall2(interval_cmp, IntervalPGetDatum(&ia->lower), IntervalPGetDatum(&ib->lower)));
    if (res == 0)
        return DatumGetInt32(DirectFunctionCall2(interval_cmp, IntervalPGetDatum(&ia->upper), IntervalPGetDatum(&ib->upper)));

    return res;
}

static bool gbt_intvle ( const void *  a,
const void *  b 
) [static]
static bool gbt_intvlt ( const void *  a,
const void *  b 
) [static]
Datum interval_dist ( PG_FUNCTION_ARGS   ) 
static double intr2num ( const Interval i  )  [static]

Definition at line 85 of file btree_interval.c.

References INTERVAL_TO_SEC.

Referenced by gbt_intv_dist(), and gbt_intv_penalty().

{
    return INTERVAL_TO_SEC(i);
}

PG_FUNCTION_INFO_V1 ( gbt_intv_same   ) 
PG_FUNCTION_INFO_V1 ( gbt_intv_union   ) 
PG_FUNCTION_INFO_V1 ( gbt_intv_picksplit   ) 
PG_FUNCTION_INFO_V1 ( interval_dist   ) 
PG_FUNCTION_INFO_V1 ( gbt_intv_compress   ) 
PG_FUNCTION_INFO_V1 ( gbt_intv_distance   ) 
PG_FUNCTION_INFO_V1 ( gbt_intv_decompress   ) 
PG_FUNCTION_INFO_V1 ( gbt_intv_consistent   ) 
PG_FUNCTION_INFO_V1 ( gbt_intv_penalty   ) 

Variable Documentation

const gbtree_ninfo tinfo [static]
Initial value:

Definition at line 103 of file btree_interval.c.