Hi!

>>>>> "root" == root  <[EMAIL PROTECTED]> writes:

>> Description:
root> In certain cases the select fails (ie (a) does not return required rows, or (b) 
returns non-wanted rows (cannot repeat (b)))
root> The problem seems to be related to negative values in decimal type fields and in 
query against those fields.
root> the problem is applicable to several 3.22.* versions on different machines, have 
no possibility to check with 3.23.*.

>> How-To-Repeat:

<cut>

mysql> select * from dataformats where minvalue(=-1 and maxvalue)=-1 and 
datatype_id=16;
root> Empty set (0.00 sec)

Fix:

===== sql/field.cc 1.28 vs edited =====
*** sql/field.cc-1.28   Mon Jan 15 22:57:08 2001
--- edited/sql/field.cc Tue Jan 16 02:07:57 2001
***************
*** 597,620 ****
  int Field_decimal::cmp(const char *a_ptr,const char *b_ptr)
  {
    const char *end;
    /* First remove prefixes '0', ' ', and '-' */
    for (end=a_ptr+field_length;
         a_ptr != end &&
         (*a_ptr == *b_ptr ||
          ((isspace(*a_ptr)  || *a_ptr == '+' || *a_ptr == '0') &&
           (isspace(*b_ptr) || *b_ptr == '+' || *b_ptr == '0')));
!        a_ptr++,b_ptr++) ;
! 
    if (a_ptr == end)
      return 0;
-   int swap=0;
    if (*a_ptr == '-')
!   {
!     if (*b_ptr != '-')
!       return -1;
!     swap= -1 ^ 1;                             // Swap result
!     a_ptr++, b_ptr++;
!   } else if (*b_ptr == '-')
      return 1;
  
    while (a_ptr != end)
--- 597,619 ----
  int Field_decimal::cmp(const char *a_ptr,const char *b_ptr)
  {
    const char *end;
+   int swap=0;
    /* First remove prefixes '0', ' ', and '-' */
    for (end=a_ptr+field_length;
         a_ptr != end &&
         (*a_ptr == *b_ptr ||
          ((isspace(*a_ptr)  || *a_ptr == '+' || *a_ptr == '0') &&
           (isspace(*b_ptr) || *b_ptr == '+' || *b_ptr == '0')));
!        a_ptr++,b_ptr++)
!   {
!     if (*a_ptr == '-')                                // If both numbers are negative
!       swap= -1 ^ 1;                           // Swap result      
!   }
    if (a_ptr == end)
      return 0;
    if (*a_ptr == '-')
!     return -1;
!   else if (*b_ptr == '-')
      return 1;
  
    while (a_ptr != end)

Regards,
Monty

---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to