I wrote:
> You're right, we do cheat a little on negative numeric constants --- I
> had forgotten about the doNegate() hack in gram.y.  We could conceivably
> fix it to cheat some more.  Specifically it looks like make_const() in
> parse_node.c could check for the possibility that a T_Float fits in INT4
> --- which would happen only for the case of -2147483648, since any
> smaller absolute value would have been T_Integer to start with.

I've applied the attached patch to CVS HEAD.  I'm not going to risk
back-patching this, but feel free to use the patch locally if it's
important to you.

                        regards, tom lane

*** src/backend/parser/parse_node.c.orig        Fri Dec 31 17:45:55 2004
--- src/backend/parser/parse_node.c     Sat Apr 23 14:28:03 2005
***************
*** 304,314 ****
                        /* could be an oversize integer as well as a float ... 
*/
                        if (scanint8(strVal(value), true, &val64))
                        {
!                               val = Int64GetDatum(val64);
  
!                               typeid = INT8OID;
!                               typelen = sizeof(int64);
!                               typebyval = false;              /* XXX might 
change someday */
                        }
                        else
                        {
--- 304,331 ----
                        /* could be an oversize integer as well as a float ... 
*/
                        if (scanint8(strVal(value), true, &val64))
                        {
!                               /*
!                                * It might actually fit in int32. Probably 
only INT_MIN can
!                                * occur, but we'll code the test generally 
just to be sure.
!                                */
!                               int32   val32 = (int32) val64;
  
!                               if (val64 == (int64) val32)
!                               {
!                                       val = Int32GetDatum(val32);
! 
!                                       typeid = INT4OID;
!                                       typelen = sizeof(int32);
!                                       typebyval = true;
!                               }
!                               else
!                               {
!                                       val = Int64GetDatum(val64);
! 
!                                       typeid = INT8OID;
!                                       typelen = sizeof(int64);
!                                       typebyval = false;              /* XXX 
might change someday */
!                               }
                        }
                        else
                        {

---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to