sum 2 arrays of general int type

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Leonardo Francalanci

    sum 2 arrays of general int type

    I wrote a function to sum arrays.
    It works, but I had to cast the data pointer to int64 (because my arrays
    are 'int8[]'):

    int64* ptr1 = ARR_DATA_PTR(v1 );

    What if I want to write a more general function that adds values of 2
    arrays of every int type? How could I do it?

    Here is the function (if you find any errors tell me...):

    PG_FUNCTION_INF O_V1(array_sum) ;

    Datum
    array_add(PG_FU NCTION_ARGS)
    {
    Oid element_type;
    ArrayType *result, *v1, *v2;
    char *dat1, *dat2;
    int ndatabytes, ndims1, ndims2;



    v1 = PG_GETARG_ARRAY TYPE_P(0);
    v2 = PG_GETARG_ARRAY TYPE_P(1);
    ndims1 = ARR_NDIM(v1);
    ndims2 = ARR_NDIM(v2);
    dat1 = ARR_DATA_PTR(v1 );
    dat2 = ARR_DATA_PTR(v2 );
    int dim1 = ARR_DIMS(v1)[0];
    int dim2 = ARR_DIMS(v2)[0];
    int *lbs = ARR_LBOUND(v1);
    ndatabytes = ARR_SIZE(v1) - ARR_OVERHEAD(nd ims1);


    int nbytes = ndatabytes + ARR_OVERHEAD(nd ims1);

    result = (ArrayType *) palloc(nbytes);
    element_type = ARR_ELEMTYPE(v1 );
    result->size = ARR_SIZE(v1);//nbytes;
    result->ndim = ARR_NDIM(v1);
    result->flags = 0;
    result->elemtype = element_type;
    memcpy(ARR_DIMS (result), &dim1, sizeof(int));
    memcpy(ARR_LBOU ND(result), lbs, sizeof(int));
    int64* ptr = ARR_DATA_PTR(re sult);
    int64* ptr1 = ARR_DATA_PTR(v1 );
    int64* ptr2 = ARR_DATA_PTR(v2 );
    int i = 0;
    for (; i < dim1; i++)
    {
    ptr[i]=ptr1[i]+ptr2[i];
    }

    PG_RETURN_ARRAY TYPE_P(result);
    }

    ---------------------------(end of broadcast)---------------------------
    TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddres sHere" to majordomo@postg resql.org)

Working...