Skip site navigation (1) Skip section navigation (2)

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search for
  Advanced Search

C LIBRARY EXTENSION SEGFAULT



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 USED WITH 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.





Home | Main Index | Thread Index

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group