Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix sessions module conflict handling for the sqlite_stat1 table. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | sessions-stat1 |
Files: | files | file ages | folders |
SHA3-256: |
f05ee74e05c401eb075a1ba65179662a |
User & Date: | dan 2018-01-18 16:42:11.152 |
Context
2018-01-18
| ||
16:53 | Add comments describing the special sqlite_stat1 handling to sqlite3session.h. (check-in: 4431a3256f user: dan tags: sessions-stat1) | |
16:42 | Fix sessions module conflict handling for the sqlite_stat1 table. (check-in: f05ee74e05 user: dan tags: sessions-stat1) | |
15:06 | Simplify the sessions preupdate-hook logic for transforming NULL to X'' for column sqlite_stat1.idx. (check-in: 089d7cecaa user: dan tags: sessions-stat1) | |
Changes
Changes to ext/session/sessionstat1.test.
︙ | ︙ | |||
222 223 224 225 226 227 228 229 | INSERT INTO t2 VALUES(6,6,6); ANALYZE; } { {INSERT sqlite_stat1 0 XX. {} {t t1 b {} t 5}} {INSERT sqlite_stat1 0 XX. {} {t t2 b {} t 6}} } | > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 | INSERT INTO t2 VALUES(6,6,6); ANALYZE; } { {INSERT sqlite_stat1 0 XX. {} {t t1 b {} t 5}} {INSERT sqlite_stat1 0 XX. {} {t t2 b {} t 6}} } #------------------------------------------------------------------------- catch { db2 close } reset_db forcedelete test.db2 sqlite3 db2 test.db2 do_test 4.1.0 { do_common_sql { CREATE TABLE t1(a, b); CREATE INDEX i1 ON t1(a); CREATE INDEX i2 ON t1(b); INSERT INTO t1 VALUES(1,1), (2,2); ANALYZE; } execsql { DELETE FROM sqlite_stat1 } } {} do_test 4.1.1 { execsql { INSERT INTO t1 VALUES(3,3); } set C [changeset_from_sql {ANALYZE}] set ::c [list] proc xConflict {args} { lappend ::c $args return "OMIT" } sqlite3changeset_apply db2 $C xConflict set ::c } [list {*}{ {INSERT sqlite_stat1 CONFLICT {t t1 t i1 t {3 1}} {t t1 t i1 t {2 1}}} {INSERT sqlite_stat1 CONFLICT {t t1 t i2 t {3 1}} {t t1 t i2 t {2 1}}} }] do_execsql_test -db db2 4.1.2 { SELECT * FROM sqlite_stat1 ORDER BY 1,2; } {t1 i1 {2 1} t1 i2 {2 1}} do_test 4.1.3 { proc xConflict {args} { return "REPLACE" } sqlite3changeset_apply db2 $C xConflict execsql { SELECT * FROM sqlite_stat1 ORDER BY 1,2 } db2 } {t1 i1 {3 1} t1 i2 {3 1}} do_test 4.2.0 { do_common_sql { DROP TABLE t1; CREATE TABLE t3(x,y); INSERT INTO t3 VALUES('a','a'); INSERT INTO t3 VALUES('b','b'); ANALYZE; } execsql { DELETE FROM sqlite_stat1 } } {} do_test 4.2.1 { execsql { INSERT INTO t3 VALUES('c','c'); } set C [changeset_from_sql {ANALYZE}] set ::c [list] proc xConflict {args} { lappend ::c $args return "OMIT" } sqlite3changeset_apply db2 $C xConflict set ::c } [list {*}{ {INSERT sqlite_stat1 CONFLICT {t t3 b {} t 3} {t t3 b {} t 2}} }] db2 null null do_execsql_test -db db2 4.2.2 { SELECT * FROM sqlite_stat1 ORDER BY 1,2; } {t3 null 2} do_test 4.2.3 { proc xConflict {args} { return "REPLACE" } sqlite3changeset_apply db2 $C xConflict execsql { SELECT * FROM sqlite_stat1 ORDER BY 1,2 } db2 } {t3 null 3} finish_test |
Changes to ext/session/sqlite3session.c.
︙ | ︙ | |||
3374 3375 3376 3377 3378 3379 3380 | sqlite3_stmt *pDelete; /* DELETE statement */ sqlite3_stmt *pUpdate; /* UPDATE statement */ sqlite3_stmt *pInsert; /* INSERT statement */ sqlite3_stmt *pSelect; /* SELECT statement */ int nCol; /* Size of azCol[] and abPK[] arrays */ const char **azCol; /* Array of column names */ u8 *abPK; /* Boolean array - true if column is in PK */ | | | 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 | sqlite3_stmt *pDelete; /* DELETE statement */ sqlite3_stmt *pUpdate; /* UPDATE statement */ sqlite3_stmt *pInsert; /* INSERT statement */ sqlite3_stmt *pSelect; /* SELECT statement */ int nCol; /* Size of azCol[] and abPK[] arrays */ const char **azCol; /* Array of column names */ u8 *abPK; /* Boolean array - true if column is in PK */ int bStat1; /* True if table is sqlite_stat1 */ int bDeferConstraints; /* True to defer constraints */ SessionBuffer constraints; /* Deferred constraints are stored here */ }; /* ** Formulate a statement to DELETE a row from database db. Assuming a table ** structure like this: |
︙ | ︙ | |||
3977 3978 3979 3980 3981 3982 3983 | rc = sessionConflictHandler( SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, 0 ); } }else{ assert( op==SQLITE_INSERT ); | > > > > > > > > > > > > | | | | > > | 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 | rc = sessionConflictHandler( SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, 0 ); } }else{ assert( op==SQLITE_INSERT ); if( p->bStat1 ){ /* Check if there is a conflicting row. For sqlite_stat1, this needs ** to be done using a SELECT, as there is no PRIMARY KEY in the ** database schema to throw an exception if a duplicate is inserted. */ rc = sessionSeekToRow(p->db, pIter, p->abPK, p->pSelect); if( rc==SQLITE_ROW ){ rc = SQLITE_CONSTRAINT; sqlite3_reset(p->pSelect); } } if( rc==SQLITE_OK ){ rc = sessionBindRow(pIter, sqlite3changeset_new, nCol, 0, p->pInsert); if( rc!=SQLITE_OK ) return rc; sqlite3_step(p->pInsert); rc = sqlite3_reset(p->pInsert); } if( (rc&0xff)==SQLITE_CONSTRAINT ){ rc = sessionConflictHandler( SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, pbReplace ); } } |
︙ | ︙ | |||
4218 4219 4220 4221 4222 4223 4224 | } else{ sApply.nCol = nCol; if( 0==sqlite3_stricmp(zTab, "sqlite_stat1") ){ if( (rc = sessionStat1Sql(db, &sApply) ) ){ break; } | > | | | | | | | > > | 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 | } else{ sApply.nCol = nCol; if( 0==sqlite3_stricmp(zTab, "sqlite_stat1") ){ if( (rc = sessionStat1Sql(db, &sApply) ) ){ break; } sApply.bStat1 = 1; }else{ if((rc = sessionSelectRow(db, zTab, &sApply)) || (rc = sessionUpdateRow(db, zTab, &sApply)) || (rc = sessionDeleteRow(db, zTab, &sApply)) || (rc = sessionInsertRow(db, zTab, &sApply)) ){ break; } sApply.bStat1 = 0; } } nTab = sqlite3Strlen30(zTab); } } /* If there is a schema mismatch on the current table, proceed to the |
︙ | ︙ |