Index: third_party/sqlite/sqlite-src-3070603/tool/space_used.tcl |
diff --git a/third_party/sqlite/sqlite-src-3070603/tool/space_used.tcl b/third_party/sqlite/sqlite-src-3070603/tool/space_used.tcl |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2044aa38c5ecd6834418340538b182fbfc968c12 |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3070603/tool/space_used.tcl |
@@ -0,0 +1,111 @@ |
+# Run this TCL script using "testfixture" in order get a report that shows |
+# how much disk space is used by a particular data to actually store data |
+# versus how much space is unused. |
+# |
+ |
+# Get the name of the database to analyze |
+# |
+if {[llength $argv]!=1} { |
+ puts stderr "Usage: $argv0 database-name" |
+ exit 1 |
+} |
+set file_to_analyze [lindex $argv 0] |
+ |
+# Open the database |
+# |
+sqlite db [lindex $argv 0] |
+set DB [btree_open [lindex $argv 0]] |
+ |
+# Output the schema for the generated report |
+# |
+puts \ |
+{BEGIN; |
+CREATE TABLE space_used( |
+ name clob, -- Name of a table or index in the database file |
+ is_index boolean, -- TRUE if it is an index, false for a table |
+ payload int, -- Total amount of data stored in this table or index |
+ pri_pages int, -- Number of primary pages used |
+ ovfl_pages int, -- Number of overflow pages used |
+ pri_unused int, -- Number of unused bytes on primary pages |
+ ovfl_unused int -- Number of unused bytes on overflow pages |
+);} |
+ |
+# This query will be used to find the root page number for every index and |
+# table in the database. |
+# |
+set sql { |
+ SELECT name, type, rootpage FROM sqlite_master |
+ UNION ALL |
+ SELECT 'sqlite_master', 'table', 2 |
+ ORDER BY 1 |
+} |
+ |
+# Initialize variables used for summary statistics. |
+# |
+set total_size 0 |
+set total_primary 0 |
+set total_overflow 0 |
+set total_unused_primary 0 |
+set total_unused_ovfl 0 |
+ |
+# Analyze every table in the database, one at a time. |
+# |
+foreach {name type rootpage} [db eval $sql] { |
+ set cursor [btree_cursor $DB $rootpage 0] |
+ set go [btree_first $cursor] |
+ set size 0 |
+ catch {unset pg_used} |
+ set unused_ovfl 0 |
+ set n_overflow 0 |
+ while {$go==0} { |
+ set payload [btree_payload_size $cursor] |
+ incr size $payload |
+ set stat [btree_cursor_dump $cursor] |
+ set pgno [lindex $stat 0] |
+ set freebytes [lindex $stat 4] |
+ set pg_used($pgno) $freebytes |
+ if {$payload>238} { |
+ set n [expr {($payload-238+1019)/1020}] |
+ incr n_overflow $n |
+ incr unused_ovfl [expr {$n*1020+238-$payload}] |
+ } |
+ set go [btree_next $cursor] |
+ } |
+ btree_close_cursor $cursor |
+ set n_primary [llength [array names pg_used]] |
+ set unused_primary 0 |
+ foreach x [array names pg_used] {incr unused_primary $pg_used($x)} |
+ regsub -all ' $name '' name |
+ puts -nonewline "INSERT INTO space_used VALUES('$name'" |
+ puts -nonewline ",[expr {$type=="index"}]" |
+ puts ",$size,$n_primary,$n_overflow,$unused_primary,$unused_ovfl);" |
+ incr total_size $size |
+ incr total_primary $n_primary |
+ incr total_overflow $n_overflow |
+ incr total_unused_primary $unused_primary |
+ incr total_unused_ovfl $unused_ovfl |
+} |
+ |
+# Output summary statistics: |
+# |
+puts "-- Total payload size: $total_size" |
+puts "-- Total pages used: $total_primary primary and $total_overflow overflow" |
+set file_pgcnt [expr {[file size [lindex $argv 0]]/1024}] |
+puts -nonewline "-- Total unused bytes on primary pages: $total_unused_primary" |
+if {$total_primary>0} { |
+ set upp [expr {$total_unused_primary/$total_primary}] |
+ puts " (avg $upp bytes/page)" |
+} else { |
+ puts "" |
+} |
+puts -nonewline "-- Total unused bytes on overflow pages: $total_unused_ovfl" |
+if {$total_overflow>0} { |
+ set upp [expr {$total_unused_ovfl/$total_overflow}] |
+ puts " (avg $upp bytes/page)" |
+} else { |
+ puts "" |
+} |
+set n_free [expr {$file_pgcnt-$total_primary-$total_overflow}] |
+if {$n_free>0} {incr n_free -1} |
+puts "-- Total pages on freelist: $n_free" |
+puts "COMMIT;" |