• Matthew Douglass's avatar
    Fix conversion of numbers in lua args to redis args (#13115) · 1caaf581
    Matthew Douglass authored
    
    
    Since lua_Number is not explicitly an integer or a double, we need to
    make an effort
    to convert it as an integer when that's possible, since the string could
    later be used
    in a context that doesn't support scientific notation (e.g. 1e9 instead
    of 100000000).
    
    Since fpconv_dtoa converts numbers with the equivalent of `%f` or `%e`,
    which ever is shorter,
    this would break if we try to pass a long integer number to a command
    that takes integer.
    we'll get an implicit conversion to string in Lua, and then the parsing
    in getLongLongFromObjectOrReply will fail.
    
    ```
    > eval "redis.call('hincrby', 'key', 'field', '1000000000')" 0
    (nil)
    > eval "redis.call('hincrby', 'key', 'field', tonumber('1000000000'))" 0
    (error) ERR value is not an integer or out of range script: ac99c32e4daf7e300d593085b611de261954a946, on @user_script:1.
    ```
    
    Switch to using ll2string if the number can be safely represented as a
    long long.
    
    The problem was introduced in #10587 (Redis 7.2).
    closes #13113.
    
    ---------
    Co-authored-by: default avatarBinbin <binloveplay1314@qq.com>
    Co-authored-by: default avatardebing.sun <debing.sun@redis.com>
    Co-authored-by: default avatarOran Agra <oran@redislabs.com>
    (cherry picked from commit 5fdaa53d)
    1caaf581
scripting.tcl 78.7 KB