Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix incompatibilities between the "sqldiff --changeset" command and the sessions module. Specifically, allow sessions to process changesets containing tables with zero operations on them and have sqldiff output the expected output for tables with multi-column primary keys. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
0bb23c48064cc64134697469f3f4d2d3 |
User & Date: | dan 2017-05-22 18:09:00.314 |
Context
2017-05-23
| ||
00:32 | Remove a surplus semicolon, which was harmless on gcc and clang but caused compile-time errors on msvc. This only comes up using the encryption extension. (check-in: 987a2b5537 user: drh tags: trunk) | |
2017-05-22
| ||
18:09 | Fix incompatibilities between the "sqldiff --changeset" command and the sessions module. Specifically, allow sessions to process changesets containing tables with zero operations on them and have sqldiff output the expected output for tables with multi-column primary keys. (check-in: 0bb23c4806 user: dan tags: trunk) | |
18:00 | Add the ".cd" command to the command-line shell. (check-in: 5fe28e15b1 user: drh tags: trunk) | |
Changes
Added ext/session/sessiondiff.test.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | # 2015-07-31 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # # Tests for the [sqldiff --changeset] command. # # if {![info exists testdir]} { set testdir [file join [file dirname [info script]] .. .. test] } source $testdir/tester.tcl set testprefix sessiondiff set PROG [test_find_sqldiff] db close proc sqlesc {id} { set ret "'[string map {' ''} $id]'" set ret } proc database_cksum {db1} { set txt "" sqlite3 dbtmp $db1 foreach tbl [dbtmp eval {SELECT name FROM sqlite_master WHERE type='table'}] { set cols [list] dbtmp eval "PRAGMA table_info = [sqlesc $tbl]" { lappend cols "quote( $name )" } append txt [dbtmp eval \ "SELECT [join $cols {||'.'||}] FROM [sqlesc $tbl] ORDER BY 1" ] } dbtmp close md5 $txt } proc readfile {filename} { set fd [open $filename] fconfigure $fd -translation binary -encoding binary set data [read $fd] close $fd set data } proc get_changeset {db1 db2} { exec $::PROG --changeset changeset.bin $db1 $db2 set bin [readfile changeset.bin] return $bin } proc xConflict {args} { return "" } proc do_changeset_test {tn sql1 sql2} { forcedelete test.db123 test.db124 sqlite3 db test.db123 db eval $sql1 db close sqlite3 db test.db124 db eval $sql2 set cs [get_changeset test.db124 test.db123] sqlite3changeset_apply db $cs xConflict db close set database_cksum1 [database_cksum test.db123] set database_cksum2 [database_cksum test.db124] uplevel [list \ do_test $tn [list string compare $database_cksum1 $database_cksum2] 0 ] } do_changeset_test 1.0 { CREATE TABLE t1(x PRIMARY KEY); } { CREATE TABLE t1(x PRIMARY KEY); } do_changeset_test 1.1 { CREATE TABLE t1(x PRIMARY KEY); CREATE TABLE t2(x PRIMARY KEY, y); INSERT INTO t2 VALUES(1, 2); } { CREATE TABLE t1(x PRIMARY KEY); CREATE TABLE t2(x PRIMARY KEY, y); INSERT INTO t2 VALUES(3, 4); } do_changeset_test 1.2 { CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c)); INSERT INTO t2 VALUES(1, 2, 3); INSERT INTO t2 VALUES(4, 5, 6); } { CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c)); INSERT INTO t2 VALUES(1, 2, 11); INSERT INTO t2 VALUES(7, 8, 9); } finish_test |
Changes to ext/session/sqlite3session.c.
︙ | ︙ | |||
2832 2833 2834 2835 2836 2837 2838 | return SQLITE_DONE; } sessionDiscardData(&p->in); p->in.iCurrent = p->in.iNext; op = p->in.aData[p->in.iNext++]; | | > | 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 | return SQLITE_DONE; } sessionDiscardData(&p->in); p->in.iCurrent = p->in.iNext; op = p->in.aData[p->in.iNext++]; while( op=='T' || op=='P' ){ p->bPatchset = (op=='P'); if( sessionChangesetReadTblhdr(p) ) return p->rc; if( (p->rc = sessionInputBuffer(&p->in, 2)) ) return p->rc; p->in.iCurrent = p->in.iNext; if( p->in.iNext>=p->in.nData ) return SQLITE_DONE; op = p->in.aData[p->in.iNext++]; } p->op = op; p->bIndirect = p->in.aData[p->in.iNext++]; if( p->op!=SQLITE_UPDATE && p->op!=SQLITE_DELETE && p->op!=SQLITE_INSERT ){ return (p->rc = SQLITE_CORRUPT_BKPT); |
︙ | ︙ |
Changes to tool/sqldiff.c.
︙ | ︙ | |||
1663 1664 1665 1666 1667 1668 1669 | if( g.fDebug & DEBUG_DIFF_SQL ){ printf("SQL for %s:\n%s\n", zId, sql.z); goto end_changeset_one_table; } putc('T', out); putsVarint(out, (sqlite3_uint64)nCol); | | | 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 | if( g.fDebug & DEBUG_DIFF_SQL ){ printf("SQL for %s:\n%s\n", zId, sql.z); goto end_changeset_one_table; } putc('T', out); putsVarint(out, (sqlite3_uint64)nCol); for(i=0; i<nCol; i++) putc(aiFlg[i], out); fwrite(zTab, 1, strlen(zTab), out); putc(0, out); pStmt = db_prepare("%s", sql.z); while( SQLITE_ROW==sqlite3_step(pStmt) ){ int iType = sqlite3_column_int(pStmt,0); putc(iType, out); |
︙ | ︙ |