Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
singlestore-labs
GitHub Repository: singlestore-labs/singlestoredb-python
Path: blob/main/singlestoredb/mysql/tests/test_cursor.py
469 views
1
# type: ignore
2
import singlestoredb.mysql as sv
3
import singlestoredb.mysql.cursors as cursors
4
from singlestoredb.mysql.tests import base
5
6
7
class CursorTest(base.PyMySQLTestCase):
8
9
def setUp(self):
10
super(CursorTest, self).setUp()
11
12
conn = self.connect()
13
self.safe_create_table(
14
conn,
15
'test',
16
'create table test (data varchar(10))',
17
)
18
cursor = conn.cursor()
19
cursor.execute(
20
'insert into test (data) values '
21
"('row1'), ('row2'), ('row3'), ('row4'), ('row5')",
22
)
23
cursor.close()
24
self.test_connection = sv.connect(**self.databases[0])
25
self.addCleanup(self.test_connection.close)
26
27
def test_cleanup_rows_unbuffered(self):
28
with self.connect(cursorclass=cursors.SSCursor) as conn:
29
with self.connect(cursorclass=cursors.SSCursor) as conn:
30
cursor = conn.cursor()
31
32
cursor.execute('select * from test as t1, test as t2')
33
for counter, row in enumerate(cursor):
34
if counter > 10:
35
break
36
37
del cursor
38
39
c2 = conn.cursor()
40
41
c2.execute('select 1')
42
self.assertEqual(c2.fetchone(), (1,))
43
self.assertIsNone(c2.fetchone())
44
45
def test_cleanup_rows_buffered(self):
46
with self.connect(cursorclass=cursors.Cursor) as conn:
47
cursor = conn.cursor()
48
49
cursor.execute('select * from test as t1, test as t2')
50
for counter, row in enumerate(cursor):
51
if counter > 10:
52
break
53
54
del cursor
55
56
c2 = conn.cursor()
57
c2.execute('select 1')
58
59
self.assertEqual(c2.fetchone(), (1,))
60
self.assertIsNone(c2.fetchone())
61
62
def test_executemany(self):
63
with self.connect(cursorclass=cursors.Cursor) as conn:
64
cursor = conn.cursor()
65
66
m = cursors.RE_INSERT_VALUES.match(
67
'INSERT INTO TEST (ID, NAME) VALUES (%s, %s)',
68
)
69
self.assertIsNotNone(m, 'error parse %s')
70
self.assertEqual(
71
m.group(3), '', 'group 3 not blank, bug in RE_INSERT_VALUES?',
72
)
73
74
m = cursors.RE_INSERT_VALUES.match(
75
'INSERT INTO TEST (ID, NAME) VALUES (%(id)s, %(name)s)',
76
)
77
self.assertIsNotNone(m, 'error parse %(name)s')
78
self.assertEqual(
79
m.group(3), '', 'group 3 not blank, bug in RE_INSERT_VALUES?',
80
)
81
82
m = cursors.RE_INSERT_VALUES.match(
83
'INSERT INTO TEST (ID, NAME) VALUES (%(id_name)s, %(name)s)',
84
)
85
self.assertIsNotNone(m, 'error parse %(id_name)s')
86
self.assertEqual(
87
m.group(3), '', 'group 3 not blank, bug in RE_INSERT_VALUES?',
88
)
89
90
m = cursors.RE_INSERT_VALUES.match(
91
'INSERT INTO TEST (ID, NAME) VALUES (%(id_name)s, %(name)s) '
92
'ON duplicate update',
93
)
94
self.assertIsNotNone(m, 'error parse %(id_name)s')
95
self.assertEqual(
96
m.group(3),
97
' ON duplicate update',
98
'group 3 not ON duplicate update, bug in RE_INSERT_VALUES?',
99
)
100
101
# https://github.com/PyMySQL/PyMySQL/pull/597
102
m = cursors.RE_INSERT_VALUES.match(
103
'INSERT INTO bloup(foo, bar)VALUES(%s, %s)',
104
)
105
assert m is not None
106
107
# cursor._executed must be "insert into test (data)
108
# values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)"
109
# list args
110
data = range(10)
111
cursor.executemany('insert into test (data) values (%s)', data)
112
self.assertTrue(
113
cursor._executed.endswith(b',(7),(8),(9)'),
114
'execute many with %s not in one query',
115
)
116
117
# dict args
118
data_dict = [{'data': i} for i in range(10)]
119
cursor.executemany('insert into test (data) values (%(data)s)', data_dict)
120
self.assertTrue(
121
cursor._executed.endswith(b',(7),(8),(9)'),
122
'execute many with %(data)s not in one query',
123
)
124
125
# %% in column set
126
cursor.execute(
127
"""\
128
CREATE TABLE percent_test (
129
`A%` INTEGER,
130
`B%` INTEGER)""",
131
)
132
try:
133
q = 'INSERT INTO percent_test (`A%%`, `B%%`) VALUES (%s, %s)'
134
self.assertIsNotNone(cursors.RE_INSERT_VALUES.match(q))
135
cursor.executemany(q, [(3, 4), (5, 6)])
136
self.assertTrue(
137
cursor._executed.endswith(b'(3, 4),(5, 6)'),
138
'executemany with %% not in one query',
139
)
140
finally:
141
cursor.execute('DROP TABLE IF EXISTS percent_test')
142
143