@@ -331,6 +331,94 @@ suite('DatabaseSync.prototype.close()', () => {
331331 } ) ;
332332 t . assert . strictEqual ( db . isOpen , false ) ;
333333 } ) ;
334+
335+ test ( 'invalidates prepared statements' , ( t ) => {
336+ const db = new DatabaseSync ( nextDb ( ) ) ;
337+ db . exec ( `
338+ CREATE TABLE data(key INTEGER PRIMARY KEY, val INTEGER);
339+ INSERT INTO data (key, val) VALUES (1, 2);
340+ ` ) ;
341+
342+ const select = db . prepare ( 'SELECT * FROM data' ) ;
343+ const insert = db . prepare ( 'INSERT INTO data (key, val) VALUES (?, ?)' ) ;
344+
345+ t . assert . strictEqual ( db . close ( ) , undefined ) ;
346+ t . assert . strictEqual ( db . isOpen , false ) ;
347+
348+ for ( const method of [ 'prepare' , 'exec' ] ) {
349+ t . assert . throws ( ( ) => {
350+ db [ method ] ( 'SELECT 1' ) ;
351+ } , {
352+ code : 'ERR_INVALID_STATE' ,
353+ message : / d a t a b a s e i s n o t o p e n / ,
354+ } ) ;
355+ }
356+
357+ t . assert . throws ( ( ) => {
358+ select . get ( ) ;
359+ } , {
360+ code : 'ERR_INVALID_STATE' ,
361+ 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 / ,
362+ } ) ;
363+ t . assert . throws ( ( ) => {
364+ select . all ( ) ;
365+ } , {
366+ code : 'ERR_INVALID_STATE' ,
367+ 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 / ,
368+ } ) ;
369+ t . assert . throws ( ( ) => {
370+ insert . run ( 2 , 4 ) ;
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+ } ) ;
376+
377+ test ( 'keeps prepared statements invalid after reopening' , ( t ) => {
378+ const db = new DatabaseSync ( nextDb ( ) ) ;
379+ t . after ( ( ) => {
380+ if ( db . isOpen ) db . close ( ) ;
381+ } ) ;
382+
383+ db . exec ( `
384+ CREATE TABLE data(key INTEGER PRIMARY KEY, val INTEGER);
385+ INSERT INTO data (key, val) VALUES (1, 2);
386+ ` ) ;
387+
388+ const select = db . prepare ( 'SELECT * FROM data' ) ;
389+ const insert = db . prepare ( 'INSERT INTO data (key, val) VALUES (?, ?)' ) ;
390+
391+ db . close ( ) ;
392+ db . open ( ) ;
393+
394+ t . assert . throws ( ( ) => {
395+ select . get ( ) ;
396+ } , {
397+ code : 'ERR_INVALID_STATE' ,
398+ 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 / ,
399+ } ) ;
400+ t . assert . throws ( ( ) => {
401+ select . all ( ) ;
402+ } , {
403+ code : 'ERR_INVALID_STATE' ,
404+ 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 / ,
405+ } ) ;
406+ t . assert . throws ( ( ) => {
407+ insert . run ( 2 , 4 ) ;
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+
413+ t . assert . deepStrictEqual (
414+ db . prepare ( 'SELECT * FROM data' ) . all ( ) ,
415+ [ { __proto__ : null , key : 1 , val : 2 } ] ,
416+ ) ;
417+ t . assert . strictEqual (
418+ db . exec ( 'INSERT INTO data (key, val) VALUES (2, 4)' ) ,
419+ undefined ,
420+ ) ;
421+ } ) ;
334422} ) ;
335423
336424suite ( 'DatabaseSync.prototype.prepare()' , ( ) => {
@@ -522,4 +610,46 @@ suite('DatabaseSync.prototype[Symbol.dispose]', () => {
522610 t . assert . strictEqual ( db . isOpen , false ) ;
523611 db [ Symbol . dispose ] ( ) ;
524612 } ) ;
613+
614+ test ( 'invalidates prepared statements' , ( t ) => {
615+ const db = new DatabaseSync ( nextDb ( ) ) ;
616+ db . exec ( `
617+ CREATE TABLE data(key INTEGER PRIMARY KEY, val INTEGER);
618+ INSERT INTO data (key, val) VALUES (1, 2);
619+ ` ) ;
620+
621+ const select = db . prepare ( 'SELECT * FROM data' ) ;
622+ const insert = db . prepare ( 'INSERT INTO data (key, val) VALUES (?, ?)' ) ;
623+
624+ db [ Symbol . dispose ] ( ) ;
625+ t . assert . strictEqual ( db . isOpen , false ) ;
626+
627+ for ( const method of [ 'prepare' , 'exec' ] ) {
628+ t . assert . throws ( ( ) => {
629+ db [ method ] ( 'SELECT 1' ) ;
630+ } , {
631+ code : 'ERR_INVALID_STATE' ,
632+ message : / d a t a b a s e i s n o t o p e n / ,
633+ } ) ;
634+ }
635+
636+ t . assert . throws ( ( ) => {
637+ select . get ( ) ;
638+ } , {
639+ code : 'ERR_INVALID_STATE' ,
640+ 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 / ,
641+ } ) ;
642+ t . assert . throws ( ( ) => {
643+ select . all ( ) ;
644+ } , {
645+ code : 'ERR_INVALID_STATE' ,
646+ 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 / ,
647+ } ) ;
648+ t . assert . throws ( ( ) => {
649+ insert . run ( 2 , 4 ) ;
650+ } , {
651+ code : 'ERR_INVALID_STATE' ,
652+ 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 / ,
653+ } ) ;
654+ } ) ;
525655} ) ;
0 commit comments