What is the correct way to extract values from an int8 array in SPI? - Mailing list pgsql-general

From Boszormenyi Zoltan
Subject What is the correct way to extract values from an int8 array in SPI?
Date
Msg-id 4B010A01.10103@cybertec.at
Whole thread Raw
Responses Re: What is the correct way to extract values from an int8 array in SPI?  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: What is the correct way to extract values from an int8 array in SPI?  (Alvaro Herrera <alvherre@commandprompt.com>)
List pgsql-general
Hi,

I am using this code on 8.4/8.5, which works on 64-bit,
but segfaults on 32-bit Linux:

    oids[0] = TEXTOID;
    values[0] = lex;
    nulls[0] = false;
    ret = SPI_execute_with_args(
        (just_title ?
            "SELECT ids FROM product.t_product_inv_titleonly WHERE word
= $1"
            :      "SELECT ids FROM product.t_product_inv WHERE word = $1"),
            1, oids, values, nulls, true, 1);
    if (ret != SPI_OK_SELECT)
        elog(ERROR, "SPI_execute_with_args(SELECT FROM
product.t_product_inv[_titleonly]) error (%d)", ret);
    prod_inv = SPI_tuptable;

    /* If no such record, quit */
    if (SPI_processed == 0)
        break;

//    ids =
PointerGetDatum(PG_DETOAST_DATUM(SPI_getbinval(prod_inv->vals[0],
prod_inv->tupdesc, 1, &isnull)));
    ids = SPI_getbinval(prod_inv->vals[0], prod_inv->tupdesc, 1, &isnull);
    n_ids = DatumGetInt32(DirectFunctionCall2(array_length, ids,
Int32GetDatum(1)));
    ids_arr = DatumGetArrayTypeP(ids);
    ids_data = (Datum *) ARR_DATA_PTR(ids_arr);

    /* Set up the initial indexes for binary search */
    idx_min = 0;
    idx_max = n_ids - 1;
    idx_mid = (idx_max + idx_min) / 2;

    elog(NOTICE, "n_ids %d idx_min %d idx_max %d idx_mid %d", n_ids,
idx_min, idx_max, idx_mid);

    elog(NOTICE, "getting display_price of last element %" PRId64,
DatumGetInt64(ids_data[idx_max]));

Field "ids" in the above query is an int8[] array
with SET STORAGE EXTERNAL.
Executing DatumGetInt64(ids_data[idx_max]) in
the last elog() call segfaults in 32-bit. It doesn't matter
if the SPI_getbinval() call above is detoasted or not.
How can I extract individual elements from the int8[]
Datum correctly?

Thanks in advance,
Zoltán Böszörményi

--
Bible has answers for everything. Proof:
"But let your communication be, Yea, yea; Nay, nay: for whatsoever is more
than these cometh of evil." (Matthew 5:37) - basics of digital technology.
"May your kingdom come" - superficial description of plate tectonics

----------------------------------
Zoltán Böszörményi
Cybertec Schönig & Schönig GmbH
http://www.postgresql.at/


pgsql-general by date:

Previous
From: Jasen Betts
Date:
Subject: Re: -c argument not recognized
Next
From: Pavel Stehule
Date:
Subject: Re: passing parameters to multiple statements