@@ -959,3 +959,138 @@ suite('StatementSync.prototype.setReadNullAsUndefined()', () => {
959959 } ) ;
960960} ) ;
961961
962+ suite ( 'options.readNullAsUndefined' , ( ) => {
963+ test ( 'undefined is returned when input is true' , ( t ) => {
964+ const db = new DatabaseSync ( nextDb ( ) ) ;
965+ t . after ( ( ) => { db . close ( ) ; } ) ;
966+ const setup = db . exec ( `
967+ CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT;
968+ INSERT INTO data (key, val) VALUES (1, NULL);
969+ ` ) ;
970+ t . assert . strictEqual ( setup , undefined ) ;
971+
972+ const query = db . prepare (
973+ 'SELECT val FROM data WHERE key = 1' ,
974+ { readNullAsUndefined : true }
975+ ) ;
976+ t . assert . deepStrictEqual ( query . get ( ) , { __proto__ : null , val : undefined } ) ;
977+ } ) ;
978+
979+ test ( 'null is returned when input is false' , ( t ) => {
980+ const db = new DatabaseSync ( nextDb ( ) ) ;
981+ t . after ( ( ) => { db . close ( ) ; } ) ;
982+ const setup = db . exec ( `
983+ CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT;
984+ INSERT INTO data (key, val) VALUES (1, NULL);
985+ ` ) ;
986+ t . assert . strictEqual ( setup , undefined ) ;
987+
988+ const query = db . prepare (
989+ 'SELECT val FROM data WHERE key = 1' ,
990+ { readNullAsUndefined : false }
991+ ) ;
992+ t . assert . deepStrictEqual ( query . get ( ) , { __proto__ : null , val : null } ) ;
993+ } ) ;
994+
995+ test ( 'null is returned by default' , ( t ) => {
996+ const db = new DatabaseSync ( nextDb ( ) ) ;
997+ t . after ( ( ) => { db . close ( ) ; } ) ;
998+ const setup = db . exec ( `
999+ CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT;
1000+ INSERT INTO data (key, val) VALUES (1, NULL);
1001+ ` ) ;
1002+ t . assert . strictEqual ( setup , undefined ) ;
1003+
1004+ const query = db . prepare ( 'SELECT val FROM data WHERE key = 1' ) ;
1005+ t . assert . deepStrictEqual ( query . get ( ) , { __proto__ : null , val : null } ) ;
1006+ } ) ;
1007+
1008+ test ( 'throws when input is not a boolean' , ( t ) => {
1009+ const db = new DatabaseSync ( nextDb ( ) ) ;
1010+ t . after ( ( ) => { db . close ( ) ; } ) ;
1011+ const setup = db . exec (
1012+ 'CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT;'
1013+ ) ;
1014+ t . assert . strictEqual ( setup , undefined ) ;
1015+ t . assert . throws ( ( ) => {
1016+ db . prepare ( 'SELECT val FROM data' , { readNullAsUndefined : 'true' } ) ;
1017+ } , {
1018+ code : 'ERR_INVALID_ARG_TYPE' ,
1019+ message : / T h e " o p t i o n s \. 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 / ,
1020+ } ) ;
1021+ } ) ;
1022+
1023+ test ( 'setReadNullAsUndefined can override prepare option' , ( t ) => {
1024+ const db = new DatabaseSync ( nextDb ( ) ) ;
1025+ t . after ( ( ) => { db . close ( ) ; } ) ;
1026+ const setup = db . exec ( `
1027+ CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT;
1028+ INSERT INTO data (key, val) VALUES (1, NULL);
1029+ ` ) ;
1030+ t . assert . strictEqual ( setup , undefined ) ;
1031+
1032+ const query = db . prepare (
1033+ 'SELECT val FROM data WHERE key = 1' ,
1034+ { readNullAsUndefined : true }
1035+ ) ;
1036+ t . assert . deepStrictEqual ( query . get ( ) , { __proto__ : null , val : undefined } ) ;
1037+ t . assert . strictEqual ( query . setReadNullAsUndefined ( false ) , undefined ) ;
1038+ t . assert . deepStrictEqual ( query . get ( ) , { __proto__ : null , val : null } ) ;
1039+ } ) ;
1040+
1041+ test ( 'all() returns undefined when input is true' , ( t ) => {
1042+ const db = new DatabaseSync ( nextDb ( ) ) ;
1043+ t . after ( ( ) => { db . close ( ) ; } ) ;
1044+ const setup = db . exec ( `
1045+ CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT;
1046+ INSERT INTO data (key, val) VALUES (1, NULL);
1047+ INSERT INTO data (key, val) VALUES (2, 'two');
1048+ ` ) ;
1049+ t . assert . strictEqual ( setup , undefined ) ;
1050+
1051+ const query = db . prepare (
1052+ 'SELECT key, val FROM data ORDER BY key' ,
1053+ { readNullAsUndefined : true }
1054+ ) ;
1055+ t . assert . deepStrictEqual ( query . all ( ) , [
1056+ { __proto__ : null , key : 1 , val : undefined } ,
1057+ { __proto__ : null , key : 2 , val : 'two' } ,
1058+ ] ) ;
1059+ } ) ;
1060+
1061+ test ( 'iterate() returns undefined when input is true' , ( t ) => {
1062+ const db = new DatabaseSync ( nextDb ( ) ) ;
1063+ t . after ( ( ) => { db . close ( ) ; } ) ;
1064+ const setup = db . exec ( `
1065+ CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT;
1066+ INSERT INTO data (key, val) VALUES (1, NULL);
1067+ INSERT INTO data (key, val) VALUES (2, NULL);
1068+ ` ) ;
1069+ t . assert . strictEqual ( setup , undefined ) ;
1070+
1071+ const query = db . prepare (
1072+ 'SELECT key, val FROM data ORDER BY key' ,
1073+ { readNullAsUndefined : true }
1074+ ) ;
1075+ t . assert . deepStrictEqual ( query . iterate ( ) . toArray ( ) , [
1076+ { __proto__ : null , key : 1 , val : undefined } ,
1077+ { __proto__ : null , key : 2 , val : undefined } ,
1078+ ] ) ;
1079+ } ) ;
1080+
1081+ test ( 'works with returnArrays option' , ( t ) => {
1082+ const db = new DatabaseSync ( nextDb ( ) ) ;
1083+ t . after ( ( ) => { db . close ( ) ; } ) ;
1084+ const setup = db . exec ( `
1085+ CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT;
1086+ INSERT INTO data (key, val) VALUES (1, NULL);
1087+ ` ) ;
1088+ t . assert . strictEqual ( setup , undefined ) ;
1089+
1090+ const query = db . prepare (
1091+ 'SELECT key, val FROM data WHERE key = 1' ,
1092+ { readNullAsUndefined : true , returnArrays : true }
1093+ ) ;
1094+ t . assert . deepStrictEqual ( query . get ( ) , [ 1 , undefined ] ) ;
1095+ } ) ;
1096+ } ) ;
0 commit comments