Обсуждение: BUG #10014: Does not work PQfn in libpq with array
The following bug has been logged on the website: Bug reference: 10014 Logged by: Vitalyev Aleksey Email address: aleksey.vitaliev@transas.com PostgreSQL version: 9.2.4 Operating system: Windows 7 Description: I have a store procedure __a(INT[] args). I try execute this procedure with libpq and call PQfn function. How should I transmit array of int from c++ code? I get only this message "number of array dimensions (16777216) exceeds the maximum allowed (6)" This is my code: int result_buf = 0; int result_len = 0; int result_is_int = 0; PQArgBlock args[1]; int iFrom[] = {1,2}; args[0].len = sizeof(iFrom) * 2; args[0].isint = 0; args[0].u.ptr = reinterpret_cast<int*> ( iFrom ); PGresult* res = PQfn( m_conn, 1447769, &result_buf, &result_len, result_is_int, args, 1 ); if ( PQresultStatus(res) != PGRES_COMMAND_OK ) { ::OutputDebugStringA( m_stringUtil.FormatEx("ExecFunc failed!\n%s\n", PQresultErrorMessage(res)) ); ReleaseResult( res ); return false; } ReleaseResult( res ); return true; This is store procedure: CREATE OR REPLACE FUNCTION ___a(oldUniqId INT[]) RETURNS BOOLEAN AS $$ BEGIN RETURN TRUE; END $$ LANGUAGE plpgsql VOLATILE STRICT; ALTER FUNCTION ___a(INT[]) OWNER TO postgres;
On 04/14/2014 11:42 AM, aleksey.vitaliev@transas.com wrote: > The following bug has been logged on the website: > > Bug reference: 10014 > Logged by: Vitalyev Aleksey > Email address: aleksey.vitaliev@transas.com > PostgreSQL version: 9.2.4 > Operating system: Windows 7 > Description: > > I have a store procedure __a(INT[] args). I try execute this procedure with > libpq and call PQfn function. How should I transmit array of int from c++ > code? You probably shouldn't be using the PQfn function. Per the manual: > Tip: This interface is somewhat obsolete, as one can achieve similar > performance and greater functionality by setting up a prepared > statement to define the function call. Then, executing the statement > with binary transmission of parameters and results substitutes for a > fast-path function call. Constructing the binary format for arrays is quite complicated. You can look at the array_send/array_recv functions in the PostgreSQL source tree to see what's involved. There's also a library called libpqtypes out there that can do it for you. But it's a lot simpler to just use the text format. Yet another approach is to pass the elements to the server separately, and construct the array in the server. Something like "SELECT myprocedure(ARRAY[?, ?, ?])". - Heikki