Bug #96701 using fetchmany of mysql python connector returns incorrect result
| Submitted: | 29 Aug 2019 20:05 | Modified: | 12 Dec 2019 5:07 |
|---|---|---|---|
| Reporter: | Xin Xiao | Email Updates: | |
| Status: | Duplicate | Impact on me: | |
| Category: | Connector / Python | Severity: | S3 (Non-critical) |
| Version: | 8.0.17, 8.0.18 | OS: | Linux (Linux Mint 19.2) |
| Assigned to: | CPU Architecture: | Any |
[29 Aug 2019 20:14]
Xin Xiao
the screenshot showing the table in my database
Attachment: Screen Shot 2019-08-29 at 4.13.00 PM.png (image/png, text), 1.80 MiB.
[29 Aug 2019 20:15]
Xin Xiao
the execution of repeated fetchmany
Attachment: Screen Shot 2019-08-29 at 4.13.53 PM.png (image/png, text), 2.42 MiB.
[30 Aug 2019 10:46]
MySQL Verification Team
Hello Xin iao, Thank you for the report. regards, Umesh
[13 Sep 2019 14:45]
Joshua Adelman
I wanted to add that I am seeing this bug as well using Python 3.7 and mysql-connector-python 8.0.17 on MacOS 10.14.6. Reproducing code:
```
import mysql.connector
batch_size = 10000
# Create of `auth` removed for privacy
auth = {...}
src_con = mysql.connector.connect(**auth)
cursor = src_con.cursor()
qstr = 'select * from data'
cursor.execute(qstr)
while True:
records = cursor.fetchmany(size=batch_size)
rc_cnt = len(records)
print(f'rc_cnt: {rc_cnt}')
if rc_cnt == 0:
break
```
This prints:
```
rc_cnt: 10000
rc_cnt: 10000
rc_cnt: 10000
rc_cnt: 10000
rc_cnt: 10000
rc_cnt: 10000
rc_cnt: 10000
rc_cnt: 7142
rc_cnt: 1
rc_cnt: 1
rc_cnt: 1
rc_cnt: 1
... (until interrupted)
```
where `fetchmany` continues to return a list containing what appears to be a random record in the table (but that same record over and over) until I kill the process. I have run the same code using the same version of mysql-connector-python on Windows 10 and do not see the issue and the data is returned as expected.
[12 Dec 2019 5:07]
MySQL Verification Team
It turned out internally that it is duplicate of Bug #97830. Marking this as duplicate of Bug #97830. regards, Umesh
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.056 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: I have create a table in mySQL with three rows. Then I tried to use the mysql connector to retrieve data from my database. I thought that by repeatedly calling cursor.fetchmany(n), eventually, one should get an empty list, since there are only finitely many records in a table in the database. However, I found that the cursor.fetchmany commands could repeated return the most recent item. For example, suppose the table has three records: <record_1> <record_2> <record_3> Then calling cursor.fetchmany(1) results the following: cursor.fetchmany(1) returns <record_1> cursor.fetchmany(1) returns <record_2> cursor.fetchmany(2) returns <record_2> ... How to repeat: On Linux Mint 19.2: (1) create a database in MySQL, and create a table with three records (2) install mySQL python connector. (3) start python3 (4) open a connection to the database (cnx = mysql.connector.connect(<your database connection setting>) (5) create a cursor object: cursor = cnx.cursor() (6) execute a select query: cursor.execute('select * from <your table name>') (7) evaluate: cursor.fetchmany(1) => get <record_1> cursor.fetchmany(1) => get <record_2> cursor.fetchmany(1) => get <record_2> (8) observe that the second fetchmany command, and the third fetchmany command returns the second record, and does not advance to the third record