2828
2929from conftest import (
3030 setup_table ,
31+ sqlalchemy_version ,
3132 sqlalchemy_1_3_or_higher ,
3233 sqlalchemy_1_4_or_higher ,
3334 sqlalchemy_before_1_4 ,
@@ -214,18 +215,6 @@ def test_disable_quote(faux_conn):
214215 assert faux_conn .test_data ["execute" ][- 1 ][0 ] == ("SELECT `t`.foo \n FROM `t`" )
215216
216217
217- def _normalize_in_params (query , params ):
218- # We have to normalize parameter names, because they
219- # change with sqlalchemy versions.
220- newnames = sorted (
221- ((p , f"p_{ i } " ) for i , p in enumerate (sorted (params ))), key = lambda i : - len (i [0 ])
222- )
223- for old , new in newnames :
224- query = query .replace (old , new )
225-
226- return query , {new : params [old ] for old , new in newnames }
227-
228-
229218@sqlalchemy_before_1_4
230219def test_select_in_lit_13 (faux_conn ):
231220 [[isin ]] = faux_conn .execute (
@@ -240,66 +229,74 @@ def test_select_in_lit_13(faux_conn):
240229
241230
242231@sqlalchemy_1_4_or_higher
243- def test_select_in_lit (faux_conn ):
244- [[isin ]] = faux_conn .execute (
245- sqlalchemy .select ([sqlalchemy .literal (1 ).in_ ([1 , 2 , 3 ])])
246- )
247- assert isin
248- assert _normalize_in_params (* faux_conn .test_data ["execute" ][- 1 ]) == (
249- "SELECT %(p_0:INT64)s IN "
250- "UNNEST([ %(p_1:INT64)s, %(p_2:INT64)s, %(p_3:INT64)s ]) AS `anon_1`" ,
251- {"p_1" : 1 , "p_2" : 2 , "p_3" : 3 , "p_0" : 1 },
232+ def test_select_in_lit (faux_conn , last_query ):
233+ faux_conn .execute (sqlalchemy .select ([sqlalchemy .literal (1 ).in_ ([1 , 2 , 3 ])]))
234+ last_query (
235+ "SELECT %(param_1:INT64)s IN UNNEST(%(param_2:INT64)s) AS `anon_1`" ,
236+ {"param_1" : 1 , "param_2" : [1 , 2 , 3 ]},
252237 )
253238
254239
255- def test_select_in_param (faux_conn ):
240+ def test_select_in_param (faux_conn , last_query ):
256241 [[isin ]] = faux_conn .execute (
257242 sqlalchemy .select (
258243 [sqlalchemy .literal (1 ).in_ (sqlalchemy .bindparam ("q" , expanding = True ))]
259244 ),
260245 dict (q = [1 , 2 , 3 ]),
261246 )
262- assert isin
263- assert faux_conn .test_data ["execute" ][- 1 ] == (
264- "SELECT %(param_1:INT64)s IN UNNEST("
265- "[ %(q_1:INT64)s, %(q_2:INT64)s, %(q_3:INT64)s ]"
266- ") AS `anon_1`" ,
267- {"param_1" : 1 , "q_1" : 1 , "q_2" : 2 , "q_3" : 3 },
268- )
247+ if sqlalchemy_version >= packaging .version .parse ("1.4" ):
248+ last_query (
249+ "SELECT %(param_1:INT64)s IN UNNEST(%(q:INT64)s) AS `anon_1`" ,
250+ {"param_1" : 1 , "q" : [1 , 2 , 3 ]},
251+ )
252+ else :
253+ assert isin
254+ last_query (
255+ "SELECT %(param_1:INT64)s IN UNNEST("
256+ "[ %(q_1:INT64)s, %(q_2:INT64)s, %(q_3:INT64)s ]"
257+ ") AS `anon_1`" ,
258+ {"param_1" : 1 , "q_1" : 1 , "q_2" : 2 , "q_3" : 3 },
259+ )
269260
270261
271- def test_select_in_param1 (faux_conn ):
262+ def test_select_in_param1 (faux_conn , last_query ):
272263 [[isin ]] = faux_conn .execute (
273264 sqlalchemy .select (
274265 [sqlalchemy .literal (1 ).in_ (sqlalchemy .bindparam ("q" , expanding = True ))]
275266 ),
276267 dict (q = [1 ]),
277268 )
278- assert isin
279- assert faux_conn .test_data ["execute" ][- 1 ] == (
280- "SELECT %(param_1:INT64)s IN UNNEST(" "[ %(q_1:INT64)s ]" ") AS `anon_1`" ,
281- {"param_1" : 1 , "q_1" : 1 },
282- )
269+ if sqlalchemy_version >= packaging .version .parse ("1.4" ):
270+ last_query (
271+ "SELECT %(param_1:INT64)s IN UNNEST(%(q:INT64)s) AS `anon_1`" ,
272+ {"param_1" : 1 , "q" : [1 ]},
273+ )
274+ else :
275+ assert isin
276+ last_query (
277+ "SELECT %(param_1:INT64)s IN UNNEST(" "[ %(q_1:INT64)s ]" ") AS `anon_1`" ,
278+ {"param_1" : 1 , "q_1" : 1 },
279+ )
283280
284281
285282@sqlalchemy_1_3_or_higher
286- def test_select_in_param_empty (faux_conn ):
283+ def test_select_in_param_empty (faux_conn , last_query ):
287284 [[isin ]] = faux_conn .execute (
288285 sqlalchemy .select (
289286 [sqlalchemy .literal (1 ).in_ (sqlalchemy .bindparam ("q" , expanding = True ))]
290287 ),
291288 dict (q = []),
292289 )
293- assert not isin
294- assert faux_conn .test_data ["execute" ][- 1 ] == (
295- "SELECT %(param_1:INT64)s IN(NULL) AND (1 != 1) AS `anon_1`"
296- if (
297- packaging .version .parse (sqlalchemy .__version__ )
298- >= packaging .version .parse ("1.4" )
290+ if sqlalchemy_version >= packaging .version .parse ("1.4" ):
291+ last_query (
292+ "SELECT %(param_1:INT64)s IN UNNEST(%(q:INT64)s) AS `anon_1`" ,
293+ {"param_1" : 1 , "q" : []},
294+ )
295+ else :
296+ assert not isin
297+ last_query (
298+ "SELECT %(param_1:INT64)s IN UNNEST([ ]) AS `anon_1`" , {"param_1" : 1 }
299299 )
300- else "SELECT %(param_1:INT64)s IN UNNEST([ ]) AS `anon_1`" ,
301- {"param_1" : 1 },
302- )
303300
304301
305302@sqlalchemy_before_1_4
@@ -316,53 +313,54 @@ def test_select_notin_lit13(faux_conn):
316313
317314
318315@sqlalchemy_1_4_or_higher
319- def test_select_notin_lit (faux_conn ):
320- [[isnotin ]] = faux_conn .execute (
321- sqlalchemy .select ([sqlalchemy .literal (0 ).notin_ ([1 , 2 , 3 ])])
316+ def test_select_notin_lit (faux_conn , last_query ):
317+ faux_conn .execute (sqlalchemy .select ([sqlalchemy .literal (0 ).notin_ ([1 , 2 , 3 ])]))
318+ last_query (
319+ "SELECT (%(param_1:INT64)s NOT IN UNNEST(%(param_2:INT64)s)) AS `anon_1`" ,
320+ {"param_1" : 0 , "param_2" : [1 , 2 , 3 ]},
322321 )
323- assert isnotin
324322
325- assert _normalize_in_params (* faux_conn .test_data ["execute" ][- 1 ]) == (
326- "SELECT (%(p_0:INT64)s NOT IN "
327- "UNNEST([ %(p_1:INT64)s, %(p_2:INT64)s, %(p_3:INT64)s ])) AS `anon_1`" ,
328- {"p_0" : 0 , "p_1" : 1 , "p_2" : 2 , "p_3" : 3 },
329- )
330323
331-
332- def test_select_notin_param (faux_conn ):
324+ def test_select_notin_param (faux_conn , last_query ):
333325 [[isnotin ]] = faux_conn .execute (
334326 sqlalchemy .select (
335327 [sqlalchemy .literal (1 ).notin_ (sqlalchemy .bindparam ("q" , expanding = True ))]
336328 ),
337329 dict (q = [1 , 2 , 3 ]),
338330 )
339- assert not isnotin
340- assert faux_conn .test_data ["execute" ][- 1 ] == (
341- "SELECT (%(param_1:INT64)s NOT IN UNNEST("
342- "[ %(q_1:INT64)s, %(q_2:INT64)s, %(q_3:INT64)s ]"
343- ")) AS `anon_1`" ,
344- {"param_1" : 1 , "q_1" : 1 , "q_2" : 2 , "q_3" : 3 },
345- )
331+ if sqlalchemy_version >= packaging .version .parse ("1.4" ):
332+ last_query (
333+ "SELECT (%(param_1:INT64)s NOT IN UNNEST(%(q:INT64)s)) AS `anon_1`" ,
334+ {"param_1" : 1 , "q" : [1 , 2 , 3 ]},
335+ )
336+ else :
337+ assert not isnotin
338+ last_query (
339+ "SELECT (%(param_1:INT64)s NOT IN UNNEST("
340+ "[ %(q_1:INT64)s, %(q_2:INT64)s, %(q_3:INT64)s ]"
341+ ")) AS `anon_1`" ,
342+ {"param_1" : 1 , "q_1" : 1 , "q_2" : 2 , "q_3" : 3 },
343+ )
346344
347345
348346@sqlalchemy_1_3_or_higher
349- def test_select_notin_param_empty (faux_conn ):
347+ def test_select_notin_param_empty (faux_conn , last_query ):
350348 [[isnotin ]] = faux_conn .execute (
351349 sqlalchemy .select (
352350 [sqlalchemy .literal (1 ).notin_ (sqlalchemy .bindparam ("q" , expanding = True ))]
353351 ),
354352 dict (q = []),
355353 )
356- assert isnotin
357- assert faux_conn .test_data ["execute" ][- 1 ] == (
358- "SELECT (%(param_1:INT64)s NOT IN(NULL) OR (1 = 1)) AS `anon_1`"
359- if (
360- packaging .version .parse (sqlalchemy .__version__ )
361- >= packaging .version .parse ("1.4" )
354+ if sqlalchemy_version >= packaging .version .parse ("1.4" ):
355+ last_query (
356+ "SELECT (%(param_1:INT64)s NOT IN UNNEST(%(q:INT64)s)) AS `anon_1`" ,
357+ {"param_1" : 1 , "q" : []},
358+ )
359+ else :
360+ assert isnotin
361+ last_query (
362+ "SELECT (%(param_1:INT64)s NOT IN UNNEST([ ])) AS `anon_1`" , {"param_1" : 1 }
362363 )
363- else "SELECT (%(param_1:INT64)s NOT IN UNNEST([ ])) AS `anon_1`" ,
364- {"param_1" : 1 },
365- )
366364
367365
368366def test_literal_binds_kwarg_with_an_IN_operator_252 (faux_conn ):
0 commit comments