Hopefully someone can help with this;
I have an extension library which basically adds some common financial
functions from gnumeric. This has worked
just fine for a couple of years on a 32 bit machine running 8.1.0. and still
does. I have recently built a new
dual core 64 bit gentoo system with 8.1.0 installed.
The library in question compiles and links just fine. I install it in
/usr/lib.
When I execute the create or replace function call that also succeeds
however when I execute
the command .. for example:
select * from eomonth('10/22/2006',0);
1. Is there anything special I should have done when building postgres ?
PG_CONFIG OUTPUT:
BINDIR = /usr/local/pgsql/bin
DOCDIR = /usr/local/pgsql/doc
INCLUDEDIR = /usr/local/pgsql/include
PKGINCLUDEDIR = /usr/local/pgsql/include
INCLUDEDIR-SERVER = /usr/local/pgsql/include/server
LIBDIR = /usr/local/pgsql/lib
PKGLIBDIR = /usr/local/pgsql/lib
LOCALEDIR =
MANDIR = /usr/local/pgsql/man
SHAREDIR = /usr/local/pgsql/share
SYSCONFDIR = /usr/local/pgsql/etc
PGXS = /usr/local/pgsql/lib/pgxs/src/makefiles/pgxs.mk
CONFIGURE = '--enable-thread-safety' '--with-perl' '--with-pam'
'--with-python' '--enable-depend' '--with-gnu-ld'
CC = gcc
CPPFLAGS = -D_GNU_SOURCE
CFLAGS = -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Winline
-Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing
CFLAGS_SL = -fpic
LDFLAGS = -Wl,-rpath,/usr/local/pgsql/lib
LDFLAGS_SL =
LIBS = -lpgport -lpam -lz -lreadline -lcrypt -lresolv -lnsl -ldl -lm -lbsd
VERSION = PostgreSQL 8.1.4
which should return the end of month for argument one I get a seg fault:
********************************* FAULT MESSAGE IN LOG FILE
********************************
Nov 21 05:10:49 gideon postmaster[12461]: segfault at 0000000000000000 rip
00002b3af2c2f3b9 rsp 00007fffb8914398 error 4
CODE FOR EOMONTH:***************************** SNIPPIT
***************************************
PG_FUNCTION_INFO_V1(eomonth);
Datum
eomonth(PG_FUNCTION_ARGS)
{ text *date = PG_GETARG_TEXT_P(0); int months = PG_GETARG_INT32(1); GDate
sDate; int serialDate; int tmp = months; char mySDate[12]; char
*pyear= NULL; char *pmonth = NULL; char *pday = NULL; /* NOW FOR DATE VARS
USEDWITH parse_date */ char *pdate = NULL; char pbuf[255]; struct tm tm;
text *myRDate = (text *) palloc(VARHDRSZ + 12); VARATT_SIZEP(myRDate) = VARHDRSZ + 12;
g_date_clear(&sDate,1); memset(pbuf,'\0',sizeof(pbuf)); /*initialize buffer */
memcpy(pbuf,VARDATA(date),VARSIZE(date)-VARHDRSZ);/* copy
input string to buffer */ pdate = parse_date(pbuf,&tm); /*call parse date and see if
we know about format*/ g_date_set_parse(&sDate,pdate);/* now set the GDate object
sDate with pdate buf*/ if(g_date_valid(&sDate)) /* is the date we set valid */ {
/* * now figure the eomonth calc */
if(months > 0) {
g_date_add_months(&sDate,months); } if( months < 0)
{
g_date_subtract_months(&sDate,-months); } /*
* Now this is the real calculation */
g_date_set_day(&sDate,g_date_get_days_in_month(
g_date_get_month(&sDate),
g_date_get_year(&sDate)));
sprintf(VARDATA(myRDate),"%d/%d/%d", g_date_get_month(&sDate),
g_date_get_day(&sDate),
g_date_get_year(&sDate)); /*
elog(NOTICE,"EOMONTH(%s)",VARDATA(myRDate)); */ /*
serialDate = datetime_g_to_serial(&sDate); PG_RETURN_INT32(serialDate);
*/ pfree(myRDate);
PG_RETURN_TEXT_P(myRDate); } else { elog(ERROR,"EOMONTH date
invalid%s
",VARDATA(date)); }
}
James M Doherty
Principal
D. V. (Deus Volantis)
An IRISH Proverb
"There is no success without discipline"
Phil 3: 13 - 15 ("Press On")
JMD CONSULTING
411 Thunderbay Dr
Georgetown, TX 78626
A reputation is something others give you, HONOR is something you give
yourself.
Una reputación es algo que otras le dan, El HONOR es algo que usted se da.