I am sorry I used different query in my my last reply and yes you are correct 
Tom. Using the $1 worked and the back-end indeed prepared the statement 
successfully but this will force me to do some work on the input array that 
contains the dynamic elements to comply with string_to_array delimiter when 
calling PQexecPrepared(). I would really like to just pass an array of filters 
of type (const char* const*) to PQexecPrepared's paramValues[] parameter 
instead of making it some sort of csv string. 


Here is a sample working code:

char *query="select codec_id,fs_name,pt from codec_defs where fs_name = 
ANY(string_to_array($1, ','))";
PGresult *res=PQprepare(conn,"codecs",query,1,NULL);
char *input[1] ={"G729,PCMU"};
PQclear(res);
res=PQexecPrepared(conn,"codecs",1,(const char* const*)input,NULL ,NULL,0);

//The second version( ANY($1::text[] ) 

char *query="select codec_id,fs_name,pt from codec_defs where fs_name = 
ANY($1::text[])";
//this gets prepared successfully
PGresult *res=PQprepare(conn,"codecs",query,1,NULL);

char *input[2] ={"G729","PCMU"};
PQclear(res);
//the below generate an erro:
res=PQexecPrepared(conn,"codecs",2,(const char* const*)input,NULL ,NULL,0);

//PQexecPrepared() generates Error:
ERROR: bind message supplies 2 parameters, but prepared statement "codecs" 
requires 1



     On Tuesday, November 24, 2020, 01:18:15 PM PST, Tom Lane 
<t...@sss.pgh.pa.us> wrote:  
 
 Dave Greeko <davegre...@yahoo.com> writes:
> I tried both and I am getting syntax error.

> char *query="select codec_id,fs_name,pt from codec_defs where pt = 
> ANY(string_to_array(?, ','))";
> OR
> char *query="select codec_id,fs_name,pt from codec_defs where pt = 
> ANY(?::text)";

> PGresult *res=PQprepare(conn,"codecs",query,1,NULL);

Well, your first problem is that "?" is not the parameter symbol
understood by libpq+backend.  Try "$1".  The other problem,
at least for the second version of that, is that you want to be
passing a text array not a single text value --- so it needs to
look more like "where pt = ANY($1::text[])".

            regards, tom lane  

Reply via email to