Re: BUG #1643: dbf2pg broken + quick fix

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Boris van Schooten <schooten(at)cs(dot)utwente(dot)nl>, pgsql-bugs(at)postgresql(dot)org
Subject: Re: BUG #1643: dbf2pg broken + quick fix
Date: 2005-05-27 15:07:30
Message-ID: 200505271507.j4RF7UV02090@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs


Tom, where are we on this patch? Seems we need to do something.

Here is the thread:

http://archives.postgresql.org/pgsql-bugs/2005-05/msg00008.php

---------------------------------------------------------------------------

Tom Lane wrote:
> Boris van Schooten <schooten(at)cs(dot)utwente(dot)nl> writes:
> > Don't know anything about nulls in dbf though. I am not a dbase expert, I
> > just run into dbfs often when trying to enter gis data into postgis.
>
> I'm considering the following patch, which turns around the test: check
> for an empty string and if so believe it's a null, otherwise just insert
> the value as-is. I dunno if the check for null is actually meaningful,
> but I doubt this will break any cases that worked before. Comments anyone?
>
> regards, tom lane
>
>
> Index: contrib/dbase/dbf2pg.c
> ===================================================================
> RCS file: /cvsroot/pgsql/contrib/dbase/dbf2pg.c,v
> retrieving revision 1.21
> diff -c -r1.21 dbf2pg.c
> *** contrib/dbase/dbf2pg.c 14 Sep 2004 03:28:28 -0000 1.21
> --- contrib/dbase/dbf2pg.c 4 May 2005 17:55:29 -0000
> ***************
> *** 63,93 ****
> char *convert_charset(char *string);
> #endif
> void usage(void);
> - unsigned int isinteger(char *);
>
>
> -
> - unsigned int
> - isinteger(char *buff)
> - {
> - char *i = buff;
> -
> - while (*i != '\0')
> - {
> - if (i == buff)
> - if ((*i == '-') ||
> - (*i == '+'))
> - {
> - i++;
> - continue;
> - }
> - if (!isdigit((unsigned char) *i))
> - return 0;
> - i++;
> - }
> - return 1;
> - }
> -
> static inline void
> strtoupper(char *string)
> {
> --- 63,70 ----
> ***************
> *** 471,478 ****
> /* handle the date first - liuk */
> if (fields[h].db_type == 'D')
> {
> ! if ((strlen(foo) == 8) && isinteger(foo))
> {
> snprintf(pgdate, 11, "%c%c%c%c-%c%c-%c%c",
> foo[0], foo[1], foo[2], foo[3],
> foo[4], foo[5], foo[6], foo[7]);
> --- 448,462 ----
> /* handle the date first - liuk */
> if (fields[h].db_type == 'D')
> {
> ! if (strlen(foo) == 0)
> {
> + /* assume empty string means a NULL */
> + strcat(query, "\\N");
> + }
> + else if (strlen(foo) == 8 &&
> + strspn(foo, "0123456789") == 8)
> + {
> + /* transform YYYYMMDD to Postgres style */
> snprintf(pgdate, 11, "%c%c%c%c-%c%c-%c%c",
> foo[0], foo[1], foo[2], foo[3],
> foo[4], foo[5], foo[6], foo[7]);
> ***************
> *** 480,505 ****
> }
> else
> {
> ! /*
> ! * empty field must be inserted as NULL value in
> ! * this way
> ! */
> ! strcat(query, "\\N");
> }
> }
> ! else if ((fields[h].db_type == 'N') &&
> ! (fields[h].db_dec == 0))
> {
> ! if (isinteger(foo))
> ! strcat(query, foo);
> ! else
> {
> strcat(query, "\\N");
> - if (verbose)
> - fprintf(stderr, "Illegal numeric value found "
> - "in record %d, field \"%s\"\n",
> - i, fields[h].db_name);
> }
> }
> else
> {
> --- 464,482 ----
> }
> else
> {
> ! /* try to insert it as-is */
> ! strcat(query, foo);
> }
> }
> ! else if (fields[h].db_type == 'N')
> {
> ! if (strlen(foo) == 0)
> {
> + /* assume empty string means a NULL */
> strcat(query, "\\N");
> }
> + else
> + strcat(query, foo);
> }
> else
> {
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
> (send "unregister YourEmailAddressHere" to majordomo(at)postgresql(dot)org)
>

--
Bruce Momjian | http://candle.pha.pa.us
pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2005-05-27 15:15:06 Re: BUG #1643: dbf2pg broken + quick fix
Previous Message Tom Lane 2005-05-27 15:03:07 Re: UNION makes strange duplicates