Обсуждение: 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==
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