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 <[EMAIL PROTECTED]> 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 [EMAIL PROTECTED])
> 

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

---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

Reply via email to