Dimitri Fontaine <[email protected]> writes:
> And currently calling SPI_connect() from _PG_init will crash the
> backend. I'll try to obtain a gdb backtrace, I've just been told about
> pre_auth_delay and post_auth_delay parameters.
Here we go:
(gdb) handle SIGABRT nopass
Signal Stop Print Pass to program Description
SIGABRT Yes Yes No Aborted
(gdb) continue
Program received signal SIGABRT, Aborted.
0xb802d424 in __kernel_vsyscall ()
(gdb) bt
#0 0xb802d424 in __kernel_vsyscall ()
#1 0xb7e7c640 in raise () from /lib/i686/cmov/libc.so.6
#2 0xb7e7dfa1 in abort () from /lib/i686/cmov/libc.so.6
#3 0x082dadde in ExceptionalCondition (conditionName=0x83cbfe0 "!(((context)
!= ((void *)0) && (((((Node*)((context)))->type) == T_AllocSetContext))))",
errorType=0x830bc09 "BadArgument", fileName=0x83be166 "mcxt.c",
lineNumber=507) at assert.c:57
#4 0x082f8abb in MemoryContextAlloc (context=0x0, size=448) at mcxt.c:507
#5 0x081a93a3 in SPI_connect () at spi.c:81
#6 0xb582cf15 in _PG_init () at pre_prepare.c:150
#7 0x082df913 in internal_load_library (libname=0x9808da4
"/home/dim/pgsql/8.3/lib/plugins/pre_prepare.so") at dfmgr.c:296
#8 0x082dfc38 in load_file (filename=0x9809d00 "$libdir/plugins/pre_prepare",
restricted=1 '\001') at dfmgr.c:153
#9 0x082e7554 in load_libraries (libraries=<value optimized out>,
gucname=0x9809d00 "$libdir/plugins/pre_prepare", restricted=1 '\001') at
miscinit.c:1185
#10 0x08233ce2 in PostgresMain (argc=4, argv=0x9807fb8, username=0x9807f90
"dim") at postgres.c:3314
#11 0x0820054c in ServerLoop () at postmaster.c:3207
#12 0x0820124b in PostmasterMain (argc=3, argv=0x97f1bd8) at postmaster.c:1029
#13 0x081b2b39 in main (argc=3, argv=0x97f1bd8) at main.c:188
And I'm runnin a CVS version of 8.3 I'm not sure is the last update in
the branch, so here's what I have at mcxt.c:507
504 void *
505 MemoryContextAlloc(MemoryContext context, Size size)
506 {
507 AssertArg(MemoryContextIsValid(context));
508
509 if (!AllocSizeIsValid(size))
510 elog(ERROR, "invalid memory alloc request size %lu",
511 (unsigned long) size);
That's with attached patch to pre_prepare.c from pgfoundry:
http://cvs.pgfoundry.org/cgi-bin/cvsweb.cgi/preprepare/preprepare/
If you need any more information from me, or for me to rerun with
another server version, please ask. I'm very interrested in being able
to prepare a query at local_preload_libraries time, if possible in 8.3
and following releases.
Regards,
--
dim
Index: pre_prepare.c
===================================================================
RCS file: /cvsroot/preprepare/preprepare/pre_prepare.c,v
retrieving revision 1.1
diff -p -u -r1.1 pre_prepare.c
--- pre_prepare.c 13 May 2009 20:54:04 -0000 1.1
+++ pre_prepare.c 25 May 2009 13:37:52 -0000
@@ -35,6 +35,7 @@
PG_MODULE_MAGIC;
+static bool pre_prepare_at_init = NULL;
static char *pre_prepare_relation = NULL;
void _PG_init(void);
@@ -125,6 +126,15 @@ int pre_prepare_all() {
*/
void
_PG_init(void) {
+ DefineCustomBoolVariable("preprepare.at_init",
+ "Do we prepare the statements at backend init start",
+ "You have to setup local_preload_libraries too",
+ &pre_prepare_at_init,
+ PGC_USERSET,
+ NULL,
+ NULL);
+ EmitWarningsOnPlaceholders("prepare.at_init");
+
DefineCustomStringVariable("preprepare.relation",
"Table name where to find statements to prepare",
"Can be schema qualified, must have columns \"name\" and \"statement\"",
@@ -132,8 +142,21 @@ _PG_init(void) {
PGC_USERSET,
NULL,
NULL);
-
EmitWarningsOnPlaceholders("prepare.relation");
+
+ if( pre_prepare_at_init ) {
+ int err;
+
+ err = SPI_connect();
+ if (err != SPI_OK_CONNECT)
+ elog(ERROR, "SPI_connect: %s", SPI_result_code_string(err));
+
+ pre_prepare_all();
+
+ err = SPI_finish();
+ if (err != SPI_OK_FINISH)
+ elog(ERROR, "SPI_finish: %s", SPI_result_code_string(err));
+ }
}
/*
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers