@@ -71,6 +71,89 @@ suite('DatabaseSync.prototype.setAuthorizer()', () => {
7171 } ) ;
7272 } ) ;
7373
74+ it ( 'ignores SELECT operations when authorizer returns SQLITE_IGNORE' , ( ) => {
75+ const db = createTestDatabase ( ) ;
76+ db . prepare ( 'INSERT INTO users (id, name) VALUES (?, ?)' ) . run ( 1 , 'Alice' ) ;
77+
78+ db . setAuthorizer ( ( actionCode ) => {
79+ if ( actionCode === constants . SQLITE_SELECT ) {
80+ return constants . SQLITE_IGNORE ;
81+ }
82+ return constants . SQLITE_OK ;
83+ } ) ;
84+
85+ // SELECT should be ignored and return no results
86+ const result = db . prepare ( 'SELECT * FROM users' ) . all ( ) ;
87+ assert . deepStrictEqual ( result , [ ] ) ;
88+ } ) ;
89+
90+ it ( 'ignores READ operations when authorizer returns SQLITE_IGNORE' , ( ) => {
91+ const db = createTestDatabase ( ) ;
92+ db . prepare ( 'INSERT INTO users (id, name) VALUES (?, ?)' ) . run ( 1 , 'Alice' ) ;
93+
94+ db . setAuthorizer ( ( actionCode , arg1 , arg2 ) => {
95+ if ( actionCode === constants . SQLITE_READ && arg1 === 'users' && arg2 === 'name' ) {
96+ return constants . SQLITE_IGNORE ;
97+ }
98+ return constants . SQLITE_OK ;
99+ } ) ;
100+
101+ // Reading the 'name' column should be ignored, returning NULL
102+ const result = db . prepare ( 'SELECT id, name FROM users WHERE id = 1' ) . get ( ) ;
103+ assert . strictEqual ( result . id , 1 ) ;
104+ assert . strictEqual ( result . name , null ) ;
105+ } ) ;
106+
107+ it ( 'ignores INSERT operations when authorizer returns SQLITE_IGNORE' , ( ) => {
108+ const db = createTestDatabase ( ) ;
109+
110+ db . setAuthorizer ( ( actionCode ) => {
111+ if ( actionCode === constants . SQLITE_INSERT ) {
112+ return constants . SQLITE_IGNORE ;
113+ }
114+ return constants . SQLITE_OK ;
115+ } ) ;
116+
117+ db . prepare ( 'INSERT INTO users (id, name) VALUES (?, ?)' ) . run ( 1 , 'Alice' ) ;
118+
119+ // Verify no data was inserted
120+ const count = db . prepare ( 'SELECT COUNT(*) as count FROM users' ) . get ( ) ;
121+ assert . strictEqual ( count . count , 0 ) ;
122+ } ) ;
123+
124+ it ( 'ignores UPDATE operations when authorizer returns SQLITE_IGNORE' , ( ) => {
125+ const db = createTestDatabase ( ) ;
126+ db . exec ( "INSERT INTO users (id, name) VALUES (1, 'Alice')" ) ;
127+
128+ db . setAuthorizer ( ( actionCode ) => {
129+ if ( actionCode === constants . SQLITE_UPDATE ) {
130+ return constants . SQLITE_IGNORE ;
131+ }
132+ return constants . SQLITE_OK ;
133+ } ) ;
134+
135+ db . prepare ( 'UPDATE users SET name = ? WHERE id = ?' ) . run ( 'Bob' , 1 ) ;
136+
137+ // Verify data was not updated
138+ const result = db . prepare ( 'SELECT name FROM users WHERE id = 1' ) . get ( ) ;
139+ assert . strictEqual ( result . name , 'Alice' ) ;
140+ } ) ;
141+
142+ it ( 'ignores DELETE operations when authorizer returns SQLITE_IGNORE' , ( ) => {
143+ const db = createTestDatabase ( ) ;
144+ db . exec ( "INSERT INTO users (id, name) VALUES (1, 'Alice')" ) ;
145+
146+ db . setAuthorizer ( ( ) => constants . SQLITE_IGNORE ) ;
147+
148+ db . prepare ( 'DELETE FROM users WHERE id = ?' ) . run ( 1 ) ;
149+
150+ db . setAuthorizer ( null ) ;
151+
152+ // Verify data was not deleted
153+ const count = db . prepare ( 'SELECT COUNT(*) as count FROM users' ) . get ( ) ;
154+ assert . strictEqual ( count . count , 1 ) ;
155+ } ) ;
156+
74157 it ( 'rethrows error when authorizer throws error' , ( ) => {
75158 const db = new DatabaseSync ( ':memory:' ) ;
76159 db . setAuthorizer ( ( ) => {
0 commit comments