Issue 394: PyODBC Connect to Ingres String Insert Greater Than 255 Fails with No Error
Status:  New
Owner: ----
Reported by fastel...@gmail.com, Mar 6, 2015
What steps will reproduce the problem?
1. Insert a string > than length 255

What is the expected output? What do you see instead?
No error exception is thrown, DBMS errors are present in the log, and no row is inserted.

databasehost::[56410           , 02684100]: Tue Mar  3 09:27:22 2015 E_DM9B08_DMPE_NEED_TRAN	An attempt was made to define a temporary DMPE object while no transaction was in progress.
databasehost::[56410           , 02684100]: Tue Mar  3 09:27:22 2015 E_AD7008_ADP_DELETE_FAILURE	An error was encountered performing an ADP_DELETE operation on a peripheral datatype.

What version of the product are you using? On what operating system?

See below

Please provide any additional information below.

Hi,

I'm trying to insert a string into a table with a single varchar(2000) column for these tests. The insert fails and the Ingres DBMS logs an error to it's log file but cursor.execute does not throw an exception so from the python perspective it appears that the insert was successful. The same insert will work using Anaconda python and a trial version of their pyodbc module which would be using the same Ingres shared object module.



All tests performed using python2.7 on Ubuntu 8.04.3 LTS


The following table is used.

create table testing (                                             
    col1 varchar(2000) not null with default                                
);                                                                       

Ingres environment variables

II_ODBC_WCHAR_SIZE=2
LD_LIBRARY_PATH=/opt/Ingres/IngresII/ingres/lib
ODBCSYSINI=/opt/Ingres/IngresII/ingres/files/
ODBCINI=/opt/Ingres/IngresII/ingres/files/odbc.ini
II_SYSTEM=/opt/Ingres/IngresII


TEST 1 Using Ingres version II 2.5/0011 (su4.us5/00)

>>> db=pyodbc.connect("DRIVER=Ingres;SRVR=HOSTNAME;DB=devdata")
>>> cursor = db.cursor()
>>> sql2='insert into testing(col1) values (?)'
>>> bigStr=''        
>>> for i in range(0,1500):
...  bigStr += 'a'
...
>>> cursor.execute(sql2,[bigStr])
<pyodbc.Cursor object at 0xb7d3a918>
>>> db.commit()
>>> sql3='select * from testing'
>>> cursor2=db.cursor()
>>> cursor2.execute(sql3)
<pyodbc.Cursor object at 0xb7aacb80>
>>> res=cursor2.fetchall()
#No results. Failed to insert row and did not throw an exception
>>> res
[]
>>> len(bigStr)
1500
#Try inserting string with length 255
>>> cursor.execute(sql2,[bigStr[0:255]])
<pyodbc.Cursor object at 0xb7d3a918>
>>> db.commit()
>>> cursor2.execute(sql3)
<pyodbc.Cursor object at 0xb7aacb80>
>>> res=cursor2.fetchall()
>>> res
[('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', )]
>>> bigStr=''
>>> for a in range(0,1500):
...  bigStr += 'b'
#Now prove that 255 is the magic number by trying 256
>>> cursor.execute(sql2,[bigStr[0:256]])
<pyodbc.Cursor object at 0xb7d3a918>
>>> db.commit()
>>> cursor2.execute(sql3)
<pyodbc.Cursor object at 0xb7aacb80>
>>> res=cursor2.fetchall()
#No results for bigStr with b
>>> res
[('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', )]
>>> 



TEST 2 NEW ATTEMPT USING Ingres version II 10.2.0 (a64.lnx/100) YIELDS THE SAME RESULTS

>>> import pyodbc
>>> db=pyodbc.connect("DRIVER=Ingres;SRVR=HOSTNAME;DB=modeldata")
>>> cursor = db.cursor()
>>> sql2='insert into testing(col1) values (?)'
>>> bigStr=''  
>>> for i in range(0,1500):
...  bigStr += 'a'
...
>>> cursor.execute(sql2,[bigStr])
<pyodbc.Cursor object at 0xb7c77c98>
>>> db.commit()
>>> sql3='select * from testing'
>>> cursor2=db.cursor()
>>> cursor2.execute(sql3)
<pyodbc.Cursor object at 0xb79ee790>
>>> res=cursor2.fetchall()
>>> res
[]
>>> len(bigStr)
1500
>>> cursor.execute(sql2,[bigStr[0:255]])
<pyodbc.Cursor object at 0xb7c77c98>
>>> db.commit()
>>> cursor2.execute(sql3)
<pyodbc.Cursor object at 0xb79ee790>
>>> res=cursor2.fetchall()
>>> res
[('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', )]
>>> bigStr=''
>>> for a in range(0,1500):
...  bigStr += 'b'
...
>>> cursor.execute(sql2,[bigStr[0:256]])
<pyodbc.Cursor object at 0xb7c77c98>
>>> db.commit()
>>> cursor2.execute(sql3)
<pyodbc.Cursor object at 0xb79ee790>
>>> res=cursor2.fetchall()
>>> res
[('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', )]
>>> 


TEST 3 ANACONDA PYTHON WITH io.pyodbc trial driver version from Continuum Analytics using Ingres version II 2.5/0011 (su4.us5/00)


Python 2.7.9 |Anaconda 2.1.0 (32-bit)| (default, Dec 15 2014, 10:34:00)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://binstar.org
>>> import iopro.pyodbc as pyodbc
Vendor:  Continuum Analytics, Inc.
Package: iopro
Message: trial mode expires in 26 days
>>> db=pyodbc.connect("DRIVER=Ingres;SRVR=sheridan;DB=devdata")
>>> cursor = db.cursor()
>>> sql2='insert into testing(col1) values (?)'
>>> bigStr=''     
>>> for i in range(0,1500):
...   bigStr += 'a'
...
>>> cursor.execute(sql2,[bigStr])
<pyodbc.Cursor object at 0xb65d1ad8>
>>> db.commit()
>>> sql3='select * from testing'
>>> cursor2=db.cursor()
>>> cursor2.execute(sql3)
<pyodbc.Cursor object at 0xb65d1b10>
>>> res=cursor2.fetchall()
>>> res
[('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', )]
>>> 
>>> len(res[0][0])
1500