Path: blob/main/singlestoredb/mysql/tests/test_cursor.py
469 views
# type: ignore1import singlestoredb.mysql as sv2import singlestoredb.mysql.cursors as cursors3from singlestoredb.mysql.tests import base456class CursorTest(base.PyMySQLTestCase):78def setUp(self):9super(CursorTest, self).setUp()1011conn = self.connect()12self.safe_create_table(13conn,14'test',15'create table test (data varchar(10))',16)17cursor = conn.cursor()18cursor.execute(19'insert into test (data) values '20"('row1'), ('row2'), ('row3'), ('row4'), ('row5')",21)22cursor.close()23self.test_connection = sv.connect(**self.databases[0])24self.addCleanup(self.test_connection.close)2526def test_cleanup_rows_unbuffered(self):27with self.connect(cursorclass=cursors.SSCursor) as conn:28with self.connect(cursorclass=cursors.SSCursor) as conn:29cursor = conn.cursor()3031cursor.execute('select * from test as t1, test as t2')32for counter, row in enumerate(cursor):33if counter > 10:34break3536del cursor3738c2 = conn.cursor()3940c2.execute('select 1')41self.assertEqual(c2.fetchone(), (1,))42self.assertIsNone(c2.fetchone())4344def test_cleanup_rows_buffered(self):45with self.connect(cursorclass=cursors.Cursor) as conn:46cursor = conn.cursor()4748cursor.execute('select * from test as t1, test as t2')49for counter, row in enumerate(cursor):50if counter > 10:51break5253del cursor5455c2 = conn.cursor()56c2.execute('select 1')5758self.assertEqual(c2.fetchone(), (1,))59self.assertIsNone(c2.fetchone())6061def test_executemany(self):62with self.connect(cursorclass=cursors.Cursor) as conn:63cursor = conn.cursor()6465m = cursors.RE_INSERT_VALUES.match(66'INSERT INTO TEST (ID, NAME) VALUES (%s, %s)',67)68self.assertIsNotNone(m, 'error parse %s')69self.assertEqual(70m.group(3), '', 'group 3 not blank, bug in RE_INSERT_VALUES?',71)7273m = cursors.RE_INSERT_VALUES.match(74'INSERT INTO TEST (ID, NAME) VALUES (%(id)s, %(name)s)',75)76self.assertIsNotNone(m, 'error parse %(name)s')77self.assertEqual(78m.group(3), '', 'group 3 not blank, bug in RE_INSERT_VALUES?',79)8081m = cursors.RE_INSERT_VALUES.match(82'INSERT INTO TEST (ID, NAME) VALUES (%(id_name)s, %(name)s)',83)84self.assertIsNotNone(m, 'error parse %(id_name)s')85self.assertEqual(86m.group(3), '', 'group 3 not blank, bug in RE_INSERT_VALUES?',87)8889m = cursors.RE_INSERT_VALUES.match(90'INSERT INTO TEST (ID, NAME) VALUES (%(id_name)s, %(name)s) '91'ON duplicate update',92)93self.assertIsNotNone(m, 'error parse %(id_name)s')94self.assertEqual(95m.group(3),96' ON duplicate update',97'group 3 not ON duplicate update, bug in RE_INSERT_VALUES?',98)99100# https://github.com/PyMySQL/PyMySQL/pull/597101m = cursors.RE_INSERT_VALUES.match(102'INSERT INTO bloup(foo, bar)VALUES(%s, %s)',103)104assert m is not None105106# cursor._executed must be "insert into test (data)107# values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)"108# list args109data = range(10)110cursor.executemany('insert into test (data) values (%s)', data)111self.assertTrue(112cursor._executed.endswith(b',(7),(8),(9)'),113'execute many with %s not in one query',114)115116# dict args117data_dict = [{'data': i} for i in range(10)]118cursor.executemany('insert into test (data) values (%(data)s)', data_dict)119self.assertTrue(120cursor._executed.endswith(b',(7),(8),(9)'),121'execute many with %(data)s not in one query',122)123124# %% in column set125cursor.execute(126"""\127CREATE TABLE percent_test (128`A%` INTEGER,129`B%` INTEGER)""",130)131try:132q = 'INSERT INTO percent_test (`A%%`, `B%%`) VALUES (%s, %s)'133self.assertIsNotNone(cursors.RE_INSERT_VALUES.match(q))134cursor.executemany(q, [(3, 4), (5, 6)])135self.assertTrue(136cursor._executed.endswith(b'(3, 4),(5, 6)'),137'executemany with %% not in one query',138)139finally:140cursor.execute('DROP TABLE IF EXISTS percent_test')141142143