python-sql 1.6.0__py3-none-any.whl → 1.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {python_sql-1.6.0.dist-info → python_sql-1.8.0.dist-info}/METADATA +28 -48
- python_sql-1.8.0.dist-info/RECORD +41 -0
- {python_sql-1.6.0.dist-info → python_sql-1.8.0.dist-info}/WHEEL +1 -2
- python_sql-1.8.0.dist-info/licenses/COPYRIGHT +26 -0
- sql/__init__.py +24 -2
- sql/aggregate.py +16 -6
- sql/functions.py +63 -3
- sql/operators.py +36 -18
- sql/tests/test_aggregate.py +6 -6
- sql/tests/test_combining_query.py +1 -1
- sql/tests/test_conditionals.py +3 -3
- sql/tests/test_delete.py +4 -4
- sql/tests/test_functions.py +36 -4
- sql/tests/test_insert.py +4 -4
- sql/tests/test_join.py +2 -2
- sql/tests/test_lateral.py +1 -1
- sql/tests/test_merge.py +12 -12
- sql/tests/test_operators.py +84 -67
- sql/tests/test_order.py +3 -3
- sql/tests/test_select.py +62 -31
- sql/tests/test_update.py +6 -6
- sql/tests/test_with.py +3 -3
- python_sql-1.6.0.dist-info/RECORD +0 -41
- python_sql-1.6.0.dist-info/top_level.txt +0 -1
sql/tests/test_operators.py
CHANGED
|
@@ -6,10 +6,10 @@ from array import array
|
|
|
6
6
|
|
|
7
7
|
from sql import Flavor, Literal, Null, Table
|
|
8
8
|
from sql.operators import (
|
|
9
|
-
Abs, And, Between, Div, Equal, Exists, FloorDiv, Greater,
|
|
10
|
-
ILike, In, Is, IsDistinct, IsNot, IsNotDistinct, Less,
|
|
11
|
-
LShift, Mod, Mul, Neg, Not, NotBetween, NotEqual,
|
|
12
|
-
Operator, Or, Pos, Pow, RShift, Sub)
|
|
9
|
+
Abs, And, Any, Between, Div, Equal, Exists, FloorDiv, Greater,
|
|
10
|
+
GreaterEqual, ILike, In, Is, IsDistinct, IsNot, IsNotDistinct, Less,
|
|
11
|
+
LessEqual, Like, LShift, Mod, Mul, Neg, Not, NotBetween, NotEqual,
|
|
12
|
+
NotILike, NotIn, NotLike, Operator, Or, Pos, Pow, RShift, Sub)
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class TestOperators(unittest.TestCase):
|
|
@@ -25,34 +25,34 @@ class TestOperators(unittest.TestCase):
|
|
|
25
25
|
def test_and(self):
|
|
26
26
|
for and_ in [And((self.table.c1, self.table.c2)),
|
|
27
27
|
self.table.c1 & self.table.c2]:
|
|
28
|
-
self.assertEqual(str(and_), '
|
|
28
|
+
self.assertEqual(str(and_), '"c1" AND "c2"')
|
|
29
29
|
self.assertEqual(and_.params, ())
|
|
30
30
|
|
|
31
31
|
and_ = And((Literal(True), self.table.c2))
|
|
32
|
-
self.assertEqual(str(and_), '
|
|
32
|
+
self.assertEqual(str(and_), '%s AND "c2"')
|
|
33
33
|
self.assertEqual(and_.params, (True,))
|
|
34
34
|
|
|
35
35
|
and_ = And((Literal(True), 'foo'))
|
|
36
|
-
self.assertEqual(str(and_), '
|
|
36
|
+
self.assertEqual(str(and_), '%s AND %s')
|
|
37
37
|
self.assertEqual(and_.params, (True, 'foo'))
|
|
38
38
|
|
|
39
39
|
def test_operator_operators(self):
|
|
40
40
|
and_ = And((Literal(True), self.table.c1))
|
|
41
41
|
and2 = and_ & And((Literal(True), self.table.c2))
|
|
42
|
-
self.assertEqual(str(and2), '(
|
|
42
|
+
self.assertEqual(str(and2), '(%s AND "c1") AND %s AND "c2"')
|
|
43
43
|
self.assertEqual(and2.params, (True, True))
|
|
44
44
|
|
|
45
45
|
and3 = and_ & Literal(True)
|
|
46
|
-
self.assertEqual(str(and3), '(
|
|
46
|
+
self.assertEqual(str(and3), '(%s AND "c1") AND %s')
|
|
47
47
|
self.assertEqual(and3.params, (True, True))
|
|
48
48
|
|
|
49
49
|
or_ = Or((Literal(True), self.table.c1))
|
|
50
50
|
or2 = or_ | Or((Literal(True), self.table.c2))
|
|
51
|
-
self.assertEqual(str(or2), '(
|
|
51
|
+
self.assertEqual(str(or2), '(%s OR "c1") OR %s OR "c2"')
|
|
52
52
|
self.assertEqual(or2.params, (True, True))
|
|
53
53
|
|
|
54
54
|
or3 = or_ | Literal(True)
|
|
55
|
-
self.assertEqual(str(or3), '(
|
|
55
|
+
self.assertEqual(str(or3), '(%s OR "c1") OR %s')
|
|
56
56
|
self.assertEqual(or3.params, (True, True))
|
|
57
57
|
|
|
58
58
|
def test_operator_compat_column(self):
|
|
@@ -63,152 +63,152 @@ class TestOperators(unittest.TestCase):
|
|
|
63
63
|
def test_or(self):
|
|
64
64
|
for or_ in [Or((self.table.c1, self.table.c2)),
|
|
65
65
|
self.table.c1 | self.table.c2]:
|
|
66
|
-
self.assertEqual(str(or_), '
|
|
66
|
+
self.assertEqual(str(or_), '"c1" OR "c2"')
|
|
67
67
|
self.assertEqual(or_.params, ())
|
|
68
68
|
|
|
69
69
|
def test_not(self):
|
|
70
70
|
for not_ in [Not(self.table.c), ~self.table.c]:
|
|
71
|
-
self.assertEqual(str(not_), '
|
|
71
|
+
self.assertEqual(str(not_), 'NOT "c"')
|
|
72
72
|
self.assertEqual(not_.params, ())
|
|
73
73
|
|
|
74
74
|
not_ = Not(Literal(False))
|
|
75
|
-
self.assertEqual(str(not_), '
|
|
75
|
+
self.assertEqual(str(not_), 'NOT %s')
|
|
76
76
|
self.assertEqual(not_.params, (False,))
|
|
77
77
|
|
|
78
78
|
def test_neg(self):
|
|
79
79
|
for neg in [Neg(self.table.c1), -self.table.c1]:
|
|
80
|
-
self.assertEqual(str(neg), '
|
|
80
|
+
self.assertEqual(str(neg), '- "c1"')
|
|
81
81
|
self.assertEqual(neg.params, ())
|
|
82
82
|
|
|
83
83
|
def test_pos(self):
|
|
84
84
|
for pos in [Pos(self.table.c1), +self.table.c1]:
|
|
85
|
-
self.assertEqual(str(pos), '
|
|
85
|
+
self.assertEqual(str(pos), '+ "c1"')
|
|
86
86
|
self.assertEqual(pos.params, ())
|
|
87
87
|
|
|
88
88
|
def test_less(self):
|
|
89
89
|
for less in [Less(self.table.c1, self.table.c2),
|
|
90
90
|
self.table.c1 < self.table.c2,
|
|
91
91
|
~GreaterEqual(self.table.c1, self.table.c2)]:
|
|
92
|
-
self.assertEqual(str(less), '
|
|
92
|
+
self.assertEqual(str(less), '"c1" < "c2"')
|
|
93
93
|
self.assertEqual(less.params, ())
|
|
94
94
|
|
|
95
95
|
less = Less(Literal(0), self.table.c2)
|
|
96
|
-
self.assertEqual(str(less), '
|
|
96
|
+
self.assertEqual(str(less), '%s < "c2"')
|
|
97
97
|
self.assertEqual(less.params, (0,))
|
|
98
98
|
|
|
99
99
|
def test_greater(self):
|
|
100
100
|
for greater in [Greater(self.table.c1, self.table.c2),
|
|
101
101
|
self.table.c1 > self.table.c2,
|
|
102
102
|
~LessEqual(self.table.c1, self.table.c2)]:
|
|
103
|
-
self.assertEqual(str(greater), '
|
|
103
|
+
self.assertEqual(str(greater), '"c1" > "c2"')
|
|
104
104
|
self.assertEqual(greater.params, ())
|
|
105
105
|
|
|
106
106
|
def test_less_equal(self):
|
|
107
107
|
for less in [LessEqual(self.table.c1, self.table.c2),
|
|
108
108
|
self.table.c1 <= self.table.c2,
|
|
109
109
|
~Greater(self.table.c1, self.table.c2)]:
|
|
110
|
-
self.assertEqual(str(less), '
|
|
110
|
+
self.assertEqual(str(less), '"c1" <= "c2"')
|
|
111
111
|
self.assertEqual(less.params, ())
|
|
112
112
|
|
|
113
113
|
def test_greater_equal(self):
|
|
114
114
|
for greater in [GreaterEqual(self.table.c1, self.table.c2),
|
|
115
115
|
self.table.c1 >= self.table.c2,
|
|
116
116
|
~Less(self.table.c1, self.table.c2)]:
|
|
117
|
-
self.assertEqual(str(greater), '
|
|
117
|
+
self.assertEqual(str(greater), '"c1" >= "c2"')
|
|
118
118
|
self.assertEqual(greater.params, ())
|
|
119
119
|
|
|
120
120
|
def test_equal(self):
|
|
121
121
|
for equal in [Equal(self.table.c1, self.table.c2),
|
|
122
122
|
self.table.c1 == self.table.c2,
|
|
123
123
|
~NotEqual(self.table.c1, self.table.c2)]:
|
|
124
|
-
self.assertEqual(str(equal), '
|
|
124
|
+
self.assertEqual(str(equal), '"c1" = "c2"')
|
|
125
125
|
self.assertEqual(equal.params, ())
|
|
126
126
|
|
|
127
127
|
equal = Equal(Literal('foo'), Literal('bar'))
|
|
128
|
-
self.assertEqual(str(equal), '
|
|
128
|
+
self.assertEqual(str(equal), '%s = %s')
|
|
129
129
|
self.assertEqual(equal.params, ('foo', 'bar'))
|
|
130
130
|
|
|
131
131
|
equal = Equal(self.table.c1, Null)
|
|
132
|
-
self.assertEqual(str(equal), '
|
|
132
|
+
self.assertEqual(str(equal), '"c1" IS NULL')
|
|
133
133
|
self.assertEqual(equal.params, ())
|
|
134
134
|
|
|
135
135
|
equal = Equal(Literal('test'), Null)
|
|
136
|
-
self.assertEqual(str(equal), '
|
|
136
|
+
self.assertEqual(str(equal), '%s IS NULL')
|
|
137
137
|
self.assertEqual(equal.params, ('test',))
|
|
138
138
|
|
|
139
139
|
equal = Equal(Null, self.table.c1)
|
|
140
|
-
self.assertEqual(str(equal), '
|
|
140
|
+
self.assertEqual(str(equal), '"c1" IS NULL')
|
|
141
141
|
self.assertEqual(equal.params, ())
|
|
142
142
|
|
|
143
143
|
equal = Equal(Null, Literal('test'))
|
|
144
|
-
self.assertEqual(str(equal), '
|
|
144
|
+
self.assertEqual(str(equal), '%s IS NULL')
|
|
145
145
|
self.assertEqual(equal.params, ('test',))
|
|
146
146
|
|
|
147
147
|
def test_not_equal(self):
|
|
148
148
|
for equal in [NotEqual(self.table.c1, self.table.c2),
|
|
149
149
|
self.table.c1 != self.table.c2,
|
|
150
150
|
~Equal(self.table.c1, self.table.c2)]:
|
|
151
|
-
self.assertEqual(str(equal), '
|
|
151
|
+
self.assertEqual(str(equal), '"c1" != "c2"')
|
|
152
152
|
self.assertEqual(equal.params, ())
|
|
153
153
|
|
|
154
154
|
equal = NotEqual(self.table.c1, Null)
|
|
155
|
-
self.assertEqual(str(equal), '
|
|
155
|
+
self.assertEqual(str(equal), '"c1" IS NOT NULL')
|
|
156
156
|
self.assertEqual(equal.params, ())
|
|
157
157
|
|
|
158
158
|
equal = NotEqual(Null, self.table.c1)
|
|
159
|
-
self.assertEqual(str(equal), '
|
|
159
|
+
self.assertEqual(str(equal), '"c1" IS NOT NULL')
|
|
160
160
|
self.assertEqual(equal.params, ())
|
|
161
161
|
|
|
162
162
|
def test_between(self):
|
|
163
163
|
for between in [Between(self.table.c1, 1, 2),
|
|
164
164
|
~NotBetween(self.table.c1, 1, 2)]:
|
|
165
|
-
self.assertEqual(str(between), '
|
|
165
|
+
self.assertEqual(str(between), '"c1" BETWEEN %s AND %s')
|
|
166
166
|
self.assertEqual(between.params, (1, 2))
|
|
167
167
|
|
|
168
168
|
between = Between(
|
|
169
169
|
self.table.c1, self.table.c2, self.table.c3, symmetric=True)
|
|
170
170
|
self.assertEqual(
|
|
171
|
-
str(between), '
|
|
171
|
+
str(between), '"c1" BETWEEN SYMMETRIC "c2" AND "c3"')
|
|
172
172
|
self.assertEqual(between.params, ())
|
|
173
173
|
|
|
174
174
|
def test_not_between(self):
|
|
175
175
|
for between in [NotBetween(self.table.c1, 1, 2),
|
|
176
176
|
~Between(self.table.c1, 1, 2)]:
|
|
177
|
-
self.assertEqual(str(between), '
|
|
177
|
+
self.assertEqual(str(between), '"c1" NOT BETWEEN %s AND %s')
|
|
178
178
|
self.assertEqual(between.params, (1, 2))
|
|
179
179
|
|
|
180
180
|
between = NotBetween(
|
|
181
181
|
self.table.c1, self.table.c2, self.table.c3, symmetric=True)
|
|
182
182
|
self.assertEqual(
|
|
183
|
-
str(between), '
|
|
183
|
+
str(between), '"c1" NOT BETWEEN SYMMETRIC "c2" AND "c3"')
|
|
184
184
|
self.assertEqual(between.params, ())
|
|
185
185
|
|
|
186
186
|
def test_is_distinct(self):
|
|
187
187
|
for distinct in [IsDistinct(self.table.c1, self.table.c2),
|
|
188
188
|
~IsNotDistinct(self.table.c1, self.table.c2)]:
|
|
189
|
-
self.assertEqual(str(distinct), '
|
|
189
|
+
self.assertEqual(str(distinct), '"c1" IS DISTINCT FROM "c2"')
|
|
190
190
|
self.assertEqual(distinct.params, ())
|
|
191
191
|
|
|
192
192
|
def test_is_not_distinct(self):
|
|
193
193
|
for distinct in [IsNotDistinct(self.table.c1, self.table.c2),
|
|
194
194
|
~IsDistinct(self.table.c1, self.table.c2)]:
|
|
195
|
-
self.assertEqual(str(distinct), '
|
|
195
|
+
self.assertEqual(str(distinct), '"c1" IS NOT DISTINCT FROM "c2"')
|
|
196
196
|
self.assertEqual(distinct.params, ())
|
|
197
197
|
|
|
198
198
|
def test_is(self):
|
|
199
199
|
for is_ in [Is(self.table.c1, None),
|
|
200
200
|
~IsNot(self.table.c1, None)]:
|
|
201
|
-
self.assertEqual(str(is_), '
|
|
201
|
+
self.assertEqual(str(is_), '"c1" IS UNKNOWN')
|
|
202
202
|
self.assertEqual(is_.params, ())
|
|
203
203
|
|
|
204
204
|
for is_ in [Is(self.table.c1, True),
|
|
205
205
|
~IsNot(self.table.c1, True)]:
|
|
206
|
-
self.assertEqual(str(is_), '
|
|
206
|
+
self.assertEqual(str(is_), '"c1" IS TRUE')
|
|
207
207
|
self.assertEqual(is_.params, ())
|
|
208
208
|
|
|
209
209
|
for is_ in [Is(self.table.c1, False),
|
|
210
210
|
~IsNot(self.table.c1, False)]:
|
|
211
|
-
self.assertEqual(str(is_), '
|
|
211
|
+
self.assertEqual(str(is_), '"c1" IS FALSE')
|
|
212
212
|
self.assertEqual(is_.params, ())
|
|
213
213
|
|
|
214
214
|
def test_is_invalid_right(self):
|
|
@@ -218,41 +218,41 @@ class TestOperators(unittest.TestCase):
|
|
|
218
218
|
def test_is_not(self):
|
|
219
219
|
for is_ in [IsNot(self.table.c1, None),
|
|
220
220
|
~Is(self.table.c1, None)]:
|
|
221
|
-
self.assertEqual(str(is_), '
|
|
221
|
+
self.assertEqual(str(is_), '"c1" IS NOT UNKNOWN')
|
|
222
222
|
self.assertEqual(is_.params, ())
|
|
223
223
|
|
|
224
224
|
for is_ in [IsNot(self.table.c1, True),
|
|
225
225
|
~Is(self.table.c1, True)]:
|
|
226
|
-
self.assertEqual(str(is_), '
|
|
226
|
+
self.assertEqual(str(is_), '"c1" IS NOT TRUE')
|
|
227
227
|
self.assertEqual(is_.params, ())
|
|
228
228
|
|
|
229
229
|
for is_ in [IsNot(self.table.c1, False),
|
|
230
230
|
~Is(self.table.c1, False)]:
|
|
231
|
-
self.assertEqual(str(is_), '
|
|
231
|
+
self.assertEqual(str(is_), '"c1" IS NOT FALSE')
|
|
232
232
|
self.assertEqual(is_.params, ())
|
|
233
233
|
|
|
234
234
|
def test_sub(self):
|
|
235
235
|
for sub in [Sub(self.table.c1, self.table.c2),
|
|
236
236
|
self.table.c1 - self.table.c2]:
|
|
237
|
-
self.assertEqual(str(sub), '
|
|
237
|
+
self.assertEqual(str(sub), '"c1" - "c2"')
|
|
238
238
|
self.assertEqual(sub.params, ())
|
|
239
239
|
|
|
240
240
|
def test_mul(self):
|
|
241
241
|
for mul in [Mul(self.table.c1, self.table.c2),
|
|
242
242
|
self.table.c1 * self.table.c2]:
|
|
243
|
-
self.assertEqual(str(mul), '
|
|
243
|
+
self.assertEqual(str(mul), '"c1" * "c2"')
|
|
244
244
|
self.assertEqual(mul.params, ())
|
|
245
245
|
|
|
246
246
|
def test_div(self):
|
|
247
247
|
for div in [Div(self.table.c1, self.table.c2),
|
|
248
248
|
self.table.c1 / self.table.c2]:
|
|
249
|
-
self.assertEqual(str(div), '
|
|
249
|
+
self.assertEqual(str(div), '"c1" / "c2"')
|
|
250
250
|
self.assertEqual(div.params, ())
|
|
251
251
|
|
|
252
252
|
def test_mod(self):
|
|
253
253
|
for mod in [Mod(self.table.c1, self.table.c2),
|
|
254
254
|
self.table.c1 % self.table.c2]:
|
|
255
|
-
self.assertEqual(str(mod), '
|
|
255
|
+
self.assertEqual(str(mod), '"c1" %% "c2"')
|
|
256
256
|
self.assertEqual(mod.params, ())
|
|
257
257
|
|
|
258
258
|
def test_mod_paramstyle(self):
|
|
@@ -260,7 +260,7 @@ class TestOperators(unittest.TestCase):
|
|
|
260
260
|
Flavor.set(flavor)
|
|
261
261
|
try:
|
|
262
262
|
mod = Mod(self.table.c1, self.table.c2)
|
|
263
|
-
self.assertEqual(str(mod), '
|
|
263
|
+
self.assertEqual(str(mod), '"c1" %% "c2"')
|
|
264
264
|
self.assertEqual(mod.params, ())
|
|
265
265
|
finally:
|
|
266
266
|
Flavor.set(Flavor())
|
|
@@ -269,7 +269,7 @@ class TestOperators(unittest.TestCase):
|
|
|
269
269
|
Flavor.set(flavor)
|
|
270
270
|
try:
|
|
271
271
|
mod = Mod(self.table.c1, self.table.c2)
|
|
272
|
-
self.assertEqual(str(mod), '
|
|
272
|
+
self.assertEqual(str(mod), '"c1" % "c2"')
|
|
273
273
|
self.assertEqual(mod.params, ())
|
|
274
274
|
finally:
|
|
275
275
|
Flavor.set(Flavor())
|
|
@@ -277,24 +277,24 @@ class TestOperators(unittest.TestCase):
|
|
|
277
277
|
def test_pow(self):
|
|
278
278
|
for pow_ in [Pow(self.table.c1, self.table.c2),
|
|
279
279
|
self.table.c1 ** self.table.c2]:
|
|
280
|
-
self.assertEqual(str(pow_), '
|
|
280
|
+
self.assertEqual(str(pow_), '"c1" ^ "c2"')
|
|
281
281
|
self.assertEqual(pow_.params, ())
|
|
282
282
|
|
|
283
283
|
def test_abs(self):
|
|
284
284
|
for abs_ in [Abs(self.table.c1), abs(self.table.c1)]:
|
|
285
|
-
self.assertEqual(str(abs_), '
|
|
285
|
+
self.assertEqual(str(abs_), '@ "c1"')
|
|
286
286
|
self.assertEqual(abs_.params, ())
|
|
287
287
|
|
|
288
288
|
def test_lshift(self):
|
|
289
289
|
for lshift in [LShift(self.table.c1, 2),
|
|
290
290
|
self.table.c1 << 2]:
|
|
291
|
-
self.assertEqual(str(lshift), '
|
|
291
|
+
self.assertEqual(str(lshift), '"c1" << %s')
|
|
292
292
|
self.assertEqual(lshift.params, (2,))
|
|
293
293
|
|
|
294
294
|
def test_rshift(self):
|
|
295
295
|
for rshift in [RShift(self.table.c1, 2),
|
|
296
296
|
self.table.c1 >> 2]:
|
|
297
|
-
self.assertEqual(str(rshift), '
|
|
297
|
+
self.assertEqual(str(rshift), '"c1" >> %s')
|
|
298
298
|
self.assertEqual(rshift.params, (2,))
|
|
299
299
|
|
|
300
300
|
def test_like(self):
|
|
@@ -302,12 +302,12 @@ class TestOperators(unittest.TestCase):
|
|
|
302
302
|
self.table.c1.like('foo'),
|
|
303
303
|
~NotLike(self.table.c1, 'foo'),
|
|
304
304
|
~~Like(self.table.c1, 'foo')]:
|
|
305
|
-
self.assertEqual(str(like), '
|
|
305
|
+
self.assertEqual(str(like), '"c1" LIKE %s')
|
|
306
306
|
self.assertEqual(like.params, ('foo',))
|
|
307
307
|
|
|
308
308
|
def test_like_escape(self):
|
|
309
309
|
like = Like(self.table.c1, 'foo', escape='$')
|
|
310
|
-
self.assertEqual(str(like), '
|
|
310
|
+
self.assertEqual(str(like), '"c1" LIKE %s ESCAPE %s')
|
|
311
311
|
self.assertEqual(like.params, ('foo', '$'))
|
|
312
312
|
|
|
313
313
|
def test_like_escape_empty_false(self):
|
|
@@ -315,7 +315,7 @@ class TestOperators(unittest.TestCase):
|
|
|
315
315
|
Flavor.set(flavor)
|
|
316
316
|
try:
|
|
317
317
|
like = Like(self.table.c1, 'foo')
|
|
318
|
-
self.assertEqual(str(like), '
|
|
318
|
+
self.assertEqual(str(like), '"c1" LIKE %s')
|
|
319
319
|
self.assertEqual(like.params, ('foo',))
|
|
320
320
|
finally:
|
|
321
321
|
Flavor.set(Flavor())
|
|
@@ -325,7 +325,7 @@ class TestOperators(unittest.TestCase):
|
|
|
325
325
|
Flavor.set(flavor)
|
|
326
326
|
try:
|
|
327
327
|
like = Like(self.table.c1, 'foo')
|
|
328
|
-
self.assertEqual(str(like), '
|
|
328
|
+
self.assertEqual(str(like), '"c1" LIKE %s ESCAPE %s')
|
|
329
329
|
self.assertEqual(like.params, ('foo', ''))
|
|
330
330
|
finally:
|
|
331
331
|
Flavor.set(Flavor())
|
|
@@ -341,7 +341,7 @@ class TestOperators(unittest.TestCase):
|
|
|
341
341
|
for like in [ILike(self.table.c1, 'foo'),
|
|
342
342
|
self.table.c1.ilike('foo'),
|
|
343
343
|
~NotILike(self.table.c1, 'foo')]:
|
|
344
|
-
self.assertEqual(str(like), '
|
|
344
|
+
self.assertEqual(str(like), '"c1" ILIKE %s')
|
|
345
345
|
self.assertEqual(like.params, ('foo',))
|
|
346
346
|
finally:
|
|
347
347
|
Flavor.set(Flavor())
|
|
@@ -351,7 +351,7 @@ class TestOperators(unittest.TestCase):
|
|
|
351
351
|
try:
|
|
352
352
|
like = ILike(self.table.c1, 'foo')
|
|
353
353
|
self.assertEqual(
|
|
354
|
-
str(like), '
|
|
354
|
+
str(like), 'UPPER("c1") LIKE UPPER(%s)')
|
|
355
355
|
self.assertEqual(like.params, ('foo',))
|
|
356
356
|
finally:
|
|
357
357
|
Flavor.set(Flavor())
|
|
@@ -362,7 +362,7 @@ class TestOperators(unittest.TestCase):
|
|
|
362
362
|
try:
|
|
363
363
|
for like in [NotILike(self.table.c1, 'foo'),
|
|
364
364
|
~self.table.c1.ilike('foo')]:
|
|
365
|
-
self.assertEqual(str(like), '
|
|
365
|
+
self.assertEqual(str(like), '"c1" NOT ILIKE %s')
|
|
366
366
|
self.assertEqual(like.params, ('foo',))
|
|
367
367
|
finally:
|
|
368
368
|
Flavor.set(Flavor())
|
|
@@ -372,7 +372,7 @@ class TestOperators(unittest.TestCase):
|
|
|
372
372
|
try:
|
|
373
373
|
like = NotILike(self.table.c1, 'foo')
|
|
374
374
|
self.assertEqual(
|
|
375
|
-
str(like), '
|
|
375
|
+
str(like), 'UPPER("c1") NOT LIKE UPPER(%s)')
|
|
376
376
|
self.assertEqual(like.params, ('foo',))
|
|
377
377
|
finally:
|
|
378
378
|
Flavor.set(Flavor())
|
|
@@ -381,32 +381,31 @@ class TestOperators(unittest.TestCase):
|
|
|
381
381
|
for in_ in [In(self.table.c1, [self.table.c2, 1, Null]),
|
|
382
382
|
~NotIn(self.table.c1, [self.table.c2, 1, Null]),
|
|
383
383
|
~~In(self.table.c1, [self.table.c2, 1, Null])]:
|
|
384
|
-
self.assertEqual(str(in_), '
|
|
384
|
+
self.assertEqual(str(in_), '"c1" IN ("c2", %s, %s)')
|
|
385
385
|
self.assertEqual(in_.params, (1, None))
|
|
386
386
|
|
|
387
387
|
t2 = Table('t2')
|
|
388
388
|
in_ = In(self.table.c1, t2.select(t2.c2))
|
|
389
389
|
self.assertEqual(str(in_),
|
|
390
|
-
'
|
|
390
|
+
'"c1" IN (SELECT "a"."c2" FROM "t2" AS "a")')
|
|
391
391
|
self.assertEqual(in_.params, ())
|
|
392
392
|
|
|
393
393
|
in_ = In(self.table.c1, t2.select(t2.c2) | t2.select(t2.c3))
|
|
394
394
|
self.assertEqual(str(in_),
|
|
395
|
-
'
|
|
396
|
-
'UNION SELECT "a"."c3" FROM "t2" AS "a")
|
|
395
|
+
'"c1" IN (SELECT "a"."c2" FROM "t2" AS "a" '
|
|
396
|
+
'UNION SELECT "a"."c3" FROM "t2" AS "a")')
|
|
397
397
|
self.assertEqual(in_.params, ())
|
|
398
398
|
|
|
399
399
|
in_ = In(self.table.c1, array('l', list(range(10))))
|
|
400
400
|
self.assertEqual(str(in_),
|
|
401
|
-
'
|
|
401
|
+
'"c1" IN (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)')
|
|
402
402
|
self.assertEqual(in_.params, tuple(range(10)))
|
|
403
403
|
|
|
404
404
|
def test_exists(self):
|
|
405
405
|
exists = Exists(self.table.select(self.table.c1,
|
|
406
406
|
where=self.table.c1 == 1))
|
|
407
407
|
self.assertEqual(str(exists),
|
|
408
|
-
'
|
|
409
|
-
'WHERE ("a"."c1" = %s)))')
|
|
408
|
+
'EXISTS (SELECT "a"."c1" FROM "t" AS "a" WHERE "a"."c1" = %s)')
|
|
410
409
|
self.assertEqual(exists.params, (1,))
|
|
411
410
|
|
|
412
411
|
def test_floordiv(self):
|
|
@@ -419,3 +418,21 @@ class TestOperators(unittest.TestCase):
|
|
|
419
418
|
self.assertIn(
|
|
420
419
|
'FloorDiv operator is deprecated, use Div function',
|
|
421
420
|
str(w[-1].message))
|
|
421
|
+
|
|
422
|
+
def test_any(self):
|
|
423
|
+
any_ = Any(self.table.select(self.table.c1, where=self.table.c2 == 1))
|
|
424
|
+
self.assertEqual(str(any_),
|
|
425
|
+
'ANY (SELECT "a"."c1" FROM "t" AS "a" WHERE "a"."c2" = %s)')
|
|
426
|
+
self.assertEqual(any_.params, (1,))
|
|
427
|
+
|
|
428
|
+
for value in [[1, 2, 3], (1, 2, 3), array('l', [1, 2, 3])]:
|
|
429
|
+
with self.subTest(value=value):
|
|
430
|
+
any_ = Any(value)
|
|
431
|
+
self.assertEqual(str(any_), 'ANY (%s)')
|
|
432
|
+
self.assertEqual(any_.params, ([1, 2, 3],))
|
|
433
|
+
|
|
434
|
+
def test_binary_unary(self):
|
|
435
|
+
operator = Equal(self.table.c1, Any([1, 2, 3]))
|
|
436
|
+
|
|
437
|
+
self.assertEqual(str(operator), '"c1" = ANY (%s)')
|
|
438
|
+
self.assertEqual(operator.params, ([1, 2, 3],))
|
sql/tests/test_order.py
CHANGED
|
@@ -36,17 +36,17 @@ class TestOrder(unittest.TestCase):
|
|
|
36
36
|
|
|
37
37
|
exp = NullsFirst(self.column)
|
|
38
38
|
self.assertEqual(str(exp),
|
|
39
|
-
'CASE WHEN
|
|
39
|
+
'CASE WHEN "c" IS NULL THEN %s ELSE %s END ASC, "c"')
|
|
40
40
|
self.assertEqual(exp.params, (0, 1))
|
|
41
41
|
|
|
42
42
|
exp = NullsFirst(Desc(self.column))
|
|
43
43
|
self.assertEqual(str(exp),
|
|
44
|
-
'CASE WHEN
|
|
44
|
+
'CASE WHEN "c" IS NULL THEN %s ELSE %s END ASC, "c" DESC')
|
|
45
45
|
self.assertEqual(exp.params, (0, 1))
|
|
46
46
|
|
|
47
47
|
exp = NullsLast(Literal(2))
|
|
48
48
|
self.assertEqual(str(exp),
|
|
49
|
-
'CASE WHEN
|
|
49
|
+
'CASE WHEN %s IS NULL THEN %s ELSE %s END ASC, %s')
|
|
50
50
|
self.assertEqual(exp.params, (2, 1, 0, 2))
|
|
51
51
|
finally:
|
|
52
52
|
Flavor.set(Flavor())
|