@@ -854,3 +854,108 @@ suite('options.allowBareNamedParameters', () => {
854854 ) ;
855855 } ) ;
856856} ) ;
857+
858+ suite ( 'StatementSync.prototype.setReadNullAsUndefined()' , ( ) => {
859+ test ( 'NULL conversion can be toggled' , ( t ) => {
860+ const db = new DatabaseSync ( nextDb ( ) ) ;
861+ t . after ( ( ) => { db . close ( ) ; } ) ;
862+
863+ db . exec ( `
864+ CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT;
865+ INSERT INTO data (key, val) VALUES (1, NULL);
866+ ` ) ;
867+
868+ const query = db . prepare ( 'SELECT val FROM data WHERE key = 1' ) ;
869+ t . assert . deepStrictEqual ( query . get ( ) , { __proto__ : null , val : null } ) ;
870+
871+ t . assert . strictEqual ( query . setReadNullAsUndefined ( true ) , undefined ) ;
872+ t . assert . deepStrictEqual ( query . get ( ) , { __proto__ : null , val : undefined } ) ;
873+
874+ t . assert . strictEqual ( query . setReadNullAsUndefined ( false ) , undefined ) ;
875+ t . assert . deepStrictEqual ( query . get ( ) , { __proto__ : null , val : null } ) ;
876+ } ) ;
877+
878+ test ( 'throws when input is not a boolean' , ( t ) => {
879+ const db = new DatabaseSync ( nextDb ( ) ) ;
880+ t . after ( ( ) => { db . close ( ) ; } ) ;
881+
882+ db . exec ( 'CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT;' ) ;
883+
884+ const stmt = db . prepare ( 'SELECT val FROM data' ) ;
885+ t . assert . throws ( ( ) => {
886+ stmt . setReadNullAsUndefined ( ) ;
887+ } , {
888+ code : 'ERR_INVALID_ARG_TYPE' ,
889+ message : / T h e " r e a d N u l l A s U n d e f i n e d " a r g u m e n t m u s t b e a b o o l e a n / ,
890+ } ) ;
891+ } ) ;
892+
893+ test ( 'returns array rows with undefined when both flags are set' , ( t ) => {
894+ const db = new DatabaseSync ( nextDb ( ) ) ;
895+ t . after ( ( ) => { db . close ( ) ; } ) ;
896+
897+ db . exec ( `
898+ CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT;
899+ INSERT INTO data (key, val) VALUES (1, NULL);
900+ ` ) ;
901+
902+ const query = db . prepare ( 'SELECT key, val FROM data WHERE key = 1' ) ;
903+ query . setReturnArrays ( true ) ;
904+ query . setReadNullAsUndefined ( true ) ;
905+
906+ t . assert . deepStrictEqual ( query . get ( ) , [ 1 , undefined ] ) ;
907+ } ) ;
908+
909+ test ( 'applies to all()' , ( t ) => {
910+ const db = new DatabaseSync ( nextDb ( ) ) ;
911+ t . after ( ( ) => { db . close ( ) ; } ) ;
912+
913+ db . exec ( `
914+ CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT;
915+ INSERT INTO data (key, val) VALUES (1, NULL), (2, 'two');
916+ ` ) ;
917+
918+ const query = db . prepare ( 'SELECT key, val FROM data ORDER BY key' ) ;
919+ query . setReadNullAsUndefined ( true ) ;
920+
921+ t . assert . deepStrictEqual ( query . all ( ) , [
922+ { __proto__ : null , key : 1 , val : undefined } ,
923+ { __proto__ : null , key : 2 , val : 'two' } ,
924+ ] ) ;
925+ } ) ;
926+
927+ test ( 'applies to iterate()' , ( t ) => {
928+ const db = new DatabaseSync ( nextDb ( ) ) ;
929+ t . after ( ( ) => { db . close ( ) ; } ) ;
930+
931+ db . exec ( `
932+ CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT;
933+ INSERT INTO data (key, val) VALUES (1, NULL), (2, NULL);
934+ ` ) ;
935+
936+ const query = db . prepare ( 'SELECT key, val FROM data ORDER BY key' ) ;
937+ query . setReadNullAsUndefined ( true ) ;
938+
939+ const iter = query . iterate ( ) ;
940+ t . assert . deepStrictEqual ( iter . next ( ) . value , { __proto__ : null , key : 1 , val : undefined } ) ;
941+ t . assert . deepStrictEqual ( iter . next ( ) . value , { __proto__ : null , key : 2 , val : undefined } ) ;
942+ t . assert . strictEqual ( iter . next ( ) . done , true ) ;
943+ } ) ;
944+
945+ test ( 'does not change NULL passed to user-defined functions' , ( t ) => {
946+ const db = new DatabaseSync ( nextDb ( ) ) ;
947+ t . after ( ( ) => { db . close ( ) ; } ) ;
948+
949+ db . exec ( 'CREATE TABLE data(val TEXT) STRICT; INSERT INTO data VALUES (NULL);' ) ;
950+
951+ let seen ;
952+ db . function ( 'echo' , ( x ) => { seen = x ; return x ; } ) ;
953+
954+ const query = db . prepare ( 'SELECT echo(val) AS out FROM data' ) ;
955+ query . setReadNullAsUndefined ( true ) ;
956+
957+ t . assert . deepStrictEqual ( query . get ( ) , { __proto__ : null , out : undefined } ) ;
958+ t . assert . strictEqual ( seen , null ) ;
959+ } ) ;
960+ } ) ;
961+
0 commit comments