@@ -343,6 +343,94 @@ suite('DatabaseSync.prototype.close()', () => {
343343 } ) ;
344344 t . assert . strictEqual ( db . isOpen , false ) ;
345345 } ) ;
346+
347+ test ( 'invalidates prepared statements' , ( t ) => {
348+ const db = new DatabaseSync ( nextDb ( ) ) ;
349+ db . exec ( `
350+ CREATE TABLE data(key INTEGER PRIMARY KEY, val INTEGER);
351+ INSERT INTO data (key, val) VALUES (1, 2);
352+ ` ) ;
353+
354+ const select = db . prepare ( 'SELECT * FROM data' ) ;
355+ const insert = db . prepare ( 'INSERT INTO data (key, val) VALUES (?, ?)' ) ;
356+
357+ t . assert . strictEqual ( db . close ( ) , undefined ) ;
358+ t . assert . strictEqual ( db . isOpen , false ) ;
359+
360+ for ( const method of [ 'prepare' , 'exec' ] ) {
361+ t . assert . throws ( ( ) => {
362+ db [ method ] ( 'SELECT 1' ) ;
363+ } , {
364+ code : 'ERR_INVALID_STATE' ,
365+ message : / d a t a b a s e i s n o t o p e n / ,
366+ } ) ;
367+ }
368+
369+ t . assert . throws ( ( ) => {
370+ select . get ( ) ;
371+ } , {
372+ code : 'ERR_INVALID_STATE' ,
373+ message : / s t a t e m e n t h a s b e e n f i n a l i z e d / ,
374+ } ) ;
375+ t . assert . throws ( ( ) => {
376+ select . all ( ) ;
377+ } , {
378+ code : 'ERR_INVALID_STATE' ,
379+ message : / s t a t e m e n t h a s b e e n f i n a l i z e d / ,
380+ } ) ;
381+ t . assert . throws ( ( ) => {
382+ insert . run ( 2 , 4 ) ;
383+ } , {
384+ code : 'ERR_INVALID_STATE' ,
385+ message : / s t a t e m e n t h a s b e e n f i n a l i z e d / ,
386+ } ) ;
387+ } ) ;
388+
389+ test ( 'keeps prepared statements invalid after reopening' , ( t ) => {
390+ const db = new DatabaseSync ( nextDb ( ) ) ;
391+ t . after ( ( ) => {
392+ if ( db . isOpen ) db . close ( ) ;
393+ } ) ;
394+
395+ db . exec ( `
396+ CREATE TABLE data(key INTEGER PRIMARY KEY, val INTEGER);
397+ INSERT INTO data (key, val) VALUES (1, 2);
398+ ` ) ;
399+
400+ const select = db . prepare ( 'SELECT * FROM data' ) ;
401+ const insert = db . prepare ( 'INSERT INTO data (key, val) VALUES (?, ?)' ) ;
402+
403+ db . close ( ) ;
404+ db . open ( ) ;
405+
406+ t . assert . throws ( ( ) => {
407+ select . get ( ) ;
408+ } , {
409+ code : 'ERR_INVALID_STATE' ,
410+ message : / s t a t e m e n t h a s b e e n f i n a l i z e d / ,
411+ } ) ;
412+ t . assert . throws ( ( ) => {
413+ select . all ( ) ;
414+ } , {
415+ code : 'ERR_INVALID_STATE' ,
416+ message : / s t a t e m e n t h a s b e e n f i n a l i z e d / ,
417+ } ) ;
418+ t . assert . throws ( ( ) => {
419+ insert . run ( 2 , 4 ) ;
420+ } , {
421+ code : 'ERR_INVALID_STATE' ,
422+ message : / s t a t e m e n t h a s b e e n f i n a l i z e d / ,
423+ } ) ;
424+
425+ t . assert . deepStrictEqual (
426+ db . prepare ( 'SELECT * FROM data' ) . all ( ) ,
427+ [ { __proto__ : null , key : 1 , val : 2 } ] ,
428+ ) ;
429+ t . assert . strictEqual (
430+ db . exec ( 'INSERT INTO data (key, val) VALUES (2, 4)' ) ,
431+ undefined ,
432+ ) ;
433+ } ) ;
346434} ) ;
347435
348436suite ( 'DatabaseSync.prototype.prepare()' , ( ) => {
0 commit comments