Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Actually perform index checks when running sqlite3_checker |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | checkindex |
Files: | files | file ages | folders |
SHA3-256: |
54530020260ea9e4cfd021f5ffccb74d |
User & Date: | drh 2017-11-01 01:01:20.360 |
Context
2017-11-01
| ||
01:05 | When sqlite3_checker finds a problem, show the row key as part of the error message, not the row index number. (check-in: 6ffe917d10 user: drh tags: checkindex) | |
01:01 | Actually perform index checks when running sqlite3_checker (check-in: 5453002026 user: drh tags: checkindex) | |
00:10 | Begin putting functionality into the sqlite3_checker binary. (check-in: e82e883b93 user: drh tags: checkindex) | |
Changes
Changes to ext/repair/sqlite3_checker.tcl.
︙ | ︙ | |||
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | } set line {} } else { append line \n } } } # Print a usage message on standard error, then quit. # proc usage {} { set argv0 [file rootname [file tail [info nameofexecutable]]] puts stderr "Usage: $argv0 OPTIONS database-filename" puts stderr { Do sanity checking on a live SQLite3 database file specified by the "database-filename" argument. Options: | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > | | | > > > > > > | > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | } set line {} } else { append line \n } } } # Do an incremental integrity check of a single index # proc check_index {idxname batchsize} { set i 0 set more 1 set nerr 0 puts -nonewline "$idxname: " while {$more} { set more 0 db eval {SELECT errmsg, current_key AS key FROM incremental_index_check($idxname) WHERE after_key=$key LIMIT $batchsize} { set more 1 if {$errmsg!=""} { if {$nerr>0} { puts -nonewline "$idxname: " } incr nerr puts "row $i: $errmsg" } incr i } } if {$nerr==0} { puts "$i entries, ok" } else { puts "$idxname: $nerr errors out of $i entries" } } # Print a usage message on standard error, then quit. # proc usage {} { set argv0 [file rootname [file tail [info nameofexecutable]]] puts stderr "Usage: $argv0 OPTIONS database-filename" puts stderr { Do sanity checking on a live SQLite3 database file specified by the "database-filename" argument. Options: --batchsize N Number of rows to check per transaction --freelist Perform a freelist check --index NAME Run a check of the index NAME --summary Print summary information about the database --table NAME Run a check of all indexes for table NAME --tclsh Run the built-in TCL interpreter (for debugging) --version Show the version number of SQLite } exit 1 } set file_to_analyze {} append argv {} set bFreelistCheck 0 set bSummary 0 set zIndex {} set zTable {} set batchsize 100 set bAll 1 set argc [llength $argv] for {set i 0} {$i<$argc} {incr i} { set arg [lindex $argv $i] if {[regexp {^-+tclsh$} $arg]} { tclsh exit 0 } if {[regexp {^-+version$} $arg]} { sqlite3 mem :memory: puts [mem one {SELECT sqlite_version()||' '||sqlite_source_id()}] mem close exit 0 } if {[regexp {^-+freelist$} $arg]} { set bFreelistCheck 1 set bAll 0 continue } if {[regexp {^-+summary$} $arg]} { set bSummary 1 set bAll 0 continue } if {[regexp {^-+batchsize$} $arg]} { incr i if {$i>=$argc} { puts stderr "missing argument on $arg" exit 1 } set batchsize [lindex $argv $i] continue } if {[regexp {^-+index$} $arg]} { incr i if {$i>=$argc} { puts stderr "missing argument on $arg" exit 1 } set zIndex [lindex $argv $i] set bAll 0 continue } if {[regexp {^-+table$} $arg]} { incr i if {$i>=$argc} { puts stderr "missing argument on $arg" exit 1 } set zTable [lindex $argv $i] set bAll 0 continue } if {[regexp {^-} $arg]} { puts stderr "Unknown option: $arg" usage } if {$file_to_analyze!=""} { |
︙ | ︙ | |||
114 115 116 117 118 119 120 | } if {[catch {sqlite3 db $file_to_analyze} res]} { puts stderr "Cannot open datababase $root_filename: $res" exit 1 } | | | | 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | } if {[catch {sqlite3 db $file_to_analyze} res]} { puts stderr "Cannot open datababase $root_filename: $res" exit 1 } if {$bFreelistCheck || $bAll} { puts -nonewline "freelist-check: " flush stdout puts [db one {SELECT checkfreelist('main')}] } if {$bSummary} { set scale 0 set pgsz [db one {PRAGMA page_size}] db eval {SELECT nPage*$pgsz AS sz, name, tbl_name |
︙ | ︙ | |||
138 139 140 141 142 143 144 145 | set scale 1000.0 set unit KB } } puts [format {%7.1f %s index %s of table %s} \ [expr {$sz/$scale}] $unit $name $tbl_name] } } | > > > > > > > > > > > > > > > > > > | 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 | set scale 1000.0 set unit KB } } puts [format {%7.1f %s index %s of table %s} \ [expr {$sz/$scale}] $unit $name $tbl_name] } } if {$zIndex!=""} { check_index $zIndex $batchsize } if {$zTable!=""} { foreach idx [db eval {SELECT name FROM sqlite_master WHERE type='index' AND rootpage>0 AND tbl_name=$zTable}] { check_index $idx $batchsize } } if {$bAll} { set allidx [db eval {SELECT name FROM sqlite_btreeinfo('main') WHERE type='index' AND rootpage>0 ORDER BY nEntry}] foreach idx $allidx { check_index $idx $batchsize } } |