@@ -277,25 +277,39 @@ def CheckAnyArguments(self):
277
277
val = cur .fetchone ()[0 ]
278
278
self .assertEqual (val , 2 )
279
279
280
+
281
+ #
282
+ # Regarding deterministic functions:
283
+ #
284
+ # Between 3.8.3 and 3.15.0, deterministic functions were only used to
285
+ # optimize inner loops, so for those versions we can only test if the
286
+ # sqlite machinery has factored out a call or not. From 3.15.0 and onward,
287
+ # deterministic functions were permitted in WHERE clauses of partial
288
+ # indices, which allows testing based on syntax, iso. the query optimizer.
289
+ #
280
290
@unittest .skipIf (sqlite .sqlite_version_info < (3 , 8 , 3 ), "Requires SQLite 3.8.3 or higher" )
281
291
def CheckFuncNonDeterministic (self ):
282
- """Non-deterministic functions cannot be used with partial indices"""
283
292
mock = unittest .mock .Mock (return_value = None )
284
293
self .con .create_function ("nondeterministic" , 0 , mock , deterministic = False )
285
- with self .assertRaises (sqlite .OperationalError ) as cm :
286
- self .con .execute ("create index t on test(t) where nondeterministic() is not null" )
287
- # non-deterministic functions prohibited in partial index WHERE clauses
288
- self .assertIn ("non-deterministic functions prohibited" , str (cm .exception ))
294
+ if sqlite .sqlite_version_info < (3 , 15 , 0 ):
295
+ self .con .execute ("select nondeterministic() = nondeterministic()" )
296
+ self .assertEqual (mock .call_count , 2 )
297
+ else :
298
+ with self .assertRaises (sqlite .OperationalError ):
299
+ self .con .execute ("create index t on test(t) where nondeterministic() is not null" )
289
300
290
301
@unittest .skipIf (sqlite .sqlite_version_info < (3 , 8 , 3 ), "Requires SQLite 3.8.3 or higher" )
291
302
def CheckFuncDeterministic (self ):
292
- """Deterministic functions can be used with partial indices"""
293
303
mock = unittest .mock .Mock (return_value = None )
294
304
self .con .create_function ("deterministic" , 0 , mock , deterministic = True )
295
- try :
296
- self .con .execute ("create index t on test(t) where deterministic() is not null" )
297
- except sqlite .OperationalError :
298
- self .fail ("Unexpected failure while creating partial index" )
305
+ if sqlite .sqlite_version_info < (3 , 15 , 0 ):
306
+ self .con .execute ("select deterministic() = deterministic()" )
307
+ self .assertEqual (mock .call_count , 1 )
308
+ else :
309
+ try :
310
+ self .con .execute ("create index t on test(t) where deterministic() is not null" )
311
+ except sqlite .OperationalError :
312
+ self .fail ("Unexpected failure while creating partial index" )
299
313
300
314
@unittest .skipIf (sqlite .sqlite_version_info >= (3 , 8 , 3 ), "SQLite < 3.8.3 needed" )
301
315
def CheckFuncDeterministicNotSupported (self ):
0 commit comments