Header And Logo

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

Functions

_int_tool.c File Reference

#include "postgres.h"
#include "catalog/pg_type.h"
#include "_int.h"
Include dependency graph for _int_tool.c:

Go to the source code of this file.

Functions

bool inner_int_contains (ArrayType *a, ArrayType *b)
bool inner_int_overlap (ArrayType *a, ArrayType *b)
ArrayTypeinner_int_union (ArrayType *a, ArrayType *b)
ArrayTypeinner_int_inter (ArrayType *a, ArrayType *b)
void rt__int_size (ArrayType *a, float *size)
bool isort (int32 *a, int len)
ArrayTypenew_intArrayType (int num)
ArrayTyperesize_intArrayType (ArrayType *a, int num)
ArrayTypecopy_intArrayType (ArrayType *a)
int internal_size (int *a, int len)
ArrayType_int_unique (ArrayType *r)
void gensign (BITVEC sign, int *a, int len)
int32 intarray_match_first (ArrayType *a, int32 elem)
ArrayTypeintarray_add_elem (ArrayType *a, int32 elem)
ArrayTypeintarray_concat_arrays (ArrayType *a, ArrayType *b)
ArrayTypeint_to_intset (int32 n)
int compASC (const void *a, const void *b)
int compDESC (const void *a, const void *b)

Function Documentation

ArrayType* _int_unique ( ArrayType r  ) 

Definition at line 293 of file _int_tool.c.

References ARRNELEMS, ARRPTR, and resize_intArrayType().

Referenced by g_int_union(), inner_int_union(), intset_subtract(), intset_union_elem(), and uniq().

{
    int        *tmp,
               *dr,
               *data;
    int         num = ARRNELEMS(r);

    if (num < 2)
        return r;

    data = tmp = dr = ARRPTR(r);
    while (tmp - data < num)
    {
        if (*tmp != *dr)
            *(++dr) = *tmp++;
        else
            tmp++;
    }
    return resize_intArrayType(r, dr + 1 - ARRPTR(r));
}

int compASC ( const void *  a,
const void *  b 
)

Definition at line 390 of file _int_tool.c.

{
    if (*(const int32 *) a == *(const int32 *) b)
        return 0;
    return (*(const int32 *) a > *(const int32 *) b) ? 1 : -1;
}

int compDESC ( const void *  a,
const void *  b 
)

Definition at line 398 of file _int_tool.c.

{
    if (*(const int32 *) a == *(const int32 *) b)
        return 0;
    return (*(const int32 *) a < *(const int32 *) b) ? 1 : -1;
}

ArrayType* copy_intArrayType ( ArrayType a  ) 

Definition at line 265 of file _int_tool.c.

References ARRNELEMS, ARRPTR, and new_intArrayType().

Referenced by g_int_picksplit(), and inner_int_union().

{
    ArrayType  *r;
    int         n = ARRNELEMS(a);

    r = new_intArrayType(n);
    memcpy(ARRPTR(r), ARRPTR(a), n * sizeof(int32));
    return r;
}

void gensign ( BITVEC  sign,
int *  a,
int  len 
)

Definition at line 315 of file _int_tool.c.

References HASH, and i.

{
    int         i;

    /* we assume that the sign vector is previously zeroed */
    for (i = 0; i < len; i++)
    {
        HASH(sign, *a);
        a++;
    }
}

bool inner_int_contains ( ArrayType a,
ArrayType b 
)

Definition at line 13 of file _int_tool.c.

References ARRNELEMS, ARRPTR, i, and TRUE.

Referenced by _int_contains(), and g_int_consistent().

{
    int         na,
                nb;
    int         i,
                j,
                n;
    int        *da,
               *db;

    na = ARRNELEMS(a);
    nb = ARRNELEMS(b);
    da = ARRPTR(a);
    db = ARRPTR(b);

    i = j = n = 0;
    while (i < na && j < nb)
    {
        if (da[i] < db[j])
            i++;
        else if (da[i] == db[j])
        {
            n++;
            i++;
            j++;
        }
        else
            break;              /* db[j] is not in da */
    }

    return (n == nb) ? TRUE : FALSE;
}

ArrayType* inner_int_inter ( ArrayType a,
ArrayType b 
)

Definition at line 134 of file _int_tool.c.

References ARRISEMPTY, ARRNELEMS, ARRPTR, i, Min, new_intArrayType(), pfree(), and resize_intArrayType().

Referenced by _int_inter(), and g_int_picksplit().

