Обсуждение: BUG #14289: Potential bug: "invalid attribute number" when dblink result is assigned in PL/PGSQL

Поиск
Список
Период
Сортировка

BUG #14289: Potential bug: "invalid attribute number" when dblink result is assigned in PL/PGSQL

От
m.overmeyer@yahoo.ca
Дата:
VGhlIGZvbGxvd2luZyBidWcgaGFzIGJlZW4gbG9nZ2VkIG9uIHRoZSB3ZWJz
aXRlOgoKQnVnIHJlZmVyZW5jZTogICAgICAxNDI4OQpMb2dnZWQgYnk6ICAg
ICAgICAgIE1pY2hhZWwgT3Zlcm1leWVyCkVtYWlsIGFkZHJlc3M6ICAgICAg
bS5vdmVybWV5ZXJAeWFob28uY2EKUG9zdGdyZVNRTCB2ZXJzaW9uOiA5LjUu
NApPcGVyYXRpbmcgc3lzdGVtOiAgIENlbnRPUyA3LCBhbHNvIERvY2tlcgpE
ZXNjcmlwdGlvbjogICAgICAgIAoKSSBiZWxpZXZlIEkgbWF5IGhhdmUgZm91
bmQgYSBidWcgaW4gUEwvUEdTUUwgb3IgZGJsaW5rLiBXaGVuIHVzaW5nIHRo
ZQphc3NpZ25tZW50IG9wZXJhdG9yIHRvIGFzc2lnbiB0aGUgcmVzdWx0cyBv
ZiBkYmxpbmtfYnVpbGRfc3FsX2RlbGV0ZSB0byBhCnZhcmlhYmxlLCBpdCBn
aXZlcyBtZToNCg0KICAgIHBzcWw6cGdfYnVnLnNxbDozNzogRVJST1I6ICAy
MjAyMzogaW52YWxpZCBhdHRyaWJ1dGUgbnVtYmVyIC0xNTk4DQogICAgQ09O
VEVYVDogIFBML3BnU1FMIGZ1bmN0aW9uIHRlc3RfYXNzaWdubWVudChpbnQy
dmVjdG9yKSBsaW5lIDYgYXQKYXNzaWdubWVudA0KICAgIExPQ0FUSU9OOiAg
dmFsaWRhdGVfcGthdHRudW1zLCBkYmxpbmsuYzoyODUxDQoNClRoaXMgZG9l
cyBub3Qgb2NjdXIgaWYgSSBkbyBub3QgcGFzcyB0aGUgaW50MnZlY3RvciBh
cyBhIHBhcmFtZXRlciwgbm9yIHdoZW4KSSB1c2UgdGhlIFNFTEVDVC4uLklO
VE8gc3ludGF4Lg0KDQpTdGVwcyB0byByZXByb2R1Y2U6DQoxLiBEb3dubG9h
ZApodHRwczovL2dpc3QuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21vdmVybWV5
ZXIvY2RjOWM5OTc3NDRkOTdhNWNmOTQ3MTgzN2RmZjZiNGEvcmF3L2I0ZTdm
MzM4ODM0ZWQzNWE4ZjdjYjA2NTNmODQzZjVlZmFlYzBmZWYvcGdfYnVnLnNx
bAp0byAicGdfYnVnLnNxbCINCjEuIFN0YXJ0IGEgUG9zdGdyZXMgaW5zdGFu
Y2U6IGBkb2NrZXIgcnVuIC1pIC10IC0tcm09dHJ1ZSAtZQpQT1NUR1JFU19Q
QVNTV09SRD1wb3N0Z3JlcyAtcCA1NDMyOjU0MzIgcG9zdGdyZXNgDQoyLiBS
dW4gcGdfYnVnLnNxbDogYFBHUEFTU1dPUkQ9cG9zdGdyZXMgcHNxbCAtVSBw
b3N0Z3JlcyAtaCAxMjcuMC4wLjEgLXAKNTQzMiAtZiBwZ19idWcuc3FsYA0K
DQpTYW1wbGUgb3V0cHV0Og0KDQogICAgQ1JFQVRFIERBVEFCQVNFDQogICAg
WW91IGFyZSBub3cgY29ubmVjdGVkIHRvIGRhdGFiYXNlICJ0ZXN0X2RiIiBh
cyB1c2VyICJwb3N0Z3JlcyIuDQogICAgQ1JFQVRFIEVYVEVOU0lPTg0KICAg
IENSRUFURSBUQUJMRQ0KICAgIElOU0VSVCAwIDENCiAgICBDUkVBVEUgRlVO
Q1RJT04NCiAgICBwc3FsOnBnX2J1Zy5zcWw6Mzc6IEVSUk9SOiAgMjIwMjM6
IGludmFsaWQgYXR0cmlidXRlIG51bWJlciAtMTU5OA0KICAgIENPTlRFWFQ6
ICBQTC9wZ1NRTCBmdW5jdGlvbiB0ZXN0X2Fzc2lnbm1lbnQoaW50MnZlY3Rv
cikgbGluZSA2IGF0CmFzc2lnbm1lbnQNCiAgICBMT0NBVElPTjogIHZhbGlk
YXRlX3BrYXR0bnVtcywgZGJsaW5rLmM6Mjg1MQ0KICAgIA0KV29ya2Fyb3Vu
ZDoNCg0KICAgIFVzZSB0aGUgU0VMRUNULi4uSU5UTyBzeW50YXggaW5zdGVh
ZC4KCg==

