SQLite

Check-in [e64a4173d2]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Fix a problem introduced by [77948b5eceab92a7] causing duplicate calls to be made to the xSavepoint() method of virtual tables under some circumstances.
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: e64a4173d2899acf13b73e6e28f2e164fd638a75
User & Date: dan 2016-08-02 11:29:16.818
Context
2016-08-02
13:26
Updates to requirements marks. No changes to code. (check-in: b23c10ac8f user: drh tags: trunk)
11:29
Fix a problem introduced by [77948b5eceab92a7] causing duplicate calls to be made to the xSavepoint() method of virtual tables under some circumstances. (check-in: e64a4173d2 user: dan tags: trunk)
08:45
Fix harmless compiler warnings in sqlite3_status(). (check-in: 7c38a79cdd user: drh tags: trunk)
Changes
Unified Diff Ignore Whitespace Patch
Changes to src/vtab.c.
943
944
945
946
947
948
949
950



951
952
953
954
955
956
957
    ** sqlite3.aVTrans[] array. */
    rc = growVTrans(db);
    if( rc==SQLITE_OK ){
      rc = pModule->xBegin(pVTab->pVtab);
      if( rc==SQLITE_OK ){
        int iSvpt = db->nStatement + db->nSavepoint;
        addToVTrans(db, pVTab);
        if( iSvpt ) rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, iSvpt-1);



      }
    }
  }
  return rc;
}

/*







|
>
>
>







943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
    ** sqlite3.aVTrans[] array. */
    rc = growVTrans(db);
    if( rc==SQLITE_OK ){
      rc = pModule->xBegin(pVTab->pVtab);
      if( rc==SQLITE_OK ){
        int iSvpt = db->nStatement + db->nSavepoint;
        addToVTrans(db, pVTab);
        if( iSvpt && pModule->xSavepoint ){
          pVTab->iSavepoint = iSvpt;
          rc = pModule->xSavepoint(pVTab->pVtab, iSvpt-1);
        }
      }
    }
  }
  return rc;
}

/*
Changes to test/fts3conf.test.
206
207
208
209
210
211
212






































213
214
    ROLLBACK TO abc;
  COMMIT;
}
do_execsql_test 4.2.2 {
  SELECT * FROM t01 WHERE t01 MATCH 'b';
  INSERT INTO t01(t01) VALUES('integrity-check');
} {}







































finish_test







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
    ROLLBACK TO abc;
  COMMIT;
}
do_execsql_test 4.2.2 {
  SELECT * FROM t01 WHERE t01 MATCH 'b';
  INSERT INTO t01(t01) VALUES('integrity-check');
} {}

do_execsql_test 4.3.1 {
  CREATE VIRTUAL TABLE t02 USING fts4;
  INSERT INTO t01 VALUES('1 1 1');
  INSERT INTO t02 VALUES('2 2 2');
  BEGIN;
    SAVEPOINT abc;
      INSERT INTO t01 VALUES('a b c');
      INSERT INTO t02 VALUES('a b c');
    ROLLBACK TO abc;
  COMMIT;
}
do_execsql_test 4.3.2 {
  SELECT * FROM t01 WHERE t01 MATCH 'b';
  INSERT INTO t01(t01) VALUES('integrity-check');
} {}

do_execsql_test 4.4.1 {
  CREATE TABLE A(ID INTEGER PRIMARY KEY, AnotherID INTEGER, Notes TEXT);
  CREATE VIRTUAL TABLE AFTS USING FTS4 (Notes);
  CREATE TRIGGER A_DeleteTrigger AFTER DELETE ON A FOR EACH ROW BEGIN 
    DELETE FROM AFTS WHERE rowid=OLD.ID; 
  END;
  CREATE TABLE B(ID INTEGER PRIMARY KEY,Notes TEXT);
  CREATE VIRTUAL TABLE BFTS USING FTS3 (Notes);
  CREATE TRIGGER B_DeleteTrigger AFTER DELETE ON B FOR EACH ROW BEGIN 
    DELETE FROM BFTS WHERE rowid=OLD.ID; 
  END;
}
		
do_execsql_test 4.4.2 {
  BEGIN TRANSACTION;
    DELETE FROM A WHERE AnotherID=1;
    DELETE FROM B WHERE ID=1;
  COMMIT;
}
		


finish_test