{
    ArrayType  *r;
    int         na,
                nb;
    int        *da,
               *db,
               *dr;
    int         i,
                j,
                k;

    if (ARRISEMPTY(a) || ARRISEMPTY(b))
        return new_intArrayType(0);

    na = ARRNELEMS(a);
    nb = ARRNELEMS(b);
    da = ARRPTR(a);
    db = ARRPTR(b);
    r = new_intArrayType(Min(na, nb));
    dr = ARRPTR(r);

    i = j = k = 0;
    while (i < na && j < nb)
    {
        if (da[i] < db[j])
            i++;
        else if (da[i] == db[j])
        {
            if (k == 0 || dr[k - 1] != db[j])
                dr[k++] = db[j];
            i++;
            j++;
        }
        else
            j++;
    }

    if (k == 0)
    {
        pfree(r);
        return new_intArrayType(0);
    }
    else
        return resize_intArrayType(r, k);
}

bool inner_int_overlap ( ArrayType a,
ArrayType b 
)

Definition at line 48 of file _int_tool.c.

References ARRNELEMS, ARRPTR, and i.

Referenced by _int_overlap(), and g_int_consistent().

{
    int         na,
                nb;
    int         i,
                j;
    int        *da,
               *db;

    na = ARRNELEMS(a);
    nb = ARRNELEMS(b);
    da = ARRPTR(a);
    db = ARRPTR(b);

    i = j = 0;
    while (i < na && j < nb)
    {
        if (da[i] < db[j])
            i++;
        else if (da[i] == db[j])
            return TRUE;
        else
            j++;
    }

    return FALSE;
}

ArrayType* inner_int_union ( ArrayType a,
ArrayType b 
)

Definition at line 77 of file _int_tool.c.

References _int_unique(), ARRISEMPTY, ARRNELEMS, ARRPTR, CHECKARRVALID, copy_intArrayType(), i, new_intArrayType(), and resize_intArrayType().

Referenced by _int_union(), g_int_penalty(), and g_int_picksplit().

{
    ArrayType  *r = NULL;

    CHECKARRVALID(a);
    CHECKARRVALID(b);

    if (ARRISEMPTY(a) && ARRISEMPTY(b))
        return new_intArrayType(0);
    if (ARRISEMPTY(a))
        r = copy_intArrayType(b);
    if (ARRISEMPTY(b))
        r = copy_intArrayType(a);

    if (!r)
    {
        int         na = ARRNELEMS(a),
                    nb = ARRNELEMS(b);
        int        *da = ARRPTR(a),
                   *db = ARRPTR(b);
        int         i,
                    j,
                   *dr;

        r = new_intArrayType(na + nb);
        dr = ARRPTR(r);

        /* union */
        i = j = 0;
        while (i < na && j < nb)
        {
            if (da[i] == db[j])
            {
                *dr++ = da[i++];
                j++;
            }
            else if (da[i] < db[j])
                *dr++ = da[i++];
            else
                *dr++ = db[j++];
        }

        while (i < na)
            *dr++ = da[i++];
        while (j < nb)
            *dr++ = db[j++];

        r = resize_intArrayType(r, dr - ARRPTR(r));
    }

    if (ARRNELEMS(r) > 1)
        r = _int_unique(r);

    return r;
}

ArrayType* int_to_intset ( int32  n  ) 

Definition at line 378 of file _int_tool.c.

References ARRPTR, and new_intArrayType().

Referenced by intset().

{
    ArrayType  *result;
    int32      *aa;

    result = new_intArrayType(1);
    aa = ARRPTR(result);
    aa[0] = n;
    return result;
}

ArrayType* intarray_add_elem ( ArrayType a,
int32  elem 
)

Definition at line 344 of file _int_tool.c.

References ARRNELEMS, ARRPTR, CHECKARRVALID, and new_intArrayType().

Referenced by intarray_push_elem(), and intset_union_elem().

{
    ArrayType  *result;
    int32      *r;
    int32       c;

    CHECKARRVALID(a);
    c = ARRNELEMS(a);
    result = new_intArrayType(c + 1);
    r = ARRPTR(result);
    if (c > 0)
        memcpy(r, ARRPTR(a), c * sizeof(int32));
    r[c] = elem;
    return result;
}

ArrayType* intarray_concat_arrays ( ArrayType a,
ArrayType b 
)

Definition at line 361 of file _int_tool.c.

References ARRNELEMS, ARRPTR, CHECKARRVALID, and new_intArrayType().

Referenced by intarray_push_array().