Re: BUG #14289: Potential bug: "invalid attribute number" when dblink result is assigned in PL/PGSQL

От
Joe Conway
Дата:
On 08/18/2016 01:44 PM, m.overmeyer@yahoo.ca wrote:
> The following bug has been logged on the website:
>=20
> Bug reference:      14289
> Logged by:          Michael Overmeyer
> Email address:      m.overmeyer@yahoo.ca
> PostgreSQL version: 9.5.4
> Operating system:   CentOS 7, also Docker
> Description:=20=20=20=20=20=20=20=20
>=20
> I believe I may have found a bug in PL/PGSQL or dblink. When using the
> assignment operator to assign the results of dblink_build_sql_delete to a
> variable, it gives me:
>=20
>     psql:pg_bug.sql:37: ERROR:  22023: invalid attribute number -1598
>     CONTEXT:  PL/pgSQL function test_assignment(int2vector) line 6 at
> assignment
>     LOCATION:  validate_pkattnums, dblink.c:2851

This does not have anything specific to do with dblink -- but it does
seem to be specific to plpgsql. Here is a minimal test case:

SELECT version();
                      version
--------------------------------------------------------------------
 PostgreSQL 9.5.4 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu
4.8.4-2ubuntu1~14.04.3) 4.8.4, 64-bit
(1 row)

CREATE OR REPLACE FUNCTION test_int2vector(pka int2vector)
RETURNS int2vector AS $$
 BEGIN
  return pka;
 END;
$$ LANGUAGE plpgsql;

SELECT test_int2vector('1'::int2vector);
-- garbage result

CREATE OR REPLACE FUNCTION test_int2v(pka int2vector)
  RETURNS int2vector AS
$$ select pka $$ LANGUAGE sql;

SELECT test_int2v('1'::int2vector);
-- works fine


--=20
Crunchy Data - http://crunchydata.com
PostgreSQL Support for Secure Enterprises
Consulting, Training, & Open Source Development
m.overmeyer@yahoo.ca writes:
> I believe I may have found a bug in PL/PGSQL or dblink.

So you did.  Fixed, thanks.

For the archives' sake, the test case looked like

------
create extension dblink;

create table test_table
(
  username text primary key
);

INSERT INTO test_table VALUES ('test_user');

CREATE OR REPLACE FUNCTION test_assignment(primary_key_attnums int2vector)
  RETURNS text AS
$BODY$
DECLARE
    results text;
BEGIN
    -- This doesn't work:
    results := dblink_build_sql_delete('test_table', primary_key_attnums, 1, ARRAY['test_user']::text[]);

    -- But this one (use value instead of parameter) does work:
    --results := dblink_build_sql_delete('test_table', '1'::int2vector, 1, ARRAY['test_user']::text[]);

    --And so does this one:
    -- SELECT dblink_build_sql_delete('test_table', primary_key_attnums, 1, ARRAY['test_user']::text[]) INTO results;

    return results;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

SELECT test_assignment('1'::int2vector);
-----

and the problem was that plpgsql thought it could convert the int2vector
argument into an "expanded array".  But int2vector doesn't allow toasting
so a fortiori it can't handle being expanded.

            regards, tom lane