Re: C-Language Functions: VarChar and Text arguments - Mailing list pgsql-novice
From | Carel Combrink |
---|---|
Subject | Re: C-Language Functions: VarChar and Text arguments |
Date | |
Msg-id | 20100406115852.u3jszisoow48oksc@student.up.ac.za Whole thread Raw |
In response to | C-Language Functions: VarChar and Text arguments (Carel Combrink <s25291930@tuks.co.za>) |
Responses |
Re: C-Language Functions: VarChar and Text arguments
|
List | pgsql-novice |
Quoting Brian Modra <brian@zwartberg.com>: > On 06/04/2010, Carel Combrink <s25291930@tuks.co.za> wrote: >> Hi, >> >> I have problems using 'varchar' and 'text' arguments for C functions. >> Perhaps I am doing something wrong. I get garbage when I want to use >> the arguments passed to the function. See the example: >> >> My function as defined in my C program: >> /*===========================================*/ >> PG_FUNCTION_INFO_V1(Test_Function); >> >> Datum Test_Function(PG_FUNCTION_ARGS) /* varChar(10) varChar Text*/ >> { >> VarChar* arg0_varChar10 = PG_GETARG_VARCHAR_P(0); >> VarChar* arg1_varChar = PG_GETARG_VARCHAR_P(1); >> text* arg2_textp = PG_GETARG_VARCHAR_P(2); >> >> ereport( INFO, ( errcode( ERRCODE_SUCCESSFUL_COMPLETION ), >> errmsg("Inputs :\n\targ0: %s\n\targ1: %s\n\targ2: >> %s\n",VARDATA(arg0_varChar10), VARDATA(arg1_varChar), >> VARDATA(arg2_textp)))); >> >> PG_RETURN_INT32(0); >> } >> /*=============================================*/ >> >> I run the following in PostgreSQL 8.4 to create the function: >> ------------------------------------------------ >> CREATE OR REPLACE FUNCTION Test_Function(varchar(10), varchar, text) >> RETURNS integer >> AS '$libdir/myDir/myLib', 'Test_Function' >> LANGUAGE C >> VOLATILE >> STRICT >> SECURITY DEFINER; >> ------------------------------------------------ >> >> The output I get when I call the function: >> -------------------------------------------- >> My_database=# SELECT Test_Function('arg0', 'arg1', 'arg2'); >> >> is: >> >> INFO: Inputs : >> arg0: arg�V"� >> arg1: arg1��O" >> arg2: arg2��O" >> >> test_function >> --------------- >> 0 >> (1 row) >> -------------------------------------------- >> >> What is the 'garbage' I see at the end of the output? >> Am I calling the correct functions in my C code to retrieve the >> arguments and then the correct ones to display them? > > You need to use a text* structure. See this page, it explains it all: > http://www.postgresql.org/docs/8.2/static/xfunc-c.html > One thing I noted: in my function I used "text* arg2_textp = PG_GETARG_VARCHAR_P(2);" I changed this to "PG_GETARG_TEXT_P(2)" but it made no difference. If you look closely to the function I am using the text* structure. If I copy and paste the function "copytext" into my library and compile and create the funciton (see http://www.postgresql.org/docs/8.4/static/xfunc-c.html) an add the line "ereport( INFO, ( errcode( ERRCODE_SUCCESSFUL_COMPLETION ), errmsg("Text: %s", VARDATA(new_t))));" and call the function from postgreSQL I get the following output: SELECT copytext('test_string'); INFO: Text: test_stringES/postgres-8.4.mo copytext ------------- test_string (1 row) (NOTE: after the first call to the function it all seems fine, but when I rerun the same command (press up and enter) I get the above output) I can see that the string that gets returned is correct but when I try to access the data part of the argument in the function using the VARDATA(new_t) command I get garbage. Am I using the correct command to access the data portion of the text* structure. According to the documentation at the link the VARDATA should return the data portions of the text* structure but it is giving me garbage. I get the same output when using "new_t->vl_dat" in stead of "VARDATA(new_t)". >> >> In my original function I want to send the name of an entity to the >> database and then add the name to a table but this is a problem if the >> name is garbled. >> >> Using: PostgreSQL 8.4 >> OS: Linux Ubuntu 9.10 Karmic Koala >> >> -- >> Carel Combrink >> s25291930@tuks.co.za >> >> This message and attachments are subject to a disclaimer. Please refer >> to www.it.up.ac.za/documentation/governance/disclaimer/ for full >> details. / Hierdie boodskap en aanhangsels is aan 'n vrywaringsklousule >> onderhewig. Volledige besonderhede is by >> www.it.up.ac.za/documentation/governance/disclaimer/ beskikbaar. >> >> >> >> -- >> Sent via pgsql-novice mailing list (pgsql-novice@postgresql.org) >> To make changes to your subscription: >> http://www.postgresql.org/mailpref/pgsql-novice >> > > -- > Brian Modra Land line: +27 23 5411 462 > Mobile: +27 79 69 77 082 > 5 Jan Louw Str, Prince Albert, 6930 > Postal: P.O. Box 2, Prince Albert 6930 > South Africa > http://www.zwartberg.com/ > -- Carel Combrink s25291930@tuks.co.za This message and attachments are subject to a disclaimer. Please refer to www.it.up.ac.za/documentation/governance/disclaimer/ for full details. / Hierdie boodskap en aanhangsels is aan 'n vrywaringsklousule onderhewig. Volledige besonderhede is by www.it.up.ac.za/documentation/governance/disclaimer/ beskikbaar.
pgsql-novice by date: