diff --git a/ibm_db.c b/ibm_db.c index 256ac805..f5e9619b 100644 --- a/ibm_db.c +++ b/ibm_db.c @@ -1920,9 +1920,18 @@ static int _python_ibm_db_bind_column_helper(stmt_handle *stmt_res) case SQL_BIGINT: case SQL_DECFLOAT: - snprintf(messageStr, sizeof(messageStr), "Case SQL_BIGINT/SQL_DECFLOAT, i=%d", i); - LogMsg(DEBUG, messageStr); - in_length = stmt_res->column_info[i].size + 3; + if (column_type == SQL_BIGINT) + { + snprintf(messageStr, sizeof(messageStr), "Case SQL_BIGINT, i=%d", i); + LogMsg(DEBUG, messageStr); + in_length = stmt_res->column_info[i].size + 3; + } + else + { + snprintf(messageStr, sizeof(messageStr), "Case SQL_DECFLOAT, i=%d", i); + LogMsg(DEBUG, messageStr); + in_length = MAX_DECFLOAT_LENGTH; + } row_data->str_val = (SQLCHAR *)ALLOC_N(char, in_length); if (row_data->str_val == NULL) { @@ -2375,13 +2384,19 @@ static rowset_col_buffer *_python_ibm_db_bind_rowset_columns( memset(bufs[i].data, 0, in_length * row_array_size); break; case SQL_BIGINT: - case SQL_DECFLOAT: in_length = stmt_res->column_info[i].size + 3; bufs[i].elem_size = in_length; bufs[i].ctype = SQL_C_CHAR; bufs[i].data = (void *)ALLOC_N(char, in_length * row_array_size); if (bufs[i].data == NULL) goto alloc_error; memset(bufs[i].data, 0, in_length * row_array_size); break; + case SQL_DECFLOAT: + in_length = MAX_DECFLOAT_LENGTH; + bufs[i].elem_size = in_length; bufs[i].ctype = SQL_C_CHAR; + bufs[i].data = (void *)ALLOC_N(char, in_length * row_array_size); + if (bufs[i].data == NULL) goto alloc_error; + memset(bufs[i].data, 0, in_length * row_array_size); + break; case SQL_DECIMAL: case SQL_NUMERIC: in_length = stmt_res->column_info[i].size + stmt_res->column_info[i].scale + 2 + 1; diff --git a/ibm_db_tests/test_decfloat.py b/ibm_db_tests/test_decfloat.py index 3e2c8a5c..7606e06e 100644 --- a/ibm_db_tests/test_decfloat.py +++ b/ibm_db_tests/test_decfloat.py @@ -79,6 +79,10 @@ def run_test_decfloat(self): while ( data ): print("%s : %s : %s : %s\n" % (data[0], data[1], data[2], data[3])) data = ibm_db.fetch_both( stmt ) + if (serverinfo.DBMS_NAME[0:3] != 'IDS'): + for value in ("0.005202572", "0.00520257200000000", "-0.001234567890123456"): + stmt = ibm_db.exec_immediate(conn, "VALUES CAST('%s' AS DECFLOAT(16))" % value) + print(ibm_db.fetch_tuple(stmt)[0]) try: stmt = ibm_db.prepare(conn, query, {ibm_db.SQL_ATTR_CURSOR_TYPE: ibm_db.SQL_CURSOR_KEYSET_DRIVEN}) ibm_db.execute(stmt) @@ -99,6 +103,9 @@ def run_test_decfloat(self): #50 : Mailersoft : 134.22 : 1643.126 #60 : Kaerci : 100.97 : 9876.765 #70 : Nirvana : 100.12 : 100.567 +#0.005202572 +#0.00520257200000000 +#-0.001234567890123456 #Requested row number must be a positive value #__ZOS_EXPECTED__ #10 : Megadeth : 100.00 : 990.3567364883884 @@ -108,6 +115,9 @@ def run_test_decfloat(self): #50 : Mailersoft : 134.22 : 1643.126 #60 : Kaerci : 100.97 : 9876.765 #70 : Nirvana : 100.12 : 100.567 +#0.005202572 +#0.00520257200000000 +#-0.001234567890123456 #Requested row number must be a positive value #__SYSTEMI_EXPECTED__ #NA @@ -128,4 +138,7 @@ def run_test_decfloat(self): #50 : Mailersoft : 134.22 : 1643.126 #60 : Kaerci : 100.97 : 9876.765 #70 : Nirvana : 100.12 : 100.567 +#0.005202572 +#0.00520257200000000 +#-0.001234567890123456 #Requested row number must be a positive value