IBM / db2sock-ibmi

An asynchronous PASE Db2 and IBM i integration library
MIT License
4 stars 7 forks source link

Packed/zoned decimals not working correctly #24

Closed kadler closed 6 years ago

kadler commented 6 years ago

Original report by Teemu Halmela (Bitbucket: teemu_, GitHub: Unknown).


Decimal aren't working as expected with packed and zoned numbers. If I give number 100 to 5p2 it becomes 1.00 when parsed.

I made some tests for this problem.

$ ./test1000_sql400json32 ../json/j0030_decimal_numbers1                                                                                                       
input(5000000):                                                                                                                                                                    
{"pgm":[{"name":"DECIMALS",  "lib":"DB2JSON"},
    {"s":[
        {"name":"afloat",     "type":"4f2",   "value":1000},
        {"name":"adouble",    "type":"8f3",   "value":1000},
        {"name":"apacked",    "type":"12p2",  "value":1000},
        {"name":"azoned",     "type":"12s2",  "value":1000}
    ]}
]}

output(118):
{"script":[{"pgm":["DECIMALS","DB2JSON",{"afloat":1000.00},{"adouble":1000.000},{"apacked":10.00},{"azoned":10.00}]}]}

result:
fail missing ("apacked":1000.00)
fail (-1)
kadler commented 6 years ago

Original comment by Teemu Halmela (Bitbucket: teemu_, GitHub: Unknown).


This is done.

kadler commented 6 years ago

Original comment by Tony Cairns (Bitbucket: rangercairns, GitHub: rangercairns).


Are we done with this issue? We still pondering more fate of packed and zoned decimal round vs. truncation?

kadler commented 6 years ago

Original comment by Tony Cairns (Bitbucket: rangercairns, GitHub: rangercairns).


round

Mm ... add round to avoid note about truncation behaviour (coin flip). Only one place in source (PaseToIle.c), can be easily removed, should rounding prove unpopular or defective.

#!bash

bash-4.3$ ./test1000_sql400json32 ../json/j08324_srvpgm_value_rainpack24-2_mix_decimal 
input(5000000):
{"pgm":[{"name":"RAINSRV", "lib":"DB2JSON", "func":"RAINPACK24"},
        {"s":[{"name":"a1", "type":"24p2", "value":11., "by":"val"},
              {"name":"a2", "type":"24p2", "value":00000000000000000000000022.0, "by":"val"},
              {"name":"a3", "type":"24p2", "value":12345678912345678912345678933.309999999999, "by":"val"},
              {"name":"a4", "type":"24p2", "value":44.040, "by":"val"},
              {"name":"o1", "type":"24p2", "value":55.55},
              {"name":"o2", "type":"24p2", "value":66.66},
              {"name":"o3", "type":"24p2", "value":77.77},
              {"name":"o4", "type":"24p2", "value":88.88}
             ]}
       ]}

output(199):
{"script":[{"pgm":["RAINSRV","DB2JSON","RAINPACK24",
{"a1":11.00},{"a2":22.00},
{"a3":8912345678912345678933.31},
{"a4":44.04},{"o1":11.00},{"o2":22.00},
{"o3":8912345678912345678933.31},
{"o4":44.04}]}]}

result:
success (0)
kadler commented 6 years ago

Original comment by Teemu Halmela (Bitbucket: teemu_, GitHub: Unknown).


This looks good.

I'm fine with truncation. Maybe a note should be added to the readme about this behavior.

kadler commented 6 years ago

Original comment by Tony Cairns (Bitbucket: rangercairns, GitHub: rangercairns).


Ok, try again. Thanks.

Side note ...

I could not decide extra digits past max scale should round up. Anyway, I just truncated anything past field scale size.

kadler commented 6 years ago

Original comment by Teemu Halmela (Bitbucket: teemu_, GitHub: Unknown).


Thanks, almost there.

When giving too many decimals it still breaks.

$ ./test1000_sql400json64 ../json/j0033_decimal_numbers4                                                                                                       
input(5000000):                                                                                                                                                                    
{"pgm":[{"name":"DECIMALS",  "lib":"DB2JSON"},
    {"s":[
        {"name":"afloat",     "type":"4f2",   "value":1000.000},
        {"name":"adouble",    "type":"8f3",   "value":1000.0000},
        {"name":"apacked",    "type":"12p2",  "value":1000.000},
        {"name":"azoned",     "type":"12s2",  "value":1000.000}
    ]}
]}

output(124):
{"script":[{"pgm":["DECIMALS","DB2JSON",{"afloat":1000.00},{"adouble":1000.000},{"apacked":10000.00},{"azoned":10000.00}]}]}

result:
fail missing ("apacked":1000.00)
fail (-1)
kadler commented 6 years ago

Original comment by Tony Cairns (Bitbucket: rangercairns, GitHub: rangercairns).


Ok, I have a fix seems to work for packed and zoned. Thanks.

#!bash

bash-4.3$ ./test1000_sql400json32 ../json/j08324_srvpgm_value_rainpack24-2_mix_decimal
input(5000000):
{"pgm":[{"name":"RAINSRV", "lib":"DB2JSON", "func":"RAINPACK24"},
        {"s":[{"name":"a1", "type":"24p2", "value":11., "by":"val"},
              {"name":"a2", "type":"24p2", "value":22.0, "by":"val"},
              {"name":"a3", "type":"24p2", "value":33.30, "by":"val"},
              {"name":"a4", "type":"24p2", "value":44.04, "by":"val"},
              {"name":"o1", "type":"24p2", "value":55.55},
              {"name":"o2", "type":"24p2", "value":66.66},
              {"name":"o3", "type":"24p2", "value":77.77},
              {"name":"o4", "type":"24p2", "value":88.88}
             ]}
       ]}

output(159):
{"script":[{"pgm":["RAINSRV","DB2JSON","RAINPACK24",{"a1":11.00},{"a2":22.00},{"a3":33.30},{"a4":44.04},{"o1":11.00},{"o2":22.00},{"o3":33.30},{"o4":44.04}]}]}

result:
success (0)