@@ -167,11 +167,25 @@ def test_module_constants(self):
167167 "SQLITE_TOOBIG" ,
168168 "SQLITE_TRANSACTION" ,
169169 "SQLITE_UPDATE" ,
170+ # Run-time limit categories
171+ "SQLITE_LIMIT_LENGTH" ,
172+ "SQLITE_LIMIT_SQL_LENGTH" ,
173+ "SQLITE_LIMIT_COLUMN" ,
174+ "SQLITE_LIMIT_EXPR_DEPTH" ,
175+ "SQLITE_LIMIT_COMPOUND_SELECT" ,
176+ "SQLITE_LIMIT_VDBE_OP" ,
177+ "SQLITE_LIMIT_FUNCTION_ARG" ,
178+ "SQLITE_LIMIT_ATTACHED" ,
179+ "SQLITE_LIMIT_LIKE_PATTERN_LENGTH" ,
180+ "SQLITE_LIMIT_VARIABLE_NUMBER" ,
181+ "SQLITE_LIMIT_TRIGGER_DEPTH" ,
170182 ]
171183 if sqlite .sqlite_version_info >= (3 , 7 , 17 ):
172184 consts += ["SQLITE_NOTICE" , "SQLITE_WARNING" ]
173185 if sqlite .sqlite_version_info >= (3 , 8 , 3 ):
174186 consts .append ("SQLITE_RECURSIVE" )
187+ if sqlite .sqlite_version_info >= (3 , 8 , 7 ):
188+ consts .append ("SQLITE_LIMIT_WORKER_THREADS" )
175189 consts += ["PARSE_DECLTYPES" , "PARSE_COLNAMES" ]
176190 for const in consts :
177191 with self .subTest (const = const ):
@@ -332,6 +346,28 @@ def test_drop_unused_refs(self):
332346 cu = self .cx .execute (f"select { n } " )
333347 self .assertEqual (cu .fetchone ()[0 ], n )
334348
349+ def test_connection_limits (self ):
350+ category = sqlite .SQLITE_LIMIT_SQL_LENGTH
351+ saved_limit = self .cx .getlimit (category )
352+ try :
353+ new_limit = 10
354+ prev_limit = self .cx .setlimit (category , new_limit )
355+ self .assertEqual (saved_limit , prev_limit )
356+ self .assertEqual (self .cx .getlimit (category ), new_limit )
357+ msg = "string or blob too big"
358+ self .assertRaisesRegex (sqlite .DataError , msg ,
359+ self .cx .execute , "select 1 as '16'" )
360+ finally : # restore saved limit
361+ self .cx .setlimit (category , saved_limit )
362+
363+ def test_connection_bad_limit_category (self ):
364+ msg = "'category' is out of bounds"
365+ cat = 1111
366+ self .assertRaisesRegex (sqlite .ProgrammingError , msg ,
367+ self .cx .getlimit , cat )
368+ self .assertRaisesRegex (sqlite .ProgrammingError , msg ,
369+ self .cx .setlimit , cat , 0 )
370+
335371
336372class UninitialisedConnectionTests (unittest .TestCase ):
337373 def setUp (self ):
@@ -767,6 +803,8 @@ def test_check_connection_thread(self):
767803 lambda : self .con .set_trace_callback (None ),
768804 lambda : self .con .set_authorizer (None ),
769805 lambda : self .con .create_collation ("foo" , None ),
806+ lambda : self .con .setlimit (sqlite .SQLITE_LIMIT_LENGTH , - 1 ),
807+ lambda : self .con .getlimit (sqlite .SQLITE_LIMIT_LENGTH ),
770808 ]
771809 for fn in fns :
772810 with self .subTest (fn = fn ):
0 commit comments