Skip to content

Commit c2c8d54

Browse files
On Windows, sizeof(long) = 4 which means that integers between 10 and 18 digits
were not converted to Python correctly (#70).
1 parent a48fcdf commit c2c8d54

File tree

3 files changed

+24
-21
lines changed

3 files changed

+24
-21
lines changed

src/Variable.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ static PyMethodDef g_VariableMethods[] = {
123123
//-----------------------------------------------------------------------------
124124
static udt_VariableType *VarType_FromDataTypeInfo(dpiDataTypeInfo *info)
125125
{
126+
static int maxLongSafeDigits = sizeof(long) >= 8 ? 18 : 9;
126127
char message[120];
127128

128129
switch (info->oracleTypeNum) {
@@ -145,7 +146,7 @@ static udt_VariableType *VarType_FromDataTypeInfo(dpiDataTypeInfo *info)
145146
if (info->scale == 0 ||
146147
(info->scale == -127 && info->precision == 0)) {
147148
if (info->precision > 0 &&
148-
info->precision <= DPI_MAX_INT64_PRECISION)
149+
info->precision <= maxLongSafeDigits)
149150
return &vt_NumberAsInteger;
150151
return &vt_NumberAsLongInteger;
151152
}

test/NumberVar.py

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,21 @@ def outputTypeHandlerDecimal(self, cursor, name, defaultType, size,
2525
arraysize = cursor.arraysize)
2626

2727
def setUp(self):
28-
BaseTestCase.setUp(self)
29-
self.rawData = []
30-
self.dataByKey = {}
31-
for i in range(1, 11):
32-
numberCol = i + i * 0.25
33-
floatCol = i + i * 0.75
34-
unconstrainedCol = i ** 3 + i * 0.5
35-
if i % 2:
36-
nullableCol = long(143) ** i
37-
else:
38-
nullableCol = None
39-
dataTuple = (i, numberCol, floatCol, unconstrainedCol, nullableCol)
40-
self.rawData.append(dataTuple)
41-
self.dataByKey[i] = dataTuple
28+
BaseTestCase.setUp(self)
29+
self.rawData = []
30+
self.dataByKey = {}
31+
for i in range(1, 11):
32+
numberCol = i + i * 0.25
33+
floatCol = i + i * 0.75
34+
unconstrainedCol = i ** 3 + i * 0.5
35+
if i % 2:
36+
nullableCol = long(143) ** i
37+
else:
38+
nullableCol = None
39+
dataTuple = (i, long(38) ** i, numberCol, floatCol,
40+
unconstrainedCol, nullableCol)
41+
self.rawData.append(dataTuple)
42+
self.dataByKey[i] = dataTuple
4243

4344
def testBindBoolean(self):
4445
"test binding in a boolean"
@@ -131,7 +132,7 @@ def testBindNull(self):
131132
def testBindNumberArrayDirect(self):
132133
"test binding in a number array"
133134
returnValue = self.cursor.var(cx_Oracle.NUMBER)
134-
array = [r[1] for r in self.rawData]
135+
array = [r[2] for r in self.rawData]
135136
statement = """
136137
begin
137138
:returnValue := pkg_TestNumberArrays.TestInArrays(
@@ -152,7 +153,7 @@ def testBindNumberArrayBySizes(self):
152153
"test binding in a number array (with setinputsizes)"
153154
returnValue = self.cursor.var(cx_Oracle.NUMBER)
154155
self.cursor.setinputsizes(array = [cx_Oracle.NUMBER, 10])
155-
array = [r[1] for r in self.rawData]
156+
array = [r[2] for r in self.rawData]
156157
self.cursor.execute("""
157158
begin
158159
:returnValue := pkg_TestNumberArrays.TestInArrays(
@@ -167,8 +168,7 @@ def testBindNumberArrayByVar(self):
167168
"test binding in a number array (with arrayvar)"
168169
returnValue = self.cursor.var(cx_Oracle.NUMBER)
169170
array = self.cursor.arrayvar(cx_Oracle.NUMBER,
170-
[r[1] for r in self.rawData])
171-
array.setvalue(0, [r[1] for r in self.rawData])
171+
[r[2] for r in self.rawData])
172172
self.cursor.execute("""
173173
begin
174174
:returnValue := pkg_TestNumberArrays.TestInArrays(
@@ -197,7 +197,7 @@ def testBindZeroLengthNumberArrayByVar(self):
197197
def testBindInOutNumberArrayByVar(self):
198198
"test binding in/out a number array (with arrayvar)"
199199
array = self.cursor.arrayvar(cx_Oracle.NUMBER, 10)
200-
originalData = [r[1] for r in self.rawData]
200+
originalData = [r[2] for r in self.rawData]
201201
expectedData = [originalData[i - 1] * 10 for i in range(1, 6)] + \
202202
originalData[5:]
203203
array.setvalue(0, originalData)
@@ -266,6 +266,7 @@ def testCursorDescription(self):
266266
self.cursor.execute("select * from TestNumbers")
267267
self.assertEqual(self.cursor.description,
268268
[ ('INTCOL', cx_Oracle.NUMBER, 10, None, 9, 0, 0),
269+
('LONGINTCOL', cx_Oracle.NUMBER, 17, None, 16, 0, 0),
269270
('NUMBERCOL', cx_Oracle.NUMBER, 13, None, 9, 2, 0),
270271
('FLOATCOL', cx_Oracle.NUMBER, 127, None, 126, -127, 0),
271272
('UNCONSTRAINEDCOL', cx_Oracle.NUMBER, 127, None, 0, -127, 0),

test/sql/SetupTest.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ create or replace type &main_user..udt_Building as object (
9595
-- create tables
9696
create table &main_user..TestNumbers (
9797
IntCol number(9) not null,
98+
LongIntCol number(16) not null,
9899
NumberCol number(9, 2) not null,
99100
FloatCol float not null,
100101
UnconstrainedCol number not null,
@@ -199,7 +200,7 @@ create table &main_user..TestBuildings (
199200
begin
200201
for i in 1..10 loop
201202
insert into &main_user..TestNumbers
202-
values (i, i + i * 0.25, i + i * .75, i * i * i + i *.5,
203+
values (i, power(38, i), i + i * 0.25, i + i * .75, i * i * i + i *.5,
203204
decode(mod(i, 2), 0, null, power(143, i)));
204205
end loop;
205206
end;

0 commit comments

Comments
 (0)