What is the correct way to extract values from an int8 array in SPI?

Поиск
Список
Период
Сортировка
От Boszormenyi Zoltan
Тема What is the correct way to extract values from an int8 array in SPI?
Дата
Msg-id 4B010A01.10103@cybertec.at
обсуждение исходный текст
Ответы 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>)
Список 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 по дате отправления:

Предыдущее
От: Jasen Betts
Дата:
Сообщение: Re: -c argument not recognized
Следующее
От: Pavel Stehule
Дата:
Сообщение: Re: passing parameters to multiple statements