diff --git a/format/all/all.fqtest b/format/all/all.fqtest index e8113b299..12cfb1280 100644 --- a/format/all/all.fqtest +++ b/format/all/all.fqtest @@ -21,6 +21,7 @@ $ fq -n _registry.groups.probe "pcap", "pcapng", "png", + "sqlite3", "tar", "tiff", "tzif", diff --git a/format/all/all.go b/format/all/all.go index 484230cbf..d7d3f04ed 100644 --- a/format/all/all.go +++ b/format/all/all.go @@ -46,6 +46,7 @@ import ( _ "github.com/wader/fq/format/protobuf" _ "github.com/wader/fq/format/riff" _ "github.com/wader/fq/format/rtmp" + _ "github.com/wader/fq/format/sqlite3" _ "github.com/wader/fq/format/tar" _ "github.com/wader/fq/format/text" _ "github.com/wader/fq/format/tiff" diff --git a/format/format.go b/format/format.go index 219b23b43..eb3375ab1 100644 --- a/format/format.go +++ b/format/format.go @@ -120,6 +120,7 @@ const ( RTMP = "rtmp" SLL_PACKET = "sll_packet" SLL2_PACKET = "sll2_packet" + SQLITE3 = "sqlite3" TAR = "tar" TCP_SEGMENT = "tcp_segment" TIFF = "tiff" diff --git a/format/sqlite3/sqlite3.go b/format/sqlite3/sqlite3.go new file mode 100644 index 000000000..99b95e1f2 --- /dev/null +++ b/format/sqlite3/sqlite3.go @@ -0,0 +1,439 @@ +package sqlite3 + +// https://www.sqlite.org/fileformat.html +// https://sqlite.org/src/file?name=src/btreeInt.h&ci=trunk +// https://sqlite.org/schematab.html +// showdb from sqlite tools is also very helpful +// Note that sqlite count pages start at 1 which is at byte 0 to pagesize-1 + +// . as $r | sqlite3_schema.message.sql | [capture("\\((?.*)\\)").s | split(", ")[] | split(" ")[0] | ascii_downcase] as $c | $r | torepr.message[0] as $m | [$c,$m] | transpose | map({key: .[0], value: .[1]}) | from_entries +// fqlite: +// go run fq.go --arg name "R.E.M." 'torepr as $db | first($db.Artist[] | select(.[1]==$name)) as $artist | $db.Album[] | select(.[2] == $artist[0]) | .[1] | tovalue' format/sqlite3/testdata/chinook.db + +// TODO: dont sort array or need "external" decode values? +// TODO: lower case? +// TODO: tovalue? +// TODO: split out cell decode? deep now +// TODO: dummy 0 page to get page 0 at [1] to follow sqlite documentation +// TODO: array/struct external to get sorting correct? +// TODO: overflow pages, two pass? +// TODO: format version +// TODO: table/column names +// TODO: assert version and schema version? +// TODO: ptrmap +// TDOO: wal/journal files? combine? +// TODO: header.unused_space + +// > A table with the name "sqlite_sequence" that is used to keep track of the maximum historical INTEGER PRIMARY KEY for a table using AUTOINCREMENT. +// CREATE TABLE sqlite_sequence(name,seq); +// > Tables with names of the form "sqlite_statN" where N is an integer. Such tables store database statistics gathered by the ANALYZE command and used by the query planner to help determine the best algorithm to use for each query. +// CREATE TABLE sqlite_stat1(tbl,idx,stat); +// Only if compiled with SQLITE_ENABLE_STAT2: +// CREATE TABLE sqlite_stat2(tbl,idx,sampleno,sample); +// Only if compiled with SQLITE_ENABLE_STAT3: +// CREATE TABLE sqlite_stat3(tbl,idx,nEq,nLt,nDLt,sample); +// Only if compiled with SQLITE_ENABLE_STAT4: +// CREATE TABLE sqlite_stat4(tbl,idx,nEq,nLt,nDLt,sample); +// TODO: sqlite_autoindex_TABLE_N index + +import ( + "bytes" + "embed" + + "github.com/wader/fq/format" + "github.com/wader/fq/format/registry" + "github.com/wader/fq/internal/mathextra" + "github.com/wader/fq/pkg/bitio" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +//go:embed *.jq +var sqlite3FS embed.FS + +func init() { + registry.MustRegister(decode.Format{ + Name: format.SQLITE3, + Description: "SQLite v3 database", + Groups: []string{format.PROBE}, + DecodeFn: sqlite3Decode, + Functions: []string{"torepr"}, + Files: sqlite3FS, + }) +} + +const sqlite3HeaderSize = 100 + +const ( + serialTypeNULL = 0 + serialTypeS8 = 1 + serialTypeSBE16 = 2 + serialTypeSBE24 = 3 + serialTypeSBE32 = 4 + serialTypeSBE48 = 5 + serialTypeSBE64 = 6 + serialTypeFloatBE64 = 7 + serialTypeInteger0 = 8 + serialTypeInteger1 = 9 + serialTypeInternal10 = 10 + serialTypeInternal11 = 11 +) + +var serialTypeMap = scalar.SToSymStr{ + serialTypeNULL: "null", + serialTypeS8: "int8", + serialTypeSBE16: "int16", + serialTypeSBE24: "int24", + serialTypeSBE32: "int32", + serialTypeSBE48: "int48", + serialTypeSBE64: "int64", + serialTypeFloatBE64: "float64", + serialTypeInteger0: "zero", + serialTypeInteger1: "one", + serialTypeInternal10: "internal10", + serialTypeInternal11: "internal11", +} + +var serialTypeMapper = scalar.Fn(func(s scalar.S) (scalar.S, error) { + typ := s.ActualS() + if st, ok := serialTypeMap[typ]; ok { + s.Description = st + } else if typ >= 12 && typ%2 == 0 { + s.Description = "blob" + } else if typ >= 13 && typ%2 != 0 { + s.Description = "text" + } + return s, nil +}) + +const ( + pageTypePtrmap = 0x00 + pageTypeBTreeIndexInterior = 0x02 + pageTypeBTreeTableInterior = 0x05 + pageTypeBTreeIndexLeaf = 0x0a + pageTypeBTreeTableLeaf = 0x0d +) + +var pageTypeMap = scalar.UToSymStr{ + // pageTypePtrmap: "ptrmap", + pageTypeBTreeIndexInterior: "index_interior", + pageTypeBTreeTableInterior: "table_interior", + pageTypeBTreeIndexLeaf: "index_leaf", + pageTypeBTreeTableLeaf: "table_leaf", +} + +var ptrmapTypeMap = scalar.UToSymStr{ + 1: "rootpage", + 2: "freepage", + 3: "overflow1", + 4: "overflow2", + 5: "btree", +} + +const ( + textEncodingUTF8 = 1 + textEncodingUTF16LE = 2 + textEncodingUTF16BE = 3 +) + +var textEncodingMap = scalar.UToSymStr{ + textEncodingUTF8: "utf8", + textEncodingUTF16LE: "utf16le", + textEncodingUTF16BE: "utf16be", +} + +var versionMap = scalar.UToSymStr{ + 1: "legacy", + 2: "wal", +} + +type sqlite3Header struct { + pageSize int64 + databaseSizePages int + textEncoding int +} + +// TODO: all bits if nine bytes? +// TODO: two complement on bit read count +func varintDecode(d *decode.D) int64 { + var n uint64 + for i := 0; i < 9; i++ { + v := d.U8() + n = n<<7 | v&0b0111_1111 + if v&0b1000_0000 == 0 { + break + } + } + return mathextra.TwosComplement(64, n) +} + +func sqlite3DecodeSerialType(d *decode.D, h sqlite3Header, typ int64) { + switch typ { + case serialTypeNULL: + d.FieldValueNil("value") + case serialTypeS8: + d.FieldS8("value") + case serialTypeSBE16: + d.FieldS16("value") + case serialTypeSBE24: + d.FieldS24("value") + case serialTypeSBE32: + d.FieldS32("value") + case serialTypeSBE48: + d.FieldS48("value") + case serialTypeSBE64: + d.FieldS64("value") + case serialTypeFloatBE64: + d.FieldF64("value") + case serialTypeInteger0: + d.FieldValueU("value", 0) + case serialTypeInteger1: + d.FieldValueU("value", 1) + case 10, 11: + // internal, should not appear in wellformed file + default: + if typ%2 == 0 { + // N => 12 and even: (N-12)/2 bytes blob. + d.FieldRawLen("value", (typ-12)/2*8) + } else { + // N => 13 and odd: (N-13)/2 bytes text + l := int(typ-13) / 2 + switch h.textEncoding { + case textEncodingUTF8: + d.FieldUTF8("value", l) + case textEncodingUTF16LE: + d.FieldUTF16LE("value", l) + case textEncodingUTF16BE: + d.FieldUTF16BE("value", l) + } + } + } +} + +func sqlite3DecodeCellFreeblock(d *decode.D) uint64 { + nextOffset := d.FieldU16("next_offset") + if nextOffset == 0 { + return 0 + } + // TODO: "header" is size bytes or offset+size? seems to be just size + // "size of the freeblock in bytes, including the 4-byte header" + size := d.FieldU16("size") + // TODO: really? + if size == 0 { + return 0 + } + d.FieldRawLen("space", int64(size-4)*8) + return nextOffset +} + +func sqlite3CellPayloadDecode(d *decode.D, h sqlite3Header) { + lengthStart := d.Pos() + length := d.FieldSFn("length", varintDecode) + lengthBits := d.Pos() - lengthStart + var serialTypes []int64 + d.FramedFn((length)*8-lengthBits, func(d *decode.D) { + d.FieldArray("serials", func(d *decode.D) { + for !d.End() { + serialTypes = append( + serialTypes, + d.FieldSFn("serial", varintDecode, serialTypeMapper), + ) + } + }) + }) + d.FieldArray("contents", func(d *decode.D) { + for _, s := range serialTypes { + sqlite3DecodeSerialType(d, h, s) + } + }) +} + +func sqlite3DecodeTreePage(d *decode.D, h sqlite3Header, x int64, payLoadLen int64) { + // formulas from sqlite format spec + u := h.pageSize + p := payLoadLen + m := ((u - 12) * 32 / 255) - 23 + k := m + ((p - m) % (u - 4)) + + var firstPayLoadLen int64 + if k <= x { + firstPayLoadLen = k + } else { + firstPayLoadLen = m + } + + if p <= x { + // payload fits in page + d.FramedFn(firstPayLoadLen*8, func(d *decode.D) { + d.FieldStruct("payload", func(d *decode.D) { sqlite3CellPayloadDecode(d, h) }) + }) + } else { + // payload overflows, collect payload parts + payLoadBB := &bytes.Buffer{} + + d.FieldArray("overflow_pages", func(d *decode.D) { + var nextPage int64 + d.FieldStruct("overflow_page", func(d *decode.D) { + br := d.FieldRawLen("data", firstPayLoadLen*8) + nextPage = d.FieldS32("next_page") + d.MustCopyBits(payLoadBB, br) + }) + + payLoadLenLeft := payLoadLen - firstPayLoadLen + for nextPage != 0 { + d.SeekAbs(((nextPage - 1) * h.pageSize) * 8) + d.FieldStruct("overflow_page", func(d *decode.D) { + nextPage = d.FieldS32("next_page") + overflowSize := mathextra.MinInt64(h.pageSize-4, payLoadLenLeft) + br := d.FieldRawLen("data", overflowSize*8) + payLoadLenLeft -= overflowSize + d.MustCopyBits(payLoadBB, br) + }) + } + }) + + d.FieldStructRootBitBufFn("payload", + bitio.NewBitReader(payLoadBB.Bytes(), -1), + func(d *decode.D) { sqlite3CellPayloadDecode(d, h) }, + ) + } +} + +func sqlite3Decode(d *decode.D, in interface{}) interface{} { + var h sqlite3Header + + d.FieldStruct("header", func(d *decode.D) { + d.FieldUTF8("magic", 16, d.AssertStr("SQLite format 3\x00")) + pageSizeS := d.FieldScalarU16("page_size", scalar.UToSymU{1: 65536}) // in bytes. Must be a power of two between 512 and 32768 inclusive, or the value 1 representing a page size of 65536. + d.FieldU8("write_version", versionMap) // 1 for legacy; 2 for WAL. + d.FieldU8("read_version", versionMap) // . 1 for legacy; 2 for WAL. + d.FieldU8("unused_space") // at the end of each page. Usually 0. + d.FieldU8("maximum_embedded_payload_fraction") // . Must be 64. + d.FieldU8("minimum_embedded_payload_fraction") // . Must be 32. + d.FieldU8("leaf_payload_fraction") // . Must be 32. + d.FieldU32("file_change_counter") // + databaseSizePages := int(d.FieldU32("database_size_pages")) // . The "in-header database size". + d.FieldU32("page_number_freelist") // of the first freelist trunk page. + d.FieldU32("total_number_freelist") // pages. + d.FieldU32("schema_cookie") // . + d.FieldU32("schema_format_number") // . Supported schema formats are 1, 2, 3, and 4. + d.FieldU32("default_page_cache_size") // . + d.FieldU32("page_number_largest_root_btree") // page when in auto-vacuum or incremental-vacuum modes, or zero otherwise. + textEncoding := int(d.FieldU32("text_encoding", textEncodingMap)) + d.FieldU32("user_version") // " as read and set by the user_version pragma. + d.FieldU32("incremental_vacuum_mode") // False (zero) otherwise. + d.FieldU32("application_id") // " set by PRAGMA application_id. + d.FieldRawLen("reserved", 160, d.BitBufIsZero()) // for expansion. Must be zero. + d.FieldU32("version_valid_for") // number. + d.FieldU32("sqlite_version_number") // + + // TODO: nicer API for fallback? + pageSize := int64(pageSizeS.ActualU()) + if pageSizeS.Sym != nil { + pageSize = int64(pageSizeS.SymU()) + } + + h = sqlite3Header{ + pageSize: pageSize, + databaseSizePages: databaseSizePages, + textEncoding: textEncoding, + } + }) + + d.FieldArray("pages", func(d *decode.D) { + d.RangeSorted = false + + // add a filler entry to make real pages start at index 1 + d.FieldStruct("page", func(d *decode.D) { + d.FieldValueStr("type", "page0_index_fill") + }) + + for i := 0; i < h.databaseSizePages; i++ { + pageOffset := h.pageSize * int64(i) + d.SeekAbs(pageOffset * 8) + // skip header for first page + if i == 0 { + d.SeekRel(sqlite3HeaderSize * 8) + } + + d.FieldStruct("page", func(d *decode.D) { + typ := d.FieldU8("type", pageTypeMap) + switch typ { + // case pageTypePtrmap: + // TODO: how to know if just a overflow page? + // log.Printf("ptrmap i: %#+v\n", i) + // d.FieldArray("entries", func(d *decode.D) { + // for j := int64(0); j < h.pageSize/5; j++ { + // d.FieldStruct("entry", func(d *decode.D) { + // d.FieldU8("type", ptrmapTypeMap) + // d.FieldU32("page_number") + // }) + // } + // }) + default: + d.FieldRawLen("data", (h.pageSize-4)*8) + + case pageTypeBTreeIndexInterior, + pageTypeBTreeIndexLeaf, + pageTypeBTreeTableInterior, + pageTypeBTreeTableLeaf: + + startFreeblocks := d.FieldU16("start_freeblocks") // The two-byte integer at offset 1 gives the start of the first freeblock on the page, or is zero if there are no freeblocks. + pageCells := d.FieldU16("page_cells") // The two-byte integer at offset 3 gives the number of cells on the page. + d.FieldU16("cell_start") // sThe two-byte integer at offset 5 designates the start of the cell content area. A zero value for this integer is interpreted as 65536. + d.FieldU8("cell_fragments") // The one-byte integer at offset 7 gives the number of fragmented free bytes within the cell content area. + + switch typ { + case pageTypeBTreeIndexInterior, + pageTypeBTreeTableInterior: + d.FieldU32("right_pointer") // The four-byte page number at offset 8 is the right-most pointer. This value appears in the header of interior b-tree pages only and is omitted from all other pages. + } + var cellPointers []uint64 + d.FieldArray("cells_pointers", func(d *decode.D) { + for j := uint64(0); j < pageCells; j++ { + cellPointers = append(cellPointers, d.FieldU16("pointer")) + } + }) + if startFreeblocks != 0 { + d.FieldArray("freeblocks", func(d *decode.D) { + nextOffset := startFreeblocks + for nextOffset != 0 { + d.SeekAbs((pageOffset + int64(nextOffset)) * 8) + d.FieldStruct("freeblock", func(d *decode.D) { + nextOffset = sqlite3DecodeCellFreeblock(d) + }) + } + }) + } + d.FieldArray("cells", func(d *decode.D) { + for _, p := range cellPointers { + d.FieldStruct("cell", func(d *decode.D) { + // TODO: SeekAbs with fn later? + d.SeekAbs((pageOffset + int64(p)) * 8) + switch typ { + case pageTypeBTreeIndexInterior: + d.FieldU32("left_child") + payLoadLen := d.FieldSFn("payload_len", varintDecode) + // formula for x from sqlite format spec + sqlite3DecodeTreePage(d, h, ((h.pageSize-12)*64/255)-23, payLoadLen) + case pageTypeBTreeTableInterior: + d.FieldU32("left_child") + d.FieldSFn("rowid", varintDecode) + case pageTypeBTreeIndexLeaf: + payLoadLen := d.FieldSFn("payload_len", varintDecode) + sqlite3DecodeTreePage(d, h, ((h.pageSize-12)*64/255)-23, payLoadLen) + case pageTypeBTreeTableLeaf: + payLoadLen := d.FieldSFn("payload_len", varintDecode) + d.FieldSFn("rowid", varintDecode) + sqlite3DecodeTreePage(d, h, h.pageSize-35, payLoadLen) + } + }) + } + }) + } + }) + } + }) + + return nil +} diff --git a/format/sqlite3/sqlite3.jq b/format/sqlite3/sqlite3.jq new file mode 100644 index 000000000..d7a9ebcba --- /dev/null +++ b/format/sqlite3/sqlite3.jq @@ -0,0 +1,53 @@ +def sqlite3_btree_walk($page): + ( . as $root + | ( def _t: + if .type == "table_interior" or .type == "index_interior" then + ($root.pages[.cells[].left_child, .right_pointer] | _t) + elif .type == "table_leaf" or .type == "index_leaf" then + .cells[] + else + error("unknown page type \(.type)") + end; + ($page | _t) + ) + ); + +# CREATE TABLE sqlite_schema( +# type text, +# name text, +# tbl_name text, +# rootpage integer, +# sql text +# ); +def sqlite3_schema: + ( [ sqlite3_btree_walk(.pages[1]) + | .payload.contents as [$type, $name, $tbl_name, $rootpage, $sql] + | { key: $name, + value: {$type, $name, $tbl_name, $rootpage, $sql} + } + ] + | from_entries + ); + +def sqlite3_rows($name): + ( sqlite3_schema[$name] as $s + | if $s == null then error("could not find name") end + | sqlite3_btree_walk(.pages[$s.rootpage]) + | . as {rowid: $rowid, payload: {$contents}} + | $contents + | tovalue + | if .[0] == null then .[0] = $rowid end + ); + +def _sqlite3_torepr: + ( . as $root + | sqlite3_schema + | map( + ( select(.type == "table") as $t + | { key: $t.name, + value: [$root | sqlite3_rows($t.name)] + } + ) + ) + | from_entries + ); diff --git a/format/sqlite3/testdata/Makefile b/format/sqlite3/testdata/Makefile new file mode 100644 index 000000000..0f6bf225d --- /dev/null +++ b/format/sqlite3/testdata/Makefile @@ -0,0 +1,7 @@ +all: $(foreach f,$(wildcard *.sql), $(f).db $(f).fqtest) +clean: + rm -f *.db *.fqtest +%.sql.db: %.sql + cat $< | sqlite3 $@ +%.sql.fqtest: %.sql.db + echo "$$ fq 'dv, torepr' $<" > $@ diff --git a/format/sqlite3/testdata/many_rows.sql b/format/sqlite3/testdata/many_rows.sql new file mode 100644 index 000000000..be339ca3a --- /dev/null +++ b/format/sqlite3/testdata/many_rows.sql @@ -0,0 +1,517 @@ +CREATE TABLE many_rows ( + id INT PRIMARY KEY, + n INT +); + +INSERT INTO many_rows VALUES(1, 1); +INSERT INTO many_rows VALUES(2, 2); +INSERT INTO many_rows VALUES(3, 3); +INSERT INTO many_rows VALUES(4, 4); +INSERT INTO many_rows VALUES(5, 5); +INSERT INTO many_rows VALUES(6, 6); +INSERT INTO many_rows VALUES(7, 7); +INSERT INTO many_rows VALUES(8, 8); +INSERT INTO many_rows VALUES(9, 9); +INSERT INTO many_rows VALUES(10, 10); +INSERT INTO many_rows VALUES(11, 11); +INSERT INTO many_rows VALUES(12, 12); +INSERT INTO many_rows VALUES(13, 13); +INSERT INTO many_rows VALUES(14, 14); +INSERT INTO many_rows VALUES(15, 15); +INSERT INTO many_rows VALUES(16, 16); +INSERT INTO many_rows VALUES(17, 17); +INSERT INTO many_rows VALUES(18, 18); +INSERT INTO many_rows VALUES(19, 19); +INSERT INTO many_rows VALUES(20, 20); +INSERT INTO many_rows VALUES(21, 21); +INSERT INTO many_rows VALUES(22, 22); +INSERT INTO many_rows VALUES(23, 23); +INSERT INTO many_rows VALUES(24, 24); +INSERT INTO many_rows VALUES(25, 25); +INSERT INTO many_rows VALUES(26, 26); +INSERT INTO many_rows VALUES(27, 27); +INSERT INTO many_rows VALUES(28, 28); +INSERT INTO many_rows VALUES(29, 29); +INSERT INTO many_rows VALUES(30, 30); +INSERT INTO many_rows VALUES(31, 31); +INSERT INTO many_rows VALUES(32, 32); +INSERT INTO many_rows VALUES(33, 33); +INSERT INTO many_rows VALUES(34, 34); +INSERT INTO many_rows VALUES(35, 35); +INSERT INTO many_rows VALUES(36, 36); +INSERT INTO many_rows VALUES(37, 37); +INSERT INTO many_rows VALUES(38, 38); +INSERT INTO many_rows VALUES(39, 39); +INSERT INTO many_rows VALUES(40, 40); +INSERT INTO many_rows VALUES(41, 41); +INSERT INTO many_rows VALUES(42, 42); +INSERT INTO many_rows VALUES(43, 43); +INSERT INTO many_rows VALUES(44, 44); +INSERT INTO many_rows VALUES(45, 45); +INSERT INTO many_rows VALUES(46, 46); +INSERT INTO many_rows VALUES(47, 47); +INSERT INTO many_rows VALUES(48, 48); +INSERT INTO many_rows VALUES(49, 49); +INSERT INTO many_rows VALUES(50, 50); +INSERT INTO many_rows VALUES(51, 51); +INSERT INTO many_rows VALUES(52, 52); +INSERT INTO many_rows VALUES(53, 53); +INSERT INTO many_rows VALUES(54, 54); +INSERT INTO many_rows VALUES(55, 55); +INSERT INTO many_rows VALUES(56, 56); +INSERT INTO many_rows VALUES(57, 57); +INSERT INTO many_rows VALUES(58, 58); +INSERT INTO many_rows VALUES(59, 59); +INSERT INTO many_rows VALUES(60, 60); +INSERT INTO many_rows VALUES(61, 61); +INSERT INTO many_rows VALUES(62, 62); +INSERT INTO many_rows VALUES(63, 63); +INSERT INTO many_rows VALUES(64, 64); +INSERT INTO many_rows VALUES(65, 65); +INSERT INTO many_rows VALUES(66, 66); +INSERT INTO many_rows VALUES(67, 67); +INSERT INTO many_rows VALUES(68, 68); +INSERT INTO many_rows VALUES(69, 69); +INSERT INTO many_rows VALUES(70, 70); +INSERT INTO many_rows VALUES(71, 71); +INSERT INTO many_rows VALUES(72, 72); +INSERT INTO many_rows VALUES(73, 73); +INSERT INTO many_rows VALUES(74, 74); +INSERT INTO many_rows VALUES(75, 75); +INSERT INTO many_rows VALUES(76, 76); +INSERT INTO many_rows VALUES(77, 77); +INSERT INTO many_rows VALUES(78, 78); +INSERT INTO many_rows VALUES(79, 79); +INSERT INTO many_rows VALUES(80, 80); +INSERT INTO many_rows VALUES(81, 81); +INSERT INTO many_rows VALUES(82, 82); +INSERT INTO many_rows VALUES(83, 83); +INSERT INTO many_rows VALUES(84, 84); +INSERT INTO many_rows VALUES(85, 85); +INSERT INTO many_rows VALUES(86, 86); +INSERT INTO many_rows VALUES(87, 87); +INSERT INTO many_rows VALUES(88, 88); +INSERT INTO many_rows VALUES(89, 89); +INSERT INTO many_rows VALUES(90, 90); +INSERT INTO many_rows VALUES(91, 91); +INSERT INTO many_rows VALUES(92, 92); +INSERT INTO many_rows VALUES(93, 93); +INSERT INTO many_rows VALUES(94, 94); +INSERT INTO many_rows VALUES(95, 95); +INSERT INTO many_rows VALUES(96, 96); +INSERT INTO many_rows VALUES(97, 97); +INSERT INTO many_rows VALUES(98, 98); +INSERT INTO many_rows VALUES(99, 99); +INSERT INTO many_rows VALUES(100, 100); +INSERT INTO many_rows VALUES(101, 101); +INSERT INTO many_rows VALUES(102, 102); +INSERT INTO many_rows VALUES(103, 103); +INSERT INTO many_rows VALUES(104, 104); +INSERT INTO many_rows VALUES(105, 105); +INSERT INTO many_rows VALUES(106, 106); +INSERT INTO many_rows VALUES(107, 107); +INSERT INTO many_rows VALUES(108, 108); +INSERT INTO many_rows VALUES(109, 109); +INSERT INTO many_rows VALUES(110, 110); +INSERT INTO many_rows VALUES(111, 111); +INSERT INTO many_rows VALUES(112, 112); +INSERT INTO many_rows VALUES(113, 113); +INSERT INTO many_rows VALUES(114, 114); +INSERT INTO many_rows VALUES(115, 115); +INSERT INTO many_rows VALUES(116, 116); +INSERT INTO many_rows VALUES(117, 117); +INSERT INTO many_rows VALUES(118, 118); +INSERT INTO many_rows VALUES(119, 119); +INSERT INTO many_rows VALUES(120, 120); +INSERT INTO many_rows VALUES(121, 121); +INSERT INTO many_rows VALUES(122, 122); +INSERT INTO many_rows VALUES(123, 123); +INSERT INTO many_rows VALUES(124, 124); +INSERT INTO many_rows VALUES(125, 125); +INSERT INTO many_rows VALUES(126, 126); +INSERT INTO many_rows VALUES(127, 127); +INSERT INTO many_rows VALUES(128, 128); +INSERT INTO many_rows VALUES(129, 129); +INSERT INTO many_rows VALUES(130, 130); +INSERT INTO many_rows VALUES(131, 131); +INSERT INTO many_rows VALUES(132, 132); +INSERT INTO many_rows VALUES(133, 133); +INSERT INTO many_rows VALUES(134, 134); +INSERT INTO many_rows VALUES(135, 135); +INSERT INTO many_rows VALUES(136, 136); +INSERT INTO many_rows VALUES(137, 137); +INSERT INTO many_rows VALUES(138, 138); +INSERT INTO many_rows VALUES(139, 139); +INSERT INTO many_rows VALUES(140, 140); +INSERT INTO many_rows VALUES(141, 141); +INSERT INTO many_rows VALUES(142, 142); +INSERT INTO many_rows VALUES(143, 143); +INSERT INTO many_rows VALUES(144, 144); +INSERT INTO many_rows VALUES(145, 145); +INSERT INTO many_rows VALUES(146, 146); +INSERT INTO many_rows VALUES(147, 147); +INSERT INTO many_rows VALUES(148, 148); +INSERT INTO many_rows VALUES(149, 149); +INSERT INTO many_rows VALUES(150, 150); +INSERT INTO many_rows VALUES(151, 151); +INSERT INTO many_rows VALUES(152, 152); +INSERT INTO many_rows VALUES(153, 153); +INSERT INTO many_rows VALUES(154, 154); +INSERT INTO many_rows VALUES(155, 155); +INSERT INTO many_rows VALUES(156, 156); +INSERT INTO many_rows VALUES(157, 157); +INSERT INTO many_rows VALUES(158, 158); +INSERT INTO many_rows VALUES(159, 159); +INSERT INTO many_rows VALUES(160, 160); +INSERT INTO many_rows VALUES(161, 161); +INSERT INTO many_rows VALUES(162, 162); +INSERT INTO many_rows VALUES(163, 163); +INSERT INTO many_rows VALUES(164, 164); +INSERT INTO many_rows VALUES(165, 165); +INSERT INTO many_rows VALUES(166, 166); +INSERT INTO many_rows VALUES(167, 167); +INSERT INTO many_rows VALUES(168, 168); +INSERT INTO many_rows VALUES(169, 169); +INSERT INTO many_rows VALUES(170, 170); +INSERT INTO many_rows VALUES(171, 171); +INSERT INTO many_rows VALUES(172, 172); +INSERT INTO many_rows VALUES(173, 173); +INSERT INTO many_rows VALUES(174, 174); +INSERT INTO many_rows VALUES(175, 175); +INSERT INTO many_rows VALUES(176, 176); +INSERT INTO many_rows VALUES(177, 177); +INSERT INTO many_rows VALUES(178, 178); +INSERT INTO many_rows VALUES(179, 179); +INSERT INTO many_rows VALUES(180, 180); +INSERT INTO many_rows VALUES(181, 181); +INSERT INTO many_rows VALUES(182, 182); +INSERT INTO many_rows VALUES(183, 183); +INSERT INTO many_rows VALUES(184, 184); +INSERT INTO many_rows VALUES(185, 185); +INSERT INTO many_rows VALUES(186, 186); +INSERT INTO many_rows VALUES(187, 187); +INSERT INTO many_rows VALUES(188, 188); +INSERT INTO many_rows VALUES(189, 189); +INSERT INTO many_rows VALUES(190, 190); +INSERT INTO many_rows VALUES(191, 191); +INSERT INTO many_rows VALUES(192, 192); +INSERT INTO many_rows VALUES(193, 193); +INSERT INTO many_rows VALUES(194, 194); +INSERT INTO many_rows VALUES(195, 195); +INSERT INTO many_rows VALUES(196, 196); +INSERT INTO many_rows VALUES(197, 197); +INSERT INTO many_rows VALUES(198, 198); +INSERT INTO many_rows VALUES(199, 199); +INSERT INTO many_rows VALUES(200, 200); +INSERT INTO many_rows VALUES(201, 201); +INSERT INTO many_rows VALUES(202, 202); +INSERT INTO many_rows VALUES(203, 203); +INSERT INTO many_rows VALUES(204, 204); +INSERT INTO many_rows VALUES(205, 205); +INSERT INTO many_rows VALUES(206, 206); +INSERT INTO many_rows VALUES(207, 207); +INSERT INTO many_rows VALUES(208, 208); +INSERT INTO many_rows VALUES(209, 209); +INSERT INTO many_rows VALUES(210, 210); +INSERT INTO many_rows VALUES(211, 211); +INSERT INTO many_rows VALUES(212, 212); +INSERT INTO many_rows VALUES(213, 213); +INSERT INTO many_rows VALUES(214, 214); +INSERT INTO many_rows VALUES(215, 215); +INSERT INTO many_rows VALUES(216, 216); +INSERT INTO many_rows VALUES(217, 217); +INSERT INTO many_rows VALUES(218, 218); +INSERT INTO many_rows VALUES(219, 219); +INSERT INTO many_rows VALUES(220, 220); +INSERT INTO many_rows VALUES(221, 221); +INSERT INTO many_rows VALUES(222, 222); +INSERT INTO many_rows VALUES(223, 223); +INSERT INTO many_rows VALUES(224, 224); +INSERT INTO many_rows VALUES(225, 225); +INSERT INTO many_rows VALUES(226, 226); +INSERT INTO many_rows VALUES(227, 227); +INSERT INTO many_rows VALUES(228, 228); +INSERT INTO many_rows VALUES(229, 229); +INSERT INTO many_rows VALUES(230, 230); +INSERT INTO many_rows VALUES(231, 231); +INSERT INTO many_rows VALUES(232, 232); +INSERT INTO many_rows VALUES(233, 233); +INSERT INTO many_rows VALUES(234, 234); +INSERT INTO many_rows VALUES(235, 235); +INSERT INTO many_rows VALUES(236, 236); +INSERT INTO many_rows VALUES(237, 237); +INSERT INTO many_rows VALUES(238, 238); +INSERT INTO many_rows VALUES(239, 239); +INSERT INTO many_rows VALUES(240, 240); +INSERT INTO many_rows VALUES(241, 241); +INSERT INTO many_rows VALUES(242, 242); +INSERT INTO many_rows VALUES(243, 243); +INSERT INTO many_rows VALUES(244, 244); +INSERT INTO many_rows VALUES(245, 245); +INSERT INTO many_rows VALUES(246, 246); +INSERT INTO many_rows VALUES(247, 247); +INSERT INTO many_rows VALUES(248, 248); +INSERT INTO many_rows VALUES(249, 249); +INSERT INTO many_rows VALUES(250, 250); +INSERT INTO many_rows VALUES(251, 251); +INSERT INTO many_rows VALUES(252, 252); +INSERT INTO many_rows VALUES(253, 253); +INSERT INTO many_rows VALUES(254, 254); +INSERT INTO many_rows VALUES(255, 255); +INSERT INTO many_rows VALUES(256, 256); +INSERT INTO many_rows VALUES(257, 257); +INSERT INTO many_rows VALUES(258, 258); +INSERT INTO many_rows VALUES(259, 259); +INSERT INTO many_rows VALUES(260, 260); +INSERT INTO many_rows VALUES(261, 261); +INSERT INTO many_rows VALUES(262, 262); +INSERT INTO many_rows VALUES(263, 263); +INSERT INTO many_rows VALUES(264, 264); +INSERT INTO many_rows VALUES(265, 265); +INSERT INTO many_rows VALUES(266, 266); +INSERT INTO many_rows VALUES(267, 267); +INSERT INTO many_rows VALUES(268, 268); +INSERT INTO many_rows VALUES(269, 269); +INSERT INTO many_rows VALUES(270, 270); +INSERT INTO many_rows VALUES(271, 271); +INSERT INTO many_rows VALUES(272, 272); +INSERT INTO many_rows VALUES(273, 273); +INSERT INTO many_rows VALUES(274, 274); +INSERT INTO many_rows VALUES(275, 275); +INSERT INTO many_rows VALUES(276, 276); +INSERT INTO many_rows VALUES(277, 277); +INSERT INTO many_rows VALUES(278, 278); +INSERT INTO many_rows VALUES(279, 279); +INSERT INTO many_rows VALUES(280, 280); +INSERT INTO many_rows VALUES(281, 281); +INSERT INTO many_rows VALUES(282, 282); +INSERT INTO many_rows VALUES(283, 283); +INSERT INTO many_rows VALUES(284, 284); +INSERT INTO many_rows VALUES(285, 285); +INSERT INTO many_rows VALUES(286, 286); +INSERT INTO many_rows VALUES(287, 287); +INSERT INTO many_rows VALUES(288, 288); +INSERT INTO many_rows VALUES(289, 289); +INSERT INTO many_rows VALUES(290, 290); +INSERT INTO many_rows VALUES(291, 291); +INSERT INTO many_rows VALUES(292, 292); +INSERT INTO many_rows VALUES(293, 293); +INSERT INTO many_rows VALUES(294, 294); +INSERT INTO many_rows VALUES(295, 295); +INSERT INTO many_rows VALUES(296, 296); +INSERT INTO many_rows VALUES(297, 297); +INSERT INTO many_rows VALUES(298, 298); +INSERT INTO many_rows VALUES(299, 299); +INSERT INTO many_rows VALUES(300, 300); +INSERT INTO many_rows VALUES(301, 301); +INSERT INTO many_rows VALUES(302, 302); +INSERT INTO many_rows VALUES(303, 303); +INSERT INTO many_rows VALUES(304, 304); +INSERT INTO many_rows VALUES(305, 305); +INSERT INTO many_rows VALUES(306, 306); +INSERT INTO many_rows VALUES(307, 307); +INSERT INTO many_rows VALUES(308, 308); +INSERT INTO many_rows VALUES(309, 309); +INSERT INTO many_rows VALUES(310, 310); +INSERT INTO many_rows VALUES(311, 311); +INSERT INTO many_rows VALUES(312, 312); +INSERT INTO many_rows VALUES(313, 313); +INSERT INTO many_rows VALUES(314, 314); +INSERT INTO many_rows VALUES(315, 315); +INSERT INTO many_rows VALUES(316, 316); +INSERT INTO many_rows VALUES(317, 317); +INSERT INTO many_rows VALUES(318, 318); +INSERT INTO many_rows VALUES(319, 319); +INSERT INTO many_rows VALUES(320, 320); +INSERT INTO many_rows VALUES(321, 321); +INSERT INTO many_rows VALUES(322, 322); +INSERT INTO many_rows VALUES(323, 323); +INSERT INTO many_rows VALUES(324, 324); +INSERT INTO many_rows VALUES(325, 325); +INSERT INTO many_rows VALUES(326, 326); +INSERT INTO many_rows VALUES(327, 327); +INSERT INTO many_rows VALUES(328, 328); +INSERT INTO many_rows VALUES(329, 329); +INSERT INTO many_rows VALUES(330, 330); +INSERT INTO many_rows VALUES(331, 331); +INSERT INTO many_rows VALUES(332, 332); +INSERT INTO many_rows VALUES(333, 333); +INSERT INTO many_rows VALUES(334, 334); +INSERT INTO many_rows VALUES(335, 335); +INSERT INTO many_rows VALUES(336, 336); +INSERT INTO many_rows VALUES(337, 337); +INSERT INTO many_rows VALUES(338, 338); +INSERT INTO many_rows VALUES(339, 339); +INSERT INTO many_rows VALUES(340, 340); +INSERT INTO many_rows VALUES(341, 341); +INSERT INTO many_rows VALUES(342, 342); +INSERT INTO many_rows VALUES(343, 343); +INSERT INTO many_rows VALUES(344, 344); +INSERT INTO many_rows VALUES(345, 345); +INSERT INTO many_rows VALUES(346, 346); +INSERT INTO many_rows VALUES(347, 347); +INSERT INTO many_rows VALUES(348, 348); +INSERT INTO many_rows VALUES(349, 349); +INSERT INTO many_rows VALUES(350, 350); +INSERT INTO many_rows VALUES(351, 351); +INSERT INTO many_rows VALUES(352, 352); +INSERT INTO many_rows VALUES(353, 353); +INSERT INTO many_rows VALUES(354, 354); +INSERT INTO many_rows VALUES(355, 355); +INSERT INTO many_rows VALUES(356, 356); +INSERT INTO many_rows VALUES(357, 357); +INSERT INTO many_rows VALUES(358, 358); +INSERT INTO many_rows VALUES(359, 359); +INSERT INTO many_rows VALUES(360, 360); +INSERT INTO many_rows VALUES(361, 361); +INSERT INTO many_rows VALUES(362, 362); +INSERT INTO many_rows VALUES(363, 363); +INSERT INTO many_rows VALUES(364, 364); +INSERT INTO many_rows VALUES(365, 365); +INSERT INTO many_rows VALUES(366, 366); +INSERT INTO many_rows VALUES(367, 367); +INSERT INTO many_rows VALUES(368, 368); +INSERT INTO many_rows VALUES(369, 369); +INSERT INTO many_rows VALUES(370, 370); +INSERT INTO many_rows VALUES(371, 371); +INSERT INTO many_rows VALUES(372, 372); +INSERT INTO many_rows VALUES(373, 373); +INSERT INTO many_rows VALUES(374, 374); +INSERT INTO many_rows VALUES(375, 375); +INSERT INTO many_rows VALUES(376, 376); +INSERT INTO many_rows VALUES(377, 377); +INSERT INTO many_rows VALUES(378, 378); +INSERT INTO many_rows VALUES(379, 379); +INSERT INTO many_rows VALUES(380, 380); +INSERT INTO many_rows VALUES(381, 381); +INSERT INTO many_rows VALUES(382, 382); +INSERT INTO many_rows VALUES(383, 383); +INSERT INTO many_rows VALUES(384, 384); +INSERT INTO many_rows VALUES(385, 385); +INSERT INTO many_rows VALUES(386, 386); +INSERT INTO many_rows VALUES(387, 387); +INSERT INTO many_rows VALUES(388, 388); +INSERT INTO many_rows VALUES(389, 389); +INSERT INTO many_rows VALUES(390, 390); +INSERT INTO many_rows VALUES(391, 391); +INSERT INTO many_rows VALUES(392, 392); +INSERT INTO many_rows VALUES(393, 393); +INSERT INTO many_rows VALUES(394, 394); +INSERT INTO many_rows VALUES(395, 395); +INSERT INTO many_rows VALUES(396, 396); +INSERT INTO many_rows VALUES(397, 397); +INSERT INTO many_rows VALUES(398, 398); +INSERT INTO many_rows VALUES(399, 399); +INSERT INTO many_rows VALUES(400, 400); +INSERT INTO many_rows VALUES(401, 401); +INSERT INTO many_rows VALUES(402, 402); +INSERT INTO many_rows VALUES(403, 403); +INSERT INTO many_rows VALUES(404, 404); +INSERT INTO many_rows VALUES(405, 405); +INSERT INTO many_rows VALUES(406, 406); +INSERT INTO many_rows VALUES(407, 407); +INSERT INTO many_rows VALUES(408, 408); +INSERT INTO many_rows VALUES(409, 409); +INSERT INTO many_rows VALUES(410, 410); +INSERT INTO many_rows VALUES(411, 411); +INSERT INTO many_rows VALUES(412, 412); +INSERT INTO many_rows VALUES(413, 413); +INSERT INTO many_rows VALUES(414, 414); +INSERT INTO many_rows VALUES(415, 415); +INSERT INTO many_rows VALUES(416, 416); +INSERT INTO many_rows VALUES(417, 417); +INSERT INTO many_rows VALUES(418, 418); +INSERT INTO many_rows VALUES(419, 419); +INSERT INTO many_rows VALUES(420, 420); +INSERT INTO many_rows VALUES(421, 421); +INSERT INTO many_rows VALUES(422, 422); +INSERT INTO many_rows VALUES(423, 423); +INSERT INTO many_rows VALUES(424, 424); +INSERT INTO many_rows VALUES(425, 425); +INSERT INTO many_rows VALUES(426, 426); +INSERT INTO many_rows VALUES(427, 427); +INSERT INTO many_rows VALUES(428, 428); +INSERT INTO many_rows VALUES(429, 429); +INSERT INTO many_rows VALUES(430, 430); +INSERT INTO many_rows VALUES(431, 431); +INSERT INTO many_rows VALUES(432, 432); +INSERT INTO many_rows VALUES(433, 433); +INSERT INTO many_rows VALUES(434, 434); +INSERT INTO many_rows VALUES(435, 435); +INSERT INTO many_rows VALUES(436, 436); +INSERT INTO many_rows VALUES(437, 437); +INSERT INTO many_rows VALUES(438, 438); +INSERT INTO many_rows VALUES(439, 439); +INSERT INTO many_rows VALUES(440, 440); +INSERT INTO many_rows VALUES(441, 441); +INSERT INTO many_rows VALUES(442, 442); +INSERT INTO many_rows VALUES(443, 443); +INSERT INTO many_rows VALUES(444, 444); +INSERT INTO many_rows VALUES(445, 445); +INSERT INTO many_rows VALUES(446, 446); +INSERT INTO many_rows VALUES(447, 447); +INSERT INTO many_rows VALUES(448, 448); +INSERT INTO many_rows VALUES(449, 449); +INSERT INTO many_rows VALUES(450, 450); +INSERT INTO many_rows VALUES(451, 451); +INSERT INTO many_rows VALUES(452, 452); +INSERT INTO many_rows VALUES(453, 453); +INSERT INTO many_rows VALUES(454, 454); +INSERT INTO many_rows VALUES(455, 455); +INSERT INTO many_rows VALUES(456, 456); +INSERT INTO many_rows VALUES(457, 457); +INSERT INTO many_rows VALUES(458, 458); +INSERT INTO many_rows VALUES(459, 459); +INSERT INTO many_rows VALUES(460, 460); +INSERT INTO many_rows VALUES(461, 461); +INSERT INTO many_rows VALUES(462, 462); +INSERT INTO many_rows VALUES(463, 463); +INSERT INTO many_rows VALUES(464, 464); +INSERT INTO many_rows VALUES(465, 465); +INSERT INTO many_rows VALUES(466, 466); +INSERT INTO many_rows VALUES(467, 467); +INSERT INTO many_rows VALUES(468, 468); +INSERT INTO many_rows VALUES(469, 469); +INSERT INTO many_rows VALUES(470, 470); +INSERT INTO many_rows VALUES(471, 471); +INSERT INTO many_rows VALUES(472, 472); +INSERT INTO many_rows VALUES(473, 473); +INSERT INTO many_rows VALUES(474, 474); +INSERT INTO many_rows VALUES(475, 475); +INSERT INTO many_rows VALUES(476, 476); +INSERT INTO many_rows VALUES(477, 477); +INSERT INTO many_rows VALUES(478, 478); +INSERT INTO many_rows VALUES(479, 479); +INSERT INTO many_rows VALUES(480, 480); +INSERT INTO many_rows VALUES(481, 481); +INSERT INTO many_rows VALUES(482, 482); +INSERT INTO many_rows VALUES(483, 483); +INSERT INTO many_rows VALUES(484, 484); +INSERT INTO many_rows VALUES(485, 485); +INSERT INTO many_rows VALUES(486, 486); +INSERT INTO many_rows VALUES(487, 487); +INSERT INTO many_rows VALUES(488, 488); +INSERT INTO many_rows VALUES(489, 489); +INSERT INTO many_rows VALUES(490, 490); +INSERT INTO many_rows VALUES(491, 491); +INSERT INTO many_rows VALUES(492, 492); +INSERT INTO many_rows VALUES(493, 493); +INSERT INTO many_rows VALUES(494, 494); +INSERT INTO many_rows VALUES(495, 495); +INSERT INTO many_rows VALUES(496, 496); +INSERT INTO many_rows VALUES(497, 497); +INSERT INTO many_rows VALUES(498, 498); +INSERT INTO many_rows VALUES(499, 499); +INSERT INTO many_rows VALUES(500, 500); +INSERT INTO many_rows VALUES(501, 501); +INSERT INTO many_rows VALUES(502, 502); +INSERT INTO many_rows VALUES(503, 503); +INSERT INTO many_rows VALUES(504, 504); +INSERT INTO many_rows VALUES(505, 505); +INSERT INTO many_rows VALUES(506, 506); +INSERT INTO many_rows VALUES(507, 507); +INSERT INTO many_rows VALUES(508, 508); +INSERT INTO many_rows VALUES(509, 509); +INSERT INTO many_rows VALUES(510, 510); +INSERT INTO many_rows VALUES(511, 511); +INSERT INTO many_rows VALUES(512, 512); diff --git a/format/sqlite3/testdata/many_rows.sql.db b/format/sqlite3/testdata/many_rows.sql.db new file mode 100644 index 000000000..ad7a1dba1 Binary files /dev/null and b/format/sqlite3/testdata/many_rows.sql.db differ diff --git a/format/sqlite3/testdata/many_rows.sql.fqtest b/format/sqlite3/testdata/many_rows.sql.fqtest new file mode 100644 index 000000000..83154490f --- /dev/null +++ b/format/sqlite3/testdata/many_rows.sql.fqtest @@ -0,0 +1 @@ +$ fq 'dv, torepr' many_rows.sql.db diff --git a/format/sqlite3/testdata/multi_tables.sql b/format/sqlite3/testdata/multi_tables.sql new file mode 100644 index 000000000..fb05445c4 --- /dev/null +++ b/format/sqlite3/testdata/multi_tables.sql @@ -0,0 +1,17 @@ +CREATE TABLE aaa ( + cint int primary key, + ctext text +); +INSERT INTO aaa VALUES(123, "AAAAAAA"); + +CREATE TABLE bbb ( + cint int primary key, + ctext text +); +INSERT INTO bbb VALUES(456, "BBBBBBB"); + +CREATE TABLE ccc ( + cint int primary key, + ctext text +); +INSERT INTO ccc VALUES(789, "CCCCCCC"); diff --git a/format/sqlite3/testdata/multi_tables.sql.db b/format/sqlite3/testdata/multi_tables.sql.db new file mode 100644 index 000000000..7dfaa3c34 Binary files /dev/null and b/format/sqlite3/testdata/multi_tables.sql.db differ diff --git a/format/sqlite3/testdata/multi_tables.sql.fqtest b/format/sqlite3/testdata/multi_tables.sql.fqtest new file mode 100644 index 000000000..47a711f44 --- /dev/null +++ b/format/sqlite3/testdata/multi_tables.sql.fqtest @@ -0,0 +1,321 @@ +$ fq 'dv, torepr' multi_tables.sql.db + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: multi_tables.sql.db (sqlite3) 0x0-0x6fff.7 (28672) + | | | header{}: 0x0-0x63.7 (100) +0x0000|53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00|SQLite format 3.| magic: "SQLite format 3\x00" (valid) 0x0-0xf.7 (16) +0x0010|10 00 |.. | page_size: 4096 0x10-0x11.7 (2) +0x0010| 01 | . | write_version: "legacy" (1) 0x12-0x12.7 (1) +0x0010| 01 | . | read_version: "legacy" (1) 0x13-0x13.7 (1) +0x0010| 00 | . | unused_space: 0 0x14-0x14.7 (1) +0x0010| 40 | @ | maximum_embedded_payload_fraction: 64 0x15-0x15.7 (1) +0x0010| 20 | | minimum_embedded_payload_fraction: 32 0x16-0x16.7 (1) +0x0010| 20 | | leaf_payload_fraction: 32 0x17-0x17.7 (1) +0x0010| 00 00 00 06 | .... | file_change_counter: 6 0x18-0x1b.7 (4) +0x0010| 00 00 00 07| ....| database_size_pages: 7 0x1c-0x1f.7 (4) +0x0020|00 00 00 00 |.... | page_number_freelist: 0 0x20-0x23.7 (4) +0x0020| 00 00 00 00 | .... | total_number_freelist: 0 0x24-0x27.7 (4) +0x0020| 00 00 00 03 | .... | schema_cookie: 3 0x28-0x2b.7 (4) +0x0020| 00 00 00 04| ....| schema_format_number: 4 0x2c-0x2f.7 (4) +0x0030|00 00 00 00 |.... | default_page_cache_size: 0 0x30-0x33.7 (4) +0x0030| 00 00 00 00 | .... | page_number_largest_root_btree: 0 0x34-0x37.7 (4) +0x0030| 00 00 00 01 | .... | text_encoding: "utf8" (1) 0x38-0x3b.7 (4) +0x0030| 00 00 00 00| ....| user_version: 0 0x3c-0x3f.7 (4) +0x0040|00 00 00 00 |.... | incremental_vacuum_mode: 0 0x40-0x43.7 (4) +0x0040| 00 00 00 00 | .... | application_id: 0 0x44-0x47.7 (4) +0x0040| 00 00 00 00 00 00 00 00| ........| reserved: raw bits (all zero) 0x48-0x5b.7 (20) +0x0050|00 00 00 00 00 00 00 00 00 00 00 00 |............ | +0x0050| 00 00 00 06| ....| version_valid_for: 6 0x5c-0x5f.7 (4) +0x0060|00 2e 53 60 |..S` | sqlite_version_number: 3036000 0x60-0x63.7 (4) + | | | pages[0:8]: 0x64-0x6fff.7 (28572) + | | | [0]{}: page 0x64-NA (0) + | | | type: "page0_index_fill" 0x64-NA (0) + | | | [1]{}: page 0x64-0xff9.7 (3990) +0x0060| 0d | . | type: "table_leaf" (13) 0x64-0x64.7 (1) +0x0060| 0f f8 | .. | start_freeblocks: 4088 0x65-0x66.7 (2) +0x0060| 00 06 | .. | page_cells: 6 0x67-0x68.7 (2) +0x0060| 0e 8d | .. | cell_start: 3725 0x69-0x6a.7 (2) +0x0060| 00 | . | cell_fragments: 0 0x6b-0x6b.7 (1) + | | | cells_pointers[0:6]: 0x6c-0x77.7 (12) +0x0060| 0f 7f | .. | [0]: 3967 pointer 0x6c-0x6d.7 (2) +0x0060| 0f d1| ..| [1]: 4049 pointer 0x6e-0x6f.7 (2) +0x0070|0f 06 |.. | [2]: 3846 pointer 0x70-0x71.7 (2) +0x0070| 0f 58 | .X | [3]: 3928 pointer 0x72-0x73.7 (2) +0x0070| 0e 8d | .. | [4]: 3725 pointer 0x74-0x75.7 (2) +0x0070| 0e df | .. | [5]: 3807 pointer 0x76-0x77.7 (2) + | | | cells[0:6]: 0xe8d-0xff7.7 (363) + | | | [0]{}: cell 0xf7f-0xfd0.7 (82) +0x0f70| 50| P| payload_len: 80 0xf7f-0xf7f.7 (1) +0x0f80|01 |. | rowid: 1 0xf80-0xf80.7 (1) + | | | payload{}: 0xf81-0xfd0.7 (80) +0x0f80| 07 | . | length: 7 0xf81-0xf81.7 (1) + | | | serials[0:5]: 0xf82-0xf87.7 (6) +0x0f80| 17 | . | [0]: 23 serial (text) 0xf82-0xf82.7 (1) +0x0f80| 13 | . | [1]: 19 serial (text) 0xf83-0xf83.7 (1) +0x0f80| 13 | . | [2]: 19 serial (text) 0xf84-0xf84.7 (1) +0x0f80| 01 | . | [3]: 1 serial (int8) 0xf85-0xf85.7 (1) +0x0f80| 81 07 | .. | [4]: 135 serial (text) 0xf86-0xf87.7 (2) + | | | contents[0:5]: 0xf88-0xfd0.7 (73) +0x0f80| 74 61 62 6c 65 | table | [0]: "table" value 0xf88-0xf8c.7 (5) +0x0f80| 61 61 61| aaa| [1]: "aaa" value 0xf8d-0xf8f.7 (3) +0x0f90|61 61 61 |aaa | [2]: "aaa" value 0xf90-0xf92.7 (3) +0x0f90| 02 | . | [3]: 2 value 0xf93-0xf93.7 (1) +0x0f90| 43 52 45 41 54 45 20 54 41 42 4c 45| CREATE TABLE| [4]: "CREATE TABLE aaa (\n cint int primary key,\n c"... value 0xf94-0xfd0.7 (61) +0x0fa0|20 61 61 61 20 28 0a 20 20 20 20 63 69 6e 74 20| aaa (. cint | +* |until 0xfd0.7 (61) | | + | | | [1]{}: cell 0xfd1-0xff7.7 (39) +0x0fd0| 25 | % | payload_len: 37 0xfd1-0xfd1.7 (1) +0x0fd0| 02 | . | rowid: 2 0xfd2-0xfd2.7 (1) + | | | payload{}: 0xfd3-0xff7.7 (37) +0x0fd0| 06 | . | length: 6 0xfd3-0xfd3.7 (1) + | | | serials[0:5]: 0xfd4-0xfd8.7 (5) +0x0fd0| 17 | . | [0]: 23 serial (text) 0xfd4-0xfd4.7 (1) +0x0fd0| 39 | 9 | [1]: 57 serial (text) 0xfd5-0xfd5.7 (1) +0x0fd0| 13 | . | [2]: 19 serial (text) 0xfd6-0xfd6.7 (1) +0x0fd0| 01 | . | [3]: 1 serial (int8) 0xfd7-0xfd7.7 (1) +0x0fd0| 00 | . | [4]: 0 serial (null) 0xfd8-0xfd8.7 (1) + | | | contents[0:5]: 0xfd9-0xff7.7 (31) +0x0fd0| 69 6e 64 65 78 | index | [0]: "index" value 0xfd9-0xfdd.7 (5) +0x0fd0| 73 71| sq| [1]: "sqlite_autoindex_aaa_1" value 0xfde-0xff3.7 (22) +0x0fe0|6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 61|lite_autoindex_a| +0x0ff0|61 61 5f 31 |aa_1 | +0x0ff0| 61 61 61 | aaa | [2]: "aaa" value 0xff4-0xff6.7 (3) +0x0ff0| 03 | . | [3]: 3 value 0xff7-0xff7.7 (1) + | | | [4]: null value 0xff8-NA (0) + | | | [2]{}: cell 0xf06-0xf57.7 (82) +0x0f00| 50 | P | payload_len: 80 0xf06-0xf06.7 (1) +0x0f00| 03 | . | rowid: 3 0xf07-0xf07.7 (1) + | | | payload{}: 0xf08-0xf57.7 (80) +0x0f00| 07 | . | length: 7 0xf08-0xf08.7 (1) + | | | serials[0:5]: 0xf09-0xf0e.7 (6) +0x0f00| 17 | . | [0]: 23 serial (text) 0xf09-0xf09.7 (1) +0x0f00| 13 | . | [1]: 19 serial (text) 0xf0a-0xf0a.7 (1) +0x0f00| 13 | . | [2]: 19 serial (text) 0xf0b-0xf0b.7 (1) +0x0f00| 01 | . | [3]: 1 serial (int8) 0xf0c-0xf0c.7 (1) +0x0f00| 81 07 | .. | [4]: 135 serial (text) 0xf0d-0xf0e.7 (2) + | | | contents[0:5]: 0xf0f-0xf57.7 (73) +0x0f00| 74| t| [0]: "table" value 0xf0f-0xf13.7 (5) +0x0f10|61 62 6c 65 |able | +0x0f10| 62 62 62 | bbb | [1]: "bbb" value 0xf14-0xf16.7 (3) +0x0f10| 62 62 62 | bbb | [2]: "bbb" value 0xf17-0xf19.7 (3) +0x0f10| 04 | . | [3]: 4 value 0xf1a-0xf1a.7 (1) +0x0f10| 43 52 45 41 54| CREAT| [4]: "CREATE TABLE bbb (\n cint int primary key,\n c"... value 0xf1b-0xf57.7 (61) +0x0f20|45 20 54 41 42 4c 45 20 62 62 62 20 28 0a 20 20|E TABLE bbb (. | +* |until 0xf57.7 (61) | | + | | | [3]{}: cell 0xf58-0xf7e.7 (39) +0x0f50| 25 | % | payload_len: 37 0xf58-0xf58.7 (1) +0x0f50| 04 | . | rowid: 4 0xf59-0xf59.7 (1) + | | | payload{}: 0xf5a-0xf7e.7 (37) +0x0f50| 06 | . | length: 6 0xf5a-0xf5a.7 (1) + | | | serials[0:5]: 0xf5b-0xf5f.7 (5) +0x0f50| 17 | . | [0]: 23 serial (text) 0xf5b-0xf5b.7 (1) +0x0f50| 39 | 9 | [1]: 57 serial (text) 0xf5c-0xf5c.7 (1) +0x0f50| 13 | . | [2]: 19 serial (text) 0xf5d-0xf5d.7 (1) +0x0f50| 01 | . | [3]: 1 serial (int8) 0xf5e-0xf5e.7 (1) +0x0f50| 00| .| [4]: 0 serial (null) 0xf5f-0xf5f.7 (1) + | | | contents[0:5]: 0xf60-0xf7e.7 (31) +0x0f60|69 6e 64 65 78 |index | [0]: "index" value 0xf60-0xf64.7 (5) +0x0f60| 73 71 6c 69 74 65 5f 61 75 74 6f| sqlite_auto| [1]: "sqlite_autoindex_bbb_1" value 0xf65-0xf7a.7 (22) +0x0f70|69 6e 64 65 78 5f 62 62 62 5f 31 |index_bbb_1 | +0x0f70| 62 62 62 | bbb | [2]: "bbb" value 0xf7b-0xf7d.7 (3) +0x0f70| 05 | . | [3]: 5 value 0xf7e-0xf7e.7 (1) + | | | [4]: null value 0xf7f-NA (0) + | | | [4]{}: cell 0xe8d-0xede.7 (82) +0x0e80| 50 | P | payload_len: 80 0xe8d-0xe8d.7 (1) +0x0e80| 05 | . | rowid: 5 0xe8e-0xe8e.7 (1) + | | | payload{}: 0xe8f-0xede.7 (80) +0x0e80| 07| .| length: 7 0xe8f-0xe8f.7 (1) + | | | serials[0:5]: 0xe90-0xe95.7 (6) +0x0e90|17 |. | [0]: 23 serial (text) 0xe90-0xe90.7 (1) +0x0e90| 13 | . | [1]: 19 serial (text) 0xe91-0xe91.7 (1) +0x0e90| 13 | . | [2]: 19 serial (text) 0xe92-0xe92.7 (1) +0x0e90| 01 | . | [3]: 1 serial (int8) 0xe93-0xe93.7 (1) +0x0e90| 81 07 | .. | [4]: 135 serial (text) 0xe94-0xe95.7 (2) + | | | contents[0:5]: 0xe96-0xede.7 (73) +0x0e90| 74 61 62 6c 65 | table | [0]: "table" value 0xe96-0xe9a.7 (5) +0x0e90| 63 63 63 | ccc | [1]: "ccc" value 0xe9b-0xe9d.7 (3) +0x0e90| 63 63| cc| [2]: "ccc" value 0xe9e-0xea0.7 (3) +0x0ea0|63 |c | +0x0ea0| 06 | . | [3]: 6 value 0xea1-0xea1.7 (1) +0x0ea0| 43 52 45 41 54 45 20 54 41 42 4c 45 20 63| CREATE TABLE c| [4]: "CREATE TABLE ccc (\n cint int primary key,\n c"... value 0xea2-0xede.7 (61) +0x0eb0|63 63 20 28 0a 20 20 20 20 63 69 6e 74 20 69 6e|cc (. cint in| +* |until 0xede.7 (61) | | + | | | [5]{}: cell 0xedf-0xf05.7 (39) +0x0ed0| 25| %| payload_len: 37 0xedf-0xedf.7 (1) +0x0ee0|06 |. | rowid: 6 0xee0-0xee0.7 (1) + | | | payload{}: 0xee1-0xf05.7 (37) +0x0ee0| 06 | . | length: 6 0xee1-0xee1.7 (1) + | | | serials[0:5]: 0xee2-0xee6.7 (5) +0x0ee0| 17 | . | [0]: 23 serial (text) 0xee2-0xee2.7 (1) +0x0ee0| 39 | 9 | [1]: 57 serial (text) 0xee3-0xee3.7 (1) +0x0ee0| 13 | . | [2]: 19 serial (text) 0xee4-0xee4.7 (1) +0x0ee0| 01 | . | [3]: 1 serial (int8) 0xee5-0xee5.7 (1) +0x0ee0| 00 | . | [4]: 0 serial (null) 0xee6-0xee6.7 (1) + | | | contents[0:5]: 0xee7-0xf05.7 (31) +0x0ee0| 69 6e 64 65 78 | index | [0]: "index" value 0xee7-0xeeb.7 (5) +0x0ee0| 73 71 6c 69| sqli| [1]: "sqlite_autoindex_ccc_1" value 0xeec-0xf01.7 (22) +0x0ef0|74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 63 63 63|te_autoindex_ccc| +0x0f00|5f 31 |_1 | +0x0f00| 63 63 63 | ccc | [2]: "ccc" value 0xf02-0xf04.7 (3) +0x0f00| 07 | . | [3]: 7 value 0xf05-0xf05.7 (1) + | | | [4]: null value 0xf06-NA (0) + | | | freeblocks[0:1]: 0xff8-0xff9.7 (2) + | | | [0]{}: freeblock 0xff8-0xff9.7 (2) +0x0ff0| 00 00 | .. | next_offset: 0 0xff8-0xff9.7 (2) + | | | [2]{}: page 0x1000-0x1fff.7 (4096) +0x1000|0d |. | type: "table_leaf" (13) 0x1000-0x1000.7 (1) +0x1000| 00 00 | .. | start_freeblocks: 0 0x1001-0x1002.7 (2) +0x1000| 00 01 | .. | page_cells: 1 0x1003-0x1004.7 (2) +0x1000| 0f f3 | .. | cell_start: 4083 0x1005-0x1006.7 (2) +0x1000| 00 | . | cell_fragments: 0 0x1007-0x1007.7 (1) + | | | cells_pointers[0:1]: 0x1008-0x1009.7 (2) +0x1000| 0f f3 | .. | [0]: 4083 pointer 0x1008-0x1009.7 (2) + | | | cells[0:1]: 0x1ff3-0x1fff.7 (13) + | | | [0]{}: cell 0x1ff3-0x1fff.7 (13) +0x1ff0| 0b | . | payload_len: 11 0x1ff3-0x1ff3.7 (1) +0x1ff0| 01 | . | rowid: 1 0x1ff4-0x1ff4.7 (1) + | | | payload{}: 0x1ff5-0x1fff.7 (11) +0x1ff0| 03 | . | length: 3 0x1ff5-0x1ff5.7 (1) + | | | serials[0:2]: 0x1ff6-0x1ff7.7 (2) +0x1ff0| 01 | . | [0]: 1 serial (int8) 0x1ff6-0x1ff6.7 (1) +0x1ff0| 1b | . | [1]: 27 serial (text) 0x1ff7-0x1ff7.7 (1) + | | | contents[0:2]: 0x1ff8-0x1fff.7 (8) +0x1ff0| 7b | { | [0]: 123 value 0x1ff8-0x1ff8.7 (1) +0x1ff0| 41 41 41 41 41 41 41| AAAAAAA| [1]: "AAAAAAA" value 0x1ff9-0x1fff.7 (7) + | | | [3]{}: page 0x2000-0x2fff.7 (4096) +0x2000|0a |. | type: "index_leaf" (10) 0x2000-0x2000.7 (1) +0x2000| 00 00 | .. | start_freeblocks: 0 0x2001-0x2002.7 (2) +0x2000| 00 01 | .. | page_cells: 1 0x2003-0x2004.7 (2) +0x2000| 0f fb | .. | cell_start: 4091 0x2005-0x2006.7 (2) +0x2000| 00 | . | cell_fragments: 0 0x2007-0x2007.7 (1) + | | | cells_pointers[0:1]: 0x2008-0x2009.7 (2) +0x2000| 0f fb | .. | [0]: 4091 pointer 0x2008-0x2009.7 (2) + | | | cells[0:1]: 0x2ffb-0x2fff.7 (5) + | | | [0]{}: cell 0x2ffb-0x2fff.7 (5) +0x2ff0| 04 | . | payload_len: 4 0x2ffb-0x2ffb.7 (1) + | | | payload{}: 0x2ffc-0x2fff.7 (4) +0x2ff0| 03 | . | length: 3 0x2ffc-0x2ffc.7 (1) + | | | serials[0:2]: 0x2ffd-0x2ffe.7 (2) +0x2ff0| 01 | . | [0]: 1 serial (int8) 0x2ffd-0x2ffd.7 (1) +0x2ff0| 09 | . | [1]: 9 serial (one) 0x2ffe-0x2ffe.7 (1) + | | | contents[0:2]: 0x2fff-0x2fff.7 (1) +0x2ff0| 7b| {| [0]: 123 value 0x2fff-0x2fff.7 (1) + | | | [1]: 1 value 0x3000-NA (0) + | | | [4]{}: page 0x3000-0x3fff.7 (4096) +0x3000|0d |. | type: "table_leaf" (13) 0x3000-0x3000.7 (1) +0x3000| 00 00 | .. | start_freeblocks: 0 0x3001-0x3002.7 (2) +0x3000| 00 01 | .. | page_cells: 1 0x3003-0x3004.7 (2) +0x3000| 0f f2 | .. | cell_start: 4082 0x3005-0x3006.7 (2) +0x3000| 00 | . | cell_fragments: 0 0x3007-0x3007.7 (1) + | | | cells_pointers[0:1]: 0x3008-0x3009.7 (2) +0x3000| 0f f2 | .. | [0]: 4082 pointer 0x3008-0x3009.7 (2) + | | | cells[0:1]: 0x3ff2-0x3fff.7 (14) + | | | [0]{}: cell 0x3ff2-0x3fff.7 (14) +0x3ff0| 0c | . | payload_len: 12 0x3ff2-0x3ff2.7 (1) +0x3ff0| 01 | . | rowid: 1 0x3ff3-0x3ff3.7 (1) + | | | payload{}: 0x3ff4-0x3fff.7 (12) +0x3ff0| 03 | . | length: 3 0x3ff4-0x3ff4.7 (1) + | | | serials[0:2]: 0x3ff5-0x3ff6.7 (2) +0x3ff0| 02 | . | [0]: 2 serial (int16) 0x3ff5-0x3ff5.7 (1) +0x3ff0| 1b | . | [1]: 27 serial (text) 0x3ff6-0x3ff6.7 (1) + | | | contents[0:2]: 0x3ff7-0x3fff.7 (9) +0x3ff0| 01 c8 | .. | [0]: 456 value 0x3ff7-0x3ff8.7 (2) +0x3ff0| 42 42 42 42 42 42 42| BBBBBBB| [1]: "BBBBBBB" value 0x3ff9-0x3fff.7 (7) + | | | [5]{}: page 0x4000-0x4fff.7 (4096) +0x4000|0a |. | type: "index_leaf" (10) 0x4000-0x4000.7 (1) +0x4000| 00 00 | .. | start_freeblocks: 0 0x4001-0x4002.7 (2) +0x4000| 00 01 | .. | page_cells: 1 0x4003-0x4004.7 (2) +0x4000| 0f fa | .. | cell_start: 4090 0x4005-0x4006.7 (2) +0x4000| 00 | . | cell_fragments: 0 0x4007-0x4007.7 (1) + | | | cells_pointers[0:1]: 0x4008-0x4009.7 (2) +0x4000| 0f fa | .. | [0]: 4090 pointer 0x4008-0x4009.7 (2) + | | | cells[0:1]: 0x4ffa-0x4fff.7 (6) + | | | [0]{}: cell 0x4ffa-0x4fff.7 (6) +0x4ff0| 05 | . | payload_len: 5 0x4ffa-0x4ffa.7 (1) + | | | payload{}: 0x4ffb-0x4fff.7 (5) +0x4ff0| 03 | . | length: 3 0x4ffb-0x4ffb.7 (1) + | | | serials[0:2]: 0x4ffc-0x4ffd.7 (2) +0x4ff0| 02 | . | [0]: 2 serial (int16) 0x4ffc-0x4ffc.7 (1) +0x4ff0| 09 | . | [1]: 9 serial (one) 0x4ffd-0x4ffd.7 (1) + | | | contents[0:2]: 0x4ffe-0x4fff.7 (2) +0x4ff0| 01 c8| ..| [0]: 456 value 0x4ffe-0x4fff.7 (2) + | | | [1]: 1 value 0x5000-NA (0) + | | | [6]{}: page 0x5000-0x5fff.7 (4096) +0x5000|0d |. | type: "table_leaf" (13) 0x5000-0x5000.7 (1) +0x5000| 00 00 | .. | start_freeblocks: 0 0x5001-0x5002.7 (2) +0x5000| 00 01 | .. | page_cells: 1 0x5003-0x5004.7 (2) +0x5000| 0f f2 | .. | cell_start: 4082 0x5005-0x5006.7 (2) +0x5000| 00 | . | cell_fragments: 0 0x5007-0x5007.7 (1) + | | | cells_pointers[0:1]: 0x5008-0x5009.7 (2) +0x5000| 0f f2 | .. | [0]: 4082 pointer 0x5008-0x5009.7 (2) + | | | cells[0:1]: 0x5ff2-0x5fff.7 (14) + | | | [0]{}: cell 0x5ff2-0x5fff.7 (14) +0x5ff0| 0c | . | payload_len: 12 0x5ff2-0x5ff2.7 (1) +0x5ff0| 01 | . | rowid: 1 0x5ff3-0x5ff3.7 (1) + | | | payload{}: 0x5ff4-0x5fff.7 (12) +0x5ff0| 03 | . | length: 3 0x5ff4-0x5ff4.7 (1) + | | | serials[0:2]: 0x5ff5-0x5ff6.7 (2) +0x5ff0| 02 | . | [0]: 2 serial (int16) 0x5ff5-0x5ff5.7 (1) +0x5ff0| 1b | . | [1]: 27 serial (text) 0x5ff6-0x5ff6.7 (1) + | | | contents[0:2]: 0x5ff7-0x5fff.7 (9) +0x5ff0| 03 15 | .. | [0]: 789 value 0x5ff7-0x5ff8.7 (2) +0x5ff0| 43 43 43 43 43 43 43| CCCCCCC| [1]: "CCCCCCC" value 0x5ff9-0x5fff.7 (7) + | | | [7]{}: page 0x6000-0x6fff.7 (4096) +0x6000|0a |. | type: "index_leaf" (10) 0x6000-0x6000.7 (1) +0x6000| 00 00 | .. | start_freeblocks: 0 0x6001-0x6002.7 (2) +0x6000| 00 01 | .. | page_cells: 1 0x6003-0x6004.7 (2) +0x6000| 0f fa | .. | cell_start: 4090 0x6005-0x6006.7 (2) +0x6000| 00 | . | cell_fragments: 0 0x6007-0x6007.7 (1) + | | | cells_pointers[0:1]: 0x6008-0x6009.7 (2) +0x6000| 0f fa | .. | [0]: 4090 pointer 0x6008-0x6009.7 (2) + | | | cells[0:1]: 0x6ffa-0x6fff.7 (6) + | | | [0]{}: cell 0x6ffa-0x6fff.7 (6) +0x6ff0| 05 | . | payload_len: 5 0x6ffa-0x6ffa.7 (1) + | | | payload{}: 0x6ffb-0x6fff.7 (5) +0x6ff0| 03 | . | length: 3 0x6ffb-0x6ffb.7 (1) + | | | serials[0:2]: 0x6ffc-0x6ffd.7 (2) +0x6ff0| 02 | . | [0]: 2 serial (int16) 0x6ffc-0x6ffc.7 (1) +0x6ff0| 09 | . | [1]: 9 serial (one) 0x6ffd-0x6ffd.7 (1) + | | | contents[0:2]: 0x6ffe-0x6fff.7 (2) +0x6ff0| 03 15| ..| [0]: 789 value 0x6ffe-0x6fff.7 (2) + | | | [1]: 1 value 0x7000-NA (0) +0x0070| 00 00 00 00 00 00 00 00| ........| unknown0: raw bits 0x78-0xe8c.7 (3605) +0x0080|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0xe8c.7 (3605) | | +0x0ff0| 00 08 00 00 00 00| ......| unknown1: raw bits 0xffa-0xfff.7 (6) +0x1000| 00 00 00 00 00 00| ......| unknown2: raw bits 0x100a-0x1ff2.7 (4073) +0x1010|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1ff2.7 (4073) | | +0x2000| 00 00 00 00 00 00| ......| unknown3: raw bits 0x200a-0x2ffa.7 (4081) +0x2010|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x2ffa.7 (4081) | | +0x3000| 00 00 00 00 00 00| ......| unknown4: raw bits 0x300a-0x3ff1.7 (4072) +0x3010|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x3ff1.7 (4072) | | +0x4000| 00 00 00 00 00 00| ......| unknown5: raw bits 0x400a-0x4ff9.7 (4080) +0x4010|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x4ff9.7 (4080) | | +0x5000| 00 00 00 00 00 00| ......| unknown6: raw bits 0x500a-0x5ff1.7 (4072) +0x5010|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x5ff1.7 (4072) | | +0x6000| 00 00 00 00 00 00| ......| unknown7: raw bits 0x600a-0x6ff9.7 (4080) +0x6010|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x6ff9.7 (4080) | | +{ + "aaa": [ + [ + 123, + "AAAAAAA" + ] + ], + "bbb": [ + [ + 456, + "BBBBBBB" + ] + ], + "ccc": [ + [ + 789, + "CCCCCCC" + ] + ] +} diff --git a/format/sqlite3/testdata/page_overflow.sql b/format/sqlite3/testdata/page_overflow.sql new file mode 100644 index 000000000..50160d3bd --- /dev/null +++ b/format/sqlite3/testdata/page_overflow.sql @@ -0,0 +1,5 @@ +CREATE TABLE overflow_test ( + cint int primary key, + ctext text +); +INSERT INTO overflow_test VALUES(123, "ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC"); diff --git a/format/sqlite3/testdata/page_overflow.sql.db b/format/sqlite3/testdata/page_overflow.sql.db new file mode 100644 index 000000000..531404982 Binary files /dev/null and b/format/sqlite3/testdata/page_overflow.sql.db differ diff --git a/format/sqlite3/testdata/page_overflow.sql.fqtest b/format/sqlite3/testdata/page_overflow.sql.fqtest new file mode 100644 index 000000000..9a790abbd --- /dev/null +++ b/format/sqlite3/testdata/page_overflow.sql.fqtest @@ -0,0 +1,159 @@ +$ fq 'dv, torepr' page_overflow.sql.db + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: page_overflow.sql.db (sqlite3) 0x0-0x3fff.7 (16384) + | | | header{}: 0x0-0x63.7 (100) +0x00000|53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00|SQLite format 3.| magic: "SQLite format 3\x00" (valid) 0x0-0xf.7 (16) +0x00010|10 00 |.. | page_size: 4096 0x10-0x11.7 (2) +0x00010| 01 | . | write_version: "legacy" (1) 0x12-0x12.7 (1) +0x00010| 01 | . | read_version: "legacy" (1) 0x13-0x13.7 (1) +0x00010| 00 | . | unused_space: 0 0x14-0x14.7 (1) +0x00010| 40 | @ | maximum_embedded_payload_fraction: 64 0x15-0x15.7 (1) +0x00010| 20 | | minimum_embedded_payload_fraction: 32 0x16-0x16.7 (1) +0x00010| 20 | | leaf_payload_fraction: 32 0x17-0x17.7 (1) +0x00010| 00 00 00 02 | .... | file_change_counter: 2 0x18-0x1b.7 (4) +0x00010| 00 00 00 04| ....| database_size_pages: 4 0x1c-0x1f.7 (4) +0x00020|00 00 00 00 |.... | page_number_freelist: 0 0x20-0x23.7 (4) +0x00020| 00 00 00 00 | .... | total_number_freelist: 0 0x24-0x27.7 (4) +0x00020| 00 00 00 01 | .... | schema_cookie: 1 0x28-0x2b.7 (4) +0x00020| 00 00 00 04| ....| schema_format_number: 4 0x2c-0x2f.7 (4) +0x00030|00 00 00 00 |.... | default_page_cache_size: 0 0x30-0x33.7 (4) +0x00030| 00 00 00 00 | .... | page_number_largest_root_btree: 0 0x34-0x37.7 (4) +0x00030| 00 00 00 01 | .... | text_encoding: "utf8" (1) 0x38-0x3b.7 (4) +0x00030| 00 00 00 00| ....| user_version: 0 0x3c-0x3f.7 (4) +0x00040|00 00 00 00 |.... | incremental_vacuum_mode: 0 0x40-0x43.7 (4) +0x00040| 00 00 00 00 | .... | application_id: 0 0x44-0x47.7 (4) +0x00040| 00 00 00 00 00 00 00 00| ........| reserved: raw bits (all zero) 0x48-0x5b.7 (20) +0x00050|00 00 00 00 00 00 00 00 00 00 00 00 |............ | +0x00050| 00 00 00 02| ....| version_valid_for: 2 0x5c-0x5f.7 (4) +0x00060|00 2e 53 60 |..S` | sqlite_version_number: 3036000 0x60-0x63.7 (4) + | | | pages[0:5]: 0x64-0x3ffc.7 (16281) + | | | [0]{}: page 0x64-NA (0) + | | | type: "page0_index_fill" 0x64-NA (0) + | | | [1]{}: page 0x64-0xff9.7 (3990) +0x00060| 0d | . | type: "table_leaf" (13) 0x64-0x64.7 (1) +0x00060| 0f f8 | .. | start_freeblocks: 4088 0x65-0x66.7 (2) +0x00060| 00 02 | .. | page_cells: 2 0x67-0x68.7 (2) +0x00060| 0f 4d | .M | cell_start: 3917 0x69-0x6a.7 (2) +0x00060| 00 | . | cell_fragments: 0 0x6b-0x6b.7 (1) + | | | cells_pointers[0:2]: 0x6c-0x6f.7 (4) +0x00060| 0f 4d | .M | [0]: 3917 pointer 0x6c-0x6d.7 (2) +0x00060| 0f bd| ..| [1]: 4029 pointer 0x6e-0x6f.7 (2) + | | | cells[0:2]: 0xf4d-0xff7.7 (171) + | | | [0]{}: cell 0xf4d-0xfbc.7 (112) +0x00f40| 6e | n | payload_len: 110 0xf4d-0xf4d.7 (1) +0x00f40| 01 | . | rowid: 1 0xf4e-0xf4e.7 (1) + | | | payload{}: 0xf4f-0xfbc.7 (110) +0x00f40| 07| .| length: 7 0xf4f-0xf4f.7 (1) + | | | serials[0:5]: 0xf50-0xf55.7 (6) +0x00f50|17 |. | [0]: 23 serial (text) 0xf50-0xf50.7 (1) +0x00f50| 27 | ' | [1]: 39 serial (text) 0xf51-0xf51.7 (1) +0x00f50| 27 | ' | [2]: 39 serial (text) 0xf52-0xf52.7 (1) +0x00f50| 01 | . | [3]: 1 serial (int8) 0xf53-0xf53.7 (1) +0x00f50| 81 1b | .. | [4]: 155 serial (text) 0xf54-0xf55.7 (2) + | | | contents[0:5]: 0xf56-0xfbc.7 (103) +0x00f50| 74 61 62 6c 65 | table | [0]: "table" value 0xf56-0xf5a.7 (5) +0x00f50| 6f 76 65 72 66| overf| [1]: "overflow_test" value 0xf5b-0xf67.7 (13) +0x00f60|6c 6f 77 5f 74 65 73 74 |low_test | +0x00f60| 6f 76 65 72 66 6c 6f 77| overflow| [2]: "overflow_test" value 0xf68-0xf74.7 (13) +0x00f70|5f 74 65 73 74 |_test | +0x00f70| 02 | . | [3]: 2 value 0xf75-0xf75.7 (1) +0x00f70| 43 52 45 41 54 45 20 54 41 42| CREATE TAB| [4]: "CREATE TABLE overflow_test (\n cint int primary "... value 0xf76-0xfbc.7 (71) +0x00f80|4c 45 20 6f 76 65 72 66 6c 6f 77 5f 74 65 73 74|LE overflow_test| +* |until 0xfbc.7 (71) | | + | | | [1]{}: cell 0xfbd-0xff7.7 (59) +0x00fb0| 39 | 9 | payload_len: 57 0xfbd-0xfbd.7 (1) +0x00fb0| 02 | . | rowid: 2 0xfbe-0xfbe.7 (1) + | | | payload{}: 0xfbf-0xff7.7 (57) +0x00fb0| 06| .| length: 6 0xfbf-0xfbf.7 (1) + | | | serials[0:5]: 0xfc0-0xfc4.7 (5) +0x00fc0|17 |. | [0]: 23 serial (text) 0xfc0-0xfc0.7 (1) +0x00fc0| 4d | M | [1]: 77 serial (text) 0xfc1-0xfc1.7 (1) +0x00fc0| 27 | ' | [2]: 39 serial (text) 0xfc2-0xfc2.7 (1) +0x00fc0| 01 | . | [3]: 1 serial (int8) 0xfc3-0xfc3.7 (1) +0x00fc0| 00 | . | [4]: 0 serial (null) 0xfc4-0xfc4.7 (1) + | | | contents[0:5]: 0xfc5-0xff7.7 (51) +0x00fc0| 69 6e 64 65 78 | index | [0]: "index" value 0xfc5-0xfc9.7 (5) +0x00fc0| 73 71 6c 69 74 65| sqlite| [1]: "sqlite_autoindex_overflow_test_1" value 0xfca-0xfe9.7 (32) +0x00fd0|5f 61 75 74 6f 69 6e 64 65 78 5f 6f 76 65 72 66|_autoindex_overf| +0x00fe0|6c 6f 77 5f 74 65 73 74 5f 31 |low_test_1 | +0x00fe0| 6f 76 65 72 66 6c| overfl| [2]: "overflow_test" value 0xfea-0xff6.7 (13) +0x00ff0|6f 77 5f 74 65 73 74 |ow_test | +0x00ff0| 03 | . | [3]: 3 value 0xff7-0xff7.7 (1) + | | | [4]: null value 0xff8-NA (0) + | | | freeblocks[0:1]: 0xff8-0xff9.7 (2) + | | | [0]{}: freeblock 0xff8-0xff9.7 (2) +0x00ff0| 00 00 | .. | next_offset: 0 0xff8-0xff9.7 (2) + | | | [2]{}: page 0x1000-0x3e25.7 (11814) +0x01000|0d |. | type: "table_leaf" (13) 0x1000-0x1000.7 (1) +0x01000| 00 00 | .. | start_freeblocks: 0 0x1001-0x1002.7 (2) +0x01000| 00 01 | .. | page_cells: 1 0x1003-0x1004.7 (2) +0x01000| 0e 10 | .. | cell_start: 3600 0x1005-0x1006.7 (2) +0x01000| 00 | . | cell_fragments: 0 0x1007-0x1007.7 (1) + | | | cells_pointers[0:1]: 0x1008-0x1009.7 (2) +0x01000| 0e 10 | .. | [0]: 3600 pointer 0x1008-0x1009.7 (2) + | | | cells[0:1]: 0x1e10-0x3e25.7 (8214) + | | | [0]{}: cell 0x1e10-0x3e25.7 (8214) + | | | payload{}: 0x0-0x100a.7 (4107) + 0x0000|04 |. | length: 4 0x0-0x0.7 (1) + | | | serials[0:2]: 0x1-0x3.7 (3) + 0x0000| 01 | . | [0]: 1 serial (int8) 0x1-0x1.7 (1) + 0x0000| c0 19 | .. | [1]: 8217 serial (text) 0x2-0x3.7 (2) + | | | contents[0:2]: 0x4-0x100a.7 (4103) + 0x0000| 7b | { | [0]: 123 value 0x4-0x4.7 (1) + 0x0000| 41 42 42 42 42 42 42 42 42 42 42| ABBBBBBBBBB| [1]: "ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"... value 0x5-0x100a.7 (4102) + 0x0010|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| + * |until 0x100a.7 (end) (4102) | | +0x01e10|a0 0b |.. | payload_len: 4107 0x1e10-0x1e11.7 (2) +0x01e10| 01 | . | rowid: 1 0x1e12-0x1e12.7 (1) + | | | overflow_pages[0:2]: 0x1e13-0x3e25.7 (8211) + | | | [0]{}: overflow_page 0x1e13-0x1fff.7 (493) +0x01e10| 04 01 c0 19 7b 41 42 42 42 42 42 42 42| ....{ABBBBBBB| data: raw bits 0x1e13-0x1ffb.7 (489) +0x01e20|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| +* |until 0x1ffb.7 (489) | | +0x01ff0| 00 00 00 04| ....| next_page: 4 0x1ffc-0x1fff.7 (4) + | | | [1]{}: overflow_page 0x3000-0x3e25.7 (3622) +0x03000|00 00 00 00 |.... | next_page: 0 0x3000-0x3003.7 (4) +0x03000| 42 42 42 42 42 42 42 42 42 42 42 42| BBBBBBBBBBBB| data: raw bits 0x3004-0x3e25.7 (3618) +0x03010|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| +* |until 0x3e25.7 (3618) | | + | | | [3]{}: page 0x2000-0x2fff.7 (4096) +0x02000|0a |. | type: "index_leaf" (10) 0x2000-0x2000.7 (1) +0x02000| 00 00 | .. | start_freeblocks: 0 0x2001-0x2002.7 (2) +0x02000| 00 01 | .. | page_cells: 1 0x2003-0x2004.7 (2) +0x02000| 0f fb | .. | cell_start: 4091 0x2005-0x2006.7 (2) +0x02000| 00 | . | cell_fragments: 0 0x2007-0x2007.7 (1) + | | | cells_pointers[0:1]: 0x2008-0x2009.7 (2) +0x02000| 0f fb | .. | [0]: 4091 pointer 0x2008-0x2009.7 (2) + | | | cells[0:1]: 0x2ffb-0x2fff.7 (5) + | | | [0]{}: cell 0x2ffb-0x2fff.7 (5) +0x02ff0| 04 | . | payload_len: 4 0x2ffb-0x2ffb.7 (1) + | | | payload{}: 0x2ffc-0x2fff.7 (4) +0x02ff0| 03 | . | length: 3 0x2ffc-0x2ffc.7 (1) + | | | serials[0:2]: 0x2ffd-0x2ffe.7 (2) +0x02ff0| 01 | . | [0]: 1 serial (int8) 0x2ffd-0x2ffd.7 (1) +0x02ff0| 09 | . | [1]: 9 serial (one) 0x2ffe-0x2ffe.7 (1) + | | | contents[0:2]: 0x2fff-0x2fff.7 (1) +0x02ff0| 7b| {| [0]: 123 value 0x2fff-0x2fff.7 (1) + | | | [1]: 1 value 0x3000-NA (0) + | | | [4]{}: page 0x3000-0x3ffc.7 (4093) +0x03000|00 |. | type: 0 0x3000-0x3000.7 (1) +0x03000| 00 00 00 42 42 42 42 42 42 42 42 42 42 42 42| ...BBBBBBBBBBBB| data: raw bits 0x3001-0x3ffc.7 (4092) +0x03010|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| +* |until 0x3ffc.7 (4092) | | +0x00070|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| unknown0: raw bits 0x70-0xf4c.7 (3805) +* |until 0xf4c.7 (3805) | | +0x00ff0| 00 08 00 00 00 00| ......| unknown1: raw bits 0xffa-0xfff.7 (6) +0x01000| 00 00 00 00 00 00| ......| unknown2: raw bits 0x100a-0x1e0f.7 (3590) +0x01010|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1e0f.7 (3590) | | +0x02000| 00 00 00 00 00 00| ......| unknown3: raw bits 0x200a-0x2ffa.7 (4081) +0x02010|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x2ffa.7 (4081) | | +0x03ff0| 00 00 00| ...| unknown4: raw bits 0x3ffd-0x3fff.7 (3) +{ + "overflow_test": [ + [ + 123, + "ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC" + ] + ] +} diff --git a/format/sqlite3/testdata/types.sql b/format/sqlite3/testdata/types.sql new file mode 100644 index 000000000..fe87ffc36 --- /dev/null +++ b/format/sqlite3/testdata/types.sql @@ -0,0 +1,16 @@ +CREATE TABLE types ( + cint INT PRIMARY KEY, + cinteger INTEGER, + cvarchar VARCHAR(30), + ctext TEXT, + creal REAL, + cblob BLOB, + ctimestamp TIMESTAMP +); + +INSERT INTO types VALUES(0, 0, 'var1', 'text1', 0.5, "blob1", '2022-03-10 10:00:00'); +INSERT INTO types VALUES(1, 1, 'var2', 'test2', 1.5, "blob2", '2022-03-10 10:00:01'); +INSERT INTO types VALUES(128, 128, 'var3', 'test3', 128.5, "blob3", '2022-03-10 10:00:02'); +INSERT INTO types VALUES(-128, 128, 'var3', 'test3', -128.5, "blob3", '2022-03-10 10:00:03'); +INSERT INTO types VALUES(9223372036854775807, 9223372036854775807, 'var4', 'test4', 9223372036854775807.5, "blob4", '2022-03-10 10:00:04'); +INSERT INTO types VALUES(-9223372036854775808, -9223372036854775808, 'var5', 'test5', -9223372036854775808.5, "blob5", '2022-03-10 10:00:05'); diff --git a/format/sqlite3/testdata/types.sql.db b/format/sqlite3/testdata/types.sql.db new file mode 100644 index 000000000..4c851a5bc Binary files /dev/null and b/format/sqlite3/testdata/types.sql.db differ diff --git a/format/sqlite3/testdata/types.sql.fqtest b/format/sqlite3/testdata/types.sql.fqtest new file mode 100644 index 000000000..146129d1a --- /dev/null +++ b/format/sqlite3/testdata/types.sql.fqtest @@ -0,0 +1,377 @@ +$ fq 'dv, torepr' types.sql.db + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: types.sql.db (sqlite3) 0x0-0x2fff.7 (12288) + | | | header{}: 0x0-0x63.7 (100) +0x0000|53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00|SQLite format 3.| magic: "SQLite format 3\x00" (valid) 0x0-0xf.7 (16) +0x0010|10 00 |.. | page_size: 4096 0x10-0x11.7 (2) +0x0010| 01 | . | write_version: "legacy" (1) 0x12-0x12.7 (1) +0x0010| 01 | . | read_version: "legacy" (1) 0x13-0x13.7 (1) +0x0010| 00 | . | unused_space: 0 0x14-0x14.7 (1) +0x0010| 40 | @ | maximum_embedded_payload_fraction: 64 0x15-0x15.7 (1) +0x0010| 20 | | minimum_embedded_payload_fraction: 32 0x16-0x16.7 (1) +0x0010| 20 | | leaf_payload_fraction: 32 0x17-0x17.7 (1) +0x0010| 00 00 00 07 | .... | file_change_counter: 7 0x18-0x1b.7 (4) +0x0010| 00 00 00 03| ....| database_size_pages: 3 0x1c-0x1f.7 (4) +0x0020|00 00 00 00 |.... | page_number_freelist: 0 0x20-0x23.7 (4) +0x0020| 00 00 00 00 | .... | total_number_freelist: 0 0x24-0x27.7 (4) +0x0020| 00 00 00 01 | .... | schema_cookie: 1 0x28-0x2b.7 (4) +0x0020| 00 00 00 04| ....| schema_format_number: 4 0x2c-0x2f.7 (4) +0x0030|00 00 00 00 |.... | default_page_cache_size: 0 0x30-0x33.7 (4) +0x0030| 00 00 00 00 | .... | page_number_largest_root_btree: 0 0x34-0x37.7 (4) +0x0030| 00 00 00 01 | .... | text_encoding: "utf8" (1) 0x38-0x3b.7 (4) +0x0030| 00 00 00 00| ....| user_version: 0 0x3c-0x3f.7 (4) +0x0040|00 00 00 00 |.... | incremental_vacuum_mode: 0 0x40-0x43.7 (4) +0x0040| 00 00 00 00 | .... | application_id: 0 0x44-0x47.7 (4) +0x0040| 00 00 00 00 00 00 00 00| ........| reserved: raw bits (all zero) 0x48-0x5b.7 (20) +0x0050|00 00 00 00 00 00 00 00 00 00 00 00 |............ | +0x0050| 00 00 00 07| ....| version_valid_for: 7 0x5c-0x5f.7 (4) +0x0060|00 2e 53 60 |..S` | sqlite_version_number: 3036000 0x60-0x63.7 (4) + | | | pages[0:4]: 0x64-0x2fff.7 (12188) + | | | [0]{}: page 0x64-NA (0) + | | | type: "page0_index_fill" 0x64-NA (0) + | | | [1]{}: page 0x64-0xff9.7 (3990) +0x0060| 0d | . | type: "table_leaf" (13) 0x64-0x64.7 (1) +0x0060| 0f f8 | .. | start_freeblocks: 4088 0x65-0x66.7 (2) +0x0060| 00 02 | .. | page_cells: 2 0x67-0x68.7 (2) +0x0060| 0f 0a | .. | cell_start: 3850 0x69-0x6a.7 (2) +0x0060| 00 | . | cell_fragments: 0 0x6b-0x6b.7 (1) + | | | cells_pointers[0:2]: 0x6c-0x6f.7 (4) +0x0060| 0f 0a | .. | [0]: 3850 pointer 0x6c-0x6d.7 (2) +0x0060| 0f cd| ..| [1]: 4045 pointer 0x6e-0x6f.7 (2) + | | | cells[0:2]: 0xf0a-0xff7.7 (238) + | | | [0]{}: cell 0xf0a-0xfcc.7 (195) +0x0f00| 81 40 | .@ | payload_len: 192 0xf0a-0xf0b.7 (2) +0x0f00| 01 | . | rowid: 1 0xf0c-0xf0c.7 (1) + | | | payload{}: 0xf0d-0xfcc.7 (192) +0x0f00| 07 | . | length: 7 0xf0d-0xf0d.7 (1) + | | | serials[0:5]: 0xf0e-0xf13.7 (6) +0x0f00| 17 | . | [0]: 23 serial (text) 0xf0e-0xf0e.7 (1) +0x0f00| 17| .| [1]: 23 serial (text) 0xf0f-0xf0f.7 (1) +0x0f10|17 |. | [2]: 23 serial (text) 0xf10-0xf10.7 (1) +0x0f10| 01 | . | [3]: 1 serial (int8) 0xf11-0xf11.7 (1) +0x0f10| 82 5f | ._ | [4]: 351 serial (text) 0xf12-0xf13.7 (2) + | | | contents[0:5]: 0xf14-0xfcc.7 (185) +0x0f10| 74 61 62 6c 65 | table | [0]: "table" value 0xf14-0xf18.7 (5) +0x0f10| 74 79 70 65 73 | types | [1]: "types" value 0xf19-0xf1d.7 (5) +0x0f10| 74 79| ty| [2]: "types" value 0xf1e-0xf22.7 (5) +0x0f20|70 65 73 |pes | +0x0f20| 02 | . | [3]: 2 value 0xf23-0xf23.7 (1) +0x0f20| 43 52 45 41 54 45 20 54 41 42 4c 45| CREATE TABLE| [4]: "CREATE TABLE types (\n cint INT PRIMARY KEY,\n "... value 0xf24-0xfcc.7 (169) +0x0f30|20 74 79 70 65 73 20 28 0a 20 20 20 20 63 69 6e| types (. cin| +* |until 0xfcc.7 (169) | | + | | | [1]{}: cell 0xfcd-0xff7.7 (43) +0x0fc0| 29 | ) | payload_len: 41 0xfcd-0xfcd.7 (1) +0x0fc0| 02 | . | rowid: 2 0xfce-0xfce.7 (1) + | | | payload{}: 0xfcf-0xff7.7 (41) +0x0fc0| 06| .| length: 6 0xfcf-0xfcf.7 (1) + | | | serials[0:5]: 0xfd0-0xfd4.7 (5) +0x0fd0|17 |. | [0]: 23 serial (text) 0xfd0-0xfd0.7 (1) +0x0fd0| 3d | = | [1]: 61 serial (text) 0xfd1-0xfd1.7 (1) +0x0fd0| 17 | . | [2]: 23 serial (text) 0xfd2-0xfd2.7 (1) +0x0fd0| 01 | . | [3]: 1 serial (int8) 0xfd3-0xfd3.7 (1) +0x0fd0| 00 | . | [4]: 0 serial (null) 0xfd4-0xfd4.7 (1) + | | | contents[0:5]: 0xfd5-0xff7.7 (35) +0x0fd0| 69 6e 64 65 78 | index | [0]: "index" value 0xfd5-0xfd9.7 (5) +0x0fd0| 73 71 6c 69 74 65| sqlite| [1]: "sqlite_autoindex_types_1" value 0xfda-0xff1.7 (24) +0x0fe0|5f 61 75 74 6f 69 6e 64 65 78 5f 74 79 70 65 73|_autoindex_types| +0x0ff0|5f 31 |_1 | +0x0ff0| 74 79 70 65 73 | types | [2]: "types" value 0xff2-0xff6.7 (5) +0x0ff0| 03 | . | [3]: 3 value 0xff7-0xff7.7 (1) + | | | [4]: null value 0xff8-NA (0) + | | | freeblocks[0:1]: 0xff8-0xff9.7 (2) + | | | [0]{}: freeblock 0xff8-0xff9.7 (2) +0x0ff0| 00 00 | .. | next_offset: 0 0xff8-0xff9.7 (2) + | | | [2]{}: page 0x1000-0x1fff.7 (4096) +0x1000|0d |. | type: "table_leaf" (13) 0x1000-0x1000.7 (1) +0x1000| 00 00 | .. | start_freeblocks: 0 0x1001-0x1002.7 (2) +0x1000| 00 06 | .. | page_cells: 6 0x1003-0x1004.7 (2) +0x1000| 0e a7 | .. | cell_start: 3751 0x1005-0x1006.7 (2) +0x1000| 00 | . | cell_fragments: 0 0x1007-0x1007.7 (1) + | | | cells_pointers[0:6]: 0x1008-0x1013.7 (12) +0x1000| 0f cd | .. | [0]: 4045 pointer 0x1008-0x1009.7 (2) +0x1000| 0f 9a | .. | [1]: 3994 pointer 0x100a-0x100b.7 (2) +0x1000| 0f 63 | .c | [2]: 3939 pointer 0x100c-0x100d.7 (2) +0x1000| 0f 2d| .-| [3]: 3885 pointer 0x100e-0x100f.7 (2) +0x1010|0e ea |.. | [4]: 3818 pointer 0x1010-0x1011.7 (2) +0x1010| 0e a7 | .. | [5]: 3751 pointer 0x1012-0x1013.7 (2) + | | | cells[0:6]: 0x1ea7-0x1fff.7 (345) + | | | [0]{}: cell 0x1fcd-0x1fff.7 (51) +0x1fc0| 31 | 1 | payload_len: 49 0x1fcd-0x1fcd.7 (1) +0x1fc0| 01 | . | rowid: 1 0x1fce-0x1fce.7 (1) + | | | payload{}: 0x1fcf-0x1fff.7 (49) +0x1fc0| 08| .| length: 8 0x1fcf-0x1fcf.7 (1) + | | | serials[0:7]: 0x1fd0-0x1fd6.7 (7) +0x1fd0|08 |. | [0]: 8 serial (zero) 0x1fd0-0x1fd0.7 (1) +0x1fd0| 08 | . | [1]: 8 serial (zero) 0x1fd1-0x1fd1.7 (1) +0x1fd0| 15 | . | [2]: 21 serial (text) 0x1fd2-0x1fd2.7 (1) +0x1fd0| 17 | . | [3]: 23 serial (text) 0x1fd3-0x1fd3.7 (1) +0x1fd0| 07 | . | [4]: 7 serial (float64) 0x1fd4-0x1fd4.7 (1) +0x1fd0| 17 | . | [5]: 23 serial (text) 0x1fd5-0x1fd5.7 (1) +0x1fd0| 33 | 3 | [6]: 51 serial (text) 0x1fd6-0x1fd6.7 (1) + | | | contents[0:7]: 0x1fd7-0x1fff.7 (41) + | | | [0]: 0 value 0x1fd7-NA (0) + | | | [1]: 0 value 0x1fd7-NA (0) +0x1fd0| 76 61 72 31 | var1 | [2]: "var1" value 0x1fd7-0x1fda.7 (4) +0x1fd0| 74 65 78 74 31| text1| [3]: "text1" value 0x1fdb-0x1fdf.7 (5) +0x1fe0|3f e0 00 00 00 00 00 00 |?....... | [4]: 0.5 value 0x1fe0-0x1fe7.7 (8) +0x1fe0| 62 6c 6f 62 31 | blob1 | [5]: "blob1" value 0x1fe8-0x1fec.7 (5) +0x1fe0| 32 30 32| 202| [6]: "2022-03-10 10:00:00" value 0x1fed-0x1fff.7 (19) +0x1ff0|32 2d 30 33 2d 31 30 20 31 30 3a 30 30 3a 30 30|2-03-10 10:00:00| + | | | [1]{}: cell 0x1f9a-0x1fcc.7 (51) +0x1f90| 31 | 1 | payload_len: 49 0x1f9a-0x1f9a.7 (1) +0x1f90| 02 | . | rowid: 2 0x1f9b-0x1f9b.7 (1) + | | | payload{}: 0x1f9c-0x1fcc.7 (49) +0x1f90| 08 | . | length: 8 0x1f9c-0x1f9c.7 (1) + | | | serials[0:7]: 0x1f9d-0x1fa3.7 (7) +0x1f90| 09 | . | [0]: 9 serial (one) 0x1f9d-0x1f9d.7 (1) +0x1f90| 09 | . | [1]: 9 serial (one) 0x1f9e-0x1f9e.7 (1) +0x1f90| 15| .| [2]: 21 serial (text) 0x1f9f-0x1f9f.7 (1) +0x1fa0|17 |. | [3]: 23 serial (text) 0x1fa0-0x1fa0.7 (1) +0x1fa0| 07 | . | [4]: 7 serial (float64) 0x1fa1-0x1fa1.7 (1) +0x1fa0| 17 | . | [5]: 23 serial (text) 0x1fa2-0x1fa2.7 (1) +0x1fa0| 33 | 3 | [6]: 51 serial (text) 0x1fa3-0x1fa3.7 (1) + | | | contents[0:7]: 0x1fa4-0x1fcc.7 (41) + | | | [0]: 1 value 0x1fa4-NA (0) + | | | [1]: 1 value 0x1fa4-NA (0) +0x1fa0| 76 61 72 32 | var2 | [2]: "var2" value 0x1fa4-0x1fa7.7 (4) +0x1fa0| 74 65 73 74 32 | test2 | [3]: "test2" value 0x1fa8-0x1fac.7 (5) +0x1fa0| 3f f8 00| ?..| [4]: 1.5 value 0x1fad-0x1fb4.7 (8) +0x1fb0|00 00 00 00 00 |..... | +0x1fb0| 62 6c 6f 62 32 | blob2 | [5]: "blob2" value 0x1fb5-0x1fb9.7 (5) +0x1fb0| 32 30 32 32 2d 30| 2022-0| [6]: "2022-03-10 10:00:01" value 0x1fba-0x1fcc.7 (19) +0x1fc0|33 2d 31 30 20 31 30 3a 30 30 3a 30 31 |3-10 10:00:01 | + | | | [2]{}: cell 0x1f63-0x1f99.7 (55) +0x1f60| 35 | 5 | payload_len: 53 0x1f63-0x1f63.7 (1) +0x1f60| 03 | . | rowid: 3 0x1f64-0x1f64.7 (1) + | | | payload{}: 0x1f65-0x1f99.7 (53) +0x1f60| 08 | . | length: 8 0x1f65-0x1f65.7 (1) + | | | serials[0:7]: 0x1f66-0x1f6c.7 (7) +0x1f60| 02 | . | [0]: 2 serial (int16) 0x1f66-0x1f66.7 (1) +0x1f60| 02 | . | [1]: 2 serial (int16) 0x1f67-0x1f67.7 (1) +0x1f60| 15 | . | [2]: 21 serial (text) 0x1f68-0x1f68.7 (1) +0x1f60| 17 | . | [3]: 23 serial (text) 0x1f69-0x1f69.7 (1) +0x1f60| 07 | . | [4]: 7 serial (float64) 0x1f6a-0x1f6a.7 (1) +0x1f60| 17 | . | [5]: 23 serial (text) 0x1f6b-0x1f6b.7 (1) +0x1f60| 33 | 3 | [6]: 51 serial (text) 0x1f6c-0x1f6c.7 (1) + | | | contents[0:7]: 0x1f6d-0x1f99.7 (45) +0x1f60| 00 80 | .. | [0]: 128 value 0x1f6d-0x1f6e.7 (2) +0x1f60| 00| .| [1]: 128 value 0x1f6f-0x1f70.7 (2) +0x1f70|80 |. | +0x1f70| 76 61 72 33 | var3 | [2]: "var3" value 0x1f71-0x1f74.7 (4) +0x1f70| 74 65 73 74 33 | test3 | [3]: "test3" value 0x1f75-0x1f79.7 (5) +0x1f70| 40 60 10 00 00 00| @`....| [4]: 128.5 value 0x1f7a-0x1f81.7 (8) +0x1f80|00 00 |.. | +0x1f80| 62 6c 6f 62 33 | blob3 | [5]: "blob3" value 0x1f82-0x1f86.7 (5) +0x1f80| 32 30 32 32 2d 30 33 2d 31| 2022-03-1| [6]: "2022-03-10 10:00:02" value 0x1f87-0x1f99.7 (19) +0x1f90|30 20 31 30 3a 30 30 3a 30 32 |0 10:00:02 | + | | | [3]{}: cell 0x1f2d-0x1f62.7 (54) +0x1f20| 34 | 4 | payload_len: 52 0x1f2d-0x1f2d.7 (1) +0x1f20| 04 | . | rowid: 4 0x1f2e-0x1f2e.7 (1) + | | | payload{}: 0x1f2f-0x1f62.7 (52) +0x1f20| 08| .| length: 8 0x1f2f-0x1f2f.7 (1) + | | | serials[0:7]: 0x1f30-0x1f36.7 (7) +0x1f30|01 |. | [0]: 1 serial (int8) 0x1f30-0x1f30.7 (1) +0x1f30| 02 | . | [1]: 2 serial (int16) 0x1f31-0x1f31.7 (1) +0x1f30| 15 | . | [2]: 21 serial (text) 0x1f32-0x1f32.7 (1) +0x1f30| 17 | . | [3]: 23 serial (text) 0x1f33-0x1f33.7 (1) +0x1f30| 07 | . | [4]: 7 serial (float64) 0x1f34-0x1f34.7 (1) +0x1f30| 17 | . | [5]: 23 serial (text) 0x1f35-0x1f35.7 (1) +0x1f30| 33 | 3 | [6]: 51 serial (text) 0x1f36-0x1f36.7 (1) + | | | contents[0:7]: 0x1f37-0x1f62.7 (44) +0x1f30| 80 | . | [0]: -128 value 0x1f37-0x1f37.7 (1) +0x1f30| 00 80 | .. | [1]: 128 value 0x1f38-0x1f39.7 (2) +0x1f30| 76 61 72 33 | var3 | [2]: "var3" value 0x1f3a-0x1f3d.7 (4) +0x1f30| 74 65| te| [3]: "test3" value 0x1f3e-0x1f42.7 (5) +0x1f40|73 74 33 |st3 | +0x1f40| c0 60 10 00 00 00 00 00 | .`...... | [4]: -128.5 value 0x1f43-0x1f4a.7 (8) +0x1f40| 62 6c 6f 62 33| blob3| [5]: "blob3" value 0x1f4b-0x1f4f.7 (5) +0x1f50|32 30 32 32 2d 30 33 2d 31 30 20 31 30 3a 30 30|2022-03-10 10:00| [6]: "2022-03-10 10:00:03" value 0x1f50-0x1f62.7 (19) +0x1f60|3a 30 33 |:03 | + | | | [4]{}: cell 0x1eea-0x1f2c.7 (67) +0x1ee0| 41 | A | payload_len: 65 0x1eea-0x1eea.7 (1) +0x1ee0| 05 | . | rowid: 5 0x1eeb-0x1eeb.7 (1) + | | | payload{}: 0x1eec-0x1f2c.7 (65) +0x1ee0| 08 | . | length: 8 0x1eec-0x1eec.7 (1) + | | | serials[0:7]: 0x1eed-0x1ef3.7 (7) +0x1ee0| 06 | . | [0]: 6 serial (int64) 0x1eed-0x1eed.7 (1) +0x1ee0| 06 | . | [1]: 6 serial (int64) 0x1eee-0x1eee.7 (1) +0x1ee0| 15| .| [2]: 21 serial (text) 0x1eef-0x1eef.7 (1) +0x1ef0|17 |. | [3]: 23 serial (text) 0x1ef0-0x1ef0.7 (1) +0x1ef0| 07 | . | [4]: 7 serial (float64) 0x1ef1-0x1ef1.7 (1) +0x1ef0| 17 | . | [5]: 23 serial (text) 0x1ef2-0x1ef2.7 (1) +0x1ef0| 33 | 3 | [6]: 51 serial (text) 0x1ef3-0x1ef3.7 (1) + | | | contents[0:7]: 0x1ef4-0x1f2c.7 (57) +0x1ef0| 7f ff ff ff ff ff ff ff | ........ | [0]: 9223372036854775807 value 0x1ef4-0x1efb.7 (8) +0x1ef0| 7f ff ff ff| ....| [1]: 9223372036854775807 value 0x1efc-0x1f03.7 (8) +0x1f00|ff ff ff ff |.... | +0x1f00| 76 61 72 34 | var4 | [2]: "var4" value 0x1f04-0x1f07.7 (4) +0x1f00| 74 65 73 74 34 | test4 | [3]: "test4" value 0x1f08-0x1f0c.7 (5) +0x1f00| 43 e0 00| C..| [4]: 9.223372036854776e+18 value 0x1f0d-0x1f14.7 (8) +0x1f10|00 00 00 00 00 |..... | +0x1f10| 62 6c 6f 62 34 | blob4 | [5]: "blob4" value 0x1f15-0x1f19.7 (5) +0x1f10| 32 30 32 32 2d 30| 2022-0| [6]: "2022-03-10 10:00:04" value 0x1f1a-0x1f2c.7 (19) +0x1f20|33 2d 31 30 20 31 30 3a 30 30 3a 30 34 |3-10 10:00:04 | + | | | [5]{}: cell 0x1ea7-0x1ee9.7 (67) +0x1ea0| 41 | A | payload_len: 65 0x1ea7-0x1ea7.7 (1) +0x1ea0| 06 | . | rowid: 6 0x1ea8-0x1ea8.7 (1) + | | | payload{}: 0x1ea9-0x1ee9.7 (65) +0x1ea0| 08 | . | length: 8 0x1ea9-0x1ea9.7 (1) + | | | serials[0:7]: 0x1eaa-0x1eb0.7 (7) +0x1ea0| 06 | . | [0]: 6 serial (int64) 0x1eaa-0x1eaa.7 (1) +0x1ea0| 06 | . | [1]: 6 serial (int64) 0x1eab-0x1eab.7 (1) +0x1ea0| 15 | . | [2]: 21 serial (text) 0x1eac-0x1eac.7 (1) +0x1ea0| 17 | . | [3]: 23 serial (text) 0x1ead-0x1ead.7 (1) +0x1ea0| 07 | . | [4]: 7 serial (float64) 0x1eae-0x1eae.7 (1) +0x1ea0| 17| .| [5]: 23 serial (text) 0x1eaf-0x1eaf.7 (1) +0x1eb0|33 |3 | [6]: 51 serial (text) 0x1eb0-0x1eb0.7 (1) + | | | contents[0:7]: 0x1eb1-0x1ee9.7 (57) +0x1eb0| 80 00 00 00 00 00 00 00 | ........ | [0]: -9223372036854775808 value 0x1eb1-0x1eb8.7 (8) +0x1eb0| 80 00 00 00 00 00 00| .......| [1]: -9223372036854775808 value 0x1eb9-0x1ec0.7 (8) +0x1ec0|00 |. | +0x1ec0| 76 61 72 35 | var5 | [2]: "var5" value 0x1ec1-0x1ec4.7 (4) +0x1ec0| 74 65 73 74 35 | test5 | [3]: "test5" value 0x1ec5-0x1ec9.7 (5) +0x1ec0| c3 e0 00 00 00 00| ......| [4]: -9.223372036854776e+18 value 0x1eca-0x1ed1.7 (8) +0x1ed0|00 00 |.. | +0x1ed0| 62 6c 6f 62 35 | blob5 | [5]: "blob5" value 0x1ed2-0x1ed6.7 (5) +0x1ed0| 32 30 32 32 2d 30 33 2d 31| 2022-03-1| [6]: "2022-03-10 10:00:05" value 0x1ed7-0x1ee9.7 (19) +0x1ee0|30 20 31 30 3a 30 30 3a 30 35 |0 10:00:05 | + | | | [3]{}: page 0x2000-0x2fff.7 (4096) +0x2000|0a |. | type: "index_leaf" (10) 0x2000-0x2000.7 (1) +0x2000| 00 00 | .. | start_freeblocks: 0 0x2001-0x2002.7 (2) +0x2000| 00 06 | .. | page_cells: 6 0x2003-0x2004.7 (2) +0x2000| 0f d0 | .. | cell_start: 4048 0x2005-0x2006.7 (2) +0x2000| 00 | . | cell_fragments: 0 0x2007-0x2007.7 (1) + | | | cells_pointers[0:6]: 0x2008-0x2013.7 (12) +0x2000| 0f d0 | .. | [0]: 4048 pointer 0x2008-0x2009.7 (2) +0x2000| 0f ea | .. | [1]: 4074 pointer 0x200a-0x200b.7 (2) +0x2000| 0f fc | .. | [2]: 4092 pointer 0x200c-0x200d.7 (2) +0x2000| 0f f7| ..| [3]: 4087 pointer 0x200e-0x200f.7 (2) +0x2010|0f f0 |.. | [4]: 4080 pointer 0x2010-0x2011.7 (2) +0x2010| 0f dd | .. | [5]: 4061 pointer 0x2012-0x2013.7 (2) + | | | cells[0:6]: 0x2fd0-0x2fff.7 (48) + | | | [0]{}: cell 0x2fd0-0x2fdc.7 (13) +0x2fd0|0c |. | payload_len: 12 0x2fd0-0x2fd0.7 (1) + | | | payload{}: 0x2fd1-0x2fdc.7 (12) +0x2fd0| 03 | . | length: 3 0x2fd1-0x2fd1.7 (1) + | | | serials[0:2]: 0x2fd2-0x2fd3.7 (2) +0x2fd0| 06 | . | [0]: 6 serial (int64) 0x2fd2-0x2fd2.7 (1) +0x2fd0| 01 | . | [1]: 1 serial (int8) 0x2fd3-0x2fd3.7 (1) + | | | contents[0:2]: 0x2fd4-0x2fdc.7 (9) +0x2fd0| 80 00 00 00 00 00 00 00 | ........ | [0]: -9223372036854775808 value 0x2fd4-0x2fdb.7 (8) +0x2fd0| 06 | . | [1]: 6 value 0x2fdc-0x2fdc.7 (1) + | | | [1]{}: cell 0x2fea-0x2fef.7 (6) +0x2fe0| 05 | . | payload_len: 5 0x2fea-0x2fea.7 (1) + | | | payload{}: 0x2feb-0x2fef.7 (5) +0x2fe0| 03 | . | length: 3 0x2feb-0x2feb.7 (1) + | | | serials[0:2]: 0x2fec-0x2fed.7 (2) +0x2fe0| 01 | . | [0]: 1 serial (int8) 0x2fec-0x2fec.7 (1) +0x2fe0| 01 | . | [1]: 1 serial (int8) 0x2fed-0x2fed.7 (1) + | | | contents[0:2]: 0x2fee-0x2fef.7 (2) +0x2fe0| 80 | . | [0]: -128 value 0x2fee-0x2fee.7 (1) +0x2fe0| 04| .| [1]: 4 value 0x2fef-0x2fef.7 (1) + | | | [2]{}: cell 0x2ffc-0x2fff.7 (4) +0x2ff0| 03 | . | payload_len: 3 0x2ffc-0x2ffc.7 (1) + | | | payload{}: 0x2ffd-0x2fff.7 (3) +0x2ff0| 03 | . | length: 3 0x2ffd-0x2ffd.7 (1) + | | | serials[0:2]: 0x2ffe-0x2fff.7 (2) +0x2ff0| 08 | . | [0]: 8 serial (zero) 0x2ffe-0x2ffe.7 (1) +0x2ff0| 09| .| [1]: 9 serial (one) 0x2fff-0x2fff.7 (1) + | | | contents[0:2]: 0x3000-NA (0) + | | | [0]: 0 value 0x3000-NA (0) + | | | [1]: 1 value 0x3000-NA (0) + | | | [3]{}: cell 0x2ff7-0x2ffb.7 (5) +0x2ff0| 04 | . | payload_len: 4 0x2ff7-0x2ff7.7 (1) + | | | payload{}: 0x2ff8-0x2ffb.7 (4) +0x2ff0| 03 | . | length: 3 0x2ff8-0x2ff8.7 (1) + | | | serials[0:2]: 0x2ff9-0x2ffa.7 (2) +0x2ff0| 09 | . | [0]: 9 serial (one) 0x2ff9-0x2ff9.7 (1) +0x2ff0| 01 | . | [1]: 1 serial (int8) 0x2ffa-0x2ffa.7 (1) + | | | contents[0:2]: 0x2ffb-0x2ffb.7 (1) + | | | [0]: 1 value 0x2ffb-NA (0) +0x2ff0| 02 | . | [1]: 2 value 0x2ffb-0x2ffb.7 (1) + | | | [4]{}: cell 0x2ff0-0x2ff6.7 (7) +0x2ff0|06 |. | payload_len: 6 0x2ff0-0x2ff0.7 (1) + | | | payload{}: 0x2ff1-0x2ff6.7 (6) +0x2ff0| 03 | . | length: 3 0x2ff1-0x2ff1.7 (1) + | | | serials[0:2]: 0x2ff2-0x2ff3.7 (2) +0x2ff0| 02 | . | [0]: 2 serial (int16) 0x2ff2-0x2ff2.7 (1) +0x2ff0| 01 | . | [1]: 1 serial (int8) 0x2ff3-0x2ff3.7 (1) + | | | contents[0:2]: 0x2ff4-0x2ff6.7 (3) +0x2ff0| 00 80 | .. | [0]: 128 value 0x2ff4-0x2ff5.7 (2) +0x2ff0| 03 | . | [1]: 3 value 0x2ff6-0x2ff6.7 (1) + | | | [5]{}: cell 0x2fdd-0x2fe9.7 (13) +0x2fd0| 0c | . | payload_len: 12 0x2fdd-0x2fdd.7 (1) + | | | payload{}: 0x2fde-0x2fe9.7 (12) +0x2fd0| 03 | . | length: 3 0x2fde-0x2fde.7 (1) + | | | serials[0:2]: 0x2fdf-0x2fe0.7 (2) +0x2fd0| 06| .| [0]: 6 serial (int64) 0x2fdf-0x2fdf.7 (1) +0x2fe0|01 |. | [1]: 1 serial (int8) 0x2fe0-0x2fe0.7 (1) + | | | contents[0:2]: 0x2fe1-0x2fe9.7 (9) +0x2fe0| 7f ff ff ff ff ff ff ff | ........ | [0]: 9223372036854775807 value 0x2fe1-0x2fe8.7 (8) +0x2fe0| 05 | . | [1]: 5 value 0x2fe9-0x2fe9.7 (1) +0x0070|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| unknown0: raw bits 0x70-0xf09.7 (3738) +* |until 0xf09.7 (3738) | | +0x0ff0| 00 08 00 00 00 00| ......| unknown1: raw bits 0xffa-0xfff.7 (6) +0x1010| 00 00 00 00 00 00 00 00 00 00 00 00| ............| unknown2: raw bits 0x1014-0x1ea6.7 (3731) +0x1020|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1ea6.7 (3731) | | +0x2010| 00 00 00 00 00 00 00 00 00 00 00 00| ............| unknown3: raw bits 0x2014-0x2fcf.7 (4028) +0x2020|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x2fcf.7 (4028) | | +{ + "types": [ + [ + 0, + 0, + "var1", + "text1", + 0.5, + "blob1", + "2022-03-10 10:00:00" + ], + [ + 1, + 1, + "var2", + "test2", + 1.5, + "blob2", + "2022-03-10 10:00:01" + ], + [ + 128, + 128, + "var3", + "test3", + 128.5, + "blob3", + "2022-03-10 10:00:02" + ], + [ + -128, + 128, + "var3", + "test3", + -128.5, + "blob3", + "2022-03-10 10:00:03" + ], + [ + 9223372036854775807, + 9223372036854775807, + "var4", + "test4", + 9223372036854776000, + "blob4", + "2022-03-10 10:00:04" + ], + [ + -9223372036854775808, + -9223372036854775808, + "var5", + "test5", + -9223372036854776000, + "blob5", + "2022-03-10 10:00:05" + ] + ] +} diff --git a/format/sqlite3/testdata/unused_pages.sql b/format/sqlite3/testdata/unused_pages.sql new file mode 100644 index 000000000..41c149d8e --- /dev/null +++ b/format/sqlite3/testdata/unused_pages.sql @@ -0,0 +1,11 @@ +CREATE TABLE aaa ( + cint int primary key, + ctext text +); +INSERT INTO aaa VALUES(1, "1ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC1"); +INSERT INTO aaa VALUES(2, "2ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC2"); +INSERT INTO aaa VALUES(3, "3ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC3"); +INSERT INTO aaa VALUES(4, "4ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC4"); + +DELETE FROM aaa WHERE cint=1; +DELETE FROM aaa WHERE cint=3; diff --git a/format/sqlite3/testdata/unused_pages.sql.db b/format/sqlite3/testdata/unused_pages.sql.db new file mode 100644 index 000000000..c50aab74f Binary files /dev/null and b/format/sqlite3/testdata/unused_pages.sql.db differ diff --git a/format/sqlite3/testdata/unused_pages.sql.fqtest b/format/sqlite3/testdata/unused_pages.sql.fqtest new file mode 100644 index 000000000..2a2ca570a --- /dev/null +++ b/format/sqlite3/testdata/unused_pages.sql.fqtest @@ -0,0 +1,234 @@ +$ fq 'dv, torepr' unused_pages.sql.db + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: unused_pages.sql.db (sqlite3) 0x0-0x6fff.7 (28672) + | | | header{}: 0x0-0x63.7 (100) +0x00000|53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00|SQLite format 3.| magic: "SQLite format 3\x00" (valid) 0x0-0xf.7 (16) +0x00010|10 00 |.. | page_size: 4096 0x10-0x11.7 (2) +0x00010| 01 | . | write_version: "legacy" (1) 0x12-0x12.7 (1) +0x00010| 01 | . | read_version: "legacy" (1) 0x13-0x13.7 (1) +0x00010| 00 | . | unused_space: 0 0x14-0x14.7 (1) +0x00010| 40 | @ | maximum_embedded_payload_fraction: 64 0x15-0x15.7 (1) +0x00010| 20 | | minimum_embedded_payload_fraction: 32 0x16-0x16.7 (1) +0x00010| 20 | | leaf_payload_fraction: 32 0x17-0x17.7 (1) +0x00010| 00 00 00 07 | .... | file_change_counter: 7 0x18-0x1b.7 (4) +0x00010| 00 00 00 07| ....| database_size_pages: 7 0x1c-0x1f.7 (4) +0x00020|00 00 00 04 |.... | page_number_freelist: 4 0x20-0x23.7 (4) +0x00020| 00 00 00 02 | .... | total_number_freelist: 2 0x24-0x27.7 (4) +0x00020| 00 00 00 01 | .... | schema_cookie: 1 0x28-0x2b.7 (4) +0x00020| 00 00 00 04| ....| schema_format_number: 4 0x2c-0x2f.7 (4) +0x00030|00 00 00 00 |.... | default_page_cache_size: 0 0x30-0x33.7 (4) +0x00030| 00 00 00 00 | .... | page_number_largest_root_btree: 0 0x34-0x37.7 (4) +0x00030| 00 00 00 01 | .... | text_encoding: "utf8" (1) 0x38-0x3b.7 (4) +0x00030| 00 00 00 00| ....| user_version: 0 0x3c-0x3f.7 (4) +0x00040|00 00 00 00 |.... | incremental_vacuum_mode: 0 0x40-0x43.7 (4) +0x00040| 00 00 00 00 | .... | application_id: 0 0x44-0x47.7 (4) +0x00040| 00 00 00 00 00 00 00 00| ........| reserved: raw bits (all zero) 0x48-0x5b.7 (20) +0x00050|00 00 00 00 00 00 00 00 00 00 00 00 |............ | +0x00050| 00 00 00 07| ....| version_valid_for: 7 0x5c-0x5f.7 (4) +0x00060|00 2e 53 60 |..S` | sqlite_version_number: 3036000 0x60-0x63.7 (4) + | | | pages[0:8]: 0x64-0x6ffc.7 (28569) + | | | [0]{}: page 0x64-NA (0) + | | | type: "page0_index_fill" 0x64-NA (0) + | | | [1]{}: page 0x64-0xff9.7 (3990) +0x00060| 0d | . | type: "table_leaf" (13) 0x64-0x64.7 (1) +0x00060| 0f f8 | .. | start_freeblocks: 4088 0x65-0x66.7 (2) +0x00060| 00 02 | .. | page_cells: 2 0x67-0x68.7 (2) +0x00060| 0f 7f | .. | cell_start: 3967 0x69-0x6a.7 (2) +0x00060| 00 | . | cell_fragments: 0 0x6b-0x6b.7 (1) + | | | cells_pointers[0:2]: 0x6c-0x6f.7 (4) +0x00060| 0f 7f | .. | [0]: 3967 pointer 0x6c-0x6d.7 (2) +0x00060| 0f d1| ..| [1]: 4049 pointer 0x6e-0x6f.7 (2) + | | | cells[0:2]: 0xf7f-0xff7.7 (121) + | | | [0]{}: cell 0xf7f-0xfd0.7 (82) +0x00f70| 50| P| payload_len: 80 0xf7f-0xf7f.7 (1) +0x00f80|01 |. | rowid: 1 0xf80-0xf80.7 (1) + | | | payload{}: 0xf81-0xfd0.7 (80) +0x00f80| 07 | . | length: 7 0xf81-0xf81.7 (1) + | | | serials[0:5]: 0xf82-0xf87.7 (6) +0x00f80| 17 | . | [0]: 23 serial (text) 0xf82-0xf82.7 (1) +0x00f80| 13 | . | [1]: 19 serial (text) 0xf83-0xf83.7 (1) +0x00f80| 13 | . | [2]: 19 serial (text) 0xf84-0xf84.7 (1) +0x00f80| 01 | . | [3]: 1 serial (int8) 0xf85-0xf85.7 (1) +0x00f80| 81 07 | .. | [4]: 135 serial (text) 0xf86-0xf87.7 (2) + | | | contents[0:5]: 0xf88-0xfd0.7 (73) +0x00f80| 74 61 62 6c 65 | table | [0]: "table" value 0xf88-0xf8c.7 (5) +0x00f80| 61 61 61| aaa| [1]: "aaa" value 0xf8d-0xf8f.7 (3) +0x00f90|61 61 61 |aaa | [2]: "aaa" value 0xf90-0xf92.7 (3) +0x00f90| 02 | . | [3]: 2 value 0xf93-0xf93.7 (1) +0x00f90| 43 52 45 41 54 45 20 54 41 42 4c 45| CREATE TABLE| [4]: "CREATE TABLE aaa (\n cint int primary key,\n c"... value 0xf94-0xfd0.7 (61) +0x00fa0|20 61 61 61 20 28 0a 20 20 20 20 63 69 6e 74 20| aaa (. cint | +* |until 0xfd0.7 (61) | | + | | | [1]{}: cell 0xfd1-0xff7.7 (39) +0x00fd0| 25 | % | payload_len: 37 0xfd1-0xfd1.7 (1) +0x00fd0| 02 | . | rowid: 2 0xfd2-0xfd2.7 (1) + | | | payload{}: 0xfd3-0xff7.7 (37) +0x00fd0| 06 | . | length: 6 0xfd3-0xfd3.7 (1) + | | | serials[0:5]: 0xfd4-0xfd8.7 (5) +0x00fd0| 17 | . | [0]: 23 serial (text) 0xfd4-0xfd4.7 (1) +0x00fd0| 39 | 9 | [1]: 57 serial (text) 0xfd5-0xfd5.7 (1) +0x00fd0| 13 | . | [2]: 19 serial (text) 0xfd6-0xfd6.7 (1) +0x00fd0| 01 | . | [3]: 1 serial (int8) 0xfd7-0xfd7.7 (1) +0x00fd0| 00 | . | [4]: 0 serial (null) 0xfd8-0xfd8.7 (1) + | | | contents[0:5]: 0xfd9-0xff7.7 (31) +0x00fd0| 69 6e 64 65 78 | index | [0]: "index" value 0xfd9-0xfdd.7 (5) +0x00fd0| 73 71| sq| [1]: "sqlite_autoindex_aaa_1" value 0xfde-0xff3.7 (22) +0x00fe0|6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 61|lite_autoindex_a| +0x00ff0|61 61 5f 31 |aa_1 | +0x00ff0| 61 61 61 | aaa | [2]: "aaa" value 0xff4-0xff6.7 (3) +0x00ff0| 03 | . | [3]: 3 value 0xff7-0xff7.7 (1) + | | | [4]: null value 0xff8-NA (0) + | | | freeblocks[0:1]: 0xff8-0xff9.7 (2) + | | | [0]{}: freeblock 0xff8-0xff9.7 (2) +0x00ff0| 00 00 | .. | next_offset: 0 0xff8-0xff9.7 (2) + | | | [2]{}: page 0x1000-0x6e27.7 (24104) +0x01000|0d |. | type: "table_leaf" (13) 0x1000-0x1000.7 (1) +0x01000| 0a 30 | .0 | start_freeblocks: 2608 0x1001-0x1002.7 (2) +0x01000| 00 02 | .. | page_cells: 2 0x1003-0x1004.7 (2) +0x01000| 08 40 | .@ | cell_start: 2112 0x1005-0x1006.7 (2) +0x01000| 00 | . | cell_fragments: 0 0x1007-0x1007.7 (1) + | | | cells_pointers[0:2]: 0x1008-0x100b.7 (4) +0x01000| 0c 20 | . | [0]: 3104 pointer 0x1008-0x1009.7 (2) +0x01000| 08 40 | .@ | [1]: 2112 pointer 0x100a-0x100b.7 (2) + | | | cells[0:2]: 0x1840-0x6e27.7 (21992) + | | | [0]{}: cell 0x1c20-0x4e27.7 (12808) + | | | payload{}: 0x0-0x100c.7 (4109) + 0x0000|04 |. | length: 4 0x0-0x0.7 (1) + | | | serials[0:2]: 0x1-0x3.7 (3) + 0x0000| 01 | . | [0]: 1 serial (int8) 0x1-0x1.7 (1) + 0x0000| c0 1d | .. | [1]: 8221 serial (text) 0x2-0x3.7 (2) + | | | contents[0:2]: 0x4-0x100c.7 (4105) + 0x0000| 02 | . | [0]: 2 value 0x4-0x4.7 (1) + 0x0000| 32 41 42 42 42 42 42 42 42 42 42| 2ABBBBBBBBB| [1]: "2ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"... value 0x5-0x100c.7 (4104) + 0x0010|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| + * |until 0x100c.7 (end) (4104) | | +0x01c20|a0 0d |.. | payload_len: 4109 0x1c20-0x1c21.7 (2) +0x01c20| 02 | . | rowid: 2 0x1c22-0x1c22.7 (1) + | | | overflow_pages[0:2]: 0x1c23-0x4e27.7 (12805) + | | | [0]{}: overflow_page 0x1c23-0x1e0f.7 (493) +0x01c20| 04 01 c0 1d 02 32 41 42 42 42 42 42 42| .....2ABBBBBB| data: raw bits 0x1c23-0x1e0b.7 (489) +0x01c30|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| +* |until 0x1e0b.7 (489) | | +0x01e00| 00 00 00 05| ....| next_page: 5 0x1e0c-0x1e0f.7 (4) + | | | [1]{}: overflow_page 0x4000-0x4e27.7 (3624) +0x04000|00 00 00 00 |.... | next_page: 0 0x4000-0x4003.7 (4) +0x04000| 42 42 42 42 42 42 42 42 42 42 42 42| BBBBBBBBBBBB| data: raw bits 0x4004-0x4e27.7 (3620) +0x04010|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| +* |until 0x4e27.7 (3620) | | + | | | [1]{}: cell 0x1840-0x6e27.7 (21992) + | | | payload{}: 0x0-0x100c.7 (4109) + 0x0000|04 |. | length: 4 0x0-0x0.7 (1) + | | | serials[0:2]: 0x1-0x3.7 (3) + 0x0000| 01 | . | [0]: 1 serial (int8) 0x1-0x1.7 (1) + 0x0000| c0 1d | .. | [1]: 8221 serial (text) 0x2-0x3.7 (2) + | | | contents[0:2]: 0x4-0x100c.7 (4105) + 0x0000| 04 | . | [0]: 4 value 0x4-0x4.7 (1) + 0x0000| 34 41 42 42 42 42 42 42 42 42 42| 4ABBBBBBBBB| [1]: "4ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"... value 0x5-0x100c.7 (4104) + 0x0010|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| + * |until 0x100c.7 (end) (4104) | | +0x01840|a0 0d |.. | payload_len: 4109 0x1840-0x1841.7 (2) +0x01840| 04 | . | rowid: 4 0x1842-0x1842.7 (1) + | | | overflow_pages[0:2]: 0x1843-0x6e27.7 (21989) + | | | [0]{}: overflow_page 0x1843-0x1a2f.7 (493) +0x01840| 04 01 c0 1d 04 34 41 42 42 42 42 42 42| .....4ABBBBBB| data: raw bits 0x1843-0x1a2b.7 (489) +0x01850|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| +* |until 0x1a2b.7 (489) | | +0x01a20| 00 00 00 07| ....| next_page: 7 0x1a2c-0x1a2f.7 (4) + | | | [1]{}: overflow_page 0x6000-0x6e27.7 (3624) +0x06000|00 00 00 00 |.... | next_page: 0 0x6000-0x6003.7 (4) +0x06000| 42 42 42 42 42 42 42 42 42 42 42 42| BBBBBBBBBBBB| data: raw bits 0x6004-0x6e27.7 (3620) +0x06010|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| +* |until 0x6e27.7 (3620) | | + | | | freeblocks[0:2]: 0x1a30-0x1e11.7 (994) + | | | [0]{}: freeblock 0x1a30-0x1c1f.7 (496) +0x01a30|0e 10 |.. | next_offset: 3600 0x1a30-0x1a31.7 (2) +0x01a30| 01 f0 | .. | size: 496 0x1a32-0x1a33.7 (2) +0x01a30| 00 00 00 00 00 00 00 00 00 00 00 00| ............| space: raw bits 0x1a34-0x1c1f.7 (492) +0x01a40|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1c1f.7 (492) | | + | | | [1]{}: freeblock 0x1e10-0x1e11.7 (2) +0x01e10|00 00 |.. | next_offset: 0 0x1e10-0x1e11.7 (2) + | | | [3]{}: page 0x2000-0x2ffd.7 (4094) +0x02000|0a |. | type: "index_leaf" (10) 0x2000-0x2000.7 (1) +0x02000| 0f f0 | .. | start_freeblocks: 4080 0x2001-0x2002.7 (2) +0x02000| 00 02 | .. | page_cells: 2 0x2003-0x2004.7 (2) +0x02000| 0f ea | .. | cell_start: 4074 0x2005-0x2006.7 (2) +0x02000| 00 | . | cell_fragments: 0 0x2007-0x2007.7 (1) + | | | cells_pointers[0:2]: 0x2008-0x200b.7 (4) +0x02000| 0f f6 | .. | [0]: 4086 pointer 0x2008-0x2009.7 (2) +0x02000| 0f ea | .. | [1]: 4074 pointer 0x200a-0x200b.7 (2) + | | | cells[0:2]: 0x2fea-0x2ffb.7 (18) + | | | [0]{}: cell 0x2ff6-0x2ffb.7 (6) +0x02ff0| 05 | . | payload_len: 5 0x2ff6-0x2ff6.7 (1) + | | | payload{}: 0x2ff7-0x2ffb.7 (5) +0x02ff0| 03 | . | length: 3 0x2ff7-0x2ff7.7 (1) + | | | serials[0:2]: 0x2ff8-0x2ff9.7 (2) +0x02ff0| 01 | . | [0]: 1 serial (int8) 0x2ff8-0x2ff8.7 (1) +0x02ff0| 01 | . | [1]: 1 serial (int8) 0x2ff9-0x2ff9.7 (1) + | | | contents[0:2]: 0x2ffa-0x2ffb.7 (2) +0x02ff0| 02 | . | [0]: 2 value 0x2ffa-0x2ffa.7 (1) +0x02ff0| 02 | . | [1]: 2 value 0x2ffb-0x2ffb.7 (1) + | | | [1]{}: cell 0x2fea-0x2fef.7 (6) +0x02fe0| 05 | . | payload_len: 5 0x2fea-0x2fea.7 (1) + | | | payload{}: 0x2feb-0x2fef.7 (5) +0x02fe0| 03 | . | length: 3 0x2feb-0x2feb.7 (1) + | | | serials[0:2]: 0x2fec-0x2fed.7 (2) +0x02fe0| 01 | . | [0]: 1 serial (int8) 0x2fec-0x2fec.7 (1) +0x02fe0| 01 | . | [1]: 1 serial (int8) 0x2fed-0x2fed.7 (1) + | | | contents[0:2]: 0x2fee-0x2fef.7 (2) +0x02fe0| 04 | . | [0]: 4 value 0x2fee-0x2fee.7 (1) +0x02fe0| 04| .| [1]: 4 value 0x2fef-0x2fef.7 (1) + | | | freeblocks[0:2]: 0x2ff0-0x2ffd.7 (14) + | | | [0]{}: freeblock 0x2ff0-0x2ff5.7 (6) +0x02ff0|0f fc |.. | next_offset: 4092 0x2ff0-0x2ff1.7 (2) +0x02ff0| 00 06 | .. | size: 6 0x2ff2-0x2ff3.7 (2) +0x02ff0| 00 00 | .. | space: raw bits 0x2ff4-0x2ff5.7 (2) + | | | [1]{}: freeblock 0x2ffc-0x2ffd.7 (2) +0x02ff0| 00 00 | .. | next_offset: 0 0x2ffc-0x2ffd.7 (2) + | | | [4]{}: page 0x3000-0x3ffc.7 (4093) +0x03000|00 |. | type: 0 0x3000-0x3000.7 (1) +0x03000| 00 00 00 00 00 00 01 00 00 00 06 42 42 42 42| ...........BBBB| data: raw bits 0x3001-0x3ffc.7 (4092) +0x03010|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| +* |until 0x3ffc.7 (4092) | | + | | | [5]{}: page 0x4000-0x4ffc.7 (4093) +0x04000|00 |. | type: 0 0x4000-0x4000.7 (1) +0x04000| 00 00 00 42 42 42 42 42 42 42 42 42 42 42 42| ...BBBBBBBBBBBB| data: raw bits 0x4001-0x4ffc.7 (4092) +0x04010|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| +* |until 0x4ffc.7 (4092) | | + | | | [6]{}: page 0x5000-0x5ffc.7 (4093) +0x05000|00 |. | type: 0 0x5000-0x5000.7 (1) +0x05000| 00 00 00 42 42 42 42 42 42 42 42 42 42 42 42| ...BBBBBBBBBBBB| data: raw bits 0x5001-0x5ffc.7 (4092) +0x05010|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| +* |until 0x5ffc.7 (4092) | | + | | | [7]{}: page 0x6000-0x6ffc.7 (4093) +0x06000|00 |. | type: 0 0x6000-0x6000.7 (1) +0x06000| 00 00 00 42 42 42 42 42 42 42 42 42 42 42 42| ...BBBBBBBBBBBB| data: raw bits 0x6001-0x6ffc.7 (4092) +0x06010|42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42|BBBBBBBBBBBBBBBB| +* |until 0x6ffc.7 (4092) | | +0x00070|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| unknown0: raw bits 0x70-0xf7e.7 (3855) +* |until 0xf7e.7 (3855) | | +0x00ff0| 00 08 00 00 00 00| ......| unknown1: raw bits 0xffa-0xfff.7 (6) +0x01000| 08 40 08 40| .@.@| unknown2: raw bits 0x100c-0x183f.7 (2100) +0x01010|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x183f.7 (2100) | | +0x01e10| 01 f0 00 00 00 00 00 00 00 00 00 00 00 00| ..............| unknown3: raw bits 0x1e12-0x1fff.7 (494) +0x01e20|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (494) | | +0x02000| 0f ea 0f ea| ....| unknown4: raw bits 0x200c-0x2fe9.7 (4062) +0x02010|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x2fe9.7 (4062) | | +0x02ff0| 00 04| ..| unknown5: raw bits 0x2ffe-0x2fff.7 (2) +0x03ff0| 00 00 00| ...| unknown6: raw bits 0x3ffd-0x3fff.7 (3) +0x04ff0| 00 00 00| ...| unknown7: raw bits 0x4ffd-0x4fff.7 (3) +0x05ff0| 00 00 00| ...| unknown8: raw bits 0x5ffd-0x5fff.7 (3) +0x06ff0| 00 00 00| ...| unknown9: raw bits 0x6ffd-0x6fff.7 (3) +{ + "aaa": [ + [ + 2, + "2ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC2" + ], + [ + 4, + "4ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC4" + ] + ] +}