{
    ArrayType  *result;
    int32       ac = ARRNELEMS(a);
    int32       bc = ARRNELEMS(b);

    CHECKARRVALID(a);
    CHECKARRVALID(b);
    result = new_intArrayType(ac + bc);
    if (ac)
        memcpy(ARRPTR(result), ARRPTR(a), ac * sizeof(int32));
    if (bc)
        memcpy(ARRPTR(result) + ac, ARRPTR(b), bc * sizeof(int32));
    return result;
}

int32 intarray_match_first ( ArrayType a,
int32  elem 
)

Definition at line 328 of file _int_tool.c.

References ARRNELEMS, ARRPTR, CHECKARRVALID, and i.

Referenced by idx().

{
    int32      *aa,
                c,
                i;

    CHECKARRVALID(a);
    c = ARRNELEMS(a);
    aa = ARRPTR(a);
    for (i = 0; i < c; i++)
        if (aa[i] == elem)
            return (i + 1);
    return 0;
}

int internal_size ( int *  a,
int  len 
)

Definition at line 277 of file _int_tool.c.

References i.

Referenced by g_int_decompress().

{
    int         i,
                size = 0;

    for (i = 0; i < len; i += 2)
    {
        if (!i || a[i] != a[i - 1])     /* do not count repeated range */
            size += a[i + 1] - a[i] + 1;
    }

    return size;
}

bool isort ( int32 a,
int  len 
)

Definition at line 189 of file _int_tool.c.

References cur.

{
    int32       cur,
                prev;
    int32      *pcur,
               *pprev,
               *end;
    bool        r = FALSE;

    /*
     * We use a simple insertion sort.  While this is O(N^2) in the worst
     * case, it's quite fast if the input is already sorted or nearly so.
     * Also, for not-too-large inputs it's faster than more complex methods
     * anyhow.
     */
    end = a + len;
    for (pcur = a + 1; pcur < end; pcur++)
    {
        cur = *pcur;
        for (pprev = pcur - 1; pprev >= a; pprev--)
        {
            prev = *pprev;
            if (prev <= cur)
            {
                if (prev == cur)
                    r = TRUE;
                break;
            }
            pprev[1] = prev;
        }
        pprev[1] = cur;
    }
    return r;
}

ArrayType* new_intArrayType ( int  num  ) 

Definition at line 226 of file _int_tool.c.

References ARR_DIMS, ARR_ELEMTYPE, ARR_LBOUND, ARR_NDIM, ARR_OVERHEAD_NONULLS, ArrayType::dataoffset, palloc0(), and SET_VARSIZE.

Referenced by copy_intArrayType(), g_int_decompress(), g_int_union(), inner_int_inter(), inner_int_union(), int_to_intset(), intarray_add_elem(), intarray_concat_arrays(), intset_subtract(), and subarray().

{
    ArrayType  *r;
    int         nbytes = ARR_OVERHEAD_NONULLS(1) + sizeof(int) * num;

    r = (ArrayType *) palloc0(nbytes);

    SET_VARSIZE(r, nbytes);
    ARR_NDIM(r) = 1;
    r->dataoffset = 0;          /* marker for no null bitmap */
    ARR_ELEMTYPE(r) = INT4OID;
    ARR_DIMS(r)[0] = num;
    ARR_LBOUND(r)[0] = 1;

    return r;
}

ArrayType* resize_intArrayType ( ArrayType a,
int  num 
)

Definition at line 244 of file _int_tool.c.

References ARR_DATA_OFFSET, ARR_DIMS, ARR_NDIM, ARRNELEMS, i, repalloc(), and SET_VARSIZE.

Referenced by _int_unique(), g_int_compress(), inner_int_inter(), inner_int_union(), intarray_del_elem(), and intset_subtract().

{
    int         nbytes = ARR_DATA_OFFSET(a) + sizeof(int) * num;
    int         i;

    if (num == ARRNELEMS(a))
        return a;

    a = (ArrayType *) repalloc(a, nbytes);

    SET_VARSIZE(a, nbytes);
    /* usually the array should be 1-D already, but just in case ... */
    for (i = 0; i < ARR_NDIM(a); i++)
    {
        ARR_DIMS(a)[i] = num;
        num = 1;
    }
    return a;
}

void rt__int_size ( ArrayType a,
float *  size 
)

Definition at line 182 of file _int_tool.c.

References ARRNELEMS.

Referenced by g_int_penalty(), and g_int_picksplit().

{
    *size = (float) ARRNELEMS(a);
}