Re: Bug correction - Mailing list pgsql-odbc

From Hiroshi Inoue
Subject Re: Bug correction
Date
Msg-id 3FF93015.315FF61B@tpf.co.jp
Whole thread Raw
In response to Bug correction  ("George A.J" <jinujosein@yahoo.com>)
List pgsql-odbc
"George A.J" wrote:
>
> Hi,
> i don't know how to send a fix in the diff format so i am sending the
> corected file.
> i have changed the function ResolveNumericParam() in the file
> convert.c
> the function is given billow. i have commented the added/deleted
> lines. also attaching the file convert.c.

The first bug (0.0 -> .) is fixed in CVS already.
I would fix the second bug (.009 -> .9) according to
your code.

regards,
Hiroshi Inoue

> static BOOL
> ResolveNumericParam(const SQL_NUMERIC_STRUCT *ns, char *chrform)
> {
>  static const int prec[] = {1, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25,
> 29, 32, 34, 37, 39};
>  Int4 i, j, k, ival, vlen, len, newlen;
>  unsigned char  calv[40];
>  const unsigned char *val = (const unsigned char *) ns->val;
>  BOOL next_figure;
>
>  if (0 == ns->precision)
>  {
>   strcpy(chrform, "0");
>   return TRUE;
>  }
>  else if (ns->precision < prec[sizeof(Int4)])
>  {
>   for (i = 0, ival = 0; i < sizeof(Int4) && prec[i] <= ns->precision;
> i++)
>   {
>    ival += (val[i] << (8 * i)); /* ns->val is little endian */
>   }
>   if (0 == ns->scale)
>   {
>    if (0 == ns->sign)
>     ival *= -1;
>    sprintf(chrform, "%d", ival);
>   }
>   else if (ns->scale > 0)
>   {
>    Int4 i, div, o1val, o2val;
>
>    for (i = 0, div = 1; i < ns->scale; i++)
>     div *= 10;
>    o1val = ival / div;
>    o2val = ival % div;
>    if (0 == ns->sign)
>     o1val *= -1;
>    sprintf(chrform, "%d.%0.*d", o1val, ns->scale, o2val);
>   }
>   return TRUE;
>  }
>
>  for (i = 0; i < SQL_MAX_NUMERIC_LEN && prec[i] <= ns->precision; i++)
>   ;
>  vlen = i;
>  len = 0;
>  memset(calv, 0, sizeof(calv));
>  for (i = vlen - 1; i >= 0; i--)
>  {
>   for (j = len - 1; j >= 0; j--)
>   {
>    if (!calv[j])
>     continue;
>    ival = (((Int4)calv[j]) << 8);
>    calv[j] = (ival % 10);
>    ival /= 10;
>    calv[j + 1] += (ival % 10);
>    ival /= 10;
>    calv[j + 2] += (ival % 10);
>    ival /= 10;
>    calv[j + 3] += ival;
>    for (k = j;; k++)
>    {
>     next_figure = FALSE;
>     if (calv[k] > 0)
>     {
>      if (k >= len)
>       len = k + 1;
>      while (calv[k] > 9)
>      {
>       calv[k + 1]++;
>       calv[k] -= 10;
>       next_figure = TRUE;
>      }
>     }
>     if (k >= j + 3 && !next_figure)
>      break;
>    }
>   }
>   ival = val[i];
>   if (!ival)
>    continue;
>   calv[0] += (ival % 10);
>   ival /= 10;
>   calv[1] += (ival % 10);
>   ival /= 10;
>   calv[2] += ival;
>   for (j = 0;; j++)
>   {
>    next_figure = FALSE;
>    if (calv[j] > 0)
>    {
>     if (j >= len)
>      len = j + 1;
>     while (calv[j] > 9)
>     {
>      calv[j + 1]++;
>      calv[j] -= 10;
>      next_figure = TRUE;
>     }
>    }
>    if (j >= 2 && !next_figure)
>     break;
>   }
>  }
>
>  /********* New code:*/
>
>  /*Added to fix the numeric convertion bug.
>  BUG:When 0.0 is the input function returns '.' Also if 0.0009 is
> input
>   the fnction returns '.9'*/
>
>  if (len <= ns->scale)
>   len = ns->scale + 1;
>
>  /********* End New code: */
>
>  newlen = 0;
>  if (0 == ns->sign)
>   chrform[newlen++] = '-';
>  for (i = len - 1; i >= ns->scale; i--)
>   chrform[newlen++] = calv[i] + '0';
>  if (ns->scale > 0)
>  {
>   chrform[newlen++] = '.';
>   for (; i >= 0; i--)
>    chrform[newlen++] = calv[i] + '0';
>  }
>
>  /********* deleted code:*/
>
>  /*deleted to fix the numeric convertion bug. these lines are not
> needed
>  if (0 == len)
>   chrform[newlen++] = '0';*/
>  /********* end deleted code:*/
>
>  chrform[newlen] = '\0';
>  return TRUE;
> }

pgsql-odbc by date:

Previous
From: Hiroshi Inoue
Date:
Subject: Re: pgsql 7.4 & odbc 7.3.2 (problem ?)
Next
From: "Ricky"
Date:
Subject: trigger or rule?