Thread: Recreate C functions?
Hi, I seem to be having trouble recreating C functions, the source: === test.c ==== #include <postgres.h> #include <fmgr.h> PG_MODULE_MAGIC; int32 plpgsql_test(text* s) { return 100; } === end === Then compile: $ cc -fpic -c -I/usr/include/pgsql/server test.c $ ld -shared -o funcs.so test.o Then create the function: CREATE FUNCTION plpgsql_test(text) RETURNS integer AS '/storage/Scripts/plpgsql/funcs', 'plpgsql_test' LANGUAGE C STRICT IMMUTABLE; So far it works: > select plpgsql_test('abc'); 100 The problem is if I change test.c like: return 200; Then recompile, drop and create the function it still returns 100? However if I compile it as funcs2.so it will then createthe function with the correct 200 result ... what am I doing wrong? Thanks, Elliot
2010/12/14 Elliot Chance <elliotchance@gmail.com>: > Hi, > > I seem to be having trouble recreating C functions, the source: > > === test.c ==== > #include <postgres.h> > #include <fmgr.h> > > PG_MODULE_MAGIC; > > int32 plpgsql_test(text* s) { > return 100; > } > === end === > > Then compile: > $ cc -fpic -c -I/usr/include/pgsql/server test.c > $ ld -shared -o funcs.so test.o > > Then create the function: > CREATE FUNCTION plpgsql_test(text) RETURNS integer > AS '/storage/Scripts/plpgsql/funcs', 'plpgsql_test' > LANGUAGE C STRICT IMMUTABLE; > > So far it works: >> select plpgsql_test('abc'); > 100 > > The problem is if I change test.c like: > return 200; > > Then recompile, drop and create the function it still returns 100? However if I compile it as funcs2.so it will then createthe function with the correct 200 result ... what am I doing wrong? > you need reload library. I don't know, if it is really necessary, but I restart server when I reinstall (after recompilation) some code. Regards Pavel Stehule > Thanks, > Elliot > > > -- > Sent via pgsql-general mailing list (pgsql-general@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-general >
Hello it's maybe offtopic - you use a deprecated API better to use V1 interface. Regards Pavel Stehule 2010/12/14 Elliot Chance <elliotchance@gmail.com>: > Hi, > > I seem to be having trouble recreating C functions, the source: > > === test.c ==== > #include <postgres.h> > #include <fmgr.h> > > PG_MODULE_MAGIC; > > int32 plpgsql_test(text* s) { > return 100; > } > === end === > > Then compile: > $ cc -fpic -c -I/usr/include/pgsql/server test.c > $ ld -shared -o funcs.so test.o > > Then create the function: > CREATE FUNCTION plpgsql_test(text) RETURNS integer > AS '/storage/Scripts/plpgsql/funcs', 'plpgsql_test' > LANGUAGE C STRICT IMMUTABLE; > > So far it works: >> select plpgsql_test('abc'); > 100 > > The problem is if I change test.c like: > return 200; > > Then recompile, drop and create the function it still returns 100? However if I compile it as funcs2.so it will then createthe function with the correct 200 result ... what am I doing wrong? > > Thanks, > Elliot > > > -- > Sent via pgsql-general mailing list (pgsql-general@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-general >
OK, my fault, in the docs:
"After it is used for the first time, a dynamically loaded object file is retained in memory. Future calls in the same session to the function(s) in that file will only incur the small overhead of a symbol table lookup. If you need to force a reload of an object file, for example after recompiling it, begin a fresh session."
So this works for testing:
psql -U fts -c "select plpgsql_test('abc');"
On 14/12/2010, at 7:52 PM, Pavel Stehule wrote:
Hello
it's maybe offtopic - you use a deprecated API
better to use V1 interface.
Regards
Pavel Stehule
2010/12/14 Elliot Chance <elliotchance@gmail.com>:Hi,I seem to be having trouble recreating C functions, the source:=== test.c ====#include <postgres.h>#include <fmgr.h>PG_MODULE_MAGIC;int32 plpgsql_test(text* s) {return 100;}=== end ===Then compile:$ cc -fpic -c -I/usr/include/pgsql/server test.c$ ld -shared -o funcs.so test.oThen create the function:CREATE FUNCTION plpgsql_test(text) RETURNS integerAS '/storage/Scripts/plpgsql/funcs', 'plpgsql_test'LANGUAGE C STRICT IMMUTABLE;So far it works:select plpgsql_test('abc');100The problem is if I change test.c like:return 200;Then recompile, drop and create the function it still returns 100? However if I compile it as funcs2.so it will then create the function with the correct 200 result ... what am I doing wrong?Thanks,Elliot--Sent via pgsql-general mailing list (pgsql-general@postgresql.org)To make changes to your subscription:http://www.postgresql.org/mailpref/pgsql-general
2010/12/14 Elliot Chance <elliotchance@gmail.com>: > OK, my fault, in the docs: > "After it is used for the first time, a dynamically loaded object file is > retained in memory. Future calls in the same session to the function(s) in > that file will only incur the small overhead of a symbol table lookup. If > you need to force a reload of an object file, for example after recompiling > it, begin a fresh session." > So this works for testing: > psql -U fts -c "select plpgsql_test('abc');" > On 14/12/2010, at 7:52 PM, Pavel Stehule wrote: > good to know. regards Pavel > Hello > > it's maybe offtopic - you use a deprecated API > > better to use V1 interface. > > Regards > > Pavel Stehule > > 2010/12/14 Elliot Chance <elliotchance@gmail.com>: > > Hi, > > I seem to be having trouble recreating C functions, the source: > > === test.c ==== > > #include <postgres.h> > > #include <fmgr.h> > > PG_MODULE_MAGIC; > > int32 plpgsql_test(text* s) { > > return 100; > > } > > === end === > > Then compile: > > $ cc -fpic -c -I/usr/include/pgsql/server test.c > > $ ld -shared -o funcs.so test.o > > Then create the function: > > CREATE FUNCTION plpgsql_test(text) RETURNS integer > > AS '/storage/Scripts/plpgsql/funcs', 'plpgsql_test' > > LANGUAGE C STRICT IMMUTABLE; > > So far it works: > > select plpgsql_test('abc'); > > 100 > > The problem is if I change test.c like: > > return 200; > > Then recompile, drop and create the function it still returns 100? However > if I compile it as funcs2.so it will then create the function with the > correct 200 result ... what am I doing wrong? > > Thanks, > > Elliot > > > -- > > Sent via pgsql-general mailing list (pgsql-general@postgresql.org) > > To make changes to your subscription: > > http://www.postgresql.org/mailpref/pgsql-general > > >