From f069ddc2650a4efd8c90e81e6f42a3cfee84c134 Mon Sep 17 00:00:00 2001 From: Michael Zhilin Date: Tue, 12 Jul 2022 11:18:16 +0300 Subject: [PATCH 001/141] [WIP] initial attempt to add postgres --- format/all/all.go | 1 + format/format.go | 4 + format/postgres/pgmultixact.go | 86 ++++ format/postgres/pgwal.go | 180 +++++++ format/postgres/pgwal_page.go | 28 ++ go.mod | 24 +- go.sum | 846 +++++++++++++++++++++++++++++++++ pkg/interp/buffer.go | 4 + 8 files changed, 1172 insertions(+), 1 deletion(-) create mode 100644 format/postgres/pgmultixact.go create mode 100644 format/postgres/pgwal.go create mode 100644 format/postgres/pgwal_page.go diff --git a/format/all/all.go b/format/all/all.go index 86d5801c0..c68eb68f5 100644 --- a/format/all/all.go +++ b/format/all/all.go @@ -24,6 +24,7 @@ import ( _ "github.com/wader/fq/format/opus" _ "github.com/wader/fq/format/pcap" _ "github.com/wader/fq/format/png" + _ "github.com/wader/fq/format/postgres" _ "github.com/wader/fq/format/protobuf" _ "github.com/wader/fq/format/raw" _ "github.com/wader/fq/format/tar" diff --git a/format/format.go b/format/format.go index 0874fe9ff..4af735346 100644 --- a/format/format.go +++ b/format/format.go @@ -73,6 +73,10 @@ const ( OPUS_PACKET = "opus_packet" PCAP = "pcap" PCAPNG = "pcapng" + PGWAL = "pgwal" + PGWALPAGE = "pgwal_page" + PGMULTIXACTOFF = "pgmultixact_offsets" + PGMULTIXACTMEM = "pgmultixact_members" PNG = "png" PROTOBUF = "protobuf" PROTOBUF_WIDEVINE = "protobuf_widevine" diff --git a/format/postgres/pgmultixact.go b/format/postgres/pgmultixact.go new file mode 100644 index 000000000..0277a4af2 --- /dev/null +++ b/format/postgres/pgmultixact.go @@ -0,0 +1,86 @@ +package postgres + +import ( + "github.com/wader/fq/format" + "github.com/wader/fq/format/registry" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +const BLCKSZ = 8192 + +func init() { + registry.MustRegister(decode.Format{ + Name: format.PGMULTIXACTOFF, + Description: "PostgreSQL multixact offset file", + DecodeFn: mxOffsetDecode, + }) + registry.MustRegister(decode.Format{ + Name: format.PGMULTIXACTMEM, + Description: "PostgreSQL multixact members file", + DecodeFn: mxMembersDecode, + }) +} + +func mxOffsetDecode(d *decode.D, in interface{}) interface{} { + d.Endian = decode.LittleEndian + + d.FieldArray("offsets", func(d *decode.D) { + for { + if d.End() { + break + } + d.FieldU32("offset", scalar.Hex) + + } + }) + return nil +} + +var flags = scalar.UToScalar{ + 0: {Sym: "ForKeyShare", Description: "For Key Share"}, + 1: {Sym: "ForShare", Description: "For Share"}, + 2: {Sym: "ForNoKeyUpdate", Description: "For No Key Update"}, + 3: {Sym: "ForUpdate", Description: "For Update"}, + 4: {Sym: "NoKeyUpdate", Description: "No Key Update"}, + 5: {Sym: "Update", Description: "Update"}, +} + +func mxMembersDecode(d *decode.D, in interface{}) interface{} { + var xidLen uint = 4 + var groupLen uint = 4 * (1 + xidLen) + d.Endian = decode.LittleEndian + + m := d.FieldArrayValue("members") + p := d.FieldArrayValue("paddings") + + for { + var xacts []*decode.D = make([]*decode.D, 4) + + for i := 0; i < 4; i++ { + xacts[i] = m.FieldStructValue("xact") + xacts[i].FieldU8("status", flags) + } + + for i := 0; i < 4; i++ { + xacts[i].FieldU32("xid") + } + + // Check if rest of bytes are padding before EOF + if d.BitsLeft() < int64(groupLen*8) && d.BitsLeft() > 0 { + p.FieldRawLen("padding", d.BitsLeft()) + break + } + + // Check on EOF + if d.End() { + break + } + + // Not EOF, let's check on block boundary + if blkLeft := BLCKSZ - (uint(d.Pos())>>3)%BLCKSZ; blkLeft < groupLen { + p.FieldRawLen("padding", int64(blkLeft*8)) + } + } + return nil +} diff --git a/format/postgres/pgwal.go b/format/postgres/pgwal.go new file mode 100644 index 000000000..3efd80a0b --- /dev/null +++ b/format/postgres/pgwal.go @@ -0,0 +1,180 @@ +package postgres + +import ( + "github.com/wader/fq/format" + "github.com/wader/fq/format/registry" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +func init() { + registry.MustRegister(decode.Format{ + Name: format.PGWAL, + Description: "PostgreSQL write-ahead log file", + DecodeFn: pgwalDecode, + }) +} + +const XLOG_BLCKSZ = 8192 + +const XLP_LONG_HEADER = 2 + +const ( + BKPBLOCK_FORK_MASK = 0x0F + /* block data is an XLogRecordBlockImage */ + BKPBLOCK_HAS_IMAGE = 0x10 + BKPBLOCK_HAS_DATA = 0x20 + /* redo will re-init the page */ + BKPBLOCK_WILL_INIT = 0x40 + /* RelFileNode omitted, same as previous */ + BKPBLOCK_SAME_REL = 0x80 +) + +/* Information stored in bimg_info */ +const ( + /* page image has "hole" */ + BKPIMAGE_HAS_HOLE = 0x01 + /* page image is compressed */ + BKPIMAGE_IS_COMPRESSED = 0x02 + /* page image should be restored during replay */ + BKPIMAGE_APPLY = 0x04 +) + +var expected_rem_len uint64 = 0 + +var rmgrIds = scalar.UToScalar{ + 0: {Sym: "XLOG", Description: "RM_XLOG_ID"}, + 1: {Sym: "Transaction", Description: "RM_XACT_ID"}, + 2: {Sym: "Storage", Description: "RM_SMGR_ID"}, + 3: {Sym: "CLOG", Description: "RM_CLOG_ID"}, + 4: {Sym: "Database", Description: "RM_DBASE_ID"}, + 5: {Sym: "Tablespace", Description: "RM_TBLSPC_ID"}, + 6: {Sym: "MultiXact", Description: "RM_MULTIXACT_ID"}, + 7: {Sym: "RelMap", Description: "RM_RELMAP_ID"}, + 8: {Sym: "Standby", Description: "RM_STANDBY_ID"}, + 9: {Sym: "Heap2", Description: "RM_HEAP2_ID"}, + 10: {Sym: "Heap", Description: "RM_HEAP_ID"}, + 11: {Sym: "Btree", Description: "RM_BTREE_ID"}, + 12: {Sym: "Hash", Description: "RM_HASH_ID"}, + 13: {Sym: "Gin", Description: "RM_GIN_ID"}, + 14: {Sym: "Gist", Description: "RM_GIST_ID"}, + 15: {Sym: "Sequence", Description: "RM_SEQ_ID"}, + 16: {Sym: "SPGist", Description: "RM_SPGIST_ID"}, + 17: {Sym: "BRIN", Description: "RM_BRIN_ID"}, + 18: {Sym: "CommitTs", Description: "RM_COMMIT_TS_ID"}, + 19: {Sym: "ReplicationOrigin", Description: "RM_REPLORIGIN_ID"}, + 20: {Sym: "Generic", Description: "RM_GENERIC_ID"}, + 21: {Sym: "LogicalMessage", Description: "RM_LOGICALMSG_ID"}, +} + +func decodeXLogPageHeaderData(d *decode.D) { + var info uint64 + + d.FieldU16("xlp_magic", d.AssertU(0xd106)) + info = d.FieldU16("xlp_info") + d.FieldU32("xlp_timeline") + d.FieldU64("xlp_pageaddr") + d.FieldU32("xlp_rem_len") + d.FieldRawLen("padding", int64(d.AlignBits(64))) + if info&XLP_LONG_HEADER != 0 { + // Long header + d.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { + d.FieldU64("xlp_sysid") + d.FieldU32("xlp_seg_size") + d.FieldU32("xlp_xlog_blcksz") + }) + } +} + +func pgwalDecode(d *decode.D, in interface{}) interface{} { + + d.Endian = decode.LittleEndian + + pageHeaders := d.FieldArrayValue("XLogPageHeaders") + header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) + + d.FieldRawLen("prev_file_rec", int64(header.FieldGet("xlp_rem_len").V.(uint32)*8)) + d.FieldRawLen("prev_file_rec_padding", int64(d.AlignBits(64))) + + d.FieldArray("XLogRecords", func(d *decode.D) { + for { + d.FieldStruct("XLogRecord", func(d *decode.D) { + record_pos := uint64(d.Pos()) >> 3 + record_len := d.FieldU32("xl_tot_len") + record_end := record_pos + record_len + header_pos := record_end - record_end%XLOG_BLCKSZ + d.FieldU32("xl_xid") + d.FieldU64("xl_prev", scalar.Hex) + d.FieldU8("xl_info") + d.FieldU8("xl_rmid", rmgrIds) + d.FieldRawLen("padding", int64(d.AlignBits(32))) + d.FieldU32("xl_crc", scalar.Hex) + + var lenghts []uint64 = []uint64{} + + d.FieldArray("XLogRecordBlockHeader", func(d *decode.D) { + for blkheaderid := uint64(0); d.PeekBits(8) == blkheaderid; blkheaderid++ { + d.FieldStruct("XlogRecordBlockHeader", func(d *decode.D) { + /* block reference ID */ + d.FieldU8("id", d.AssertU(blkheaderid)) + /* fork within the relation, and flags */ + fork_flags := d.FieldU8("fork_flags") + /* number of payload bytes (not including page image) */ + lenghts = append(lenghts, d.FieldU16("data_length")) + if fork_flags&BKPBLOCK_HAS_IMAGE != 0 { + d.FieldStruct("XLogRecordBlockImageHeader", func(d *decode.D) { + /* number of page image bytes */ + d.FieldU16("length") + /* number of bytes before "hole" */ + d.FieldU16("hole_offset") + /* flag bits, see below */ + bimg_info := d.FieldU8("bimg_info") + d.FieldRawLen("padding", int64(d.AlignBits(16))) + if bimg_info&BKPIMAGE_HAS_HOLE != 0 && + bimg_info&BKPIMAGE_IS_COMPRESSED != 0 { + d.FieldU16("hole_length") + } + }) + } + if fork_flags&BKPBLOCK_SAME_REL == 0 { + d.FieldStruct("RelFileNode", func(d *decode.D) { + /* tablespace */ + d.FieldU32("spcNode") + /* database */ + d.FieldU32("dbNode") + /* relation */ + d.FieldU32("relNode") + }) + d.FieldU32("BlockNum") + } + }) + } + }) + if d.PeekBits(8) == 0xff { + d.FieldStruct("XLogRecordDataHeaderShort", func(d *decode.D) { + d.FieldU8("id", d.AssertU(0xff)) + lenghts = append(lenghts, d.FieldU8("data_length")) + }) + } + + d.FieldArray("data", func(d *decode.D) { + for _, x := range lenghts { + pos := uint64(d.Pos()) >> 3 + if pos < header_pos && (header_pos < pos+x) { + d.FieldRawLen("data", int64((header_pos-pos)*8)) + header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) + header.FieldGet("xlp_rem_len").TryScalarFn(d.ValidateU(record_end - header_pos)) + d.FieldRawLen("data", int64((x+pos-header_pos)*8)) + } else { + d.FieldRawLen("data", int64(x*8)) + } + } + }) + + d.FieldRawLen("ending_padding", int64(d.AlignBits(64))) + }) + } + }) + + return nil +} diff --git a/format/postgres/pgwal_page.go b/format/postgres/pgwal_page.go new file mode 100644 index 000000000..6a1049947 --- /dev/null +++ b/format/postgres/pgwal_page.go @@ -0,0 +1,28 @@ +package postgres + +import ( + "github.com/wader/fq/format" + "github.com/wader/fq/format/registry" + "github.com/wader/fq/pkg/decode" + _ "github.com/wader/fq/pkg/scalar" +) + +func init() { + registry.MustRegister(decode.Format{ + Name: format.PGWALPAGE, + Description: "PostgreSQL write-ahead page", + DecodeFn: walpageDecode, + }) +} + +//const XLOG_BLCKSZ = 8192 + +func walpageDecode(d *decode.D, in interface{}) interface{} { + + d.Endian = decode.LittleEndian + + pageHeaders := d.FieldArrayValue("XLogPageHeaders") + _ = pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) + + return nil +} diff --git a/go.mod b/go.mod index e3fa65b19..48e658b43 100644 --- a/go.mod +++ b/go.mod @@ -29,6 +29,28 @@ require ( ) require ( + github.com/cilium/ebpf v0.7.0 // indirect + github.com/cosiner/argv v0.1.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect + github.com/derekparker/trie v0.0.0-20200317170641-1fdf38b7b0e9 // indirect + github.com/go-delve/delve v1.8.0 // indirect + github.com/google/go-dap v0.6.0 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/itchyny/timefmt-go v0.1.3 // indirect - golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 // indirect + github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/peterh/liner v1.2.1 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/spf13/cobra v1.3.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + go.starlark.net v0.0.0-20211203141949-70c0e40ae128 // indirect + golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect + golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index 2fc3d3171..b87552477 100644 --- a/go.sum +++ b/go.sum @@ -1,43 +1,889 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.7.0 h1:1k/q3ATgxSXRdrmPfH8d7YK0GfqVsEKZAX9dQZvs56k= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosiner/argv v0.1.0 h1:BVDiEL32lwHukgJKP87btEPenzrrHUjajs/8yzaqcXg= +github.com/cosiner/argv v0.1.0/go.mod h1:EusR6TucWKX+zFgtdUsKT2Cvg45K5rtpCcWz4hK06d8= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/derekparker/trie v0.0.0-20200317170641-1fdf38b7b0e9 h1:G765iDCq7bP5opdrPkXk+4V3yfkgV9iGFuheWZ/X/zY= +github.com/derekparker/trie v0.0.0-20200317170641-1fdf38b7b0e9/go.mod h1:D6ICZm05D9VN1n/8iOtBxLpXtoGp6HDFUJ1RNVieOSE= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-delve/delve v1.8.0 h1:uvwPyfr6n2g1S6/bt270lM4fBK76P/3FDCufOsK0CjQ= +github.com/go-delve/delve v1.8.0/go.mod h1:yXxoIaOOdTmNapkt5yfol6NIeNSqMxWRTfqy9qQMWZY= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-dap v0.6.0 h1:Y1RHGUtv3R8y6sXq2dtGRMYrFB2hSqyFVws7jucrzX4= +github.com/google/go-dap v0.6.0/go.mod h1:5q8aYQFnHOAZEMP+6vmq25HKYAEwE+LF5yh7JKrrhSQ= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/itchyny/timefmt-go v0.1.3 h1:7M3LGVDsqcd0VZH2U+x393obrzZisp7C0uEe921iRkU= github.com/itchyny/timefmt-go v0.1.3/go.mod h1:0osSSCQSASBJMsIZnhAaF1C2fCBTJZXrnj37mG8/c+A= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/peterh/liner v1.2.1 h1:O4BlKaq/LWu6VRWmol4ByWfzx6MfXc5Op5HETyIy5yg= +github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= +github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/wader/gojq v0.12.1-0.20211211101122-3894ded312be h1:Bc8ZRZxUqQPPwHqdY1c99mKInhJ0UeWEMjgsjHMRGUA= github.com/wader/gojq v0.12.1-0.20211211101122-3894ded312be/go.mod h1:tdC5h6dXdwAJs7eJUw4681AzsgfOSBrAV+cZzEbCZs4= github.com/wader/readline v0.0.0-20210920124728-5a81f7707bac h1:F5x54dwg6vGyf+8XhujiyXr651E3tKpcL1mqGmS7/MU= github.com/wader/readline v0.0.0-20210920124728-5a81f7707bac/go.mod h1:jYXyt9wQg3DifxQ8FM5M/ZoskO23GIwmo05QLHtO9CQ= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.starlark.net v0.0.0-20200821142938-949cc6f4b097/go.mod h1:f0znQkUKRrkk36XxWbGjMqQM8wGv/xHBVE2qc3B5oFU= +go.starlark.net v0.0.0-20211203141949-70c0e40ae128 h1:bxH+EXOo87zEOwKDdZ8Tevgi6irRbqheRm/fr293c58= +go.starlark.net v0.0.0-20211203141949-70c0e40ae128/go.mod h1:t3mmBBPzAVvK0L0n1drDmrQsJ8FoIx4INCqVMTr/Zo0= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 h1:TyHqChC80pFkXWraUUf6RuB5IqFdQieMLwwCJokV2pc= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/pkg/interp/buffer.go b/pkg/interp/buffer.go index 942479634..6c3bbcc71 100644 --- a/pkg/interp/buffer.go +++ b/pkg/interp/buffer.go @@ -214,6 +214,10 @@ func (i *Interp) _open(c interface{}, a []interface{}) interface{} { } } + if fFI.Mode().IsDir() { + panic("provided directory instead of regular file") + } + if fRS == nil { buf, err := ioutil.ReadAll(ctxreadseeker.New(i.evalContext.ctx, &ioextra.ReadErrSeeker{Reader: f})) if err != nil { From 9a96da86a745238029b1061e15a39ca355d424ca Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 19 Jul 2022 08:58:31 +0300 Subject: [PATCH 002/141] Add postgres pg_control parser --- .gitignore | 1 + format/format.go | 1 + format/postgres/pg_control.go | 459 +++++++++++++++++++++++++++++++++ format/postgres/pgmultixact.go | 8 +- format/postgres/pgwal.go | 8 +- format/postgres/pgwal_page.go | 4 +- pkg/decode/decode.go | 8 + pkg/interp/buffer.go | 0 8 files changed, 479 insertions(+), 10 deletions(-) create mode 100644 format/postgres/pg_control.go delete mode 100644 pkg/interp/buffer.go diff --git a/.gitignore b/.gitignore index 875ed6e16..1c009a638 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store testfiles/ fq +.idea \ No newline at end of file diff --git a/format/format.go b/format/format.go index 657f43692..6dd6546b5 100644 --- a/format/format.go +++ b/format/format.go @@ -92,6 +92,7 @@ const ( PGWALPAGE = "pgwal_page" PGMULTIXACTOFF = "pgmultixact_offsets" PGMULTIXACTMEM = "pgmultixact_members" + PG_CONTROL = "pg_control" PNG = "png" PROTOBUF = "protobuf" PROTOBUF_WIDEVINE = "protobuf_widevine" diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go new file mode 100644 index 000000000..d9abb22d8 --- /dev/null +++ b/format/postgres/pg_control.go @@ -0,0 +1,459 @@ +package postgres + +import ( + "github.com/wader/fq/format" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/interp" +) + +func init() { + interp.RegisterFormat(decode.Format{ + Name: format.PG_CONTROL, + Description: "PostgreSQL 14 control file", + DecodeFn: decodePgControl, + }) +} + +const ( + PG_CONTROL_VERSION_11 = 1100 + PG_CONTROL_VERSION_14 = 1300 +) + +func decodePgControl(d *decode.D, in any) any { + d.Endian = decode.LittleEndian + + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + d.FieldU64("system_identifier") + pgControlVersion := d.FieldU32("pg_control_version") + + switch pgControlVersion { + case PG_CONTROL_VERSION_11: + return decodePgControl11(d, in) + case PG_CONTROL_VERSION_14: + return decodePgControl14(d, in) + default: + d.Fatalf("unsupported PG_CONTROL_VERSION = %d\n", pgControlVersion) + } + return nil +} + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 80 */ // CheckPoint checkPointCopy; +/* 120 | 8 */ // XLogRecPtr unloggedLSN; +/* 128 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 136 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 144 | 8 */ // XLogRecPtr backupStartPoint; +/* 152 | 8 */ // XLogRecPtr backupEndPoint; +/* 160 | 1 */ // _Bool backupEndRequired; +/* XXX 3-byte hole */ +/* 164 | 4 */ // int wal_level; +/* 168 | 1 */ // _Bool wal_log_hints; +/* XXX 3-byte hole */ +/* 172 | 4 */ // int MaxConnections; +/* 176 | 4 */ // int max_worker_processes; +/* 180 | 4 */ // int max_prepared_xacts; +/* 184 | 4 */ // int max_locks_per_xact; +/* 188 | 1 */ // _Bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 192 | 4 */ // uint32 maxAlign; +/* XXX 4-byte hole */ +/* 200 | 8 */ // double floatFormat; +/* 208 | 4 */ // uint32 blcksz; +/* 212 | 4 */ // uint32 relseg_size; +/* 216 | 4 */ // uint32 xlog_blcksz; +/* 220 | 4 */ // uint32 xlog_seg_size; +/* 224 | 4 */ // uint32 nameDataLen; +/* 228 | 4 */ // uint32 indexMaxKeys; +/* 232 | 4 */ // uint32 toast_max_chunk_size; +/* 236 | 4 */ // uint32 loblksize; +/* 240 | 1 */ // _Bool float4ByVal; +/* 241 | 1 */ // _Bool float8ByVal; +/* XXX 2-byte hole */ +/* 244 | 4 */ // uint32 data_checksum_version; +/* 248 | 32 */ // char mock_authentication_nonce[32]; +/* 280 | 4 */ // pg_crc32c crc; +/* XXX 4-byte padding */ +// +/* total size (bytes): 288 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // _Bool fullPageWrites; +/* XXX 3-byte hole */ +/* 20 | 4 */ // uint32 nextXidEpoch; +/* 24 | 4 */ // TransactionId nextXid; +/* 28 | 4 */ // Oid nextOid; +/* 32 | 4 */ // MultiXactId nextMulti; +/* 36 | 4 */ // MultiXactOffset nextMultiOffset; +/* 40 | 4 */ // TransactionId oldestXid; +/* 44 | 4 */ // Oid oldestXidDB; +/* 48 | 4 */ // MultiXactId oldestMulti; +/* 52 | 4 */ // Oid oldestMultiDB; +/* 56 | 8 */ // pg_time_t time; +/* 64 | 4 */ // TransactionId oldestCommitTsXid; +/* 68 | 4 */ // TransactionId newestCommitTsXid; +/* 72 | 4 */ // TransactionId oldestActiveXid; +/* XXX 4-byte padding */ +// +/* total size (bytes): 80 */ +// +func decodePgControl11(d *decode.D, in any) any { + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + //d.FieldU64("system_identifier") + //d.FieldU32("pg_control_version") + d.FieldU32("catalog_version_no") + d.FieldU32("state") + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 80 */ // CheckPoint checkPointCopy; + d.FieldS64("time") + d.FieldU64("checkPoint") + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 3-byte hole */ + d.FieldU64("redo") + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U24() + + /* 20 | 4 */ // uint32 nextXidEpoch; + /* 24 | 4 */ // TransactionId nextXid; + /* 28 | 4 */ // Oid nextOid; + /* 32 | 4 */ // MultiXactId nextMulti; + /* 36 | 4 */ // MultiXactOffset nextMultiOffset; + /* 40 | 4 */ // TransactionId oldestXid; + /* 44 | 4 */ // Oid oldestXidDB; + /* 48 | 4 */ // MultiXactId oldestMulti; + /* 52 | 4 */ // Oid oldestMultiDB; + /* 56 | 8 */ // pg_time_t time; + /* 64 | 4 */ // TransactionId oldestCommitTsXid; + /* 68 | 4 */ // TransactionId newestCommitTsXid; + /* 72 | 4 */ // TransactionId oldestActiveXid; + /* XXX 4-byte padding */ + d.FieldU32("nextXidEpoch") + d.FieldU32("nextXid") + d.FieldU32("nextOid") + d.FieldU32("nextMulti") + d.FieldU32("nextMultiOffset") + d.FieldU32("oldestXid") + d.FieldU32("oldestXidDB") + d.FieldU32("oldestMulti") + d.FieldU32("oldestMultiDB") + d.FieldS64("time") + d.FieldU32("oldestCommitTsXid") + d.FieldU32("newestCommitTsXid") + d.FieldU32("oldestActiveXid") + d.U32() + }) + + /* 120 | 8 */ // XLogRecPtr unloggedLSN; + /* 128 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 136 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN") + d.FieldU64("minRecoveryPoint") + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 144 | 8 */ // XLogRecPtr backupStartPoint; + /* 152 | 8 */ // XLogRecPtr backupEndPoint; + /* 160 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint") + d.FieldU64("backupEndPoint") + d.FieldU8("backupEndRequired") + d.U24() + + /* 164 | 4 */ // int wal_level; + /* 168 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level") + d.FieldU8("wal_log_hints") + d.U24() + + /* 172 | 4 */ // int MaxConnections; + /* 176 | 4 */ // int max_worker_processes; + /* 180 | 4 */ // int max_prepared_xacts; + /* 184 | 4 */ // int max_locks_per_xact; + /* 188 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 192 | 4 */ // uint32 maxAlign; + /* XXX 4-byte hole */ + d.FieldU32("maxAlign") + d.U32() + + /* 200 | 8 */ // double floatFormat; + /* 208 | 4 */ // uint32 blcksz; + /* 212 | 4 */ // uint32 relseg_size; + /* 216 | 4 */ // uint32 xlog_blcksz; + /* 220 | 4 */ // uint32 xlog_seg_size; + /* 224 | 4 */ // uint32 nameDataLen; + /* 228 | 4 */ // uint32 indexMaxKeys; + /* 232 | 4 */ // uint32 toast_max_chunk_size; + /* 236 | 4 */ // uint32 loblksize; + /* 240 | 1 */ // _Bool float4ByVal; + /* 241 | 1 */ // _Bool float8ByVal; + /* XXX 2-byte hole */ + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float4ByVal") + d.FieldU8("float8ByVal") + d.U16() + + /* 252 | 4 */ // uint32 data_checksum_version; + /* 256 | 32 */ // char mock_authentication_nonce[32]; + /* 288 | 4 */ // pg_crc32c crc; + /* XXX 4-byte padding */ + d.FieldU32("data_checksum_version") + d.FieldUTF8ShortStringFixedLen("mock_authentication_nonce", 32) + d.FieldU32("crc") + d.U32() + /* total size (bytes): 288 */ + + d.AssertPosBytes(288) + + return nil +} + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 88 */ // CheckPoint checkPointCopy; +/* 128 | 8 */ // XLogRecPtr unloggedLSN; +/* 136 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 144 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 152 | 8 */ // XLogRecPtr backupStartPoint; +/* 160 | 8 */ // XLogRecPtr backupEndPoint; +/* 168 | 1 */ // _Bool backupEndRequired; +/* XXX 3-byte hole */ +/* 172 | 4 */ // int wal_level; +/* 176 | 1 */ // _Bool wal_log_hints; +/* XXX 3-byte hole */ +/* 180 | 4 */ // int MaxConnections; +/* 184 | 4 */ // int max_worker_processes; +/* 188 | 4 */ // int max_wal_senders; +/* 192 | 4 */ // int max_prepared_xacts; +/* 196 | 4 */ // int max_locks_per_xact; +/* 200 | 1 */ // _Bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 204 | 4 */ // uint32 maxAlign; +/* 208 | 8 */ // double floatFormat; +/* 216 | 4 */ // uint32 blcksz; +/* 220 | 4 */ // uint32 relseg_size; +/* 224 | 4 */ // uint32 xlog_blcksz; +/* 228 | 4 */ // uint32 xlog_seg_size; +/* 232 | 4 */ // uint32 nameDataLen; +/* 236 | 4 */ // uint32 indexMaxKeys; +/* 240 | 4 */ // uint32 toast_max_chunk_size; +/* 244 | 4 */ // uint32 loblksize; +/* 248 | 1 */ // _Bool float8ByVal; +/* XXX 3-byte hole */ +/* 252 | 4 */ // uint32 data_checksum_version; +/* 256 | 32 */ // char mock_authentication_nonce[32]; +/* 288 | 4 */ // pg_crc32c crc; +/* XXX 4-byte padding */ +// +/* total size (bytes): 296 */ +// +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // _Bool fullPageWrites; +/* XXX 7-byte hole */ +/* 24 | 8 */ // FullTransactionId nextXid; +/* 32 | 4 */ // Oid nextOid; +/* 36 | 4 */ // MultiXactId nextMulti; +/* 40 | 4 */ // MultiXactOffset nextMultiOffset; +/* 44 | 4 */ // TransactionId oldestXid; +/* 48 | 4 */ // Oid oldestXidDB; +/* 52 | 4 */ // MultiXactId oldestMulti; +/* 56 | 4 */ // Oid oldestMultiDB; +/* XXX 4-byte hole */ +/* 64 | 8 */ // pg_time_t time; +/* 72 | 4 */ // TransactionId oldestCommitTsXid; +/* 76 | 4 */ // TransactionId newestCommitTsXid; +/* 80 | 4 */ // TransactionId oldestActiveXid; +/* XXX 4-byte padding */ +// +/* total size (bytes): 88 */ +func decodePgControl14(d *decode.D, in any) any { + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + //d.FieldU64("system_identifier") + //d.FieldU32("pg_control_version") + d.FieldU32("catalog_version_no") + d.FieldU32("state") + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 88 */ // CheckPoint checkPointCopy; + d.FieldS64("time") + d.FieldU64("checkPoint") + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 7-byte hole */ + d.FieldU64("redo") + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U56() + + /* 24 | 8 */ // FullTransactionId nextXid; + /* 32 | 4 */ // Oid nextOid; + /* 36 | 4 */ // MultiXactId nextMulti; + /* 40 | 4 */ // MultiXactOffset nextMultiOffset; + /* 44 | 4 */ // TransactionId oldestXid; + /* 48 | 4 */ // Oid oldestXidDB; + /* 52 | 4 */ // MultiXactId oldestMulti; + /* 56 | 4 */ // Oid oldestMultiDB; + /* XXX 4-byte hole */ + d.FieldU64("nextXid") + d.FieldU32("nextOid") + d.FieldU32("nextMulti") + d.FieldU32("nextMultiOffset") + d.FieldU32("oldestXid") + d.FieldU32("oldestXidDB") + d.FieldU32("oldestMulti") + d.FieldU32("oldestMultiDB") + d.U32() + + /* 64 | 8 */ // pg_time_t time; + /* 72 | 4 */ // TransactionId oldestCommitTsXid; + /* 76 | 4 */ // TransactionId newestCommitTsXid; + /* 80 | 4 */ // TransactionId oldestActiveXid; + /* XXX 4-byte padding */ + d.FieldS64("time") + d.FieldU32("oldestCommitTsXid") + d.FieldU32("newestCommitTsXid") + d.FieldU32("oldestActiveXid") + d.U32() + }) + + /* 128 | 8 */ // XLogRecPtr unloggedLSN; + /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN") + d.FieldU64("minRecoveryPoint") + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 152 | 8 */ // XLogRecPtr backupStartPoint; + /* 160 | 8 */ // XLogRecPtr backupEndPoint; + /* 168 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint") + d.FieldU64("backupEndPoint") + d.FieldU8("backupEndRequired") + d.U24() + + /* 172 | 4 */ // int wal_level; + /* 176 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level") + d.FieldU8("wal_log_hints") + d.U24() + + /* 180 | 4 */ // int MaxConnections; + /* 184 | 4 */ // int max_worker_processes; + /* 188 | 4 */ // int max_wal_senders; + /* 192 | 4 */ // int max_prepared_xacts; + /* 196 | 4 */ // int max_locks_per_xact; + /* 200 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_wal_senders") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 204 | 4 */ // uint32 maxAlign; + /* 208 | 8 */ // double floatFormat; + /* 216 | 4 */ // uint32 blcksz; + /* 220 | 4 */ // uint32 relseg_size; + /* 224 | 4 */ // uint32 xlog_blcksz; + /* 228 | 4 */ // uint32 xlog_seg_size; + /* 232 | 4 */ // uint32 nameDataLen; + /* 236 | 4 */ // uint32 indexMaxKeys; + /* 240 | 4 */ // uint32 toast_max_chunk_size; + /* 244 | 4 */ // uint32 loblksize; + /* 248 | 1 */ // _Bool float8ByVal; + /* XXX 3-byte hole */ + d.FieldU32("maxAlign") + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float8ByVal") + d.U24() + + /* 252 | 4 */ // uint32 data_checksum_version; + /* 256 | 32 */ // char mock_authentication_nonce[32]; + /* 288 | 4 */ // pg_crc32c crc; + /* XXX 4-byte padding */ + d.FieldU32("data_checksum_version") + d.FieldUTF8ShortStringFixedLen("mock_authentication_nonce", 32) + d.FieldU32("crc") + d.U32() + /* total size (bytes): 296 */ + + d.AssertPosBytes(296) + + return nil +} diff --git a/format/postgres/pgmultixact.go b/format/postgres/pgmultixact.go index 0277a4af2..2b29bcdb5 100644 --- a/format/postgres/pgmultixact.go +++ b/format/postgres/pgmultixact.go @@ -2,20 +2,20 @@ package postgres import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/registry" "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/interp" "github.com/wader/fq/pkg/scalar" ) const BLCKSZ = 8192 func init() { - registry.MustRegister(decode.Format{ + interp.RegisterFormat(decode.Format{ Name: format.PGMULTIXACTOFF, Description: "PostgreSQL multixact offset file", DecodeFn: mxOffsetDecode, }) - registry.MustRegister(decode.Format{ + interp.RegisterFormat(decode.Format{ Name: format.PGMULTIXACTMEM, Description: "PostgreSQL multixact members file", DecodeFn: mxMembersDecode, @@ -30,7 +30,7 @@ func mxOffsetDecode(d *decode.D, in interface{}) interface{} { if d.End() { break } - d.FieldU32("offset", scalar.Hex) + d.FieldU32("offset", scalar.ActualHex) } }) diff --git a/format/postgres/pgwal.go b/format/postgres/pgwal.go index 3efd80a0b..16db44be5 100644 --- a/format/postgres/pgwal.go +++ b/format/postgres/pgwal.go @@ -2,13 +2,13 @@ package postgres import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/registry" "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/interp" "github.com/wader/fq/pkg/scalar" ) func init() { - registry.MustRegister(decode.Format{ + interp.RegisterFormat(decode.Format{ Name: format.PGWAL, Description: "PostgreSQL write-ahead log file", DecodeFn: pgwalDecode, @@ -104,11 +104,11 @@ func pgwalDecode(d *decode.D, in interface{}) interface{} { record_end := record_pos + record_len header_pos := record_end - record_end%XLOG_BLCKSZ d.FieldU32("xl_xid") - d.FieldU64("xl_prev", scalar.Hex) + d.FieldU64("xl_prev", scalar.ActualHex) d.FieldU8("xl_info") d.FieldU8("xl_rmid", rmgrIds) d.FieldRawLen("padding", int64(d.AlignBits(32))) - d.FieldU32("xl_crc", scalar.Hex) + d.FieldU32("xl_crc", scalar.ActualHex) var lenghts []uint64 = []uint64{} diff --git a/format/postgres/pgwal_page.go b/format/postgres/pgwal_page.go index 6a1049947..412d78c46 100644 --- a/format/postgres/pgwal_page.go +++ b/format/postgres/pgwal_page.go @@ -2,13 +2,13 @@ package postgres import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/registry" "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/interp" _ "github.com/wader/fq/pkg/scalar" ) func init() { - registry.MustRegister(decode.Format{ + interp.RegisterFormat(decode.Format{ Name: format.PGWALPAGE, Description: "PostgreSQL write-ahead page", DecodeFn: walpageDecode, diff --git a/pkg/decode/decode.go b/pkg/decode/decode.go index 80bd02ec8..9c1ef126e 100644 --- a/pkg/decode/decode.go +++ b/pkg/decode/decode.go @@ -805,6 +805,14 @@ func (d *D) FieldRangeFn(name string, firstBit int64, nBits int64, fn func() *Va return v } +func (d *D) AssertPosBytes(nBytes int64) { + nBits := nBytes * 8 + if d.Pos() != nBits { + // TODO: + panic(DecoderError{Reason: fmt.Sprintf("expected position bytes %d, bits %d", nBytes, nBits), Pos: d.Pos()}) + } +} + func (d *D) AssertAtLeastBitsLeft(nBits int64) { if d.Options.Force { return diff --git a/pkg/interp/buffer.go b/pkg/interp/buffer.go deleted file mode 100644 index e69de29bb..000000000 From 8cf83fbc1a3a968b8e1f26afca7822bf4a585043 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 19 Jul 2022 12:00:00 +0300 Subject: [PATCH 003/141] pg_control implementation --- format/postgres/pg_control.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index d9abb22d8..85d1e7067 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -9,7 +9,7 @@ import ( func init() { interp.RegisterFormat(decode.Format{ Name: format.PG_CONTROL, - Description: "PostgreSQL 14 control file", + Description: "PostgreSQL control file", DecodeFn: decodePgControl, }) } @@ -24,8 +24,8 @@ func decodePgControl(d *decode.D, in any) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; - d.FieldU64("system_identifier") - pgControlVersion := d.FieldU32("pg_control_version") + d.U64() + pgControlVersion := d.U32() switch pgControlVersion { case PG_CONTROL_VERSION_11: @@ -109,13 +109,14 @@ func decodePgControl(d *decode.D, in any) any { /* total size (bytes): 80 */ // func decodePgControl11(d *decode.D, in any) any { + d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; /* 16 | 4 */ // DBState state; /* XXX 4-byte hole */ - //d.FieldU64("system_identifier") - //d.FieldU32("pg_control_version") + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version") d.FieldU32("catalog_version_no") d.FieldU32("state") d.U32() @@ -234,7 +235,7 @@ func decodePgControl11(d *decode.D, in any) any { d.FieldU8("float4ByVal") d.FieldU8("float8ByVal") d.U16() - + /* 252 | 4 */ // uint32 data_checksum_version; /* 256 | 32 */ // char mock_authentication_nonce[32]; /* 288 | 4 */ // pg_crc32c crc; @@ -319,13 +320,14 @@ func decodePgControl11(d *decode.D, in any) any { // /* total size (bytes): 88 */ func decodePgControl14(d *decode.D, in any) any { + d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; /* 16 | 4 */ // DBState state; /* XXX 4-byte hole */ - //d.FieldU64("system_identifier") - //d.FieldU32("pg_control_version") + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version") d.FieldU32("catalog_version_no") d.FieldU32("state") d.U32() From d4f8dfa2c209af90b9c731c21adca0d227c230ef Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 20 Jul 2022 08:43:24 +0300 Subject: [PATCH 004/141] Add flavour arg to postgres parser --- format/format.go | 4 + .../flavours/postgres11/pg_control.go | 216 +++++++++ .../flavours/postgres14/pg_control.go | 212 ++++++++ format/postgres/pg_control.go | 451 ++---------------- 4 files changed, 459 insertions(+), 424 deletions(-) create mode 100644 format/postgres/flavours/postgres11/pg_control.go create mode 100644 format/postgres/flavours/postgres14/pg_control.go diff --git a/format/format.go b/format/format.go index 6dd6546b5..420208abc 100644 --- a/format/format.go +++ b/format/format.go @@ -279,3 +279,7 @@ type Mp4In struct { type ZipIn struct { Uncompress bool `doc:"Uncompress and probe files"` } + +type PostgresIn struct { + Flavour string `doc:"PostgreSQL flavour: postgres, postgres13, pgpro..."` +} diff --git a/format/postgres/flavours/postgres11/pg_control.go b/format/postgres/flavours/postgres11/pg_control.go new file mode 100644 index 000000000..1185bc8c1 --- /dev/null +++ b/format/postgres/flavours/postgres11/pg_control.go @@ -0,0 +1,216 @@ +package postgres11 + +import "github.com/wader/fq/pkg/decode" + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 80 */ // CheckPoint checkPointCopy; +/* 120 | 8 */ // XLogRecPtr unloggedLSN; +/* 128 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 136 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 144 | 8 */ // XLogRecPtr backupStartPoint; +/* 152 | 8 */ // XLogRecPtr backupEndPoint; +/* 160 | 1 */ // _Bool backupEndRequired; +/* XXX 3-byte hole */ +/* 164 | 4 */ // int wal_level; +/* 168 | 1 */ // _Bool wal_log_hints; +/* XXX 3-byte hole */ +/* 172 | 4 */ // int MaxConnections; +/* 176 | 4 */ // int max_worker_processes; +/* 180 | 4 */ // int max_prepared_xacts; +/* 184 | 4 */ // int max_locks_per_xact; +/* 188 | 1 */ // _Bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 192 | 4 */ // uint32 maxAlign; +/* XXX 4-byte hole */ +/* 200 | 8 */ // double floatFormat; +/* 208 | 4 */ // uint32 blcksz; +/* 212 | 4 */ // uint32 relseg_size; +/* 216 | 4 */ // uint32 xlog_blcksz; +/* 220 | 4 */ // uint32 xlog_seg_size; +/* 224 | 4 */ // uint32 nameDataLen; +/* 228 | 4 */ // uint32 indexMaxKeys; +/* 232 | 4 */ // uint32 toast_max_chunk_size; +/* 236 | 4 */ // uint32 loblksize; +/* 240 | 1 */ // _Bool float4ByVal; +/* 241 | 1 */ // _Bool float8ByVal; +/* XXX 2-byte hole */ +/* 244 | 4 */ // uint32 data_checksum_version; +/* 248 | 32 */ // char mock_authentication_nonce[32]; +/* 280 | 4 */ // pg_crc32c crc; +/* XXX 4-byte padding */ +// +/* total size (bytes): 288 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // _Bool fullPageWrites; +/* XXX 3-byte hole */ +/* 20 | 4 */ // uint32 nextXidEpoch; +/* 24 | 4 */ // TransactionId nextXid; +/* 28 | 4 */ // Oid nextOid; +/* 32 | 4 */ // MultiXactId nextMulti; +/* 36 | 4 */ // MultiXactOffset nextMultiOffset; +/* 40 | 4 */ // TransactionId oldestXid; +/* 44 | 4 */ // Oid oldestXidDB; +/* 48 | 4 */ // MultiXactId oldestMulti; +/* 52 | 4 */ // Oid oldestMultiDB; +/* 56 | 8 */ // pg_time_t time; +/* 64 | 4 */ // TransactionId oldestCommitTsXid; +/* 68 | 4 */ // TransactionId newestCommitTsXid; +/* 72 | 4 */ // TransactionId oldestActiveXid; +/* XXX 4-byte padding */ +// +/* total size (bytes): 80 */ +// +func DecodePgControl11(d *decode.D, in any) any { + d.SeekAbs(0) + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version") + d.FieldU32("catalog_version_no") + d.FieldU32("state") + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 80 */ // CheckPoint checkPointCopy; + d.FieldS64("time") + d.FieldU64("checkPoint") + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 3-byte hole */ + d.FieldU64("redo") + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U24() + + /* 20 | 4 */ // uint32 nextXidEpoch; + /* 24 | 4 */ // TransactionId nextXid; + /* 28 | 4 */ // Oid nextOid; + /* 32 | 4 */ // MultiXactId nextMulti; + /* 36 | 4 */ // MultiXactOffset nextMultiOffset; + /* 40 | 4 */ // TransactionId oldestXid; + /* 44 | 4 */ // Oid oldestXidDB; + /* 48 | 4 */ // MultiXactId oldestMulti; + /* 52 | 4 */ // Oid oldestMultiDB; + /* 56 | 8 */ // pg_time_t time; + /* 64 | 4 */ // TransactionId oldestCommitTsXid; + /* 68 | 4 */ // TransactionId newestCommitTsXid; + /* 72 | 4 */ // TransactionId oldestActiveXid; + /* XXX 4-byte padding */ + d.FieldU32("nextXidEpoch") + d.FieldU32("nextXid") + d.FieldU32("nextOid") + d.FieldU32("nextMulti") + d.FieldU32("nextMultiOffset") + d.FieldU32("oldestXid") + d.FieldU32("oldestXidDB") + d.FieldU32("oldestMulti") + d.FieldU32("oldestMultiDB") + d.FieldS64("time") + d.FieldU32("oldestCommitTsXid") + d.FieldU32("newestCommitTsXid") + d.FieldU32("oldestActiveXid") + d.U32() + }) + + /* 120 | 8 */ // XLogRecPtr unloggedLSN; + /* 128 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 136 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN") + d.FieldU64("minRecoveryPoint") + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 144 | 8 */ // XLogRecPtr backupStartPoint; + /* 152 | 8 */ // XLogRecPtr backupEndPoint; + /* 160 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint") + d.FieldU64("backupEndPoint") + d.FieldU8("backupEndRequired") + d.U24() + + /* 164 | 4 */ // int wal_level; + /* 168 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level") + d.FieldU8("wal_log_hints") + d.U24() + + /* 172 | 4 */ // int MaxConnections; + /* 176 | 4 */ // int max_worker_processes; + /* 180 | 4 */ // int max_prepared_xacts; + /* 184 | 4 */ // int max_locks_per_xact; + /* 188 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 192 | 4 */ // uint32 maxAlign; + /* XXX 4-byte hole */ + d.FieldU32("maxAlign") + d.U32() + + /* 200 | 8 */ // double floatFormat; + /* 208 | 4 */ // uint32 blcksz; + /* 212 | 4 */ // uint32 relseg_size; + /* 216 | 4 */ // uint32 xlog_blcksz; + /* 220 | 4 */ // uint32 xlog_seg_size; + /* 224 | 4 */ // uint32 nameDataLen; + /* 228 | 4 */ // uint32 indexMaxKeys; + /* 232 | 4 */ // uint32 toast_max_chunk_size; + /* 236 | 4 */ // uint32 loblksize; + /* 240 | 1 */ // _Bool float4ByVal; + /* 241 | 1 */ // _Bool float8ByVal; + /* XXX 2-byte hole */ + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float4ByVal") + d.FieldU8("float8ByVal") + d.U16() + + /* 252 | 4 */ // uint32 data_checksum_version; + /* 256 | 32 */ // char mock_authentication_nonce[32]; + /* 288 | 4 */ // pg_crc32c crc; + /* XXX 4-byte padding */ + d.FieldU32("data_checksum_version") + d.FieldUTF8ShortStringFixedLen("mock_authentication_nonce", 32) + d.FieldU32("crc") + d.U32() + /* total size (bytes): 288 */ + + d.AssertPosBytes(288) + + return nil +} diff --git a/format/postgres/flavours/postgres14/pg_control.go b/format/postgres/flavours/postgres14/pg_control.go new file mode 100644 index 000000000..85e771b44 --- /dev/null +++ b/format/postgres/flavours/postgres14/pg_control.go @@ -0,0 +1,212 @@ +package postgres14 + +import "github.com/wader/fq/pkg/decode" + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 88 */ // CheckPoint checkPointCopy; +/* 128 | 8 */ // XLogRecPtr unloggedLSN; +/* 136 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 144 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 152 | 8 */ // XLogRecPtr backupStartPoint; +/* 160 | 8 */ // XLogRecPtr backupEndPoint; +/* 168 | 1 */ // _Bool backupEndRequired; +/* XXX 3-byte hole */ +/* 172 | 4 */ // int wal_level; +/* 176 | 1 */ // _Bool wal_log_hints; +/* XXX 3-byte hole */ +/* 180 | 4 */ // int MaxConnections; +/* 184 | 4 */ // int max_worker_processes; +/* 188 | 4 */ // int max_wal_senders; +/* 192 | 4 */ // int max_prepared_xacts; +/* 196 | 4 */ // int max_locks_per_xact; +/* 200 | 1 */ // _Bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 204 | 4 */ // uint32 maxAlign; +/* 208 | 8 */ // double floatFormat; +/* 216 | 4 */ // uint32 blcksz; +/* 220 | 4 */ // uint32 relseg_size; +/* 224 | 4 */ // uint32 xlog_blcksz; +/* 228 | 4 */ // uint32 xlog_seg_size; +/* 232 | 4 */ // uint32 nameDataLen; +/* 236 | 4 */ // uint32 indexMaxKeys; +/* 240 | 4 */ // uint32 toast_max_chunk_size; +/* 244 | 4 */ // uint32 loblksize; +/* 248 | 1 */ // _Bool float8ByVal; +/* XXX 3-byte hole */ +/* 252 | 4 */ // uint32 data_checksum_version; +/* 256 | 32 */ // char mock_authentication_nonce[32]; +/* 288 | 4 */ // pg_crc32c crc; +/* XXX 4-byte padding */ +// +/* total size (bytes): 296 */ +// +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // _Bool fullPageWrites; +/* XXX 7-byte hole */ +/* 24 | 8 */ // FullTransactionId nextXid; +/* 32 | 4 */ // Oid nextOid; +/* 36 | 4 */ // MultiXactId nextMulti; +/* 40 | 4 */ // MultiXactOffset nextMultiOffset; +/* 44 | 4 */ // TransactionId oldestXid; +/* 48 | 4 */ // Oid oldestXidDB; +/* 52 | 4 */ // MultiXactId oldestMulti; +/* 56 | 4 */ // Oid oldestMultiDB; +/* XXX 4-byte hole */ +/* 64 | 8 */ // pg_time_t time; +/* 72 | 4 */ // TransactionId oldestCommitTsXid; +/* 76 | 4 */ // TransactionId newestCommitTsXid; +/* 80 | 4 */ // TransactionId oldestActiveXid; +/* XXX 4-byte padding */ +// +/* total size (bytes): 88 */ +func DecodePgControl14(d *decode.D, in any) any { + d.SeekAbs(0) + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version") + d.FieldU32("catalog_version_no") + d.FieldU32("state") + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 88 */ // CheckPoint checkPointCopy; + d.FieldS64("time") + d.FieldU64("checkPoint") + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 7-byte hole */ + d.FieldU64("redo") + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U56() + + /* 24 | 8 */ // FullTransactionId nextXid; + /* 32 | 4 */ // Oid nextOid; + /* 36 | 4 */ // MultiXactId nextMulti; + /* 40 | 4 */ // MultiXactOffset nextMultiOffset; + /* 44 | 4 */ // TransactionId oldestXid; + /* 48 | 4 */ // Oid oldestXidDB; + /* 52 | 4 */ // MultiXactId oldestMulti; + /* 56 | 4 */ // Oid oldestMultiDB; + /* XXX 4-byte hole */ + d.FieldU64("nextXid") + d.FieldU32("nextOid") + d.FieldU32("nextMulti") + d.FieldU32("nextMultiOffset") + d.FieldU32("oldestXid") + d.FieldU32("oldestXidDB") + d.FieldU32("oldestMulti") + d.FieldU32("oldestMultiDB") + d.U32() + + /* 64 | 8 */ // pg_time_t time; + /* 72 | 4 */ // TransactionId oldestCommitTsXid; + /* 76 | 4 */ // TransactionId newestCommitTsXid; + /* 80 | 4 */ // TransactionId oldestActiveXid; + /* XXX 4-byte padding */ + d.FieldS64("time") + d.FieldU32("oldestCommitTsXid") + d.FieldU32("newestCommitTsXid") + d.FieldU32("oldestActiveXid") + d.U32() + }) + + /* 128 | 8 */ // XLogRecPtr unloggedLSN; + /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN") + d.FieldU64("minRecoveryPoint") + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 152 | 8 */ // XLogRecPtr backupStartPoint; + /* 160 | 8 */ // XLogRecPtr backupEndPoint; + /* 168 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint") + d.FieldU64("backupEndPoint") + d.FieldU8("backupEndRequired") + d.U24() + + /* 172 | 4 */ // int wal_level; + /* 176 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level") + d.FieldU8("wal_log_hints") + d.U24() + + /* 180 | 4 */ // int MaxConnections; + /* 184 | 4 */ // int max_worker_processes; + /* 188 | 4 */ // int max_wal_senders; + /* 192 | 4 */ // int max_prepared_xacts; + /* 196 | 4 */ // int max_locks_per_xact; + /* 200 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_wal_senders") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 204 | 4 */ // uint32 maxAlign; + /* 208 | 8 */ // double floatFormat; + /* 216 | 4 */ // uint32 blcksz; + /* 220 | 4 */ // uint32 relseg_size; + /* 224 | 4 */ // uint32 xlog_blcksz; + /* 228 | 4 */ // uint32 xlog_seg_size; + /* 232 | 4 */ // uint32 nameDataLen; + /* 236 | 4 */ // uint32 indexMaxKeys; + /* 240 | 4 */ // uint32 toast_max_chunk_size; + /* 244 | 4 */ // uint32 loblksize; + /* 248 | 1 */ // _Bool float8ByVal; + /* XXX 3-byte hole */ + d.FieldU32("maxAlign") + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float8ByVal") + d.U24() + + /* 252 | 4 */ // uint32 data_checksum_version; + /* 256 | 32 */ // char mock_authentication_nonce[32]; + /* 288 | 4 */ // pg_crc32c crc; + /* XXX 4-byte padding */ + d.FieldU32("data_checksum_version") + d.FieldUTF8ShortStringFixedLen("mock_authentication_nonce", 32) + d.FieldU32("crc") + d.U32() + /* total size (bytes): 296 */ + + d.AssertPosBytes(296) + + return nil +} diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 85d1e7067..0446e89e8 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -2,6 +2,8 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/postgres11" + "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" ) @@ -11,6 +13,9 @@ func init() { Name: format.PG_CONTROL, Description: "PostgreSQL control file", DecodeFn: decodePgControl, + DecodeInArg: format.PostgresIn{ + Flavour: "default", + }, }) } @@ -19,9 +24,29 @@ const ( PG_CONTROL_VERSION_14 = 1300 ) +const ( + PG_FLAVOUR_POSTGRES = "postgres" + PG_FLAVOUR_POSTGRES11 = "postgres11" + PG_FLAVOUR_POSTGRES14 = "postgres14" +) + func decodePgControl(d *decode.D, in any) any { d.Endian = decode.LittleEndian + flavour := in.(format.PostgresIn).Flavour + switch flavour { + case PG_FLAVOUR_POSTGRES11: + return postgres11.DecodePgControl11(d, in) + case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: + return postgres14.DecodePgControl14(d, in) + default: + break + } + + return probeForDecode(d, in) +} + +func probeForDecode(d *decode.D, in any) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; d.U64() @@ -29,433 +54,11 @@ func decodePgControl(d *decode.D, in any) any { switch pgControlVersion { case PG_CONTROL_VERSION_11: - return decodePgControl11(d, in) + return postgres11.DecodePgControl11(d, in) case PG_CONTROL_VERSION_14: - return decodePgControl14(d, in) + return postgres14.DecodePgControl14(d, in) default: d.Fatalf("unsupported PG_CONTROL_VERSION = %d\n", pgControlVersion) } return nil } - -// type = struct ControlFileData { -/* 0 | 8 */ // uint64 system_identifier; -/* 8 | 4 */ // uint32 pg_control_version; -/* 12 | 4 */ // uint32 catalog_version_no; -/* 16 | 4 */ // DBState state; -/* XXX 4-byte hole */ -/* 24 | 8 */ // pg_time_t time; -/* 32 | 8 */ // XLogRecPtr checkPoint; -/* 40 | 80 */ // CheckPoint checkPointCopy; -/* 120 | 8 */ // XLogRecPtr unloggedLSN; -/* 128 | 8 */ // XLogRecPtr minRecoveryPoint; -/* 136 | 4 */ // TimeLineID minRecoveryPointTLI; -/* XXX 4-byte hole */ -/* 144 | 8 */ // XLogRecPtr backupStartPoint; -/* 152 | 8 */ // XLogRecPtr backupEndPoint; -/* 160 | 1 */ // _Bool backupEndRequired; -/* XXX 3-byte hole */ -/* 164 | 4 */ // int wal_level; -/* 168 | 1 */ // _Bool wal_log_hints; -/* XXX 3-byte hole */ -/* 172 | 4 */ // int MaxConnections; -/* 176 | 4 */ // int max_worker_processes; -/* 180 | 4 */ // int max_prepared_xacts; -/* 184 | 4 */ // int max_locks_per_xact; -/* 188 | 1 */ // _Bool track_commit_timestamp; -/* XXX 3-byte hole */ -/* 192 | 4 */ // uint32 maxAlign; -/* XXX 4-byte hole */ -/* 200 | 8 */ // double floatFormat; -/* 208 | 4 */ // uint32 blcksz; -/* 212 | 4 */ // uint32 relseg_size; -/* 216 | 4 */ // uint32 xlog_blcksz; -/* 220 | 4 */ // uint32 xlog_seg_size; -/* 224 | 4 */ // uint32 nameDataLen; -/* 228 | 4 */ // uint32 indexMaxKeys; -/* 232 | 4 */ // uint32 toast_max_chunk_size; -/* 236 | 4 */ // uint32 loblksize; -/* 240 | 1 */ // _Bool float4ByVal; -/* 241 | 1 */ // _Bool float8ByVal; -/* XXX 2-byte hole */ -/* 244 | 4 */ // uint32 data_checksum_version; -/* 248 | 32 */ // char mock_authentication_nonce[32]; -/* 280 | 4 */ // pg_crc32c crc; -/* XXX 4-byte padding */ -// -/* total size (bytes): 288 */ - -// type = struct CheckPoint { -/* 0 | 8 */ // XLogRecPtr redo; -/* 8 | 4 */ // TimeLineID ThisTimeLineID; -/* 12 | 4 */ // TimeLineID PrevTimeLineID; -/* 16 | 1 */ // _Bool fullPageWrites; -/* XXX 3-byte hole */ -/* 20 | 4 */ // uint32 nextXidEpoch; -/* 24 | 4 */ // TransactionId nextXid; -/* 28 | 4 */ // Oid nextOid; -/* 32 | 4 */ // MultiXactId nextMulti; -/* 36 | 4 */ // MultiXactOffset nextMultiOffset; -/* 40 | 4 */ // TransactionId oldestXid; -/* 44 | 4 */ // Oid oldestXidDB; -/* 48 | 4 */ // MultiXactId oldestMulti; -/* 52 | 4 */ // Oid oldestMultiDB; -/* 56 | 8 */ // pg_time_t time; -/* 64 | 4 */ // TransactionId oldestCommitTsXid; -/* 68 | 4 */ // TransactionId newestCommitTsXid; -/* 72 | 4 */ // TransactionId oldestActiveXid; -/* XXX 4-byte padding */ -// -/* total size (bytes): 80 */ -// -func decodePgControl11(d *decode.D, in any) any { - d.SeekAbs(0) - /* 0 | 8 */ // uint64 system_identifier; - /* 8 | 4 */ // uint32 pg_control_version; - /* 12 | 4 */ // uint32 catalog_version_no; - /* 16 | 4 */ // DBState state; - /* XXX 4-byte hole */ - d.FieldU64("system_identifier") - d.FieldU32("pg_control_version") - d.FieldU32("catalog_version_no") - d.FieldU32("state") - d.U32() - - /* 24 | 8 */ // pg_time_t time; - /* 32 | 8 */ // XLogRecPtr checkPoint; - /* 40 | 80 */ // CheckPoint checkPointCopy; - d.FieldS64("time") - d.FieldU64("checkPoint") - d.FieldStruct("checkPointCopy", func(d *decode.D) { - /* 0 | 8 */ // XLogRecPtr redo; - /* 8 | 4 */ // TimeLineID ThisTimeLineID; - /* 12 | 4 */ // TimeLineID PrevTimeLineID; - /* 16 | 1 */ // _Bool fullPageWrites; - /* XXX 3-byte hole */ - d.FieldU64("redo") - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") - d.U24() - - /* 20 | 4 */ // uint32 nextXidEpoch; - /* 24 | 4 */ // TransactionId nextXid; - /* 28 | 4 */ // Oid nextOid; - /* 32 | 4 */ // MultiXactId nextMulti; - /* 36 | 4 */ // MultiXactOffset nextMultiOffset; - /* 40 | 4 */ // TransactionId oldestXid; - /* 44 | 4 */ // Oid oldestXidDB; - /* 48 | 4 */ // MultiXactId oldestMulti; - /* 52 | 4 */ // Oid oldestMultiDB; - /* 56 | 8 */ // pg_time_t time; - /* 64 | 4 */ // TransactionId oldestCommitTsXid; - /* 68 | 4 */ // TransactionId newestCommitTsXid; - /* 72 | 4 */ // TransactionId oldestActiveXid; - /* XXX 4-byte padding */ - d.FieldU32("nextXidEpoch") - d.FieldU32("nextXid") - d.FieldU32("nextOid") - d.FieldU32("nextMulti") - d.FieldU32("nextMultiOffset") - d.FieldU32("oldestXid") - d.FieldU32("oldestXidDB") - d.FieldU32("oldestMulti") - d.FieldU32("oldestMultiDB") - d.FieldS64("time") - d.FieldU32("oldestCommitTsXid") - d.FieldU32("newestCommitTsXid") - d.FieldU32("oldestActiveXid") - d.U32() - }) - - /* 120 | 8 */ // XLogRecPtr unloggedLSN; - /* 128 | 8 */ // XLogRecPtr minRecoveryPoint; - /* 136 | 4 */ // TimeLineID minRecoveryPointTLI; - /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN") - d.FieldU64("minRecoveryPoint") - d.FieldU32("minRecoveryPointTLI") - d.U32() - - /* 144 | 8 */ // XLogRecPtr backupStartPoint; - /* 152 | 8 */ // XLogRecPtr backupEndPoint; - /* 160 | 1 */ // _Bool backupEndRequired; - /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint") - d.FieldU64("backupEndPoint") - d.FieldU8("backupEndRequired") - d.U24() - - /* 164 | 4 */ // int wal_level; - /* 168 | 1 */ // _Bool wal_log_hints; - /* XXX 3-byte hole */ - d.FieldS32("wal_level") - d.FieldU8("wal_log_hints") - d.U24() - - /* 172 | 4 */ // int MaxConnections; - /* 176 | 4 */ // int max_worker_processes; - /* 180 | 4 */ // int max_prepared_xacts; - /* 184 | 4 */ // int max_locks_per_xact; - /* 188 | 1 */ // _Bool track_commit_timestamp; - /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") - d.FieldS32("max_worker_processes") - d.FieldS32("max_prepared_xacts") - d.FieldS32("max_locks_per_xact") - d.FieldU8("track_commit_timestamp") - d.U24() - - /* 192 | 4 */ // uint32 maxAlign; - /* XXX 4-byte hole */ - d.FieldU32("maxAlign") - d.U32() - - /* 200 | 8 */ // double floatFormat; - /* 208 | 4 */ // uint32 blcksz; - /* 212 | 4 */ // uint32 relseg_size; - /* 216 | 4 */ // uint32 xlog_blcksz; - /* 220 | 4 */ // uint32 xlog_seg_size; - /* 224 | 4 */ // uint32 nameDataLen; - /* 228 | 4 */ // uint32 indexMaxKeys; - /* 232 | 4 */ // uint32 toast_max_chunk_size; - /* 236 | 4 */ // uint32 loblksize; - /* 240 | 1 */ // _Bool float4ByVal; - /* 241 | 1 */ // _Bool float8ByVal; - /* XXX 2-byte hole */ - d.FieldF64("floatFormat") - d.FieldU32("blcksz") - d.FieldU32("relseg_size") - d.FieldU32("xlog_blcksz") - d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") - d.FieldU32("toast_max_chunk_size") - d.FieldU32("loblksize") - d.FieldU8("float4ByVal") - d.FieldU8("float8ByVal") - d.U16() - - /* 252 | 4 */ // uint32 data_checksum_version; - /* 256 | 32 */ // char mock_authentication_nonce[32]; - /* 288 | 4 */ // pg_crc32c crc; - /* XXX 4-byte padding */ - d.FieldU32("data_checksum_version") - d.FieldUTF8ShortStringFixedLen("mock_authentication_nonce", 32) - d.FieldU32("crc") - d.U32() - /* total size (bytes): 288 */ - - d.AssertPosBytes(288) - - return nil -} - -// type = struct ControlFileData { -/* 0 | 8 */ // uint64 system_identifier; -/* 8 | 4 */ // uint32 pg_control_version; -/* 12 | 4 */ // uint32 catalog_version_no; -/* 16 | 4 */ // DBState state; -/* XXX 4-byte hole */ -/* 24 | 8 */ // pg_time_t time; -/* 32 | 8 */ // XLogRecPtr checkPoint; -/* 40 | 88 */ // CheckPoint checkPointCopy; -/* 128 | 8 */ // XLogRecPtr unloggedLSN; -/* 136 | 8 */ // XLogRecPtr minRecoveryPoint; -/* 144 | 4 */ // TimeLineID minRecoveryPointTLI; -/* XXX 4-byte hole */ -/* 152 | 8 */ // XLogRecPtr backupStartPoint; -/* 160 | 8 */ // XLogRecPtr backupEndPoint; -/* 168 | 1 */ // _Bool backupEndRequired; -/* XXX 3-byte hole */ -/* 172 | 4 */ // int wal_level; -/* 176 | 1 */ // _Bool wal_log_hints; -/* XXX 3-byte hole */ -/* 180 | 4 */ // int MaxConnections; -/* 184 | 4 */ // int max_worker_processes; -/* 188 | 4 */ // int max_wal_senders; -/* 192 | 4 */ // int max_prepared_xacts; -/* 196 | 4 */ // int max_locks_per_xact; -/* 200 | 1 */ // _Bool track_commit_timestamp; -/* XXX 3-byte hole */ -/* 204 | 4 */ // uint32 maxAlign; -/* 208 | 8 */ // double floatFormat; -/* 216 | 4 */ // uint32 blcksz; -/* 220 | 4 */ // uint32 relseg_size; -/* 224 | 4 */ // uint32 xlog_blcksz; -/* 228 | 4 */ // uint32 xlog_seg_size; -/* 232 | 4 */ // uint32 nameDataLen; -/* 236 | 4 */ // uint32 indexMaxKeys; -/* 240 | 4 */ // uint32 toast_max_chunk_size; -/* 244 | 4 */ // uint32 loblksize; -/* 248 | 1 */ // _Bool float8ByVal; -/* XXX 3-byte hole */ -/* 252 | 4 */ // uint32 data_checksum_version; -/* 256 | 32 */ // char mock_authentication_nonce[32]; -/* 288 | 4 */ // pg_crc32c crc; -/* XXX 4-byte padding */ -// -/* total size (bytes): 296 */ -// -// type = struct CheckPoint { -/* 0 | 8 */ // XLogRecPtr redo; -/* 8 | 4 */ // TimeLineID ThisTimeLineID; -/* 12 | 4 */ // TimeLineID PrevTimeLineID; -/* 16 | 1 */ // _Bool fullPageWrites; -/* XXX 7-byte hole */ -/* 24 | 8 */ // FullTransactionId nextXid; -/* 32 | 4 */ // Oid nextOid; -/* 36 | 4 */ // MultiXactId nextMulti; -/* 40 | 4 */ // MultiXactOffset nextMultiOffset; -/* 44 | 4 */ // TransactionId oldestXid; -/* 48 | 4 */ // Oid oldestXidDB; -/* 52 | 4 */ // MultiXactId oldestMulti; -/* 56 | 4 */ // Oid oldestMultiDB; -/* XXX 4-byte hole */ -/* 64 | 8 */ // pg_time_t time; -/* 72 | 4 */ // TransactionId oldestCommitTsXid; -/* 76 | 4 */ // TransactionId newestCommitTsXid; -/* 80 | 4 */ // TransactionId oldestActiveXid; -/* XXX 4-byte padding */ -// -/* total size (bytes): 88 */ -func decodePgControl14(d *decode.D, in any) any { - d.SeekAbs(0) - /* 0 | 8 */ // uint64 system_identifier; - /* 8 | 4 */ // uint32 pg_control_version; - /* 12 | 4 */ // uint32 catalog_version_no; - /* 16 | 4 */ // DBState state; - /* XXX 4-byte hole */ - d.FieldU64("system_identifier") - d.FieldU32("pg_control_version") - d.FieldU32("catalog_version_no") - d.FieldU32("state") - d.U32() - - /* 24 | 8 */ // pg_time_t time; - /* 32 | 8 */ // XLogRecPtr checkPoint; - /* 40 | 88 */ // CheckPoint checkPointCopy; - d.FieldS64("time") - d.FieldU64("checkPoint") - d.FieldStruct("checkPointCopy", func(d *decode.D) { - /* 0 | 8 */ // XLogRecPtr redo; - /* 8 | 4 */ // TimeLineID ThisTimeLineID; - /* 12 | 4 */ // TimeLineID PrevTimeLineID; - /* 16 | 1 */ // _Bool fullPageWrites; - /* XXX 7-byte hole */ - d.FieldU64("redo") - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") - d.U56() - - /* 24 | 8 */ // FullTransactionId nextXid; - /* 32 | 4 */ // Oid nextOid; - /* 36 | 4 */ // MultiXactId nextMulti; - /* 40 | 4 */ // MultiXactOffset nextMultiOffset; - /* 44 | 4 */ // TransactionId oldestXid; - /* 48 | 4 */ // Oid oldestXidDB; - /* 52 | 4 */ // MultiXactId oldestMulti; - /* 56 | 4 */ // Oid oldestMultiDB; - /* XXX 4-byte hole */ - d.FieldU64("nextXid") - d.FieldU32("nextOid") - d.FieldU32("nextMulti") - d.FieldU32("nextMultiOffset") - d.FieldU32("oldestXid") - d.FieldU32("oldestXidDB") - d.FieldU32("oldestMulti") - d.FieldU32("oldestMultiDB") - d.U32() - - /* 64 | 8 */ // pg_time_t time; - /* 72 | 4 */ // TransactionId oldestCommitTsXid; - /* 76 | 4 */ // TransactionId newestCommitTsXid; - /* 80 | 4 */ // TransactionId oldestActiveXid; - /* XXX 4-byte padding */ - d.FieldS64("time") - d.FieldU32("oldestCommitTsXid") - d.FieldU32("newestCommitTsXid") - d.FieldU32("oldestActiveXid") - d.U32() - }) - - /* 128 | 8 */ // XLogRecPtr unloggedLSN; - /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; - /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; - /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN") - d.FieldU64("minRecoveryPoint") - d.FieldU32("minRecoveryPointTLI") - d.U32() - - /* 152 | 8 */ // XLogRecPtr backupStartPoint; - /* 160 | 8 */ // XLogRecPtr backupEndPoint; - /* 168 | 1 */ // _Bool backupEndRequired; - /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint") - d.FieldU64("backupEndPoint") - d.FieldU8("backupEndRequired") - d.U24() - - /* 172 | 4 */ // int wal_level; - /* 176 | 1 */ // _Bool wal_log_hints; - /* XXX 3-byte hole */ - d.FieldS32("wal_level") - d.FieldU8("wal_log_hints") - d.U24() - - /* 180 | 4 */ // int MaxConnections; - /* 184 | 4 */ // int max_worker_processes; - /* 188 | 4 */ // int max_wal_senders; - /* 192 | 4 */ // int max_prepared_xacts; - /* 196 | 4 */ // int max_locks_per_xact; - /* 200 | 1 */ // _Bool track_commit_timestamp; - /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") - d.FieldS32("max_worker_processes") - d.FieldS32("max_wal_senders") - d.FieldS32("max_prepared_xacts") - d.FieldS32("max_locks_per_xact") - d.FieldU8("track_commit_timestamp") - d.U24() - - /* 204 | 4 */ // uint32 maxAlign; - /* 208 | 8 */ // double floatFormat; - /* 216 | 4 */ // uint32 blcksz; - /* 220 | 4 */ // uint32 relseg_size; - /* 224 | 4 */ // uint32 xlog_blcksz; - /* 228 | 4 */ // uint32 xlog_seg_size; - /* 232 | 4 */ // uint32 nameDataLen; - /* 236 | 4 */ // uint32 indexMaxKeys; - /* 240 | 4 */ // uint32 toast_max_chunk_size; - /* 244 | 4 */ // uint32 loblksize; - /* 248 | 1 */ // _Bool float8ByVal; - /* XXX 3-byte hole */ - d.FieldU32("maxAlign") - d.FieldF64("floatFormat") - d.FieldU32("blcksz") - d.FieldU32("relseg_size") - d.FieldU32("xlog_blcksz") - d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") - d.FieldU32("toast_max_chunk_size") - d.FieldU32("loblksize") - d.FieldU8("float8ByVal") - d.U24() - - /* 252 | 4 */ // uint32 data_checksum_version; - /* 256 | 32 */ // char mock_authentication_nonce[32]; - /* 288 | 4 */ // pg_crc32c crc; - /* XXX 4-byte padding */ - d.FieldU32("data_checksum_version") - d.FieldUTF8ShortStringFixedLen("mock_authentication_nonce", 32) - d.FieldU32("crc") - d.U32() - /* total size (bytes): 296 */ - - d.AssertPosBytes(296) - - return nil -} From 0107d122f57241f4e69a2f74c3c4d008e43d97c6 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 20 Jul 2022 09:29:46 +0300 Subject: [PATCH 005/141] Add pgproee14 flavour to postgres --- .../postgres/flavours/pgproee14/pg_control.go | 224 ++++++++++++++++++ .../flavours/postgres11/pg_control.go | 2 +- .../flavours/postgres14/pg_control.go | 2 +- format/postgres/pg_control.go | 12 +- 4 files changed, 234 insertions(+), 6 deletions(-) create mode 100644 format/postgres/flavours/pgproee14/pg_control.go diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go new file mode 100644 index 000000000..eaed64884 --- /dev/null +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -0,0 +1,224 @@ +package pgproee14 + +import "github.com/wader/fq/pkg/decode" + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 120 */ // CheckPoint checkPointCopy; +/* 160 | 8 */ // XLogRecPtr unloggedLSN; +/* 168 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 176 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 184 | 8 */ // XLogRecPtr backupStartPoint; +/* 192 | 8 */ // XLogRecPtr backupEndPoint; +/* 200 | 1 */ // _Bool backupEndRequired; +/* XXX 3-byte hole */ +/* 204 | 4 */ // int wal_level; +/* 208 | 1 */ // _Bool wal_log_hints; +/* XXX 3-byte hole */ +/* 212 | 4 */ // int MaxConnections; +/* 216 | 4 */ // int max_worker_processes; +/* 220 | 4 */ // int max_wal_senders; +/* 224 | 4 */ // int max_prepared_xacts; +/* 228 | 4 */ // int max_locks_per_xact; +/* 232 | 1 */ // _Bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 236 | 4 */ // uint32 maxAlign; +/* 240 | 8 */ // double floatFormat; +/* 248 | 4 */ // uint32 blcksz; +/* 252 | 4 */ // uint32 relseg_size; +/* 256 | 4 */ // uint32 xlog_blcksz; +/* 260 | 4 */ // uint32 xlog_seg_size; +/* 264 | 4 */ // uint32 nameDataLen; +/* 268 | 4 */ // uint32 indexMaxKeys; +/* 272 | 4 */ // uint32 toast_max_chunk_size; +/* 276 | 4 */ // uint32 loblksize; +/* 280 | 1 */ // _Bool float8ByVal; +/* XXX 3-byte hole */ +/* 284 | 4 */ // uint32 data_checksum_version; +/* 288 | 32 */ // char mock_authentication_nonce[32]; +/* 320 | 4 */ // pg_icu_version icu_version; +/* 324 | 4 */ // uint32 pg_old_version; +/* 328 | 4 */ // pg_crc32c crc; +/* XXX 4-byte padding */ +// +/* total size (bytes): 336 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // _Bool fullPageWrites; +/* XXX 7-byte hole */ +/* 24 | 8 */ // FullTransactionId nextXid; +/* 32 | 4 */ // Oid nextOid; +/* XXX 4-byte hole */ +/* 40 | 8 */ // MultiXactId nextMulti; +/* 48 | 8 */ // MultiXactOffset nextMultiOffset; +/* 56 | 8 */ // TransactionId oldestXid; +/* 64 | 4 */ // Oid oldestXidDB; +/* XXX 4-byte hole */ +/* 72 | 8 */ // MultiXactId oldestMulti; +/* 80 | 4 */ // Oid oldestMultiDB; +/* XXX 4-byte hole */ +/* 88 | 8 */ // pg_time_t time; +/* 96 | 8 */ // TransactionId oldestCommitTsXid; +/* 104 | 8 */ // TransactionId newestCommitTsXid; +/* 112 | 8 */ // TransactionId oldestActiveXid; +// +/* total size (bytes): 120 */ + +func DecodePgControl(d *decode.D, in any) any { + d.SeekAbs(0) + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version") + d.FieldU32("catalog_version_no") + d.FieldU32("state") + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 120 */ // CheckPoint checkPointCopy; + d.FieldS64("time") + d.FieldU64("checkPoint") + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 7-byte hole */ + d.FieldU64("redo") + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U56() + + /* 24 | 8 */ // FullTransactionId nextXid; + /* 32 | 4 */ // Oid nextOid; + /* XXX 4-byte hole */ + d.FieldU64("nextXid") + d.FieldU32("nextOid") + d.U32() + + /* 40 | 8 */ // MultiXactId nextMulti; + /* 48 | 8 */ // MultiXactOffset nextMultiOffset; + /* 56 | 8 */ // TransactionId oldestXid; + /* 64 | 4 */ // Oid oldestXidDB; + /* XXX 4-byte hole */ + d.FieldU64("nextMulti") + d.FieldU64("nextMultiOffset") + d.FieldU64("oldestXid") + d.FieldU32("oldestXidDB") + d.U32() + + /* 72 | 8 */ // MultiXactId oldestMulti; + /* 80 | 4 */ // Oid oldestMultiDB; + /* XXX 4-byte hole */ + d.FieldU64("oldestMulti") + d.FieldU32("oldestMultiDB") + d.U32() + + /* 88 | 8 */ // pg_time_t time; + /* 96 | 8 */ // TransactionId oldestCommitTsXid; + /* 104 | 8 */ // TransactionId newestCommitTsXid; + /* 112 | 8 */ // TransactionId oldestActiveXid; + d.FieldS64("time") + d.FieldU64("oldestCommitTsXid") + d.FieldU64("newestCommitTsXid") + d.FieldU64("oldestActiveXid") + }) + + /* 160 | 8 */ // XLogRecPtr unloggedLSN; + /* 168 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 176 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN") + d.FieldU64("minRecoveryPoint") + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 184 | 8 */ // XLogRecPtr backupStartPoint; + /* 192 | 8 */ // XLogRecPtr backupEndPoint; + /* 200 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint") + d.FieldU64("backupEndPoint") + d.FieldU8("backupEndRequired") + d.U24() + + /* 204 | 4 */ // int wal_level; + /* 208 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level") + d.FieldU8("wal_log_hints") + d.U24() + + /* 212 | 4 */ // int MaxConnections; + /* 216 | 4 */ // int max_worker_processes; + /* 220 | 4 */ // int max_wal_senders; + /* 224 | 4 */ // int max_prepared_xacts; + /* 228 | 4 */ // int max_locks_per_xact; + /* 232 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_wal_senders") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 236 | 4 */ // uint32 maxAlign; + /* 240 | 8 */ // double floatFormat; + /* 248 | 4 */ // uint32 blcksz; + /* 252 | 4 */ // uint32 relseg_size; + /* 256 | 4 */ // uint32 xlog_blcksz; + /* 260 | 4 */ // uint32 xlog_seg_size; + /* 264 | 4 */ // uint32 nameDataLen; + /* 268 | 4 */ // uint32 indexMaxKeys; + /* 272 | 4 */ // uint32 toast_max_chunk_size; + /* 276 | 4 */ // uint32 loblksize; + /* 280 | 1 */ // _Bool float8ByVal; + /* XXX 3-byte hole */ + d.FieldU32("maxAlign") + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float8ByVal") + d.U24() + + /* 284 | 4 */ // uint32 data_checksum_version; + /* 288 | 32 */ // char mock_authentication_nonce[32]; + /* 320 | 4 */ // pg_icu_version icu_version; + /* 324 | 4 */ // uint32 pg_old_version; + /* 328 | 4 */ // pg_crc32c crc; + /* XXX 4-byte padding */ + d.FieldU32("data_checksum_version") + d.FieldUTF8ShortStringFixedLen("mock_authentication_nonce", 32) + d.FieldU32("icu_version") + d.FieldU32("pg_old_version") + d.FieldU32("crc") + d.U32() + /* total size (bytes): 336 */ + + d.AssertPosBytes(336) + + return nil +} diff --git a/format/postgres/flavours/postgres11/pg_control.go b/format/postgres/flavours/postgres11/pg_control.go index 1185bc8c1..0225709e3 100644 --- a/format/postgres/flavours/postgres11/pg_control.go +++ b/format/postgres/flavours/postgres11/pg_control.go @@ -72,7 +72,7 @@ import "github.com/wader/fq/pkg/decode" // /* total size (bytes): 80 */ // -func DecodePgControl11(d *decode.D, in any) any { +func DecodePgControl(d *decode.D, in any) any { d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; diff --git a/format/postgres/flavours/postgres14/pg_control.go b/format/postgres/flavours/postgres14/pg_control.go index 85e771b44..b96eef4d3 100644 --- a/format/postgres/flavours/postgres14/pg_control.go +++ b/format/postgres/flavours/postgres14/pg_control.go @@ -70,7 +70,7 @@ import "github.com/wader/fq/pkg/decode" /* XXX 4-byte padding */ // /* total size (bytes): 88 */ -func DecodePgControl14(d *decode.D, in any) any { +func DecodePgControl(d *decode.D, in any) any { d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 0446e89e8..f0ba89a20 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/pgproee14" "github.com/wader/fq/format/postgres/flavours/postgres11" "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" @@ -28,6 +29,7 @@ const ( PG_FLAVOUR_POSTGRES = "postgres" PG_FLAVOUR_POSTGRES11 = "postgres11" PG_FLAVOUR_POSTGRES14 = "postgres14" + PG_FLAVOUR_PGPROEE14 = "pgproee14" ) func decodePgControl(d *decode.D, in any) any { @@ -36,9 +38,11 @@ func decodePgControl(d *decode.D, in any) any { flavour := in.(format.PostgresIn).Flavour switch flavour { case PG_FLAVOUR_POSTGRES11: - return postgres11.DecodePgControl11(d, in) + return postgres11.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: - return postgres14.DecodePgControl14(d, in) + return postgres14.DecodePgControl(d, in) + case PG_FLAVOUR_PGPROEE14: + return pgproee14.DecodePgControl(d, in) default: break } @@ -54,9 +58,9 @@ func probeForDecode(d *decode.D, in any) any { switch pgControlVersion { case PG_CONTROL_VERSION_11: - return postgres11.DecodePgControl11(d, in) + return postgres11.DecodePgControl(d, in) case PG_CONTROL_VERSION_14: - return postgres14.DecodePgControl14(d, in) + return postgres14.DecodePgControl(d, in) default: d.Fatalf("unsupported PG_CONTROL_VERSION = %d\n", pgControlVersion) } From 3b81d99fe10d93a912ce82d0a23194717b0b6925 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 20 Jul 2022 19:25:07 +0300 Subject: [PATCH 006/141] DBState enum for postgres --- format/postgres/common/common.go | 23 +++++++++++++++++++ .../postgres/flavours/pgproee14/pg_control.go | 7 ++++-- .../flavours/postgres11/pg_control.go | 7 ++++-- .../flavours/postgres14/pg_control.go | 7 ++++-- 4 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 format/postgres/common/common.go diff --git a/format/postgres/common/common.go b/format/postgres/common/common.go new file mode 100644 index 000000000..e82cc8408 --- /dev/null +++ b/format/postgres/common/common.go @@ -0,0 +1,23 @@ +package common + +import "github.com/wader/fq/pkg/scalar" + +//typedef enum DBState +//{ +// DB_STARTUP = 0, +// DB_SHUTDOWNED, +// DB_SHUTDOWNED_IN_RECOVERY, +// DB_SHUTDOWNING, +// DB_IN_CRASH_RECOVERY, +// DB_IN_ARCHIVE_RECOVERY, +// DB_IN_PRODUCTION +//} DBState; +var DBState = scalar.UToScalar{ + 0: {Sym: "DB_STARTUP"}, + 1: {Sym: "DB_SHUTDOWNED"}, + 2: {Sym: "DB_SHUTDOWNED_IN_RECOVERY"}, + 3: {Sym: "DB_SHUTDOWNING"}, + 4: {Sym: "DB_IN_CRASH_RECOVERY"}, + 5: {Sym: "DB_IN_ARCHIVE_RECOVERY"}, + 6: {Sym: "DB_IN_PRODUCTION"}, +} diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go index eaed64884..3ddca3b9e 100644 --- a/format/postgres/flavours/pgproee14/pg_control.go +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -1,6 +1,9 @@ package pgproee14 -import "github.com/wader/fq/pkg/decode" +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" +) // type = struct ControlFileData { /* 0 | 8 */ // uint64 system_identifier; @@ -84,7 +87,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("system_identifier") d.FieldU32("pg_control_version") d.FieldU32("catalog_version_no") - d.FieldU32("state") + d.FieldU32("state", common.DBState) d.U32() /* 24 | 8 */ // pg_time_t time; diff --git a/format/postgres/flavours/postgres11/pg_control.go b/format/postgres/flavours/postgres11/pg_control.go index 0225709e3..a32f52a1c 100644 --- a/format/postgres/flavours/postgres11/pg_control.go +++ b/format/postgres/flavours/postgres11/pg_control.go @@ -1,6 +1,9 @@ package postgres11 -import "github.com/wader/fq/pkg/decode" +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" +) // type = struct ControlFileData { /* 0 | 8 */ // uint64 system_identifier; @@ -82,7 +85,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("system_identifier") d.FieldU32("pg_control_version") d.FieldU32("catalog_version_no") - d.FieldU32("state") + d.FieldU32("state", common.DBState) d.U32() /* 24 | 8 */ // pg_time_t time; diff --git a/format/postgres/flavours/postgres14/pg_control.go b/format/postgres/flavours/postgres14/pg_control.go index b96eef4d3..74df6e135 100644 --- a/format/postgres/flavours/postgres14/pg_control.go +++ b/format/postgres/flavours/postgres14/pg_control.go @@ -1,6 +1,9 @@ package postgres14 -import "github.com/wader/fq/pkg/decode" +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" +) // type = struct ControlFileData { /* 0 | 8 */ // uint64 system_identifier; @@ -80,7 +83,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("system_identifier") d.FieldU32("pg_control_version") d.FieldU32("catalog_version_no") - d.FieldU32("state") + d.FieldU32("state", common.DBState) d.U32() /* 24 | 8 */ // pg_time_t time; From c8ece6425321b7ec736ab30052da1dc70380e7b0 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 20 Jul 2022 19:43:58 +0300 Subject: [PATCH 007/141] show mock_authentication_nonce as hex --- format/postgres/flavours/pgproee14/pg_control.go | 3 ++- format/postgres/flavours/postgres11/pg_control.go | 3 ++- format/postgres/flavours/postgres14/pg_control.go | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go index 3ddca3b9e..486d44181 100644 --- a/format/postgres/flavours/pgproee14/pg_control.go +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -3,6 +3,7 @@ package pgproee14 import ( "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" ) // type = struct ControlFileData { @@ -214,7 +215,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 328 | 4 */ // pg_crc32c crc; /* XXX 4-byte padding */ d.FieldU32("data_checksum_version") - d.FieldUTF8ShortStringFixedLen("mock_authentication_nonce", 32) + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) d.FieldU32("icu_version") d.FieldU32("pg_old_version") d.FieldU32("crc") diff --git a/format/postgres/flavours/postgres11/pg_control.go b/format/postgres/flavours/postgres11/pg_control.go index a32f52a1c..4cb18b33d 100644 --- a/format/postgres/flavours/postgres11/pg_control.go +++ b/format/postgres/flavours/postgres11/pg_control.go @@ -3,6 +3,7 @@ package postgres11 import ( "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" ) // type = struct ControlFileData { @@ -208,7 +209,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 288 | 4 */ // pg_crc32c crc; /* XXX 4-byte padding */ d.FieldU32("data_checksum_version") - d.FieldUTF8ShortStringFixedLen("mock_authentication_nonce", 32) + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) d.FieldU32("crc") d.U32() /* total size (bytes): 288 */ diff --git a/format/postgres/flavours/postgres14/pg_control.go b/format/postgres/flavours/postgres14/pg_control.go index 74df6e135..12799e38f 100644 --- a/format/postgres/flavours/postgres14/pg_control.go +++ b/format/postgres/flavours/postgres14/pg_control.go @@ -3,6 +3,7 @@ package postgres14 import ( "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" ) // type = struct ControlFileData { @@ -204,7 +205,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 288 | 4 */ // pg_crc32c crc; /* XXX 4-byte padding */ d.FieldU32("data_checksum_version") - d.FieldUTF8ShortStringFixedLen("mock_authentication_nonce", 32) + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) d.FieldU32("crc") d.U32() /* total size (bytes): 296 */ From deaf5ef0dcdc3623a7eef21fafb41f0d7a3e6a68 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 20 Jul 2022 19:49:47 +0300 Subject: [PATCH 008/141] WalLevel for postgres --- format/postgres/common/common.go | 12 ++++++++++++ format/postgres/flavours/pgproee14/pg_control.go | 2 +- format/postgres/flavours/postgres11/pg_control.go | 2 +- format/postgres/flavours/postgres14/pg_control.go | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/format/postgres/common/common.go b/format/postgres/common/common.go index e82cc8408..dc5981bb2 100644 --- a/format/postgres/common/common.go +++ b/format/postgres/common/common.go @@ -21,3 +21,15 @@ var DBState = scalar.UToScalar{ 5: {Sym: "DB_IN_ARCHIVE_RECOVERY"}, 6: {Sym: "DB_IN_PRODUCTION"}, } + +//typedef enum WalLevel +//{ +// WAL_LEVEL_MINIMAL = 0, +// WAL_LEVEL_REPLICA, +// WAL_LEVEL_LOGICAL +//} WalLevel; +var WalLevel = scalar.SToScalar{ + 0: {Sym: "WAL_LEVEL_MINIMAL"}, + 1: {Sym: "WAL_LEVEL_REPLICA"}, + 2: {Sym: "WAL_LEVEL_LOGICAL"}, +} diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go index 486d44181..0b52f36ba 100644 --- a/format/postgres/flavours/pgproee14/pg_control.go +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -164,7 +164,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 204 | 4 */ // int wal_level; /* 208 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ - d.FieldS32("wal_level") + d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") d.U24() diff --git a/format/postgres/flavours/postgres11/pg_control.go b/format/postgres/flavours/postgres11/pg_control.go index 4cb18b33d..e6a30c13d 100644 --- a/format/postgres/flavours/postgres11/pg_control.go +++ b/format/postgres/flavours/postgres11/pg_control.go @@ -157,7 +157,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 164 | 4 */ // int wal_level; /* 168 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ - d.FieldS32("wal_level") + d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") d.U24() diff --git a/format/postgres/flavours/postgres14/pg_control.go b/format/postgres/flavours/postgres14/pg_control.go index 12799e38f..e492dd77f 100644 --- a/format/postgres/flavours/postgres14/pg_control.go +++ b/format/postgres/flavours/postgres14/pg_control.go @@ -156,7 +156,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 172 | 4 */ // int wal_level; /* 176 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ - d.FieldS32("wal_level") + d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") d.U24() From 2b1bdfb3ae236c7403281f836d2cf8e5bf23ad1f Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 20 Jul 2022 20:04:51 +0300 Subject: [PATCH 009/141] add icu version mapper --- format/postgres/common/common.go | 19 ++++++++++++++++++- .../postgres/flavours/pgproee14/pg_control.go | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/format/postgres/common/common.go b/format/postgres/common/common.go index dc5981bb2..9815f8198 100644 --- a/format/postgres/common/common.go +++ b/format/postgres/common/common.go @@ -1,6 +1,9 @@ package common -import "github.com/wader/fq/pkg/scalar" +import ( + "fmt" + "github.com/wader/fq/pkg/scalar" +) //typedef enum DBState //{ @@ -33,3 +36,17 @@ var WalLevel = scalar.SToScalar{ 1: {Sym: "WAL_LEVEL_REPLICA"}, 2: {Sym: "WAL_LEVEL_LOGICAL"}, } + +type icuVersionMapper struct{} + +func (m icuVersionMapper) MapScalar(s scalar.S) (scalar.S, error) { + a := s.ActualU() + major := a & 0xff + minor := (a >> 8) & 0xff + v1 := (a >> 16) & 0xff + v2 := (a >> 24) & 0xff + s.Sym = fmt.Sprintf("%d.%d.%d.%d", major, minor, v1, v2) + return s, nil +} + +var IcuVersionMapper = icuVersionMapper{} diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go index 0b52f36ba..dfd9da143 100644 --- a/format/postgres/flavours/pgproee14/pg_control.go +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -216,7 +216,7 @@ func DecodePgControl(d *decode.D, in any) any { /* XXX 4-byte padding */ d.FieldU32("data_checksum_version") d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) - d.FieldU32("icu_version") + d.FieldU32("icu_version", common.IcuVersionMapper) d.FieldU32("pg_old_version") d.FieldU32("crc") d.U32() From 8d317ddf50babc20d3df554dd210e8a9ce4d8680 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 20 Jul 2022 20:17:50 +0300 Subject: [PATCH 010/141] lsn mapper --- format/postgres/common/common.go | 10 ++++++++++ format/postgres/flavours/pgproee14/pg_control.go | 4 ++-- format/postgres/flavours/postgres11/pg_control.go | 4 ++-- format/postgres/flavours/postgres14/pg_control.go | 4 ++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/format/postgres/common/common.go b/format/postgres/common/common.go index 9815f8198..ca08aeb1f 100644 --- a/format/postgres/common/common.go +++ b/format/postgres/common/common.go @@ -50,3 +50,13 @@ func (m icuVersionMapper) MapScalar(s scalar.S) (scalar.S, error) { } var IcuVersionMapper = icuVersionMapper{} + +type xLogRecPtrMapper struct{} + +func (m xLogRecPtrMapper) MapScalar(s scalar.S) (scalar.S, error) { + lsn := s.ActualU() + s.Sym = fmt.Sprintf("%X/%X", lsn>>32, uint32(lsn)) + return s, nil +} + +var XLogRecPtrMapper = xLogRecPtrMapper{} diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go index dfd9da143..740b07f25 100644 --- a/format/postgres/flavours/pgproee14/pg_control.go +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -95,14 +95,14 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 120 */ // CheckPoint checkPointCopy; d.FieldS64("time") - d.FieldU64("checkPoint") + d.FieldU64("checkPoint", common.XLogRecPtrMapper) d.FieldStruct("checkPointCopy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 7-byte hole */ - d.FieldU64("redo") + d.FieldU64("redo", common.XLogRecPtrMapper) d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") diff --git a/format/postgres/flavours/postgres11/pg_control.go b/format/postgres/flavours/postgres11/pg_control.go index e6a30c13d..dd14566b6 100644 --- a/format/postgres/flavours/postgres11/pg_control.go +++ b/format/postgres/flavours/postgres11/pg_control.go @@ -93,14 +93,14 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 80 */ // CheckPoint checkPointCopy; d.FieldS64("time") - d.FieldU64("checkPoint") + d.FieldU64("checkPoint", common.XLogRecPtrMapper) d.FieldStruct("checkPointCopy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 3-byte hole */ - d.FieldU64("redo") + d.FieldU64("redo", common.XLogRecPtrMapper) d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") diff --git a/format/postgres/flavours/postgres14/pg_control.go b/format/postgres/flavours/postgres14/pg_control.go index e492dd77f..1bae69c5d 100644 --- a/format/postgres/flavours/postgres14/pg_control.go +++ b/format/postgres/flavours/postgres14/pg_control.go @@ -91,14 +91,14 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 88 */ // CheckPoint checkPointCopy; d.FieldS64("time") - d.FieldU64("checkPoint") + d.FieldU64("checkPoint", common.XLogRecPtrMapper) d.FieldStruct("checkPointCopy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 7-byte hole */ - d.FieldU64("redo") + d.FieldU64("redo", common.XLogRecPtrMapper) d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") From af0e22070e11f294f9cd942c0d7915ef002a1e11 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 21 Jul 2022 08:50:17 +0300 Subject: [PATCH 011/141] unix time mapper for postgres --- format/postgres/common/common.go | 12 ++++++++++++ format/postgres/flavours/pgproee14/pg_control.go | 4 ++-- format/postgres/flavours/postgres11/pg_control.go | 4 ++-- format/postgres/flavours/postgres14/pg_control.go | 4 ++-- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/format/postgres/common/common.go b/format/postgres/common/common.go index ca08aeb1f..ea11b496f 100644 --- a/format/postgres/common/common.go +++ b/format/postgres/common/common.go @@ -3,6 +3,7 @@ package common import ( "fmt" "github.com/wader/fq/pkg/scalar" + "time" ) //typedef enum DBState @@ -60,3 +61,14 @@ func (m xLogRecPtrMapper) MapScalar(s scalar.S) (scalar.S, error) { } var XLogRecPtrMapper = xLogRecPtrMapper{} + +type timeMapper struct{} + +func (m timeMapper) MapScalar(s scalar.S) (scalar.S, error) { + ut := s.ActualS() + t := time.Unix(ut, 0) + s.Sym = t.UTC().Format(time.RFC1123) + return s, nil +} + +var TimeMapper = timeMapper{} diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go index 740b07f25..ff3f54016 100644 --- a/format/postgres/flavours/pgproee14/pg_control.go +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -94,7 +94,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 120 */ // CheckPoint checkPointCopy; - d.FieldS64("time") + d.FieldS64("time", common.TimeMapper) d.FieldU64("checkPoint", common.XLogRecPtrMapper) d.FieldStruct("checkPointCopy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; @@ -137,7 +137,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 96 | 8 */ // TransactionId oldestCommitTsXid; /* 104 | 8 */ // TransactionId newestCommitTsXid; /* 112 | 8 */ // TransactionId oldestActiveXid; - d.FieldS64("time") + d.FieldS64("time", common.TimeMapper) d.FieldU64("oldestCommitTsXid") d.FieldU64("newestCommitTsXid") d.FieldU64("oldestActiveXid") diff --git a/format/postgres/flavours/postgres11/pg_control.go b/format/postgres/flavours/postgres11/pg_control.go index dd14566b6..52e309643 100644 --- a/format/postgres/flavours/postgres11/pg_control.go +++ b/format/postgres/flavours/postgres11/pg_control.go @@ -92,7 +92,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 80 */ // CheckPoint checkPointCopy; - d.FieldS64("time") + d.FieldS64("time", common.TimeMapper) d.FieldU64("checkPoint", common.XLogRecPtrMapper) d.FieldStruct("checkPointCopy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; @@ -129,7 +129,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestXidDB") d.FieldU32("oldestMulti") d.FieldU32("oldestMultiDB") - d.FieldS64("time") + d.FieldS64("time", common.TimeMapper) d.FieldU32("oldestCommitTsXid") d.FieldU32("newestCommitTsXid") d.FieldU32("oldestActiveXid") diff --git a/format/postgres/flavours/postgres14/pg_control.go b/format/postgres/flavours/postgres14/pg_control.go index 1bae69c5d..42434ca7f 100644 --- a/format/postgres/flavours/postgres14/pg_control.go +++ b/format/postgres/flavours/postgres14/pg_control.go @@ -90,7 +90,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 88 */ // CheckPoint checkPointCopy; - d.FieldS64("time") + d.FieldS64("time", common.TimeMapper) d.FieldU64("checkPoint", common.XLogRecPtrMapper) d.FieldStruct("checkPointCopy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; @@ -128,7 +128,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 76 | 4 */ // TransactionId newestCommitTsXid; /* 80 | 4 */ // TransactionId oldestActiveXid; /* XXX 4-byte padding */ - d.FieldS64("time") + d.FieldS64("time", common.TimeMapper) d.FieldU32("oldestCommitTsXid") d.FieldU32("newestCommitTsXid") d.FieldU32("oldestActiveXid") From 441eceead3f98e836db7e8802dd62f504b428c96 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 21 Jul 2022 09:15:15 +0300 Subject: [PATCH 012/141] pgpro version mapper --- format/postgres/common/common.go | 40 +++++++++++++++++++ .../postgres/flavours/pgproee14/pg_control.go | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/format/postgres/common/common.go b/format/postgres/common/common.go index ea11b496f..6da5b62d9 100644 --- a/format/postgres/common/common.go +++ b/format/postgres/common/common.go @@ -72,3 +72,43 @@ func (m timeMapper) MapScalar(s scalar.S) (scalar.S, error) { } var TimeMapper = timeMapper{} + +// typedef enum +//{ +// PG_UNKNOWN = 0xFFFF, +// PG_ORIGINAL = 0, +// PGPRO_STANDARD = ('P'<<8|'P'), +// PGPRO_ENTERPRISE = ('P'<<8|'E'), +//} PgEdition; +const ( + PG_UNKNOWN = 0xFFFF + PG_ORIGINAL = 0 + PGPRO_STANDARD = (uint32('P') << 8) | uint32('P') + PGPRO_ENTERPRISE = (uint32('P') << 8) | uint32('E') + + PG_UNKNOWN_STR = "(unknown edition)" + PG_ORIGINAL_STR = "PostgreSQL" + PGPRO_STANDARD_STR = "Postgres Pro Standard" + PGPRO_ENTERPRISE_STR = "Postgres Pro Enterprise" +) + +type versionMapper struct{} + +func (m versionMapper) MapScalar(s scalar.S) (scalar.S, error) { + v := s.ActualU() + v1 := uint32(v >> 16) + v2 := uint32(v & 0xffff) + switch v1 { + case PG_UNKNOWN: + s.Sym = fmt.Sprintf("%s %d", PG_UNKNOWN_STR, v2) + case PG_ORIGINAL: + s.Sym = fmt.Sprintf("%s %d", PG_ORIGINAL_STR, v2) + case PGPRO_STANDARD: + s.Sym = fmt.Sprintf("%s %d", PGPRO_STANDARD_STR, v2) + case PGPRO_ENTERPRISE: + s.Sym = fmt.Sprintf("%s %d", PGPRO_ENTERPRISE_STR, v2) + } + return s, nil +} + +var VersionMapper = versionMapper{} diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go index ff3f54016..fbf17453f 100644 --- a/format/postgres/flavours/pgproee14/pg_control.go +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -86,7 +86,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 16 | 4 */ // DBState state; /* XXX 4-byte hole */ d.FieldU64("system_identifier") - d.FieldU32("pg_control_version") + d.FieldU32("pg_control_version", common.VersionMapper) d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) d.U32() From fcd7fbcc56ee43e8c5c6e99bb867229f32c2c064 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 21 Jul 2022 09:39:12 +0300 Subject: [PATCH 013/141] mappers for postgres --- format/postgres/common/common.go | 5 +++-- format/postgres/flavours/pgproee14/pg_control.go | 8 ++++---- format/postgres/flavours/postgres11/pg_control.go | 8 ++++---- format/postgres/flavours/postgres14/pg_control.go | 8 ++++---- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/format/postgres/common/common.go b/format/postgres/common/common.go index 6da5b62d9..1c5a838e2 100644 --- a/format/postgres/common/common.go +++ b/format/postgres/common/common.go @@ -55,12 +55,13 @@ var IcuVersionMapper = icuVersionMapper{} type xLogRecPtrMapper struct{} func (m xLogRecPtrMapper) MapScalar(s scalar.S) (scalar.S, error) { - lsn := s.ActualU() - s.Sym = fmt.Sprintf("%X/%X", lsn>>32, uint32(lsn)) + v := s.ActualU() + s.Sym = fmt.Sprintf("%X/%X", v>>32, uint32(v)) return s, nil } var XLogRecPtrMapper = xLogRecPtrMapper{} +var LocPtrMapper = xLogRecPtrMapper{} type timeMapper struct{} diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go index fbf17453f..cc6176f07 100644 --- a/format/postgres/flavours/pgproee14/pg_control.go +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -147,8 +147,8 @@ func DecodePgControl(d *decode.D, in any) any { /* 168 | 8 */ // XLogRecPtr minRecoveryPoint; /* 176 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN") - d.FieldU64("minRecoveryPoint") + d.FieldU64("unloggedLSN", common.LocPtrMapper) + d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") d.U32() @@ -156,8 +156,8 @@ func DecodePgControl(d *decode.D, in any) any { /* 192 | 8 */ // XLogRecPtr backupEndPoint; /* 200 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint") - d.FieldU64("backupEndPoint") + d.FieldU64("backupStartPoint", common.LocPtrMapper) + d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") d.U24() diff --git a/format/postgres/flavours/postgres11/pg_control.go b/format/postgres/flavours/postgres11/pg_control.go index 52e309643..87b9e5b6b 100644 --- a/format/postgres/flavours/postgres11/pg_control.go +++ b/format/postgres/flavours/postgres11/pg_control.go @@ -140,8 +140,8 @@ func DecodePgControl(d *decode.D, in any) any { /* 128 | 8 */ // XLogRecPtr minRecoveryPoint; /* 136 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN") - d.FieldU64("minRecoveryPoint") + d.FieldU64("unloggedLSN", common.LocPtrMapper) + d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") d.U32() @@ -149,8 +149,8 @@ func DecodePgControl(d *decode.D, in any) any { /* 152 | 8 */ // XLogRecPtr backupEndPoint; /* 160 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint") - d.FieldU64("backupEndPoint") + d.FieldU64("backupStartPoint", common.LocPtrMapper) + d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") d.U24() diff --git a/format/postgres/flavours/postgres14/pg_control.go b/format/postgres/flavours/postgres14/pg_control.go index 42434ca7f..f7f5215c7 100644 --- a/format/postgres/flavours/postgres14/pg_control.go +++ b/format/postgres/flavours/postgres14/pg_control.go @@ -139,8 +139,8 @@ func DecodePgControl(d *decode.D, in any) any { /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN") - d.FieldU64("minRecoveryPoint") + d.FieldU64("unloggedLSN", common.LocPtrMapper) + d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") d.U32() @@ -148,8 +148,8 @@ func DecodePgControl(d *decode.D, in any) any { /* 160 | 8 */ // XLogRecPtr backupEndPoint; /* 168 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint") - d.FieldU64("backupEndPoint") + d.FieldU64("backupStartPoint", common.LocPtrMapper) + d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") d.U24() From bebdfa9446863ec3a882ca47169f3c6a94955be7 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 28 Jul 2022 12:32:35 +0300 Subject: [PATCH 014/141] Try to implement pgwal - fail. --- .../common/{common.go => pg_control.go} | 0 format/postgres/flavours/postgres14/pgwal.go | 373 ++++++++++++++++++ .../flavours/postgres14/pgwal_test.go | 17 + format/postgres/pgwal.go | 192 ++------- format/postgres/pgwal_page.go | 52 +-- 5 files changed, 454 insertions(+), 180 deletions(-) rename format/postgres/common/{common.go => pg_control.go} (100%) create mode 100644 format/postgres/flavours/postgres14/pgwal.go create mode 100644 format/postgres/flavours/postgres14/pgwal_test.go diff --git a/format/postgres/common/common.go b/format/postgres/common/pg_control.go similarity index 100% rename from format/postgres/common/common.go rename to format/postgres/common/pg_control.go diff --git a/format/postgres/flavours/postgres14/pgwal.go b/format/postgres/flavours/postgres14/pgwal.go new file mode 100644 index 000000000..5f15e203a --- /dev/null +++ b/format/postgres/flavours/postgres14/pgwal.go @@ -0,0 +1,373 @@ +package postgres14 + +import ( + "context" + "fmt" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +//func init() { +// interp.RegisterFormat(decode.Format{ +// Name: format.PGWAL, +// Description: "PostgreSQL write-ahead log file", +// DecodeFn: pgwalDecode, +// }) +//} + +const XLOG_BLCKSZ = 8192 + +const XLP_LONG_HEADER = 2 + +const ( + BKPBLOCK_FORK_MASK = 0x0F + /* block data is an XLogRecordBlockImage */ + BKPBLOCK_HAS_IMAGE = 0x10 + BKPBLOCK_HAS_DATA = 0x20 + /* redo will re-init the page */ + BKPBLOCK_WILL_INIT = 0x40 + /* RelFileNode omitted, same as previous */ + BKPBLOCK_SAME_REL = 0x80 +) + +/* Information stored in bimg_info */ +const ( + /* page image has "hole" */ + BKPIMAGE_HAS_HOLE = 0x01 + /* page image is compressed */ + BKPIMAGE_IS_COMPRESSED = 0x02 + /* page image should be restored during replay */ + BKPIMAGE_APPLY = 0x04 +) + +var expected_rem_len uint64 = 0 + +var rmgrIds = scalar.UToScalar{ + 0: {Sym: "XLOG", Description: "RM_XLOG_ID"}, + 1: {Sym: "Transaction", Description: "RM_XACT_ID"}, + 2: {Sym: "Storage", Description: "RM_SMGR_ID"}, + 3: {Sym: "CLOG", Description: "RM_CLOG_ID"}, + 4: {Sym: "Database", Description: "RM_DBASE_ID"}, + 5: {Sym: "Tablespace", Description: "RM_TBLSPC_ID"}, + 6: {Sym: "MultiXact", Description: "RM_MULTIXACT_ID"}, + 7: {Sym: "RelMap", Description: "RM_RELMAP_ID"}, + 8: {Sym: "Standby", Description: "RM_STANDBY_ID"}, + 9: {Sym: "Heap2", Description: "RM_HEAP2_ID"}, + 10: {Sym: "Heap", Description: "RM_HEAP_ID"}, + 11: {Sym: "Btree", Description: "RM_BTREE_ID"}, + 12: {Sym: "Hash", Description: "RM_HASH_ID"}, + 13: {Sym: "Gin", Description: "RM_GIN_ID"}, + 14: {Sym: "Gist", Description: "RM_GIST_ID"}, + 15: {Sym: "Sequence", Description: "RM_SEQ_ID"}, + 16: {Sym: "SPGist", Description: "RM_SPGIST_ID"}, + 17: {Sym: "BRIN", Description: "RM_BRIN_ID"}, + 18: {Sym: "CommitTs", Description: "RM_COMMIT_TS_ID"}, + 19: {Sym: "ReplicationOrigin", Description: "RM_REPLORIGIN_ID"}, + 20: {Sym: "Generic", Description: "RM_GENERIC_ID"}, + 21: {Sym: "LogicalMessage", Description: "RM_LOGICALMSG_ID"}, +} + +// type = struct XLogPageHeaderData { +/* 0 | 2 */ // uint16 xlp_magic; +/* 2 | 2 */ // uint16 xlp_info; +/* 4 | 4 */ // TimeLineID xlp_tli; +/* 8 | 8 */ // XLogRecPtr xlp_pageaddr; +/* 16 | 4 */ // uint32 xlp_rem_len; +/* XXX 4-byte padding */ +// +/* total size (bytes): 24 */ + +// type = struct XLogRecord { +/* 0 | 4 */ // uint32 xl_tot_len +/* 4 | 4 */ // TransactionId xl_xid +/* 8 | 8 */ // XLogRecPtr xl_prev +/* 16 | 1 */ // uint8 xl_info +/* 17 | 1 */ // RmgrId xl_rmid +/* XXX 2-byte hole */ +/* 20 | 4 */ // pg_crc32c xl_crc + +/* total size (bytes): 24 */ + +func decodeXLogPageHeaderData(d *decode.D) { + var info uint64 + + //pages := d.FieldArrayValue("pages") + + //pages.SeekAbs() + + //d.FieldStructValue() + + /* 0 | 2 */ // uint16 xlp_magic; + /* 2 | 2 */ // uint16 xlp_info; + /* 4 | 4 */ // TimeLineID xlp_tli; + /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; + /* 16 | 4 */ // uint32 xlp_rem_len; + d.FieldU16("xlp_magic") + d.FieldU16("xlp_info") + d.FieldU32("xlp_timeline") + d.FieldU64("xlp_pageaddr") + d.FieldU32("xlp_rem_len") + + //d.FieldRawLen("padding", int64(d.AlignBits(64))) + d.U32() + + if info&XLP_LONG_HEADER != 0 { + // Long header + d.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { + d.FieldU64("xlp_sysid") + d.FieldU32("xlp_seg_size") + d.FieldU32("xlp_xlog_blcksz") + }) + } +} + +type walD struct { + pages *decode.D + records *decode.D + + pageRecords *decode.D + remLen uint32 + + record *decode.D +} + +func getWalD(d *decode.D) *walD { + val := d.Ctx.Value("wald") + return val.(*walD) +} + +func DecodePgwal(d *decode.D, in any) any { + walD := &walD{ + pages: d.FieldArrayValue("pages"), + records: d.FieldArrayValue("records"), + } + parentCtx := d.Ctx + ctx := context.WithValue(parentCtx, "wald", walD) + d.Ctx = ctx + + d.SeekAbs(0) + d.FieldArray("XLogPages", decodeXLogPage) + + return nil +} + +func TypeAlign(alignVal uint64, alignLen uint64) uint64 { + return (alignLen + alignVal - 1) & ^(alignVal - 1) +} + +func TypeAlign8(alignLen uint64) uint64 { + return TypeAlign(8, alignLen) +} + +func decodeXLogPage(d *decode.D) { + + wal := getWalD(d) + + // type = struct XLogPageHeaderData { + /* 0 | 2 */ // uint16 xlp_magic; + /* 2 | 2 */ // uint16 xlp_info; + /* 4 | 4 */ // TimeLineID xlp_tli; + /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; + /* 16 | 4 */ // uint32 xlp_rem_len; + /* XXX 4-byte padding */ + page := wal.pages.FieldStructValue("XLogPageHeaderData") + + page.FieldU16("xlp_magic") + xlpInfo := page.FieldU16("xlp_info") + page.FieldU32("xlp_tli") + page.FieldU64("xlp_pageaddr") + remLen := page.FieldU32("xlp_rem_len") + page.U32() + + if xlpInfo&XLP_LONG_HEADER != 0 { + // Long header + d.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { + d.FieldU64("xlp_sysid") + d.FieldU32("xlp_seg_size") + d.FieldU32("xlp_xlog_blcksz") + }) + } + + remLen = 40 + wal.remLen = uint32(remLen) + + record := wal.record + if record == nil { + rawLen := int64(TypeAlign8(remLen)) + page.FieldRawLen("prev_file_rec", rawLen*8) + } + + pageRecords := page.FieldArrayValue("records") + wal.pageRecords = pageRecords + + decodeXLogRecords(d) + + //page.Pos() + //for { + // + //} + //fmt.Printf("d pos = %d\n", d.Pos()) +} + +func decodeXLogRecords(d *decode.D) { + wal := getWalD(d) + pageRecords := wal.pageRecords + + pos := d.Pos() / 8 + posMaxOfPage := int64(TypeAlign(8192, uint64(pos))) + fmt.Printf("posMaxOfPage = %d\n", posMaxOfPage) + + for { + /* 0 | 4 */ // uint32 xl_tot_len + /* 4 | 4 */ // TransactionId xl_xid + /* 8 | 8 */ // XLogRecPtr xl_prev + /* 16 | 1 */ // uint8 xl_info + /* 17 | 1 */ // RmgrId xl_rmid + /* XXX 2-byte hole */ + /* 20 | 4 */ // pg_crc32c xl_crc + + //record := page.FieldStructValue("XLogRecord") + //wal.record = record + //wal.records.AddChild(record.Value) + // + //xLogRecordBegin := record.Pos() + //xlTotLen := record.FieldU32("xl_tot_len") + //record.FieldU32("xl_xid") + //record.FieldU64("xl_prev") + //record.FieldU8("xl_info") + //record.FieldU8("xl_rmid") + //record.U16() + //record.FieldU32("xl_crc") + //xLogRecordEnd := record.Pos() + //sizeOfXLogRecord := (xLogRecordEnd - xLogRecordBegin) / 8 + // + //xLogRecordBodyLen := xlTotLen - uint64(sizeOfXLogRecord) + // + //rawLen := int64(TypeAlign8(xLogRecordBodyLen)) + //page.FieldRawLen("xLogBody", rawLen*8) + + pos := d.Pos() / 8 + if pos >= posMaxOfPage { + break + } + + pageRecords.FieldStruct("XLogRecord", func(d *decode.D) { + record := d + wal.record = record + wal.records.AddChild(record.Value) + + xLogRecordBegin := record.Pos() + xlTotLen := record.FieldU32("xl_tot_len") + record.FieldU32("xl_xid") + record.FieldU64("xl_prev") + record.FieldU8("xl_info") + record.FieldU8("xl_rmid") + record.U16() + record.FieldU32("xl_crc") + xLogRecordEnd := record.Pos() + sizeOfXLogRecord := (xLogRecordEnd - xLogRecordBegin) / 8 + + xLogRecordBodyLen := xlTotLen - uint64(sizeOfXLogRecord) + + rawLen := int64(TypeAlign8(xLogRecordBodyLen)) + record.FieldRawLen("xLogBody", rawLen*8) + }) + + //pos := d.Pos() + //if pos >= (4000 * 8) { + // break + //} + } +} + +func DecodePgwalOri(d *decode.D, in any) any { + d.SeekAbs(0) + + pageHeaders := d.FieldArrayValue("XLogPageHeaders") + header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) + + d.FieldRawLen("prev_file_rec", int64(header.FieldGet("xlp_rem_len").V.(uint32)*8)) + d.FieldRawLen("prev_file_rec_padding", int64(d.AlignBits(64))) + + d.FieldArray("XLogRecords", func(d *decode.D) { + for { + d.FieldStruct("XLogRecord", func(d *decode.D) { + record_pos := uint64(d.Pos()) >> 3 + record_len := d.FieldU32("xl_tot_len") + record_end := record_pos + record_len + header_pos := record_end - record_end%XLOG_BLCKSZ + d.FieldU32("xl_xid") + d.FieldU64("xl_prev", scalar.ActualHex) + d.FieldU8("xl_info") + d.FieldU8("xl_rmid", rmgrIds) + d.FieldRawLen("padding", int64(d.AlignBits(32))) + d.FieldU32("xl_crc", scalar.ActualHex) + + var lenghts []uint64 = []uint64{} + + d.FieldArray("XLogRecordBlockHeader", func(d *decode.D) { + for blkheaderid := uint64(0); d.PeekBits(8) == blkheaderid; blkheaderid++ { + d.FieldStruct("XlogRecordBlockHeader", func(d *decode.D) { + /* block reference ID */ + d.FieldU8("id", d.AssertU(blkheaderid)) + /* fork within the relation, and flags */ + fork_flags := d.FieldU8("fork_flags") + /* number of payload bytes (not including page image) */ + lenghts = append(lenghts, d.FieldU16("data_length")) + if fork_flags&BKPBLOCK_HAS_IMAGE != 0 { + d.FieldStruct("XLogRecordBlockImageHeader", func(d *decode.D) { + /* number of page image bytes */ + d.FieldU16("length") + /* number of bytes before "hole" */ + d.FieldU16("hole_offset") + /* flag bits, see below */ + bimg_info := d.FieldU8("bimg_info") + d.FieldRawLen("padding", int64(d.AlignBits(16))) + if bimg_info&BKPIMAGE_HAS_HOLE != 0 && + bimg_info&BKPIMAGE_IS_COMPRESSED != 0 { + d.FieldU16("hole_length") + } + }) + } + if fork_flags&BKPBLOCK_SAME_REL == 0 { + d.FieldStruct("RelFileNode", func(d *decode.D) { + /* tablespace */ + d.FieldU32("spcNode") + /* database */ + d.FieldU32("dbNode") + /* relation */ + d.FieldU32("relNode") + }) + d.FieldU32("BlockNum") + } + }) + } + }) + if d.PeekBits(8) == 0xff { + d.FieldStruct("XLogRecordDataHeaderShort", func(d *decode.D) { + d.FieldU8("id", d.AssertU(0xff)) + lenghts = append(lenghts, d.FieldU8("data_length")) + }) + } + + d.FieldArray("data", func(d *decode.D) { + for _, x := range lenghts { + pos := uint64(d.Pos()) >> 3 + if pos < header_pos && (header_pos < pos+x) { + d.FieldRawLen("data", int64((header_pos-pos)*8)) + header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) + header.FieldGet("xlp_rem_len").TryScalarFn(d.ValidateU(record_end - header_pos)) + d.FieldRawLen("data", int64((x+pos-header_pos)*8)) + } else { + d.FieldRawLen("data", int64(x*8)) + } + } + }) + + d.FieldRawLen("ending_padding", int64(d.AlignBits(64))) + }) + } + }) + + return nil +} diff --git a/format/postgres/flavours/postgres14/pgwal_test.go b/format/postgres/flavours/postgres14/pgwal_test.go new file mode 100644 index 000000000..61cded1a8 --- /dev/null +++ b/format/postgres/flavours/postgres14/pgwal_test.go @@ -0,0 +1,17 @@ +package postgres14_test + +import ( + "github.com/wader/fq/format/postgres/flavours/postgres14" + "testing" +) + +func TestTypeAlign8(t *testing.T) { + expected39 := postgres14.TypeAlign8(39) + if expected39 != 40 { + t.Errorf("must be 40") + } + expected41 := postgres14.TypeAlign8(41) + if expected41 != 48 { + t.Errorf("must be 40") + } +} diff --git a/format/postgres/pgwal.go b/format/postgres/pgwal.go index 16db44be5..51d17d4fa 100644 --- a/format/postgres/pgwal.go +++ b/format/postgres/pgwal.go @@ -2,179 +2,63 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" - "github.com/wader/fq/pkg/scalar" ) func init() { interp.RegisterFormat(decode.Format{ Name: format.PGWAL, Description: "PostgreSQL write-ahead log file", - DecodeFn: pgwalDecode, + DecodeFn: decodePgwal, + DecodeInArg: format.PostgresIn{ + Flavour: "default", + }, }) } -const XLOG_BLCKSZ = 8192 - -const XLP_LONG_HEADER = 2 - -const ( - BKPBLOCK_FORK_MASK = 0x0F - /* block data is an XLogRecordBlockImage */ - BKPBLOCK_HAS_IMAGE = 0x10 - BKPBLOCK_HAS_DATA = 0x20 - /* redo will re-init the page */ - BKPBLOCK_WILL_INIT = 0x40 - /* RelFileNode omitted, same as previous */ - BKPBLOCK_SAME_REL = 0x80 -) - -/* Information stored in bimg_info */ +// https://pgpedia.info/x/XLOG_PAGE_MAGIC.html const ( - /* page image has "hole" */ - BKPIMAGE_HAS_HOLE = 0x01 - /* page image is compressed */ - BKPIMAGE_IS_COMPRESSED = 0x02 - /* page image should be restored during replay */ - BKPIMAGE_APPLY = 0x04 + XLOG_PAGE_MAGIC_15 = uint16(0xD10F) + XLOG_PAGE_MAGIC_14 = uint16(0xD10D) + XLOG_PAGE_MAGIC_13 = uint16(0xD106) + XLOG_PAGE_MAGIC_12 = uint16(0xD101) + XLOG_PAGE_MAGIC_11 = uint16(0xD098) + XLOG_PAGE_MAGIC_10 = uint16(0xD097) + XLOG_PAGE_MAGIC_96 = uint16(0xD093) ) -var expected_rem_len uint64 = 0 - -var rmgrIds = scalar.UToScalar{ - 0: {Sym: "XLOG", Description: "RM_XLOG_ID"}, - 1: {Sym: "Transaction", Description: "RM_XACT_ID"}, - 2: {Sym: "Storage", Description: "RM_SMGR_ID"}, - 3: {Sym: "CLOG", Description: "RM_CLOG_ID"}, - 4: {Sym: "Database", Description: "RM_DBASE_ID"}, - 5: {Sym: "Tablespace", Description: "RM_TBLSPC_ID"}, - 6: {Sym: "MultiXact", Description: "RM_MULTIXACT_ID"}, - 7: {Sym: "RelMap", Description: "RM_RELMAP_ID"}, - 8: {Sym: "Standby", Description: "RM_STANDBY_ID"}, - 9: {Sym: "Heap2", Description: "RM_HEAP2_ID"}, - 10: {Sym: "Heap", Description: "RM_HEAP_ID"}, - 11: {Sym: "Btree", Description: "RM_BTREE_ID"}, - 12: {Sym: "Hash", Description: "RM_HASH_ID"}, - 13: {Sym: "Gin", Description: "RM_GIN_ID"}, - 14: {Sym: "Gist", Description: "RM_GIST_ID"}, - 15: {Sym: "Sequence", Description: "RM_SEQ_ID"}, - 16: {Sym: "SPGist", Description: "RM_SPGIST_ID"}, - 17: {Sym: "BRIN", Description: "RM_BRIN_ID"}, - 18: {Sym: "CommitTs", Description: "RM_COMMIT_TS_ID"}, - 19: {Sym: "ReplicationOrigin", Description: "RM_REPLORIGIN_ID"}, - 20: {Sym: "Generic", Description: "RM_GENERIC_ID"}, - 21: {Sym: "LogicalMessage", Description: "RM_LOGICALMSG_ID"}, -} - -func decodeXLogPageHeaderData(d *decode.D) { - var info uint64 - - d.FieldU16("xlp_magic", d.AssertU(0xd106)) - info = d.FieldU16("xlp_info") - d.FieldU32("xlp_timeline") - d.FieldU64("xlp_pageaddr") - d.FieldU32("xlp_rem_len") - d.FieldRawLen("padding", int64(d.AlignBits(64))) - if info&XLP_LONG_HEADER != 0 { - // Long header - d.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { - d.FieldU64("xlp_sysid") - d.FieldU32("xlp_seg_size") - d.FieldU32("xlp_xlog_blcksz") - }) - } -} - -func pgwalDecode(d *decode.D, in interface{}) interface{} { - +func decodePgwal(d *decode.D, in any) any { d.Endian = decode.LittleEndian - pageHeaders := d.FieldArrayValue("XLogPageHeaders") - header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) - - d.FieldRawLen("prev_file_rec", int64(header.FieldGet("xlp_rem_len").V.(uint32)*8)) - d.FieldRawLen("prev_file_rec_padding", int64(d.AlignBits(64))) - - d.FieldArray("XLogRecords", func(d *decode.D) { - for { - d.FieldStruct("XLogRecord", func(d *decode.D) { - record_pos := uint64(d.Pos()) >> 3 - record_len := d.FieldU32("xl_tot_len") - record_end := record_pos + record_len - header_pos := record_end - record_end%XLOG_BLCKSZ - d.FieldU32("xl_xid") - d.FieldU64("xl_prev", scalar.ActualHex) - d.FieldU8("xl_info") - d.FieldU8("xl_rmid", rmgrIds) - d.FieldRawLen("padding", int64(d.AlignBits(32))) - d.FieldU32("xl_crc", scalar.ActualHex) + flavour := in.(format.PostgresIn).Flavour + switch flavour { + //case PG_FLAVOUR_POSTGRES11: + // return postgres11.DecodePgControl(d, in) + case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: + return postgres14.DecodePgwal(d, in) + //case PG_FLAVOUR_PGPROEE14: + // return pgproee14.DecodePgControl(d, in) + default: + break + } - var lenghts []uint64 = []uint64{} + return probePgwal(d, in) +} - d.FieldArray("XLogRecordBlockHeader", func(d *decode.D) { - for blkheaderid := uint64(0); d.PeekBits(8) == blkheaderid; blkheaderid++ { - d.FieldStruct("XlogRecordBlockHeader", func(d *decode.D) { - /* block reference ID */ - d.FieldU8("id", d.AssertU(blkheaderid)) - /* fork within the relation, and flags */ - fork_flags := d.FieldU8("fork_flags") - /* number of payload bytes (not including page image) */ - lenghts = append(lenghts, d.FieldU16("data_length")) - if fork_flags&BKPBLOCK_HAS_IMAGE != 0 { - d.FieldStruct("XLogRecordBlockImageHeader", func(d *decode.D) { - /* number of page image bytes */ - d.FieldU16("length") - /* number of bytes before "hole" */ - d.FieldU16("hole_offset") - /* flag bits, see below */ - bimg_info := d.FieldU8("bimg_info") - d.FieldRawLen("padding", int64(d.AlignBits(16))) - if bimg_info&BKPIMAGE_HAS_HOLE != 0 && - bimg_info&BKPIMAGE_IS_COMPRESSED != 0 { - d.FieldU16("hole_length") - } - }) - } - if fork_flags&BKPBLOCK_SAME_REL == 0 { - d.FieldStruct("RelFileNode", func(d *decode.D) { - /* tablespace */ - d.FieldU32("spcNode") - /* database */ - d.FieldU32("dbNode") - /* relation */ - d.FieldU32("relNode") - }) - d.FieldU32("BlockNum") - } - }) - } - }) - if d.PeekBits(8) == 0xff { - d.FieldStruct("XLogRecordDataHeaderShort", func(d *decode.D) { - d.FieldU8("id", d.AssertU(0xff)) - lenghts = append(lenghts, d.FieldU8("data_length")) - }) - } +func probePgwal(d *decode.D, in any) any { + // read version + xlp_magic := uint16(d.U16()) - d.FieldArray("data", func(d *decode.D) { - for _, x := range lenghts { - pos := uint64(d.Pos()) >> 3 - if pos < header_pos && (header_pos < pos+x) { - d.FieldRawLen("data", int64((header_pos-pos)*8)) - header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) - header.FieldGet("xlp_rem_len").TryScalarFn(d.ValidateU(record_end - header_pos)) - d.FieldRawLen("data", int64((x+pos-header_pos)*8)) - } else { - d.FieldRawLen("data", int64(x*8)) - } - } - }) - - d.FieldRawLen("ending_padding", int64(d.AlignBits(64))) - }) - } - }) + // restore position + d.SeekAbs(0) + switch xlp_magic { + case XLOG_PAGE_MAGIC_14: + return postgres14.DecodePgwal(d, in) + default: + d.Fatalf("unsupported xlp_magic = %X\n", xlp_magic) + } return nil } diff --git a/format/postgres/pgwal_page.go b/format/postgres/pgwal_page.go index 412d78c46..e419eecad 100644 --- a/format/postgres/pgwal_page.go +++ b/format/postgres/pgwal_page.go @@ -1,28 +1,28 @@ package postgres -import ( - "github.com/wader/fq/format" - "github.com/wader/fq/pkg/decode" - "github.com/wader/fq/pkg/interp" - _ "github.com/wader/fq/pkg/scalar" -) - -func init() { - interp.RegisterFormat(decode.Format{ - Name: format.PGWALPAGE, - Description: "PostgreSQL write-ahead page", - DecodeFn: walpageDecode, - }) -} - -//const XLOG_BLCKSZ = 8192 - -func walpageDecode(d *decode.D, in interface{}) interface{} { - - d.Endian = decode.LittleEndian - - pageHeaders := d.FieldArrayValue("XLogPageHeaders") - _ = pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) - - return nil -} +//import ( +// "github.com/wader/fq/format" +// "github.com/wader/fq/pkg/decode" +// "github.com/wader/fq/pkg/interp" +// _ "github.com/wader/fq/pkg/scalar" +//) +// +//func init() { +// interp.RegisterFormat(decode.Format{ +// Name: format.PGWALPAGE, +// Description: "PostgreSQL write-ahead page", +// DecodeFn: walpageDecode, +// }) +//} +// +////const XLOG_BLCKSZ = 8192 +// +//func walpageDecode(d *decode.D, in interface{}) interface{} { +// +// d.Endian = decode.LittleEndian +// +// pageHeaders := d.FieldArrayValue("XLogPageHeaders") +// _ = pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) +// +// return nil +//} From 51878dcd14bd24a72181a1800ae6cfee84bc9fbc Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 29 Jul 2022 09:10:00 +0300 Subject: [PATCH 015/141] PostgreSQL heap page parser implememtation. --- format/format.go | 1 + format/postgres/common/pg_control.go | 10 ++ format/postgres/common/pgheap.go | 39 +++++ format/postgres/common/utils.go | 13 ++ format/postgres/common/utils_test.go | 44 ++++++ format/postgres/flavours/postgres14/pgheap.go | 135 ++++++++++++++++++ format/postgres/flavours/postgres14/pgwal.go | 15 +- .../flavours/postgres14/pgwal_test.go | 17 --- format/postgres/pgheap.go | 33 +++++ 9 files changed, 279 insertions(+), 28 deletions(-) create mode 100644 format/postgres/common/pgheap.go create mode 100644 format/postgres/common/utils.go create mode 100644 format/postgres/common/utils_test.go create mode 100644 format/postgres/flavours/postgres14/pgheap.go delete mode 100644 format/postgres/flavours/postgres14/pgwal_test.go create mode 100644 format/postgres/pgheap.go diff --git a/format/format.go b/format/format.go index 420208abc..e4e45d71e 100644 --- a/format/format.go +++ b/format/format.go @@ -93,6 +93,7 @@ const ( PGMULTIXACTOFF = "pgmultixact_offsets" PGMULTIXACTMEM = "pgmultixact_members" PG_CONTROL = "pg_control" + PGHEAP = "pgheap" PNG = "png" PROTOBUF = "protobuf" PROTOBUF_WIDEVINE = "protobuf_widevine" diff --git a/format/postgres/common/pg_control.go b/format/postgres/common/pg_control.go index 1c5a838e2..3f22b4a35 100644 --- a/format/postgres/common/pg_control.go +++ b/format/postgres/common/pg_control.go @@ -113,3 +113,13 @@ func (m versionMapper) MapScalar(s scalar.S) (scalar.S, error) { } var VersionMapper = versionMapper{} + +type hexMapper struct{} + +func (m hexMapper) MapScalar(s scalar.S) (scalar.S, error) { + v := s.ActualU() + s.Sym = fmt.Sprintf("%X", v) + return s, nil +} + +var HexMapper = hexMapper{} diff --git a/format/postgres/common/pgheap.go b/format/postgres/common/pgheap.go new file mode 100644 index 000000000..cef4d3b0f --- /dev/null +++ b/format/postgres/common/pgheap.go @@ -0,0 +1,39 @@ +package common + +import ( + "github.com/wader/fq/pkg/scalar" +) + +const ( + HeapPageSize = 8192 +) + +type lpOffMapper struct{} + +func (m lpOffMapper) MapScalar(s scalar.S) (scalar.S, error) { + v := s.ActualU() & 0x7fff + s.Actual = v + return s, nil +} + +var LpOffMapper = lpOffMapper{} + +type lpFlagsMapper struct{} + +func (m lpFlagsMapper) MapScalar(s scalar.S) (scalar.S, error) { + v := (s.ActualU() >> 15) & 0x3 + s.Actual = v + return s, nil +} + +var LpFlagsMapper = lpFlagsMapper{} + +type lpLenMapper struct{} + +func (m lpLenMapper) MapScalar(s scalar.S) (scalar.S, error) { + v := (s.ActualU() >> 17) & 0x7fff + s.Actual = v + return s, nil +} + +var LpLenMapper = lpLenMapper{} diff --git a/format/postgres/common/utils.go b/format/postgres/common/utils.go new file mode 100644 index 000000000..cc0b2bb48 --- /dev/null +++ b/format/postgres/common/utils.go @@ -0,0 +1,13 @@ +package common + +func TypeAlign(alignVal uint64, alignLen uint64) uint64 { + return (alignLen + alignVal - 1) & ^(alignVal - 1) +} + +func TypeAlign8(alignLen uint64) uint64 { + return TypeAlign(8, alignLen) +} + +func RoundDown(alignVal uint64, alignLen uint64) uint64 { + return (alignLen / alignVal) * alignVal +} diff --git a/format/postgres/common/utils_test.go b/format/postgres/common/utils_test.go new file mode 100644 index 000000000..7c751424f --- /dev/null +++ b/format/postgres/common/utils_test.go @@ -0,0 +1,44 @@ +package common_test + +import ( + "github.com/wader/fq/format/postgres/common" + "testing" +) + +func TestTypeAlign8(t *testing.T) { + expected39 := common.TypeAlign8(39) + if expected39 != 40 { + t.Errorf("must be 40\n") + } + expected41 := common.TypeAlign8(41) + if expected41 != 48 { + t.Errorf("must be 40\n") + } +} + +func TestRoundDown(t *testing.T) { + const pageSize1 = 8192 + expected1 := common.RoundDown(pageSize1, 7*pageSize1+35) + if expected1 != 7*pageSize1 { + t.Errorf("must be %d\n", 7*pageSize1) + } + expected2 := common.RoundDown(pageSize1, 7*pageSize1-1) + if expected2 != 6*pageSize1 { + t.Errorf("must be %d\n", 6*pageSize1) + } + + const pageSize2 = 7744 + expected3 := common.RoundDown(pageSize2, 15*pageSize2+61) + if expected3 != 15*pageSize2 { + t.Errorf("must be %d\n", 15*pageSize2) + } + expected4 := common.RoundDown(pageSize2, 3*pageSize2-15) + if expected4 != 2*pageSize2 { + t.Errorf("must be %d\n", 2*pageSize2) + } + + expected5 := common.RoundDown(pageSize1, 5*pageSize1) + if expected5 != 5*pageSize1 { + t.Errorf("must be %d\n", 5*pageSize1) + } +} diff --git a/format/postgres/flavours/postgres14/pgheap.go b/format/postgres/flavours/postgres14/pgheap.go new file mode 100644 index 000000000..eb21b54b4 --- /dev/null +++ b/format/postgres/flavours/postgres14/pgheap.go @@ -0,0 +1,135 @@ +package postgres14 + +import ( + "context" + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 20 | 4 */ // TransactionId pd_prune_xid; +/* 24 | 0 */ // ItemIdData pd_linp[]; +// +/* total size (bytes): 24 */ + +// type = struct PageXLogRecPtr { +/* 0 | 4 */ // uint32 xlogid; +/* 4 | 4 */ // uint32 xrecoff; + +/* total size (bytes): 8 */ + +// type = struct ItemIdData { +/* 0: 0 | 4 */ // unsigned int lp_off: 15 +/* 1: 7 | 4 */ // unsigned int lp_flags: 2 +/* 2: 1 | 4 */ // unsigned int lp_len: 15 + +/* total size (bytes): 4 */ + +// typedef uint16 LocationIndex; +// #define SizeOfPageHeaderData (offsetof(PageHeaderData, pd_linp)) + +type heapD struct { + pageSize uint64 + + // current page + page *heapPageD +} + +type heapPageD struct { + pdLower uint16 + pdUpper uint16 + pdSpecial uint16 + pd_pagesize_version uint16 +} + +func getHeapD(d *decode.D) *heapD { + val := d.Ctx.Value("heap") + return val.(*heapD) +} + +func DecodeHeap(d *decode.D) any { + heap := &heapD{ + pageSize: common.HeapPageSize, + } + parentCtx := d.Ctx + ctx := context.WithValue(parentCtx, "heap", heap) + d.Ctx = ctx + + d.SeekAbs(0) + d.FieldArray("Pages", decodeHeapPages) + + return nil +} + +func decodeHeapPages(d *decode.D) { + heap := getHeapD(d) + page := &heapPageD{} + heap.page = page + + pagePosBegin := common.RoundDown(heap.pageSize, uint64(d.Pos()/8)) + + for { + d.FieldStruct("HeapPage", func(d *decode.D) { + /* 0 | 8 */ // PageXLogRecPtr pd_lsn; + /* 8 | 2 */ // uint16 pd_checksum; + /* 10 | 2 */ // uint16 pd_flags; + /* 12 | 2 */ // LocationIndex pd_lower; + /* 14 | 2 */ // LocationIndex pd_upper; + /* 16 | 2 */ // LocationIndex pd_special; + /* 18 | 2 */ // uint16 pd_pagesize_version; + /* 20 | 4 */ // TransactionId pd_prune_xid; + /* 24 | 0 */ // ItemIdData pd_linp[]; + d.FieldStruct("PageHeaderData", func(d *decode.D) { + d.FieldStruct("pd_lsn", func(d *decode.D) { + /* 0 | 4 */ // uint32 xlogid; + /* 4 | 4 */ // uint32 xrecoff; + d.FieldU32("xlogid", common.HexMapper) + d.FieldU32("xrecoff", common.HexMapper) + }) + d.FieldU16("pd_checksum") + d.FieldU16("pd_flags") + page.pdLower = uint16(d.FieldU16("pd_lower")) + page.pdUpper = uint16(d.FieldU16("pd_upper")) + page.pdSpecial = uint16(d.FieldU16("pd_special")) + page.pd_pagesize_version = uint16(d.FieldU16("pd_pagesize_version")) + d.FieldU32("pd_prune_xid") + + // ItemIdData pd_linp[]; + itemsEnd := int64(pagePosBegin*8) + int64(page.pdLower*8) + d.FieldArray("pd_linp", func(d *decode.D) { + for { + checkPos := d.Pos() + if checkPos >= itemsEnd { + break + } + /* 0: 0 | 4 */ // unsigned int lp_off: 15 + /* 1: 7 | 4 */ // unsigned int lp_flags: 2 + /* 2: 1 | 4 */ // unsigned int lp_len: 15 + d.FieldStruct("ItemIdData", func(d *decode.D) { + itemPos := d.Pos() + d.FieldU32("lp_off", common.LpOffMapper) + d.SeekAbs(itemPos) + d.FieldU32("lp_flags", common.LpFlagsMapper) + d.SeekAbs(itemPos) + d.FieldU32("lp_len", common.LpLenMapper) + }) + } // for pd_linp + }) // pd_linp in PageHeaderData + + }) // PageHeaderData, PageHeader + + // end of page + endLen := uint64(d.Pos() / 8) + pageEnd := common.TypeAlign(heap.pageSize, endLen) + d.SeekAbs(int64(pageEnd) * 8) + }) // HeapPage + + } // for Heap pages +} diff --git a/format/postgres/flavours/postgres14/pgwal.go b/format/postgres/flavours/postgres14/pgwal.go index 5f15e203a..4d8015ac4 100644 --- a/format/postgres/flavours/postgres14/pgwal.go +++ b/format/postgres/flavours/postgres14/pgwal.go @@ -3,6 +3,7 @@ package postgres14 import ( "context" "fmt" + "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/scalar" ) @@ -151,14 +152,6 @@ func DecodePgwal(d *decode.D, in any) any { return nil } -func TypeAlign(alignVal uint64, alignLen uint64) uint64 { - return (alignLen + alignVal - 1) & ^(alignVal - 1) -} - -func TypeAlign8(alignLen uint64) uint64 { - return TypeAlign(8, alignLen) -} - func decodeXLogPage(d *decode.D) { wal := getWalD(d) @@ -193,7 +186,7 @@ func decodeXLogPage(d *decode.D) { record := wal.record if record == nil { - rawLen := int64(TypeAlign8(remLen)) + rawLen := int64(common.TypeAlign8(remLen)) page.FieldRawLen("prev_file_rec", rawLen*8) } @@ -214,7 +207,7 @@ func decodeXLogRecords(d *decode.D) { pageRecords := wal.pageRecords pos := d.Pos() / 8 - posMaxOfPage := int64(TypeAlign(8192, uint64(pos))) + posMaxOfPage := int64(common.TypeAlign(8192, uint64(pos))) fmt.Printf("posMaxOfPage = %d\n", posMaxOfPage) for { @@ -269,7 +262,7 @@ func decodeXLogRecords(d *decode.D) { xLogRecordBodyLen := xlTotLen - uint64(sizeOfXLogRecord) - rawLen := int64(TypeAlign8(xLogRecordBodyLen)) + rawLen := int64(common.TypeAlign8(xLogRecordBodyLen)) record.FieldRawLen("xLogBody", rawLen*8) }) diff --git a/format/postgres/flavours/postgres14/pgwal_test.go b/format/postgres/flavours/postgres14/pgwal_test.go deleted file mode 100644 index 61cded1a8..000000000 --- a/format/postgres/flavours/postgres14/pgwal_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package postgres14_test - -import ( - "github.com/wader/fq/format/postgres/flavours/postgres14" - "testing" -) - -func TestTypeAlign8(t *testing.T) { - expected39 := postgres14.TypeAlign8(39) - if expected39 != 40 { - t.Errorf("must be 40") - } - expected41 := postgres14.TypeAlign8(41) - if expected41 != 48 { - t.Errorf("must be 40") - } -} diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go new file mode 100644 index 000000000..25779f4aa --- /dev/null +++ b/format/postgres/pgheap.go @@ -0,0 +1,33 @@ +package postgres + +import ( + "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/postgres14" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/interp" +) + +func init() { + interp.RegisterFormat(decode.Format{ + Name: format.PGHEAP, + Description: "PostgreSQL heap file", + DecodeFn: decodePgheap, + DecodeInArg: format.PostgresIn{ + Flavour: "default", + }, + }) +} + +func decodePgheap(d *decode.D, in any) any { + d.Endian = decode.LittleEndian + + flavour := in.(format.PostgresIn).Flavour + switch flavour { + case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: + return postgres14.DecodeHeap(d) + default: + break + } + + return postgres14.DecodeHeap(d) +} From ce9ae761256315c449b6b6febee38912fe288486 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 29 Jul 2022 12:38:32 +0300 Subject: [PATCH 016/141] PostgreSQL: heap tuples implementation --- format/postgres/flavours/postgres14/pgheap.go | 176 +++++++++++++++++- 1 file changed, 169 insertions(+), 7 deletions(-) diff --git a/format/postgres/flavours/postgres14/pgheap.go b/format/postgres/flavours/postgres14/pgheap.go index eb21b54b4..c8e19d840 100644 --- a/format/postgres/flavours/postgres14/pgheap.go +++ b/format/postgres/flavours/postgres14/pgheap.go @@ -4,6 +4,7 @@ import ( "context" "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" ) // type = struct PageHeaderData @@ -35,6 +36,47 @@ import ( // typedef uint16 LocationIndex; // #define SizeOfPageHeaderData (offsetof(PageHeaderData, pd_linp)) +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// +/* total size (bytes): 12 */ +/* } t_choice; // +/* 12 | 6 */ // ItemPointerData t_ctid; +/* 18 | 2 */ // uint16 t_infomask2; +/* 20 | 2 */ // uint16 t_infomask; +/* 22 | 1 */ // uint8 t_hoff; +/* 23 | 0 */ // bits8 t_bits[]; +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ +const SizeOfHeapTupleHeaderData = 24 + +// type = struct HeapTupleFields { +/* 0 | 4 */ // TransactionId t_xmin; +/* 4 | 4 */ // TransactionId t_xmax; +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // TransactionId t_xvac; +// } t_field3; +/* total size (bytes): 4 */ +// +/* total size (bytes): 12 */ + +// type = struct DatumTupleFields { +/* 0 | 4 */ // int32 datum_len_; +/* 4 | 4 */ // int32 datum_typmod; +/* 8 | 4 */ // Oid datum_typeid; +// +/* total size (bytes): 12 */ + +// type = struct ItemPointerData { +/* 0 | 4 */ // BlockIdData ip_blkid; +/* 4 | 2 */ // OffsetNumber ip_posid; +// +/* total size (bytes): 6 */ + type heapD struct { pageSize uint64 @@ -47,6 +89,26 @@ type heapPageD struct { pdUpper uint16 pdSpecial uint16 pd_pagesize_version uint16 + + itemIds []itemIdDataD +} + +func (hp *heapPageD) getItemId(offset uint32) (bool, itemIdDataD) { + for _, id := range hp.itemIds { + if id.lpOff == offset { + return true, id + } + } + return false, itemIdDataD{} +} + +type itemIdDataD struct { + /* 0: 0 | 4 */ // unsigned int lp_off: 15 + /* 1: 7 | 4 */ // unsigned int lp_flags: 2 + /* 2: 1 | 4 */ // unsigned int lp_len: 15 + lpOff uint32 + lpFlags uint32 + lpLen uint32 } func getHeapD(d *decode.D) *heapD { @@ -70,12 +132,13 @@ func DecodeHeap(d *decode.D) any { func decodeHeapPages(d *decode.D) { heap := getHeapD(d) - page := &heapPageD{} - heap.page = page - - pagePosBegin := common.RoundDown(heap.pageSize, uint64(d.Pos()/8)) for { + page := &heapPageD{} + heap.page = page + + pagePosBegin := common.RoundDown(heap.pageSize, uint64(d.Pos()/8)) + d.FieldStruct("HeapPage", func(d *decode.D) { /* 0 | 8 */ // PageXLogRecPtr pd_lsn; /* 8 | 2 */ // uint16 pd_checksum; @@ -113,18 +176,117 @@ func decodeHeapPages(d *decode.D) { /* 1: 7 | 4 */ // unsigned int lp_flags: 2 /* 2: 1 | 4 */ // unsigned int lp_len: 15 d.FieldStruct("ItemIdData", func(d *decode.D) { + itemId := itemIdDataD{} + itemPos := d.Pos() - d.FieldU32("lp_off", common.LpOffMapper) + itemId.lpOff = uint32(d.FieldU32("lp_off", common.LpOffMapper)) d.SeekAbs(itemPos) - d.FieldU32("lp_flags", common.LpFlagsMapper) + itemId.lpFlags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) d.SeekAbs(itemPos) - d.FieldU32("lp_len", common.LpLenMapper) + itemId.lpLen = uint32(d.FieldU32("lp_len", common.LpLenMapper)) + + page.itemIds = append(page.itemIds, itemId) }) } // for pd_linp }) // pd_linp in PageHeaderData }) // PageHeaderData, PageHeader + // free space + freeSpaceEnd := int64(pagePosBegin*8) + int64(page.pdUpper*8) + freeSpaceNBits := freeSpaceEnd - d.Pos() + d.FieldRawLen("FreeSpace", freeSpaceNBits, scalar.RawHex) + + // Tuples + d.FieldArray("Tuples", func(d *decode.D) { + for i := 0; i < len(page.itemIds); i++ { + id := page.itemIds[i] + if id.lpOff == 0 || id.lpLen == 0 { + continue + } + + pos := int64(pagePosBegin)*8 + int64(page.itemIds[i].lpOff)*8 + tupleDataLen := id.lpLen - SizeOfHeapTupleHeaderData + + d.SeekAbs(pos) + + /* 0 | 12 */ // union { + /* 12 */ // HeapTupleFields t_heap; + /* 12 */ // DatumTupleFields t_datum; + // } t_choice; + /* total size (bytes): 12 */ + /* + /* 12 | 6 */ // ItemPointerData t_ctid; + /* 18 | 2 */ // uint16 t_infomask2; + /* 20 | 2 */ // uint16 t_infomask; + /* 22 | 1 */ // uint8 t_hoff; + /* 23 | 0 */ // bits8 t_bits[]; + /* XXX 1-byte padding */ + // + /* total size (bytes): 24 */ + d.FieldStruct("HeapTupleHeaderData", func(d *decode.D) { + d.FieldStruct("t_choice", func(d *decode.D) { + pos1 := d.Pos() + // type = struct HeapTupleFields { + /* 0 | 4 */ // TransactionId t_xmin; + /* 4 | 4 */ // TransactionId t_xmax; + /* 8 | 4 */ // union { + /* 4 */ // CommandId t_cid; + /* 4 */ // TransactionId t_xvac; + // } t_field3; + /* total size (bytes): 4 */ + // + /* total size (bytes): 12 */ + d.FieldStruct("t_heap", func(d *decode.D) { + d.FieldU32("t_xmin") + d.FieldU32("t_xmax") + d.FieldStruct("t_field3", func(d *decode.D) { + pos2 := d.Pos() + d.FieldU32("t_cid") + d.SeekAbs(pos2) + d.FieldU32("t_xvac") + }) // t_field3 + }) // HeapTupleFields t_heap + + d.SeekAbs(pos1) + // type = struct DatumTupleFields { + /* 0 | 4 */ // int32 datum_len_; + /* 4 | 4 */ // int32 datum_typmod; + /* 8 | 4 */ // Oid datum_typeid; + // + /* total size (bytes): 12 */ + + // t_datum + d.FieldStruct("t_datum", func(d *decode.D) { + d.FieldS32("datum_len_") + d.FieldS32("datum_typmod") + d.FieldU32("datum_typeid") + }) // DatumTupleFields t_datum + }) // t_choice + + d.FieldStruct("t_ctid", func(d *decode.D) { + /* 0 | 4 */ // BlockIdData ip_blkid; + /* 4 | 2 */ // OffsetNumber ip_posid; + d.FieldU32("ip_blkid") + d.FieldU16("ip_posid") + }) // ItemPointerData t_ctid + + /* 18 | 2 */ // uint16 t_infomask2; + /* 20 | 2 */ // uint16 t_infomask; + /* 22 | 1 */ // uint8 t_hoff; + /* 23 | 0 */ // bits8 t_bits[]; + /* XXX 1-byte padding */ + d.FieldU16("t_infomask2") + d.FieldU16("t_infomask") + d.FieldU8("t_hoff") + d.U8() + + d.FieldRawLen("t_bits", int64(tupleDataLen*8), scalar.RawHex) + + }) // HeapTupleHeaderData + } + }) // Tuples + // end of page endLen := uint64(d.Pos() / 8) pageEnd := common.TypeAlign(heap.pageSize, endLen) From 01b380e86305b13934545ef993009849242ccf4b Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 29 Jul 2022 16:36:59 +0300 Subject: [PATCH 017/141] PostgrreSQl heap decode refactoring --- format/postgres/flavours/postgres14/pgheap.go | 346 ++++++++++-------- 1 file changed, 188 insertions(+), 158 deletions(-) diff --git a/format/postgres/flavours/postgres14/pgheap.go b/format/postgres/flavours/postgres14/pgheap.go index c8e19d840..d4175fa2f 100644 --- a/format/postgres/flavours/postgres14/pgheap.go +++ b/format/postgres/flavours/postgres14/pgheap.go @@ -90,7 +90,9 @@ type heapPageD struct { pdSpecial uint16 pd_pagesize_version uint16 - itemIds []itemIdDataD + itemIds []itemIdDataD + pagePosBegin uint64 + itemsEnd int64 } func (hp *heapPageD) getItemId(offset uint32) (bool, itemIdDataD) { @@ -137,161 +139,189 @@ func decodeHeapPages(d *decode.D) { page := &heapPageD{} heap.page = page - pagePosBegin := common.RoundDown(heap.pageSize, uint64(d.Pos()/8)) - - d.FieldStruct("HeapPage", func(d *decode.D) { - /* 0 | 8 */ // PageXLogRecPtr pd_lsn; - /* 8 | 2 */ // uint16 pd_checksum; - /* 10 | 2 */ // uint16 pd_flags; - /* 12 | 2 */ // LocationIndex pd_lower; - /* 14 | 2 */ // LocationIndex pd_upper; - /* 16 | 2 */ // LocationIndex pd_special; - /* 18 | 2 */ // uint16 pd_pagesize_version; - /* 20 | 4 */ // TransactionId pd_prune_xid; - /* 24 | 0 */ // ItemIdData pd_linp[]; - d.FieldStruct("PageHeaderData", func(d *decode.D) { - d.FieldStruct("pd_lsn", func(d *decode.D) { - /* 0 | 4 */ // uint32 xlogid; - /* 4 | 4 */ // uint32 xrecoff; - d.FieldU32("xlogid", common.HexMapper) - d.FieldU32("xrecoff", common.HexMapper) - }) - d.FieldU16("pd_checksum") - d.FieldU16("pd_flags") - page.pdLower = uint16(d.FieldU16("pd_lower")) - page.pdUpper = uint16(d.FieldU16("pd_upper")) - page.pdSpecial = uint16(d.FieldU16("pd_special")) - page.pd_pagesize_version = uint16(d.FieldU16("pd_pagesize_version")) - d.FieldU32("pd_prune_xid") - - // ItemIdData pd_linp[]; - itemsEnd := int64(pagePosBegin*8) + int64(page.pdLower*8) - d.FieldArray("pd_linp", func(d *decode.D) { - for { - checkPos := d.Pos() - if checkPos >= itemsEnd { - break - } - /* 0: 0 | 4 */ // unsigned int lp_off: 15 - /* 1: 7 | 4 */ // unsigned int lp_flags: 2 - /* 2: 1 | 4 */ // unsigned int lp_len: 15 - d.FieldStruct("ItemIdData", func(d *decode.D) { - itemId := itemIdDataD{} - - itemPos := d.Pos() - itemId.lpOff = uint32(d.FieldU32("lp_off", common.LpOffMapper)) - d.SeekAbs(itemPos) - itemId.lpFlags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) - d.SeekAbs(itemPos) - itemId.lpLen = uint32(d.FieldU32("lp_len", common.LpLenMapper)) - - page.itemIds = append(page.itemIds, itemId) - }) - } // for pd_linp - }) // pd_linp in PageHeaderData - - }) // PageHeaderData, PageHeader - - // free space - freeSpaceEnd := int64(pagePosBegin*8) + int64(page.pdUpper*8) - freeSpaceNBits := freeSpaceEnd - d.Pos() - d.FieldRawLen("FreeSpace", freeSpaceNBits, scalar.RawHex) - - // Tuples - d.FieldArray("Tuples", func(d *decode.D) { - for i := 0; i < len(page.itemIds); i++ { - id := page.itemIds[i] - if id.lpOff == 0 || id.lpLen == 0 { - continue - } - - pos := int64(pagePosBegin)*8 + int64(page.itemIds[i].lpOff)*8 - tupleDataLen := id.lpLen - SizeOfHeapTupleHeaderData - - d.SeekAbs(pos) - - /* 0 | 12 */ // union { - /* 12 */ // HeapTupleFields t_heap; - /* 12 */ // DatumTupleFields t_datum; - // } t_choice; - /* total size (bytes): 12 */ - /* - /* 12 | 6 */ // ItemPointerData t_ctid; - /* 18 | 2 */ // uint16 t_infomask2; - /* 20 | 2 */ // uint16 t_infomask; - /* 22 | 1 */ // uint8 t_hoff; - /* 23 | 0 */ // bits8 t_bits[]; - /* XXX 1-byte padding */ - // - /* total size (bytes): 24 */ - d.FieldStruct("HeapTupleHeaderData", func(d *decode.D) { - d.FieldStruct("t_choice", func(d *decode.D) { - pos1 := d.Pos() - // type = struct HeapTupleFields { - /* 0 | 4 */ // TransactionId t_xmin; - /* 4 | 4 */ // TransactionId t_xmax; - /* 8 | 4 */ // union { - /* 4 */ // CommandId t_cid; - /* 4 */ // TransactionId t_xvac; - // } t_field3; - /* total size (bytes): 4 */ - // - /* total size (bytes): 12 */ - d.FieldStruct("t_heap", func(d *decode.D) { - d.FieldU32("t_xmin") - d.FieldU32("t_xmax") - d.FieldStruct("t_field3", func(d *decode.D) { - pos2 := d.Pos() - d.FieldU32("t_cid") - d.SeekAbs(pos2) - d.FieldU32("t_xvac") - }) // t_field3 - }) // HeapTupleFields t_heap - - d.SeekAbs(pos1) - // type = struct DatumTupleFields { - /* 0 | 4 */ // int32 datum_len_; - /* 4 | 4 */ // int32 datum_typmod; - /* 8 | 4 */ // Oid datum_typeid; - // - /* total size (bytes): 12 */ - - // t_datum - d.FieldStruct("t_datum", func(d *decode.D) { - d.FieldS32("datum_len_") - d.FieldS32("datum_typmod") - d.FieldU32("datum_typeid") - }) // DatumTupleFields t_datum - }) // t_choice - - d.FieldStruct("t_ctid", func(d *decode.D) { - /* 0 | 4 */ // BlockIdData ip_blkid; - /* 4 | 2 */ // OffsetNumber ip_posid; - d.FieldU32("ip_blkid") - d.FieldU16("ip_posid") - }) // ItemPointerData t_ctid - - /* 18 | 2 */ // uint16 t_infomask2; - /* 20 | 2 */ // uint16 t_infomask; - /* 22 | 1 */ // uint8 t_hoff; - /* 23 | 0 */ // bits8 t_bits[]; - /* XXX 1-byte padding */ - d.FieldU16("t_infomask2") - d.FieldU16("t_infomask") - d.FieldU8("t_hoff") - d.U8() - - d.FieldRawLen("t_bits", int64(tupleDataLen*8), scalar.RawHex) - - }) // HeapTupleHeaderData - } - }) // Tuples - - // end of page - endLen := uint64(d.Pos() / 8) - pageEnd := common.TypeAlign(heap.pageSize, endLen) - d.SeekAbs(int64(pageEnd) * 8) - }) // HeapPage - - } // for Heap pages + d.FieldStruct("HeapPage", decodeHeapPage) + + // end of page + endLen := uint64(d.Pos() / 8) + pageEnd := common.TypeAlign(heap.pageSize, endLen) + d.SeekAbs(int64(pageEnd) * 8) + } +} + +func decodeHeapPage(d *decode.D) { + heap := getHeapD(d) + + page := &heapPageD{} + heap.page = page + + pagePosBegin := common.RoundDown(heap.pageSize, uint64(d.Pos()/8)) + page.pagePosBegin = pagePosBegin + + // PageHeader + d.FieldStruct("PageHeaderData", decodePageHeaderData) + + // free space + freeSpaceEnd := int64(pagePosBegin*8) + int64(page.pdUpper*8) + freeSpaceNBits := freeSpaceEnd - d.Pos() + d.FieldRawLen("FreeSpace", freeSpaceNBits, scalar.RawHex) + + // Tuples + d.FieldArray("Tuples", decodeTuples) +} + +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 20 | 4 */ // TransactionId pd_prune_xid; +/* 24 | 0 */ // ItemIdData pd_linp[]; +func decodePageHeaderData(d *decode.D) { + heap := getHeapD(d) + page := heap.page + + d.FieldStruct("pd_lsn", func(d *decode.D) { + /* 0 | 4 */ // uint32 xlogid; + /* 4 | 4 */ // uint32 xrecoff; + d.FieldU32("xlogid", common.HexMapper) + d.FieldU32("xrecoff", common.HexMapper) + }) + d.FieldU16("pd_checksum") + d.FieldU16("pd_flags") + page.pdLower = uint16(d.FieldU16("pd_lower")) + page.pdUpper = uint16(d.FieldU16("pd_upper")) + page.pdSpecial = uint16(d.FieldU16("pd_special")) + page.pd_pagesize_version = uint16(d.FieldU16("pd_pagesize_version")) + d.FieldU32("pd_prune_xid") + + // ItemIdData pd_linp[]; + page.itemsEnd = int64(page.pagePosBegin*8) + int64(page.pdLower*8) + d.FieldArray("pd_linp", decodeItemIds) +} + +func decodeItemIds(d *decode.D) { + heap := getHeapD(d) + page := heap.page + + for { + checkPos := d.Pos() + if checkPos >= page.itemsEnd { + break + } + /* 0: 0 | 4 */ // unsigned int lp_off: 15 + /* 1: 7 | 4 */ // unsigned int lp_flags: 2 + /* 2: 1 | 4 */ // unsigned int lp_len: 15 + d.FieldStruct("ItemIdData", func(d *decode.D) { + itemId := itemIdDataD{} + + itemPos := d.Pos() + itemId.lpOff = uint32(d.FieldU32("lp_off", common.LpOffMapper)) + d.SeekAbs(itemPos) + itemId.lpFlags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) + d.SeekAbs(itemPos) + itemId.lpLen = uint32(d.FieldU32("lp_len", common.LpLenMapper)) + + page.itemIds = append(page.itemIds, itemId) + }) + } // for pd_linp +} + +func decodeTuples(d *decode.D) { + heap := getHeapD(d) + page := heap.page + + for i := 0; i < len(page.itemIds); i++ { + id := page.itemIds[i] + if id.lpOff == 0 || id.lpLen == 0 { + continue + } + + pos := int64(page.pagePosBegin)*8 + int64(page.itemIds[i].lpOff)*8 + tupleDataLen := id.lpLen - SizeOfHeapTupleHeaderData + + // seek to tuple with ItemId offset + d.SeekAbs(pos) + + /* 0 | 12 */ // union { + /* 12 */ // HeapTupleFields t_heap; + /* 12 */ // DatumTupleFields t_datum; + // } t_choice; + /* total size (bytes): 12 */ + /* + /* 12 | 6 */ // ItemPointerData t_ctid; + /* 18 | 2 */ // uint16 t_infomask2; + /* 20 | 2 */ // uint16 t_infomask; + /* 22 | 1 */ // uint8 t_hoff; + /* 23 | 0 */ // bits8 t_bits[]; + /* XXX 1-byte padding */ + // + /* total size (bytes): 24 */ + d.FieldStruct("HeapTupleHeaderData", func(d *decode.D) { + d.FieldStruct("t_choice", decodeTChoice) + + d.FieldStruct("t_ctid", func(d *decode.D) { + /* 0 | 4 */ // BlockIdData ip_blkid; + /* 4 | 2 */ // OffsetNumber ip_posid; + d.FieldU32("ip_blkid") + d.FieldU16("ip_posid") + }) // ItemPointerData t_ctid + + /* 18 | 2 */ // uint16 t_infomask2; + /* 20 | 2 */ // uint16 t_infomask; + /* 22 | 1 */ // uint8 t_hoff; + /* 23 | 0 */ // bits8 t_bits[]; + /* XXX 1-byte padding */ + d.FieldU16("t_infomask2") + d.FieldU16("t_infomask") + d.FieldU8("t_hoff") + d.U8() + + d.FieldRawLen("t_bits", int64(tupleDataLen*8), scalar.RawHex) + + }) // HeapTupleHeaderData + } // for ItemsIds +} + +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// } t_choice; +func decodeTChoice(d *decode.D) { + pos1 := d.Pos() + // type = struct HeapTupleFields { + /* 0 | 4 */ // TransactionId t_xmin; + /* 4 | 4 */ // TransactionId t_xmax; + /* 8 | 4 */ // union { + /* 4 */ // CommandId t_cid; + /* 4 */ // TransactionId t_xvac; + // } t_field3; + /* total size (bytes): 4 */ + // + /* total size (bytes): 12 */ + d.FieldStruct("t_heap", func(d *decode.D) { + d.FieldU32("t_xmin") + d.FieldU32("t_xmax") + d.FieldStruct("t_field3", func(d *decode.D) { + pos2 := d.Pos() + d.FieldU32("t_cid") + d.SeekAbs(pos2) + d.FieldU32("t_xvac") + }) // t_field3 + }) // HeapTupleFields t_heap + + // restore position for union + d.SeekAbs(pos1) + // type = struct DatumTupleFields { + /* 0 | 4 */ // int32 datum_len_; + /* 4 | 4 */ // int32 datum_typmod; + /* 8 | 4 */ // Oid datum_typeid; + // + /* total size (bytes): 12 */ + d.FieldStruct("t_datum", func(d *decode.D) { + d.FieldS32("datum_len_") + d.FieldS32("datum_typmod") + d.FieldU32("datum_typeid") + }) // DatumTupleFields t_datum } From 3c6ea87017ec3b5e85ecc897c614d3926b47c923 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 1 Aug 2022 09:55:37 +0300 Subject: [PATCH 018/141] Add heap infomask flags parser to PostgreSQL --- format/postgres/common/pgheap.go | 11 +++ format/postgres/common/utils.go | 7 ++ format/postgres/common/utils_test.go | 11 +++ format/postgres/flavours/postgres14/pgheap.go | 93 +++++++++++++++++++ 4 files changed, 122 insertions(+) diff --git a/format/postgres/common/pgheap.go b/format/postgres/common/pgheap.go index cef4d3b0f..f5fdd821a 100644 --- a/format/postgres/common/pgheap.go +++ b/format/postgres/common/pgheap.go @@ -37,3 +37,14 @@ func (m lpLenMapper) MapScalar(s scalar.S) (scalar.S, error) { } var LpLenMapper = lpLenMapper{} + +type Mask struct { + Mask uint64 +} + +func (m Mask) MapScalar(s scalar.S) (scalar.S, error) { + m1 := s.ActualU() + v := IsMaskSet(m1, m.Mask) + s.Actual = v + return s, nil +} diff --git a/format/postgres/common/utils.go b/format/postgres/common/utils.go index cc0b2bb48..0038c7bf7 100644 --- a/format/postgres/common/utils.go +++ b/format/postgres/common/utils.go @@ -11,3 +11,10 @@ func TypeAlign8(alignLen uint64) uint64 { func RoundDown(alignVal uint64, alignLen uint64) uint64 { return (alignLen / alignVal) * alignVal } + +func IsMaskSet(value uint64, mask uint64) uint64 { + if (value & mask) == mask { + return 1 + } + return 0 +} diff --git a/format/postgres/common/utils_test.go b/format/postgres/common/utils_test.go index 7c751424f..b1915a7ec 100644 --- a/format/postgres/common/utils_test.go +++ b/format/postgres/common/utils_test.go @@ -42,3 +42,14 @@ func TestRoundDown(t *testing.T) { t.Errorf("must be %d\n", 5*pageSize1) } } + +func TestIsMaskSet(t *testing.T) { + m1 := common.IsMaskSet(0xff+0x1221000, 0xf0) + if m1 != 1 { + t.Errorf("mask must be set\n") + } + m2 := common.IsMaskSet(0xff+0x1221000, 0xf00) + if m2 != 0 { + t.Errorf("mask must be 0\n") + } +} diff --git a/format/postgres/flavours/postgres14/pgheap.go b/format/postgres/flavours/postgres14/pgheap.go index d4175fa2f..36d5724e5 100644 --- a/format/postgres/flavours/postgres14/pgheap.go +++ b/format/postgres/flavours/postgres14/pgheap.go @@ -7,6 +7,42 @@ import ( "github.com/wader/fq/pkg/scalar" ) +const ( + HEAP_HASNULL = 0x0001 /* has null attribute(s) */ + HEAP_HASVARWIDTH = 0x0002 /* has variable-width attribute(s) */ + HEAP_HASEXTERNAL = 0x0004 /* has external stored attribute(s) */ + HEAP_HASOID_OLD = 0x0008 /* has an object-id field */ + HEAP_XMAX_KEYSHR_LOCK = 0x0010 /* xmax is a key-shared locker */ + HEAP_COMBOCID = 0x0020 /* t_cid is a combo CID */ + HEAP_XMAX_EXCL_LOCK = 0x0040 /* xmax is exclusive locker */ + HEAP_XMAX_LOCK_ONLY = 0x0080 /* xmax, if valid, is only a locker */ + + HEAP_XMAX_SHR_LOCK = HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK + + HEAP_LOCK_MASK = HEAP_XMAX_SHR_LOCK | HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK + + HEAP_XMIN_COMMITTED = 0x0100 /* t_xmin committed */ + HEAP_XMIN_INVALID = 0x0200 /* t_xmin invalid/aborted */ + HEAP_XMIN_FROZEN = HEAP_XMIN_COMMITTED | HEAP_XMIN_INVALID + HEAP_XMAX_COMMITTED = 0x0400 /* t_xmax committed */ + HEAP_XMAX_INVALID = 0x0800 /* t_xmax invalid/aborted */ + HEAP_XMAX_IS_MULTI = 0x1000 /* t_xmax is a MultiXactId */ + HEAP_UPDATED = 0x2000 /* this is UPDATEd version of row */ + HEAP_MOVED_OFF = 0x4000 /* moved to another place by pre-9.0 + * VACUUM FULL; kept for binary + * upgrade support */ + HEAP_MOVED_IN = 0x8000 /* moved from another place by pre-9.0 + * VACUUM FULL; kept for binary + * upgrade support */ + HEAP_MOVED = HEAP_MOVED_OFF | HEAP_MOVED_IN +) + +const ( + HEAP_KEYS_UPDATED = 0x2000 /* tuple was updated and key cols modified, or tuple deleted */ + HEAP_HOT_UPDATED = 0x4000 /* tuple was HOT-updated */ + HEAP_ONLY_TUPLE = 0x8000 /* this is heap-only tuple */ +) + // type = struct PageHeaderData /* 0 | 8 */ // PageXLogRecPtr pd_lsn; /* 8 | 2 */ // uint16 pd_checksum; @@ -274,7 +310,10 @@ func decodeTuples(d *decode.D) { /* 23 | 0 */ // bits8 t_bits[]; /* XXX 1-byte padding */ d.FieldU16("t_infomask2") + d.FieldStruct("Infomask2", decodeInfomask2) d.FieldU16("t_infomask") + d.FieldStruct("Infomask", decodeInfomask) + d.FieldU8("t_hoff") d.U8() @@ -284,6 +323,60 @@ func decodeTuples(d *decode.D) { } // for ItemsIds } +func decodeInfomask2(d *decode.D) { + pos := d.Pos() - 16 + d.SeekAbs(pos) + d.FieldU16("HEAP_KEYS_UPDATED", common.Mask{Mask: HEAP_KEYS_UPDATED}) + d.SeekAbs(pos) + d.FieldU16("HEAP_HOT_UPDATED", common.Mask{Mask: HEAP_HOT_UPDATED}) + d.SeekAbs(pos) + d.FieldU16("HEAP_ONLY_TUPLE", common.Mask{Mask: HEAP_ONLY_TUPLE}) +} + +func decodeInfomask(d *decode.D) { + pos := d.Pos() - 16 + d.SeekAbs(pos) + d.FieldU16("HEAP_HASNULL", common.Mask{Mask: HEAP_HASNULL}) + d.SeekAbs(pos) + d.FieldU16("HEAP_HASVARWIDTH", common.Mask{Mask: HEAP_HASVARWIDTH}) + d.SeekAbs(pos) + d.FieldU16("HEAP_HASEXTERNAL", common.Mask{Mask: HEAP_HASEXTERNAL}) + d.SeekAbs(pos) + d.FieldU16("HEAP_HASOID_OLD", common.Mask{Mask: HEAP_HASOID_OLD}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMAX_KEYSHR_LOCK", common.Mask{Mask: HEAP_XMAX_KEYSHR_LOCK}) + d.SeekAbs(pos) + d.FieldU16("HEAP_COMBOCID", common.Mask{Mask: HEAP_COMBOCID}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMAX_EXCL_LOCK", common.Mask{Mask: HEAP_XMAX_EXCL_LOCK}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMAX_LOCK_ONLY", common.Mask{Mask: HEAP_XMAX_LOCK_ONLY}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMAX_SHR_LOCK", common.Mask{Mask: HEAP_XMAX_SHR_LOCK}) + d.SeekAbs(pos) + d.FieldU16("HEAP_LOCK_MASK", common.Mask{Mask: HEAP_LOCK_MASK}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMIN_COMMITTED", common.Mask{Mask: HEAP_XMIN_COMMITTED}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMIN_INVALID", common.Mask{Mask: HEAP_XMIN_INVALID}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMIN_FROZEN", common.Mask{Mask: HEAP_XMIN_FROZEN}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMAX_COMMITTED", common.Mask{Mask: HEAP_XMAX_COMMITTED}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMAX_INVALID", common.Mask{Mask: HEAP_XMAX_INVALID}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMAX_IS_MULTI", common.Mask{Mask: HEAP_XMAX_IS_MULTI}) + d.SeekAbs(pos) + d.FieldU16("HEAP_UPDATED", common.Mask{Mask: HEAP_UPDATED}) + d.SeekAbs(pos) + d.FieldU16("HEAP_MOVED_OFF", common.Mask{Mask: HEAP_MOVED_OFF}) + d.SeekAbs(pos) + d.FieldU16("HEAP_MOVED_IN", common.Mask{Mask: HEAP_MOVED_IN}) + d.SeekAbs(pos) + d.FieldU16("HEAP_MOVED", common.Mask{Mask: HEAP_MOVED}) +} + /* 0 | 12 */ // union { /* 12 */ // HeapTupleFields t_heap; /* 12 */ // DatumTupleFields t_datum; From 850dc608825d4158c3a4d4d753aeebc7b94e305c Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 1 Aug 2022 13:15:17 +0300 Subject: [PATCH 019/141] PostgreSQL: lp_flags format --- format/postgres/common/pgheap.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/format/postgres/common/pgheap.go b/format/postgres/common/pgheap.go index f5fdd821a..892c056b9 100644 --- a/format/postgres/common/pgheap.go +++ b/format/postgres/common/pgheap.go @@ -6,6 +6,11 @@ import ( const ( HeapPageSize = 8192 + + LP_UNUSED = 0 /* unused (should always have lp_len=0) */ + LP_NORMAL = 1 /* used (should always have lp_len>0) */ + LP_REDIRECT = 2 /* HOT redirect (should have lp_len=0) */ + LP_DEAD = 3 ) type lpOffMapper struct{} @@ -23,6 +28,16 @@ type lpFlagsMapper struct{} func (m lpFlagsMapper) MapScalar(s scalar.S) (scalar.S, error) { v := (s.ActualU() >> 15) & 0x3 s.Actual = v + switch v { + case LP_UNUSED: + s.Sym = "LP_UNUSED" + case LP_NORMAL: + s.Sym = "LP_NORMAL" + case LP_REDIRECT: + s.Sym = "LP_REDIRECT" + case LP_DEAD: + s.Sym = "LP_DEAD" + } return s, nil } From 6ed026396fbeb535dc65ce5246107778460c3fe6 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 1 Aug 2022 13:42:19 +0300 Subject: [PATCH 020/141] PostgreSQL: accept only normal item pointers --- format/postgres/flavours/postgres14/pgheap.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/format/postgres/flavours/postgres14/pgheap.go b/format/postgres/flavours/postgres14/pgheap.go index 36d5724e5..2d24ad2cd 100644 --- a/format/postgres/flavours/postgres14/pgheap.go +++ b/format/postgres/flavours/postgres14/pgheap.go @@ -273,6 +273,9 @@ func decodeTuples(d *decode.D) { if id.lpOff == 0 || id.lpLen == 0 { continue } + if id.lpFlags != common.LP_NORMAL { + continue + } pos := int64(page.pagePosBegin)*8 + int64(page.itemIds[i].lpOff)*8 tupleDataLen := id.lpLen - SizeOfHeapTupleHeaderData From ffd7c9b035713c46be6dfc985221a1fb0aab4cf6 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 2 Aug 2022 08:43:24 +0300 Subject: [PATCH 021/141] PostgreSQL: implement pgproee 14 --- format/postgres/flavours/pgproee14/pgheap.go | 133 +++++ .../flavours/postgres14/common14/pgheap.go | 453 ++++++++++++++++++ format/postgres/flavours/postgres14/pgheap.go | 393 +-------------- format/postgres/pgheap.go | 3 + 4 files changed, 604 insertions(+), 378 deletions(-) create mode 100644 format/postgres/flavours/pgproee14/pgheap.go create mode 100644 format/postgres/flavours/postgres14/common14/pgheap.go diff --git a/format/postgres/flavours/pgproee14/pgheap.go b/format/postgres/flavours/pgproee14/pgheap.go new file mode 100644 index 000000000..0ad1782e0 --- /dev/null +++ b/format/postgres/flavours/pgproee14/pgheap.go @@ -0,0 +1,133 @@ +package pgproee14 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 20 | 0 */ // ItemIdData pd_linp[]; +// +/* total size (bytes): 20 */ + +// type = struct { +/* 0 | 4 */ // uint32 xlogid; +/* 4 | 4 */ // uint32 xrecoff; +// +/* total size (bytes): 8 */ + +// type = struct ItemIdData { +/* 0: 0 | 4 */ // unsigned int lp_off : 15; +/* 1: 7 | 4 */ // unsigned int lp_flags : 2; +/* 2: 1 | 4 */ // unsigned int lp_len : 15; +// +/* total size (bytes): 4 */ + +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// } t_choice; +/* total size (bytes): 12 */ +// +/* 12 | 6 */ // ItemPointerData t_ctid +/* 18 | 2 */ // uint16 t_infomask2 +/* 20 | 2 */ // uint16 t_infomask +/* 22 | 1 */ // uint8 t_hoff +/* 23 | 0 */ // bits8 t_bits[] +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleFields { +/* 0 | 4 */ // ShortTransactionId t_xmin; +/* 4 | 4 */ // ShortTransactionId t_xmax; +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // ShortTransactionId t_xvac; +// +/* total size (bytes): 4 */ +// } t_field3; +// +/* total size (bytes): 12 */ + +// type = struct DatumTupleFields { +/* 0 | 4 */ // int32 datum_len_; +/* 4 | 4 */ // int32 datum_typmod; +/* 8 | 4 */ // Oid datum_typeid; +// +/* total size (bytes): 12 */ + +// type = struct ItemPointerData { +/* 0 | 4 */ // BlockIdData ip_blkid; +/* 4 | 2 */ // OffsetNumber ip_posid; +// +/* total size (bytes): 6 */ + +func DecodeHeap(d *decode.D) any { + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: DecodePageHeaderData, + DecodePageSpecialFn: DecodePageSpecial, + } + return common14.DecodeHeap(d, heap) +} + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 20 | 0 */ // ItemIdData pd_linp[]; +func DecodePageHeaderData(d *decode.D) { + heap := common14.GetHeapD(d) + page := heap.Page + + d.FieldStruct("pd_lsn", func(d *decode.D) { + /* 0 | 4 */ // uint32 xlogid; + /* 4 | 4 */ // uint32 xrecoff; + d.FieldU32("xlogid", common.HexMapper) + d.FieldU32("xrecoff", common.HexMapper) + }) + d.FieldU16("pd_checksum") + d.FieldU16("pd_flags") + page.PdLower = uint16(d.FieldU16("pd_lower")) + page.PdUpper = uint16(d.FieldU16("pd_upper")) + page.PdSpecial = uint16(d.FieldU16("pd_special")) + page.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) + + // ItemIdData pd_linp[]; + page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) + d.FieldArray("pd_linp", common14.DecodeItemIds) +} + +// type = struct HeapPageSpecialData { +/* 0 | 8 */ // TransactionId pd_xid_base; +/* 8 | 8 */ // TransactionId pd_multi_base; +/* 16 | 4 */ // ShortTransactionId pd_prune_xid; +/* 20 | 4 */ // uint32 pd_magic; +// +/* total size (bytes): 24 */ +func DecodePageSpecial(d *decode.D) { + heap := common14.GetHeapD(d) + page := heap.Page + + specialPos := int64(page.PagePosBegin*8) + int64(page.PdSpecial*8) + d.SeekAbs(specialPos) + + page.PdXidBase = d.FieldU64("pd_xid_base") + page.PdMultiBase = d.FieldU64("pd_multi_base") + page.PdPruneXid = d.FieldU32("pd_prune_xid") + page.PdMagic = d.FieldU32("pd_magic") +} diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go new file mode 100644 index 000000000..150421810 --- /dev/null +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -0,0 +1,453 @@ +package common14 + +import ( + "context" + "fmt" + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +const ( + HEAP_HASNULL = 0x0001 /* has null attribute(s) */ + HEAP_HASVARWIDTH = 0x0002 /* has variable-width attribute(s) */ + HEAP_HASEXTERNAL = 0x0004 /* has external stored attribute(s) */ + HEAP_HASOID_OLD = 0x0008 /* has an object-id field */ + HEAP_XMAX_KEYSHR_LOCK = 0x0010 /* xmax is a key-shared locker */ + HEAP_COMBOCID = 0x0020 /* t_cid is a combo CID */ + HEAP_XMAX_EXCL_LOCK = 0x0040 /* xmax is exclusive locker */ + HEAP_XMAX_LOCK_ONLY = 0x0080 /* xmax, if valid, is only a locker */ + + HEAP_XMAX_SHR_LOCK = HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK + + HEAP_LOCK_MASK = HEAP_XMAX_SHR_LOCK | HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK + + HEAP_XMIN_COMMITTED = 0x0100 /* t_xmin committed */ + HEAP_XMIN_INVALID = 0x0200 /* t_xmin invalid/aborted */ + HEAP_XMIN_FROZEN = HEAP_XMIN_COMMITTED | HEAP_XMIN_INVALID + HEAP_XMAX_COMMITTED = 0x0400 /* t_xmax committed */ + HEAP_XMAX_INVALID = 0x0800 /* t_xmax invalid/aborted */ + HEAP_XMAX_IS_MULTI = 0x1000 /* t_xmax is a MultiXactId */ + HEAP_UPDATED = 0x2000 /* this is UPDATEd version of row */ + HEAP_MOVED_OFF = 0x4000 /* moved to another place by pre-9.0 + * VACUUM FULL; kept for binary + * upgrade support */ + HEAP_MOVED_IN = 0x8000 /* moved from another place by pre-9.0 + * VACUUM FULL; kept for binary + * upgrade support */ + HEAP_MOVED = HEAP_MOVED_OFF | HEAP_MOVED_IN +) + +const ( + HEAP_KEYS_UPDATED = 0x2000 /* tuple was updated and key cols modified, or tuple deleted */ + HEAP_HOT_UPDATED = 0x4000 /* tuple was HOT-updated */ + HEAP_ONLY_TUPLE = 0x8000 /* this is heap-only tuple */ +) + +// type = struct PageHeaderData +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 PdPagesizeVersion; +/* 20 | 4 */ // TransactionId pd_prune_xid; +/* 24 | 0 */ // ItemIdData pd_linp[]; +// +/* total size (bytes): 24 */ + +// type = struct PageXLogRecPtr { +/* 0 | 4 */ // uint32 xlogid; +/* 4 | 4 */ // uint32 xrecoff; + +/* total size (bytes): 8 */ + +// type = struct ItemIdData { +/* 0: 0 | 4 */ // unsigned int lp_off: 15 +/* 1: 7 | 4 */ // unsigned int lp_flags: 2 +/* 2: 1 | 4 */ // unsigned int lp_len: 15 + +/* total size (bytes): 4 */ + +// typedef uint16 LocationIndex; +// #define SizeOfPageHeaderData (offsetof(PageHeaderData, pd_linp)) + +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// +/* total size (bytes): 12 */ +/* } t_choice; // +/* 12 | 6 */// ItemPointerData t_ctid; +/* 18 | 2 */ // uint16 t_infomask2; +/* 20 | 2 */ // uint16 t_infomask; +/* 22 | 1 */ // uint8 t_hoff; +/* 23 | 0 */ // bits8 t_bits[]; +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ +const SizeOfHeapTupleHeaderData = 24 + +// type = struct HeapTupleFields { +/* 0 | 4 */ // TransactionId t_xmin; +/* 4 | 4 */ // TransactionId t_xmax; +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // TransactionId t_xvac; +// } t_field3; +/* total size (bytes): 4 */ +// +/* total size (bytes): 12 */ + +// type = struct DatumTupleFields { +/* 0 | 4 */ // int32 datum_len_; +/* 4 | 4 */ // int32 datum_typmod; +/* 8 | 4 */ // Oid datum_typeid; +// +/* total size (bytes): 12 */ + +// type = struct ItemPointerData { +/* 0 | 4 */ // BlockIdData ip_blkid; +/* 4 | 2 */ // OffsetNumber ip_posid; +// +/* total size (bytes): 6 */ + +type HeapD struct { + PageSize uint64 + + // current Page + Page *HeapPageD + // current tuple + Tuple *TupleD + + DecodePageHeaderDataFn func(d *decode.D) + DecodePageSpecialFn func(d *decode.D) +} + +type HeapPageD struct { + PdLower uint16 + PdUpper uint16 + PdSpecial uint16 + PdPagesizeVersion uint16 + + ItemIds []itemIdDataD + PagePosBegin uint64 + ItemsEnd int64 + + // pgproee + PdXidBase uint64 // 8 TransactionId pd_xid_base; + PdMultiBase uint64 // 8 TransactionId pd_multi_base; + PdPruneXid uint64 // 4 ShortTransactionId pd_prune_xid; + PdMagic uint64 // 4 uint32 pd_magic; +} + +type TupleD struct { + IsMulti uint64 +} + +func (hp *HeapPageD) getItemId(offset uint32) (bool, itemIdDataD) { + for _, id := range hp.ItemIds { + if id.lpOff == offset { + return true, id + } + } + return false, itemIdDataD{} +} + +type itemIdDataD struct { + /* 0: 0 | 4 */ // unsigned int lp_off: 15 + /* 1: 7 | 4 */ // unsigned int lp_flags: 2 + /* 2: 1 | 4 */ // unsigned int lp_len: 15 + lpOff uint32 + lpFlags uint32 + lpLen uint32 +} + +func GetHeapD(d *decode.D) *HeapD { + val := d.Ctx.Value("heap") + return val.(*HeapD) +} + +func DecodeHeap(d *decode.D, heap *HeapD) any { + parentCtx := d.Ctx + ctx := context.WithValue(parentCtx, "heap", heap) + d.Ctx = ctx + + d.SeekAbs(0) + d.FieldArray("Pages", decodeHeapPages) + + return nil +} + +func decodeHeapPages(d *decode.D) { + heap := GetHeapD(d) + + for { + page := &HeapPageD{} + heap.Page = page + + d.FieldStruct("HeapPage", decodeHeapPage) + + // end of Page + endLen := uint64(d.Pos() / 8) + pageEnd := common.TypeAlign(heap.PageSize, endLen) + d.SeekAbs(int64(pageEnd) * 8) + } +} + +func decodeHeapPage(d *decode.D) { + heap := GetHeapD(d) + + page := &HeapPageD{} + heap.Page = page + + pagePosBegin := common.RoundDown(heap.PageSize, uint64(d.Pos()/8)) + page.PagePosBegin = pagePosBegin + + // PageHeader + d.FieldStruct("PageHeaderData", heap.DecodePageHeaderDataFn) + + // free space + freeSpaceEnd := int64(pagePosBegin*8) + int64(page.PdUpper*8) + freeSpaceNBits := freeSpaceEnd - d.Pos() + d.FieldRawLen("FreeSpace", freeSpaceNBits, scalar.RawHex) + + if uint64(page.PdSpecial) != heap.PageSize && heap.DecodePageSpecialFn != nil { + heap.DecodePageSpecialFn(d) + } + + // Tuples + d.FieldArray("Tuples", decodeTuples) +} + +func DecodeItemIds(d *decode.D) { + heap := GetHeapD(d) + page := heap.Page + + for { + checkPos := d.Pos() + if checkPos >= page.ItemsEnd { + break + } + /* 0: 0 | 4 */ // unsigned int lp_off: 15 + /* 1: 7 | 4 */ // unsigned int lp_flags: 2 + /* 2: 1 | 4 */ // unsigned int lp_len: 15 + d.FieldStruct("ItemIdData", func(d *decode.D) { + itemId := itemIdDataD{} + + itemPos := d.Pos() + itemId.lpOff = uint32(d.FieldU32("lp_off", common.LpOffMapper)) + d.SeekAbs(itemPos) + itemId.lpFlags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) + d.SeekAbs(itemPos) + itemId.lpLen = uint32(d.FieldU32("lp_len", common.LpLenMapper)) + + page.ItemIds = append(page.ItemIds, itemId) + }) + } // for pd_linp +} + +func decodeTuples(d *decode.D) { + heap := GetHeapD(d) + page := heap.Page + + for i := 0; i < len(page.ItemIds); i++ { + id := page.ItemIds[i] + if id.lpOff == 0 || id.lpLen == 0 { + continue + } + if id.lpFlags != common.LP_NORMAL { + continue + } + + pos := int64(page.PagePosBegin)*8 + int64(page.ItemIds[i].lpOff)*8 + tupleDataLen := id.lpLen - SizeOfHeapTupleHeaderData + + // seek to tuple with ItemId offset + d.SeekAbs(pos) + + /* 0 | 12 */ // union { + /* 12 */ // HeapTupleFields t_heap; + /* 12 */ // DatumTupleFields t_datum; + // } t_choice; + /* total size (bytes): 12 */ + /* + /* 12 | 6 */// ItemPointerData t_ctid; + /* 18 | 2 */ // uint16 t_infomask2; + /* 20 | 2 */ // uint16 t_infomask; + /* 22 | 1 */ // uint8 t_hoff; + /* 23 | 0 */ // bits8 t_bits[]; + /* XXX 1-byte padding */ + // + /* total size (bytes): 24 */ + d.FieldStruct("HeapTupleHeaderData", func(d *decode.D) { + + pos1 := d.Pos() + // we need infomask before t_xmin, t_xmax + d.SeekAbs(pos1 + 48) + d.FieldU16("t_infomask2") + d.FieldStruct("Infomask2", decodeInfomask2) + d.FieldU16("t_infomask") + d.FieldStruct("Infomask", decodeInfomask) + + // restore pos and continue + d.SeekAbs(pos1) + d.FieldStruct("t_choice", decodeTChoice) + d.FieldStruct("t_ctid", func(d *decode.D) { + /* 0 | 4 */ // BlockIdData ip_blkid; + /* 4 | 2 */ // OffsetNumber ip_posid; + d.FieldU32("ip_blkid") + d.FieldU16("ip_posid") + }) // ItemPointerData t_ctid + + /* 18 | 2 */ // uint16 t_infomask2; + /* 20 | 2 */ // uint16 t_infomask; + /* 22 | 1 */ // uint8 t_hoff; + /* 23 | 0 */ // bits8 t_bits[]; + /* XXX 1-byte padding */ + //d.FieldU16("t_infomask2") + //d.FieldStruct("Infomask2", decodeInfomask2) + //d.FieldU16("t_infomask") + //d.FieldStruct("Infomask", decodeInfomask) + // already done + d.SeekRel(32) + + d.FieldU8("t_hoff") + d.U8() + + d.FieldRawLen("t_bits", int64(tupleDataLen*8), scalar.RawHex) + + }) // HeapTupleHeaderData + } // for ItemsIds +} + +func decodeInfomask2(d *decode.D) { + heap := GetHeapD(d) + tuple := &TupleD{} + heap.Tuple = tuple + + pos := d.Pos() - 16 + d.SeekAbs(pos) + d.FieldU16("HEAP_KEYS_UPDATED", common.Mask{Mask: HEAP_KEYS_UPDATED}) + d.SeekAbs(pos) + d.FieldU16("HEAP_HOT_UPDATED", common.Mask{Mask: HEAP_HOT_UPDATED}) + d.SeekAbs(pos) + d.FieldU16("HEAP_ONLY_TUPLE", common.Mask{Mask: HEAP_ONLY_TUPLE}) +} + +func decodeInfomask(d *decode.D) { + heap := GetHeapD(d) + tuple := heap.Tuple + + pos := d.Pos() - 16 + d.SeekAbs(pos) + d.FieldU16("HEAP_HASNULL", common.Mask{Mask: HEAP_HASNULL}) + d.SeekAbs(pos) + d.FieldU16("HEAP_HASVARWIDTH", common.Mask{Mask: HEAP_HASVARWIDTH}) + d.SeekAbs(pos) + d.FieldU16("HEAP_HASEXTERNAL", common.Mask{Mask: HEAP_HASEXTERNAL}) + d.SeekAbs(pos) + d.FieldU16("HEAP_HASOID_OLD", common.Mask{Mask: HEAP_HASOID_OLD}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMAX_KEYSHR_LOCK", common.Mask{Mask: HEAP_XMAX_KEYSHR_LOCK}) + d.SeekAbs(pos) + d.FieldU16("HEAP_COMBOCID", common.Mask{Mask: HEAP_COMBOCID}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMAX_EXCL_LOCK", common.Mask{Mask: HEAP_XMAX_EXCL_LOCK}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMAX_LOCK_ONLY", common.Mask{Mask: HEAP_XMAX_LOCK_ONLY}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMAX_SHR_LOCK", common.Mask{Mask: HEAP_XMAX_SHR_LOCK}) + d.SeekAbs(pos) + d.FieldU16("HEAP_LOCK_MASK", common.Mask{Mask: HEAP_LOCK_MASK}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMIN_COMMITTED", common.Mask{Mask: HEAP_XMIN_COMMITTED}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMIN_INVALID", common.Mask{Mask: HEAP_XMIN_INVALID}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMIN_FROZEN", common.Mask{Mask: HEAP_XMIN_FROZEN}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMAX_COMMITTED", common.Mask{Mask: HEAP_XMAX_COMMITTED}) + d.SeekAbs(pos) + d.FieldU16("HEAP_XMAX_INVALID", common.Mask{Mask: HEAP_XMAX_INVALID}) + d.SeekAbs(pos) + tuple.IsMulti = d.FieldU16("HEAP_XMAX_IS_MULTI", common.Mask{Mask: HEAP_XMAX_IS_MULTI}) + d.SeekAbs(pos) + d.FieldU16("HEAP_UPDATED", common.Mask{Mask: HEAP_UPDATED}) + d.SeekAbs(pos) + d.FieldU16("HEAP_MOVED_OFF", common.Mask{Mask: HEAP_MOVED_OFF}) + d.SeekAbs(pos) + d.FieldU16("HEAP_MOVED_IN", common.Mask{Mask: HEAP_MOVED_IN}) + d.SeekAbs(pos) + d.FieldU16("HEAP_MOVED", common.Mask{Mask: HEAP_MOVED}) +} + +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// } t_choice; +func decodeTChoice(d *decode.D) { + heap := GetHeapD(d) + page := heap.Page + tuple := heap.Tuple + + pos1 := d.Pos() + // type = struct HeapTupleFields { + /* 0 | 4 */ // TransactionId t_xmin; + /* 4 | 4 */ // TransactionId t_xmax; + /* 8 | 4 */ // union { + /* 4 */ // CommandId t_cid; + /* 4 */ // TransactionId t_xvac; + // } t_field3; + /* total size (bytes): 4 */ + // + /* total size (bytes): 12 */ + d.FieldStruct("t_heap", func(d *decode.D) { + d.FieldU32("t_xmin", TransactionMapper{Heap: heap, Page: page, Tuple: tuple}) + d.FieldU32("t_xmax", TransactionMapper{Heap: heap, Page: page, Tuple: tuple}) + d.FieldStruct("t_field3", func(d *decode.D) { + pos2 := d.Pos() + d.FieldU32("t_cid") + d.SeekAbs(pos2) + d.FieldU32("t_xvac") + }) // t_field3 + }) // HeapTupleFields t_heap + + // restore position for union + d.SeekAbs(pos1) + // type = struct DatumTupleFields { + /* 0 | 4 */ // int32 datum_len_; + /* 4 | 4 */ // int32 datum_typmod; + /* 8 | 4 */ // Oid datum_typeid; + // + /* total size (bytes): 12 */ + d.FieldStruct("t_datum", func(d *decode.D) { + d.FieldS32("datum_len_") + d.FieldS32("datum_typmod") + d.FieldU32("datum_typeid") + }) // DatumTupleFields t_datum +} + +type TransactionMapper struct { + Heap *HeapD + Page *HeapPageD + Tuple *TupleD +} + +func (m TransactionMapper) MapScalar(s scalar.S) (scalar.S, error) { + xid := s.ActualU() + + if m.Page.PdXidBase != 0 && m.Tuple.IsMulti == 0 { + xid64 := xid + m.Page.PdXidBase + s.Sym = fmt.Sprintf("%d", xid64) + } + + if m.Page.PdMultiBase != 0 && m.Tuple.IsMulti != 0 { + xid64 := xid + m.Page.PdMultiBase + s.Sym = fmt.Sprintf("%d", xid64) + } + + return s, nil +} diff --git a/format/postgres/flavours/postgres14/pgheap.go b/format/postgres/flavours/postgres14/pgheap.go index 2d24ad2cd..7d25cae48 100644 --- a/format/postgres/flavours/postgres14/pgheap.go +++ b/format/postgres/flavours/postgres14/pgheap.go @@ -1,46 +1,9 @@ package postgres14 import ( - "context" "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" - "github.com/wader/fq/pkg/scalar" -) - -const ( - HEAP_HASNULL = 0x0001 /* has null attribute(s) */ - HEAP_HASVARWIDTH = 0x0002 /* has variable-width attribute(s) */ - HEAP_HASEXTERNAL = 0x0004 /* has external stored attribute(s) */ - HEAP_HASOID_OLD = 0x0008 /* has an object-id field */ - HEAP_XMAX_KEYSHR_LOCK = 0x0010 /* xmax is a key-shared locker */ - HEAP_COMBOCID = 0x0020 /* t_cid is a combo CID */ - HEAP_XMAX_EXCL_LOCK = 0x0040 /* xmax is exclusive locker */ - HEAP_XMAX_LOCK_ONLY = 0x0080 /* xmax, if valid, is only a locker */ - - HEAP_XMAX_SHR_LOCK = HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK - - HEAP_LOCK_MASK = HEAP_XMAX_SHR_LOCK | HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK - - HEAP_XMIN_COMMITTED = 0x0100 /* t_xmin committed */ - HEAP_XMIN_INVALID = 0x0200 /* t_xmin invalid/aborted */ - HEAP_XMIN_FROZEN = HEAP_XMIN_COMMITTED | HEAP_XMIN_INVALID - HEAP_XMAX_COMMITTED = 0x0400 /* t_xmax committed */ - HEAP_XMAX_INVALID = 0x0800 /* t_xmax invalid/aborted */ - HEAP_XMAX_IS_MULTI = 0x1000 /* t_xmax is a MultiXactId */ - HEAP_UPDATED = 0x2000 /* this is UPDATEd version of row */ - HEAP_MOVED_OFF = 0x4000 /* moved to another place by pre-9.0 - * VACUUM FULL; kept for binary - * upgrade support */ - HEAP_MOVED_IN = 0x8000 /* moved from another place by pre-9.0 - * VACUUM FULL; kept for binary - * upgrade support */ - HEAP_MOVED = HEAP_MOVED_OFF | HEAP_MOVED_IN -) - -const ( - HEAP_KEYS_UPDATED = 0x2000 /* tuple was updated and key cols modified, or tuple deleted */ - HEAP_HOT_UPDATED = 0x4000 /* tuple was HOT-updated */ - HEAP_ONLY_TUPLE = 0x8000 /* this is heap-only tuple */ ) // type = struct PageHeaderData @@ -56,153 +19,12 @@ const ( // /* total size (bytes): 24 */ -// type = struct PageXLogRecPtr { -/* 0 | 4 */ // uint32 xlogid; -/* 4 | 4 */ // uint32 xrecoff; - -/* total size (bytes): 8 */ - -// type = struct ItemIdData { -/* 0: 0 | 4 */ // unsigned int lp_off: 15 -/* 1: 7 | 4 */ // unsigned int lp_flags: 2 -/* 2: 1 | 4 */ // unsigned int lp_len: 15 - -/* total size (bytes): 4 */ - -// typedef uint16 LocationIndex; -// #define SizeOfPageHeaderData (offsetof(PageHeaderData, pd_linp)) - -// type = struct HeapTupleHeaderData { -/* 0 | 12 */ // union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// -/* total size (bytes): 12 */ -/* } t_choice; // -/* 12 | 6 */ // ItemPointerData t_ctid; -/* 18 | 2 */ // uint16 t_infomask2; -/* 20 | 2 */ // uint16 t_infomask; -/* 22 | 1 */ // uint8 t_hoff; -/* 23 | 0 */ // bits8 t_bits[]; -/* XXX 1-byte padding */ -// -/* total size (bytes): 24 */ -const SizeOfHeapTupleHeaderData = 24 - -// type = struct HeapTupleFields { -/* 0 | 4 */ // TransactionId t_xmin; -/* 4 | 4 */ // TransactionId t_xmax; -/* 8 | 4 */ // union { -/* 4 */ // CommandId t_cid; -/* 4 */ // TransactionId t_xvac; -// } t_field3; -/* total size (bytes): 4 */ -// -/* total size (bytes): 12 */ - -// type = struct DatumTupleFields { -/* 0 | 4 */ // int32 datum_len_; -/* 4 | 4 */ // int32 datum_typmod; -/* 8 | 4 */ // Oid datum_typeid; -// -/* total size (bytes): 12 */ - -// type = struct ItemPointerData { -/* 0 | 4 */ // BlockIdData ip_blkid; -/* 4 | 2 */ // OffsetNumber ip_posid; -// -/* total size (bytes): 6 */ - -type heapD struct { - pageSize uint64 - - // current page - page *heapPageD -} - -type heapPageD struct { - pdLower uint16 - pdUpper uint16 - pdSpecial uint16 - pd_pagesize_version uint16 - - itemIds []itemIdDataD - pagePosBegin uint64 - itemsEnd int64 -} - -func (hp *heapPageD) getItemId(offset uint32) (bool, itemIdDataD) { - for _, id := range hp.itemIds { - if id.lpOff == offset { - return true, id - } - } - return false, itemIdDataD{} -} - -type itemIdDataD struct { - /* 0: 0 | 4 */ // unsigned int lp_off: 15 - /* 1: 7 | 4 */ // unsigned int lp_flags: 2 - /* 2: 1 | 4 */ // unsigned int lp_len: 15 - lpOff uint32 - lpFlags uint32 - lpLen uint32 -} - -func getHeapD(d *decode.D) *heapD { - val := d.Ctx.Value("heap") - return val.(*heapD) -} - func DecodeHeap(d *decode.D) any { - heap := &heapD{ - pageSize: common.HeapPageSize, - } - parentCtx := d.Ctx - ctx := context.WithValue(parentCtx, "heap", heap) - d.Ctx = ctx - - d.SeekAbs(0) - d.FieldArray("Pages", decodeHeapPages) - - return nil -} - -func decodeHeapPages(d *decode.D) { - heap := getHeapD(d) - - for { - page := &heapPageD{} - heap.page = page - - d.FieldStruct("HeapPage", decodeHeapPage) - - // end of page - endLen := uint64(d.Pos() / 8) - pageEnd := common.TypeAlign(heap.pageSize, endLen) - d.SeekAbs(int64(pageEnd) * 8) + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: DecodePageHeaderData, } -} - -func decodeHeapPage(d *decode.D) { - heap := getHeapD(d) - - page := &heapPageD{} - heap.page = page - - pagePosBegin := common.RoundDown(heap.pageSize, uint64(d.Pos()/8)) - page.pagePosBegin = pagePosBegin - - // PageHeader - d.FieldStruct("PageHeaderData", decodePageHeaderData) - - // free space - freeSpaceEnd := int64(pagePosBegin*8) + int64(page.pdUpper*8) - freeSpaceNBits := freeSpaceEnd - d.Pos() - d.FieldRawLen("FreeSpace", freeSpaceNBits, scalar.RawHex) - - // Tuples - d.FieldArray("Tuples", decodeTuples) + return common14.DecodeHeap(d, heap) } /* 0 | 8 */ // PageXLogRecPtr pd_lsn; @@ -211,12 +33,12 @@ func decodeHeapPage(d *decode.D) { /* 12 | 2 */ // LocationIndex pd_lower; /* 14 | 2 */ // LocationIndex pd_upper; /* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 18 | 2 */ // uint16 PdPagesizeVersion; /* 20 | 4 */ // TransactionId pd_prune_xid; /* 24 | 0 */ // ItemIdData pd_linp[]; -func decodePageHeaderData(d *decode.D) { - heap := getHeapD(d) - page := heap.page +func DecodePageHeaderData(d *decode.D) { + heap := common14.GetHeapD(d) + page := heap.Page d.FieldStruct("pd_lsn", func(d *decode.D) { /* 0 | 4 */ // uint32 xlogid; @@ -226,198 +48,13 @@ func decodePageHeaderData(d *decode.D) { }) d.FieldU16("pd_checksum") d.FieldU16("pd_flags") - page.pdLower = uint16(d.FieldU16("pd_lower")) - page.pdUpper = uint16(d.FieldU16("pd_upper")) - page.pdSpecial = uint16(d.FieldU16("pd_special")) - page.pd_pagesize_version = uint16(d.FieldU16("pd_pagesize_version")) + page.PdLower = uint16(d.FieldU16("pd_lower")) + page.PdUpper = uint16(d.FieldU16("pd_upper")) + page.PdSpecial = uint16(d.FieldU16("pd_special")) + page.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) d.FieldU32("pd_prune_xid") // ItemIdData pd_linp[]; - page.itemsEnd = int64(page.pagePosBegin*8) + int64(page.pdLower*8) - d.FieldArray("pd_linp", decodeItemIds) -} - -func decodeItemIds(d *decode.D) { - heap := getHeapD(d) - page := heap.page - - for { - checkPos := d.Pos() - if checkPos >= page.itemsEnd { - break - } - /* 0: 0 | 4 */ // unsigned int lp_off: 15 - /* 1: 7 | 4 */ // unsigned int lp_flags: 2 - /* 2: 1 | 4 */ // unsigned int lp_len: 15 - d.FieldStruct("ItemIdData", func(d *decode.D) { - itemId := itemIdDataD{} - - itemPos := d.Pos() - itemId.lpOff = uint32(d.FieldU32("lp_off", common.LpOffMapper)) - d.SeekAbs(itemPos) - itemId.lpFlags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) - d.SeekAbs(itemPos) - itemId.lpLen = uint32(d.FieldU32("lp_len", common.LpLenMapper)) - - page.itemIds = append(page.itemIds, itemId) - }) - } // for pd_linp -} - -func decodeTuples(d *decode.D) { - heap := getHeapD(d) - page := heap.page - - for i := 0; i < len(page.itemIds); i++ { - id := page.itemIds[i] - if id.lpOff == 0 || id.lpLen == 0 { - continue - } - if id.lpFlags != common.LP_NORMAL { - continue - } - - pos := int64(page.pagePosBegin)*8 + int64(page.itemIds[i].lpOff)*8 - tupleDataLen := id.lpLen - SizeOfHeapTupleHeaderData - - // seek to tuple with ItemId offset - d.SeekAbs(pos) - - /* 0 | 12 */ // union { - /* 12 */ // HeapTupleFields t_heap; - /* 12 */ // DatumTupleFields t_datum; - // } t_choice; - /* total size (bytes): 12 */ - /* - /* 12 | 6 */ // ItemPointerData t_ctid; - /* 18 | 2 */ // uint16 t_infomask2; - /* 20 | 2 */ // uint16 t_infomask; - /* 22 | 1 */ // uint8 t_hoff; - /* 23 | 0 */ // bits8 t_bits[]; - /* XXX 1-byte padding */ - // - /* total size (bytes): 24 */ - d.FieldStruct("HeapTupleHeaderData", func(d *decode.D) { - d.FieldStruct("t_choice", decodeTChoice) - - d.FieldStruct("t_ctid", func(d *decode.D) { - /* 0 | 4 */ // BlockIdData ip_blkid; - /* 4 | 2 */ // OffsetNumber ip_posid; - d.FieldU32("ip_blkid") - d.FieldU16("ip_posid") - }) // ItemPointerData t_ctid - - /* 18 | 2 */ // uint16 t_infomask2; - /* 20 | 2 */ // uint16 t_infomask; - /* 22 | 1 */ // uint8 t_hoff; - /* 23 | 0 */ // bits8 t_bits[]; - /* XXX 1-byte padding */ - d.FieldU16("t_infomask2") - d.FieldStruct("Infomask2", decodeInfomask2) - d.FieldU16("t_infomask") - d.FieldStruct("Infomask", decodeInfomask) - - d.FieldU8("t_hoff") - d.U8() - - d.FieldRawLen("t_bits", int64(tupleDataLen*8), scalar.RawHex) - - }) // HeapTupleHeaderData - } // for ItemsIds -} - -func decodeInfomask2(d *decode.D) { - pos := d.Pos() - 16 - d.SeekAbs(pos) - d.FieldU16("HEAP_KEYS_UPDATED", common.Mask{Mask: HEAP_KEYS_UPDATED}) - d.SeekAbs(pos) - d.FieldU16("HEAP_HOT_UPDATED", common.Mask{Mask: HEAP_HOT_UPDATED}) - d.SeekAbs(pos) - d.FieldU16("HEAP_ONLY_TUPLE", common.Mask{Mask: HEAP_ONLY_TUPLE}) -} - -func decodeInfomask(d *decode.D) { - pos := d.Pos() - 16 - d.SeekAbs(pos) - d.FieldU16("HEAP_HASNULL", common.Mask{Mask: HEAP_HASNULL}) - d.SeekAbs(pos) - d.FieldU16("HEAP_HASVARWIDTH", common.Mask{Mask: HEAP_HASVARWIDTH}) - d.SeekAbs(pos) - d.FieldU16("HEAP_HASEXTERNAL", common.Mask{Mask: HEAP_HASEXTERNAL}) - d.SeekAbs(pos) - d.FieldU16("HEAP_HASOID_OLD", common.Mask{Mask: HEAP_HASOID_OLD}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMAX_KEYSHR_LOCK", common.Mask{Mask: HEAP_XMAX_KEYSHR_LOCK}) - d.SeekAbs(pos) - d.FieldU16("HEAP_COMBOCID", common.Mask{Mask: HEAP_COMBOCID}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMAX_EXCL_LOCK", common.Mask{Mask: HEAP_XMAX_EXCL_LOCK}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMAX_LOCK_ONLY", common.Mask{Mask: HEAP_XMAX_LOCK_ONLY}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMAX_SHR_LOCK", common.Mask{Mask: HEAP_XMAX_SHR_LOCK}) - d.SeekAbs(pos) - d.FieldU16("HEAP_LOCK_MASK", common.Mask{Mask: HEAP_LOCK_MASK}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMIN_COMMITTED", common.Mask{Mask: HEAP_XMIN_COMMITTED}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMIN_INVALID", common.Mask{Mask: HEAP_XMIN_INVALID}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMIN_FROZEN", common.Mask{Mask: HEAP_XMIN_FROZEN}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMAX_COMMITTED", common.Mask{Mask: HEAP_XMAX_COMMITTED}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMAX_INVALID", common.Mask{Mask: HEAP_XMAX_INVALID}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMAX_IS_MULTI", common.Mask{Mask: HEAP_XMAX_IS_MULTI}) - d.SeekAbs(pos) - d.FieldU16("HEAP_UPDATED", common.Mask{Mask: HEAP_UPDATED}) - d.SeekAbs(pos) - d.FieldU16("HEAP_MOVED_OFF", common.Mask{Mask: HEAP_MOVED_OFF}) - d.SeekAbs(pos) - d.FieldU16("HEAP_MOVED_IN", common.Mask{Mask: HEAP_MOVED_IN}) - d.SeekAbs(pos) - d.FieldU16("HEAP_MOVED", common.Mask{Mask: HEAP_MOVED}) -} - -/* 0 | 12 */ // union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// } t_choice; -func decodeTChoice(d *decode.D) { - pos1 := d.Pos() - // type = struct HeapTupleFields { - /* 0 | 4 */ // TransactionId t_xmin; - /* 4 | 4 */ // TransactionId t_xmax; - /* 8 | 4 */ // union { - /* 4 */ // CommandId t_cid; - /* 4 */ // TransactionId t_xvac; - // } t_field3; - /* total size (bytes): 4 */ - // - /* total size (bytes): 12 */ - d.FieldStruct("t_heap", func(d *decode.D) { - d.FieldU32("t_xmin") - d.FieldU32("t_xmax") - d.FieldStruct("t_field3", func(d *decode.D) { - pos2 := d.Pos() - d.FieldU32("t_cid") - d.SeekAbs(pos2) - d.FieldU32("t_xvac") - }) // t_field3 - }) // HeapTupleFields t_heap - - // restore position for union - d.SeekAbs(pos1) - // type = struct DatumTupleFields { - /* 0 | 4 */ // int32 datum_len_; - /* 4 | 4 */ // int32 datum_typmod; - /* 8 | 4 */ // Oid datum_typeid; - // - /* total size (bytes): 12 */ - d.FieldStruct("t_datum", func(d *decode.D) { - d.FieldS32("datum_len_") - d.FieldS32("datum_typmod") - d.FieldU32("datum_typeid") - }) // DatumTupleFields t_datum + page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) + d.FieldArray("pd_linp", common14.DecodeItemIds) } diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 25779f4aa..025d816d8 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/pgproee14" "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" @@ -25,6 +26,8 @@ func decodePgheap(d *decode.D, in any) any { switch flavour { case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: return postgres14.DecodeHeap(d) + case PG_FLAVOUR_PGPROEE14: + return pgproee14.DecodeHeap(d) default: break } From 96a86e20baefa29218aa7a71a18549c23a1086b2 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 2 Aug 2022 13:05:44 +0300 Subject: [PATCH 022/141] PostgreSQL: fixes --- format/postgres/flavours/pgproee14/pgheap.go | 10 ++++++---- .../flavours/postgres14/common14/pgheap.go | 18 ++++++++++++------ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/format/postgres/flavours/pgproee14/pgheap.go b/format/postgres/flavours/pgproee14/pgheap.go index 0ad1782e0..f774f672b 100644 --- a/format/postgres/flavours/pgproee14/pgheap.go +++ b/format/postgres/flavours/pgproee14/pgheap.go @@ -126,8 +126,10 @@ func DecodePageSpecial(d *decode.D) { specialPos := int64(page.PagePosBegin*8) + int64(page.PdSpecial*8) d.SeekAbs(specialPos) - page.PdXidBase = d.FieldU64("pd_xid_base") - page.PdMultiBase = d.FieldU64("pd_multi_base") - page.PdPruneXid = d.FieldU32("pd_prune_xid") - page.PdMagic = d.FieldU32("pd_magic") + d.FieldStruct("HeapPageSpecialData", func(d *decode.D) { + page.PdXidBase = d.FieldU64("pd_xid_base") + page.PdMultiBase = d.FieldU64("pd_multi_base") + page.PdPruneXid = d.FieldU32("pd_prune_xid") + page.PdMagic = d.FieldU32("pd_magic") + }) } diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index 150421810..698cbdf16 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -80,7 +80,7 @@ const ( // /* total size (bytes): 12 */ /* } t_choice; // -/* 12 | 6 */// ItemPointerData t_ctid; +/* 12 | 6 */ // ItemPointerData t_ctid; /* 18 | 2 */ // uint16 t_infomask2; /* 20 | 2 */ // uint16 t_infomask; /* 22 | 1 */ // uint8 t_hoff; @@ -160,9 +160,9 @@ type itemIdDataD struct { /* 0: 0 | 4 */ // unsigned int lp_off: 15 /* 1: 7 | 4 */ // unsigned int lp_flags: 2 /* 2: 1 | 4 */ // unsigned int lp_len: 15 - lpOff uint32 - lpFlags uint32 - lpLen uint32 + lpOff uint32 + lpFlags uint32 + lpLen uint32 } func GetHeapD(d *decode.D) *HeapD { @@ -185,6 +185,10 @@ func decodeHeapPages(d *decode.D) { heap := GetHeapD(d) for { + if end, _ := d.TryEnd(); end { + return + } + page := &HeapPageD{} heap.Page = page @@ -212,7 +216,9 @@ func decodeHeapPage(d *decode.D) { // free space freeSpaceEnd := int64(pagePosBegin*8) + int64(page.PdUpper*8) freeSpaceNBits := freeSpaceEnd - d.Pos() - d.FieldRawLen("FreeSpace", freeSpaceNBits, scalar.RawHex) + if freeSpaceNBits != 0 { + d.FieldRawLen("FreeSpace", freeSpaceNBits, scalar.RawHex) + } if uint64(page.PdSpecial) != heap.PageSize && heap.DecodePageSpecialFn != nil { heap.DecodePageSpecialFn(d) @@ -274,7 +280,7 @@ func decodeTuples(d *decode.D) { // } t_choice; /* total size (bytes): 12 */ /* - /* 12 | 6 */// ItemPointerData t_ctid; + /* 12 | 6 */ // ItemPointerData t_ctid; /* 18 | 2 */ // uint16 t_infomask2; /* 20 | 2 */ // uint16 t_infomask; /* 22 | 1 */ // uint8 t_hoff; From 2d3884a3a3b498cdb2e3e565167a4311f6109c40 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 2 Aug 2022 16:40:12 +0300 Subject: [PATCH 023/141] PostgreSQL: pgproee11 heap impl --- .../postgres/flavours/pgproee11/pg_control.go | 76 +++++++++++++++++ format/postgres/flavours/pgproee11/pgheap.go | 83 +++++++++++++++++++ .../flavours/pgproee14/ee14/pgheap.go | 60 ++++++++++++++ format/postgres/flavours/pgproee14/pgheap.go | 62 ++------------ format/postgres/pg_control.go | 1 + format/postgres/pgheap.go | 3 + 6 files changed, 232 insertions(+), 53 deletions(-) create mode 100644 format/postgres/flavours/pgproee11/pg_control.go create mode 100644 format/postgres/flavours/pgproee11/pgheap.go create mode 100644 format/postgres/flavours/pgproee14/ee14/pgheap.go diff --git a/format/postgres/flavours/pgproee11/pg_control.go b/format/postgres/flavours/pgproee11/pg_control.go new file mode 100644 index 000000000..06a29cc5e --- /dev/null +++ b/format/postgres/flavours/pgproee11/pg_control.go @@ -0,0 +1,76 @@ +package pgproee11 + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 120 */ // CheckPoint checkPointCopy; +/* 160 | 8 */ // XLogRecPtr unloggedLSN; +/* 168 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 176 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 184 | 8 */ // XLogRecPtr backupStartPoint; +/* 192 | 8 */ // XLogRecPtr backupEndPoint; +/* 200 | 1 */ // _Bool backupEndRequired; +/* XXX 3-byte hole */ +/* 204 | 4 */ // int wal_level; +/* 208 | 1 */ // _Bool wal_log_hints; +/* XXX 3-byte hole */ +/* 212 | 4 */ // int MaxConnections; +/* 216 | 4 */ // int max_worker_processes; +/* 220 | 4 */ // int max_prepared_xacts; +/* 224 | 4 */ // int max_locks_per_xact; +/* 228 | 1 */ // _Bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 232 | 4 */ // uint32 maxAlign; +/* XXX 4-byte hole */ +/* 240 | 8 */ // double floatFormat; +/* 248 | 4 */ // uint32 blcksz; +/* 252 | 4 */ // uint32 relseg_size; +/* 256 | 4 */ // uint32 xlog_blcksz; +/* 260 | 4 */ // uint32 xlog_seg_size; +/* 264 | 4 */ // uint32 nameDataLen; +/* 268 | 4 */ // uint32 indexMaxKeys; +/* 272 | 4 */ // uint32 toast_max_chunk_size; +/* 276 | 4 */ // uint32 loblksize; +/* 280 | 1 */ // _Bool float4ByVal; +/* 281 | 1 */ // _Bool float8ByVal; +/* XXX 2-byte hole */ +/* 284 | 4 */ // uint32 data_checksum_version; +/* 288 | 32 */ // char mock_authentication_nonce[32]; +/* 320 | 4 */ // pg_icu_version icu_version; +/* 324 | 4 */ // uint32 pg_old_version; +/* 328 | 4 */ // SnapshotId oldest_snapshot; +/* 332 | 4 */ // SnapshotId recent_snapshot; +/* 336 | 4 */ // SnapshotId active_snapshot; +/* 340 | 4 */ // pg_crc32c crc; +// +/* total size (bytes): 344 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // _Bool fullPageWrites; +/* XXX 7-byte hole */ +/* 24 | 8 */ // TransactionId nextXid; +/* 32 | 4 */ // Oid nextOid; +/* XXX 4-byte hole */ +/* 40 | 8 */ // MultiXactId nextMulti; +/* 48 | 8 */ // MultiXactOffset nextMultiOffset; +/* 56 | 8 */ // TransactionId oldestXid; +/* 64 | 4 */ // Oid oldestXidDB; +/* XXX 4-byte hole */ +/* 72 | 8 */ // MultiXactId oldestMulti; +/* 80 | 4 */ // Oid oldestMultiDB; +/* XXX 4-byte hole */ +/* 88 | 8 */ // pg_time_t time; +/* 96 | 8 */ // TransactionId oldestCommitTsXid; +/* 104 | 8 */ // TransactionId newestCommitTsXid; +/* 112 | 8 */ // TransactionId oldestActiveXid; +// +/* total size (bytes): 120 */ diff --git a/format/postgres/flavours/pgproee11/pgheap.go b/format/postgres/flavours/pgproee11/pgheap.go new file mode 100644 index 000000000..c8c75e00e --- /dev/null +++ b/format/postgres/flavours/pgproee11/pgheap.go @@ -0,0 +1,83 @@ +package pgproee11 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 20 | 0 */ // ItemIdData pd_linp[]; +// +/* total size (bytes): 20 */ + +// type = struct PageXLogRecPtr { +/* 0 | 4 */ // uint32 xlogid; +/* 4 | 4 */ // uint32 xrecoff; +// +/* total size (bytes): 8 */ + +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// } t_choice; +/* total size (bytes): 12 */ +// +/* 12 | 6 */ // ItemPointerData t_ctid; +/* 18 | 2 */ // uint16 t_infomask2; +/* 20 | 2 */ // uint16 t_infomask; +/* 22 | 1 */ // uint8 t_hoff; +/* 23 | 0 */ // bits8 t_bits[]; +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleFields { +/* 0 | 4 */ // ShortTransactionId t_xmin; +/* 4 | 4 */ // ShortTransactionId t_xmax; +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // ShortTransactionId t_xvac; +// } t_field3; +/* total size (bytes): 4 */ +// +/* total size (bytes): 12 */ + +// type = struct DatumTupleFields { +/* 0 | 4 */ // int32 datum_len_; +/* 4 | 4 */ // int32 datum_typmod; +/* 8 | 4 */ // Oid datum_typeid; +// +/* total size (bytes): 12 */ + +// type = struct ItemPointerData { +/* 0 | 4 */ // BlockIdData ip_blkid; +/* 4 | 2 */ // OffsetNumber ip_posid; +// +/* total size (bytes): 6 */ + +// type = struct HeapPageSpecialData { +/* 0 | 8 */ // TransactionId pd_xid_base; +/* 8 | 8 */ // TransactionId pd_multi_base; +/* 16 | 4 */ // ShortTransactionId pd_prune_xid; +/* 20 | 4 */ // uint32 pd_magic; +// +/* total size (bytes): 24 */ + +func DecodeHeap(d *decode.D) any { + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: ee14.DecodePageHeaderData, + DecodePageSpecialFn: ee14.DecodePageSpecial, + } + return common14.DecodeHeap(d, heap) +} diff --git a/format/postgres/flavours/pgproee14/ee14/pgheap.go b/format/postgres/flavours/pgproee14/ee14/pgheap.go new file mode 100644 index 000000000..41571d374 --- /dev/null +++ b/format/postgres/flavours/pgproee14/ee14/pgheap.go @@ -0,0 +1,60 @@ +package ee14 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 20 | 0 */ // ItemIdData pd_linp[]; +func DecodePageHeaderData(d *decode.D) { + heap := common14.GetHeapD(d) + page := heap.Page + + d.FieldStruct("pd_lsn", func(d *decode.D) { + /* 0 | 4 */ // uint32 xlogid; + /* 4 | 4 */ // uint32 xrecoff; + d.FieldU32("xlogid", common.HexMapper) + d.FieldU32("xrecoff", common.HexMapper) + }) + d.FieldU16("pd_checksum") + d.FieldU16("pd_flags") + page.PdLower = uint16(d.FieldU16("pd_lower")) + page.PdUpper = uint16(d.FieldU16("pd_upper")) + page.PdSpecial = uint16(d.FieldU16("pd_special")) + page.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) + + // ItemIdData pd_linp[]; + page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) + d.FieldArray("pd_linp", common14.DecodeItemIds) +} + +// type = struct HeapPageSpecialData { +/* 0 | 8 */ // TransactionId pd_xid_base; +/* 8 | 8 */ // TransactionId pd_multi_base; +/* 16 | 4 */ // ShortTransactionId pd_prune_xid; +/* 20 | 4 */ // uint32 pd_magic; +// +/* total size (bytes): 24 */ +func DecodePageSpecial(d *decode.D) { + heap := common14.GetHeapD(d) + page := heap.Page + + specialPos := int64(page.PagePosBegin*8) + int64(page.PdSpecial*8) + d.SeekAbs(specialPos) + + d.FieldStruct("HeapPageSpecialData", func(d *decode.D) { + page.PdXidBase = d.FieldU64("pd_xid_base") + page.PdMultiBase = d.FieldU64("pd_multi_base") + page.PdPruneXid = d.FieldU32("pd_prune_xid") + page.PdMagic = d.FieldU32("pd_magic") + }) +} diff --git a/format/postgres/flavours/pgproee14/pgheap.go b/format/postgres/flavours/pgproee14/pgheap.go index f774f672b..7481a034f 100644 --- a/format/postgres/flavours/pgproee14/pgheap.go +++ b/format/postgres/flavours/pgproee14/pgheap.go @@ -2,6 +2,7 @@ package pgproee14 import ( "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -18,7 +19,7 @@ import ( // /* total size (bytes): 20 */ -// type = struct { +// type = struct PageXLogRecPtr { /* 0 | 4 */ // uint32 xlogid; /* 4 | 4 */ // uint32 xrecoff; // @@ -72,46 +73,6 @@ import ( // /* total size (bytes): 6 */ -func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: DecodePageHeaderData, - DecodePageSpecialFn: DecodePageSpecial, - } - return common14.DecodeHeap(d, heap) -} - -// type = struct PageHeaderData { -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version; -/* 20 | 0 */ // ItemIdData pd_linp[]; -func DecodePageHeaderData(d *decode.D) { - heap := common14.GetHeapD(d) - page := heap.Page - - d.FieldStruct("pd_lsn", func(d *decode.D) { - /* 0 | 4 */ // uint32 xlogid; - /* 4 | 4 */ // uint32 xrecoff; - d.FieldU32("xlogid", common.HexMapper) - d.FieldU32("xrecoff", common.HexMapper) - }) - d.FieldU16("pd_checksum") - d.FieldU16("pd_flags") - page.PdLower = uint16(d.FieldU16("pd_lower")) - page.PdUpper = uint16(d.FieldU16("pd_upper")) - page.PdSpecial = uint16(d.FieldU16("pd_special")) - page.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) - - // ItemIdData pd_linp[]; - page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) - d.FieldArray("pd_linp", common14.DecodeItemIds) -} - // type = struct HeapPageSpecialData { /* 0 | 8 */ // TransactionId pd_xid_base; /* 8 | 8 */ // TransactionId pd_multi_base; @@ -119,17 +80,12 @@ func DecodePageHeaderData(d *decode.D) { /* 20 | 4 */ // uint32 pd_magic; // /* total size (bytes): 24 */ -func DecodePageSpecial(d *decode.D) { - heap := common14.GetHeapD(d) - page := heap.Page - specialPos := int64(page.PagePosBegin*8) + int64(page.PdSpecial*8) - d.SeekAbs(specialPos) - - d.FieldStruct("HeapPageSpecialData", func(d *decode.D) { - page.PdXidBase = d.FieldU64("pd_xid_base") - page.PdMultiBase = d.FieldU64("pd_multi_base") - page.PdPruneXid = d.FieldU32("pd_prune_xid") - page.PdMagic = d.FieldU32("pd_magic") - }) +func DecodeHeap(d *decode.D) any { + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: ee14.DecodePageHeaderData, + DecodePageSpecialFn: ee14.DecodePageSpecial, + } + return common14.DecodeHeap(d, heap) } diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index f0ba89a20..bf9d47b46 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -29,6 +29,7 @@ const ( PG_FLAVOUR_POSTGRES = "postgres" PG_FLAVOUR_POSTGRES11 = "postgres11" PG_FLAVOUR_POSTGRES14 = "postgres14" + PG_FLAVOUR_PGPROEE11 = "pgproee11" PG_FLAVOUR_PGPROEE14 = "pgproee14" ) diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 025d816d8..1396b328f 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/pgproee11" "github.com/wader/fq/format/postgres/flavours/pgproee14" "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" @@ -26,6 +27,8 @@ func decodePgheap(d *decode.D, in any) any { switch flavour { case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: return postgres14.DecodeHeap(d) + case PG_FLAVOUR_PGPROEE11: + return pgproee11.DecodeHeap(d) case PG_FLAVOUR_PGPROEE14: return pgproee14.DecodeHeap(d) default: From d8b891c01946c57a671ec43185a7dea043ed419c Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 2 Aug 2022 17:20:50 +0300 Subject: [PATCH 024/141] PostgreSQL: pgproee11 pg_control impl --- .../postgres/flavours/pgproee11/pg_control.go | 164 ++++++++++++++++++ format/postgres/pg_control.go | 3 + 2 files changed, 167 insertions(+) diff --git a/format/postgres/flavours/pgproee11/pg_control.go b/format/postgres/flavours/pgproee11/pg_control.go index 06a29cc5e..3b2b583b2 100644 --- a/format/postgres/flavours/pgproee11/pg_control.go +++ b/format/postgres/flavours/pgproee11/pg_control.go @@ -1,5 +1,11 @@ package pgproee11 +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + // type = struct ControlFileData { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; @@ -74,3 +80,161 @@ package pgproee11 /* 112 | 8 */ // TransactionId oldestActiveXid; // /* total size (bytes): 120 */ + +func DecodePgControl(d *decode.D, in any) any { + d.SeekAbs(0) + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version", common.VersionMapper) + d.FieldU32("catalog_version_no") + d.FieldU32("state", common.DBState) + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 120 */ // CheckPoint checkPointCopy; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("checkPoint", common.XLogRecPtrMapper) + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 7-byte hole */ + d.FieldU64("redo", common.XLogRecPtrMapper) + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U56() + + /* 24 | 8 */ // FullTransactionId nextXid; + /* 32 | 4 */ // Oid nextOid; + /* XXX 4-byte hole */ + d.FieldU64("nextXid") + d.FieldU32("nextOid") + d.U32() + + /* 40 | 8 */ // MultiXactId nextMulti; + /* 48 | 8 */ // MultiXactOffset nextMultiOffset; + /* 56 | 8 */ // TransactionId oldestXid; + /* 64 | 4 */ // Oid oldestXidDB; + /* XXX 4-byte hole */ + d.FieldU64("nextMulti") + d.FieldU64("nextMultiOffset") + d.FieldU64("oldestXid") + d.FieldU32("oldestXidDB") + d.U32() + + /* 72 | 8 */ // MultiXactId oldestMulti; + /* 80 | 4 */ // Oid oldestMultiDB; + /* XXX 4-byte hole */ + d.FieldU64("oldestMulti") + d.FieldU32("oldestMultiDB") + d.U32() + + /* 88 | 8 */ // pg_time_t time; + /* 96 | 8 */ // TransactionId oldestCommitTsXid; + /* 104 | 8 */ // TransactionId newestCommitTsXid; + /* 112 | 8 */ // TransactionId oldestActiveXid; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("oldestCommitTsXid") + d.FieldU64("newestCommitTsXid") + d.FieldU64("oldestActiveXid") + }) + + /* 160 | 8 */ // XLogRecPtr unloggedLSN; + /* 168 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 176 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN", common.LocPtrMapper) + d.FieldU64("minRecoveryPoint", common.LocPtrMapper) + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 184 | 8 */ // XLogRecPtr backupStartPoint; + /* 192 | 8 */ // XLogRecPtr backupEndPoint; + /* 200 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint", common.LocPtrMapper) + d.FieldU64("backupEndPoint", common.LocPtrMapper) + d.FieldU8("backupEndRequired") + d.U24() + + /* 204 | 4 */ // int wal_level; + /* 208 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level", common.WalLevel) + d.FieldU8("wal_log_hints") + d.U24() + + /* 212 | 4 */ // int MaxConnections; + /* 216 | 4 */ // int max_worker_processes; + /* 220 | 4 */ // int max_prepared_xacts; + /* 224 | 4 */ // int max_locks_per_xact; + /* 228 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 232 | 4 */ // uint32 maxAlign; + /* XXX 4-byte hole */ + d.FieldU32("maxAlign") + d.U32() + + /* 240 | 8 */ // double floatFormat; + /* 248 | 4 */ // uint32 blcksz; + /* 252 | 4 */ // uint32 relseg_size; + /* 256 | 4 */ // uint32 xlog_blcksz; + /* 260 | 4 */ // uint32 xlog_seg_size; + /* 264 | 4 */ // uint32 nameDataLen; + /* 268 | 4 */ // uint32 indexMaxKeys; + /* 272 | 4 */ // uint32 toast_max_chunk_size; + /* 276 | 4 */ // uint32 loblksize; + /* 280 | 1 */ // _Bool float4ByVal; + /* 281 | 1 */ // _Bool float8ByVal; + /* XXX 2-byte hole */ + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float4ByVal") + d.FieldU8("float8ByVal") + d.U16() + + /* 284 | 4 */ // uint32 data_checksum_version; + /* 288 | 32 */ // char mock_authentication_nonce[32]; + /* 320 | 4 */ // pg_icu_version icu_version; + /* 324 | 4 */ // uint32 pg_old_version; + /* 328 | 4 */ // SnapshotId oldest_snapshot; + /* 332 | 4 */ // SnapshotId recent_snapshot; + /* 336 | 4 */ // SnapshotId active_snapshot; + /* 340 | 4 */ // pg_crc32c crc; + d.FieldU32("data_checksum_version") + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) + d.FieldU32("icu_version", common.IcuVersionMapper) + d.FieldU32("pg_old_version") + + d.FieldU32("oldest_snapshot") + d.FieldU32("recent_snapshot") + d.FieldU32("active_snapshot") + + d.FieldU32("crc") + /* total size (bytes): 344 */ + + d.AssertPosBytes(344) + + return nil +} diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index bf9d47b46..c3ea99a84 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/pgproee11" "github.com/wader/fq/format/postgres/flavours/pgproee14" "github.com/wader/fq/format/postgres/flavours/postgres11" "github.com/wader/fq/format/postgres/flavours/postgres14" @@ -42,6 +43,8 @@ func decodePgControl(d *decode.D, in any) any { return postgres11.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: return postgres14.DecodePgControl(d, in) + case PG_FLAVOUR_PGPROEE11: + return pgproee11.DecodePgControl(d, in) case PG_FLAVOUR_PGPROEE14: return pgproee14.DecodePgControl(d, in) default: From fdb3b3e44901d87d869fcb0450e1e01bc268bca9 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 3 Aug 2022 09:17:10 +0300 Subject: [PATCH 025/141] PostgreSQl: fix offset --- format/postgres/flavours/postgres14/common14/pgheap.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index 698cbdf16..75760d640 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -292,7 +292,7 @@ func decodeTuples(d *decode.D) { pos1 := d.Pos() // we need infomask before t_xmin, t_xmax - d.SeekAbs(pos1 + 48) + d.SeekAbs(pos1 + 18*8) d.FieldU16("t_infomask2") d.FieldStruct("Infomask2", decodeInfomask2) d.FieldU16("t_infomask") From f5278f38fb2f1768c7eb7dd969d66955fb93d6ed Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 3 Aug 2022 13:40:31 +0300 Subject: [PATCH 026/141] PostgreSQL: pg_control for ver 12 --- format/postgres/common/pg_control.go | 10 + .../flavours/postgres12/pg_control.go | 219 ++++++++++++++++++ .../postgres/flavours/postgres12/pg_heap.go | 74 ++++++ .../flavours/postgres14/common14/pgheap.go | 32 +++ format/postgres/flavours/postgres14/pgheap.go | 34 +-- format/postgres/pg_control.go | 7 + format/postgres/pgheap.go | 3 + 7 files changed, 346 insertions(+), 33 deletions(-) create mode 100644 format/postgres/flavours/postgres12/pg_control.go create mode 100644 format/postgres/flavours/postgres12/pg_heap.go diff --git a/format/postgres/common/pg_control.go b/format/postgres/common/pg_control.go index 3f22b4a35..aaf915d52 100644 --- a/format/postgres/common/pg_control.go +++ b/format/postgres/common/pg_control.go @@ -63,6 +63,16 @@ func (m xLogRecPtrMapper) MapScalar(s scalar.S) (scalar.S, error) { var XLogRecPtrMapper = xLogRecPtrMapper{} var LocPtrMapper = xLogRecPtrMapper{} +type nextFullXidMapper struct{} + +func (m nextFullXidMapper) MapScalar(s scalar.S) (scalar.S, error) { + v := s.ActualU() + s.Sym = fmt.Sprintf("%d:%d", v>>32, uint32(v)) + return s, nil +} + +var NextFullXidMapper = nextFullXidMapper{} + type timeMapper struct{} func (m timeMapper) MapScalar(s scalar.S) (scalar.S, error) { diff --git a/format/postgres/flavours/postgres12/pg_control.go b/format/postgres/flavours/postgres12/pg_control.go new file mode 100644 index 000000000..274cc0989 --- /dev/null +++ b/format/postgres/flavours/postgres12/pg_control.go @@ -0,0 +1,219 @@ +package postgres12 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 88 */ // CheckPoint checkPointCopy; +/* 128 | 8 */ // XLogRecPtr unloggedLSN; +/* 136 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 144 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 152 | 8 */ // XLogRecPtr backupStartPoint; +/* 160 | 8 */ // XLogRecPtr backupEndPoint; +/* 168 | 1 */ // _Bool backupEndRequired; +/* XXX 3-byte hole */ +/* 172 | 4 */ // int wal_level; +/* 176 | 1 */ // _Bool wal_log_hints; +/* XXX 3-byte hole */ +/* 180 | 4 */ // int MaxConnections; +/* 184 | 4 */ // int max_worker_processes; +/* 188 | 4 */ // int max_wal_senders; +/* 192 | 4 */ // int max_prepared_xacts; +/* 196 | 4 */ // int max_locks_per_xact; +/* 200 | 1 */ // _Bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 204 | 4 */ // uint32 maxAlign; +/* 208 | 8 */ // double floatFormat; +/* 216 | 4 */ // uint32 blcksz; +/* 220 | 4 */ // uint32 relseg_size; +/* 224 | 4 */ // uint32 xlog_blcksz; +/* 228 | 4 */ // uint32 xlog_seg_size; +/* 232 | 4 */ // uint32 nameDataLen; +/* 236 | 4 */ // uint32 indexMaxKeys; +/* 240 | 4 */ // uint32 toast_max_chunk_size; +/* 244 | 4 */ // uint32 loblksize; +/* 248 | 1 */ // _Bool float4ByVal; +/* 249 | 1 */ // _Bool float8ByVal; +/* XXX 2-byte hole */ +/* 252 | 4 */ // uint32 data_checksum_version; +/* 256 | 32 */ // char mock_authentication_nonce[32]; +/* 288 | 4 */ // pg_crc32c crc; +/* XXX 4-byte padding */ +// +/* total size (bytes): 296 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // _Bool fullPageWrites; +/* XXX 7-byte hole */ +/* 24 | 8 */ // FullTransactionId nextFullXid; +/* 32 | 4 */ // Oid nextOid; +/* 36 | 4 */ // MultiXactId nextMulti; +/* 40 | 4 */ // MultiXactOffset nextMultiOffset; +/* 44 | 4 */ // TransactionId oldestXid; +/* 48 | 4 */ // Oid oldestXidDB; +/* 52 | 4 */ // MultiXactId oldestMulti; +/* 56 | 4 */ // Oid oldestMultiDB; +/* XXX 4-byte hole */ +/* 64 | 8 */ // pg_time_t time; +/* 72 | 4 */ // TransactionId oldestCommitTsXid; +/* 76 | 4 */ // TransactionId newestCommitTsXid; +/* 80 | 4 */ // TransactionId oldestActiveXid; +/* XXX 4-byte padding */ +// +/* total size (bytes): 88 */ +func DecodePgControl(d *decode.D, in any) any { + d.SeekAbs(0) + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version") + d.FieldU32("catalog_version_no") + d.FieldU32("state", common.DBState) + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 88 */ // CheckPoint checkPointCopy; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("checkPoint", common.XLogRecPtrMapper) + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 7-byte hole */ + d.FieldU64("redo", common.XLogRecPtrMapper) + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U56() + + /* 24 | 8 */ // FullTransactionId nextFullXid; + /* 32 | 4 */ // Oid nextOid; + /* 36 | 4 */ // MultiXactId nextMulti; + /* 40 | 4 */ // MultiXactOffset nextMultiOffset; + /* 44 | 4 */ // TransactionId oldestXid; + /* 48 | 4 */ // Oid oldestXidDB; + /* 52 | 4 */ // MultiXactId oldestMulti; + /* 56 | 4 */ // Oid oldestMultiDB; + /* XXX 4-byte hole */ + d.FieldU64("nextFullXid", common.NextFullXidMapper) + d.FieldU32("nextOid") + d.FieldU32("nextMulti") + d.FieldU32("nextMultiOffset") + d.FieldU32("oldestXid") + d.FieldU32("oldestXidDB") + d.FieldU32("oldestMulti") + d.FieldU32("oldestMultiDB") + d.U32() + + /* 64 | 8 */ // pg_time_t time; + /* 72 | 4 */ // TransactionId oldestCommitTsXid; + /* 76 | 4 */ // TransactionId newestCommitTsXid; + /* 80 | 4 */ // TransactionId oldestActiveXid; + /* XXX 4-byte padding */ + d.FieldS64("time", common.TimeMapper) + d.FieldU32("oldestCommitTsXid") + d.FieldU32("newestCommitTsXid") + d.FieldU32("oldestActiveXid") + d.U32() + }) + + /* 128 | 8 */ // XLogRecPtr unloggedLSN; + /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN", common.LocPtrMapper) + d.FieldU64("minRecoveryPoint", common.LocPtrMapper) + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 152 | 8 */ // XLogRecPtr backupStartPoint; + /* 160 | 8 */ // XLogRecPtr backupEndPoint; + /* 168 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint", common.LocPtrMapper) + d.FieldU64("backupEndPoint", common.LocPtrMapper) + d.FieldU8("backupEndRequired") + d.U24() + + /* 172 | 4 */ // int wal_level; + /* 176 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level", common.WalLevel) + d.FieldU8("wal_log_hints") + d.U24() + + /* 180 | 4 */ // int MaxConnections; + /* 184 | 4 */ // int max_worker_processes; + /* 188 | 4 */ // int max_wal_senders; + /* 192 | 4 */ // int max_prepared_xacts; + /* 196 | 4 */ // int max_locks_per_xact; + /* 200 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_wal_senders") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 204 | 4 */ // uint32 maxAlign; + /* 208 | 8 */ // double floatFormat; + /* 216 | 4 */ // uint32 blcksz; + /* 220 | 4 */ // uint32 relseg_size; + /* 224 | 4 */ // uint32 xlog_blcksz; + /* 228 | 4 */ // uint32 xlog_seg_size; + /* 232 | 4 */ // uint32 nameDataLen; + /* 236 | 4 */ // uint32 indexMaxKeys; + /* 240 | 4 */ // uint32 toast_max_chunk_size; + /* 244 | 4 */ // uint32 loblksize; + /* 248 | 1 */ // _Bool float4ByVal; + /* 249 | 1 */ // _Bool float8ByVal; + /* XXX 2-byte hole */ + d.FieldU32("maxAlign") + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float4ByVal") + d.FieldU8("float8ByVal") + d.U16() + + /* 252 | 4 */ // uint32 data_checksum_version; + /* 256 | 32 */ // char mock_authentication_nonce[32]; + /* 288 | 4 */ // pg_crc32c crc; + /* XXX 4-byte padding */ + d.FieldU32("data_checksum_version") + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) + d.FieldU32("crc") + d.U32() + /* total size (bytes): 296 */ + + d.AssertPosBytes(296) + + return nil +} diff --git a/format/postgres/flavours/postgres12/pg_heap.go b/format/postgres/flavours/postgres12/pg_heap.go new file mode 100644 index 000000000..660796d25 --- /dev/null +++ b/format/postgres/flavours/postgres12/pg_heap.go @@ -0,0 +1,74 @@ +package postgres12 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 20 | 4 */ // TransactionId pd_prune_xid; +/* 24 | 0 */ // ItemIdData pd_linp[]; +// +/* total size (bytes): 24 */ + +// type = struct PageXLogRecPtr { +/* 0 | 4 */ // uint32 xlogid; +/* 4 | 4 */ // uint32 xrecoff; +// +/* total size (bytes): 8 */ + +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// // } t_choice; +/* total size (bytes): 12 */ +// +/* 12 | 6 */ // ItemPointerData t_ctid; +/* 18 | 2 */ // uint16 t_infomask2; +/* 20 | 2 */ // uint16 t_infomask; +/* 22 | 1 */ // uint8 t_hoff; +/* 23 | 0 */ // bits8 t_bits[]; +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleFields { +/* 0 | 4 */ // TransactionId t_xmin; +/* 4 | 4 */ // TransactionId t_xmax; +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // TransactionId t_xvac; +// } t_field3; +/* total size (bytes): 4 */ +// +/* total size (bytes): 12 */ + +// type = struct DatumTupleFields { +/* 0 | 4 */ // int32 datum_len_; +/* 4 | 4 */ // int32 datum_typmod; +/* 8 | 4 */ // Oid datum_typeid; +// +/* total size (bytes): 12 */ + +// type = struct ItemPointerData { +/* 0 | 4 */ // BlockIdData ip_blkid; +/* 4 | 2 */ // OffsetNumber ip_posid; +// +/* total size (bytes): 6 */ + +func DecodeHeap(d *decode.D) any { + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: common14.DecodePageHeaderData, + } + return common14.DecodeHeap(d, heap) +} diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index 75760d640..d538f9286 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -228,6 +228,38 @@ func decodeHeapPage(d *decode.D) { d.FieldArray("Tuples", decodeTuples) } +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 PdPagesizeVersion; +/* 20 | 4 */ // TransactionId pd_prune_xid; +/* 24 | 0 */ // ItemIdData pd_linp[]; +func DecodePageHeaderData(d *decode.D) { + heap := GetHeapD(d) + page := heap.Page + + d.FieldStruct("pd_lsn", func(d *decode.D) { + /* 0 | 4 */ // uint32 xlogid; + /* 4 | 4 */ // uint32 xrecoff; + d.FieldU32("xlogid", common.HexMapper) + d.FieldU32("xrecoff", common.HexMapper) + }) + d.FieldU16("pd_checksum") + d.FieldU16("pd_flags") + page.PdLower = uint16(d.FieldU16("pd_lower")) + page.PdUpper = uint16(d.FieldU16("pd_upper")) + page.PdSpecial = uint16(d.FieldU16("pd_special")) + page.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) + d.FieldU32("pd_prune_xid") + + // ItemIdData pd_linp[]; + page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) + d.FieldArray("pd_linp", DecodeItemIds) +} + func DecodeItemIds(d *decode.D) { heap := GetHeapD(d) page := heap.Page diff --git a/format/postgres/flavours/postgres14/pgheap.go b/format/postgres/flavours/postgres14/pgheap.go index 7d25cae48..de6dbebf0 100644 --- a/format/postgres/flavours/postgres14/pgheap.go +++ b/format/postgres/flavours/postgres14/pgheap.go @@ -22,39 +22,7 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.HeapD{ PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: DecodePageHeaderData, + DecodePageHeaderDataFn: common14.DecodePageHeaderData, } return common14.DecodeHeap(d, heap) } - -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 PdPagesizeVersion; -/* 20 | 4 */ // TransactionId pd_prune_xid; -/* 24 | 0 */ // ItemIdData pd_linp[]; -func DecodePageHeaderData(d *decode.D) { - heap := common14.GetHeapD(d) - page := heap.Page - - d.FieldStruct("pd_lsn", func(d *decode.D) { - /* 0 | 4 */ // uint32 xlogid; - /* 4 | 4 */ // uint32 xrecoff; - d.FieldU32("xlogid", common.HexMapper) - d.FieldU32("xrecoff", common.HexMapper) - }) - d.FieldU16("pd_checksum") - d.FieldU16("pd_flags") - page.PdLower = uint16(d.FieldU16("pd_lower")) - page.PdUpper = uint16(d.FieldU16("pd_upper")) - page.PdSpecial = uint16(d.FieldU16("pd_special")) - page.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) - d.FieldU32("pd_prune_xid") - - // ItemIdData pd_linp[]; - page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) - d.FieldArray("pd_linp", common14.DecodeItemIds) -} diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index c3ea99a84..fb51f17d4 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -5,6 +5,7 @@ import ( "github.com/wader/fq/format/postgres/flavours/pgproee11" "github.com/wader/fq/format/postgres/flavours/pgproee14" "github.com/wader/fq/format/postgres/flavours/postgres11" + "github.com/wader/fq/format/postgres/flavours/postgres12" "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" @@ -23,12 +24,14 @@ func init() { const ( PG_CONTROL_VERSION_11 = 1100 + PG_CONTROL_VERSION_12 = 1201 PG_CONTROL_VERSION_14 = 1300 ) const ( PG_FLAVOUR_POSTGRES = "postgres" PG_FLAVOUR_POSTGRES11 = "postgres11" + PG_FLAVOUR_POSTGRES12 = "postgres12" PG_FLAVOUR_POSTGRES14 = "postgres14" PG_FLAVOUR_PGPROEE11 = "pgproee11" PG_FLAVOUR_PGPROEE14 = "pgproee14" @@ -41,6 +44,8 @@ func decodePgControl(d *decode.D, in any) any { switch flavour { case PG_FLAVOUR_POSTGRES11: return postgres11.DecodePgControl(d, in) + case PG_FLAVOUR_POSTGRES12: + return postgres12.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: return postgres14.DecodePgControl(d, in) case PG_FLAVOUR_PGPROEE11: @@ -63,6 +68,8 @@ func probeForDecode(d *decode.D, in any) any { switch pgControlVersion { case PG_CONTROL_VERSION_11: return postgres11.DecodePgControl(d, in) + case PG_CONTROL_VERSION_12: + return postgres12.DecodePgControl(d, in) case PG_CONTROL_VERSION_14: return postgres14.DecodePgControl(d, in) default: diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 1396b328f..564660f07 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -4,6 +4,7 @@ import ( "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/pgproee11" "github.com/wader/fq/format/postgres/flavours/pgproee14" + "github.com/wader/fq/format/postgres/flavours/postgres12" "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" @@ -25,6 +26,8 @@ func decodePgheap(d *decode.D, in any) any { flavour := in.(format.PostgresIn).Flavour switch flavour { + case PG_FLAVOUR_POSTGRES12: + return postgres12.DecodeHeap(d) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: return postgres14.DecodeHeap(d) case PG_FLAVOUR_PGPROEE11: From 032741139ac7e1930be1d6e25fc50164f68c7b66 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 3 Aug 2022 15:23:29 +0300 Subject: [PATCH 027/141] ref --- format/postgres/flavours/postgres12/{pg_heap.go => pgheap.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename format/postgres/flavours/postgres12/{pg_heap.go => pgheap.go} (100%) diff --git a/format/postgres/flavours/postgres12/pg_heap.go b/format/postgres/flavours/postgres12/pgheap.go similarity index 100% rename from format/postgres/flavours/postgres12/pg_heap.go rename to format/postgres/flavours/postgres12/pgheap.go From 6618e766c9f2def48925a8d20578d58842594a1e Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 3 Aug 2022 15:49:12 +0300 Subject: [PATCH 028/141] PostgreSQL: heap impl for version 11 --- format/postgres/flavours/postgres11/pgheap.go | 74 +++++++++++++++++++ format/postgres/pgheap.go | 3 + 2 files changed, 77 insertions(+) create mode 100644 format/postgres/flavours/postgres11/pgheap.go diff --git a/format/postgres/flavours/postgres11/pgheap.go b/format/postgres/flavours/postgres11/pgheap.go new file mode 100644 index 000000000..cf027b9a1 --- /dev/null +++ b/format/postgres/flavours/postgres11/pgheap.go @@ -0,0 +1,74 @@ +package postgres11 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version +/* 20 | 4 */ // TransactionId pd_prune_xid +/* 24 | 0 */ // ItemIdData pd_linp[] +// +/* total size (bytes): 24 */ + +// type = struct PageXLogRecPtr { +/* 0 | 4 */ // uint32 xlogid; +/* 4 | 4 */ // uint32 xrecoff; +// +/* total size (bytes): 8 */ + +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ //union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// } t_choice; +/* total size (bytes): 12 */ +// +/* 12 | 6 */ // ItemPointerData t_ctid +/* 18 | 2 */ // uint16 t_infomask2 +/* 20 | 2 */ // uint16 t_infomask +/* 22 | 1 */ // uint8 t_hoff +/* 23 | 0 */ // bits8 t_bits[] +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleFields { +/* 0 | 4 */ // TransactionId t_xmin; +/* 4 | 4 */ // TransactionId t_xmax; +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // TransactionId t_xvac; +// } t_field3; +/* total size (bytes): 4 */ +// +/* total size (bytes): 12 */ + +// type = struct DatumTupleFields { +/* 0 | 4 */ // int32 datum_len_; +/* 4 | 4 */ // int32 datum_typmod; +/* 8 | 4 */ // Oid datum_typeid; +// +/* total size (bytes): 12 */ + +// type = struct ItemPointerData { +/* 0 | 4 */ // BlockIdData ip_blkid; +/* 4 | 2 */ // OffsetNumber ip_posid; +// +/* total size (bytes): 6 */ + +func DecodeHeap(d *decode.D) any { + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: common14.DecodePageHeaderData, + } + return common14.DecodeHeap(d, heap) +} diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 564660f07..7f35eb92b 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -4,6 +4,7 @@ import ( "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/pgproee11" "github.com/wader/fq/format/postgres/flavours/pgproee14" + "github.com/wader/fq/format/postgres/flavours/postgres11" "github.com/wader/fq/format/postgres/flavours/postgres12" "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" @@ -26,6 +27,8 @@ func decodePgheap(d *decode.D, in any) any { flavour := in.(format.PostgresIn).Flavour switch flavour { + case PG_FLAVOUR_POSTGRES11: + return postgres11.DecodeHeap(d) case PG_FLAVOUR_POSTGRES12: return postgres12.DecodeHeap(d) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: From b4ae1d582de0c3462b1e5eb849e31157679be85b Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 4 Aug 2022 10:32:13 +0300 Subject: [PATCH 029/141] PostgreSQL: add pg_control for pgproee 12 --- .../postgres/flavours/pgproee12/pg_control.go | 237 ++++++++++++++++++ format/postgres/pg_control.go | 4 + 2 files changed, 241 insertions(+) create mode 100644 format/postgres/flavours/pgproee12/pg_control.go diff --git a/format/postgres/flavours/pgproee12/pg_control.go b/format/postgres/flavours/pgproee12/pg_control.go new file mode 100644 index 000000000..073022bd4 --- /dev/null +++ b/format/postgres/flavours/pgproee12/pg_control.go @@ -0,0 +1,237 @@ +package pgproee12 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 120 */ // CheckPoint checkPointCopy; +/* 160 | 8 */ // XLogRecPtr unloggedLSN; +/* 168 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 176 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 184 | 8 */ // XLogRecPtr backupStartPoint; +/* 192 | 8 */ // XLogRecPtr backupEndPoint; +/* 200 | 1 */ // _Bool backupEndRequired; +/* XXX 3-byte hole */ +/* 204 | 4 */ // int wal_level; +/* 208 | 1 */ // _Bool wal_log_hints; +/* XXX 3-byte hole */ +/* 212 | 4 */ // int MaxConnections; +/* 216 | 4 */ // int max_worker_processes; +/* 220 | 4 */ // int max_wal_senders; +/* 224 | 4 */ // int max_prepared_xacts; +/* 228 | 4 */ // int max_locks_per_xact; +/* 232 | 1 */ // _Bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 236 | 4 */ // uint32 maxAlign; +/* 240 | 8 */ // double floatFormat; +/* 248 | 4 */ // uint32 blcksz; +/* 252 | 4 */ // uint32 relseg_size; +/* 256 | 4 */ // uint32 xlog_blcksz; +/* 260 | 4 */ // uint32 xlog_seg_size; +/* 264 | 4 */ // uint32 nameDataLen; +/* 268 | 4 */ // uint32 indexMaxKeys; +/* 272 | 4 */ // uint32 toast_max_chunk_size; +/* 276 | 4 */ // uint32 loblksize; +/* 280 | 1 */ // _Bool float4ByVal; +/* 281 | 1 */ // _Bool float8ByVal; +/* XXX 2-byte hole */ +/* 284 | 4 */ // uint32 data_checksum_version; +/* 288 | 32 */ // char mock_authentication_nonce[32]; +/* 320 | 4 */ // pg_icu_version icu_version; +/* 324 | 4 */ // uint32 pg_old_version; +/* 328 | 4 */ // SnapshotId oldest_snapshot; +/* 332 | 4 */ // SnapshotId recent_snapshot; +/* 336 | 4 */ // SnapshotId active_snapshot; +/* 340 | 4 */ // pg_crc32c crc; +// +/* total size (bytes): 344 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // _Bool fullPageWrites; +/* XXX 7-byte hole */ +/* 24 | 8 */ // FullTransactionId nextFullXid; +/* 32 | 4 */ // Oid nextOid; +/* XXX 4-byte hole */ +/* 40 | 8 */ // MultiXactId nextMulti; +/* 48 | 8 */ // MultiXactOffset nextMultiOffset; +/* 56 | 8 */ // TransactionId oldestXid; +/* 64 | 4 */ // Oid oldestXidDB; +/* XXX 4-byte hole */ +/* 72 | 8 */ // MultiXactId oldestMulti; +/* 80 | 4 */ // Oid oldestMultiDB; +/* XXX 4-byte hole */ +/* 88 | 8 */ // pg_time_t time; +/* 96 | 8 */ // TransactionId oldestCommitTsXid; +/* 104 | 8 */ // TransactionId newestCommitTsXid; +/* 112 | 8 */ // TransactionId oldestActiveXid; +// +/* total size (bytes): 120 */ + +func DecodePgControl(d *decode.D, in any) any { + d.SeekAbs(0) + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version", common.VersionMapper) + d.FieldU32("catalog_version_no") + d.FieldU32("state", common.DBState) + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 120 */ // CheckPoint checkPointCopy; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("checkPoint", common.XLogRecPtrMapper) + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 7-byte hole */ + d.FieldU64("redo", common.XLogRecPtrMapper) + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U56() + + /* 24 | 8 */ // FullTransactionId nextXid; + /* 32 | 4 */ // Oid nextOid; + /* XXX 4-byte hole */ + d.FieldU64("nextXid") + d.FieldU32("nextOid") + d.U32() + + /* 40 | 8 */ // MultiXactId nextMulti; + /* 48 | 8 */ // MultiXactOffset nextMultiOffset; + /* 56 | 8 */ // TransactionId oldestXid; + /* 64 | 4 */ // Oid oldestXidDB; + /* XXX 4-byte hole */ + d.FieldU64("nextMulti") + d.FieldU64("nextMultiOffset") + d.FieldU64("oldestXid") + d.FieldU32("oldestXidDB") + d.U32() + + /* 72 | 8 */ // MultiXactId oldestMulti; + /* 80 | 4 */ // Oid oldestMultiDB; + /* XXX 4-byte hole */ + d.FieldU64("oldestMulti") + d.FieldU32("oldestMultiDB") + d.U32() + + /* 88 | 8 */ // pg_time_t time; + /* 96 | 8 */ // TransactionId oldestCommitTsXid; + /* 104 | 8 */ // TransactionId newestCommitTsXid; + /* 112 | 8 */ // TransactionId oldestActiveXid; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("oldestCommitTsXid") + d.FieldU64("newestCommitTsXid") + d.FieldU64("oldestActiveXid") + }) + + /* 160 | 8 */ // XLogRecPtr unloggedLSN; + /* 168 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 176 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN", common.LocPtrMapper) + d.FieldU64("minRecoveryPoint", common.LocPtrMapper) + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 184 | 8 */ // XLogRecPtr backupStartPoint; + /* 192 | 8 */ // XLogRecPtr backupEndPoint; + /* 200 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint", common.LocPtrMapper) + d.FieldU64("backupEndPoint", common.LocPtrMapper) + d.FieldU8("backupEndRequired") + d.U24() + + /* 204 | 4 */ // int wal_level; + /* 208 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level", common.WalLevel) + d.FieldU8("wal_log_hints") + d.U24() + + /* 212 | 4 */ // int MaxConnections; + /* 216 | 4 */ // int max_worker_processes; + /* 220 | 4 */ // int max_wal_senders; + /* 224 | 4 */ // int max_prepared_xacts; + /* 228 | 4 */ // int max_locks_per_xact; + /* 232 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_wal_senders") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 236 | 4 */ // uint32 maxAlign; + /* 240 | 8 */ // double floatFormat; + /* 248 | 4 */ // uint32 blcksz; + /* 252 | 4 */ // uint32 relseg_size; + /* 256 | 4 */ // uint32 xlog_blcksz; + /* 260 | 4 */ // uint32 xlog_seg_size; + /* 264 | 4 */ // uint32 nameDataLen; + /* 268 | 4 */ // uint32 indexMaxKeys; + /* 272 | 4 */ // uint32 toast_max_chunk_size; + /* 276 | 4 */ // uint32 loblksize; + /* 280 | 1 */ // _Bool float4ByVal; + /* 281 | 1 */ // _Bool float8ByVal; + /* XXX 2-byte hole */ + d.FieldU32("maxAlign") + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float4ByVal") + d.FieldU8("float8ByVal") + d.U16() + + /* 284 | 4 */ // uint32 data_checksum_version; + /* 288 | 32 */ // char mock_authentication_nonce[32]; + /* 320 | 4 */ // pg_icu_version icu_version; + /* 324 | 4 */ // uint32 pg_old_version; + /* 328 | 4 */ // SnapshotId oldest_snapshot; + /* 332 | 4 */ // SnapshotId recent_snapshot; + /* 336 | 4 */ // SnapshotId active_snapshot; + /* 340 | 4 */ // pg_crc32c crc; + d.FieldU32("data_checksum_version") + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) + d.FieldU32("icu_version", common.IcuVersionMapper) + d.FieldU32("pg_old_version") + d.FieldU32("oldest_snapshot") + d.FieldU32("recent_snapshot") + d.FieldU32("active_snapshot") + d.FieldU32("crc") + /* total size (bytes): 344 */ + + d.AssertPosBytes(344) + + return nil +} diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index fb51f17d4..df886affd 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -3,6 +3,7 @@ package postgres import ( "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/pgproee11" + "github.com/wader/fq/format/postgres/flavours/pgproee12" "github.com/wader/fq/format/postgres/flavours/pgproee14" "github.com/wader/fq/format/postgres/flavours/postgres11" "github.com/wader/fq/format/postgres/flavours/postgres12" @@ -34,6 +35,7 @@ const ( PG_FLAVOUR_POSTGRES12 = "postgres12" PG_FLAVOUR_POSTGRES14 = "postgres14" PG_FLAVOUR_PGPROEE11 = "pgproee11" + PG_FLAVOUR_PGPROEE12 = "pgproee12" PG_FLAVOUR_PGPROEE14 = "pgproee14" ) @@ -50,6 +52,8 @@ func decodePgControl(d *decode.D, in any) any { return postgres14.DecodePgControl(d, in) case PG_FLAVOUR_PGPROEE11: return pgproee11.DecodePgControl(d, in) + case PG_FLAVOUR_PGPROEE12: + return pgproee12.DecodePgControl(d, in) case PG_FLAVOUR_PGPROEE14: return pgproee14.DecodePgControl(d, in) default: From 96a96a5b5c75afee7de5723a1c534cad90b840f3 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 4 Aug 2022 10:45:59 +0300 Subject: [PATCH 030/141] PostgreSQL: heap impl for pgproee 12 --- format/postgres/flavours/pgproee12/pgheap.go | 64 ++++++++++++++++++++ format/postgres/pgheap.go | 3 + 2 files changed, 67 insertions(+) create mode 100644 format/postgres/flavours/pgproee12/pgheap.go diff --git a/format/postgres/flavours/pgproee12/pgheap.go b/format/postgres/flavours/pgproee12/pgheap.go new file mode 100644 index 000000000..43ff9136f --- /dev/null +++ b/format/postgres/flavours/pgproee12/pgheap.go @@ -0,0 +1,64 @@ +package pgproee12 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 20 | 0 */ // ItemIdData pd_linp[]; +// +/* total size (bytes): 20 */ + +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// } t_choice; +/* total size (bytes): 12 */ +// +/* 12 | 6 */ // ItemPointerData t_ctid; +/* 18 | 2 */ // uint16 t_infomask2; +/* 20 | 2 */ // uint16 t_infomask; +/* 22 | 1 */ // uint8 t_hoff; +/* 23 | 0 */ // bits8 t_bits[]; +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleFields { +/* 0 | 4 */ // ShortTransactionId t_xmin; +/* 4 | 4 */ // ShortTransactionId t_xmax; +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // ShortTransactionId t_xvac; +// } t_field3; +/* total size (bytes): 4 */ +// +/* total size (bytes): 12 */ + +// type = struct HeapPageSpecialData { +/* 0 | 8 */ // TransactionId pd_xid_base; +/* 8 | 8 */ // TransactionId pd_multi_base; +/* 16 | 4 */ // ShortTransactionId pd_prune_xid; +/* 20 | 4 */ // uint32 pd_magic; +// +/* total size (bytes): 24 */ + +func DecodeHeap(d *decode.D) any { + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: ee14.DecodePageHeaderData, + DecodePageSpecialFn: ee14.DecodePageSpecial, + } + return common14.DecodeHeap(d, heap) +} diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 7f35eb92b..659a7398c 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -3,6 +3,7 @@ package postgres import ( "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/pgproee11" + "github.com/wader/fq/format/postgres/flavours/pgproee12" "github.com/wader/fq/format/postgres/flavours/pgproee14" "github.com/wader/fq/format/postgres/flavours/postgres11" "github.com/wader/fq/format/postgres/flavours/postgres12" @@ -35,6 +36,8 @@ func decodePgheap(d *decode.D, in any) any { return postgres14.DecodeHeap(d) case PG_FLAVOUR_PGPROEE11: return pgproee11.DecodeHeap(d) + case PG_FLAVOUR_PGPROEE12: + return pgproee12.DecodeHeap(d) case PG_FLAVOUR_PGPROEE14: return pgproee14.DecodeHeap(d) default: From d9de2d4f5d29b8689b65864b848867082646879d Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 4 Aug 2022 11:16:50 +0300 Subject: [PATCH 031/141] PostgreSQL: fix --- format/postgres/common/pgheap.go | 7 ++++++- format/postgres/flavours/postgres14/common14/pgheap.go | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/format/postgres/common/pgheap.go b/format/postgres/common/pgheap.go index 892c056b9..d01ed369f 100644 --- a/format/postgres/common/pgheap.go +++ b/format/postgres/common/pgheap.go @@ -5,7 +5,8 @@ import ( ) const ( - HeapPageSize = 8192 + HeapPageSize = 8192 + FirstNormalTransactionId = 3 LP_UNUSED = 0 /* unused (should always have lp_len=0) */ LP_NORMAL = 1 /* used (should always have lp_len>0) */ @@ -13,6 +14,10 @@ const ( LP_DEAD = 3 ) +func TransactionIdIsNormal(xid uint64) bool { + return xid >= FirstNormalTransactionId +} + type lpOffMapper struct{} func (m lpOffMapper) MapScalar(s scalar.S) (scalar.S, error) { diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index d538f9286..911d58291 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -477,12 +477,12 @@ type TransactionMapper struct { func (m TransactionMapper) MapScalar(s scalar.S) (scalar.S, error) { xid := s.ActualU() - if m.Page.PdXidBase != 0 && m.Tuple.IsMulti == 0 { + if m.Page.PdXidBase != 0 && m.Tuple.IsMulti == 0 && common.TransactionIdIsNormal(xid) { xid64 := xid + m.Page.PdXidBase s.Sym = fmt.Sprintf("%d", xid64) } - if m.Page.PdMultiBase != 0 && m.Tuple.IsMulti != 0 { + if m.Page.PdMultiBase != 0 && m.Tuple.IsMulti != 0 && common.TransactionIdIsNormal(xid) { xid64 := xid + m.Page.PdMultiBase s.Sym = fmt.Sprintf("%d", xid64) } From b722b21930a5f4d271e18db5a32e10d9d8e0a07e Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 4 Aug 2022 16:12:41 +0300 Subject: [PATCH 032/141] PostgreSQL: ref --- format/postgres/flavours/postgres14/common14/pgheap.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index 911d58291..04809aa97 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -300,19 +300,20 @@ func decodeTuples(d *decode.D) { continue } - pos := int64(page.PagePosBegin)*8 + int64(page.ItemIds[i].lpOff)*8 + pos := int64(page.PagePosBegin)*8 + int64(id.lpOff)*8 tupleDataLen := id.lpLen - SizeOfHeapTupleHeaderData // seek to tuple with ItemId offset d.SeekAbs(pos) + // type = struct HeapTupleHeaderData { /* 0 | 12 */ // union { /* 12 */ // HeapTupleFields t_heap; /* 12 */ // DatumTupleFields t_datum; // } t_choice; /* total size (bytes): 12 */ - /* - /* 12 | 6 */ // ItemPointerData t_ctid; + // + /* 12 | 6 */ // ItemPointerData t_ctid; /* 18 | 2 */ // uint16 t_infomask2; /* 20 | 2 */ // uint16 t_infomask; /* 22 | 1 */ // uint8 t_hoff; From c273a6c96b0ebd1bc94b4079fe1b8a5492128185 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 4 Aug 2022 16:32:47 +0300 Subject: [PATCH 033/141] PostgreSQl: pg_control impl for version 13 --- .../flavours/postgres13/pg_control.go | 216 ++++++++++++++++++ format/postgres/pg_control.go | 5 + 2 files changed, 221 insertions(+) create mode 100644 format/postgres/flavours/postgres13/pg_control.go diff --git a/format/postgres/flavours/postgres13/pg_control.go b/format/postgres/flavours/postgres13/pg_control.go new file mode 100644 index 000000000..e45101813 --- /dev/null +++ b/format/postgres/flavours/postgres13/pg_control.go @@ -0,0 +1,216 @@ +package postgres13 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 88 */ // CheckPoint checkPointCopy; +/* 128 | 8 */ // XLogRecPtr unloggedLSN; +/* 136 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 144 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 152 | 8 */ // XLogRecPtr backupStartPoint +/* 160 | 8 */ // XLogRecPtr backupEndPoint +/* 168 | 1 */ // _Bool backupEndRequired +/* XXX 3-byte hole */ +/* 172 | 4 */ // int wal_level +/* 176 | 1 */ // _Bool wal_log_hints +/* XXX 3-byte hole */ +/* 180 | 4 */ // int MaxConnections +/* 184 | 4 */ // int max_worker_processes +/* 188 | 4 */ // int max_wal_senders +/* 192 | 4 */ // int max_prepared_xacts +/* 196 | 4 */ // int max_locks_per_xact +/* 200 | 1 */ // _Bool track_commit_timestamp +/* XXX 3-byte hole */ +/* 204 | 4 */ // uint32 maxAlign +/* 208 | 8 */ // double floatFormat +/* 216 | 4 */ // uint32 blcksz +/* 220 | 4 */ // uint32 relseg_size +/* 224 | 4 */ // uint32 xlog_blcksz +/* 228 | 4 */ // uint32 xlog_seg_size +/* 232 | 4 */ // uint32 nameDataLen +/* 236 | 4 */ // uint32 indexMaxKeys +/* 240 | 4 */ // uint32 toast_max_chunk_size +/* 244 | 4 */ // uint32 loblksize +/* 248 | 1 */ // _Bool float8ByVal +/* XXX 3-byte hole */ +/* 252 | 4 */ // uint32 data_checksum_version +/* 256 | 32 */ // char mock_authentication_nonce[32] +/* 288 | 4 */ // pg_crc32c crc +/* XXX 4-byte padding */ +// +/* total size (bytes): 296 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // _Bool fullPageWrites; +/* XXX 7-byte hole */ +/* 24 | 8 */ // FullTransactionId nextFullXid +/* 32 | 4 */ // Oid nextOid +/* 36 | 4 */ // MultiXactId nextMulti +/* 40 | 4 */ // MultiXactOffset nextMultiOffset +/* 44 | 4 */ // TransactionId oldestXid +/* 48 | 4 */ // Oid oldestXidDB +/* 52 | 4 */ // MultiXactId oldestMulti +/* 56 | 4 */ // Oid oldestMultiDB +/* XXX 4-byte hole */ +/* 64 | 8 */ // pg_time_t time +/* 72 | 4 */ // TransactionId oldestCommitTsXid +/* 76 | 4 */ // TransactionId newestCommitTsXid +/* 80 | 4 */ // TransactionId oldestActiveXid +/* XXX 4-byte padding */ +// +/* total size (bytes): 88 */ +func DecodePgControl(d *decode.D, in any) any { + d.SeekAbs(0) + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version") + d.FieldU32("catalog_version_no") + d.FieldU32("state", common.DBState) + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 88 */ // CheckPoint checkPointCopy; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("checkPoint", common.XLogRecPtrMapper) + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 7-byte hole */ + d.FieldU64("redo", common.XLogRecPtrMapper) + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U56() + + /* 24 | 8 */ // FullTransactionId nextFullXid + /* 32 | 4 */ // Oid nextOid + /* 36 | 4 */ // MultiXactId nextMulti + /* 40 | 4 */ // MultiXactOffset nextMultiOffset + /* 44 | 4 */ // TransactionId oldestXid + /* 48 | 4 */ // Oid oldestXidDB + /* 52 | 4 */ // MultiXactId oldestMulti + /* 56 | 4 */ // Oid oldestMultiDB + /* XXX 4-byte hole */ + d.FieldU64("nextFullXid") + d.FieldU32("nextOid") + d.FieldU32("nextMulti") + d.FieldU32("nextMultiOffset") + d.FieldU32("oldestXid") + d.FieldU32("oldestXidDB") + d.FieldU32("oldestMulti") + d.FieldU32("oldestMultiDB") + d.U32() + + /* 64 | 8 */ // pg_time_t time + /* 72 | 4 */ // TransactionId oldestCommitTsXid + /* 76 | 4 */ // TransactionId newestCommitTsXid + /* 80 | 4 */ // TransactionId oldestActiveXid + /* XXX 4-byte padding */ + d.FieldS64("time", common.TimeMapper) + d.FieldU32("oldestCommitTsXid") + d.FieldU32("newestCommitTsXid") + d.FieldU32("oldestActiveXid") + d.U32() + }) + + /* 128 | 8 */ // XLogRecPtr unloggedLSN; + /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN", common.LocPtrMapper) + d.FieldU64("minRecoveryPoint", common.LocPtrMapper) + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 152 | 8 */ // XLogRecPtr backupStartPoint; + /* 160 | 8 */ // XLogRecPtr backupEndPoint; + /* 168 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint", common.LocPtrMapper) + d.FieldU64("backupEndPoint", common.LocPtrMapper) + d.FieldU8("backupEndRequired") + d.U24() + + /* 172 | 4 */ // int wal_level; + /* 176 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level", common.WalLevel) + d.FieldU8("wal_log_hints") + d.U24() + + /* 180 | 4 */ // int MaxConnections + /* 184 | 4 */ // int max_worker_processes + /* 188 | 4 */ // int max_wal_senders + /* 192 | 4 */ // int max_prepared_xacts + /* 196 | 4 */ // int max_locks_per_xact + /* 200 | 1 */ // _Bool track_commit_timestamp + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_wal_senders") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 204 | 4 */ // uint32 maxAlign + /* 208 | 8 */ // double floatFormat + /* 216 | 4 */ // uint32 blcksz + /* 220 | 4 */ // uint32 relseg_size + /* 224 | 4 */ // uint32 xlog_blcksz + /* 228 | 4 */ // uint32 xlog_seg_size + /* 232 | 4 */ // uint32 nameDataLen + /* 236 | 4 */ // uint32 indexMaxKeys + /* 240 | 4 */ // uint32 toast_max_chunk_size + /* 244 | 4 */ // uint32 loblksize + /* 248 | 1 */ // _Bool float8ByVal + /* XXX 3-byte hole */ + d.FieldU32("maxAlign") + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float8ByVal") + d.U24() + + /* 252 | 4 */ // uint32 data_checksum_version; + /* 256 | 32 */ // char mock_authentication_nonce[32]; + /* 288 | 4 */ // pg_crc32c crc; + /* XXX 4-byte padding */ + d.FieldU32("data_checksum_version") + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) + d.FieldU32("crc") + d.U32() + /* total size (bytes): 296 */ + + d.AssertPosBytes(296) + + return nil +} diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index df886affd..e5f00ddb2 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -7,6 +7,7 @@ import ( "github.com/wader/fq/format/postgres/flavours/pgproee14" "github.com/wader/fq/format/postgres/flavours/postgres11" "github.com/wader/fq/format/postgres/flavours/postgres12" + "github.com/wader/fq/format/postgres/flavours/postgres13" "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" @@ -26,6 +27,7 @@ func init() { const ( PG_CONTROL_VERSION_11 = 1100 PG_CONTROL_VERSION_12 = 1201 + //PG_CONTROL_VERSION_13 = 1300 PG_CONTROL_VERSION_14 = 1300 ) @@ -33,6 +35,7 @@ const ( PG_FLAVOUR_POSTGRES = "postgres" PG_FLAVOUR_POSTGRES11 = "postgres11" PG_FLAVOUR_POSTGRES12 = "postgres12" + PG_FLAVOUR_POSTGRES13 = "postgres13" PG_FLAVOUR_POSTGRES14 = "postgres14" PG_FLAVOUR_PGPROEE11 = "pgproee11" PG_FLAVOUR_PGPROEE12 = "pgproee12" @@ -48,6 +51,8 @@ func decodePgControl(d *decode.D, in any) any { return postgres11.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES12: return postgres12.DecodePgControl(d, in) + case PG_FLAVOUR_POSTGRES13: + return postgres13.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: return postgres14.DecodePgControl(d, in) case PG_FLAVOUR_PGPROEE11: From 621c4c4b4ee54bcf8751c410bd626d6c55d78ff9 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 4 Aug 2022 16:46:27 +0300 Subject: [PATCH 034/141] PostgreSQl: heap impl for version 13 --- format/postgres/flavours/postgres13/pgheap.go | 55 +++++++++++++++++++ format/postgres/pgheap.go | 3 + 2 files changed, 58 insertions(+) create mode 100644 format/postgres/flavours/postgres13/pgheap.go diff --git a/format/postgres/flavours/postgres13/pgheap.go b/format/postgres/flavours/postgres13/pgheap.go new file mode 100644 index 000000000..27175141f --- /dev/null +++ b/format/postgres/flavours/postgres13/pgheap.go @@ -0,0 +1,55 @@ +package postgres13 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 20 | 4 */ // TransactionId pd_prune_xid; +/* 24 | 0 */ // ItemIdData pd_linp[]; +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// } t_choice; +/* total size (bytes): 12 */ +// +/* 12 | 6 */ // ItemPointerData t_ctid +/* 18 | 2 */ // uint16 t_infomask2 +/* 20 | 2 */ // uint16 t_infomask +/* 22 | 1 */ // uint8 t_hoff +/* 23 | 0 */ // bits8 t_bits[] +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleFields { +/* 0 | 4 */ // TransactionId t_xmin; +/* 4 | 4 */ // TransactionId t_xmax; +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // TransactionId t_xvac; +// } t_field3;h +/* total size (bytes): 4 */ +// +/* total size (bytes): 12 */ + +func DecodeHeap(d *decode.D) any { + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: common14.DecodePageHeaderData, + } + return common14.DecodeHeap(d, heap) +} diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 659a7398c..26e8f210e 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -7,6 +7,7 @@ import ( "github.com/wader/fq/format/postgres/flavours/pgproee14" "github.com/wader/fq/format/postgres/flavours/postgres11" "github.com/wader/fq/format/postgres/flavours/postgres12" + "github.com/wader/fq/format/postgres/flavours/postgres13" "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" @@ -32,6 +33,8 @@ func decodePgheap(d *decode.D, in any) any { return postgres11.DecodeHeap(d) case PG_FLAVOUR_POSTGRES12: return postgres12.DecodeHeap(d) + case PG_FLAVOUR_POSTGRES13: + return postgres13.DecodeHeap(d) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: return postgres14.DecodeHeap(d) case PG_FLAVOUR_PGPROEE11: From a6537107c74b7d47ea6c92b905a5020353c79051 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 5 Aug 2022 09:05:55 +0300 Subject: [PATCH 035/141] PostgreSQL: add pg_control to pgpro14 --- .../postgres/flavours/pgpro14/pg_control.go | 216 ++++++++++++++++++ format/postgres/pg_control.go | 4 + 2 files changed, 220 insertions(+) create mode 100644 format/postgres/flavours/pgpro14/pg_control.go diff --git a/format/postgres/flavours/pgpro14/pg_control.go b/format/postgres/flavours/pgpro14/pg_control.go new file mode 100644 index 000000000..7b5064ee4 --- /dev/null +++ b/format/postgres/flavours/pgpro14/pg_control.go @@ -0,0 +1,216 @@ +package pgpro14 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 88 */ // CheckPoint checkPointCopy; +/* 128 | 8 */ // XLogRecPtr unloggedLSN; +/* 136 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 144 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 152 | 8 */ // XLogRecPtr backupStartPoint; +/* 160 | 8 */ // XLogRecPtr backupEndPoint; +/* 168 | 1 */ // _Bool backupEndRequired; +/* XXX 3-byte hole */ +/* 172 | 4 */ // int wal_level; +/* 176 | 1 */ // _Bool wal_log_hints; +/* XXX 3-byte hole */ +/* 180 | 4 */ // int MaxConnections; +/* 184 | 4 */ // int max_worker_processes; +/* 188 | 4 */ // int max_wal_senders; +/* 192 | 4 */ // int max_prepared_xacts; +/* 196 | 4 */ // int max_locks_per_xact; +/* 200 | 1 */ // _Bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 204 | 4 */ // uint32 maxAlign; +/* 208 | 8 */ // double floatFormat; +/* 216 | 4 */ // uint32 blcksz; +/* 220 | 4 */ // uint32 relseg_size; +/* 224 | 4 */ // uint32 xlog_blcksz; +/* 228 | 4 */ // uint32 xlog_seg_size; +/* 232 | 4 */ // uint32 nameDataLen; +/* 236 | 4 */ // uint32 indexMaxKeys; +/* 240 | 4 */ // uint32 toast_max_chunk_size; +/* 244 | 4 */ // uint32 loblksize; +/* 248 | 1 */ // _Bool float8ByVal; +/* XXX 3-byte hole */ +/* 252 | 4 */ // uint32 data_checksum_version; +/* 256 | 32 */ // char mock_authentication_nonce[32]; +/* 288 | 4 */ // pg_icu_version icu_version; +/* 292 | 4 */ // pg_crc32c crc; +// +/* total size (bytes): 296 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // _Bool fullPageWrites; +/* XXX 7-byte hole */ +/* 24 | 8 */ // FullTransactionId nextXid; +/* 32 | 4 */ // Oid nextOid; +/* 36 | 4 */ // MultiXactId nextMulti; +/* 40 | 4 */ // MultiXactOffset nextMultiOffset; +/* 44 | 4 */ // TransactionId oldestXid; +/* 48 | 4 */ // Oid oldestXidDB; +/* 52 | 4 */ // MultiXactId oldestMulti; +/* 56 | 4 */ // Oid oldestMultiDB; +/* XXX 4-byte hole */ +/* 64 | 8 */ // pg_time_t time; +/* 72 | 4 */ // TransactionId oldestCommitTsXid; +/* 76 | 4 */ // TransactionId newestCommitTsXid; +/* 80 | 4 */ // TransactionId oldestActiveXid; +/* XXX 4-byte padding */ +// +/* total size (bytes): 88 */ +func DecodePgControl(d *decode.D, in any) any { + d.SeekAbs(0) + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version", common.VersionMapper) + d.FieldU32("catalog_version_no") + d.FieldU32("state", common.DBState) + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 88 */ // CheckPoint checkPointCopy; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("checkPoint", common.XLogRecPtrMapper) + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 7-byte hole */ + d.FieldU64("redo", common.XLogRecPtrMapper) + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U56() + + /* 24 | 8 */ // FullTransactionId nextXid; + /* 32 | 4 */ // Oid nextOid; + /* 36 | 4 */ // MultiXactId nextMulti; + /* 40 | 4 */ // MultiXactOffset nextMultiOffset; + /* 44 | 4 */ // TransactionId oldestXid; + /* 48 | 4 */ // Oid oldestXidDB; + /* 52 | 4 */ // MultiXactId oldestMulti; + /* 56 | 4 */ // Oid oldestMultiDB; + /* XXX 4-byte hole */ + d.FieldU64("nextXid") + d.FieldU32("nextOid") + d.FieldU32("nextMulti") + d.FieldU32("nextMultiOffset") + d.FieldU32("oldestXid") + d.FieldU32("oldestXidDB") + d.FieldU32("oldestMulti") + d.FieldU32("oldestMultiDB") + d.U32() + + /* 64 | 8 */ // pg_time_t time; + /* 72 | 4 */ // TransactionId oldestCommitTsXid; + /* 76 | 4 */ // TransactionId newestCommitTsXid; + /* 80 | 4 */ // TransactionId oldestActiveXid; + /* XXX 4-byte padding */ + d.FieldS64("time", common.TimeMapper) + d.FieldU32("oldestCommitTsXid") + d.FieldU32("newestCommitTsXid") + d.FieldU32("oldestActiveXid") + d.U32() + }) + + /* 128 | 8 */ // XLogRecPtr unloggedLSN; + /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN", common.LocPtrMapper) + d.FieldU64("minRecoveryPoint", common.LocPtrMapper) + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 152 | 8 */ // XLogRecPtr backupStartPoint; + /* 160 | 8 */ // XLogRecPtr backupEndPoint; + /* 168 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint", common.LocPtrMapper) + d.FieldU64("backupEndPoint", common.LocPtrMapper) + d.FieldU8("backupEndRequired") + d.U24() + + /* 172 | 4 */ // int wal_level; + /* 176 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level", common.WalLevel) + d.FieldU8("wal_log_hints") + d.U24() + + /* 180 | 4 */ // int MaxConnections; + /* 184 | 4 */ // int max_worker_processes; + /* 188 | 4 */ // int max_wal_senders; + /* 192 | 4 */ // int max_prepared_xacts; + /* 196 | 4 */ // int max_locks_per_xact; + /* 200 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_wal_senders") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 204 | 4 */ // uint32 maxAlign; + /* 208 | 8 */ // double floatFormat; + /* 216 | 4 */ // uint32 blcksz; + /* 220 | 4 */ // uint32 relseg_size; + /* 224 | 4 */ // uint32 xlog_blcksz; + /* 228 | 4 */ // uint32 xlog_seg_size; + /* 232 | 4 */ // uint32 nameDataLen; + /* 236 | 4 */ // uint32 indexMaxKeys; + /* 240 | 4 */ // uint32 toast_max_chunk_size; + /* 244 | 4 */ // uint32 loblksize; + /* 248 | 1 */ // _Bool float8ByVal; + /* XXX 3-byte hole */ + d.FieldU32("maxAlign") + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float8ByVal") + d.U24() + + /* 252 | 4 */ // uint32 data_checksum_version; + /* 256 | 32 */ // char mock_authentication_nonce[32]; + /* 288 | 4 */ // pg_icu_version icu_version; + /* 292 | 4 */ // pg_crc32c crc; + d.FieldU32("data_checksum_version") + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) + d.FieldU32("icu_version", common.IcuVersionMapper) + d.FieldU32("crc") + /* total size (bytes): 296 */ + + d.AssertPosBytes(296) + + return nil +} diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index e5f00ddb2..94324d02f 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/pgpro14" "github.com/wader/fq/format/postgres/flavours/pgproee11" "github.com/wader/fq/format/postgres/flavours/pgproee12" "github.com/wader/fq/format/postgres/flavours/pgproee14" @@ -37,6 +38,7 @@ const ( PG_FLAVOUR_POSTGRES12 = "postgres12" PG_FLAVOUR_POSTGRES13 = "postgres13" PG_FLAVOUR_POSTGRES14 = "postgres14" + PG_FLAVOUR_PGPRO14 = "pgpro14" PG_FLAVOUR_PGPROEE11 = "pgproee11" PG_FLAVOUR_PGPROEE12 = "pgproee12" PG_FLAVOUR_PGPROEE14 = "pgproee14" @@ -55,6 +57,8 @@ func decodePgControl(d *decode.D, in any) any { return postgres13.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: return postgres14.DecodePgControl(d, in) + case PG_FLAVOUR_PGPRO14: + return pgpro14.DecodePgControl(d, in) case PG_FLAVOUR_PGPROEE11: return pgproee11.DecodePgControl(d, in) case PG_FLAVOUR_PGPROEE12: From ffc08cfcf5eef51b2f3e66a9477f63912c962d67 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 5 Aug 2022 09:34:24 +0300 Subject: [PATCH 036/141] PostgreSQL: add heap for pgpro14 --- format/postgres/flavours/pgpro14/pgheap.go | 62 ++++++++++++++++++++++ format/postgres/pgheap.go | 3 ++ 2 files changed, 65 insertions(+) create mode 100644 format/postgres/flavours/pgpro14/pgheap.go diff --git a/format/postgres/flavours/pgpro14/pgheap.go b/format/postgres/flavours/pgpro14/pgheap.go new file mode 100644 index 000000000..0979c56e1 --- /dev/null +++ b/format/postgres/flavours/pgpro14/pgheap.go @@ -0,0 +1,62 @@ +package pgpro14 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 20 | 4 */ // TransactionId pd_prune_xid; +/* 24 | 0 */ // ItemIdData pd_linp[]; +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// } t_choice +/* total size (bytes): 12 */ +// +/* 12 | 6 */ // ItemPointerData t_ctid +/* 18 | 2 */ // uint16 t_infomask2 +/* 20 | 2 */ // uint16 t_infomask +/* 22 | 1 */ // uint8 t_hoff +/* 23 | 0 */ // bits8 t_bits[] +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleFields { +/* 0 | 4 */ // TransactionId t_xmin; +/* 4 | 4 */ // TransactionId t_xmax; +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // TransactionId t_xvac; +// } t_field3; +/* total size (bytes): 4 */ +// +/* total size (bytes): 12 */ + +// type = struct DatumTupleFields { +/* 0 | 4 */ // int32 datum_len_; +/* 4 | 4 */ // int32 datum_typmod; +/* 8 | 4 */ // Oid datum_typeid; +// +/* total size (bytes): 12 */ + +func DecodeHeap(d *decode.D) any { + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: common14.DecodePageHeaderData, + } + return common14.DecodeHeap(d, heap) +} diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 26e8f210e..8ac64fa81 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/pgpro14" "github.com/wader/fq/format/postgres/flavours/pgproee11" "github.com/wader/fq/format/postgres/flavours/pgproee12" "github.com/wader/fq/format/postgres/flavours/pgproee14" @@ -41,6 +42,8 @@ func decodePgheap(d *decode.D, in any) any { return pgproee11.DecodeHeap(d) case PG_FLAVOUR_PGPROEE12: return pgproee12.DecodeHeap(d) + case PG_FLAVOUR_PGPRO14: + return pgpro14.DecodeHeap(d) case PG_FLAVOUR_PGPROEE14: return pgproee14.DecodeHeap(d) default: From 972c5a399d88c0a4832192799ab9affcc257c0f6 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 5 Aug 2022 10:46:22 +0300 Subject: [PATCH 037/141] PostgreSQL: pg_control, pgheap impl for pgproee13 --- .../postgres/flavours/pgproee13/pg_control.go | 229 ++++++++++++++++++ format/postgres/flavours/pgproee13/pgheap.go | 64 +++++ format/postgres/pg_control.go | 4 + format/postgres/pgheap.go | 3 + 4 files changed, 300 insertions(+) create mode 100644 format/postgres/flavours/pgproee13/pg_control.go create mode 100644 format/postgres/flavours/pgproee13/pgheap.go diff --git a/format/postgres/flavours/pgproee13/pg_control.go b/format/postgres/flavours/pgproee13/pg_control.go new file mode 100644 index 000000000..bba2da064 --- /dev/null +++ b/format/postgres/flavours/pgproee13/pg_control.go @@ -0,0 +1,229 @@ +package pgproee13 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time +/* 32 | 8 */ // XLogRecPtr checkPoint +/* 40 | 120 */ // CheckPoint checkPointCopy +/* 160 | 8 */ // XLogRecPtr unloggedLSN +/* 168 | 8 */ // XLogRecPtr minRecoveryPoint +/* 176 | 4 */ // TimeLineID minRecoveryPointTLI +/* XXX 4-byte hole */ +/* 184 | 8 */ // XLogRecPtr backupStartPoint +/* 192 | 8 */ // XLogRecPtr backupEndPoint +/* 200 | 1 */ // _Bool backupEndRequired +/* XXX 3-byte hole */ +/* 204 | 4 */ // int wal_level +/* 208 | 1 */ // _Bool wal_log_hints +/* XXX 3-byte hole */ +/* 212 | 4 */ // int MaxConnections +/* 216 | 4 */ // int max_worker_processes +/* 220 | 4 */ // int max_wal_senders +/* 224 | 4 */ // int max_prepared_xacts +/* 228 | 4 */ // int max_locks_per_xact +/* 232 | 1 */ // _Bool track_commit_timestamp +/* XXX 3-byte hole */ +/* 236 | 4 */ // uint32 maxAlign +/* 240 | 8 */ // double floatFormat +/* 248 | 4 */ // uint32 blcksz +/* 252 | 4 */ // uint32 relseg_size +/* 256 | 4 */ // uint32 xlog_blcksz +/* 260 | 4 */ // uint32 xlog_seg_size +/* 264 | 4 */ // uint32 nameDataLen +/* 268 | 4 */ // uint32 indexMaxKeys +/* 272 | 4 */ // uint32 toast_max_chunk_size +/* 276 | 4 */ // uint32 loblksize +/* 280 | 1 */ // _Bool float8ByVal +/* XXX 3-byte hole */ +/* 284 | 4 */ // uint32 data_checksum_version +/* 288 | 32 */ // char mock_authentication_nonce[32] +/* 320 | 4 */ // pg_icu_version icu_version +/* 324 | 4 */ // uint32 pg_old_version +/* 328 | 4 */ // pg_crc32c crc +/* XXX 4-byte padding */ +// +/* total size (bytes): 336 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo +/* 8 | 4 */ // TimeLineID ThisTimeLineID +/* 12 | 4 */ // TimeLineID PrevTimeLineID +/* 16 | 1 */ // _Bool fullPageWrites +/* XXX 7-byte hole */ +/* 24 | 8 */ // FullTransactionId nextFullXid +/* 32 | 4 */ // Oid nextOid +/* XXX 4-byte hole */ +/* 40 | 8 */ // MultiXactId nextMulti +/* 48 | 8 */ // MultiXactOffset nextMultiOffset +/* 56 | 8 */ // TransactionId oldestXid +/* 64 | 4 */ // Oid oldestXidDB +/* XXX 4-byte hole */ +/* 72 | 8 */ // MultiXactId oldestMulti +/* 80 | 4 */ // Oid oldestMultiDB +/* XXX 4-byte hole */ +/* 88 | 8 */ // pg_time_t time +/* 96 | 8 */ // TransactionId oldestCommitTsXid +/* 104 | 8 */ // TransactionId newestCommitTsXid +/* 112 | 8 */ // TransactionId oldestActiveXid +// +/* total size (bytes): 120 */ + +func DecodePgControl(d *decode.D, in any) any { + d.SeekAbs(0) + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version", common.VersionMapper) + d.FieldU32("catalog_version_no") + d.FieldU32("state", common.DBState) + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 120 */ // CheckPoint checkPointCopy; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("checkPoint", common.XLogRecPtrMapper) + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 7-byte hole */ + d.FieldU64("redo", common.XLogRecPtrMapper) + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U56() + + /* 24 | 8 */ // FullTransactionId nextXid; + /* 32 | 4 */ // Oid nextOid; + /* XXX 4-byte hole */ + d.FieldU64("nextXid") + d.FieldU32("nextOid") + d.U32() + + /* 40 | 8 */ // MultiXactId nextMulti; + /* 48 | 8 */ // MultiXactOffset nextMultiOffset; + /* 56 | 8 */ // TransactionId oldestXid; + /* 64 | 4 */ // Oid oldestXidDB; + /* XXX 4-byte hole */ + d.FieldU64("nextMulti") + d.FieldU64("nextMultiOffset") + d.FieldU64("oldestXid") + d.FieldU32("oldestXidDB") + d.U32() + + /* 72 | 8 */ // MultiXactId oldestMulti; + /* 80 | 4 */ // Oid oldestMultiDB; + /* XXX 4-byte hole */ + d.FieldU64("oldestMulti") + d.FieldU32("oldestMultiDB") + d.U32() + + /* 88 | 8 */ // pg_time_t time; + /* 96 | 8 */ // TransactionId oldestCommitTsXid; + /* 104 | 8 */ // TransactionId newestCommitTsXid; + /* 112 | 8 */ // TransactionId oldestActiveXid; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("oldestCommitTsXid") + d.FieldU64("newestCommitTsXid") + d.FieldU64("oldestActiveXid") + }) + + /* 160 | 8 */ // XLogRecPtr unloggedLSN; + /* 168 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 176 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN", common.LocPtrMapper) + d.FieldU64("minRecoveryPoint", common.LocPtrMapper) + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 184 | 8 */ // XLogRecPtr backupStartPoint; + /* 192 | 8 */ // XLogRecPtr backupEndPoint; + /* 200 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint", common.LocPtrMapper) + d.FieldU64("backupEndPoint", common.LocPtrMapper) + d.FieldU8("backupEndRequired") + d.U24() + + /* 204 | 4 */ // int wal_level; + /* 208 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level", common.WalLevel) + d.FieldU8("wal_log_hints") + d.U24() + + /* 212 | 4 */ // int MaxConnections; + /* 216 | 4 */ // int max_worker_processes; + /* 220 | 4 */ // int max_wal_senders; + /* 224 | 4 */ // int max_prepared_xacts; + /* 228 | 4 */ // int max_locks_per_xact; + /* 232 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_wal_senders") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 236 | 4 */ // uint32 maxAlign; + /* 240 | 8 */ // double floatFormat; + /* 248 | 4 */ // uint32 blcksz; + /* 252 | 4 */ // uint32 relseg_size; + /* 256 | 4 */ // uint32 xlog_blcksz; + /* 260 | 4 */ // uint32 xlog_seg_size; + /* 264 | 4 */ // uint32 nameDataLen; + /* 268 | 4 */ // uint32 indexMaxKeys; + /* 272 | 4 */ // uint32 toast_max_chunk_size; + /* 276 | 4 */ // uint32 loblksize; + /* 280 | 1 */ // _Bool float4ByVal; + /* 281 | 1 */ // _Bool float8ByVal; + /* XXX 2-byte hole */ + d.FieldU32("maxAlign") + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float8ByVal") + d.U24() + + /* 284 | 4 */ // uint32 data_checksum_version + /* 288 | 32 */ // char mock_authentication_nonce[32] + /* 320 | 4 */ // pg_icu_version icu_version + /* 324 | 4 */ // uint32 pg_old_version + /* 328 | 4 */ // pg_crc32c crc + /* XXX 4-byte padding */ + d.FieldU32("data_checksum_version") + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) + d.FieldU32("icu_version", common.IcuVersionMapper) + d.FieldU32("pg_old_version") + d.FieldU32("crc") + d.U32() + /* total size (bytes): 336 */ + + d.AssertPosBytes(336) + + return nil +} diff --git a/format/postgres/flavours/pgproee13/pgheap.go b/format/postgres/flavours/pgproee13/pgheap.go new file mode 100644 index 000000000..49cfac7c3 --- /dev/null +++ b/format/postgres/flavours/pgproee13/pgheap.go @@ -0,0 +1,64 @@ +package pgproee13 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 20 | 0 */ // ItemIdData pd_linp[]; +// +/* total size (bytes): 20 */ + +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// } t_choice +/* total size (bytes): 12 */ +// +/* 12 | 6 */ // ItemPointerData t_ctid; +/* 18 | 2 */ // uint16 t_infomask2; +/* 20 | 2 */ // uint16 t_infomask; +/* 22 | 1 */ // uint8 t_hoff; +/* 23 | 0 */ // bits8 t_bits[]; +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleFields { +/* 0 | 4 */ // ShortTransactionId t_xmin; +/* 4 | 4 */ // ShortTransactionId t_xmax; +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // ShortTransactionId t_xvac; +// } t_field3; +/* total size (bytes): 4 */ +// +/* total size (bytes): 12 */ + +// type = struct HeapPageSpecialData { +/* 0 | 8 */ // TransactionId pd_xid_base; +/* 8 | 8 */ // TransactionId pd_multi_base; +/* 16 | 4 */ // ShortTransactionId pd_prune_xid; +/* 20 | 4 */ // uint32 pd_magic; +// +/* total size (bytes): 24 */ + +func DecodeHeap(d *decode.D) any { + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: ee14.DecodePageHeaderData, + DecodePageSpecialFn: ee14.DecodePageSpecial, + } + return common14.DecodeHeap(d, heap) +} diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 94324d02f..c7bcac279 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -5,6 +5,7 @@ import ( "github.com/wader/fq/format/postgres/flavours/pgpro14" "github.com/wader/fq/format/postgres/flavours/pgproee11" "github.com/wader/fq/format/postgres/flavours/pgproee12" + "github.com/wader/fq/format/postgres/flavours/pgproee13" "github.com/wader/fq/format/postgres/flavours/pgproee14" "github.com/wader/fq/format/postgres/flavours/postgres11" "github.com/wader/fq/format/postgres/flavours/postgres12" @@ -41,6 +42,7 @@ const ( PG_FLAVOUR_PGPRO14 = "pgpro14" PG_FLAVOUR_PGPROEE11 = "pgproee11" PG_FLAVOUR_PGPROEE12 = "pgproee12" + PG_FLAVOUR_PGPROEE13 = "pgproee13" PG_FLAVOUR_PGPROEE14 = "pgproee14" ) @@ -63,6 +65,8 @@ func decodePgControl(d *decode.D, in any) any { return pgproee11.DecodePgControl(d, in) case PG_FLAVOUR_PGPROEE12: return pgproee12.DecodePgControl(d, in) + case PG_FLAVOUR_PGPROEE13: + return pgproee13.DecodePgControl(d, in) case PG_FLAVOUR_PGPROEE14: return pgproee14.DecodePgControl(d, in) default: diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 8ac64fa81..8b3df0f1d 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -5,6 +5,7 @@ import ( "github.com/wader/fq/format/postgres/flavours/pgpro14" "github.com/wader/fq/format/postgres/flavours/pgproee11" "github.com/wader/fq/format/postgres/flavours/pgproee12" + "github.com/wader/fq/format/postgres/flavours/pgproee13" "github.com/wader/fq/format/postgres/flavours/pgproee14" "github.com/wader/fq/format/postgres/flavours/postgres11" "github.com/wader/fq/format/postgres/flavours/postgres12" @@ -42,6 +43,8 @@ func decodePgheap(d *decode.D, in any) any { return pgproee11.DecodeHeap(d) case PG_FLAVOUR_PGPROEE12: return pgproee12.DecodeHeap(d) + case PG_FLAVOUR_PGPROEE13: + return pgproee13.DecodeHeap(d) case PG_FLAVOUR_PGPRO14: return pgpro14.DecodeHeap(d) case PG_FLAVOUR_PGPROEE14: From 07056c2b3dab283b4d0c50d9ed48966b1e881e81 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 5 Aug 2022 13:23:51 +0300 Subject: [PATCH 038/141] PostgreSQL: pg_control impl for pgproee 10 --- .../postgres/flavours/pgproee10/pg_control.go | 236 ++++++++++++++++++ .../postgres/flavours/pgproee11/pg_control.go | 2 - format/postgres/pg_control.go | 4 + 3 files changed, 240 insertions(+), 2 deletions(-) create mode 100644 format/postgres/flavours/pgproee10/pg_control.go diff --git a/format/postgres/flavours/pgproee10/pg_control.go b/format/postgres/flavours/pgproee10/pg_control.go new file mode 100644 index 000000000..7c1dc1d92 --- /dev/null +++ b/format/postgres/flavours/pgproee10/pg_control.go @@ -0,0 +1,236 @@ +package pgproee10 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 8 */ // XLogRecPtr prevCheckPoint; +/* 48 | 120 */ // CheckPoint checkPointCopy; +/* 168 | 8 */ // XLogRecPtr unloggedLSN; +/* 176 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 184 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 192 | 8 */ // XLogRecPtr backupStartPoint; +/* 200 | 8 */ // XLogRecPtr backupEndPoint; +/* 208 | 1 */ // bool backupEndRequired; +/* XXX 3-byte hole */ +/* 212 | 4 */ // int wal_level +/* 216 | 1 */ // bool wal_log_hints +/* XXX 3-byte hole */ +/* 220 | 4 */ // int MaxConnections +/* 224 | 4 */ // int max_worker_processes +/* 228 | 4 */ // int max_prepared_xacts +/* 232 | 4 */ // int max_locks_per_xact +/* 236 | 1 */ // bool track_commit_timestamp +/* XXX 3-byte hole */ +/* 240 | 4 */ // uint32 maxAlign +/* XXX 4-byte hole */ +/* 248 | 8 */ // double floatFormat +/* 256 | 4 */ // uint32 blcksz +/* 260 | 4 */ // uint32 relseg_size +/* 264 | 4 */ // uint32 xlog_blcksz +/* 268 | 4 */ // uint32 xlog_seg_size +/* 272 | 4 */ // uint32 nameDataLen +/* 276 | 4 */ // uint32 indexMaxKeys +/* 280 | 4 */ // uint32 toast_max_chunk_size +/* 284 | 4 */ // uint32 loblksize +/* 288 | 1 */ // bool float4ByVal +/* 289 | 1 */ // bool float8ByVal +/* XXX 2-byte hole */ +/* 292 | 4 */ // uint32 data_checksum_version +/* 296 | 32 */ // char mock_authentication_nonce[32] +/* 328 | 4 */ // pg_icu_version icu_version +/* 332 | 4 */ // uint32 pg_old_version +/* 336 | 4 */ // pg_crc32c crc +/* XXX 4-byte padding */ +// +/* total size (bytes): 344 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo +/* 8 | 4 */ // TimeLineID ThisTimeLineID +/* 12 | 4 */ // TimeLineID PrevTimeLineID +/* 16 | 1 */ // bool fullPageWrites +/* XXX 7-byte hole */ +/* 24 | 8 */ // TransactionId nextXid +/* 32 | 4 */ // Oid nextOid +/* XXX 4-byte hole */ +/* 40 | 8 */ // MultiXactId nextMulti +/* 48 | 8 */ // MultiXactOffset nextMultiOffset +/* 56 | 8 */ // TransactionId oldestXid +/* 64 | 4 */ // Oid oldestXidDB +/* XXX 4-byte hole */ +/* 72 | 8 */ // MultiXactId oldestMulti +/* 80 | 4 */ // Oid oldestMultiDB +/* XXX 4-byte hole */ +/* 88 | 8 */ // pg_time_t time +/* 96 | 8 */ // TransactionId oldestCommitTsXid +/* 104 | 8 */ // TransactionId newestCommitTsXid +/* 112 | 8 */ // TransactionId oldestActiveXid +// +/* total size (bytes): 120 */ + +func DecodePgControl(d *decode.D, in any) any { + d.SeekAbs(0) + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version", common.VersionMapper) + d.FieldU32("catalog_version_no") + d.FieldU32("state", common.DBState) + d.U32() + + /* XXX 4-byte hole */ + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 8 */ // XLogRecPtr prevCheckPoint; + /* 48 | 120 */ // CheckPoint checkPointCopy; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("checkPoint", common.XLogRecPtrMapper) + d.FieldU64("prevCheckPoint", common.XLogRecPtrMapper) + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 7-byte hole */ + d.FieldU64("redo", common.XLogRecPtrMapper) + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U56() + + /* 24 | 8 */ // FullTransactionId nextXid; + /* 32 | 4 */ // Oid nextOid; + /* XXX 4-byte hole */ + d.FieldU64("nextXid") + d.FieldU32("nextOid") + d.U32() + + /* 40 | 8 */ // MultiXactId nextMulti; + /* 48 | 8 */ // MultiXactOffset nextMultiOffset; + /* 56 | 8 */ // TransactionId oldestXid; + /* 64 | 4 */ // Oid oldestXidDB; + /* XXX 4-byte hole */ + d.FieldU64("nextMulti") + d.FieldU64("nextMultiOffset") + d.FieldU64("oldestXid") + d.FieldU32("oldestXidDB") + d.U32() + + /* 72 | 8 */ // MultiXactId oldestMulti; + /* 80 | 4 */ // Oid oldestMultiDB; + /* XXX 4-byte hole */ + d.FieldU64("oldestMulti") + d.FieldU32("oldestMultiDB") + d.U32() + + /* 88 | 8 */ // pg_time_t time; + /* 96 | 8 */ // TransactionId oldestCommitTsXid; + /* 104 | 8 */ // TransactionId newestCommitTsXid; + /* 112 | 8 */ // TransactionId oldestActiveXid; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("oldestCommitTsXid") + d.FieldU64("newestCommitTsXid") + d.FieldU64("oldestActiveXid") + }) + + /* 168 | 8 */ // XLogRecPtr unloggedLSN; + /* 176 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 184 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN", common.LocPtrMapper) + d.FieldU64("minRecoveryPoint", common.LocPtrMapper) + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 192 | 8 */ // XLogRecPtr backupStartPoint; + /* 200 | 8 */ // XLogRecPtr backupEndPoint; + /* 208 | 1 */ // bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint", common.LocPtrMapper) + d.FieldU64("backupEndPoint", common.LocPtrMapper) + d.FieldU8("backupEndRequired") + d.U24() + + /* 212 | 4 */ // int wal_level + /* 216 | 1 */ // bool wal_log_hints + /* XXX 3-byte hole */ + d.FieldS32("wal_level", common.WalLevel) + d.FieldU8("wal_log_hints") + d.U24() + + /* 220 | 4 */ // int MaxConnections + /* 224 | 4 */ // int max_worker_processes + /* 228 | 4 */ // int max_prepared_xacts + /* 232 | 4 */ // int max_locks_per_xact + /* 236 | 1 */ // bool track_commit_timestamp + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 240 | 4 */ // uint32 maxAlign + /* XXX 4-byte hole */ + d.FieldU32("maxAlign") + d.U32() + + /* 248 | 8 */ // double floatFormat + /* 256 | 4 */ // uint32 blcksz + /* 260 | 4 */ // uint32 relseg_size + /* 264 | 4 */ // uint32 xlog_blcksz + /* 268 | 4 */ // uint32 xlog_seg_size + /* 272 | 4 */ // uint32 nameDataLen + /* 276 | 4 */ // uint32 indexMaxKeys + /* 280 | 4 */ // uint32 toast_max_chunk_size + /* 284 | 4 */ // uint32 loblksize + /* 288 | 1 */ // bool float4ByVal + /* 289 | 1 */ // bool float8ByVal + /* XXX 2-byte hole */ + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float4ByVal") + d.FieldU8("float8ByVal") + d.U16() + + /* 292 | 4 */ // uint32 data_checksum_version + /* 296 | 32 */ // char mock_authentication_nonce[32] + /* 328 | 4 */ // pg_icu_version icu_version + /* 332 | 4 */ // uint32 pg_old_version + /* 336 | 4 */ // pg_crc32c crc + /* XXX 4-byte padding */ + d.FieldU32("data_checksum_version") + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) + d.FieldU32("icu_version", common.IcuVersionMapper) + d.FieldU32("pg_old_version") + d.FieldU32("crc") + d.U32() + /* total size (bytes): 344 */ + + d.AssertPosBytes(344) + + return nil +} diff --git a/format/postgres/flavours/pgproee11/pg_control.go b/format/postgres/flavours/pgproee11/pg_control.go index 3b2b583b2..47428ed35 100644 --- a/format/postgres/flavours/pgproee11/pg_control.go +++ b/format/postgres/flavours/pgproee11/pg_control.go @@ -226,11 +226,9 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) d.FieldU32("icu_version", common.IcuVersionMapper) d.FieldU32("pg_old_version") - d.FieldU32("oldest_snapshot") d.FieldU32("recent_snapshot") d.FieldU32("active_snapshot") - d.FieldU32("crc") /* total size (bytes): 344 */ diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index c7bcac279..4aeac7865 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -3,6 +3,7 @@ package postgres import ( "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/pgpro14" + "github.com/wader/fq/format/postgres/flavours/pgproee10" "github.com/wader/fq/format/postgres/flavours/pgproee11" "github.com/wader/fq/format/postgres/flavours/pgproee12" "github.com/wader/fq/format/postgres/flavours/pgproee13" @@ -40,6 +41,7 @@ const ( PG_FLAVOUR_POSTGRES13 = "postgres13" PG_FLAVOUR_POSTGRES14 = "postgres14" PG_FLAVOUR_PGPRO14 = "pgpro14" + PG_FLAVOUR_PGPROEE10 = "pgproee10" PG_FLAVOUR_PGPROEE11 = "pgproee11" PG_FLAVOUR_PGPROEE12 = "pgproee12" PG_FLAVOUR_PGPROEE13 = "pgproee13" @@ -61,6 +63,8 @@ func decodePgControl(d *decode.D, in any) any { return postgres14.DecodePgControl(d, in) case PG_FLAVOUR_PGPRO14: return pgpro14.DecodePgControl(d, in) + case PG_FLAVOUR_PGPROEE10: + return pgproee10.DecodePgControl(d, in) case PG_FLAVOUR_PGPROEE11: return pgproee11.DecodePgControl(d, in) case PG_FLAVOUR_PGPROEE12: From d14872780cf1af7379f9eceb1dfe7de478472785 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 5 Aug 2022 13:37:31 +0300 Subject: [PATCH 039/141] PostgreSQL: pgheap impl for pgproee10 --- format/postgres/flavours/pgproee10/pgheap.go | 64 ++++++++++++++++++++ format/postgres/pgheap.go | 3 + 2 files changed, 67 insertions(+) create mode 100644 format/postgres/flavours/pgproee10/pgheap.go diff --git a/format/postgres/flavours/pgproee10/pgheap.go b/format/postgres/flavours/pgproee10/pgheap.go new file mode 100644 index 000000000..a5a13014b --- /dev/null +++ b/format/postgres/flavours/pgproee10/pgheap.go @@ -0,0 +1,64 @@ +package pgproee10 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 20 | 0 */ // ItemIdData pd_linp[]; +// +/* total size (bytes): 20 */ + +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// } t_choice +/* total size (bytes): 12 */ +// +/* 12 | 6 */ // ItemPointerData t_ctid +/* 18 | 2 */ // uint16 t_infomask2 +/* 20 | 2 */ // uint16 t_infomask +/* 22 | 1 */ // uint8 t_hoff +/* 23 | 0 */ // bits8 t_bits[] +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleFields { +/* 0 | 4 */ // ShortTransactionId t_xmin; +/* 4 | 4 */ // ShortTransactionId t_xmax; +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // ShortTransactionId t_xvac; +// } t_field3; +/* total size (bytes): 4 */ +// +/* total size (bytes): 12 */ + +// type = struct HeapPageSpecialData { +/* 0 | 8 */ // TransactionId pd_xid_base; +/* 8 | 8 */ // TransactionId pd_multi_base; +/* 16 | 4 */ // ShortTransactionId pd_prune_xid; +/* 20 | 4 */ // uint32 pd_magic; +// +/* total size (bytes): 24 */ + +func DecodeHeap(d *decode.D) any { + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: ee14.DecodePageHeaderData, + DecodePageSpecialFn: ee14.DecodePageSpecial, + } + return common14.DecodeHeap(d, heap) +} diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 8b3df0f1d..19785f1d2 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -3,6 +3,7 @@ package postgres import ( "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/pgpro14" + "github.com/wader/fq/format/postgres/flavours/pgproee10" "github.com/wader/fq/format/postgres/flavours/pgproee11" "github.com/wader/fq/format/postgres/flavours/pgproee12" "github.com/wader/fq/format/postgres/flavours/pgproee13" @@ -39,6 +40,8 @@ func decodePgheap(d *decode.D, in any) any { return postgres13.DecodeHeap(d) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: return postgres14.DecodeHeap(d) + case PG_FLAVOUR_PGPROEE10: + return pgproee10.DecodeHeap(d) case PG_FLAVOUR_PGPROEE11: return pgproee11.DecodeHeap(d) case PG_FLAVOUR_PGPROEE12: From 2b3035fe62dcf5dd12b35d5ada336570bceb6632 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 26 Aug 2022 09:41:34 +0300 Subject: [PATCH 040/141] add pgpro13 to postgres --- format/postgres/.gitignore | 1 + .../postgres/flavours/pgpro13/pg_control.go | 216 ++++++++++++++++++ format/postgres/pg_control.go | 4 + 3 files changed, 221 insertions(+) create mode 100644 format/postgres/.gitignore create mode 100644 format/postgres/flavours/pgpro13/pg_control.go diff --git a/format/postgres/.gitignore b/format/postgres/.gitignore new file mode 100644 index 000000000..830f58170 --- /dev/null +++ b/format/postgres/.gitignore @@ -0,0 +1 @@ +testdata \ No newline at end of file diff --git a/format/postgres/flavours/pgpro13/pg_control.go b/format/postgres/flavours/pgpro13/pg_control.go new file mode 100644 index 000000000..e45f873a3 --- /dev/null +++ b/format/postgres/flavours/pgpro13/pg_control.go @@ -0,0 +1,216 @@ +package pgpro13 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 88 */ // CheckPoint checkPointCopy; +/* 128 | 8 */ // XLogRecPtr unloggedLSN; +/* 136 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 144 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 152 | 8 */ // XLogRecPtr backupStartPoint; +/* 160 | 8 */ // XLogRecPtr backupEndPoint; +/* 168 | 1 */ // _Bool backupEndRequired; +/* XXX 3-byte hole */ +/* 172 | 4 */ // int wal_level; +/* 176 | 1 */ // _Bool wal_log_hints; +/* XXX 3-byte hole */ +/* 180 | 4 */ // int MaxConnections; +/* 184 | 4 */ // int max_worker_processes; +/* 188 | 4 */ // int max_wal_senders; +/* 192 | 4 */ // int max_prepared_xacts; +/* 196 | 4 */ // int max_locks_per_xact; +/* 200 | 1 */ // _Bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 204 | 4 */ // uint32 maxAlign; +/* 208 | 8 */ // double floatFormat; +/* 216 | 4 */ // uint32 blcksz; +/* 220 | 4 */ // uint32 relseg_size; +/* 224 | 4 */ // uint32 xlog_blcksz; +/* 228 | 4 */ // uint32 xlog_seg_size; +/* 232 | 4 */ // uint32 nameDataLen; +/* 236 | 4 */ // uint32 indexMaxKeys; +/* 240 | 4 */ // uint32 toast_max_chunk_size; +/* 244 | 4 */ // uint32 loblksize; +/* 248 | 1 */ // _Bool float8ByVal; +/* XXX 3-byte hole */ +/* 252 | 4 */ // uint32 data_checksum_version; +/* 256 | 32 */ // char mock_authentication_nonce[32]; +/* 288 | 4 */ // pg_icu_version icu_version; +/* 292 | 4 */ // pg_crc32c crc; + +/* total size (bytes): 296 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo +/* 8 | 4 */ // TimeLineID ThisTimeLineID +/* 12 | 4 */ // TimeLineID PrevTimeLineID +/* 16 | 1 */ // _Bool fullPageWrites +/* XXX 7-byte hole */ +/* 24 | 8 */ // FullTransactionId nextFullXid +/* 32 | 4 */ // Oid nextOid +/* 36 | 4 */ // MultiXactId nextMulti +/* 40 | 4 */ // MultiXactOffset nextMultiOffset +/* 44 | 4 */ // TransactionId oldestXid +/* 48 | 4 */ // Oid oldestXidDB +/* 52 | 4 */ // MultiXactId oldestMulti +/* 56 | 4 */ // Oid oldestMultiDB +/* XXX 4-byte hole */ +/* 64 | 8 */ // pg_time_t time +/* 72 | 4 */ // TransactionId oldestCommitTsXid +/* 76 | 4 */ // TransactionId newestCommitTsXid +/* 80 | 4 */ // TransactionId oldestActiveXid +/* XXX 4-byte padding */ + +/* total size (bytes): 88 */ +func DecodePgControl(d *decode.D, in any) any { + d.SeekAbs(0) + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version", common.VersionMapper) + d.FieldU32("catalog_version_no") + d.FieldU32("state", common.DBState) + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 88 */ // CheckPoint checkPointCopy; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("checkPoint", common.XLogRecPtrMapper) + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 7-byte hole */ + d.FieldU64("redo", common.XLogRecPtrMapper) + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U56() + + /* 24 | 8 */ // FullTransactionId nextFullXid; + /* 32 | 4 */ // Oid nextOid; + /* 36 | 4 */ // MultiXactId nextMulti; + /* 40 | 4 */ // MultiXactOffset nextMultiOffset; + /* 44 | 4 */ // TransactionId oldestXid; + /* 48 | 4 */ // Oid oldestXidDB; + /* 52 | 4 */ // MultiXactId oldestMulti; + /* 56 | 4 */ // Oid oldestMultiDB; + /* XXX 4-byte hole */ + d.FieldU64("nextFullXid") + d.FieldU32("nextOid") + d.FieldU32("nextMulti") + d.FieldU32("nextMultiOffset") + d.FieldU32("oldestXid") + d.FieldU32("oldestXidDB") + d.FieldU32("oldestMulti") + d.FieldU32("oldestMultiDB") + d.U32() + + /* 64 | 8 */ // pg_time_t time; + /* 72 | 4 */ // TransactionId oldestCommitTsXid; + /* 76 | 4 */ // TransactionId newestCommitTsXid; + /* 80 | 4 */ // TransactionId oldestActiveXid; + /* XXX 4-byte padding */ + d.FieldS64("time", common.TimeMapper) + d.FieldU32("oldestCommitTsXid") + d.FieldU32("newestCommitTsXid") + d.FieldU32("oldestActiveXid") + d.U32() + }) + + /* 128 | 8 */ // XLogRecPtr unloggedLSN; + /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN", common.LocPtrMapper) + d.FieldU64("minRecoveryPoint", common.LocPtrMapper) + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 152 | 8 */ // XLogRecPtr backupStartPoint; + /* 160 | 8 */ // XLogRecPtr backupEndPoint; + /* 168 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint", common.LocPtrMapper) + d.FieldU64("backupEndPoint", common.LocPtrMapper) + d.FieldU8("backupEndRequired") + d.U24() + + /* 172 | 4 */ // int wal_level; + /* 176 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level", common.WalLevel) + d.FieldU8("wal_log_hints") + d.U24() + + /* 180 | 4 */ // int MaxConnections; + /* 184 | 4 */ // int max_worker_processes; + /* 188 | 4 */ // int max_wal_senders; + /* 192 | 4 */ // int max_prepared_xacts; + /* 196 | 4 */ // int max_locks_per_xact; + /* 200 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_wal_senders") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 204 | 4 */ // uint32 maxAlign; + /* 208 | 8 */ // double floatFormat; + /* 216 | 4 */ // uint32 blcksz; + /* 220 | 4 */ // uint32 relseg_size; + /* 224 | 4 */ // uint32 xlog_blcksz; + /* 228 | 4 */ // uint32 xlog_seg_size; + /* 232 | 4 */ // uint32 nameDataLen; + /* 236 | 4 */ // uint32 indexMaxKeys; + /* 240 | 4 */ // uint32 toast_max_chunk_size; + /* 244 | 4 */ // uint32 loblksize; + /* 248 | 1 */ // _Bool float8ByVal; + /* XXX 3-byte hole */ + d.FieldU32("maxAlign") + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float8ByVal") + d.U24() + + /* 252 | 4 */ // uint32 data_checksum_version; + /* 256 | 32 */ // char mock_authentication_nonce[32]; + /* 288 | 4 */ // pg_icu_version icu_version; + /* 292 | 4 */ // pg_crc32c crc; + d.FieldU32("data_checksum_version") + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) + d.FieldU32("icu_version", common.IcuVersionMapper) + d.FieldU32("crc") + /* total size (bytes): 296 */ + + d.AssertPosBytes(296) + + return nil +} diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 4aeac7865..958f8b9ca 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/pgpro13" "github.com/wader/fq/format/postgres/flavours/pgpro14" "github.com/wader/fq/format/postgres/flavours/pgproee10" "github.com/wader/fq/format/postgres/flavours/pgproee11" @@ -40,6 +41,7 @@ const ( PG_FLAVOUR_POSTGRES12 = "postgres12" PG_FLAVOUR_POSTGRES13 = "postgres13" PG_FLAVOUR_POSTGRES14 = "postgres14" + PG_FLAVOUR_PGPRO13 = "pgpro13" PG_FLAVOUR_PGPRO14 = "pgpro14" PG_FLAVOUR_PGPROEE10 = "pgproee10" PG_FLAVOUR_PGPROEE11 = "pgproee11" @@ -61,6 +63,8 @@ func decodePgControl(d *decode.D, in any) any { return postgres13.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: return postgres14.DecodePgControl(d, in) + case PG_FLAVOUR_PGPRO13: + return pgpro13.DecodePgControl(d, in) case PG_FLAVOUR_PGPRO14: return pgpro14.DecodePgControl(d, in) case PG_FLAVOUR_PGPROEE10: From 7bf6b11ee7108abc29d83f7cb8d698623d9cb6e2 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 26 Aug 2022 09:53:56 +0300 Subject: [PATCH 041/141] add pgpro13 heap --- format/postgres/flavours/pgpro13/pgheap.go | 62 ++++++++++++++++++++++ format/postgres/pgheap.go | 3 ++ 2 files changed, 65 insertions(+) create mode 100644 format/postgres/flavours/pgpro13/pgheap.go diff --git a/format/postgres/flavours/pgpro13/pgheap.go b/format/postgres/flavours/pgpro13/pgheap.go new file mode 100644 index 000000000..52ef71789 --- /dev/null +++ b/format/postgres/flavours/pgpro13/pgheap.go @@ -0,0 +1,62 @@ +package pgpro13 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version +/* 20 | 4 */ // TransactionId pd_prune_xid +/* 24 | 0 */ // ItemIdData pd_linp[] +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// } t_choice; +/* total size (bytes): 12 */ + +/* 12 | 6 */ // ItemPointerData t_ctid; +/* 18 | 2 */ // uint16 t_infomask2; +/* 20 | 2 */ // uint16 t_infomask; +/* 22 | 1 */ // uint8 t_hoff; +/* 23 | 0 */ // bits8 t_bits[]; +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleFields { +/* 0 | 4 */ // TransactionId t_xmin; +/* 4 | 4 */ // TransactionId t_xmax; +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // TransactionId t_xvac; +// } t_field3; +/* total size (bytes): 4 */ +// +/* total size (bytes): 12 */ + +// type = struct DatumTupleFields { +/* 0 | 4 */ // int32 datum_len_; +/* 4 | 4 */ // int32 datum_typmod; +/* 8 | 4 */ // Oid datum_typeid; +// +/* total size (bytes): 12 */ + +func DecodeHeap(d *decode.D) any { + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: common14.DecodePageHeaderData, + } + return common14.DecodeHeap(d, heap) +} diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 19785f1d2..8c61baf09 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/pgpro13" "github.com/wader/fq/format/postgres/flavours/pgpro14" "github.com/wader/fq/format/postgres/flavours/pgproee10" "github.com/wader/fq/format/postgres/flavours/pgproee11" @@ -48,6 +49,8 @@ func decodePgheap(d *decode.D, in any) any { return pgproee12.DecodeHeap(d) case PG_FLAVOUR_PGPROEE13: return pgproee13.DecodeHeap(d) + case PG_FLAVOUR_PGPRO13: + return pgpro13.DecodeHeap(d) case PG_FLAVOUR_PGPRO14: return pgpro14.DecodeHeap(d) case PG_FLAVOUR_PGPROEE14: From 9570d4df7795218d85f3a7f467ca99bfc20437ea Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 26 Aug 2022 12:12:22 +0300 Subject: [PATCH 042/141] add pgpro12 postgres --- .../postgres/flavours/pgpro12/pg_control.go | 220 ++++++++++++++++++ format/postgres/flavours/pgpro12/pg_heap.go | 62 +++++ format/postgres/pg_control.go | 4 + format/postgres/pgheap.go | 8 +- 4 files changed, 292 insertions(+), 2 deletions(-) create mode 100644 format/postgres/flavours/pgpro12/pg_control.go create mode 100644 format/postgres/flavours/pgpro12/pg_heap.go diff --git a/format/postgres/flavours/pgpro12/pg_control.go b/format/postgres/flavours/pgpro12/pg_control.go new file mode 100644 index 000000000..3efc366d7 --- /dev/null +++ b/format/postgres/flavours/pgpro12/pg_control.go @@ -0,0 +1,220 @@ +package pgpro12 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 88 */ // CheckPoint checkPointCopy; +/* 128 | 8 */ // XLogRecPtr unloggedLSN; +/* 136 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 144 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 152 | 8 */ // XLogRecPtr backupStartPoint; +/* 160 | 8 */ // XLogRecPtr backupEndPoint; +/* 168 | 1 */ // _Bool backupEndRequired; +/* XXX 3-byte hole */ +/* 172 | 4 */ // int wal_level; +/* 176 | 1 */ // _Bool wal_log_hints; +/* XXX 3-byte hole */ +/* 180 | 4 */ // int MaxConnections; +/* 184 | 4 */ // int max_worker_processes; +/* 188 | 4 */ // int max_wal_senders; +/* 192 | 4 */ // int max_prepared_xacts; +/* 196 | 4 */ // int max_locks_per_xact; +/* 200 | 1 */ // _Bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 204 | 4 */ // uint32 maxAlign; +/* 208 | 8 */ // double floatFormat; +/* 216 | 4 */ // uint32 blcksz; +/* 220 | 4 */ // uint32 relseg_size; +/* 224 | 4 */ // uint32 xlog_blcksz; +/* 228 | 4 */ // uint32 xlog_seg_size; +/* 232 | 4 */ // uint32 nameDataLen; +/* 236 | 4 */ // uint32 indexMaxKeys; +/* 240 | 4 */ // uint32 toast_max_chunk_size; +/* 244 | 4 */ // uint32 loblksize; +/* 248 | 1 */ // _Bool float4ByVal; +/* 249 | 1 */ // _Bool float8ByVal; +/* XXX 2-byte hole */ +/* 252 | 4 */ // uint32 data_checksum_version; +/* 256 | 32 */ // char mock_authentication_nonce[32]; +/* 288 | 4 */ // pg_icu_version icu_version; +/* 292 | 4 */ // pg_crc32c crc; +// +/* total size (bytes): 296 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // _Bool fullPageWrites; +/* XXX 7-byte hole */ +/* 24 | 8 */ // FullTransactionId nextFullXid; +/* 32 | 4 */ // Oid nextOid; +/* 36 | 4 */ // MultiXactId nextMulti; +/* 40 | 4 */ // MultiXactOffset nextMultiOffset; +/* 44 | 4 */ // TransactionId oldestXid; +/* 48 | 4 */ // Oid oldestXidDB; +/* 52 | 4 */ // MultiXactId oldestMulti; +/* 56 | 4 */ // Oid oldestMultiDB; +/* XXX 4-byte hole */ +/* 64 | 8 */ // pg_time_t time; +/* 72 | 4 */ // TransactionId oldestCommitTsXid; +/* 76 | 4 */ // TransactionId newestCommitTsXid; +/* 80 | 4 */ // TransactionId oldestActiveXid; +/* XXX 4-byte padding */ +// +/* total size (bytes): 88 */ + +func DecodePgControl(d *decode.D, in any) any { + d.SeekAbs(0) + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version", common.VersionMapper) + d.FieldU32("catalog_version_no") + d.FieldU32("state", common.DBState) + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 88 */ // CheckPoint checkPointCopy; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("checkPoint", common.XLogRecPtrMapper) + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 7-byte hole */ + d.FieldU64("redo", common.XLogRecPtrMapper) + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U56() + + /* 24 | 8 */ // FullTransactionId nextFullXid; + /* 32 | 4 */ // Oid nextOid; + /* 36 | 4 */ // MultiXactId nextMulti; + /* 40 | 4 */ // MultiXactOffset nextMultiOffset; + /* 44 | 4 */ // TransactionId oldestXid; + /* 48 | 4 */ // Oid oldestXidDB; + /* 52 | 4 */ // MultiXactId oldestMulti; + /* 56 | 4 */ // Oid oldestMultiDB; + /* XXX 4-byte hole */ + d.FieldU64("nextFullXid") + d.FieldU32("nextOid") + d.FieldU32("nextMulti") + d.FieldU32("nextMultiOffset") + d.FieldU32("oldestXid") + d.FieldU32("oldestXidDB") + d.FieldU32("oldestMulti") + d.FieldU32("oldestMultiDB") + d.U32() + + /* 64 | 8 */ // pg_time_t time; + /* 72 | 4 */ // TransactionId oldestCommitTsXid; + /* 76 | 4 */ // TransactionId newestCommitTsXid; + /* 80 | 4 */ // TransactionId oldestActiveXid; + /* XXX 4-byte padding */ + d.FieldS64("time", common.TimeMapper) + d.FieldU32("oldestCommitTsXid") + d.FieldU32("newestCommitTsXid") + d.FieldU32("oldestActiveXid") + d.U32() + }) + + /* 128 | 8 */ // XLogRecPtr unloggedLSN; + /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN", common.LocPtrMapper) + d.FieldU64("minRecoveryPoint", common.LocPtrMapper) + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 152 | 8 */ // XLogRecPtr backupStartPoint; + /* 160 | 8 */ // XLogRecPtr backupEndPoint; + /* 168 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint", common.LocPtrMapper) + d.FieldU64("backupEndPoint", common.LocPtrMapper) + d.FieldU8("backupEndRequired") + d.U24() + + /* 172 | 4 */ // int wal_level; + /* 176 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level", common.WalLevel) + d.FieldU8("wal_log_hints") + d.U24() + + /* 180 | 4 */ // int MaxConnections; + /* 184 | 4 */ // int max_worker_processes; + /* 188 | 4 */ // int max_wal_senders; + /* 192 | 4 */ // int max_prepared_xacts; + /* 196 | 4 */ // int max_locks_per_xact; + /* 200 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_wal_senders") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 204 | 4 */ // uint32 maxAlign; + /* 208 | 8 */ // double floatFormat; + /* 216 | 4 */ // uint32 blcksz; + /* 220 | 4 */ // uint32 relseg_size; + /* 224 | 4 */ // uint32 xlog_blcksz; + /* 228 | 4 */ // uint32 xlog_seg_size; + /* 232 | 4 */ // uint32 nameDataLen; + /* 236 | 4 */ // uint32 indexMaxKeys; + /* 240 | 4 */ // uint32 toast_max_chunk_size; + /* 244 | 4 */ // uint32 loblksize; + /* 248 | 1 */ // _Bool float4ByVal; + /* 249 | 1 */ // _Bool float8ByVal; + /* XXX 2-byte hole */ + d.FieldU32("maxAlign") + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float4ByVal") + d.FieldU8("float8ByVal") + d.U16() + + /* 252 | 4 */ // uint32 data_checksum_version; + /* 256 | 32 */ // char mock_authentication_nonce[32]; + /* 288 | 4 */ // pg_icu_version icu_version; + /* 292 | 4 */ // pg_crc32c crc; + d.FieldU32("data_checksum_version") + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) + d.FieldU32("icu_version", common.IcuVersionMapper) + d.FieldU32("crc") + /* total size (bytes): 296 */ + + d.AssertPosBytes(296) + + return nil +} diff --git a/format/postgres/flavours/pgpro12/pg_heap.go b/format/postgres/flavours/pgpro12/pg_heap.go new file mode 100644 index 000000000..57081a5d4 --- /dev/null +++ b/format/postgres/flavours/pgpro12/pg_heap.go @@ -0,0 +1,62 @@ +package pgpro12 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn; +/* 8 | 2 */ // uint16 pd_checksum; +/* 10 | 2 */ // uint16 pd_flags; +/* 12 | 2 */ // LocationIndex pd_lower; +/* 14 | 2 */ // LocationIndex pd_upper; +/* 16 | 2 */ // LocationIndex pd_special; +/* 18 | 2 */ // uint16 pd_pagesize_version; +/* 20 | 4 */ // TransactionId pd_prune_xid; +/* 24 | 0 */ // ItemIdData pd_linp[]; +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// } t_choice; +// /* total size (bytes): 12 */ +// +/* 12 | 6 */ // ItemPointerData t_ctid; +/* 18 | 2 */ // uint16 t_infomask2; +/* 20 | 2 */ // uint16 t_infomask; +/* 22 | 1 */ // uint8 t_hoff; +/* 23 | 0 */ // bits8 t_bits[]; +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleFields { +/* 0 | 4 */ // TransactionId t_xmin; +/* 4 | 4 */ // TransactionId t_xmax; +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // TransactionId t_xvac; +// } t_field3; +/* total size (bytes): 4 */ +// +/* total size (bytes): 12 */ + +// type = struct DatumTupleFields { +/* 0 | 4 */ // int32 datum_len_; +/* 4 | 4 */ // int32 datum_typmod; +/* 8 | 4 */ // Oid datum_typeid; +// +/* total size (bytes): 12 */ + +func DecodeHeap(d *decode.D) any { + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: common14.DecodePageHeaderData, + } + return common14.DecodeHeap(d, heap) +} diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 958f8b9ca..a440ea902 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/pgpro12" "github.com/wader/fq/format/postgres/flavours/pgpro13" "github.com/wader/fq/format/postgres/flavours/pgpro14" "github.com/wader/fq/format/postgres/flavours/pgproee10" @@ -41,6 +42,7 @@ const ( PG_FLAVOUR_POSTGRES12 = "postgres12" PG_FLAVOUR_POSTGRES13 = "postgres13" PG_FLAVOUR_POSTGRES14 = "postgres14" + PG_FLAVOUR_PGPRO12 = "pgpro12" PG_FLAVOUR_PGPRO13 = "pgpro13" PG_FLAVOUR_PGPRO14 = "pgpro14" PG_FLAVOUR_PGPROEE10 = "pgproee10" @@ -63,6 +65,8 @@ func decodePgControl(d *decode.D, in any) any { return postgres13.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: return postgres14.DecodePgControl(d, in) + case PG_FLAVOUR_PGPRO12: + return pgpro12.DecodePgControl(d, in) case PG_FLAVOUR_PGPRO13: return pgpro13.DecodePgControl(d, in) case PG_FLAVOUR_PGPRO14: diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 8c61baf09..1a71c8240 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/pgpro12" "github.com/wader/fq/format/postgres/flavours/pgpro13" "github.com/wader/fq/format/postgres/flavours/pgpro14" "github.com/wader/fq/format/postgres/flavours/pgproee10" @@ -49,12 +50,15 @@ func decodePgheap(d *decode.D, in any) any { return pgproee12.DecodeHeap(d) case PG_FLAVOUR_PGPROEE13: return pgproee13.DecodeHeap(d) + case PG_FLAVOUR_PGPROEE14: + return pgproee14.DecodeHeap(d) + case PG_FLAVOUR_PGPRO12: + return pgpro12.DecodeHeap(d) case PG_FLAVOUR_PGPRO13: return pgpro13.DecodeHeap(d) case PG_FLAVOUR_PGPRO14: return pgpro14.DecodeHeap(d) - case PG_FLAVOUR_PGPROEE14: - return pgproee14.DecodeHeap(d) + default: break } From cf1e7b2345a1b7c2495a11d15e7ed1a8e8fb9300 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 26 Aug 2022 14:55:06 +0300 Subject: [PATCH 043/141] add pgpro11 for postgres --- .../postgres/flavours/pgpro11/pg_control.go | 221 ++++++++++++++++++ format/postgres/flavours/pgpro11/pg_heap.go | 61 +++++ format/postgres/pg_control.go | 4 + format/postgres/pgheap.go | 3 + 4 files changed, 289 insertions(+) create mode 100644 format/postgres/flavours/pgpro11/pg_control.go create mode 100644 format/postgres/flavours/pgpro11/pg_heap.go diff --git a/format/postgres/flavours/pgpro11/pg_control.go b/format/postgres/flavours/pgpro11/pg_control.go new file mode 100644 index 000000000..d068479d9 --- /dev/null +++ b/format/postgres/flavours/pgpro11/pg_control.go @@ -0,0 +1,221 @@ +package pgpro11 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 80 */ // CheckPoint checkPointCopy; +/* 120 | 8 */ // XLogRecPtr unloggedLSN; +/* 128 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 136 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 144 | 8 */ // XLogRecPtr backupStartPoint; +/* 152 | 8 */ // XLogRecPtr backupEndPoint; +/* 160 | 1 */ // _Bool backupEndRequired; +/* XXX 3-byte hole */ +/* 164 | 4 */ // int wal_level; +/* 168 | 1 */ // _Bool wal_log_hints; +/* XXX 3-byte hole */ +/* 172 | 4 */ // int MaxConnections; +/* 176 | 4 */ // int max_worker_processes; +/* 180 | 4 */ // int max_prepared_xacts; +/* 184 | 4 */ // int max_locks_per_xact; +/* 188 | 1 */ // _Bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 192 | 4 */ // uint32 maxAlign; +/* XXX 4-byte hole */ +/* 200 | 8 */ // double floatFormat; +/* 208 | 4 */ // uint32 blcksz; +/* 212 | 4 */ // uint32 relseg_size; +/* 216 | 4 */ // uint32 xlog_blcksz; +/* 220 | 4 */ // uint32 xlog_seg_size; +/* 224 | 4 */ // uint32 nameDataLen; +/* 228 | 4 */ // uint32 indexMaxKeys; +/* 232 | 4 */ // uint32 toast_max_chunk_size; +/* 236 | 4 */ // uint32 loblksize; +/* 240 | 1 */ // _Bool float4ByVal; +/* 241 | 1 */ // _Bool float8ByVal; +/* XXX 2-byte hole */ +/* 244 | 4 */ // uint32 data_checksum_version; +/* 248 | 32 */ // char mock_authentication_nonce[32]; +/* 280 | 4 */ // pg_icu_version icu_version; +/* 284 | 4 */ // pg_crc32c crc +// +/* total size (bytes): 288 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // _Bool fullPageWrites; +/* XXX 3-byte hole */ +/* 20 | 4 */ // uint32 nextXidEpoch; +/* 24 | 4 */ // TransactionId nextXid; +/* 28 | 4 */ // Oid nextOid; +/* 32 | 4 */ // MultiXactId nextMulti; +/* 36 | 4 */ // MultiXactOffset nextMultiOffset; +/* 40 | 4 */ // TransactionId oldestXid; +/* 44 | 4 */ // Oid oldestXidDB; +/* 48 | 4 */ // MultiXactId oldestMulti; +/* 52 | 4 */ // Oid oldestMultiDB; +/* 56 | 8 */ // pg_time_t time; +/* 64 | 4 */ // TransactionId oldestCommitTsXid; +/* 68 | 4 */ // TransactionId newestCommitTsXid; +/* 72 | 4 */ // TransactionId oldestActiveXid; +/* XXX 4-byte padding */ +// +/* total size (bytes): 80 */ + +func DecodePgControl(d *decode.D, in any) any { + d.SeekAbs(0) + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version") + d.FieldU32("catalog_version_no") + d.FieldU32("state", common.DBState) + d.U32() + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 80 */ // CheckPoint checkPointCopy; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("checkPoint", common.XLogRecPtrMapper) + d.FieldStruct("checkPointCopy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 3-byte hole */ + d.FieldU64("redo", common.XLogRecPtrMapper) + d.FieldU32("ThisTimeLineID") + d.FieldU32("PrevTimeLineID") + d.FieldU8("fullPageWrites") + d.U24() + + /* 20 | 4 */ // uint32 nextXidEpoch; + /* 24 | 4 */ // TransactionId nextXid; + /* 28 | 4 */ // Oid nextOid; + /* 32 | 4 */ // MultiXactId nextMulti; + /* 36 | 4 */ // MultiXactOffset nextMultiOffset; + /* 40 | 4 */ // TransactionId oldestXid; + /* 44 | 4 */ // Oid oldestXidDB; + /* 48 | 4 */ // MultiXactId oldestMulti; + /* 52 | 4 */ // Oid oldestMultiDB; + /* 56 | 8 */ // pg_time_t time; + /* 64 | 4 */ // TransactionId oldestCommitTsXid; + /* 68 | 4 */ // TransactionId newestCommitTsXid; + /* 72 | 4 */ // TransactionId oldestActiveXid; + /* XXX 4-byte padding */ + d.FieldU32("nextXidEpoch") + d.FieldU32("nextXid") + d.FieldU32("nextOid") + d.FieldU32("nextMulti") + d.FieldU32("nextMultiOffset") + d.FieldU32("oldestXid") + d.FieldU32("oldestXidDB") + d.FieldU32("oldestMulti") + d.FieldU32("oldestMultiDB") + d.FieldS64("time", common.TimeMapper) + d.FieldU32("oldestCommitTsXid") + d.FieldU32("newestCommitTsXid") + d.FieldU32("oldestActiveXid") + d.U32() + }) + + /* 120 | 8 */ // XLogRecPtr unloggedLSN; + /* 128 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 136 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unloggedLSN", common.LocPtrMapper) + d.FieldU64("minRecoveryPoint", common.LocPtrMapper) + d.FieldU32("minRecoveryPointTLI") + d.U32() + + /* 144 | 8 */ // XLogRecPtr backupStartPoint; + /* 152 | 8 */ // XLogRecPtr backupEndPoint; + /* 160 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backupStartPoint", common.LocPtrMapper) + d.FieldU64("backupEndPoint", common.LocPtrMapper) + d.FieldU8("backupEndRequired") + d.U24() + + /* 164 | 4 */ // int wal_level; + /* 168 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level", common.WalLevel) + d.FieldU8("wal_log_hints") + d.U24() + + /* 172 | 4 */ // int MaxConnections; + /* 176 | 4 */ // int max_worker_processes; + /* 180 | 4 */ // int max_prepared_xacts; + /* 184 | 4 */ // int max_locks_per_xact; + /* 188 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("MaxConnections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.U24() + + /* 192 | 4 */ // uint32 maxAlign; + /* XXX 4-byte hole */ + d.FieldU32("maxAlign") + d.U32() + + /* 200 | 8 */ // double floatFormat; + /* 208 | 4 */ // uint32 blcksz; + /* 212 | 4 */ // uint32 relseg_size; + /* 216 | 4 */ // uint32 xlog_blcksz; + /* 220 | 4 */ // uint32 xlog_seg_size; + /* 224 | 4 */ // uint32 nameDataLen; + /* 228 | 4 */ // uint32 indexMaxKeys; + /* 232 | 4 */ // uint32 toast_max_chunk_size; + /* 236 | 4 */ // uint32 loblksize; + /* 240 | 1 */ // _Bool float4ByVal; + /* 241 | 1 */ // _Bool float8ByVal; + /* XXX 2-byte hole */ + d.FieldF64("floatFormat") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("nameDataLen") + d.FieldU32("indexMaxKeys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float4ByVal") + d.FieldU8("float8ByVal") + d.U16() + + /* 244 | 4 */ // uint32 data_checksum_version; + /* 248 | 32 */ // char mock_authentication_nonce[32]; + /* 280 | 4 */ // pg_icu_version icu_version; + /* 284 | 4 */ // pg_crc32c crc + d.FieldU32("data_checksum_version") + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) + d.FieldU32("icu_version") + d.FieldU32("crc") + d.U32() + /* total size (bytes): 288 */ + + d.AssertPosBytes(288) + + return nil +} diff --git a/format/postgres/flavours/pgpro11/pg_heap.go b/format/postgres/flavours/pgpro11/pg_heap.go new file mode 100644 index 000000000..b9ee33e0b --- /dev/null +++ b/format/postgres/flavours/pgpro11/pg_heap.go @@ -0,0 +1,61 @@ +package pgpro11 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +// type = struct PageHeaderData { +/* 0 | 8 */ // PageXLogRecPtr pd_lsn +/* 8 | 2 */ // uint16 pd_checksum +/* 10 | 2 */ // uint16 pd_flags +/* 12 | 2 */ // LocationIndex pd_lower +/* 14 | 2 */ // LocationIndex pd_upper +/* 16 | 2 */ // LocationIndex pd_special +/* 18 | 2 */ // uint16 pd_pagesize_version +/* 20 | 4 */ // TransactionId pd_prune_xid +/* 24 | 0 */ // ItemIdData pd_linp[] +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleHeaderData { +/* 0 | 12 */ // union { +/* 12 */ // HeapTupleFields t_heap; +/* 12 */ // DatumTupleFields t_datum; +// } t_choice +/* total size (bytes): 12 */ +/* 12 | 6 */ // ItemPointerData t_ctid +/* 18 | 2 */ // uint16 t_infomask2 +/* 20 | 2 */ // uint16 t_infomask +/* 22 | 1 */ // uint8 t_hoff +/* 23 | 0 */ // bits8 t_bits[] +/* XXX 1-byte padding */ +// +/* total size (bytes): 24 */ + +// type = struct HeapTupleFields { +/* 0 | 4 */ // TransactionId t_xmin +/* 4 | 4 */ // TransactionId t_xmax +/* 8 | 4 */ // union { +/* 4 */ // CommandId t_cid; +/* 4 */ // TransactionId t_xvac; +// } t_field3 +/* total size (bytes): 4 */ +// +/* total size (bytes): 12 */ + +// type = struct DatumTupleFields { +/* 0 | 4 */ // int32 datum_len_ +/* 4 | 4 */ // int32 datum_typmod +/* 8 | 4 */ // Oid datum_typeid +// +/* total size (bytes): 12 */ + +func DecodeHeap(d *decode.D) any { + heap := &common14.HeapD{ + PageSize: common.HeapPageSize, + DecodePageHeaderDataFn: common14.DecodePageHeaderData, + } + return common14.DecodeHeap(d, heap) +} diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index a440ea902..5940b9089 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/pgpro11" "github.com/wader/fq/format/postgres/flavours/pgpro12" "github.com/wader/fq/format/postgres/flavours/pgpro13" "github.com/wader/fq/format/postgres/flavours/pgpro14" @@ -42,6 +43,7 @@ const ( PG_FLAVOUR_POSTGRES12 = "postgres12" PG_FLAVOUR_POSTGRES13 = "postgres13" PG_FLAVOUR_POSTGRES14 = "postgres14" + PG_FLAVOUR_PGPRO11 = "pgpro11" PG_FLAVOUR_PGPRO12 = "pgpro12" PG_FLAVOUR_PGPRO13 = "pgpro13" PG_FLAVOUR_PGPRO14 = "pgpro14" @@ -65,6 +67,8 @@ func decodePgControl(d *decode.D, in any) any { return postgres13.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: return postgres14.DecodePgControl(d, in) + case PG_FLAVOUR_PGPRO11: + return pgpro11.DecodePgControl(d, in) case PG_FLAVOUR_PGPRO12: return pgpro12.DecodePgControl(d, in) case PG_FLAVOUR_PGPRO13: diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 1a71c8240..67b537364 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/pgpro11" "github.com/wader/fq/format/postgres/flavours/pgpro12" "github.com/wader/fq/format/postgres/flavours/pgpro13" "github.com/wader/fq/format/postgres/flavours/pgpro14" @@ -52,6 +53,8 @@ func decodePgheap(d *decode.D, in any) any { return pgproee13.DecodeHeap(d) case PG_FLAVOUR_PGPROEE14: return pgproee14.DecodeHeap(d) + case PG_FLAVOUR_PGPRO11: + return pgpro11.DecodeHeap(d) case PG_FLAVOUR_PGPRO12: return pgpro12.DecodeHeap(d) case PG_FLAVOUR_PGPRO13: From f56c72d3536b9d5311a89c9cd98c0f6492c5f90c Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 31 Aug 2022 11:20:50 +0300 Subject: [PATCH 044/141] add postgres tests for mem, cpu profiling --- format/postgres/fqtest_test.go | 91 ++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 format/postgres/fqtest_test.go diff --git a/format/postgres/fqtest_test.go b/format/postgres/fqtest_test.go new file mode 100644 index 000000000..36b7dc105 --- /dev/null +++ b/format/postgres/fqtest_test.go @@ -0,0 +1,91 @@ +package postgres_test + +import ( + "context" + "github.com/wader/fq/internal/difftest" + "github.com/wader/fq/internal/script" + "os" + "strconv" + "testing" + + _ "github.com/wader/fq/format/all" + "github.com/wader/fq/pkg/interp" +) + +// get testdata dir from: +// git clone https://github.com/pnsafonov/testdata.git + +// 1 GB postgres heap file: +// https://github.com/pnsafonov/fq_testdata_postgres14/raw/master/16397 +// git clone https://github.com/pnsafonov/fq_testdata_postgres14.git +// +// time fq -d pgheap -o flavour=postgres14 ".Pages[0].PageHeaderData.pd_linp[0, 1, 2, -1] | tovalue" 16397 +// Killed +// +// real 0m50.794s +// user 1m11.962s +// sys 0m8.994s +// +// sudo dmesg | tail -2 +// [193541.830725] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=user.slice,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-1.scope,task=fq,pid=454783,uid=1000 +// [193541.830748] Out of memory: Killed process 454783 (fq) total-vm:31508780kB, anon-rss:26629332kB, file-rss:272kB, shmem-rss:0kB, UID:1000 pgtables:58860kB oom_score_adj:0 + +// to make mem, cpu profiling: +// go test -cpuprofile "cpu.prof" -memprofile "mem.prof" -bench . +// +// go tool pprof mem.prof +// top20 +// q +// +// go tool pprof cpu.prof +// top20 +// q + +// run only postgres tests +func TestFQTests(t *testing.T) { + testPath(t, interp.DefaultRegistry) +} + +func testPath(t *testing.T, registry *interp.Registry) { + difftest.TestWithOptions(t, difftest.Options{ + Path: "testdata", + Pattern: "*.fqtest", + ColorDiff: os.Getenv("DIFF_COLOR") != "", + WriteOutput: os.Getenv("WRITE_ACTUAL") != "", + Fn: func(t *testing.T, path, input string) (string, string, error) { + t.Parallel() + + b, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + c := script.ParseCases(string(b)) + c.Path = path + + for _, p := range c.Parts { + cr, ok := p.(*script.CaseRun) + if !ok { + continue + } + + t.Run(strconv.Itoa(cr.LineNr)+"/"+cr.Command, func(t *testing.T) { + cr.WasRun = true + + i, err := interp.New(cr, registry) + if err != nil { + t.Fatal(err) + } + + err = i.Main(context.Background(), cr.Stdout(), "testversion") + if err != nil { + if ex, ok := err.(interp.Exiter); ok { //nolint:errorlint + cr.ActualExitCode = ex.ExitCode() + } + } + }) + } + + return path, c.ToActual(), nil + }, + }) +} From 2ee01f79c20f012e67431e8ad21ade7067199473 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 2 Sep 2022 09:03:08 +0300 Subject: [PATCH 045/141] allow to change FillGaps in decoder --- format/postgres/pg_control.go | 1 + format/postgres/pgheap.go | 1 + pkg/decode/decode.go | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 5940b9089..85b3395a0 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -56,6 +56,7 @@ const ( func decodePgControl(d *decode.D, in any) any { d.Endian = decode.LittleEndian + d.Options.FillGaps = false flavour := in.(format.PostgresIn).Flavour switch flavour { diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 67b537364..81cb79753 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -32,6 +32,7 @@ func init() { func decodePgheap(d *decode.D, in any) any { d.Endian = decode.LittleEndian + d.Options.FillGaps = false flavour := in.(format.PostgresIn).Flavour switch flavour { diff --git a/pkg/decode/decode.go b/pkg/decode/decode.go index 67f2ad85c..5962495de 100644 --- a/pkg/decode/decode.go +++ b/pkg/decode/decode.go @@ -118,7 +118,7 @@ func decode(ctx context.Context, br bitio.ReaderAtSeeker, group Group, opts Opti } // TODO: maybe move to Format* funcs? - if opts.FillGaps { + if d.Options.FillGaps { d.FillGaps(ranges.Range{Start: 0, Len: decodeRange.Len}, "unknown") } From 9f5036a311b94b9ef25137c21e677522d0735ff6 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 2 Sep 2022 11:53:35 +0300 Subject: [PATCH 046/141] postgres: made root an array --- format/postgres/flavours/pgpro11/pg_control.go | 1 - format/postgres/flavours/postgres14/common14/pgheap.go | 2 +- format/postgres/pgheap.go | 2 ++ 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/format/postgres/flavours/pgpro11/pg_control.go b/format/postgres/flavours/pgpro11/pg_control.go index d068479d9..ebb3b7190 100644 --- a/format/postgres/flavours/pgpro11/pg_control.go +++ b/format/postgres/flavours/pgpro11/pg_control.go @@ -212,7 +212,6 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) d.FieldU32("icu_version") d.FieldU32("crc") - d.U32() /* total size (bytes): 288 */ d.AssertPosBytes(288) diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index 04809aa97..fabb24ef7 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -176,7 +176,7 @@ func DecodeHeap(d *decode.D, heap *HeapD) any { d.Ctx = ctx d.SeekAbs(0) - d.FieldArray("Pages", decodeHeapPages) + decodeHeapPages(d) return nil } diff --git a/format/postgres/pgheap.go b/format/postgres/pgheap.go index 81cb79753..d1f65ad98 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pgheap.go @@ -27,6 +27,8 @@ func init() { DecodeInArg: format.PostgresIn{ Flavour: "default", }, + RootArray: true, + RootName: "Pages", }) } From 08eb303435047c9a332076515f95e5c2cdc52849 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 2 Sep 2022 16:14:24 +0300 Subject: [PATCH 047/141] postgres: add postgres format docs, refactoing postgres flavours --- doc/postgres.md | 283 ++++++++++++++++++ format/format.go | 10 +- format/postgres/pg_control.go | 1 + format/postgres/{pgheap.go => pg_heap.go} | 5 +- .../{pgmultixact.go => pg_multixact.go} | 7 +- format/postgres/{pgwal.go => pg_wal.go} | 5 +- .../{pgwal_page.go => pg_wal_page.go} | 3 + 7 files changed, 305 insertions(+), 9 deletions(-) create mode 100644 doc/postgres.md rename format/postgres/{pgheap.go => pg_heap.go} (97%) rename format/postgres/{pgmultixact.go => pg_multixact.go} (94%) rename format/postgres/{pgwal.go => pg_wal.go} (96%) rename format/postgres/{pgwal_page.go => pg_wal_page.go} (97%) diff --git a/doc/postgres.md b/doc/postgres.md new file mode 100644 index 000000000..a5e2cd29b --- /dev/null +++ b/doc/postgres.md @@ -0,0 +1,283 @@ +## PostgreSQL formats + +### Supported PostgreSQL data types (`fq -d pg_heap`): + - `pg_heap` - heap, table, relation + - `pg_control` - control file data + - `pg_wal` - wal, write ahead log (not implemented yet) + - `pg_btree` - btree index (not implemented yet) + +### Supported PostgreSQL flavours (`fq -o flavour=postgres14`): +1. Standart (vanilla) PostgreSQL + - `postgres11` + - `postgres12` + - `postgres13` + - `postgres14` +2. Postgres Pro Enterprise + - `pgproee10` + - `pgproee11` + - `pgproee12` + - `pgproee13` + - `pgproee14` +3. Postgres Professional Standard + - `pgpro11` + - `pgpro12` + - `pgpro13` + - `pgpro14` + +### Supported OS +Postgres for x64 Linux deb, rpm based OS. + +### How to run? +Need to specify format, flavour for file and expression: +``` +fq -d pg_control -o flavour=postgres14 d pg_control +fq -d pg_heap -o flavour=postgres14 ".[]" 16397 +``` + +### pg_control file format + +Source code: + - [pg_control.h](https://github.com/postgres/postgres/blob/master/src/include/catalog/pg_control.h) + +To see content of pg_control run: +``` +$ fq -d pg_control -o flavour=postgres14 d pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) +0x000|68 e7 dd 05 b3 88 b3 61 |h......a | system_identifier: 7040120944989169512 +0x000| 14 05 00 00 | .... | pg_control_version: 1300 +0x000| 2d e9 0b 0c| -...| catalog_version_no: 202107181 +0x010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) +0x010| 46 a1 c2 62 00 00 00 00| F..b....| time: "Mon, 04 Jul 2022 08:13:58 UTC" (1656922438) +0x020|c0 88 d6 9a 00 00 00 00 |........ | checkPoint: "0/9AD688C0" (2597750976) + | | | checkPointCopy{}: +0x020| c0 88 d6 9a 00 00 00 00| ........| redo: "0/9AD688C0" (2597750976) +0x030|01 00 00 00 |.... | ThisTimeLineID: 1 +0x030| 01 00 00 00 | .... | PrevTimeLineID: 1 +0x030| 01 | . | fullPageWrites: 1 +0x040|4b ab 1c 00 00 00 00 00 |K....... | nextXid: 1878859 +0x040| dd 81 00 00 | .... | nextOid: 33245 +0x040| 01 00 00 00| ....| nextMulti: 1 +0x050|00 00 00 00 |.... | nextMultiOffset: 0 +0x050| d6 02 00 00 | .... | oldestXid: 726 +0x050| 01 00 00 00 | .... | oldestXidDB: 1 +0x050| 01 00 00 00| ....| oldestMulti: 1 +0x060|01 00 00 00 |.... | oldestMultiDB: 1 +0x060| 46 a1 c2 62 00 00 00 00| F..b....| time: "Mon, 04 Jul 2022 08:13:58 UTC" (1656922438) +0x070|00 00 00 00 |.... | oldestCommitTsXid: 0 +0x070| 00 00 00 00 | .... | newestCommitTsXid: 0 +0x070| 00 00 00 00 | .... | oldestActiveXid: 0 +0x080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) +0x080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) +0x090|00 00 00 00 |.... | minRecoveryPointTLI: 0 +0x090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) +0x0a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) +0x0a0| 00 | . | backupEndRequired: 0 +0x0a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) +0x0b0|00 |. | wal_log_hints: 0 +0x0b0| 64 00 00 00 | d... | MaxConnections: 100 +0x0b0| 08 00 00 00 | .... | max_worker_processes: 8 +0x0b0| 0a 00 00 00| ....| max_wal_senders: 10 +0x0c0|00 00 00 00 |.... | max_prepared_xacts: 0 +0x0c0| 40 00 00 00 | @... | max_locks_per_xact: 64 +0x0c0| 00 | . | track_commit_timestamp: 0 +0x0c0| 08 00 00 00| ....| maxAlign: 8 +0x0d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 +0x0d0| 00 20 00 00 | . .. | blcksz: 8192 +0x0d0| 00 00 02 00| ....| relseg_size: 131072 +0x0e0|00 20 00 00 |. .. | xlog_blcksz: 8192 +0x0e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 +0x0e0| 40 00 00 00 | @... | nameDataLen: 64 +0x0e0| 20 00 00 00| ...| indexMaxKeys: 32 +0x0f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 +0x0f0| 00 08 00 00 | .... | loblksize: 2048 +0x0f0| 01 | . | float8ByVal: 1 +0x0f0| 00 00 00 00| ....| data_checksum_version: 0 +0x100|00 45 fd 64 7e d4 d3 53 82 75 0a b7 d6 be c1 9a|.E.d~..S.u......| mock_authentication_nonce: "0045fd647ed4d35382750ab7d6bec19a77af72bae00f728..." (raw bits) +0x110|77 af 72 ba e0 0f 72 80 4a 57 43 fb 76 c8 98 8c|w.r...r.JWC.v...| +0x120|4b 76 27 eb |Kv'. | crc: 3945231947 +``` + +Specific fields can be got by request: +``` +$ fq -d pg_control -o flavour=postgres14 ".state, .checkPointCopy.redo, .wal_level" pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef| +0x10|06 00 00 00 |.... |.state: "DB_IN_PRODUCTION" (6) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef| +0x20| c0 88 d6 9a 00 00 00 00| ........|.checkPointCopy.redo: "0/9AD688C0" (2597750976) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef| +0xa0| 01 00 00 00| ....|.wal_level: "WAL_LEVEL_REPLICA" (1) +``` + +### Heap data format + +Heap page structure: + - [https://www.postgresql.org/docs/current/storage-page-layout.html](https://www.postgresql.org/docs/current/storage-page-layout.html) + - [https://postgrespro.ru/docs/postgresql/14/storage-page-layout?lang=en](https://postgrespro.ru/docs/postgresql/14/storage-page-layout?lang=en) + +Heap consists of pages. You can see page content: +``` +$ fq -d pg_heap -o flavour=postgres14 ".[0]" 16397 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0]{}: HeapPage +0x0000|00 00 00 00 f0 aa 72 01 00 00 04 00 0c 01 80 01 00 20 04 20|......r.......... . | PageHeaderData{}: +* |until 0x10b.7 (268) | | +0x0104| 00 00 00 00 00 00 00 00 00 00 00 00| ............| FreeSpace: "00000000000000000000000000000000000000000000000..." (raw bits) +0x0118|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|....................| +* |until 0x17f.7 (116) | | +0x017c| e2 02 00 00 00 00 00 00 50 04 00 00 00 00 00 00| ........P.......| Tuples[0:61]: +0x0190|3d 00 04 00 02 09 18 00 3d 00 00 00 01 00 00 00 00 00 00 00|=.......=...........| +* |until 0x1ff8.7 (7801) +``` + +To get PageHeaderData you can use this request: +``` +$ fq -d pg_heap -o flavour=postgres14 ".[0].PageHeaderData" 16397 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].PageHeaderData{}: +0x000|00 00 00 00 f0 aa 72 01 |......r. | pd_lsn{}: +0x000| 00 00 | .. | pd_checksum: 0 +0x000| 04 00 | .. | pd_flags: 4 +0x000| 0c 01 | .. | pd_lower: 268 +0x000| 80 01 | .. | pd_upper: 384 +0x000| 00 20 | . | pd_special: 8192 +0x000| 04 20| . | pd_pagesize_version: 8196 +0x014|00 00 00 00 |.... | pd_prune_xid: 0 +0x014| 80 9f f2 00 00 9f f2 00 80 9e f2 00 00 9e f2 00| ................| pd_linp[0:61]: +0x028|80 9d f2 00 00 9d f2 00 80 9c f2 00 00 9c f2 00 80 9b f2 00|....................| +* |until 0x10b.7 (244) +``` + +To get first and last item pointers on first page: +``` +$ fq -d pg_heap -o flavour=postgres14 ".[0].PageHeaderData.pd_linp[0, -1]" 16397 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData +0x14| 80 9f f2 00 | .... | lp_off: 8064 +0x14| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) +0x14| 80 9f f2 00 | .... | lp_len: 121 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].PageHeaderData.pd_linp[60]{}: ItemIdData +0x104| 80 81 f2 00 | .... | lp_off: 384 +0x104| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) +0x104| 80 81 f2 00 | .... | lp_len: 121 +``` + +First and last tuple on first page: +``` +$ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0, -1]" 16397 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].Tuples[0]{}: HeapTupleHeaderData +0x1f7c| e2 02 00 00 00 00 00 00 50 04 00 00 | ........P... | t_choice{}: +0x1f7c| 00 00 00 00| ....| t_ctid{}: +0x1f90|01 00 |.. | +0x1f90| 04 00 | .. | t_infomask2: 4 +0x1f90| 04 00 | .. | Infomask2{}: +0x1f90| 02 09 | .. | t_infomask: 2306 +0x1f90| 02 09 | .. | Infomask{}: +0x1f90| 18 | . | t_hoff: 24 +0x1f90| 01 00 00 00 01 00 00 00 00 00 00 00| ............| t_bits: "010000000100000000000000ab202020202020202020202..." (raw bits) +0x1fa4|ab 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20|. | +* |until 0x1ff8.7 (97) | | + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].Tuples[60]{}: HeapTupleHeaderData +0x17c| e2 02 00 00 00 00 00 00 50 04 00 00 | ........P... | t_choice{}: +0x17c| 00 00 00 00| ....| t_ctid{}: +0x190|3d 00 |=. | +0x190| 04 00 | .. | t_infomask2: 4 +0x190| 04 00 | .. | Infomask2{}: +0x190| 02 09 | .. | t_infomask: 2306 +0x190| 02 09 | .. | Infomask{}: +0x190| 18 | . | t_hoff: 24 +0x190| 3d 00 00 00 01 00 00 00 00 00 00 00| =...........| t_bits: "3d0000000100000000000000ab202020202020202020202..." (raw bits) +0x1a4|ab 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20|. | +* |until 0x1f8.7 (97) +``` + +Tuple contains a lot of field: +``` +$ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0] | d" 16397 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].Tuples[0]{}: HeapTupleHeaderData + | | | t_choice{}: + | | | t_heap{}: +0x1f7c| e2 02 00 00 | .... | t_xmin: 738 +0x1f7c| 00 00 00 00 | .... | t_xmax: 0 + | | | t_field3{}: +0x1f7c| 50 04 00 00 | P... | t_cid: 1104 +0x1f7c| 50 04 00 00 | P... | t_xvac: 1104 + | | | t_datum{}: +0x1f7c| e2 02 00 00 | .... | datum_len_: 738 +0x1f7c| 00 00 00 00 | .... | datum_typmod: 0 +0x1f7c| 50 04 00 00 | P... | datum_typeid: 1104 + | | | t_ctid{}: +0x1f7c| 00 00 00 00| ....| ip_blkid: 0 +0x1f90|01 00 |.. | ip_posid: 1 +0x1f90| 04 00 | .. | t_infomask2: 4 + | | | Infomask2{}: +0x1f90| 04 00 | .. | HEAP_KEYS_UPDATED: 0 +0x1f90| 04 00 | .. | HEAP_HOT_UPDATED: 0 +0x1f90| 04 00 | .. | HEAP_ONLY_TUPLE: 0 +0x1f90| 02 09 | .. | t_infomask: 2306 + | | | Infomask{}: +0x1f90| 02 09 | .. | HEAP_HASNULL: 0 +0x1f90| 02 09 | .. | HEAP_HASVARWIDTH: 1 +0x1f90| 02 09 | .. | HEAP_HASEXTERNAL: 0 +0x1f90| 02 09 | .. | HEAP_HASOID_OLD: 0 +0x1f90| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 +0x1f90| 02 09 | .. | HEAP_COMBOCID: 0 +0x1f90| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 +0x1f90| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 +0x1f90| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 +0x1f90| 02 09 | .. | HEAP_LOCK_MASK: 0 +0x1f90| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 +0x1f90| 02 09 | .. | HEAP_XMIN_INVALID: 0 +0x1f90| 02 09 | .. | HEAP_XMIN_FROZEN: 0 +0x1f90| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 +0x1f90| 02 09 | .. | HEAP_XMAX_INVALID: 1 +0x1f90| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 +0x1f90| 02 09 | .. | HEAP_UPDATED: 0 +0x1f90| 02 09 | .. | HEAP_MOVED_OFF: 0 +0x1f90| 02 09 | .. | HEAP_MOVED_IN: 0 +0x1f90| 02 09 | .. | HEAP_MOVED: 0 +0x1f90| 18 | . | t_hoff: 24 +0x1f90| 01 00 00 00 01 00 00 00 00 00 00 00| ............| t_bits: "010000000100000000000000ab202020202020202020202..." (raw bits) +0x1fa4|ab 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20|. | +* |until 0x1ff8.7 (97) +``` + +Some of tuple fields are C unions: +``` +$ time fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0].t_choice | d" 16397 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].Tuples[0].t_choice{}: + | | | t_heap{}: +0x1f7c| e2 02 00 00 | .... | t_xmin: 738 +0x1f7c| 00 00 00 00 | .... | t_xmax: 0 + | | | t_field3{}: +0x1f7c| 50 04 00 00 | P... | t_cid: 1104 +0x1f7c| 50 04 00 00 | P... | t_xvac: 1104 + | | | t_datum{}: +0x1f7c| e2 02 00 00 | .... | datum_len_: 738 +0x1f7c| 00 00 00 00 | .... | datum_typmod: 0 +0x1f7c| 50 04 00 00 | P... | datum_typeid: 1104 +``` + +Some tuple fields are flags: +``` +$ time fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0] | .t_infomask, .Infomask" 16397 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123| +0x1f90| 02 09 | .. |.[0].Tuples[0].t_infomask: 2306 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].Tuples[0].Infomask{}: +0x1f90| 02 09 | .. | HEAP_HASNULL: 0 +0x1f90| 02 09 | .. | HEAP_HASVARWIDTH: 1 +0x1f90| 02 09 | .. | HEAP_HASEXTERNAL: 0 +0x1f90| 02 09 | .. | HEAP_HASOID_OLD: 0 +0x1f90| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 +0x1f90| 02 09 | .. | HEAP_COMBOCID: 0 +0x1f90| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 +0x1f90| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 +0x1f90| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 +0x1f90| 02 09 | .. | HEAP_LOCK_MASK: 0 +0x1f90| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 +0x1f90| 02 09 | .. | HEAP_XMIN_INVALID: 0 +0x1f90| 02 09 | .. | HEAP_XMIN_FROZEN: 0 +0x1f90| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 +0x1f90| 02 09 | .. | HEAP_XMAX_INVALID: 1 +0x1f90| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 +0x1f90| 02 09 | .. | HEAP_UPDATED: 0 +0x1f90| 02 09 | .. | HEAP_MOVED_OFF: 0 +0x1f90| 02 09 | .. | HEAP_MOVED_IN: 0 +0x1f90| 02 09 | .. | HEAP_MOVED: 0 +``` \ No newline at end of file diff --git a/format/format.go b/format/format.go index 50559d8b0..d6a5c7a87 100644 --- a/format/format.go +++ b/format/format.go @@ -102,12 +102,12 @@ const ( OPUS_PACKET = "opus_packet" PCAP = "pcap" PCAPNG = "pcapng" - PGWAL = "pgwal" - PGWALPAGE = "pgwal_page" - PGMULTIXACTOFF = "pgmultixact_offsets" - PGMULTIXACTMEM = "pgmultixact_members" + PG_WAL = "pg_wal" + PG_WALPAGE = "pg_wal_page" + PG_MULTIXACTOFF = "pg_multixact_offsets" + PG_MULTIXACTMEM = "pg_multixact_members" PG_CONTROL = "pg_control" - PGHEAP = "pgheap" + PG_HEAP = "pg_heap" PNG = "png" PRORES_FRAME = "prores_frame" PROTOBUF = "protobuf" diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 85b3395a0..0b12b662c 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -99,6 +99,7 @@ func probeForDecode(d *decode.D, in any) any { d.U64() pgControlVersion := d.U32() + // try to guess version switch pgControlVersion { case PG_CONTROL_VERSION_11: return postgres11.DecodePgControl(d, in) diff --git a/format/postgres/pgheap.go b/format/postgres/pg_heap.go similarity index 97% rename from format/postgres/pgheap.go rename to format/postgres/pg_heap.go index d1f65ad98..a74b40c8e 100644 --- a/format/postgres/pgheap.go +++ b/format/postgres/pg_heap.go @@ -19,9 +19,12 @@ import ( "github.com/wader/fq/pkg/interp" ) +// TO DO +// oom kill on 1 GB file + func init() { interp.RegisterFormat(decode.Format{ - Name: format.PGHEAP, + Name: format.PG_HEAP, Description: "PostgreSQL heap file", DecodeFn: decodePgheap, DecodeInArg: format.PostgresIn{ diff --git a/format/postgres/pgmultixact.go b/format/postgres/pg_multixact.go similarity index 94% rename from format/postgres/pgmultixact.go rename to format/postgres/pg_multixact.go index 2b29bcdb5..c5db2e1ff 100644 --- a/format/postgres/pgmultixact.go +++ b/format/postgres/pg_multixact.go @@ -7,16 +7,19 @@ import ( "github.com/wader/fq/pkg/scalar" ) +// TO DO +// actualize + const BLCKSZ = 8192 func init() { interp.RegisterFormat(decode.Format{ - Name: format.PGMULTIXACTOFF, + Name: format.PG_MULTIXACTOFF, Description: "PostgreSQL multixact offset file", DecodeFn: mxOffsetDecode, }) interp.RegisterFormat(decode.Format{ - Name: format.PGMULTIXACTMEM, + Name: format.PG_MULTIXACTMEM, Description: "PostgreSQL multixact members file", DecodeFn: mxMembersDecode, }) diff --git a/format/postgres/pgwal.go b/format/postgres/pg_wal.go similarity index 96% rename from format/postgres/pgwal.go rename to format/postgres/pg_wal.go index 51d17d4fa..a56709461 100644 --- a/format/postgres/pgwal.go +++ b/format/postgres/pg_wal.go @@ -7,9 +7,12 @@ import ( "github.com/wader/fq/pkg/interp" ) +// TO DO +// not ready yet + func init() { interp.RegisterFormat(decode.Format{ - Name: format.PGWAL, + Name: format.PG_WAL, Description: "PostgreSQL write-ahead log file", DecodeFn: decodePgwal, DecodeInArg: format.PostgresIn{ diff --git a/format/postgres/pgwal_page.go b/format/postgres/pg_wal_page.go similarity index 97% rename from format/postgres/pgwal_page.go rename to format/postgres/pg_wal_page.go index e419eecad..8aeefad7d 100644 --- a/format/postgres/pgwal_page.go +++ b/format/postgres/pg_wal_page.go @@ -1,5 +1,8 @@ package postgres +// TO DO +// remove + //import ( // "github.com/wader/fq/format" // "github.com/wader/fq/pkg/decode" From 4db1284f0643eb5512670ec7308d760e786b228c Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 2 Sep 2022 16:21:27 +0300 Subject: [PATCH 048/141] postgres: add tests --- format/postgres/.gitignore | 1 - .../postgres/testdata/flavours/pgpro11/16396 | Bin 0 -> 16384 bytes .../testdata/flavours/pgpro11/16396_1.fqtest | 11 ++ .../postgres/testdata/flavours/pgpro11/16406 | Bin 0 -> 16384 bytes .../testdata/flavours/pgpro11/16406_1.fqtest | 11 ++ .../testdata/flavours/pgpro11/16406_2.fqtest | 105 ++++++++++++++++++ .../testdata/flavours/pgpro11/pg_control | Bin 0 -> 8192 bytes .../flavours/pgpro11/pg_control.fqtest | 57 ++++++++++ .../postgres/testdata/flavours/pgpro12/16396 | Bin 0 -> 16384 bytes .../testdata/flavours/pgpro12/16396_1.fqtest | 11 ++ .../postgres/testdata/flavours/pgpro12/16406 | Bin 0 -> 16384 bytes .../testdata/flavours/pgpro12/16406_1.fqtest | 11 ++ .../testdata/flavours/pgpro12/16406_2.fqtest | 105 ++++++++++++++++++ .../testdata/flavours/pgpro12/pg_control | Bin 0 -> 8192 bytes .../flavours/pgpro12/pg_control.fqtest | 57 ++++++++++ .../postgres/testdata/flavours/pgpro13/16396 | Bin 0 -> 16384 bytes .../testdata/flavours/pgpro13/16396_1.fqtest | 11 ++ .../postgres/testdata/flavours/pgpro13/16406 | Bin 0 -> 16384 bytes .../testdata/flavours/pgpro13/16406_1.fqtest | 11 ++ .../testdata/flavours/pgpro13/16406_2.fqtest | 105 ++++++++++++++++++ .../testdata/flavours/pgpro13/pg_control | Bin 0 -> 8192 bytes .../flavours/pgpro13/pg_control.fqtest | 56 ++++++++++ .../postgres/testdata/flavours/pgpro14/16396 | Bin 0 -> 16384 bytes .../testdata/flavours/pgpro14/16396_1.fqtest | 11 ++ .../postgres/testdata/flavours/pgpro14/16406 | Bin 0 -> 16384 bytes .../testdata/flavours/pgpro14/16406_1.fqtest | 11 ++ .../testdata/flavours/pgpro14/16406_2.fqtest | 105 ++++++++++++++++++ .../testdata/flavours/pgpro14/pg_control | Bin 0 -> 8192 bytes .../flavours/pgpro14/pg_control.fqtest | 56 ++++++++++ .../testdata/flavours/pgproee10/16396 | Bin 0 -> 16384 bytes .../flavours/pgproee10/16396_1.fqtest | 11 ++ .../testdata/flavours/pgproee10/16403 | Bin 0 -> 16384 bytes .../flavours/pgproee10/16403_1.fqtest | 11 ++ .../flavours/pgproee10/16403_2.fqtest | 105 ++++++++++++++++++ .../testdata/flavours/pgproee10/pg_control | Bin 0 -> 8192 bytes .../flavours/pgproee10/pg_control.fqtest | 58 ++++++++++ .../testdata/flavours/pgproee11/90150 | Bin 0 -> 16384 bytes .../flavours/pgproee11/90150_1.fqtest | 11 ++ .../testdata/flavours/pgproee11/90153 | Bin 0 -> 16384 bytes .../flavours/pgproee11/90153_2.fqtest | 105 ++++++++++++++++++ .../testdata/flavours/pgproee11/pg_control | Bin 0 -> 8192 bytes .../flavours/pgproee11/pg_control.fqtest | 60 ++++++++++ .../testdata/flavours/pgproee12/16396 | Bin 0 -> 16384 bytes .../flavours/pgproee12/16396_1.fqtest | 11 ++ .../testdata/flavours/pgproee12/16406 | Bin 0 -> 16384 bytes .../flavours/pgproee12/16406_1.fqtest | 11 ++ .../flavours/pgproee12/16406_2.fqtest | 105 ++++++++++++++++++ .../testdata/flavours/pgproee12/pg_control | Bin 0 -> 8192 bytes .../flavours/pgproee12/pg_control.fqtest | 61 ++++++++++ .../testdata/flavours/pgproee13/16396 | Bin 0 -> 16384 bytes .../flavours/pgproee13/16396_1.fqtest | 11 ++ .../testdata/flavours/pgproee13/16406 | Bin 0 -> 16384 bytes .../flavours/pgproee13/16406_1.fqtest | 11 ++ .../flavours/pgproee13/16406_2.fqtest | 105 ++++++++++++++++++ .../testdata/flavours/pgproee13/pg_control | Bin 0 -> 8192 bytes .../flavours/pgproee13/pg_control.fqtest | 57 ++++++++++ .../testdata/flavours/pgproee14/16396 | Bin 0 -> 16384 bytes .../flavours/pgproee14/16396_1.fqtest | 11 ++ .../testdata/flavours/pgproee14/pg_control | Bin 0 -> 8192 bytes .../flavours/pgproee14/pg_control.fqtest | 57 ++++++++++ .../testdata/flavours/postgres11/16396 | Bin 0 -> 16384 bytes .../flavours/postgres11/16396_1.fqtest | 11 ++ .../testdata/flavours/postgres11/16406 | Bin 0 -> 16384 bytes .../flavours/postgres11/16406_1.fqtest | 11 ++ .../flavours/postgres11/16406_2.fqtest | 105 ++++++++++++++++++ .../testdata/flavours/postgres11/pg_control | Bin 0 -> 8192 bytes .../flavours/postgres11/pg_control.fqtest | 56 ++++++++++ .../testdata/flavours/postgres12/16396 | Bin 0 -> 16384 bytes .../flavours/postgres12/16396_1.fqtest | 11 ++ .../testdata/flavours/postgres12/16406 | Bin 0 -> 16384 bytes .../flavours/postgres12/16406_1.fqtest | 11 ++ .../flavours/postgres12/16406_2.fqtest | 105 ++++++++++++++++++ .../testdata/flavours/postgres12/pg_control | Bin 0 -> 8192 bytes .../flavours/postgres12/pg_control.fqtest | 56 ++++++++++ .../testdata/flavours/postgres13/16396 | Bin 0 -> 16384 bytes .../flavours/postgres13/16396_1.fqtest | 105 ++++++++++++++++++ .../testdata/flavours/postgres13/16407 | Bin 0 -> 16384 bytes .../flavours/postgres13/16407_1.fqtest | 16 +++ .../flavours/postgres13/16407_2.fqtest | 105 ++++++++++++++++++ .../testdata/flavours/postgres13/pg_control | Bin 0 -> 8192 bytes .../flavours/postgres13/pg_control.fqtest | 55 +++++++++ .../testdata/flavours/postgres14/16994 | Bin 0 -> 16384 bytes .../flavours/postgres14/16994_1.fqtest | 21 ++++ .../testdata/flavours/postgres14/33233 | Bin 0 -> 16384 bytes .../flavours/postgres14/33233_1.fqtest | 16 +++ .../flavours/postgres14/33233_2.fqtest | 105 ++++++++++++++++++ .../testdata/flavours/postgres14/pg_control | Bin 0 -> 8192 bytes .../flavours/postgres14/pg_control.fqtest | 55 +++++++++ 88 files changed, 2379 insertions(+), 1 deletion(-) delete mode 100644 format/postgres/.gitignore create mode 100644 format/postgres/testdata/flavours/pgpro11/16396 create mode 100644 format/postgres/testdata/flavours/pgpro11/16396_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro11/16406 create mode 100644 format/postgres/testdata/flavours/pgpro11/16406_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro11/16406_2.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro11/pg_control create mode 100644 format/postgres/testdata/flavours/pgpro11/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro12/16396 create mode 100644 format/postgres/testdata/flavours/pgpro12/16396_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro12/16406 create mode 100644 format/postgres/testdata/flavours/pgpro12/16406_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro12/16406_2.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro12/pg_control create mode 100644 format/postgres/testdata/flavours/pgpro12/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro13/16396 create mode 100644 format/postgres/testdata/flavours/pgpro13/16396_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro13/16406 create mode 100644 format/postgres/testdata/flavours/pgpro13/16406_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro13/16406_2.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro13/pg_control create mode 100644 format/postgres/testdata/flavours/pgpro13/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro14/16396 create mode 100644 format/postgres/testdata/flavours/pgpro14/16396_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro14/16406 create mode 100644 format/postgres/testdata/flavours/pgpro14/16406_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro14/16406_2.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro14/pg_control create mode 100644 format/postgres/testdata/flavours/pgpro14/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee10/16396 create mode 100644 format/postgres/testdata/flavours/pgproee10/16396_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee10/16403 create mode 100644 format/postgres/testdata/flavours/pgproee10/16403_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee10/16403_2.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee10/pg_control create mode 100644 format/postgres/testdata/flavours/pgproee10/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee11/90150 create mode 100644 format/postgres/testdata/flavours/pgproee11/90150_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee11/90153 create mode 100644 format/postgres/testdata/flavours/pgproee11/90153_2.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee11/pg_control create mode 100644 format/postgres/testdata/flavours/pgproee11/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee12/16396 create mode 100644 format/postgres/testdata/flavours/pgproee12/16396_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee12/16406 create mode 100644 format/postgres/testdata/flavours/pgproee12/16406_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee12/16406_2.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee12/pg_control create mode 100644 format/postgres/testdata/flavours/pgproee12/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee13/16396 create mode 100644 format/postgres/testdata/flavours/pgproee13/16396_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee13/16406 create mode 100644 format/postgres/testdata/flavours/pgproee13/16406_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee13/16406_2.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee13/pg_control create mode 100644 format/postgres/testdata/flavours/pgproee13/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee14/16396 create mode 100644 format/postgres/testdata/flavours/pgproee14/16396_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee14/pg_control create mode 100644 format/postgres/testdata/flavours/pgproee14/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/postgres11/16396 create mode 100644 format/postgres/testdata/flavours/postgres11/16396_1.fqtest create mode 100644 format/postgres/testdata/flavours/postgres11/16406 create mode 100644 format/postgres/testdata/flavours/postgres11/16406_1.fqtest create mode 100644 format/postgres/testdata/flavours/postgres11/16406_2.fqtest create mode 100644 format/postgres/testdata/flavours/postgres11/pg_control create mode 100644 format/postgres/testdata/flavours/postgres11/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/postgres12/16396 create mode 100644 format/postgres/testdata/flavours/postgres12/16396_1.fqtest create mode 100644 format/postgres/testdata/flavours/postgres12/16406 create mode 100644 format/postgres/testdata/flavours/postgres12/16406_1.fqtest create mode 100644 format/postgres/testdata/flavours/postgres12/16406_2.fqtest create mode 100644 format/postgres/testdata/flavours/postgres12/pg_control create mode 100644 format/postgres/testdata/flavours/postgres12/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/postgres13/16396 create mode 100644 format/postgres/testdata/flavours/postgres13/16396_1.fqtest create mode 100644 format/postgres/testdata/flavours/postgres13/16407 create mode 100644 format/postgres/testdata/flavours/postgres13/16407_1.fqtest create mode 100644 format/postgres/testdata/flavours/postgres13/16407_2.fqtest create mode 100644 format/postgres/testdata/flavours/postgres13/pg_control create mode 100644 format/postgres/testdata/flavours/postgres13/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/postgres14/16994 create mode 100644 format/postgres/testdata/flavours/postgres14/16994_1.fqtest create mode 100644 format/postgres/testdata/flavours/postgres14/33233 create mode 100644 format/postgres/testdata/flavours/postgres14/33233_1.fqtest create mode 100644 format/postgres/testdata/flavours/postgres14/33233_2.fqtest create mode 100644 format/postgres/testdata/flavours/postgres14/pg_control create mode 100644 format/postgres/testdata/flavours/postgres14/pg_control.fqtest diff --git a/format/postgres/.gitignore b/format/postgres/.gitignore deleted file mode 100644 index 830f58170..000000000 --- a/format/postgres/.gitignore +++ /dev/null @@ -1 +0,0 @@ -testdata \ No newline at end of file diff --git a/format/postgres/testdata/flavours/pgpro11/16396 b/format/postgres/testdata/flavours/pgpro11/16396 new file mode 100644 index 0000000000000000000000000000000000000000..0dcd3b81fc6e2ef404ac8ef6ac027c5b166ab1fe GIT binary patch literal 16384 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 N|L09bdFJmG|G%ar1%3bk literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest new file mode 100644 index 000000000..c2d3cfd75 --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest @@ -0,0 +1,11 @@ +$ fq -d pg_heap -o flavour=pgpro11 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 8144 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 656 +} diff --git a/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest new file mode 100644 index 000000000..f25389c95 --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest @@ -0,0 +1,105 @@ +$ fq -d pg_heap -o flavour=pgpro11 ".[0].Tuples[0,-1] | tovalue" 16406 +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 0, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "0d00000002000000ccf20100f8feffffc43021b0218a0200", + "t_choice": { + "t_datum": { + "datum_len_": 583, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": 583 + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 1 + }, + "t_hoff": 24, + "t_infomask": 2049, + "t_infomask2": 6 +} +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 0, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "0900000003000000b2e003007bf8fffffda429b0218a0200", + "t_choice": { + "t_datum": { + "datum_len_": 739, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": 739 + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 157 + }, + "t_hoff": 24, + "t_infomask": 2049, + "t_infomask2": 6 +} diff --git a/format/postgres/testdata/flavours/pgpro11/pg_control b/format/postgres/testdata/flavours/pgpro11/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..60963065626108cac78e17a2f51b9ebe7972ca71 GIT binary patch literal 8192 zcmbQ>nX@%-1xK4av%U!52QhI!~&SwLqH82P)!a{8pa24+pifpGAMvpKu3US21W-U55zpf z4kUnz8G(iY5yQ7d!N)UpG@7QrPZg^SrsT+CkJV)h&tvuC)NJ;lZB2`*-jaWQ*@i`he5%pTxkb{`kB zd$^e0#l`FnE@roJF}sC}*-c!`Zs1~e9T&4}xR_nV6+GWVGw2!GV?j8GOD+n=@H2lE ze2M;phu&;|l>Vs5AE7@Y@`vdUi~J$_Ln42W{-DSopg$n;`|0356#F8W;}zmtBa$nT)vA@bYlw~PEX`fVb=m42(pZ=v5J@|)>5i~J_~O(MUM zext~5px+?!>*?2v{5tw|BEOb?t;nyTUnBCX=~s*VD*9C-KT1C;@+;|Aiu?-t6(YZ! ze!0jmqhBWSOX-)2{1W;lBEOh^vB)o?UnKGi=@*Lp0{R6aKc9ZS$j_snC-QUY=ZgFs z`Z*#$n|`*)&!V3t@-yjYiu?@v86rQOe!9p{qn{@7Q|YIQ{1o~rB0rgavdB-OpCs}l z^dllak$$4cPoSS5^27AQB0rvfyvUEEA1Crd^rzczEc!2)V7%;SWMb-n|DXOWV*UKx z-$UsBGyVSx-bgI|{G-~0bXk?;Ngg2?y&e_rH!|34@4z5kyT`QHDh z{~t*4{rCQVTI75GKPB?L|4)g0@Bb%7zW4tVBH#P}agp!+|Cq@4{(n^Dd;dQo^1c5b z7Wv-)4~cy5{|80B_x}ST-~0c5k?;L~pUC(AzgOgY|KB6>z5h>&eDD9eMZWj{T_WH6 z|4xzb{eOqZ_x`_KYel~I|1~1t`~PZ@@BM$3$oKxgQsjI8Um^0n|1TH$-v5`0eDD9` zBH#P}Qjzcde~HNV{=Zn{d;eb~^1c5r6#3r&7l?fC|MNw@_y2h!-~0buk?;L~PK^9N D)+!gk literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest new file mode 100644 index 000000000..f365c827f --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest @@ -0,0 +1,11 @@ +$ fq -d pg_heap -o flavour=pgpro12 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 +{ + "lp_flags": "LP_NORMAL", + "lp_len": 121, + "lp_off": 8064 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 121, + "lp_off": 384 +} diff --git a/format/postgres/testdata/flavours/pgpro12/16406 b/format/postgres/testdata/flavours/pgpro12/16406 new file mode 100644 index 0000000000000000000000000000000000000000..1caa6bb2a94a4891424c61c5cbfc327686787302 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgpro12/pg_control.fqtest b/format/postgres/testdata/flavours/pgpro12/pg_control.fqtest new file mode 100644 index 000000000..13046f047 --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro12/pg_control.fqtest @@ -0,0 +1,57 @@ +$ fq -d pg_control -o flavour=pgpro12 tovalue pg_control +{ + "MaxConnections": 194, + "backupEndPoint": "0/0", + "backupEndRequired": 0, + "backupStartPoint": "0/0", + "blcksz": 8192, + "catalog_version_no": 201911191, + "checkPoint": "0/9595D90", + "checkPointCopy": { + "PrevTimeLineID": 1, + "ThisTimeLineID": 1, + "fullPageWrites": 1, + "newestCommitTsXid": 0, + "nextFullXid": 3933, + "nextMulti": 1, + "nextMultiOffset": 0, + "nextOid": 24576, + "oldestActiveXid": 3933, + "oldestCommitTsXid": 0, + "oldestMulti": 1, + "oldestMultiDB": 1, + "oldestXid": 480, + "oldestXidDB": 1, + "redo": "0/9595D58", + "time": "Fri, 26 Aug 2022 08:17:49 UTC" + }, + "crc": 1152611143, + "data_checksum_version": 1, + "float4ByVal": 1, + "float8ByVal": 1, + "floatFormat": 1234567, + "icu_version": "60.3.0.0", + "indexMaxKeys": 32, + "loblksize": 2048, + "maxAlign": 8, + "max_locks_per_xact": 64, + "max_prepared_xacts": 0, + "max_wal_senders": 10, + "max_worker_processes": 8, + "minRecoveryPoint": "0/0", + "minRecoveryPointTLI": 0, + "mock_authentication_nonce": "ee891b8bf8aa7ff59ad910dae0689b40dd36952da495341472f77dc02c046e19", + "nameDataLen": 64, + "pg_control_version": "Postgres Pro Standard 1201", + "relseg_size": 131072, + "state": "DB_IN_PRODUCTION", + "system_identifier": 7136092686029146502, + "time": "Fri, 26 Aug 2022 08:17:52 UTC", + "toast_max_chunk_size": 1996, + "track_commit_timestamp": 0, + "unloggedLSN": "0/3E8", + "wal_level": "WAL_LEVEL_REPLICA", + "wal_log_hints": 0, + "xlog_blcksz": 8192, + "xlog_seg_size": 16777216 +} diff --git a/format/postgres/testdata/flavours/pgpro13/16396 b/format/postgres/testdata/flavours/pgpro13/16396 new file mode 100644 index 0000000000000000000000000000000000000000..71dec0d65d9f55d45bfeb6013aeba7ef001362a5 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest new file mode 100644 index 000000000..399805f3e --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest @@ -0,0 +1,11 @@ +$ fq -d pg_heap -o flavour=pgpro13 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 8144 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 656 +} diff --git a/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest new file mode 100644 index 000000000..ed93f6820 --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest @@ -0,0 +1,105 @@ +$ fq -d pg_heap -o flavour=pgpro13 ".[0].Tuples[0,-1] | tovalue" 16406 +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "4e0000000400000053b40a00d6ffffff9982147e1d8a0200", + "t_choice": { + "t_datum": { + "datum_len_": 498, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": 498 + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 1 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "44000000090000003f9b0e00fc090000446d1c7e1d8a0200", + "t_choice": { + "t_datum": { + "datum_len_": 654, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": 654 + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 157 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} diff --git a/format/postgres/testdata/flavours/pgpro13/pg_control b/format/postgres/testdata/flavours/pgpro13/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..45bd9e3b02029ebabe86cbda0bd97676ad7f408d GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgpro14/pg_control.fqtest b/format/postgres/testdata/flavours/pgpro14/pg_control.fqtest new file mode 100644 index 000000000..195071e6c --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro14/pg_control.fqtest @@ -0,0 +1,56 @@ +$ fq -d pg_control -o flavour=pgpro14 tovalue pg_control +{ + "MaxConnections": 194, + "backupEndPoint": "0/0", + "backupEndRequired": 0, + "backupStartPoint": "0/0", + "blcksz": 8192, + "catalog_version_no": 202110041, + "checkPoint": "0/2D5B858", + "checkPointCopy": { + "PrevTimeLineID": 1, + "ThisTimeLineID": 1, + "fullPageWrites": 1, + "newestCommitTsXid": 0, + "nextMulti": 1, + "nextMultiOffset": 0, + "nextOid": 24576, + "nextXid": 17700, + "oldestActiveXid": 17700, + "oldestCommitTsXid": 0, + "oldestMulti": 1, + "oldestMultiDB": 1, + "oldestXid": 733, + "oldestXidDB": 1, + "redo": "0/2D5B820", + "time": "Fri, 05 Aug 2022 05:36:59 UTC" + }, + "crc": 4029970325, + "data_checksum_version": 1, + "float8ByVal": 1, + "floatFormat": 1234567, + "icu_version": "60.3.0.0", + "indexMaxKeys": 32, + "loblksize": 2048, + "maxAlign": 8, + "max_locks_per_xact": 64, + "max_prepared_xacts": 0, + "max_wal_senders": 10, + "max_worker_processes": 8, + "minRecoveryPoint": "0/0", + "minRecoveryPointTLI": 0, + "mock_authentication_nonce": "fee1b1f5c452bae6c9acdcce6ced4acd5ee657c0f6e4c7a5b0e0953f1de7b25e", + "nameDataLen": 64, + "pg_control_version": "Postgres Pro Standard 1300", + "relseg_size": 131072, + "state": "DB_IN_PRODUCTION", + "system_identifier": 7128258892569024915, + "time": "Fri, 05 Aug 2022 05:36:59 UTC", + "toast_max_chunk_size": 1996, + "track_commit_timestamp": 0, + "unloggedLSN": "0/3E8", + "wal_level": "WAL_LEVEL_REPLICA", + "wal_log_hints": 0, + "xlog_blcksz": 8192, + "xlog_seg_size": 16777216 +} diff --git a/format/postgres/testdata/flavours/pgproee10/16396 b/format/postgres/testdata/flavours/pgproee10/16396 new file mode 100644 index 0000000000000000000000000000000000000000..df3cac55e2a495f5efbafa38c2ce65d91087b89c GIT binary patch literal 16384 zcmc)Q$#Yay6bA77ItdWMkT5n7NPq+q2&05Rz@#&PiYN|oo>8G4aVi{EIG~~e&Weh< za$}VX%LPmS0?R+ZwRJ74ENvH-rDgn1zwb0n7Hssr?^d0h?n}|XzOUzZzYszwe)W6d z`<)?lCFLY`{L@+ftPV<8Fgtx6b0FQdmdF^`I;(NXafIx3z-N5wbLQSo(j)Uf^k*Kip% zVwX=;!jRn-dN`JZlFhw}e@Dev&{6SabW}W!j*2g#qvDI`sQ3apDn5^n`aj0_{tItq zJTx9F^c2H#Oed&`zb7ZZ?95=09ookWY-0g_Z!xsvy7}#YWa}T@M3`+fr2YzAH~-u( z+4^UD3A2ra)VI53emDMPdHla#OPH+`Qhyt+oBu^ywtm}E!feAK_4{z${2iz)*WW(} zK;0M$slNqt=AW6Ht=~Y~EE|`G#!zT3qNl#iWx4*T{%-oaMgA`OyF~sV{XvnxlRiH7 zs?R^PTp#}(^zC)$&&fQWe*^RfME-XA+eLmq{eF?ZmHt+dznT7Kk-w4tMv=dP{sxi1 zp8k4~zmEPok>5+-zLqK8|9a^6i2Swm?Q5Z8{cGs25&7NpyG4E%{VtKen*M5$zl#1U zk-w7uN|E15zf+Evb0_pG|+Z$e%@jmdJ0R-y-s7(w`~vo9Q=;{2BCTi2UjFr;Ge) z^rwmZCi+bxzma~U$Zw!;`yz_>-va%D$WQ3o+Vfa{-;XU5wpJhZTd>tW{4st#_fz4A zze4D%+yAfbt7HFv5ANN6$pP5Detj0e_WLiE2e2$aeGb6(^2bpnyPdjBfbI2PEEnLJ z0Lued7QizAmI+Yg01jQ29_#dP68464|8p-U?D78%FN7?Ae|~3BZ6tVHQ-1_==I@`( zcK`kKXbrE5)%*kU2M6h&zz1=b>mMAt(D(eq4fMaQWV`;dZM4)zg1k$5{IA8F9skeq zTFi3&4Ytuz8ws*9sec%A<{!*B|M88T=&TKUJ*WP?m^1$fK8Uhh|9}N;Y9m2zDD{Ui zXa0eV^CySxi&kwU$S9@$J(x59=RdQ3{@LfO4YTa8=O3P{&1HN1r~00Mcvj?l{^1#s z@A-$PMZV`Bj*5KGA3P=UJ%8||$oKrg6C!^bzkfb1@-LzPn8^41#SxLeh3kJ*wj3}d;a7hk?;AF2St7#kN*QA-}5hJk?;AFLn7bvC-;kd&!5~U@;(1>x5)SW z!(AfZ^AC55e9u4JA@V){aJ$G~!S}!0ME-L6w~G9B`nQOD&wt!3@;(1?lgRh{$BiQ2 z^A{5$-}4vOi+s;tTqp89|8R}S_x!^Fk?;A3t3|%&AFdMlo`1kL4A05sd;ZPy4_AtO z&p+%F`JR8cLgah?;c}7h`3KvUO3w*r|NJ|@2UgwxDixZF*ayqc2UR=&?fHj2wYluq wU+;VVVO->U{$Whyd;Y<;1@n6T)gOP)ACyGC@BiDjWFG6Ey8mylMce=X7aCyas{jB1 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest new file mode 100644 index 000000000..26c4e475f --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest @@ -0,0 +1,11 @@ +$ fq -d pg_heap -o flavour=pgproee10 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 +{ + "lp_flags": "LP_NORMAL", + "lp_len": 121, + "lp_off": 8040 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 121, + "lp_off": 360 +} diff --git a/format/postgres/testdata/flavours/pgproee10/16403 b/format/postgres/testdata/flavours/pgproee10/16403 new file mode 100644 index 0000000000000000000000000000000000000000..14839e897b78ba4be1e4581e55d3bea41b657f07 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest b/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest new file mode 100644 index 000000000..6492eae7f --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest @@ -0,0 +1,11 @@ +$ fq -d pg_heap -o flavour=pgproee10 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16403 +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 8120 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 680 +} diff --git a/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest b/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest new file mode 100644 index 000000000..9b882ddba --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest @@ -0,0 +1,105 @@ +$ fq -d pg_heap -o flavour=pgproee10 ".[0].Tuples[0,-1] | tovalue" 16403 +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "090000000100000043ff0000f70e000043c144237a880200", + "t_choice": { + "t_datum": { + "datum_len_": 3, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": "10000000568" + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 1 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "09000000010000001713000050edffffe8934c237a880200", + "t_choice": { + "t_datum": { + "datum_len_": 158, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": "10000000723" + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 156 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} diff --git a/format/postgres/testdata/flavours/pgproee10/pg_control b/format/postgres/testdata/flavours/pgproee10/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..0b10f44615c05e8c2752fcc8f118452c64014d57 GIT binary patch literal 8192 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 IphpM*043Zmg#Z8m literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee11/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee11/pg_control.fqtest new file mode 100644 index 000000000..220a086fc --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee11/pg_control.fqtest @@ -0,0 +1,60 @@ +$ fq -d pg_control -o flavour=pgproee11 tovalue pg_control +{ + "MaxConnections": 395, + "active_snapshot": 0, + "backupEndPoint": "0/0", + "backupEndRequired": 0, + "backupStartPoint": "0/0", + "blcksz": 8192, + "catalog_version_no": 201809182, + "checkPoint": "4/353A88", + "checkPointCopy": { + "PrevTimeLineID": 1, + "ThisTimeLineID": 1, + "fullPageWrites": 1, + "newestCommitTsXid": 0, + "nextMulti": 5000000000, + "nextMultiOffset": 0, + "nextOid": 98304, + "nextXid": 10015100674, + "oldestActiveXid": 10015100664, + "oldestCommitTsXid": 0, + "oldestMulti": 5000000000, + "oldestMultiDB": 1, + "oldestXid": 10000000571, + "oldestXidDB": 1, + "redo": "3/C8525640", + "time": "Tue, 02 Aug 2022 10:13:30 UTC" + }, + "crc": 2569379933, + "data_checksum_version": 1, + "float4ByVal": 1, + "float8ByVal": 1, + "floatFormat": 1234567, + "icu_version": "50.2.0.0", + "indexMaxKeys": 32, + "loblksize": 2048, + "maxAlign": 8, + "max_locks_per_xact": 64, + "max_prepared_xacts": 0, + "max_worker_processes": 8, + "minRecoveryPoint": "0/0", + "minRecoveryPointTLI": 0, + "mock_authentication_nonce": "4c9a5d04f18324463c503e7d429469a70fe34aacd9f4cb2a42d22b5e7cf01cc9", + "nameDataLen": 64, + "oldest_snapshot": 1, + "pg_control_version": "Postgres Pro Enterprise 1200", + "pg_old_version": 4294901760, + "recent_snapshot": 0, + "relseg_size": 131072, + "state": "DB_IN_PRODUCTION", + "system_identifier": 7115406925904922932, + "time": "Tue, 02 Aug 2022 10:18:00 UTC", + "toast_max_chunk_size": 1996, + "track_commit_timestamp": 0, + "unloggedLSN": "0/1", + "wal_level": "WAL_LEVEL_REPLICA", + "wal_log_hints": 0, + "xlog_blcksz": 8192, + "xlog_seg_size": 16777216 +} diff --git a/format/postgres/testdata/flavours/pgproee12/16396 b/format/postgres/testdata/flavours/pgproee12/16396 new file mode 100644 index 0000000000000000000000000000000000000000..1f84d49a41e1ba426f0330d1d54125065759aa5d GIT binary patch literal 16384 zcmc)Q*>6;37zXg~3GwV%gz)2q zYnk)EgixR4li2W2WB&Wz5Dq6He%Bj1LlW}n@!Q^zN5yZ@QSobZRQw7Z6~9DB#V^oN z@pE)k{0tox&!eMqIA8n}U!&qD=&1NHIx3z+N5!+~sQ3{&Dt?HLif7PK@iaOroXT932&pp`+qabW}Woj=Gmy^2n`cTOG;{ zXIisiHV!AKU$5W1d7&|djqH&H{DQ4Jz;DZjx!5=Vo!`^-*G?wPmJ0pGkkF z$ZwGY?I{1*BxBEOk_v&f%Df11djN`I=zZ=&BM@*C+liu?xp z4I+OE{V5`UGJRW?P~892)2|o#lju(p`E~T`ME*qj6Gi?6`V&O{c>3c-el7i4kw1?9 zIFUb={#cPehW;3lKbrn%kzYgKmW37X|D)*J|6>Y&B>j;hznXrv$R9y}gvhU=UnTM@ z>DyRB@%pQvUm^0#>6eTA;q-@#{9*KmiTt7Thl>0m^ldJtc>O2z%`Sz1^-9&c3@qPl zEwqL+(fuudW!fu~&|EbCx7okV{cZk#yV-w_eeVwE|2Cs9p8wmt{=YH+YwTx=asYkV z1ZDwpcD~!>0q!OT(3b(QJb+~Ym<901?Emyjj}`xR5`6x@9f$4tuf{@bn(P1T9}QvP zZ|L(cW}33W{p0vYJWam?{=k-mo=}*7KZt{N{XgMGG)@0d_keDq=MVPKZ~rsh`TuVg zH0a+FWK{~+zaGcz`Y+=~D9!8t*#-^$o8@E*{&P5H{<$0JUjGla(A>WzcwZ^__OzIP zFy+Vp*8D?)+(RM%@HTz4R3HDrzULp_68WBgI3)5t|8P*`d;Z}~k?;A3H$=YYA6^&v zo_}~vc0S^AGz)zULoa5&52fcv=5~$KiDSnJ%6xOLi^%u#pAXB literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest new file mode 100644 index 000000000..fe67b6c16 --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest @@ -0,0 +1,11 @@ +$ fq -d pg_heap -o flavour=pgproee12 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 +{ + "lp_flags": "LP_NORMAL", + "lp_len": 121, + "lp_off": 8040 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 121, + "lp_off": 360 +} diff --git a/format/postgres/testdata/flavours/pgproee12/16406 b/format/postgres/testdata/flavours/pgproee12/16406 new file mode 100644 index 0000000000000000000000000000000000000000..c642a51a004141caf59a8173b6940b60a2d56876 GIT binary patch literal 16384 zcmeI(XLuIXwg>PvK_HaSA)!NP2_--hAfa~>igXA)5QGp)XhP^Dv;YZ)nm|B`4UT~2 zNKr&NMn&a#!6PN2qJRh%5JWL3$M^nc)>`M>tml5XAMb}V&$FHw{LOy%?7eoGnKwj4 zA-zZYWn3p(>9^nSR_#CQ9N!&J>4-Q)2%_NWc=`a5gGfX~A^Z{fyW(j-A_WnH2twT2 z8BfO%>4-Q)2%;bt=Oc0uiHInKKO%nz&PSvmVh}-yTibCyA{`Nj2tgF&;Cw_5A`uaV z@JHll<9tL4A_ftJxU~)EBhnFZh!8}K_nug5dMh#EjS;Mf`~x`A#QEP`G|Bx z93li!unFfQauA7#D1<*EecN2DX-5Fvt8OR78I6q+;Zh2&(Om-yOs^zY={| zjOg4m$|i#%~e-nD{HH4#nK_`TE|Q;kEx(<2Rf7^vWb^h0Yj! zmHiguH<|jJ8BR18A9m<8`_0C06pt?T>ObTxQN-^)-|r{cZ!$j1l>cC%L%V-ymMwzja%OE}>zUY-j(J@tLOlqfH#jL;0^|vfp5Q zhIqZ++Z`QBLw+XCXOHIf4jnJ+jW0HtsJweIQ`u)2zfQc4mz&**g5WQVWxw9|wc<5@ zej4e}=Rf;=xx?A7Gd^9swr9nQL`U!Yd`0`QUu*mtQ=b#796DB>Xh9eD>Bg@%<@ayq zP(8F~KpXaJj9(>Q+cT@DLuF8(_rln(Hh!gez20K+4z2$Q`5(-FmGLV~eb!7NT8|I= zx(fT1#;1wb@%79XM5mF@d&{z4VSK8oBa?*8WUeP4`yn(@oUYkq!N)}h}Y`g|kq zPxr=es`1OjyZPi^b4hgQUUXj7o9vexzf?S?K+gwZ;_{*XN55ph%=jhZH6N<~OjI28 z`SdLNrN%E7ukHV4C!#2r+`qA3V*DcG=Pn@n`49BhQTB_CUnt(4m)*};5|o^abqa89&$5r}PM-v8aFDS?r%Qeva{t z}MN4)A(_xh=ySN zZs@>%mhs8P=e2fdA=cBaE!odBeuj8${}D){bC`dULfI!9KV7`8?@w>X{siswMQ!#o zjGt!8KOaam3yqaniT!lrr;6A7c_YxF)IWW`@&W9p8J{Fx+w&#l=d%Sq-}xf!ry4&+ zyynlMaEIQ)eqd(7G;cmhGConfj^8Pr99oC<_xC&OF+F;R=Ko~l-^Y6W4D$1%FW4s< zKgsy9Ne*S8{rmlc{bb{x5U=BX-)x6o!G|CCko_d%CyLkh3GYgjhxs=BE%r|spCDfQ zw`a6N_0c|`9brGw_zB{5J}g(>p(|KV+da=d!T9mw-S%?Zv=b(TKTw~9UF;_qA8+cP zx0>iXn71~vA8-6PQ~x=&iJIfXlGd<~H-4;mZO<~%MB!LZ_bp&Q&iFB=KAlbyb;kTz zYZCjh#*Y@S`Brv_LxI2ee68cyk1>9f_!9Vcw|)M^04a(2>PA=gm@d4-Z9n%IDPG6R z!|4tc_4$06(dmAWaPu*(&*z#?1vdY zM7&;apO)BLA)gxsupestVDXyIZ(_eu7X7=n2>T(%4-&7}+jqP}y)i#Oe?Q4VJQ_nH{*izl(~Wqc3uI$l0PzAd@q z^ZhiEeNW@Ni`Vx54&x;b`OtG9`yR%3Gv(j?fXJ=Gjh^hg8{bvDj+a(ge~aOIoeu1~ z8Q;Z}-!aaiN!Z^G2xX7u$vd>aI*ZqQDA-T*8UAPY+U&a+-$}gouU}Q7!}ukl68p}^ zcQp0CHr1i?SbuXLPVvSsw(H)Z_32>h|LSp~(U=e4zQeww@$HSjJl3JX=)51UvhQGg zJMo%tJ276|`^W7U*<*V24y{jH@j8AVwQ#6aMWQ#~V&BgAXz@B;DztRy$OGI@9bwm3<`hfBA4z z{<+%Ne`3Ap5YIls_?D*rmq+3G1IFXALF~hgZ(+*+1RMVMu)j@>Wsl{|JGB1I#cTdt z>V|uF%vXzAvTtF0m?^*fa;%RitX&BE=EgS@uk91m)uBqrx0bcohZ*10_;Cf8KT&_D zGW%x6HxaMv%he?gU577QihWb#8=La4C1Edi*XNt&$G(a2q2e{)>LVXwke}CoO!US( zrg!hq_6#xQkC;s4kM+0zRraCAHxjS&`M7@~pV9u+K4TwZd_&`hEOqDs?iWgZ%)XKF z4a95y7s35hIO-Ff$G)NQ^~LM;M!vxHUvPqb1LNz7*ZH9~*2fIYZzW!4U*Gs(@tO~L zwH%7Ze(ddi?CTj{SG>+wetcjDRCGQNf>{~MHl z6(^S&!oH^Q)lL1AFrYS;CmPX*eGTKQiPwCa-^-yN(Af{Wu*de>JGA~)P5Ja9_A;o? zPAkZ%^U*68wy2?6JIhhn62GUh^S4AJ1>y`LiDTAmgiu*L*m<755_O z>;{4Ck=}*MuPk2kA^bU_I=J}IGVH4uUrD^?|L8SDQ!t;*^J8Dx_==|f!I=Ml!T3G& z+hlKksAPNv@n{mSeGW8s=q@gP$+zq=HF}4(PkHg0Z$ojz)ez&o(-ro(9Vq0>8Nc}| zo|oc!=l-2NQlpSBD_;BSLp;E*kNwr+ciCg9DdfwD*ZKC#p$-M0u{yoMzO3;9ran#5 ziLx=+Y8_^eskBh}rA_%uM>{kT^Yc6V*kh?Ib#&ffiZ_fTJ4 zyw?B1Iikksq;>PyyZ`PU>Whij_WwGTs0%J~e-e8)uiQg@QSqA3S)mR!MA9@#VDFaW z9_k+x@BZ%Q+?tXO9mda&{n@+axQF^8##hG;FD`-BM6-9twR@=dGk#bNyzj$)EG(S8 zI{oR0*Y=OX`nVR?d#VBZ-*1!};{Lz?d6bi+&3QP+?<6*a|9St9_t%^8{u=S0_y7N& z-~T(bQ}SKM_j%kOr(jUOUN*&BPj*S7^Z3BC9q~H8PvHLe0Vc_nMcHFJ;~naEh}ZSA z7v9IV$Nk(F59WL2=NiA=)aM+Y4<%!g|HmEnJB-f}uj^YRo|m7%_}+D$J+_D5q4miY zuk+v3MtDDi{o_j)*yk9(O}x$rp?Cl`5c65&2kf(r-zwhyJa;}Tiu#Pg{vzxY`)$T= z5wGokY&zy*w9n!r?6KYO4z2%YQnq>e3u35bMzSYnZ~a-_4%QBq;e+O3Q`EL8`*h=1i`RUZjtzb-VLbtL*w9+|D5N|537t{AztT`l@Sg#L+AhXSN1E7PZO{CP!9Vw_Z>*tAK9-kKGoEJ z{b0Ng!Th%WbM|S*FBk9TpW6rLmpQZ@<305(`&8rg{Xd43=U;w==a-nT8okecx$*k` zU)#S2`l}4`?d}`wml?0`|Fu5hm_SxyfA{fb_DhXlZ0g_d3{eg2cl_6}Ut;_ss&^vg3oII8NLgQ1!YkNM80h^7< z^zGs77Z^X^)PEc%s53~WKOSeFV*EVuns2k8BYGb1i^_IqKi~K#P5tlG#k*3hF9+JO zpJ)7B@!G#jF~D=t$FGF2f719l#%JRDbW4#xS8KDMYy52Sy1ujlsDKY!AIN@=@w3Fc zx$MSwSm4%SzTIAm{cPiBir0MGR|orLtd9pCJn4 z&joaJ1+?d~YwVMapDrFv=+*zz`goR&i~sHt`x(Yh6R-1g6do|-xZ~w7?6DkshkJc) ziBrXEzHO;TR1Wo@w441j&*}XKzH1>~+vgb8)5|FTrLF9z8b3w6_E)Pf@oov@D=mY4 zlJSY+b$o>_a_BV1Z&E7zDaKD0uh;9~{a9uAkLIyYG=7qJZU0LBiMnC_d37@T$;Lk+ zUfbvOws<##`LpLp_LGdCXv&Yo{qAFUUgbB4{S(F~h}ZVXp6Jj%T>SMI_7jbtAYS(m z12F$zLvsAB1N#Ky$BWne37d!S1D3-x?Uw8(7#}ZQ`}f@hhn~Rt_;~~N zeQpFfl!^V%`xn`dG(OIhUnv96N{}4EdF)3RKit&+<8GJ>k)MZ;vyU@=n0Rf^1#R$s zA2i0_53(O_{7~_lpEt1~Uxdy}+rxgC@k7LG|2DybG9LT?(p%XNHGZ&o9lz5f9eRlV zO`gJji1CBOyZz_R=d1Cu`U-x&JC6Ne;|Cf)2H$Tg!2Ga!2>U_C4-l{Ivl;n+1J9o- z_FzBI`2ME;YkLuWh5Db4WlG+i^YjN>&o3h7rZV~y`+>VFgy=J$BsnVru* z#`vD%HQ(wY;ftdFS?AcJ`@BQjzlZT@{tksf+mZu|LnvVc*U8F5-1O)-&GL&kJFA9*M6jMW?XuY`nhz*Y+Qd28_b}>5iG~I~i}^|IZ7+`!0;f z6^ZOIe7r;ZtG(1;%YQ8sYdhNK)M)k{jBjV!v)2Wp6-d@MhO%#Od|OlgBUHFICX2uh z?AsY1ZT!uP__>v+sVecbQY^eV@`jq$C->wFcC3;YEiwzN3=*2YJg`Y)P5bO|4p`e?Q{-m!dp zhhA@lssE>#&*x+O_PNbI()e)WPec&ibDwv8%^trND!-+8z252va6gF2<=cGr;l{Tx z^*@K_KMU|Y;l+>Hw=}-Fcx-vR`L^E)qS8pdlSkOMFg{GYwrA_*=v%Ch&GxWwZhSNG zIv<{X5A!Y7mzg>2-MPp;v^|@O*L*mEFBp%-{+yEXcrjYfzt~cV~Iyy^itv{$IyqpXHAC zygKtb``X6q`+r?uR^t12D_~|`W?#$r8d87Fw>8-C-$4EMo?~Cr`0C-w@?Devy4OMFHugcrR}ru4;~qS3d=LHgK_>e^<13r;o2LsRpWhPLS2DhWc+H>s$>>{{8zb0b zs`C!5PkHg0567;-VtyOeo<07vkS`}*=g&)ml=`lF+CRYWyNd%7Q_8-Tg-2D zL)jxW3i&do{+H|F{SNLQ?*_2Pt#%-luUSqOow~akguaGYxUi)hU{yy&@ zM8`Dt?sd6`_LskSz1~zzP@%Ynka+g)yyPD0i;LI(J$ssHC+gq3FMGEi-9vpbQ=h%B z*}K=}9_szXYkrQKNK_ex4*7&VyMKE}ypG2<*blq_ANZR5{qDE_ I`}_a@2A){2^#A|> literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest b/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest new file mode 100644 index 000000000..09a19e2ad --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest @@ -0,0 +1,11 @@ +$ fq -d pg_heap -o flavour=pgproee12 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 8120 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 680 +} diff --git a/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest b/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest new file mode 100644 index 000000000..22872afdd --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest @@ -0,0 +1,105 @@ +$ fq -d pg_heap -o flavour=pgproee12 ".[0].Tuples[0,-1] | tovalue" 16406 +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "020000000100000038fd0000890c0000c025676d63880200", + "t_choice": { + "t_datum": { + "datum_len_": 3, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": "10000000509" + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 1 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "0800000001000000e4f50000c9060000d0a36f6d63880200", + "t_choice": { + "t_datum": { + "datum_len_": 158, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": "10000000664" + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 156 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} diff --git a/format/postgres/testdata/flavours/pgproee12/pg_control b/format/postgres/testdata/flavours/pgproee12/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..d0c9f9d1d4a26a988f7783d94b783ba758dc4bd0 GIT binary patch literal 8192 zcmeIuzY9T86bJD4{Qfoi1I$KI1_R1upjd1uKWD{%AhJoBlnlyd^GBErsFw}V87fz9KDb6pru#Wj!b^8djc-y6IxrZa<%EY?VOudR;iYs*R^P% zXyc;H1I5!B=6#9##c%F^*Q|Y+%RSOBS@KCGIYEN33*Est7NJ6;37zXg~3@xP#Qucus+R_3olwEdcrwh1CMcg-3&~e{!xe>(`5XA*oG~O5! z{s!-iH|mXEdt+kqT^Tdnn7GvEJ?D7~ov4X1XP%S1dCxi1_BY?mndO}4YX~9i|L(`a zr{9Oro0OB-@n>iGlS+smS3(&TkDyLt9Th)9M-7K0#1FBKiXWh(!eQ)tAM2?29y%(% zTM481*)sZ&{mv=uN0n^-9jv3`+vuqH7CI`viH?dV(NXaYbX0sD9W`jbdjjjI_!>HD z#P%J>Iw~GRN5!M)r~$j}Rji}pE9j{BGCC^0gpP_YqNCyq=vFr7=h0E|Ids(jUCsayF zs`5)A8~*~_9~*!D?0k>^N)rdpHW)I$7u)9V{Vm_|AFJ{Q=wC?xz<9ns-d@thpN5_G z{5KZEPWpCZp0EFEe+T^?B7Zym?IM30{cR$DEB&n^e+&IBB7Zae%_4sj{Y@f&BmIpc ze*^suB7Z&o^&)>A{dFRLE&a73e+~ULB7Zgg)gr&2e!s|HNq?otUqOF`$nT@yC-Rrm zUtUB1{Buy8f0hdM=gvQIH){I*Zz;!br=|A&+m>2>|Lmb}r=<$Nn|`;*UqXM0$nT=x zCGtDzcZ&QD`W+&FG5y6Ne-ZsfBEOw}yU1^&Z?>`IaFBJJj`bCjHpZ5i~J_~c3E2S z{7<7lP2@MwZxH!Y=}#5;_4MmS{uKI_3n-4i0{w!>Pw3m&Ycc+_KQ-^OvHD`y0$T0E z2TSqu&kA3k2%)Dc|F_IOoddx9Kh4=W2cSCt|GVtpa(~PGOZIor(|H5u<^DEj;NPoNaTC|{e;N({QGf{@A>y*BH#1xM@7Ep z-w%s?&%YlM`JR72DDpl3en8}V{(Zm5_x$@lk-v(czxRrK&)@G6`JTU*MZV|ncZ+<_ z-|rIny*&O7ihR%i4~YC_9RHmn-}C=FM84<$w~Ktw-)|H7p1pMGgIP89;jdKb?Q+*Z*-hYI^>FY23|5N<`;gHDp W{C`m7d;ULABfmQTx6dNW|NjEnp7mD% literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest new file mode 100644 index 000000000..415969da6 --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest @@ -0,0 +1,11 @@ +$ fq -d pg_heap -o flavour=pgproee13 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 +{ + "lp_flags": "LP_NORMAL", + "lp_len": 121, + "lp_off": 8040 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 121, + "lp_off": 360 +} diff --git a/format/postgres/testdata/flavours/pgproee13/16406 b/format/postgres/testdata/flavours/pgproee13/16406 new file mode 100644 index 0000000000000000000000000000000000000000..01627660b3604d07b3ca118992e0f0199834b865 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest b/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest new file mode 100644 index 000000000..21a26724a --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest @@ -0,0 +1,11 @@ +$ fq -d pg_heap -o flavour=pgproee13 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 8120 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 680 +} diff --git a/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest b/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest new file mode 100644 index 000000000..a2c4fbba3 --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest @@ -0,0 +1,105 @@ +$ fq -d pg_heap -o flavour=pgproee13 ".[0].Tuples[0,-1] | tovalue" 16406 +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "010000000100000076cd00003dfcffff088e15d477880200", + "t_choice": { + "t_datum": { + "datum_len_": 3, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": "10000000510" + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 1 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "0400000001000000718a000081fbffff546f1cd477880200", + "t_choice": { + "t_datum": { + "datum_len_": 158, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": "10000000665" + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 156 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} diff --git a/format/postgres/testdata/flavours/pgproee13/pg_control b/format/postgres/testdata/flavours/pgproee13/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..dd72a1945312e8245c7dbd5dcafaca3828b48896 GIT binary patch literal 8192 zcma#gJoqMi&zmF>R@VUaJT4wK1_($y^d!;jcdAJx<9>!0F+5=M$qhaR0V1|hhreS8r0+n(AF&9*e1C$1dfk68; zBS!`W5DVyXFwMZ|0OWy~XV`%RP$9@H5T2J3skrT}fyIw~2bVWF+&{~+|JI*fO4bjb zZ>kJ9#@u3Q19sp4|EssKwF8xpg3%Bd4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z x5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5EzgU00366FM|L8 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee13/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee13/pg_control.fqtest new file mode 100644 index 000000000..1b9e8c45d --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee13/pg_control.fqtest @@ -0,0 +1,57 @@ +$ fq -d pg_control -o flavour=pgproee13 tovalue pg_control +{ + "MaxConnections": 93, + "backupEndPoint": "0/0", + "backupEndRequired": 0, + "backupStartPoint": "0/0", + "blcksz": 8192, + "catalog_version_no": 202010151, + "checkPoint": "0/2E90A78", + "checkPointCopy": { + "PrevTimeLineID": 1, + "ThisTimeLineID": 1, + "fullPageWrites": 1, + "newestCommitTsXid": 0, + "nextMulti": 5000000000, + "nextMultiOffset": 0, + "nextOid": 24576, + "nextXid": 10000017810, + "oldestActiveXid": 10000017810, + "oldestCommitTsXid": 0, + "oldestMulti": 5000000000, + "oldestMultiDB": 1, + "oldestXid": 10000000491, + "oldestXidDB": 1, + "redo": "0/2E90A28", + "time": "Fri, 05 Aug 2022 07:10:29 UTC" + }, + "crc": 2265363627, + "data_checksum_version": 1, + "float8ByVal": 1, + "floatFormat": 1234567, + "icu_version": "60.3.0.0", + "indexMaxKeys": 32, + "loblksize": 2048, + "maxAlign": 8, + "max_locks_per_xact": 64, + "max_prepared_xacts": 0, + "max_wal_senders": 10, + "max_worker_processes": 8, + "minRecoveryPoint": "0/0", + "minRecoveryPointTLI": 0, + "mock_authentication_nonce": "9e645921b6ed3038f8bec1a78240dfcd0cbfdafcba223be1e7b27950c6038439", + "nameDataLen": 64, + "pg_control_version": "Postgres Pro Enterprise 1300", + "pg_old_version": 4294901760, + "relseg_size": 131072, + "state": "DB_IN_PRODUCTION", + "system_identifier": 7128279481940273503, + "time": "Fri, 05 Aug 2022 07:10:30 UTC", + "toast_max_chunk_size": 1996, + "track_commit_timestamp": 0, + "unloggedLSN": "0/3E8", + "wal_level": "WAL_LEVEL_REPLICA", + "wal_log_hints": 0, + "xlog_blcksz": 8192, + "xlog_seg_size": 16777216 +} diff --git a/format/postgres/testdata/flavours/pgproee14/16396 b/format/postgres/testdata/flavours/pgproee14/16396 new file mode 100644 index 0000000000000000000000000000000000000000..94e33cabff6f9b927431bd2f67e50a12b26bd832 GIT binary patch literal 16384 zcmc)QNsLrQ7zglr!@#h~7M1}9W>|(rKz0z2VHoyxfEgGBQ3S*h5fM-c2@zx!Sw#g@ zL=K+t;K7R~CK#dzmxD1eMiURlr9xCpE20<~|NpM9n%5n#-+Yx+s$TWs*Hy1y^?UF8 zoO5nZ-6zFk4>`9v@rf_LRZ-^>*LWf0{OcLFgnhLBe8x4R`qwgU5ys|m9DV;P#!>5W z>|a42bsG9LsBTZ<7NT8%>d)ab)aC4-MIUuB`)ANc^)I7E^)I1C^)F`JGJM{M)}PL} z`RLE&G5Y?6jH^X|E|1aor!sCj`ZIWpzCW39v)M;G2W>T~Kap{>&@SaT`uuMGc*a%n z7_C1B7u6p{i|U_8i|UV{MfK02MfHc#qWVK7W;+X!(F3xHC7Y_(5O}z_# z2OQJChN|g*y8}R~)Vbi(X6@cu*T1?cg`>O71%Ckg^hf`$d;Z^C4iWA2{3YTSi@&9#^}#i_P?2(!s)r-4?>@Q zS(EPi_n!8?(ri|c==g|7eQ zn0$Y>_#CEx^iSRMKV)#eKTG_H;=heQV$Jm*G%(+vDL%gz=l?;GuAdb6GsGV${)d0* zuK(w~0HsQe3)demyX^cwzOL)<;*DOaOn1S*3u9dW66O8p%IXx3ZnX>kc=YLCQ@;ML zw*rzX(_HX7V~qYA%J(1T_9s9#jiB-2a3@7?;(B>jSrDHINzf>2syd8hR*J#$~ zpY}5U_RTnd&M`j!wG+Rck>6T;gk75L{HNz%B7TXH-%5PGmT0cue|r8c#cyfkw-BH2 z1uW)YBtBouG>4!0v0Z)o6%hBLPTYJ^*6#eY*#D5YtrGud?4NOa#{XmNzX8YD_&ag{ zvaxf-{+S!VxIFU#(zyUJ4zT$mS~`AAq?D%mrW$0OS9h3-b`Pa{w6s zXC8o6`3&d#c1c`}|If!De}BD|-~XQ|@Ecrs|2RYZ9lz?ne;j-aP_87%LkT{^a-9E0 z<@xt|CWmLmn18TI{08Ot`+J-7{g{8SQv9jP?|=V(INy)?2akxqQhEJXJ(Taq`~!xC zdH&0BBcl2K`IjU4e#}3ZEB+A$r&-;enRyTsp(lc4EO zS>)X9JutifT`sCD#s610|0nV1sOf*t6P+u}iwpbDG>q~0cNsULn*ON*Kjt6QiC?8W z|E3y1xx)K~F#mZN*7yJzvqyLri`G22*=3GgT3mSa>EzvJi&VQ^vp2M?Z z%s-eZ{s86uzw^F)Kjt6Qi=Qa(|7Uokmn*!t59_}cV_g63%D=z8Yk=empFe`nv^4sY zlz)F080gIvKC1+uw`KIVArVe<|G&vZw_Hi^92EQ~F-HG}^8L?G@x@Q}J0!@v4nETo z>0eRKf8=vMOZXazi}C-R7^Bakx&DRzWO@F78m@&O^ADaf@+ZptcNqEO#ouP+j}!k1 zBR}R}Y&G)7$owBS@?-wRV@CcknSY~^AM+nJ8u>B*fsf@D``;j0|Mf$$dCC4 zd@W$H{xSc6w`CT7%s;r#$dCC4OiQ(xf6PBvW#q^FgL{qqQn~(@8~NSDUuNWY6@RIb z-$nddBfqowd@X5l{l)wTyp}ZaWB$WJBfo>J{{kbwt@v|{{Fr|*%gB%M_ZlO=Sk`~K bksss#)kc0I^XF^f=GcD<F#i7^jRj=~ literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest new file mode 100644 index 000000000..baef5eebf --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest @@ -0,0 +1,11 @@ +$ fq -d pg_heap -o flavour=pgproee14 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 +{ + "lp_flags": "LP_REDIRECT", + "lp_len": 0, + "lp_off": 83 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 121, + "lp_off": 488 +} diff --git a/format/postgres/testdata/flavours/pgproee14/pg_control b/format/postgres/testdata/flavours/pgproee14/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..b11d3f35cd941281e4427a4bb502b49e208b9ab5 GIT binary patch literal 8192 zcmZ3HJavBk_FYLLtgZpm<9T`57$9Im$)O|=>j&ckMi9LMN`p8s3=;qNj5~x0NMAMu z@qpkHs}@)Tgvam#Di0Tf%ES0Dd!WkU6wKTg%y1!s449e6fGRnFmxm}X#f0P;Z0GweVDs1Rfp2;cp*{g%F0%$nG9FHID$tzf>kpm+6u$Fk{P zFBWaM-Pds18Kj8e|Nmm+2?`+AC>RZa(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c x4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S|6O0RR`TGtU43 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee14/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee14/pg_control.fqtest new file mode 100644 index 000000000..34b9ea48c --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee14/pg_control.fqtest @@ -0,0 +1,57 @@ +$ fq -d pg_control -o flavour=pgproee14 tovalue pg_control +{ + "MaxConnections": 198, + "backupEndPoint": "0/0", + "backupEndRequired": 0, + "backupStartPoint": "0/0", + "blcksz": 8192, + "catalog_version_no": 202203031, + "checkPoint": "0/1A001F8", + "checkPointCopy": { + "PrevTimeLineID": 1, + "ThisTimeLineID": 1, + "fullPageWrites": 1, + "newestCommitTsXid": 0, + "nextMulti": 5000000000, + "nextMultiOffset": 0, + "nextOid": 13779, + "nextXid": 10000000753, + "oldestActiveXid": 10000000753, + "oldestCommitTsXid": 0, + "oldestMulti": 5000000000, + "oldestMultiDB": 1, + "oldestXid": 10000000744, + "oldestXidDB": 1, + "redo": "0/1A001A8", + "time": "Mon, 04 Jul 2022 05:03:12 UTC" + }, + "crc": 546321267, + "data_checksum_version": 1, + "float8ByVal": 1, + "floatFormat": 1234567, + "icu_version": "67.1.0.0", + "indexMaxKeys": 32, + "loblksize": 2048, + "maxAlign": 8, + "max_locks_per_xact": 64, + "max_prepared_xacts": 0, + "max_wal_senders": 10, + "max_worker_processes": 8, + "minRecoveryPoint": "0/0", + "minRecoveryPointTLI": 0, + "mock_authentication_nonce": "ddf2b7da2f4a5cac5dcee93421d6a803d6a08dabff417697f5d172b0db8e80cb", + "nameDataLen": 64, + "pg_control_version": "Postgres Pro Enterprise 1300", + "pg_old_version": 4294901760, + "relseg_size": 131072, + "state": "DB_IN_PRODUCTION", + "system_identifier": 7114200320151217064, + "time": "Mon, 04 Jul 2022 05:03:12 UTC", + "toast_max_chunk_size": 1996, + "track_commit_timestamp": 0, + "unloggedLSN": "0/3E8", + "wal_level": "WAL_LEVEL_REPLICA", + "wal_log_hints": 0, + "xlog_blcksz": 8192, + "xlog_seg_size": 16777216 +} diff --git a/format/postgres/testdata/flavours/postgres11/16396 b/format/postgres/testdata/flavours/postgres11/16396 new file mode 100644 index 0000000000000000000000000000000000000000..048604808415edea92ebe9d2c861673b1ea761ca GIT binary patch literal 16384 zcmc)QNo-YB7zglkA7!2?L!nYznF?*0WGq8p`#MoNK^OiW~F*yu)$E8{{o#)Jj#9CD3{(OCcAz5nxiZx^^a{cdvd-FMpN*K>z=hyO9g zn9iF$qfpF&z+_BmL22b>W9<8(F=&k@FgwufmC$TOHK_Kz(Cox|yL`ra7PSS ztC970u#RRgqoUbMsA%?LXtv4Uq1w06hnADye+%nq9awLb&u@mN9<>S0STuaL7w|i1 zb|5qj(vRAVYR`veyL?8qZ-k~z)=};2p{bK~RC^A8i&iVYe>OCo(vNCiL%%eO{(e+6 z+lPu~UqwZ;ub`sYmr>E|8B{cT8Wqi+LPfJLp`zIrQPJ!RsM2n;+?bR8Vb&Db%+ew= z3ElV)&CMCcd{pXTAuIbjxpW!$_9Q78Co}?2$iz zqF=w`>9oI%ei8kQXaC?6X}_6%1^w?m`~ADqeiQu#^uNGC;B)`?cBcJC`f@`e$KSPI z{GR{aZE3%O{!;qqL%)7CzUY(JU|fGc%ajdWe~*vzyZtLxrN^J+`0wEO5B=?T{3puO zejWY0>F@i)uOH4!`?d7f(=YOT|D}EZcN*9C>b`%77-#>H$l1tv4T2sIwRbo>1N8}4tSze&ljreCe(Z=kf3l3^`M-kx3b-2na{9}a{7U+jO8zqX%ar_b`f^*O zvHzFQU!vqMroULpUqpYAl3zx@Ovx{yU!vsCr$1lGFQ#9tn+5KTFA*RveR(aU;Rp1^9tj_e`RefgDF5$f{(tU@ zi8FZQ|53(|D*3<5{w2Sc99^=1$>?3~f4j`z<^55fkIX-sFTl)SGJKh5Aeq0+1#o$P zl*uPDf64nL>zABAnqz>BUvhq#3m{p)a(>DDUG|^M{3YK{oNf`F;O= zbpTL)kvTQ7pGBW+|08%2?{ok6_5;Z;0p`xc{t5Jne+m;JeEOUF@^~b={P7<8InVq5 zyEAFuCW+|C;CVe6y}|CZLDrvDQrV);D( z%XX%HH~;M!`h|E9@#zm{)4t1p8|m-%eEe%)|E~@kzsuicT8^CmT|fIh|Gt%pe)%Q9 zeO-L~A4H${yFAbT*dh;F`6bBb&yS-|{2TxJ9e+Ci4a^qa|DU8U|C-O^f4J}R=i^Gg z%b%Z9@;7q(%Vk;izbwAD|Ij^nbpM^r1Vi`VBjJk?&wmJv%fFvR-$;!=>AU<{rsZk) zE`NSf$#?m)ObgT)zsr9QEBRGC|Kzq%WBe8LA5rpM{(MNuclqzDvn>`FFRH@A7YXEY(5F!LZ?+{w(5L)OENa!sABve6)2qGd#Q4~W{ zq-X#|UWx`43pF4QposVR&g^qsuJ1qa{_@o1=Xi1bA`9ubd-LIfc)7UFnB z5+WKAj1WZH0vwNsMT8;(5b5)AJR%+ug$P1q%){}BBt$eK7$JzXL>!NZMT8;(5a|gx z9ubd-LIfc)=Hhrn62g7`=vAUfChsSdlK6|0y-4Zo_}M}HeNALe7P!HI8J!pU$qn)w zjn8I$Q~Y;(9+5MF>TixJHF26<^LV|wbXu_0Ff0qnPpYA{r@AMLirCrERqfV6ZBl$zf67&wcnzQ zBbjkBY5UaQBLBMa?%Qtv?>;LMoJ(Y4l;(4d{A%Nog69joE%GgXnBb@Wd-AJ{ciVR3 zw{s$E?)!XC>#6^i{7U29`f&aFej*#tKX2XC{I8QwHXdE>`S_1CpK3X@{fp$2sQtZN z965>p*_op4e?xwS@wR^cigu*w-#*{MbL!K`FE`%SPre^TK7@%}uKp7FWyah74BsVE z2q&{@hx!ZTml|*Dzu6>_Tlajvxbf=GlV3vlbbTmNE5ql@GgST8jKPX^gLuE%SKwe}?=*%IAkjk#m_v0{;&1{8!``7;pPOCc%-={36xn zYd)vQ&!_ww|0dEJW__cUFP|@QnznzIe4_ET|GVPfyCAs-ZPb58 zKEZf|XyL zCqL78TW|S0II=FENNPq7&z~eegYxP7tH}9>KHr?OnvXly+?U&b?rS>bv!RqDH*qmO zeUi;&pPoh3?;}6Kczb<^V*Z?l`Lotm&Hn)T@znm+9wLc3v3EVD{v-0^ zjJM}Iv$e>z7e1fwh5C=l#~N?P@4U&5eENsa7m`==|A72hYCpWGBk#HW^SQQvg!~xe z?R-^v0oF#W@h|SF-$H)0@pimy!&r~Q{I=$=tX_S-Pkxl~wm-v1I8p}JH}AXJ{#NoM zjYqRyedg-q$aVbCwV?Xl`60&J{zV(h9P8EZB|p&kf5zi3kr+&7U$0dE zF8KlEvt@JSEb8spBK5n-M;mYJGaB>TY}E7i81?Uv?{B=_zby`PWDNSJ$yD_l$oDhe z)^q7rBI)>Lubk0(ew%z>erC(O!@r0N92PiKHswx^>2{xWW241+08{dV13#2 zv-&yYJ5v4$e~K)^{v`g8zc+twBp+qGdp_><3aF0SM?LJmsO`@p-+|iy1D_vjpnq1Z z*Y?+uZ*ROEUo(G4`&h4c9@O^Nl8-drj<5dZMc&25c>a$16!PuJzX%n{j`7}YtNPXC z+Zu1rx8fqKU6|~?n5%v^`PYoM^-vb;Z$8vpm+gAKtH?)C`|k~PINz}$+WvC#VaD6} zDj4;A8uiw_mA1c_d@JMKx7}-2W(vkU_8Z#*)UP1_D(Amgq#WuYDN6k!@-2(Px^ zM`Eykwe(lNjC>2@?e#r}{f6M2w^UO(?`7wcrpDX)FND4Ss~ErU{-u6C`6iVAOYFxM zWBh(|Tm4k>jg7bU_Og*9Iq}PDk5r#Xz7e%wqnpTG_&k@@k0;-deDz@5i^BEFQe6Ew z@(sxQ^%2>I{l71-dUvnozHI-57;pQhHrC(f*gr>}RX?44edBFCKdmd0frGcsQXfyg zp7HMQbAQLe!H#r7{y*4B()z!}=U)y+F zKPTs6KZEhLHc9;$^0kb&^;~fy#v{&S#G@?U{6B+yu<^D(k5mx(1pWWk0&Ra9`I^St z@z^o1BQvnxg~X{JM!p8+zZ>)CZd{C?_Gvy-$XBO)K7Az8{gKbNw2QVMN4}czw*O;r zziWD+NV^v5N0P5f`5(gmBpvhH(=^Rz6!|K~+xqGBL}U=gWcM5DW64)G-d?Y6g|Qz) z`y>4|p9$nE8E^al(sq#w$iGB+^&`kvq=P zO8r>!<&AgWc5@2GeliI2&)OI2`;sqbyzT!sxWD?`J>RnG2a+#qyzQU$^D+0p449yP zDEU{6xBb(!oFiMX{^s7Pel+gqwxIcsSG{>*%`;!l%e0tBry+(}p?;_O4kS}dK zy4>rZR?9^0W4-X-sD3#4QpVfyQgc1#6wFs0K2kq`d`W7*=SY11#e9CHkNSS(OBnCI z?e>x1W0ChU_^UQm--<86Ny>*vS{+%H|WE3-F03?^TU^1r`Xq!s3$$BVT6w&aUa z`(be+`|&)Y*Gz4H5cwj;+x2MXLaZ&gUe9N1`+dk4Hs03T+Dh2V zN+hUnM?SCdw*MDnJzb5@%L(TCb|;_5c=v6$=2oTRc^2~d?0ap$2l?E_+xa2Wd66X4 z{~LGJcO#$6cssrd#*0kG!ELUnk077Zcw29yuVBxLdTu;LeHZdMsQux%w(U@#F(=f& zMn1dowtqfuAo38Oe=kl|-;sPac#B9&6yMM!^&QA(HQrvYiG$&BfBUxS|JLOF zsr~mWi!{dlw7&;y`|ZhRG2ZrP3i3aL{duNY>LbZ#Hr|ex1}$(e0r#J)%uydsJ`=V7 z@DGtkFf#_KZ$sXX+CMwYkudDHdreXwM&2>rj>m~b9Z5m{2YaYT3Ch)CO}(T3_xvBv zumAV_|Nr&*|4etH!%No(=bz{QcKqF&htDh6FWf&6<*m=7$!|3EZs*JVqwzcq^UXRx z^#jRoFy77|OEW}@VLdFnse{*k7xL?kxASH3Uf5sYepQYj^^xS)8E@ymoZpEw$9!4x zMtiUQ2=Z&G{pO=E*JJ*8uuXk4@+p*m@%otWkx$>M>O;t{G2YGxsV7C6BDqK3MSA&E zCI7ndw*MRM!}^K-{31Yo3G%DSm+FtX4D)N1Y3;oB^OIj?yzQT{V;uP#>+Q{I>hqCb zX}nz@%H#7yC71=p)aN9hY`imL1F5T zkY8lH9bdEYd2~JYcb7J|@$%V6exdQU{}nBFpNCSe zwf1~6`T3Op3FIGz`DE8_^$W?*qkJ~^aO5zq*QCzs=aWyQ_KV^E@iX|n)z!z5PoVa{ zzl`-5`>%#G!o2*)ke_S39gmCu#CI>;`Yfe>DET?YyKlQSbfz=z&tZJs`l^-J{vh)9 z`M<5tkOjC0j?aHJcdPG8-ah}g`K-nB>PY;a?8VfFk+;wP-C^qH)33fG_b^^A%zo9& zCzQN>{_no+`ZY1QKMMbINA=Cf&!F?2HeTca{I5;b2a}&pe!!a|4RG=UjPwQJYP=mU?V=p%ixWAT(ZXxL2>B_-+woExpD!E2WJ*<^o&03u z?fka1h9j#mKR2qX-u-Tu`?B*}9OZuv`}a-m_v0RidilI?FZ{p!B;)P%{k^OsrLlkf ze69M&MUMn|xJrj9}lL>98{x10m#@q28+#cU8L%m&p+T6?M2lC@7|F{RZ|Ab-+ z*`@vp`Eka(-QeakG>ao&;+K6?EciJZp# z^U8{*p5IG;jPdq*1^PSE2H#)EHB9|Z@}nvLDUpsOBcGS0)o&m_irNqEjC*Hzet7JS zCSE=($&VyIrGg{jn1513)hCf3LHUf#kNfwSKLabNUqpVm@$TDh{};ydlRD_!E#Eix z@<}8=%y`?MKOz5e*e_i@sD3i}p~l;K3%ZE&Mg6DWYUH&)o_vh)ww~YKi?MiAU|#jj$qz98pL(v2@r#phb)$ioPY8MY{NJ`8g3pU|&vQ~xZ<9~f_wsq} zo)}(szU^te&HrI-k&?K7wv*M4vEZH>3}pBtammcdLNqdtQC zYsTB_^+q_JpJ2WC<)a#2`>&FZFy7WrZ#+NAi(mF?qWbFO+fY7@@crd_7+-t#R`=Sk zOg^02e{@U4{Z7+~#p+9uZ*9Eo|I*n1pUflDsF3=i-x{}{f=-v?>hIH z`upVV^MBi)zwW{Jzc8OSid6p{d4B$%kc?-yxL$t8s(AUNk#Azo*XEys=Us_dzrJjy z{yh1{#@qU=ACK?j1mf=@g47=--^h4d|5Lj=vH|N$iLsTvd=8LrXuSKj+dna<@cbF| z)3UYt_sKUf-d^8L_afEHI29RziXx=BT)|>QY(7>IiGwD<88h59wIUl=W;bc{WS8`jko>30_&Zh+kOf4 zapbERZ_hVdZ(J|zXOf>)@bVc;zN+!I9&(n!-z%X1b01VcihLEyC#Ev~eg)>6b?W<* zuWY>gwtEi6u|LUz>y@pz`rhO#8E@x@1U%pFfs?8AsJxedSMn8&xBWjg3Hu++KUems zZ%4iY$346V|CONZvmG zxAkA^0Pcn3{!+%8SG@e)wcCBU|L$H<`~2Vbe{!fJd$Aw5&_jJz^7i?^t>-~_R@wk_ z*2lTjXCZH&|J(j~6VE5J;u_rhql}l2ANdmId~N$jw&UJ5?uQTmUi}MA{Ga@b8*i^~ zZ~`}^gQzwdTwul?iX3sF8J6CJsYiNyKlQS+N&+*H_W%K4yzwaKDY6%bz^I|$R5;BNPG4D$>%cO*4y;{xW9z+9k;Ex zmrqCXIgPjD_xI`eegW3&Iy;JaK8$=0<88fd48wed{dud(>Kl^JZoIv|0o5F-fc#G# zDeARfi+ncY-C^yXuYVDIp9u5S+JWk;kk3l_p9<9b+pUAt7bfpd?Z@Kp36^4iTR5hO zmrp+OS&VnzcJtYT{2!qH=N3@!b59H}Jq&+KYrO5BYFK~WzsIT_Uf65@1^G=-L9Cl!RsdQKWp6|a! CeRKB! literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres11/16406_1.fqtest b/format/postgres/testdata/flavours/postgres11/16406_1.fqtest new file mode 100644 index 000000000..fb6cd9ed1 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres11/16406_1.fqtest @@ -0,0 +1,11 @@ +$ fq -d pg_heap -o flavour=postgres11 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 8144 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 656 +} diff --git a/format/postgres/testdata/flavours/postgres11/16406_2.fqtest b/format/postgres/testdata/flavours/postgres11/16406_2.fqtest new file mode 100644 index 000000000..aae9ce058 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres11/16406_2.fqtest @@ -0,0 +1,105 @@ +$ fq -d pg_heap -o flavour=postgres11 ".[0].Tuples[0,-1] | tovalue" 16406 +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "07000000010000007419010097f5ffffb55804f053880200", + "t_choice": { + "t_datum": { + "datum_len_": 581, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": 581 + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 1 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "0900000001000000feda000081050000e36412f053880200", + "t_choice": { + "t_datum": { + "datum_len_": 739, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": 739 + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 157 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} diff --git a/format/postgres/testdata/flavours/postgres11/pg_control b/format/postgres/testdata/flavours/postgres11/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..2036a63df2b66f59f25374db7e63896f6a60c105 GIT binary patch literal 8192 zcmeylcc?H8ALZgX+|I$hC$*@3xGrdL=4Dc zFl0i=gVe#y0m*>?SUr#i$q@@+YF_|d!U5If0HtAk5V!rBkt2fwhy`>6m}X#f0P;Z0 zGweVDsF)FISpSs+iaUCrhvvD*+%?^pKEYG_YR7@+6DK6Udoycy&ZfRL7k_D>j!`fg z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* aAut*OqaiRF0;3@?8UmvsFd70wA_M>nBPVzO literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres11/pg_control.fqtest b/format/postgres/testdata/flavours/postgres11/pg_control.fqtest new file mode 100644 index 000000000..1ea20a316 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres11/pg_control.fqtest @@ -0,0 +1,56 @@ +$ fq -d pg_control -o flavour=postgres11 tovalue pg_control +{ + "MaxConnections": 1000, + "backupEndPoint": "0/0", + "backupEndRequired": 0, + "backupStartPoint": "0/0", + "blcksz": 8192, + "catalog_version_no": 201809051, + "checkPoint": "0/36A2DB8", + "checkPointCopy": { + "PrevTimeLineID": 1, + "ThisTimeLineID": 1, + "fullPageWrites": 1, + "newestCommitTsXid": 0, + "nextMulti": 1, + "nextMultiOffset": 0, + "nextOid": 24576, + "nextXid": 41090, + "nextXidEpoch": 0, + "oldestActiveXid": 41090, + "oldestCommitTsXid": 0, + "oldestMulti": 1, + "oldestMultiDB": 1, + "oldestXid": 561, + "oldestXidDB": 1, + "redo": "0/36A2D80", + "time": "Wed, 03 Aug 2022 12:16:33 UTC" + }, + "crc": 458179718, + "data_checksum_version": 0, + "float4ByVal": 1, + "float8ByVal": 1, + "floatFormat": 1234567, + "indexMaxKeys": 32, + "loblksize": 2048, + "maxAlign": 8, + "max_locks_per_xact": 64, + "max_prepared_xacts": 0, + "max_worker_processes": 8, + "minRecoveryPoint": "0/0", + "minRecoveryPointTLI": 0, + "mock_authentication_nonce": "8fd4c021b88de7556e475cdd35b16790492bd588c0e7919063eeec9abb6cb28e", + "nameDataLen": 64, + "pg_control_version": 1100, + "relseg_size": 131072, + "state": "DB_IN_PRODUCTION", + "system_identifier": 7121744337699454457, + "time": "Wed, 03 Aug 2022 12:16:33 UTC", + "toast_max_chunk_size": 1996, + "track_commit_timestamp": 0, + "unloggedLSN": "0/1", + "wal_level": "WAL_LEVEL_REPLICA", + "wal_log_hints": 0, + "xlog_blcksz": 8192, + "xlog_seg_size": 16777216 +} diff --git a/format/postgres/testdata/flavours/postgres12/16396 b/format/postgres/testdata/flavours/postgres12/16396 new file mode 100644 index 0000000000000000000000000000000000000000..04e5905893eef10c965c0ae024ef24b017f6e26f GIT binary patch literal 16384 zcmc)RS!`8B7zgn0l(O$-X+e-u_O~o_pqxh)CJC zGc80CS)WLeloyv{O5EvGW?^n7y5QKIN=4A!$yDZJZW-rs?B2vYx_cv)#hgQRCsJ9& zV^sHgDs?d)Df%4FVeF2kvYf}L?g;)2x@$m1cZX5Y7vR_3AsnN-gQ)24Mf8_&jP4Gg z@5V8zV7~C0>_rnRLfARv>%6 zzj5Q;@(4{?Yrn%s`WMl%Lj3y6Fy{I{YbO$O{UskNtff}GKM-U37q7;B{p;UWSj!Ue z{z#1JUn_~b{`1Eb*0Nl@KNe&9Z$*CnYmO+arCPk-8)N#7_)pC9Kej<(Ez89FZ84^Q zpjBLd!$F0$EEVsM!kGTof5yH3j_*@g%VP0$tD~ zw>uTqvQWG~3}gBqM?U|Do>N%M0`dM-jOkbX68H6=xLsi_^TqpZFs5G``RBj#afP+a z6YuxLnEsBxGy~0}Ni1$ZhO#kZ7as87k6xK3RypJ2Qf`2{o_1~g4@7Jh*tNPV{ z#a;jTxp{xK`lae$jQsw0Zg}3WQolm|&;N+K{yn_WXwqhhKmSFTbKTiE|M*bM}#~AsQ>Q@^1Bh(*Z<^7{lP~5AoT|s`2*A+VC45#zrT@Ru70_Z-%tI1Mt)!Q`x^Ou)bC^D_fo%?k>5l8 z9!7pQ^}8AQCFu;}qdn3P{`grVV zvi{cUf zIYwp1A!GuW0|=RbLLQ(=7JxYb<^u{@0Pg)W2f+P(%>!gv0L=juvIEEhFdM);z<*@{ zYIFO~iL4U;{CBCI{~xgt6Z842wSWBsUV)({$c^~*KZq%uA=z0Hcm0hw`St40R{w0| z*Zn7 z5BZNf)o+6v@t8k6T{L5tq-LjV8`-u0S#vJ_yJcx+-{&R&0n$LeES^nc$%;_&Rs~_?o&lve3f3d^J z5BZDjMt;aYJYnRA{J~ZuKkWZMX5@$c|3{7d(fa)95hH(;`VSlVBh`P%$Pf94O-BAO zUH=0{e#k%EZ{&yk!3HBg?EkMf@+c5dj6Lg`5}L?#K`ZY o>tAf-hy1~OBfqV#f1Z)wMt%OXAd8>BkUyw4@{4r+vzp2O7tLUIGynhq literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres12/16396_1.fqtest b/format/postgres/testdata/flavours/postgres12/16396_1.fqtest new file mode 100644 index 000000000..274429290 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres12/16396_1.fqtest @@ -0,0 +1,11 @@ +$ fq -d pg_heap -o flavour=postgres12 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 +{ + "lp_flags": "LP_NORMAL", + "lp_len": 121, + "lp_off": 8064 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 121, + "lp_off": 512 +} diff --git a/format/postgres/testdata/flavours/postgres12/16406 b/format/postgres/testdata/flavours/postgres12/16406 new file mode 100644 index 0000000000000000000000000000000000000000..7c6ebb5181da15e5c07cfe7b429e023bd1ff07aa GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres12/16406_1.fqtest b/format/postgres/testdata/flavours/postgres12/16406_1.fqtest new file mode 100644 index 000000000..91bd7137b --- /dev/null +++ b/format/postgres/testdata/flavours/postgres12/16406_1.fqtest @@ -0,0 +1,11 @@ +$ fq -d pg_heap -o flavour=postgres12 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 8144 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 656 +} diff --git a/format/postgres/testdata/flavours/postgres12/16406_2.fqtest b/format/postgres/testdata/flavours/postgres12/16406_2.fqtest new file mode 100644 index 000000000..ef1f5fe35 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres12/16406_2.fqtest @@ -0,0 +1,105 @@ +$ fq -d pg_heap -o flavour=postgres12 ".[0].Tuples[0,-1] | tovalue" 16406 +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "0100000001000000df60000041090000c772ccc34f880200", + "t_choice": { + "t_datum": { + "datum_len_": 499, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": 499 + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 1 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "0a00000001000000d68c00009d0d0000b275d1c34f880200", + "t_choice": { + "t_datum": { + "datum_len_": 661, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": 661 + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 157 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} diff --git a/format/postgres/testdata/flavours/postgres12/pg_control b/format/postgres/testdata/flavours/postgres12/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..441225ad3495d685e0c293cd27471e5c403983f7 GIT binary patch literal 8192 zcmeIuD+>Za5C`x*pNEKGFyCSD0b;O=CtA&NP0nf+!K6X_3`T=Nn;Nv41+$g|1%r=d zx$ca+hs|vG5A4qDFgxM5dQ_UW@pP6UA>6ATj|dsv?9<_DJDmkN4^-Bu_7C^VJH9De zvd`t22K*V$9HWffCtu%x_s@2}`#bx)_>WGbF*Ri9c8zb!}zW@LL literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres12/pg_control.fqtest b/format/postgres/testdata/flavours/postgres12/pg_control.fqtest new file mode 100644 index 000000000..86fbb5cce --- /dev/null +++ b/format/postgres/testdata/flavours/postgres12/pg_control.fqtest @@ -0,0 +1,56 @@ +$ fq -d pg_control -o flavour=postgres12 tovalue pg_control +{ + "MaxConnections": 1000, + "backupEndPoint": "0/0", + "backupEndRequired": 0, + "backupStartPoint": "0/0", + "blcksz": 8192, + "catalog_version_no": 201909212, + "checkPoint": "0/3A5A1B8", + "checkPointCopy": { + "PrevTimeLineID": 1, + "ThisTimeLineID": 1, + "fullPageWrites": 1, + "newestCommitTsXid": 0, + "nextFullXid": "0:48957", + "nextMulti": 1, + "nextMultiOffset": 0, + "nextOid": 24576, + "oldestActiveXid": 48957, + "oldestCommitTsXid": 0, + "oldestMulti": 1, + "oldestMultiDB": 1, + "oldestXid": 479, + "oldestXidDB": 1, + "redo": "0/3A5A180", + "time": "Wed, 03 Aug 2022 07:40:53 UTC" + }, + "crc": 249001740, + "data_checksum_version": 0, + "float4ByVal": 1, + "float8ByVal": 1, + "floatFormat": 1234567, + "indexMaxKeys": 32, + "loblksize": 2048, + "maxAlign": 8, + "max_locks_per_xact": 64, + "max_prepared_xacts": 0, + "max_wal_senders": 10, + "max_worker_processes": 8, + "minRecoveryPoint": "0/0", + "minRecoveryPointTLI": 0, + "mock_authentication_nonce": "63401528f0e744aac9a9f56c7a4d435929f511dce0812c222eb7b399051faad6", + "nameDataLen": 64, + "pg_control_version": 1201, + "relseg_size": 131072, + "state": "DB_IN_PRODUCTION", + "system_identifier": 7127543828843588018, + "time": "Wed, 03 Aug 2022 07:44:53 UTC", + "toast_max_chunk_size": 1996, + "track_commit_timestamp": 0, + "unloggedLSN": "0/3E8", + "wal_level": "WAL_LEVEL_REPLICA", + "wal_log_hints": 0, + "xlog_blcksz": 8192, + "xlog_seg_size": 16777216 +} diff --git a/format/postgres/testdata/flavours/postgres13/16396 b/format/postgres/testdata/flavours/postgres13/16396 new file mode 100644 index 0000000000000000000000000000000000000000..171ccdb0a948313d312b8ee0b0d4a36c4773a5b1 GIT binary patch literal 16384 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 aE_NTE|ABe;v-=&L2jSiqi-A3%%?&C literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres13/16407_1.fqtest b/format/postgres/testdata/flavours/postgres13/16407_1.fqtest new file mode 100644 index 000000000..3da9e897d --- /dev/null +++ b/format/postgres/testdata/flavours/postgres13/16407_1.fqtest @@ -0,0 +1,16 @@ +$ fq -d pg_heap -o flavour=postgres13 ".[0].PageHeaderData.pd_linp[0, 1, -1] | tovalue" 16407 +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 8144 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 8096 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 48, + "lp_off": 656 +} diff --git a/format/postgres/testdata/flavours/postgres13/16407_2.fqtest b/format/postgres/testdata/flavours/postgres13/16407_2.fqtest new file mode 100644 index 000000000..7e9235918 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres13/16407_2.fqtest @@ -0,0 +1,105 @@ +$ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | tovalue" 16407 +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "060000000100000091220000141000008f939dc268880200", + "t_choice": { + "t_datum": { + "datum_len_": 509, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": 509 + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 1 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 1, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 0, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "0900000001000000ce39000086130000159eb7c268880200", + "t_choice": { + "t_datum": { + "datum_len_": 665, + "datum_typeid": 3, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 3, + "t_xvac": 3 + }, + "t_xmax": 0, + "t_xmin": 665 + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 157 + }, + "t_hoff": 24, + "t_infomask": 2305, + "t_infomask2": 6 +} diff --git a/format/postgres/testdata/flavours/postgres13/pg_control b/format/postgres/testdata/flavours/postgres13/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..5db795fe74b8c0ae1c05a30b4a68dd1147549166 GIT binary patch literal 8192 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 gcslw|g{P(eM0gtdkA8BZuuDexS#X;T({0S zSJbYk(YYjdB+0jMsmZDM$mQefsnA$xG&C5R42^?ELW7`DP&L#as)S}jMNkP;4Anw4 zP&VY(9&$N|rBE(337Q5upX9O-dqZQOq0kU$4wMHChpM1q&Hi zB0~NVM94pk2>BI=kbejf^2-q+{~#jdA3%hB10v*?AwqsBBINH!g#3MokY9ob`Fjx| ze-9$$>k%Qp7!mS|5Fx)15%PBkbe{T&!23Y ze^F1(uO|OA@_&8bcK$6}rQ3fx`PY!Y-#GszKVAUR@u$i~-2Ju4EY_&e*!OHmi+osJ^n_MkJpYw{!ii{V9Ea|UGqng ze=7N}VI#KW@9(VJznJ{9$X|WXw*8-ZQ0G6A{8Pw39J9@T*8t5gBL7VCvv%9&-}Qi= zeCdx?}CNMvj1nS*Zd*mr;?v-{QkSVzaD>s$!|&iE4ysR z-;O%XA4Gm@^3OTfw*9w!r`P{D`LT)7{+EL8vF!iS4Vs@%zMQ>8YmN8cm1UYgko=zH z|6+Xp$l0sMe;)alkU!V>{i9PW&Cewt+is%$Z#BOE{^@lg9e)P6==^;PK9c@__cz=5 z7rR~a`;(7rmju7qc>F!PTep7>`M7pY@Q?mtoB!IF9{>Hwzmoio#`#ZdcK+*2{#E1` z8lOKV&C~s#O+J?0MEe&Q^Xu~T`7eun*%f5`x5A5%<@)09AgKuu z-(5U^@y?|tKsSK#G{w`g5c{*9fA1#;?awD zFSP^W{bxW@6CgDNQfDAF1X3p;wFlzeOU;4!{8FPJbqnI@OYMNvFGwwb)Cfo|g48ZZ z%|bRLf1A`Ji05B|_M>lfV8) z+x(N&`>(8ZQU00aR~p~{Zf~pe5B_@@`HvabADr9R^!zRBZj}F6@;iQH+y40*H9z?8 zCFD2kvE_H@qT4_C?|sPs3Kt=k`|k&+l$ z`OmUvN8@ig`3*Q2S@KUA)b#u<=aq;*nEbDe*T0?0|C94d#IGj5%=rFsUbFo#_}|0G z?{3V0FQ(^T@V~RkZ)x2B6)Bn@{O@A&W5)jPTR-XX7yR!y`5TS>&m`aU{zJ~_(fBJM zf3ETUbIUfm{e%BKiTt;}v0eYSRA_$izvq&_=a4PmH{1V%|2>QRjmGz%DSh?&AN=nk z@^g*re_oic+duf%eMVDWodr!zx$Ct%sBsD^}79o|6N1=x}CQ9znG-wfAGIE z$X{!`{`IKU>tFD{bICt!eEwLrNArXKJ%#-9cG$Lm?orJT{`W}o=Nad}eVrbE!T;WX z1xViiUozf*Vs~hM@W1n!|8V2^@74XM+&@M8-)Qm|8`mFv)>^MW!T-)7KZZg8%kyvi z)28>Ia<3NUKRM)oz;^r>7VG{G{`YwDkNjcFFTYLCzuUp21(^L=#w!T+u#f2Ohj(V;=}ga18%{1=Sde|KE-ga2Jc{(j^0 zXZJn2|AYTsNWL@n-_kni{Dc2pPJWW{{brU`XBKmqV>0q{87gB zSM_al{|Enj2>I#8_4gm%tNFqI<f<{r^we>+u)-@7d(vYP|kjzFzZ#|2>raYUBHt zs-1fL2mgB-`A;KSoub$;RuS_P>){Px{~U$VV{k|K|L3^5>i&erNJ0{73x10rF8$<^TWy literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres14/33233_1.fqtest b/format/postgres/testdata/flavours/postgres14/33233_1.fqtest new file mode 100644 index 000000000..5dc01d9f2 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres14/33233_1.fqtest @@ -0,0 +1,16 @@ +$ fq -d pg_heap -o flavour=postgres14 ".[0].PageHeaderData.pd_linp[0, 1, -1] | tovalue" 33233 +{ + "lp_flags": "LP_REDIRECT", + "lp_len": 0, + "lp_off": 77 +} +{ + "lp_flags": "LP_REDIRECT", + "lp_len": 0, + "lp_off": 106 +} +{ + "lp_flags": "LP_NORMAL", + "lp_len": 121, + "lp_off": 640 +} diff --git a/format/postgres/testdata/flavours/postgres14/33233_2.fqtest b/format/postgres/testdata/flavours/postgres14/33233_2.fqtest new file mode 100644 index 000000000..430cdf6ff --- /dev/null +++ b/format/postgres/testdata/flavours/postgres14/33233_2.fqtest @@ -0,0 +1,105 @@ +$ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0,-1] | tovalue" 33233 +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 0, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 1, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 0, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 0 + }, + "t_bits": "150000000100000000000000ab202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020", + "t_choice": { + "t_datum": { + "datum_len_": 1577094, + "datum_typeid": 15, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 15, + "t_xvac": 15 + }, + "t_xmax": 0, + "t_xmin": 1577094 + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 21 + }, + "t_hoff": 24, + "t_infomask": 2306, + "t_infomask2": 4 +} +{ + "Infomask": { + "HEAP_COMBOCID": 0, + "HEAP_HASEXTERNAL": 0, + "HEAP_HASNULL": 0, + "HEAP_HASOID_OLD": 0, + "HEAP_HASVARWIDTH": 1, + "HEAP_LOCK_MASK": 0, + "HEAP_MOVED": 0, + "HEAP_MOVED_IN": 0, + "HEAP_MOVED_OFF": 0, + "HEAP_UPDATED": 1, + "HEAP_XMAX_COMMITTED": 0, + "HEAP_XMAX_EXCL_LOCK": 0, + "HEAP_XMAX_INVALID": 1, + "HEAP_XMAX_IS_MULTI": 0, + "HEAP_XMAX_KEYSHR_LOCK": 0, + "HEAP_XMAX_LOCK_ONLY": 0, + "HEAP_XMAX_SHR_LOCK": 0, + "HEAP_XMIN_COMMITTED": 1, + "HEAP_XMIN_FROZEN": 0, + "HEAP_XMIN_INVALID": 0 + }, + "Infomask2": { + "HEAP_HOT_UPDATED": 0, + "HEAP_KEYS_UPDATED": 0, + "HEAP_ONLY_TUPLE": 1 + }, + "t_bits": "210000000100000053fdffffab202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020", + "t_choice": { + "t_datum": { + "datum_len_": 1857686, + "datum_typeid": 0, + "datum_typmod": 0 + }, + "t_heap": { + "t_field3": { + "t_cid": 0, + "t_xvac": 0 + }, + "t_xmax": 0, + "t_xmin": 1857686 + } + }, + "t_ctid": { + "ip_blkid": 0, + "ip_posid": 120 + }, + "t_hoff": 24, + "t_infomask": 10498, + "t_infomask2": 32772 +} diff --git a/format/postgres/testdata/flavours/postgres14/pg_control b/format/postgres/testdata/flavours/postgres14/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..8306f77d0d108d15b02cf0d8f9119007afd3f99b GIT binary patch literal 8192 zcmd0JewTG~$L2&4Rt5&$m)tyT3=rV9@K6$nb)e(gEM%Gy$bn&yxc6!q5XEq}5h4y^ zUt>b30jUK6n0XK$f_%Y@U=w1&%t`?&>)&fzbiT z12NCA0|}r)m{|<2e^ctNTn=t3<=TF2-@#es>x*_h;4f6 z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O bqaiRF0;3@?8UmvsFd71*Aut*OgE|BN2%ajZ literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres14/pg_control.fqtest b/format/postgres/testdata/flavours/postgres14/pg_control.fqtest new file mode 100644 index 000000000..565095a91 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres14/pg_control.fqtest @@ -0,0 +1,55 @@ +$ fq -d pg_control -o flavour=postgres14 tovalue pg_control +{ + "MaxConnections": 100, + "backupEndPoint": "0/0", + "backupEndRequired": 0, + "backupStartPoint": "0/0", + "blcksz": 8192, + "catalog_version_no": 202107181, + "checkPoint": "0/9AD688C0", + "checkPointCopy": { + "PrevTimeLineID": 1, + "ThisTimeLineID": 1, + "fullPageWrites": 1, + "newestCommitTsXid": 0, + "nextMulti": 1, + "nextMultiOffset": 0, + "nextOid": 33245, + "nextXid": 1878859, + "oldestActiveXid": 0, + "oldestCommitTsXid": 0, + "oldestMulti": 1, + "oldestMultiDB": 1, + "oldestXid": 726, + "oldestXidDB": 1, + "redo": "0/9AD688C0", + "time": "Mon, 04 Jul 2022 08:13:58 UTC" + }, + "crc": 3945231947, + "data_checksum_version": 0, + "float8ByVal": 1, + "floatFormat": 1234567, + "indexMaxKeys": 32, + "loblksize": 2048, + "maxAlign": 8, + "max_locks_per_xact": 64, + "max_prepared_xacts": 0, + "max_wal_senders": 10, + "max_worker_processes": 8, + "minRecoveryPoint": "0/0", + "minRecoveryPointTLI": 0, + "mock_authentication_nonce": "0045fd647ed4d35382750ab7d6bec19a77af72bae00f72804a5743fb76c8988c", + "nameDataLen": 64, + "pg_control_version": 1300, + "relseg_size": 131072, + "state": "DB_IN_PRODUCTION", + "system_identifier": 7040120944989169512, + "time": "Mon, 04 Jul 2022 08:13:58 UTC", + "toast_max_chunk_size": 1996, + "track_commit_timestamp": 0, + "unloggedLSN": "0/3E8", + "wal_level": "WAL_LEVEL_REPLICA", + "wal_log_hints": 0, + "xlog_blcksz": 8192, + "xlog_seg_size": 16777216 +} From 666bbfba29d04cc18e9bd30824bc933a06da45da Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 5 Sep 2022 12:50:59 +0300 Subject: [PATCH 049/141] postgres: fix some unknown, chanche tests tovalue -> dv --- format/postgres/.gitignore | 1 + .../postgres/flavours/pgpro11/pg_control.go | 19 +- .../postgres/flavours/pgpro12/pg_control.go | 19 +- .../postgres/flavours/pgpro13/pg_control.go | 19 +- .../postgres/flavours/pgpro14/pg_control.go | 19 +- .../postgres/flavours/pgproee10/pg_control.go | 25 +-- .../postgres/flavours/pgproee11/pg_control.go | 23 +- .../postgres/flavours/pgproee12/pg_control.go | 21 +- .../postgres/flavours/pgproee13/pg_control.go | 23 +- .../postgres/flavours/pgproee14/pg_control.go | 23 +- .../flavours/postgres11/pg_control.go | 21 +- .../flavours/postgres12/pg_control.go | 21 +- .../flavours/postgres13/pg_control.go | 21 +- .../flavours/postgres14/common14/pgheap.go | 2 +- .../flavours/postgres14/pg_control.go | 21 +- format/postgres/pg_control.go | 1 - format/postgres/pg_heap.go | 1 - .../testdata/flavours/pgpro11/16396_1.fqtest | 20 +- .../testdata/flavours/pgpro11/16406_1.fqtest | 20 +- .../testdata/flavours/pgpro11/16406_2.fqtest | 198 ++++++++--------- .../flavours/pgpro11/pg_control.fqtest | 125 ++++++----- .../testdata/flavours/pgpro12/16396_1.fqtest | 20 +- .../testdata/flavours/pgpro12/16406_1.fqtest | 20 +- .../testdata/flavours/pgpro12/16406_2.fqtest | 198 ++++++++--------- .../flavours/pgpro12/pg_control.fqtest | 125 ++++++----- .../testdata/flavours/pgpro13/16396_1.fqtest | 20 +- .../testdata/flavours/pgpro13/16406_1.fqtest | 20 +- .../testdata/flavours/pgpro13/16406_2.fqtest | 198 ++++++++--------- .../flavours/pgpro13/pg_control.fqtest | 123 ++++++----- .../testdata/flavours/pgpro14/16396_1.fqtest | 20 +- .../testdata/flavours/pgpro14/16406_1.fqtest | 20 +- .../testdata/flavours/pgpro14/16406_2.fqtest | 198 ++++++++--------- .../flavours/pgpro14/pg_control.fqtest | 123 ++++++----- .../flavours/pgproee10/16396_1.fqtest | 20 +- .../flavours/pgproee10/16403_1.fqtest | 20 +- .../flavours/pgproee10/16403_2.fqtest | 198 ++++++++--------- .../flavours/pgproee10/pg_control.fqtest | 131 +++++++----- .../flavours/pgproee11/90150_1.fqtest | 20 +- .../flavours/pgproee11/90153_2.fqtest | 196 ++++++++--------- .../flavours/pgproee11/pg_control.fqtest | 133 ++++++------ .../flavours/pgproee12/16396_1.fqtest | 20 +- .../flavours/pgproee12/16406_1.fqtest | 20 +- .../flavours/pgproee12/16406_2.fqtest | 198 ++++++++--------- .../flavours/pgproee12/pg_control.fqtest | 106 ++++------ .../flavours/pgproee13/16396_1.fqtest | 20 +- .../flavours/pgproee13/16406_1.fqtest | 20 +- .../flavours/pgproee13/16406_2.fqtest | 198 ++++++++--------- .../flavours/pgproee13/pg_control.fqtest | 126 ++++++----- .../flavours/pgproee14/16396_1.fqtest | 20 +- .../flavours/pgproee14/pg_control.fqtest | 126 ++++++----- .../flavours/postgres11/16396_1.fqtest | 20 +- .../flavours/postgres11/16406_1.fqtest | 20 +- .../flavours/postgres11/16406_2.fqtest | 198 ++++++++--------- .../flavours/postgres11/pg_control.fqtest | 124 ++++++----- .../flavours/postgres12/16396_1.fqtest | 20 +- .../flavours/postgres12/16406_1.fqtest | 20 +- .../flavours/postgres12/16406_2.fqtest | 198 ++++++++--------- .../flavours/postgres12/pg_control.fqtest | 124 ++++++----- .../flavours/postgres13/16396_1.fqtest | 200 +++++++++--------- .../flavours/postgres13/16407_1.fqtest | 29 ++- .../flavours/postgres13/16407_2.fqtest | 198 ++++++++--------- .../flavours/postgres13/pg_control.fqtest | 122 ++++++----- .../flavours/postgres14/16994_1.fqtest | 38 ++-- .../flavours/postgres14/33233_1.fqtest | 29 ++- .../flavours/postgres14/33233_2.fqtest | 200 +++++++++--------- .../flavours/postgres14/pg_control.fqtest | 122 ++++++----- pkg/decode/decode.go | 2 +- 67 files changed, 2450 insertions(+), 2514 deletions(-) create mode 100644 format/postgres/.gitignore diff --git a/format/postgres/.gitignore b/format/postgres/.gitignore new file mode 100644 index 000000000..cd0d0072a --- /dev/null +++ b/format/postgres/.gitignore @@ -0,0 +1 @@ +*.sh \ No newline at end of file diff --git a/format/postgres/flavours/pgpro11/pg_control.go b/format/postgres/flavours/pgpro11/pg_control.go index ebb3b7190..c8e2d03eb 100644 --- a/format/postgres/flavours/pgpro11/pg_control.go +++ b/format/postgres/flavours/pgpro11/pg_control.go @@ -87,7 +87,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("pg_control_version") d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) - d.U32() + d.FieldU32("hole0") /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; @@ -104,7 +104,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") - d.U24() + d.FieldU24("hole1") /* 20 | 4 */ // uint32 nextXidEpoch; /* 24 | 4 */ // TransactionId nextXid; @@ -133,7 +133,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestCommitTsXid") d.FieldU32("newestCommitTsXid") d.FieldU32("oldestActiveXid") - d.U32() + d.FieldU32("padding1") }) /* 120 | 8 */ // XLogRecPtr unloggedLSN; @@ -143,7 +143,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.U32() + d.FieldU32("hole2") /* 144 | 8 */ // XLogRecPtr backupStartPoint; /* 152 | 8 */ // XLogRecPtr backupEndPoint; @@ -152,14 +152,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.U24() + d.FieldU24("hole3") /* 164 | 4 */ // int wal_level; /* 168 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.U24() + d.FieldU24("hole4") /* 172 | 4 */ // int MaxConnections; /* 176 | 4 */ // int max_worker_processes; @@ -172,12 +172,12 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.U24() + d.FieldU24("hole5") /* 192 | 4 */ // uint32 maxAlign; /* XXX 4-byte hole */ d.FieldU32("maxAlign") - d.U32() + d.FieldU32("hole6") /* 200 | 8 */ // double floatFormat; /* 208 | 4 */ // uint32 blcksz; @@ -202,7 +202,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("loblksize") d.FieldU8("float4ByVal") d.FieldU8("float8ByVal") - d.U16() + d.FieldU16("hole7") /* 244 | 4 */ // uint32 data_checksum_version; /* 248 | 32 */ // char mock_authentication_nonce[32]; @@ -215,6 +215,7 @@ func DecodePgControl(d *decode.D, in any) any { /* total size (bytes): 288 */ d.AssertPosBytes(288) + d.FieldRawLen("unused", d.BitsLeft()) return nil } diff --git a/format/postgres/flavours/pgpro12/pg_control.go b/format/postgres/flavours/pgpro12/pg_control.go index 3efc366d7..b3d670fe1 100644 --- a/format/postgres/flavours/pgpro12/pg_control.go +++ b/format/postgres/flavours/pgpro12/pg_control.go @@ -87,7 +87,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("pg_control_version", common.VersionMapper) d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) - d.U32() + d.FieldU32("hole0") /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; @@ -104,7 +104,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") - d.U56() + d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextFullXid; /* 32 | 4 */ // Oid nextOid; @@ -123,7 +123,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestXidDB") d.FieldU32("oldestMulti") d.FieldU32("oldestMultiDB") - d.U32() + d.FieldU32("hole2") /* 64 | 8 */ // pg_time_t time; /* 72 | 4 */ // TransactionId oldestCommitTsXid; @@ -134,7 +134,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestCommitTsXid") d.FieldU32("newestCommitTsXid") d.FieldU32("oldestActiveXid") - d.U32() + d.FieldU32("padding0") }) /* 128 | 8 */ // XLogRecPtr unloggedLSN; @@ -144,7 +144,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.U32() + d.FieldU32("hole3") /* 152 | 8 */ // XLogRecPtr backupStartPoint; /* 160 | 8 */ // XLogRecPtr backupEndPoint; @@ -153,14 +153,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.U24() + d.FieldU24("hole4") /* 172 | 4 */ // int wal_level; /* 176 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.U24() + d.FieldU24("hole5") /* 180 | 4 */ // int MaxConnections; /* 184 | 4 */ // int max_worker_processes; @@ -175,7 +175,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.U24() + d.FieldU24("hole6") /* 204 | 4 */ // uint32 maxAlign; /* 208 | 8 */ // double floatFormat; @@ -202,7 +202,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("loblksize") d.FieldU8("float4ByVal") d.FieldU8("float8ByVal") - d.U16() + d.FieldU16("hole7") /* 252 | 4 */ // uint32 data_checksum_version; /* 256 | 32 */ // char mock_authentication_nonce[32]; @@ -215,6 +215,7 @@ func DecodePgControl(d *decode.D, in any) any { /* total size (bytes): 296 */ d.AssertPosBytes(296) + d.FieldRawLen("unused", d.BitsLeft()) return nil } diff --git a/format/postgres/flavours/pgpro13/pg_control.go b/format/postgres/flavours/pgpro13/pg_control.go index e45f873a3..c92045a95 100644 --- a/format/postgres/flavours/pgpro13/pg_control.go +++ b/format/postgres/flavours/pgpro13/pg_control.go @@ -85,7 +85,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("pg_control_version", common.VersionMapper) d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) - d.U32() + d.FieldU32("hole0") /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; @@ -102,7 +102,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") - d.U56() + d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextFullXid; /* 32 | 4 */ // Oid nextOid; @@ -121,7 +121,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestXidDB") d.FieldU32("oldestMulti") d.FieldU32("oldestMultiDB") - d.U32() + d.FieldU32("hole2") /* 64 | 8 */ // pg_time_t time; /* 72 | 4 */ // TransactionId oldestCommitTsXid; @@ -132,7 +132,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestCommitTsXid") d.FieldU32("newestCommitTsXid") d.FieldU32("oldestActiveXid") - d.U32() + d.FieldU32("padding0") }) /* 128 | 8 */ // XLogRecPtr unloggedLSN; @@ -142,7 +142,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.U32() + d.FieldU32("hole3") /* 152 | 8 */ // XLogRecPtr backupStartPoint; /* 160 | 8 */ // XLogRecPtr backupEndPoint; @@ -151,14 +151,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.U24() + d.FieldU24("hole4") /* 172 | 4 */ // int wal_level; /* 176 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.U24() + d.FieldU24("hole5") /* 180 | 4 */ // int MaxConnections; /* 184 | 4 */ // int max_worker_processes; @@ -173,7 +173,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.U24() + d.FieldU24("hole6") /* 204 | 4 */ // uint32 maxAlign; /* 208 | 8 */ // double floatFormat; @@ -198,7 +198,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") d.FieldU8("float8ByVal") - d.U24() + d.FieldU24("hole7") /* 252 | 4 */ // uint32 data_checksum_version; /* 256 | 32 */ // char mock_authentication_nonce[32]; @@ -211,6 +211,7 @@ func DecodePgControl(d *decode.D, in any) any { /* total size (bytes): 296 */ d.AssertPosBytes(296) + d.FieldRawLen("unused", d.BitsLeft()) return nil } diff --git a/format/postgres/flavours/pgpro14/pg_control.go b/format/postgres/flavours/pgpro14/pg_control.go index 7b5064ee4..23f8c6852 100644 --- a/format/postgres/flavours/pgpro14/pg_control.go +++ b/format/postgres/flavours/pgpro14/pg_control.go @@ -85,7 +85,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("pg_control_version", common.VersionMapper) d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) - d.U32() + d.FieldU32("hole0") /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; @@ -102,7 +102,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") - d.U56() + d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; /* 32 | 4 */ // Oid nextOid; @@ -121,7 +121,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestXidDB") d.FieldU32("oldestMulti") d.FieldU32("oldestMultiDB") - d.U32() + d.FieldU32("hole2") /* 64 | 8 */ // pg_time_t time; /* 72 | 4 */ // TransactionId oldestCommitTsXid; @@ -132,7 +132,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestCommitTsXid") d.FieldU32("newestCommitTsXid") d.FieldU32("oldestActiveXid") - d.U32() + d.FieldU32("padding0") }) /* 128 | 8 */ // XLogRecPtr unloggedLSN; @@ -142,7 +142,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.U32() + d.FieldU32("hole3") /* 152 | 8 */ // XLogRecPtr backupStartPoint; /* 160 | 8 */ // XLogRecPtr backupEndPoint; @@ -151,14 +151,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.U24() + d.FieldU24("hole4") /* 172 | 4 */ // int wal_level; /* 176 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.U24() + d.FieldU24("hole5") /* 180 | 4 */ // int MaxConnections; /* 184 | 4 */ // int max_worker_processes; @@ -173,7 +173,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.U24() + d.FieldU24("hole6") /* 204 | 4 */ // uint32 maxAlign; /* 208 | 8 */ // double floatFormat; @@ -198,7 +198,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") d.FieldU8("float8ByVal") - d.U24() + d.FieldU24("hole7") /* 252 | 4 */ // uint32 data_checksum_version; /* 256 | 32 */ // char mock_authentication_nonce[32]; @@ -211,6 +211,7 @@ func DecodePgControl(d *decode.D, in any) any { /* total size (bytes): 296 */ d.AssertPosBytes(296) + d.FieldRawLen("unused", d.BitsLeft()) return nil } diff --git a/format/postgres/flavours/pgproee10/pg_control.go b/format/postgres/flavours/pgproee10/pg_control.go index 7c1dc1d92..2c0dacc06 100644 --- a/format/postgres/flavours/pgproee10/pg_control.go +++ b/format/postgres/flavours/pgproee10/pg_control.go @@ -91,7 +91,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("pg_control_version", common.VersionMapper) d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) - d.U32() + d.FieldU32("hole0") /* XXX 4-byte hole */ /* 24 | 8 */ // pg_time_t time; @@ -111,14 +111,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") - d.U56() + d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; /* 32 | 4 */ // Oid nextOid; /* XXX 4-byte hole */ d.FieldU64("nextXid") d.FieldU32("nextOid") - d.U32() + d.FieldU32("hole2") /* 40 | 8 */ // MultiXactId nextMulti; /* 48 | 8 */ // MultiXactOffset nextMultiOffset; @@ -129,14 +129,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("nextMultiOffset") d.FieldU64("oldestXid") d.FieldU32("oldestXidDB") - d.U32() + d.FieldU32("hole3") /* 72 | 8 */ // MultiXactId oldestMulti; /* 80 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ d.FieldU64("oldestMulti") d.FieldU32("oldestMultiDB") - d.U32() + d.FieldU32("hole4") /* 88 | 8 */ // pg_time_t time; /* 96 | 8 */ // TransactionId oldestCommitTsXid; @@ -155,7 +155,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.U32() + d.FieldU32("hole5") /* 192 | 8 */ // XLogRecPtr backupStartPoint; /* 200 | 8 */ // XLogRecPtr backupEndPoint; @@ -164,14 +164,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.U24() + d.FieldU24("hole6") /* 212 | 4 */ // int wal_level /* 216 | 1 */ // bool wal_log_hints /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.U24() + d.FieldU24("hole7") /* 220 | 4 */ // int MaxConnections /* 224 | 4 */ // int max_worker_processes @@ -184,12 +184,12 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.U24() + d.FieldU24("hole8") /* 240 | 4 */ // uint32 maxAlign /* XXX 4-byte hole */ d.FieldU32("maxAlign") - d.U32() + d.FieldU32("hole9") /* 248 | 8 */ // double floatFormat /* 256 | 4 */ // uint32 blcksz @@ -214,7 +214,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("loblksize") d.FieldU8("float4ByVal") d.FieldU8("float8ByVal") - d.U16() + d.FieldU16("hole10") /* 292 | 4 */ // uint32 data_checksum_version /* 296 | 32 */ // char mock_authentication_nonce[32] @@ -227,10 +227,11 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("icu_version", common.IcuVersionMapper) d.FieldU32("pg_old_version") d.FieldU32("crc") - d.U32() + d.FieldU32("hole11") /* total size (bytes): 344 */ d.AssertPosBytes(344) + d.FieldRawLen("unused", d.BitsLeft()) return nil } diff --git a/format/postgres/flavours/pgproee11/pg_control.go b/format/postgres/flavours/pgproee11/pg_control.go index 47428ed35..406fdaebd 100644 --- a/format/postgres/flavours/pgproee11/pg_control.go +++ b/format/postgres/flavours/pgproee11/pg_control.go @@ -92,7 +92,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("pg_control_version", common.VersionMapper) d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) - d.U32() + d.FieldU32("hole0") /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; @@ -109,14 +109,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") - d.U56() + d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; /* 32 | 4 */ // Oid nextOid; /* XXX 4-byte hole */ d.FieldU64("nextXid") d.FieldU32("nextOid") - d.U32() + d.FieldU32("hole2") /* 40 | 8 */ // MultiXactId nextMulti; /* 48 | 8 */ // MultiXactOffset nextMultiOffset; @@ -127,14 +127,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("nextMultiOffset") d.FieldU64("oldestXid") d.FieldU32("oldestXidDB") - d.U32() + d.FieldU32("hole3") /* 72 | 8 */ // MultiXactId oldestMulti; /* 80 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ d.FieldU64("oldestMulti") d.FieldU32("oldestMultiDB") - d.U32() + d.FieldU32("hole4") /* 88 | 8 */ // pg_time_t time; /* 96 | 8 */ // TransactionId oldestCommitTsXid; @@ -153,7 +153,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.U32() + d.FieldU32("hole5") /* 184 | 8 */ // XLogRecPtr backupStartPoint; /* 192 | 8 */ // XLogRecPtr backupEndPoint; @@ -162,14 +162,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.U24() + d.FieldU24("hole6") /* 204 | 4 */ // int wal_level; /* 208 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.U24() + d.FieldU24("hole7") /* 212 | 4 */ // int MaxConnections; /* 216 | 4 */ // int max_worker_processes; @@ -182,12 +182,12 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.U24() + d.FieldU24("hole8") /* 232 | 4 */ // uint32 maxAlign; /* XXX 4-byte hole */ d.FieldU32("maxAlign") - d.U32() + d.FieldU32("hole9") /* 240 | 8 */ // double floatFormat; /* 248 | 4 */ // uint32 blcksz; @@ -212,7 +212,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("loblksize") d.FieldU8("float4ByVal") d.FieldU8("float8ByVal") - d.U16() + d.FieldU16("hole10") /* 284 | 4 */ // uint32 data_checksum_version; /* 288 | 32 */ // char mock_authentication_nonce[32]; @@ -233,6 +233,7 @@ func DecodePgControl(d *decode.D, in any) any { /* total size (bytes): 344 */ d.AssertPosBytes(344) + d.FieldRawLen("unused", d.BitsLeft()) return nil } diff --git a/format/postgres/flavours/pgproee12/pg_control.go b/format/postgres/flavours/pgproee12/pg_control.go index 073022bd4..7bc3e475d 100644 --- a/format/postgres/flavours/pgproee12/pg_control.go +++ b/format/postgres/flavours/pgproee12/pg_control.go @@ -92,7 +92,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("pg_control_version", common.VersionMapper) d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) - d.U32() + d.FieldU32("hole0") /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; @@ -109,14 +109,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") - d.U56() + d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; /* 32 | 4 */ // Oid nextOid; /* XXX 4-byte hole */ d.FieldU64("nextXid") d.FieldU32("nextOid") - d.U32() + d.FieldU32("hole1") /* 40 | 8 */ // MultiXactId nextMulti; /* 48 | 8 */ // MultiXactOffset nextMultiOffset; @@ -127,14 +127,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("nextMultiOffset") d.FieldU64("oldestXid") d.FieldU32("oldestXidDB") - d.U32() + d.FieldU32("hole2") /* 72 | 8 */ // MultiXactId oldestMulti; /* 80 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ d.FieldU64("oldestMulti") d.FieldU32("oldestMultiDB") - d.U32() + d.FieldU32("hole3") /* 88 | 8 */ // pg_time_t time; /* 96 | 8 */ // TransactionId oldestCommitTsXid; @@ -153,7 +153,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.U32() + d.FieldU32("hole4") /* 184 | 8 */ // XLogRecPtr backupStartPoint; /* 192 | 8 */ // XLogRecPtr backupEndPoint; @@ -162,14 +162,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.U24() + d.FieldU24("hole5") /* 204 | 4 */ // int wal_level; /* 208 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.U24() + d.FieldU24("hole5") /* 212 | 4 */ // int MaxConnections; /* 216 | 4 */ // int max_worker_processes; @@ -184,7 +184,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.U24() + d.FieldU24("hole5") /* 236 | 4 */ // uint32 maxAlign; /* 240 | 8 */ // double floatFormat; @@ -211,7 +211,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("loblksize") d.FieldU8("float4ByVal") d.FieldU8("float8ByVal") - d.U16() + d.FieldU16("hole6") /* 284 | 4 */ // uint32 data_checksum_version; /* 288 | 32 */ // char mock_authentication_nonce[32]; @@ -232,6 +232,7 @@ func DecodePgControl(d *decode.D, in any) any { /* total size (bytes): 344 */ d.AssertPosBytes(344) + d.FieldRawLen("unused", d.BitsLeft()) return nil } diff --git a/format/postgres/flavours/pgproee13/pg_control.go b/format/postgres/flavours/pgproee13/pg_control.go index bba2da064..8df47998a 100644 --- a/format/postgres/flavours/pgproee13/pg_control.go +++ b/format/postgres/flavours/pgproee13/pg_control.go @@ -89,7 +89,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("pg_control_version", common.VersionMapper) d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) - d.U32() + d.FieldU32("hole0") /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; @@ -106,14 +106,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") - d.U56() + d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; /* 32 | 4 */ // Oid nextOid; /* XXX 4-byte hole */ d.FieldU64("nextXid") d.FieldU32("nextOid") - d.U32() + d.FieldU32("hole2") /* 40 | 8 */ // MultiXactId nextMulti; /* 48 | 8 */ // MultiXactOffset nextMultiOffset; @@ -124,14 +124,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("nextMultiOffset") d.FieldU64("oldestXid") d.FieldU32("oldestXidDB") - d.U32() + d.FieldU32("hole3") /* 72 | 8 */ // MultiXactId oldestMulti; /* 80 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ d.FieldU64("oldestMulti") d.FieldU32("oldestMultiDB") - d.U32() + d.FieldU32("hole4") /* 88 | 8 */ // pg_time_t time; /* 96 | 8 */ // TransactionId oldestCommitTsXid; @@ -150,7 +150,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.U32() + d.FieldU32("hole5") /* 184 | 8 */ // XLogRecPtr backupStartPoint; /* 192 | 8 */ // XLogRecPtr backupEndPoint; @@ -159,14 +159,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.U24() + d.FieldU24("hole6") /* 204 | 4 */ // int wal_level; /* 208 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.U24() + d.FieldU24("hole7") /* 212 | 4 */ // int MaxConnections; /* 216 | 4 */ // int max_worker_processes; @@ -181,7 +181,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.U24() + d.FieldU24("hole8") /* 236 | 4 */ // uint32 maxAlign; /* 240 | 8 */ // double floatFormat; @@ -207,7 +207,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") d.FieldU8("float8ByVal") - d.U24() + d.FieldU24("hole9") /* 284 | 4 */ // uint32 data_checksum_version /* 288 | 32 */ // char mock_authentication_nonce[32] @@ -220,10 +220,11 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("icu_version", common.IcuVersionMapper) d.FieldU32("pg_old_version") d.FieldU32("crc") - d.U32() + d.FieldU32("padding0") /* total size (bytes): 336 */ d.AssertPosBytes(336) + d.FieldRawLen("unused", d.BitsLeft()) return nil } diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go index cc6176f07..e0de09ad6 100644 --- a/format/postgres/flavours/pgproee14/pg_control.go +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -89,7 +89,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("pg_control_version", common.VersionMapper) d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) - d.U32() + d.FieldU32("hole0") /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; @@ -106,14 +106,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") - d.U56() + d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; /* 32 | 4 */ // Oid nextOid; /* XXX 4-byte hole */ d.FieldU64("nextXid") d.FieldU32("nextOid") - d.U32() + d.FieldU32("hole2") /* 40 | 8 */ // MultiXactId nextMulti; /* 48 | 8 */ // MultiXactOffset nextMultiOffset; @@ -124,14 +124,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("nextMultiOffset") d.FieldU64("oldestXid") d.FieldU32("oldestXidDB") - d.U32() + d.FieldU32("hole3") /* 72 | 8 */ // MultiXactId oldestMulti; /* 80 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ d.FieldU64("oldestMulti") d.FieldU32("oldestMultiDB") - d.U32() + d.FieldU32("hole4") /* 88 | 8 */ // pg_time_t time; /* 96 | 8 */ // TransactionId oldestCommitTsXid; @@ -150,7 +150,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.U32() + d.FieldU32("hole5") /* 184 | 8 */ // XLogRecPtr backupStartPoint; /* 192 | 8 */ // XLogRecPtr backupEndPoint; @@ -159,14 +159,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.U24() + d.FieldU24("hole6") /* 204 | 4 */ // int wal_level; /* 208 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.U24() + d.FieldU24("hole7") /* 212 | 4 */ // int MaxConnections; /* 216 | 4 */ // int max_worker_processes; @@ -181,7 +181,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.U24() + d.FieldU24("hole8") /* 236 | 4 */ // uint32 maxAlign; /* 240 | 8 */ // double floatFormat; @@ -206,7 +206,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") d.FieldU8("float8ByVal") - d.U24() + d.FieldU24("hole9") /* 284 | 4 */ // uint32 data_checksum_version; /* 288 | 32 */ // char mock_authentication_nonce[32]; @@ -219,10 +219,11 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("icu_version", common.IcuVersionMapper) d.FieldU32("pg_old_version") d.FieldU32("crc") - d.U32() + d.FieldU32("padding0") /* total size (bytes): 336 */ d.AssertPosBytes(336) + d.FieldRawLen("unused", d.BitsLeft()) return nil } diff --git a/format/postgres/flavours/postgres11/pg_control.go b/format/postgres/flavours/postgres11/pg_control.go index 87b9e5b6b..991fecb5b 100644 --- a/format/postgres/flavours/postgres11/pg_control.go +++ b/format/postgres/flavours/postgres11/pg_control.go @@ -87,7 +87,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("pg_control_version") d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) - d.U32() + d.FieldU32("hole0") /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; @@ -104,7 +104,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") - d.U24() + d.FieldU24("hole1") /* 20 | 4 */ // uint32 nextXidEpoch; /* 24 | 4 */ // TransactionId nextXid; @@ -133,7 +133,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestCommitTsXid") d.FieldU32("newestCommitTsXid") d.FieldU32("oldestActiveXid") - d.U32() + d.FieldU32("padding0") }) /* 120 | 8 */ // XLogRecPtr unloggedLSN; @@ -143,7 +143,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.U32() + d.FieldU32("hole2") /* 144 | 8 */ // XLogRecPtr backupStartPoint; /* 152 | 8 */ // XLogRecPtr backupEndPoint; @@ -152,14 +152,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.U24() + d.FieldU24("hole3") /* 164 | 4 */ // int wal_level; /* 168 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.U24() + d.FieldU24("hole4") /* 172 | 4 */ // int MaxConnections; /* 176 | 4 */ // int max_worker_processes; @@ -172,12 +172,12 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.U24() + d.FieldU24("hole5") /* 192 | 4 */ // uint32 maxAlign; /* XXX 4-byte hole */ d.FieldU32("maxAlign") - d.U32() + d.FieldU32("hole6") /* 200 | 8 */ // double floatFormat; /* 208 | 4 */ // uint32 blcksz; @@ -202,7 +202,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("loblksize") d.FieldU8("float4ByVal") d.FieldU8("float8ByVal") - d.U16() + d.FieldU16("hole7") /* 252 | 4 */ // uint32 data_checksum_version; /* 256 | 32 */ // char mock_authentication_nonce[32]; @@ -211,10 +211,11 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("data_checksum_version") d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) d.FieldU32("crc") - d.U32() + d.FieldU32("padding1") /* total size (bytes): 288 */ d.AssertPosBytes(288) + d.FieldRawLen("unused", d.BitsLeft()) return nil } diff --git a/format/postgres/flavours/postgres12/pg_control.go b/format/postgres/flavours/postgres12/pg_control.go index 274cc0989..a53ee2b0c 100644 --- a/format/postgres/flavours/postgres12/pg_control.go +++ b/format/postgres/flavours/postgres12/pg_control.go @@ -86,7 +86,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("pg_control_version") d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) - d.U32() + d.FieldU32("hole0") /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; @@ -103,7 +103,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") - d.U56() + d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextFullXid; /* 32 | 4 */ // Oid nextOid; @@ -122,7 +122,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestXidDB") d.FieldU32("oldestMulti") d.FieldU32("oldestMultiDB") - d.U32() + d.FieldU32("hole2") /* 64 | 8 */ // pg_time_t time; /* 72 | 4 */ // TransactionId oldestCommitTsXid; @@ -133,7 +133,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestCommitTsXid") d.FieldU32("newestCommitTsXid") d.FieldU32("oldestActiveXid") - d.U32() + d.FieldU32("padding0") }) /* 128 | 8 */ // XLogRecPtr unloggedLSN; @@ -143,7 +143,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.U32() + d.FieldU32("hole3") /* 152 | 8 */ // XLogRecPtr backupStartPoint; /* 160 | 8 */ // XLogRecPtr backupEndPoint; @@ -152,14 +152,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.U24() + d.FieldU24("hole4") /* 172 | 4 */ // int wal_level; /* 176 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.U24() + d.FieldU24("hole5") /* 180 | 4 */ // int MaxConnections; /* 184 | 4 */ // int max_worker_processes; @@ -174,7 +174,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.U24() + d.FieldU24("hole6") /* 204 | 4 */ // uint32 maxAlign; /* 208 | 8 */ // double floatFormat; @@ -201,7 +201,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("loblksize") d.FieldU8("float4ByVal") d.FieldU8("float8ByVal") - d.U16() + d.FieldU16("hole7") /* 252 | 4 */ // uint32 data_checksum_version; /* 256 | 32 */ // char mock_authentication_nonce[32]; @@ -210,10 +210,11 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("data_checksum_version") d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) d.FieldU32("crc") - d.U32() + d.FieldU32("padding1") /* total size (bytes): 296 */ d.AssertPosBytes(296) + d.FieldRawLen("unused", d.BitsLeft()) return nil } diff --git a/format/postgres/flavours/postgres13/pg_control.go b/format/postgres/flavours/postgres13/pg_control.go index e45101813..c6ace39c3 100644 --- a/format/postgres/flavours/postgres13/pg_control.go +++ b/format/postgres/flavours/postgres13/pg_control.go @@ -85,7 +85,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("pg_control_version") d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) - d.U32() + d.FieldU32("hole0") /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; @@ -102,7 +102,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") - d.U56() + d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextFullXid /* 32 | 4 */ // Oid nextOid @@ -121,7 +121,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestXidDB") d.FieldU32("oldestMulti") d.FieldU32("oldestMultiDB") - d.U32() + d.FieldU32("hole2") /* 64 | 8 */ // pg_time_t time /* 72 | 4 */ // TransactionId oldestCommitTsXid @@ -132,7 +132,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestCommitTsXid") d.FieldU32("newestCommitTsXid") d.FieldU32("oldestActiveXid") - d.U32() + d.FieldU32("padding0") }) /* 128 | 8 */ // XLogRecPtr unloggedLSN; @@ -142,7 +142,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.U32() + d.FieldU32("hole3") /* 152 | 8 */ // XLogRecPtr backupStartPoint; /* 160 | 8 */ // XLogRecPtr backupEndPoint; @@ -151,14 +151,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.U24() + d.FieldU24("hole4") /* 172 | 4 */ // int wal_level; /* 176 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.U24() + d.FieldU24("hole5") /* 180 | 4 */ // int MaxConnections /* 184 | 4 */ // int max_worker_processes @@ -173,7 +173,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.U24() + d.FieldU24("hole6") /* 204 | 4 */ // uint32 maxAlign /* 208 | 8 */ // double floatFormat @@ -198,7 +198,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") d.FieldU8("float8ByVal") - d.U24() + d.FieldU24("hole7") /* 252 | 4 */ // uint32 data_checksum_version; /* 256 | 32 */ // char mock_authentication_nonce[32]; @@ -207,10 +207,11 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("data_checksum_version") d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) d.FieldU32("crc") - d.U32() + d.FieldU32("padding1") /* total size (bytes): 296 */ d.AssertPosBytes(296) + d.FieldRawLen("unused", d.BitsLeft()) return nil } diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index fabb24ef7..1686416b4 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -354,7 +354,7 @@ func decodeTuples(d *decode.D) { d.SeekRel(32) d.FieldU8("t_hoff") - d.U8() + d.FieldU8("padding0") d.FieldRawLen("t_bits", int64(tupleDataLen*8), scalar.RawHex) diff --git a/format/postgres/flavours/postgres14/pg_control.go b/format/postgres/flavours/postgres14/pg_control.go index f7f5215c7..efd3411b3 100644 --- a/format/postgres/flavours/postgres14/pg_control.go +++ b/format/postgres/flavours/postgres14/pg_control.go @@ -85,7 +85,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("pg_control_version") d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) - d.U32() + d.FieldU32("hole0") /* 24 | 8 */ // pg_time_t time; /* 32 | 8 */ // XLogRecPtr checkPoint; @@ -102,7 +102,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("ThisTimeLineID") d.FieldU32("PrevTimeLineID") d.FieldU8("fullPageWrites") - d.U56() + d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; /* 32 | 4 */ // Oid nextOid; @@ -121,7 +121,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestXidDB") d.FieldU32("oldestMulti") d.FieldU32("oldestMultiDB") - d.U32() + d.FieldU32("hole2") /* 64 | 8 */ // pg_time_t time; /* 72 | 4 */ // TransactionId oldestCommitTsXid; @@ -132,7 +132,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("oldestCommitTsXid") d.FieldU32("newestCommitTsXid") d.FieldU32("oldestActiveXid") - d.U32() + d.FieldU32("padding0") }) /* 128 | 8 */ // XLogRecPtr unloggedLSN; @@ -142,7 +142,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.U32() + d.FieldU32("hole3") /* 152 | 8 */ // XLogRecPtr backupStartPoint; /* 160 | 8 */ // XLogRecPtr backupEndPoint; @@ -151,14 +151,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.U24() + d.FieldU24("hole4") /* 172 | 4 */ // int wal_level; /* 176 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.U24() + d.FieldU24("hole5") /* 180 | 4 */ // int MaxConnections; /* 184 | 4 */ // int max_worker_processes; @@ -173,7 +173,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.U24() + d.FieldU24("hole6") /* 204 | 4 */ // uint32 maxAlign; /* 208 | 8 */ // double floatFormat; @@ -198,7 +198,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") d.FieldU8("float8ByVal") - d.U24() + d.FieldU24("hole7") /* 252 | 4 */ // uint32 data_checksum_version; /* 256 | 32 */ // char mock_authentication_nonce[32]; @@ -207,10 +207,11 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("data_checksum_version") d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) d.FieldU32("crc") - d.U32() + d.FieldU32("padding1") /* total size (bytes): 296 */ d.AssertPosBytes(296) + d.FieldRawLen("unused", d.BitsLeft()) return nil } diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 0b12b662c..f10e13c8f 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -56,7 +56,6 @@ const ( func decodePgControl(d *decode.D, in any) any { d.Endian = decode.LittleEndian - d.Options.FillGaps = false flavour := in.(format.PostgresIn).Flavour switch flavour { diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index a74b40c8e..36c0c141c 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -37,7 +37,6 @@ func init() { func decodePgheap(d *decode.D, in any) any { d.Endian = decode.LittleEndian - d.Options.FillGaps = false flavour := in.(format.PostgresIn).Flavour switch flavour { diff --git a/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest index 0ceba3205..a6ecde472 100644 --- a/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro11 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 8064 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 384 -} +$ fq -d pg_heap -o flavour=pgpro11 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[60]{}: ItemIdData 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | lp_off: 384 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | lp_len: 121 0x108-0x10b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest index c2d3cfd75..261ddb960 100644 --- a/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro11 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 8144 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 656 -} +$ fq -d pg_heap -o flavour=pgpro11 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest index f25389c95..47871f6dd 100644 --- a/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest @@ -1,105 +1,93 @@ -$ fq -d pg_heap -o flavour=pgpro11 ".[0].Tuples[0,-1] | tovalue" 16406 -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 0, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "0d00000002000000ccf20100f8feffffc43021b0218a0200", - "t_choice": { - "t_datum": { - "datum_len_": 583, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 583 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 1 - }, - "t_hoff": 24, - "t_infomask": 2049, - "t_infomask2": 6 -} -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 0, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "0900000003000000b2e003007bf8fffffda429b0218a0200", - "t_choice": { - "t_datum": { - "datum_len_": 739, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 739 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 157 - }, - "t_hoff": 24, - "t_infomask": 2049, - "t_infomask2": 6 -} +$ fq -d pg_heap -o flavour=pgpro11 ".[0].Tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|47 02 00 00 |G... | t_xmin: 583 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|47 02 00 00 |G... | datum_len_: 583 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 08 | .. | t_infomask: 2049 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMIN_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 0d 00 00 00 02 00 00 00| ........| t_bits: "0d00000002000000ccf20100f8feffffc43021b0218a020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1ff0|cc f2 01 00 f8 fe ff ff c4 30 21 b0 21 8a 02 00|.........0!.!...| + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|e3 02 00 00 |.... | t_xmin: 739 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|e3 02 00 00 |.... | datum_len_: 739 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 08 | .. | t_infomask: 2049 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMIN_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 09 00 00 00 03 00 00 00| ........| t_bits: "0900000003000000b2e003007bf8fffffda429b0218a020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2b0|b2 e0 03 00 7b f8 ff ff fd a4 29 b0 21 8a 02 00|....{.....).!...| diff --git a/format/postgres/testdata/flavours/pgpro11/pg_control.fqtest b/format/postgres/testdata/flavours/pgpro11/pg_control.fqtest index 6a0b7021f..bb237a335 100644 --- a/format/postgres/testdata/flavours/pgpro11/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/pg_control.fqtest @@ -1,57 +1,68 @@ -$ fq -d pg_control -o flavour=pgpro11 tovalue pg_control -{ - "MaxConnections": 194, - "backupEndPoint": "0/0", - "backupEndRequired": 0, - "backupStartPoint": "0/0", - "blcksz": 8192, - "catalog_version_no": 201809181, - "checkPoint": "0/3F2D858", - "checkPointCopy": { - "PrevTimeLineID": 1, - "ThisTimeLineID": 1, - "fullPageWrites": 1, - "newestCommitTsXid": 0, - "nextMulti": 1, - "nextMultiOffset": 0, - "nextOid": 24576, - "nextXid": 3598, - "nextXidEpoch": 0, - "oldestActiveXid": 3598, - "oldestCommitTsXid": 0, - "oldestMulti": 1, - "oldestMultiDB": 1, - "oldestXid": 564, - "oldestXidDB": 1, - "redo": "0/3F2D820", - "time": "Fri, 26 Aug 2022 11:08:04 UTC" - }, - "crc": 3527299760, - "data_checksum_version": 1, - "float4ByVal": 1, - "float8ByVal": 1, - "floatFormat": 1234567, - "icu_version": 828, - "indexMaxKeys": 32, - "loblksize": 2048, - "maxAlign": 8, - "max_locks_per_xact": 64, - "max_prepared_xacts": 0, - "max_worker_processes": 8, - "minRecoveryPoint": "0/0", - "minRecoveryPointTLI": 0, - "mock_authentication_nonce": "f6a253c768b8813567e90b7670f403b446b7807d992f1c9bcb859174a5e67551", - "nameDataLen": 64, - "pg_control_version": 1347421260, - "relseg_size": 131072, - "state": "DB_IN_PRODUCTION", - "system_identifier": 7136138803012192656, - "time": "Fri, 26 Aug 2022 11:08:04 UTC", - "toast_max_chunk_size": 1996, - "track_commit_timestamp": 0, - "unloggedLSN": "0/1", - "wal_level": "WAL_LEVEL_REPLICA", - "wal_log_hints": 0, - "xlog_blcksz": 8192, - "xlog_seg_size": 16777216 -} +$ fq -d pg_control -o flavour=pgpro11 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|90 49 6c b5 6e a8 08 63 |.Il.n..c | system_identifier: 7136138803012192656 0x0-0x7.7 (8) +0x0000| 4c 04 50 50 | L.PP | pg_control_version: 1347421260 0x8-0xb.7 (4) +0x0000| 1d 5d 07 0c| .]..| catalog_version_no: 201809181 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 94 a9 08 63 00 00 00 00| ...c....| time: "Fri, 26 Aug 2022 11:08:04 UTC" (1661512084) 0x18-0x1f.7 (8) +0x0020|58 d8 f2 03 00 00 00 00 |X....... | checkPoint: "0/3F2D858" (66246744) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x77.7 (80) +0x0020| 20 d8 f2 03 00 00 00 00| .......| redo: "0/3F2D820" (66246688) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 | ... | hole1: 0 0x39-0x3b.7 (3) +0x0030| 00 00 00 00| ....| nextXidEpoch: 0 0x3c-0x3f.7 (4) +0x0040|0e 0e 00 00 |.... | nextXid: 3598 0x40-0x43.7 (4) +0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x44-0x47.7 (4) +0x0040| 01 00 00 00 | .... | nextMulti: 1 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| nextMultiOffset: 0 0x4c-0x4f.7 (4) +0x0050|34 02 00 00 |4... | oldestXid: 564 0x50-0x53.7 (4) +0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldestMulti: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldestMultiDB: 1 0x5c-0x5f.7 (4) +0x0060|94 a9 08 63 00 00 00 00 |...c.... | time: "Fri, 26 Aug 2022 11:08:04 UTC" (1661512084) 0x60-0x67.7 (8) +0x0060| 00 00 00 00 | .... | oldestCommitTsXid: 0 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| newestCommitTsXid: 0 0x6c-0x6f.7 (4) +0x0070|0e 0e 00 00 |.... | oldestActiveXid: 3598 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | padding1: 0 0x74-0x77.7 (4) +0x0070| 01 00 00 00 00 00 00 00| ........| unloggedLSN: "0/1" (1) 0x78-0x7f.7 (8) +0x0080|00 00 00 00 00 00 00 00 |........ | minRecoveryPoint: "0/0" (0) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 | .... | minRecoveryPointTLI: 0 0x88-0x8b.7 (4) +0x0080| 00 00 00 00| ....| hole2: 0 0x8c-0x8f.7 (4) +0x0090|00 00 00 00 00 00 00 00 |........ | backupStartPoint: "0/0" (0) 0x90-0x97.7 (8) +0x0090| 00 00 00 00 00 00 00 00| ........| backupEndPoint: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 |. | backupEndRequired: 0 0xa0-0xa0.7 (1) +0x00a0| 00 00 00 | ... | hole3: 0 0xa1-0xa3.7 (3) +0x00a0| 01 00 00 00 | .... | wal_level: "WAL_LEVEL_REPLICA" (1) 0xa4-0xa7.7 (4) +0x00a0| 00 | . | wal_log_hints: 0 0xa8-0xa8.7 (1) +0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) +0x00a0| c2 00 00 00| ....| MaxConnections: 194 0xac-0xaf.7 (4) +0x00b0|08 00 00 00 |.... | max_worker_processes: 8 0xb0-0xb3.7 (4) +0x00b0| 00 00 00 00 | .... | max_prepared_xacts: 0 0xb4-0xb7.7 (4) +0x00b0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xb8-0xbb.7 (4) +0x00b0| 00 | . | track_commit_timestamp: 0 0xbc-0xbc.7 (1) +0x00b0| 00 00 00| ...| hole5: 0 0xbd-0xbf.7 (3) +0x00c0|08 00 00 00 |.... | maxAlign: 8 0xc0-0xc3.7 (4) +0x00c0| 00 00 00 00 | .... | hole6: 0 0xc4-0xc7.7 (4) +0x00c0| 00 00 00 00 87 d6 32 41| ......2A| floatFormat: 1.234567e+06 0xc8-0xcf.7 (8) +0x00d0|00 20 00 00 |. .. | blcksz: 8192 0xd0-0xd3.7 (4) +0x00d0| 00 00 02 00 | .... | relseg_size: 131072 0xd4-0xd7.7 (4) +0x00d0| 00 20 00 00 | . .. | xlog_blcksz: 8192 0xd8-0xdb.7 (4) +0x00d0| 00 00 00 01| ....| xlog_seg_size: 16777216 0xdc-0xdf.7 (4) +0x00e0|40 00 00 00 |@... | nameDataLen: 64 0xe0-0xe3.7 (4) +0x00e0| 20 00 00 00 | ... | indexMaxKeys: 32 0xe4-0xe7.7 (4) +0x00e0| cc 07 00 00 | .... | toast_max_chunk_size: 1996 0xe8-0xeb.7 (4) +0x00e0| 00 08 00 00| ....| loblksize: 2048 0xec-0xef.7 (4) +0x00f0|01 |. | float4ByVal: 1 0xf0-0xf0.7 (1) +0x00f0| 01 | . | float8ByVal: 1 0xf1-0xf1.7 (1) +0x00f0| 00 00 | .. | hole7: 0 0xf2-0xf3.7 (2) +0x00f0| 01 00 00 00 | .... | data_checksum_version: 1 0xf4-0xf7.7 (4) +0x00f0| f6 a2 53 c7 68 b8 81 35| ..S.h..5| mock_authentication_nonce: "f6a253c768b8813567e90b7670f403b446b7807d992f1c9..." (raw bits) 0xf8-0x117.7 (32) +0x0100|67 e9 0b 76 70 f4 03 b4 46 b7 80 7d 99 2f 1c 9b|g..vp...F..}./..| +0x0110|cb 85 91 74 a5 e6 75 51 |...t..uQ | +0x0110| 3c 03 00 00 | <... | icu_version: 828 0x118-0x11b.7 (4) +0x0110| b0 52 3e d2| .R>.| crc: 3527299760 0x11c-0x11f.7 (4) +0x0120|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| unused: raw bits 0x120-0x1fff.7 (7904) +* |until 0x1fff.7 (end) (7904) | | diff --git a/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest index f365c827f..2e8d59464 100644 --- a/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro12 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 8064 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 384 -} +$ fq -d pg_heap -o flavour=pgpro12 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[60]{}: ItemIdData 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | lp_off: 384 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | lp_len: 121 0x108-0x10b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest index da221523b..701825105 100644 --- a/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro12 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 8144 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 656 -} +$ fq -d pg_heap -o flavour=pgpro12 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro12/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro12/16406_2.fqtest index ffc578922..3f2385422 100644 --- a/format/postgres/testdata/flavours/pgpro12/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/16406_2.fqtest @@ -1,105 +1,93 @@ -$ fq -d pg_heap -o flavour=pgpro12 ".[0].Tuples[0,-1] | tovalue" 16406 -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "61000000080000003aaa080009040000d1b3823d1f8a0200", - "t_choice": { - "t_datum": { - "datum_len_": 499, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 499 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 1 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "2600000001000000c5900800c5f6ffffe658893d1f8a0200", - "t_choice": { - "t_datum": { - "datum_len_": 655, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 655 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 157 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} +$ fq -d pg_heap -o flavour=pgpro12 ".[0].Tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f3 01 00 00 |.... | t_xmin: 499 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f3 01 00 00 |.... | datum_len_: 499 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 61 00 00 00 08 00 00 00| a.......| t_bits: "61000000080000003aaa080009040000d1b3823d1f8a020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1ff0|3a aa 08 00 09 04 00 00 d1 b3 82 3d 1f 8a 02 00|:..........=....| + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|8f 02 00 00 |.... | t_xmin: 655 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|8f 02 00 00 |.... | datum_len_: 655 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 26 00 00 00 01 00 00 00| &.......| t_bits: "2600000001000000c5900800c5f6ffffe658893d1f8a020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2b0|c5 90 08 00 c5 f6 ff ff e6 58 89 3d 1f 8a 02 00|.........X.=....| diff --git a/format/postgres/testdata/flavours/pgpro12/pg_control.fqtest b/format/postgres/testdata/flavours/pgpro12/pg_control.fqtest index 13046f047..e43685a32 100644 --- a/format/postgres/testdata/flavours/pgpro12/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/pg_control.fqtest @@ -1,57 +1,68 @@ -$ fq -d pg_control -o flavour=pgpro12 tovalue pg_control -{ - "MaxConnections": 194, - "backupEndPoint": "0/0", - "backupEndRequired": 0, - "backupStartPoint": "0/0", - "blcksz": 8192, - "catalog_version_no": 201911191, - "checkPoint": "0/9595D90", - "checkPointCopy": { - "PrevTimeLineID": 1, - "ThisTimeLineID": 1, - "fullPageWrites": 1, - "newestCommitTsXid": 0, - "nextFullXid": 3933, - "nextMulti": 1, - "nextMultiOffset": 0, - "nextOid": 24576, - "oldestActiveXid": 3933, - "oldestCommitTsXid": 0, - "oldestMulti": 1, - "oldestMultiDB": 1, - "oldestXid": 480, - "oldestXidDB": 1, - "redo": "0/9595D58", - "time": "Fri, 26 Aug 2022 08:17:49 UTC" - }, - "crc": 1152611143, - "data_checksum_version": 1, - "float4ByVal": 1, - "float8ByVal": 1, - "floatFormat": 1234567, - "icu_version": "60.3.0.0", - "indexMaxKeys": 32, - "loblksize": 2048, - "maxAlign": 8, - "max_locks_per_xact": 64, - "max_prepared_xacts": 0, - "max_wal_senders": 10, - "max_worker_processes": 8, - "minRecoveryPoint": "0/0", - "minRecoveryPointTLI": 0, - "mock_authentication_nonce": "ee891b8bf8aa7ff59ad910dae0689b40dd36952da495341472f77dc02c046e19", - "nameDataLen": 64, - "pg_control_version": "Postgres Pro Standard 1201", - "relseg_size": 131072, - "state": "DB_IN_PRODUCTION", - "system_identifier": 7136092686029146502, - "time": "Fri, 26 Aug 2022 08:17:52 UTC", - "toast_max_chunk_size": 1996, - "track_commit_timestamp": 0, - "unloggedLSN": "0/3E8", - "wal_level": "WAL_LEVEL_REPLICA", - "wal_log_hints": 0, - "xlog_blcksz": 8192, - "xlog_seg_size": 16777216 -} +$ fq -d pg_control -o flavour=pgpro12 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|86 c9 07 43 7d 7e 08 63 |...C}~.c | system_identifier: 7136092686029146502 0x0-0x7.7 (8) +0x0000| b1 04 50 50 | ..PP | pg_control_version: "Postgres Pro Standard 1201" (1347421361) 0x8-0xb.7 (4) +0x0000| 97 eb 08 0c| ....| catalog_version_no: 201911191 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| b0 81 08 63 00 00 00 00| ...c....| time: "Fri, 26 Aug 2022 08:17:52 UTC" (1661501872) 0x18-0x1f.7 (8) +0x0020|90 5d 59 09 00 00 00 00 |.]Y..... | checkPoint: "0/9595D90" (156851600) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020| 58 5d 59 09 00 00 00 00| X]Y.....| redo: "0/9595D58" (156851544) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|5d 0f 00 00 00 00 00 00 |]....... | nextFullXid: 3933 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) +0x0050| e0 01 00 00 | .... | oldestXid: 480 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) +0x0060| ad 81 08 63 00 00 00 00| ...c....| time: "Fri, 26 Aug 2022 08:17:49 UTC" (1661501869) 0x68-0x6f.7 (8) +0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) +0x0070| 5d 0f 00 00 | ]... | oldestActiveXid: 3933 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) +0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) +0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) +0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) +0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) +0x00b0| c2 00 00 00 | .... | MaxConnections: 194 0xb4-0xb7.7 (4) +0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) +0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) +0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) +0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) +0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) +0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) +0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) +0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) +0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) +0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) +0x00f0| 01 | . | float4ByVal: 1 0xf8-0xf8.7 (1) +0x00f0| 01 | . | float8ByVal: 1 0xf9-0xf9.7 (1) +0x00f0| 00 00 | .. | hole7: 0 0xfa-0xfb.7 (2) +0x00f0| 01 00 00 00| ....| data_checksum_version: 1 0xfc-0xff.7 (4) +0x0100|ee 89 1b 8b f8 aa 7f f5 9a d9 10 da e0 68 9b 40|.............h.@| mock_authentication_nonce: "ee891b8bf8aa7ff59ad910dae0689b40dd36952da495341..." (raw bits) 0x100-0x11f.7 (32) +0x0110|dd 36 95 2d a4 95 34 14 72 f7 7d c0 2c 04 6e 19|.6.-..4.r.}.,.n.| +0x0120|3c 03 00 00 |<... | icu_version: "60.3.0.0" (828) 0x120-0x123.7 (4) +0x0120| 47 73 b3 44 | Gs.D | crc: 1152611143 0x124-0x127.7 (4) +0x0120| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x128-0x1fff.7 (7896) +0x0130|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7896) | | diff --git a/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest index a7c0ec5a3..e65a56766 100644 --- a/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro13 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 8064 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 384 -} +$ fq -d pg_heap -o flavour=pgpro13 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[60]{}: ItemIdData 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | lp_off: 384 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | lp_len: 121 0x108-0x10b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest index 399805f3e..3ab627df2 100644 --- a/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro13 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 8144 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 656 -} +$ fq -d pg_heap -o flavour=pgpro13 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest index ed93f6820..662684dce 100644 --- a/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest @@ -1,105 +1,93 @@ -$ fq -d pg_heap -o flavour=pgpro13 ".[0].Tuples[0,-1] | tovalue" 16406 -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "4e0000000400000053b40a00d6ffffff9982147e1d8a0200", - "t_choice": { - "t_datum": { - "datum_len_": 498, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 498 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 1 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "44000000090000003f9b0e00fc090000446d1c7e1d8a0200", - "t_choice": { - "t_datum": { - "datum_len_": 654, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 654 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 157 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} +$ fq -d pg_heap -o flavour=pgpro13 ".[0].Tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f2 01 00 00 |.... | t_xmin: 498 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f2 01 00 00 |.... | datum_len_: 498 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 4e 00 00 00 04 00 00 00| N.......| t_bits: "4e0000000400000053b40a00d6ffffff9982147e1d8a020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1ff0|53 b4 0a 00 d6 ff ff ff 99 82 14 7e 1d 8a 02 00|S..........~....| + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|8e 02 00 00 |.... | t_xmin: 654 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|8e 02 00 00 |.... | datum_len_: 654 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 44 00 00 00 09 00 00 00| D.......| t_bits: "44000000090000003f9b0e00fc090000446d1c7e1d8a020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2b0|3f 9b 0e 00 fc 09 00 00 44 6d 1c 7e 1d 8a 02 00|?.......Dm.~....| diff --git a/format/postgres/testdata/flavours/pgpro13/pg_control.fqtest b/format/postgres/testdata/flavours/pgpro13/pg_control.fqtest index f36549a81..d3ffe89dc 100644 --- a/format/postgres/testdata/flavours/pgpro13/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgpro13/pg_control.fqtest @@ -1,56 +1,67 @@ -$ fq -d pg_control -o flavour=pgpro13 tovalue pg_control -{ - "MaxConnections": 194, - "backupEndPoint": "0/0", - "backupEndRequired": 0, - "backupStartPoint": "0/0", - "blcksz": 8192, - "catalog_version_no": 202010141, - "checkPoint": "0/9808490", - "checkPointCopy": { - "PrevTimeLineID": 1, - "ThisTimeLineID": 1, - "fullPageWrites": 1, - "newestCommitTsXid": 0, - "nextFullXid": 9294, - "nextMulti": 1, - "nextMultiOffset": 0, - "nextOid": 24576, - "oldestActiveXid": 9294, - "oldestCommitTsXid": 0, - "oldestMulti": 1, - "oldestMultiDB": 1, - "oldestXid": 479, - "oldestXidDB": 1, - "redo": "0/9808458", - "time": "Fri, 26 Aug 2022 06:16:15 UTC" - }, - "crc": 54024207, - "data_checksum_version": 1, - "float8ByVal": 1, - "floatFormat": 1234567, - "icu_version": "60.3.0.0", - "indexMaxKeys": 32, - "loblksize": 2048, - "maxAlign": 8, - "max_locks_per_xact": 64, - "max_prepared_xacts": 0, - "max_wal_senders": 10, - "max_worker_processes": 8, - "minRecoveryPoint": "0/0", - "minRecoveryPointTLI": 0, - "mock_authentication_nonce": "6911331cd8dc8ed9812bf669c0c7aee023a99bdd6909509283531557f68eca7e", - "nameDataLen": 64, - "pg_control_version": "Postgres Pro Standard 1300", - "relseg_size": 131072, - "state": "DB_IN_PRODUCTION", - "system_identifier": 7136062198021630343, - "time": "Fri, 26 Aug 2022 06:16:19 UTC", - "toast_max_chunk_size": 1996, - "track_commit_timestamp": 0, - "unloggedLSN": "0/3E8", - "wal_level": "WAL_LEVEL_REPLICA", - "wal_log_hints": 0, - "xlog_blcksz": 8192, - "xlog_seg_size": 16777216 -} +$ fq -d pg_control -o flavour=pgpro13 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|87 29 2c b8 c2 62 08 63 |.),..b.c | system_identifier: 7136062198021630343 0x0-0x7.7 (8) +0x0000| 14 05 50 50 | ..PP | pg_control_version: "Postgres Pro Standard 1300" (1347421460) 0x8-0xb.7 (4) +0x0000| 1d 6e 0a 0c| .n..| catalog_version_no: 202010141 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 33 65 08 63 00 00 00 00| 3e.c....| time: "Fri, 26 Aug 2022 06:16:19 UTC" (1661494579) 0x18-0x1f.7 (8) +0x0020|90 84 80 09 00 00 00 00 |........ | checkPoint: "0/9808490" (159417488) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020| 58 84 80 09 00 00 00 00| X.......| redo: "0/9808458" (159417432) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|4e 24 00 00 00 00 00 00 |N$...... | nextFullXid: 9294 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) +0x0050| df 01 00 00 | .... | oldestXid: 479 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) +0x0060| 2f 65 08 63 00 00 00 00| /e.c....| time: "Fri, 26 Aug 2022 06:16:15 UTC" (1661494575) 0x68-0x6f.7 (8) +0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) +0x0070| 4e 24 00 00 | N$.. | oldestActiveXid: 9294 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) +0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) +0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) +0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) +0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) +0x00b0| c2 00 00 00 | .... | MaxConnections: 194 0xb4-0xb7.7 (4) +0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) +0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) +0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) +0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) +0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) +0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) +0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) +0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) +0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) +0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) +0x00f0| 01 | . | float8ByVal: 1 0xf8-0xf8.7 (1) +0x00f0| 00 00 00 | ... | hole7: 0 0xf9-0xfb.7 (3) +0x00f0| 01 00 00 00| ....| data_checksum_version: 1 0xfc-0xff.7 (4) +0x0100|69 11 33 1c d8 dc 8e d9 81 2b f6 69 c0 c7 ae e0|i.3......+.i....| mock_authentication_nonce: "6911331cd8dc8ed9812bf669c0c7aee023a99bdd6909509..." (raw bits) 0x100-0x11f.7 (32) +0x0110|23 a9 9b dd 69 09 50 92 83 53 15 57 f6 8e ca 7e|#...i.P..S.W...~| +0x0120|3c 03 00 00 |<... | icu_version: "60.3.0.0" (828) 0x120-0x123.7 (4) +0x0120| 0f 58 38 03 | .X8. | crc: 54024207 0x124-0x127.7 (4) +0x0120| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x128-0x1fff.7 (7896) +0x0130|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7896) | | diff --git a/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest index a04538638..2342d7ab4 100644 --- a/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro14 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 8064 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 384 -} +$ fq -d pg_heap -o flavour=pgpro14 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[71]{}: ItemIdData 0x134-0x137.7 (4) +0x130| 80 81 f2 00 | .... | lp_off: 384 0x134-0x137.7 (4) +0x130| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x134-0x137.7 (4) +0x130| 80 81 f2 00 | .... | lp_len: 121 0x134-0x137.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest index 6ecc6f604..297ce2f14 100644 --- a/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro14 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 8144 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 656 -} +$ fq -d pg_heap -o flavour=pgpro14 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro14/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro14/16406_2.fqtest index 7fd7fbe6b..dfc91d3db 100644 --- a/format/postgres/testdata/flavours/pgpro14/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/16406_2.fqtest @@ -1,105 +1,93 @@ -$ fq -d pg_heap -o flavour=pgpro14 ".[0].Tuples[0,-1] | tovalue" 16406 -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "040000000100000075840100f2fcffff00853c9376880200", - "t_choice": { - "t_datum": { - "datum_len_": 753, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 753 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 1 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "09000000010000004ff60000b70c00006e1f439376880200", - "t_choice": { - "t_datum": { - "datum_len_": 909, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 909 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 157 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} +$ fq -d pg_heap -o flavour=pgpro14 ".[0].Tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f1 02 00 00 |.... | t_xmin: 753 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f1 02 00 00 |.... | datum_len_: 753 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 04 00 00 00 01 00 00 00| ........| t_bits: "040000000100000075840100f2fcffff00853c937688020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1ff0|75 84 01 00 f2 fc ff ff 00 85 3c 93 76 88 02 00|u.........<.v...| + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|8d 03 00 00 |.... | t_xmin: 909 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|8d 03 00 00 |.... | datum_len_: 909 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 09 00 00 00 01 00 00 00| ........| t_bits: "09000000010000004ff60000b70c00006e1f43937688020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2b0|4f f6 00 00 b7 0c 00 00 6e 1f 43 93 76 88 02 00|O.......n.C.v...| diff --git a/format/postgres/testdata/flavours/pgpro14/pg_control.fqtest b/format/postgres/testdata/flavours/pgpro14/pg_control.fqtest index 195071e6c..85dcdcfe8 100644 --- a/format/postgres/testdata/flavours/pgpro14/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/pg_control.fqtest @@ -1,56 +1,67 @@ -$ fq -d pg_control -o flavour=pgpro14 tovalue pg_control -{ - "MaxConnections": 194, - "backupEndPoint": "0/0", - "backupEndRequired": 0, - "backupStartPoint": "0/0", - "blcksz": 8192, - "catalog_version_no": 202110041, - "checkPoint": "0/2D5B858", - "checkPointCopy": { - "PrevTimeLineID": 1, - "ThisTimeLineID": 1, - "fullPageWrites": 1, - "newestCommitTsXid": 0, - "nextMulti": 1, - "nextMultiOffset": 0, - "nextOid": 24576, - "nextXid": 17700, - "oldestActiveXid": 17700, - "oldestCommitTsXid": 0, - "oldestMulti": 1, - "oldestMultiDB": 1, - "oldestXid": 733, - "oldestXidDB": 1, - "redo": "0/2D5B820", - "time": "Fri, 05 Aug 2022 05:36:59 UTC" - }, - "crc": 4029970325, - "data_checksum_version": 1, - "float8ByVal": 1, - "floatFormat": 1234567, - "icu_version": "60.3.0.0", - "indexMaxKeys": 32, - "loblksize": 2048, - "maxAlign": 8, - "max_locks_per_xact": 64, - "max_prepared_xacts": 0, - "max_wal_senders": 10, - "max_worker_processes": 8, - "minRecoveryPoint": "0/0", - "minRecoveryPointTLI": 0, - "mock_authentication_nonce": "fee1b1f5c452bae6c9acdcce6ced4acd5ee657c0f6e4c7a5b0e0953f1de7b25e", - "nameDataLen": 64, - "pg_control_version": "Postgres Pro Standard 1300", - "relseg_size": 131072, - "state": "DB_IN_PRODUCTION", - "system_identifier": 7128258892569024915, - "time": "Fri, 05 Aug 2022 05:36:59 UTC", - "toast_max_chunk_size": 1996, - "track_commit_timestamp": 0, - "unloggedLSN": "0/3E8", - "wal_level": "WAL_LEVEL_REPLICA", - "wal_log_hints": 0, - "xlog_blcksz": 8192, - "xlog_seg_size": 16777216 -} +$ fq -d pg_control -o flavour=pgpro14 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|93 99 98 16 b2 a9 ec 62 |.......b | system_identifier: 7128258892569024915 0x0-0x7.7 (8) +0x0000| 14 05 50 50 | ..PP | pg_control_version: "Postgres Pro Standard 1300" (1347421460) 0x8-0xb.7 (4) +0x0000| 59 f4 0b 0c| Y...| catalog_version_no: 202110041 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 7b ac ec 62 00 00 00 00| {..b....| time: "Fri, 05 Aug 2022 05:36:59 UTC" (1659677819) 0x18-0x1f.7 (8) +0x0020|58 b8 d5 02 00 00 00 00 |X....... | checkPoint: "0/2D5B858" (47560792) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020| 20 b8 d5 02 00 00 00 00| .......| redo: "0/2D5B820" (47560736) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|24 45 00 00 00 00 00 00 |$E...... | nextXid: 17700 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) +0x0050| dd 02 00 00 | .... | oldestXid: 733 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) +0x0060| 7b ac ec 62 00 00 00 00| {..b....| time: "Fri, 05 Aug 2022 05:36:59 UTC" (1659677819) 0x68-0x6f.7 (8) +0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) +0x0070| 24 45 00 00 | $E.. | oldestActiveXid: 17700 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) +0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) +0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) +0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) +0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) +0x00b0| c2 00 00 00 | .... | MaxConnections: 194 0xb4-0xb7.7 (4) +0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) +0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) +0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) +0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) +0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) +0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) +0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) +0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) +0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) +0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) +0x00f0| 01 | . | float8ByVal: 1 0xf8-0xf8.7 (1) +0x00f0| 00 00 00 | ... | hole7: 0 0xf9-0xfb.7 (3) +0x00f0| 01 00 00 00| ....| data_checksum_version: 1 0xfc-0xff.7 (4) +0x0100|fe e1 b1 f5 c4 52 ba e6 c9 ac dc ce 6c ed 4a cd|.....R......l.J.| mock_authentication_nonce: "fee1b1f5c452bae6c9acdcce6ced4acd5ee657c0f6e4c7a..." (raw bits) 0x100-0x11f.7 (32) +0x0110|5e e6 57 c0 f6 e4 c7 a5 b0 e0 95 3f 1d e7 b2 5e|^.W........?...^| +0x0120|3c 03 00 00 |<... | icu_version: "60.3.0.0" (828) 0x120-0x123.7 (4) +0x0120| 95 77 34 f0 | .w4. | crc: 4029970325 0x124-0x127.7 (4) +0x0120| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x128-0x1fff.7 (7896) +0x0130|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7896) | | diff --git a/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest index 26c4e475f..93a2743bb 100644 --- a/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee10 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 8040 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 360 -} +$ fq -d pg_heap -o flavour=pgproee10 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[67]{}: ItemIdData 0x120-0x123.7 (4) +0x120|68 81 f2 00 |h... | lp_off: 360 0x120-0x123.7 (4) +0x120|68 81 f2 00 |h... | lp_flags: "LP_NORMAL" (1) 0x120-0x123.7 (4) +0x120|68 81 f2 00 |h... | lp_len: 121 0x120-0x123.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest b/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest index 6492eae7f..ec17c1291 100644 --- a/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee10 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16403 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 8120 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 680 -} +$ fq -d pg_heap -o flavour=pgproee10 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16403 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +0x10| b8 9f 60 00 | ..`. | lp_off: 8120 0x14-0x17.7 (4) +0x10| b8 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) +0x10| b8 9f 60 00 | ..`. | lp_len: 48 0x14-0x17.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[155]{}: ItemIdData 0x280-0x283.7 (4) +0x280|a8 82 60 00 |..`. | lp_off: 680 0x280-0x283.7 (4) +0x280|a8 82 60 00 |..`. | lp_flags: "LP_NORMAL" (1) 0x280-0x283.7 (4) +0x280|a8 82 60 00 |..`. | lp_len: 48 0x280-0x283.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest b/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest index 9b882ddba..bb2f6a35d 100644 --- a/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest @@ -1,105 +1,93 @@ -$ fq -d pg_heap -o flavour=pgproee10 ".[0].Tuples[0,-1] | tovalue" 16403 -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "090000000100000043ff0000f70e000043c144237a880200", - "t_choice": { - "t_datum": { - "datum_len_": 3, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": "10000000568" - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 1 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "09000000010000001713000050edffffe8934c237a880200", - "t_choice": { - "t_datum": { - "datum_len_": 158, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": "10000000723" - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 156 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} +$ fq -d pg_heap -o flavour=pgproee10 ".[0].Tuples[0,-1] | dv" 16403 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fb8-0x1fe7.7 (48) + | | | t_choice{}: 0x1fb8-0x1fc3.7 (12) + | | | t_heap{}: 0x1fb8-0x1fc3.7 (12) +0x1fb0| 03 00 00 00 | .... | t_xmin: "10000000568" (3) 0x1fb8-0x1fbb.7 (4) +0x1fb0| 00 00 00 00| ....| t_xmax: 0 0x1fbc-0x1fbf.7 (4) + | | | t_field3{}: 0x1fc0-0x1fc3.7 (4) +0x1fc0|03 00 00 00 |.... | t_cid: 3 0x1fc0-0x1fc3.7 (4) +0x1fc0|03 00 00 00 |.... | t_xvac: 3 0x1fc0-0x1fc3.7 (4) + | | | t_datum{}: 0x1fb8-0x1fc3.7 (12) +0x1fb0| 03 00 00 00 | .... | datum_len_: 3 0x1fb8-0x1fbb.7 (4) +0x1fb0| 00 00 00 00| ....| datum_typmod: 0 0x1fbc-0x1fbf.7 (4) +0x1fc0|03 00 00 00 |.... | datum_typeid: 3 0x1fc0-0x1fc3.7 (4) + | | | t_ctid{}: 0x1fc4-0x1fc9.7 (6) +0x1fc0| 00 00 00 00 | .... | ip_blkid: 0 0x1fc4-0x1fc7.7 (4) +0x1fc0| 01 00 | .. | ip_posid: 1 0x1fc8-0x1fc9.7 (2) +0x1fc0| 06 00 | .. | t_infomask2: 6 0x1fca-0x1fcb.7 (2) + | | | Infomask2{}: 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 01 09 | .. | t_infomask: 2305 0x1fcc-0x1fcd.7 (2) + | | | Infomask{}: 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASNULL: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_UPDATED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 18 | . | t_hoff: 24 0x1fce-0x1fce.7 (1) +0x1fc0| 1f| .| padding0: 31 0x1fcf-0x1fcf.7 (1) +0x1fd0|09 00 00 00 01 00 00 00 43 ff 00 00 f7 0e 00 00|........C.......| t_bits: "090000000100000043ff0000f70e000043c144237a88020..." (raw bits) 0x1fd0-0x1fe7.7 (24) +0x1fe0|43 c1 44 23 7a 88 02 00 |C.D#z... | + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[155]{}: HeapTupleHeaderData 0x2a8-0x2d7.7 (48) + | | | t_choice{}: 0x2a8-0x2b3.7 (12) + | | | t_heap{}: 0x2a8-0x2b3.7 (12) +0x2a0| 9e 00 00 00 | .... | t_xmin: "10000000723" (158) 0x2a8-0x2ab.7 (4) +0x2a0| 00 00 00 00| ....| t_xmax: 0 0x2ac-0x2af.7 (4) + | | | t_field3{}: 0x2b0-0x2b3.7 (4) +0x2b0|03 00 00 00 |.... | t_cid: 3 0x2b0-0x2b3.7 (4) +0x2b0|03 00 00 00 |.... | t_xvac: 3 0x2b0-0x2b3.7 (4) + | | | t_datum{}: 0x2a8-0x2b3.7 (12) +0x2a0| 9e 00 00 00 | .... | datum_len_: 158 0x2a8-0x2ab.7 (4) +0x2a0| 00 00 00 00| ....| datum_typmod: 0 0x2ac-0x2af.7 (4) +0x2b0|03 00 00 00 |.... | datum_typeid: 3 0x2b0-0x2b3.7 (4) + | | | t_ctid{}: 0x2b4-0x2b9.7 (6) +0x2b0| 00 00 00 00 | .... | ip_blkid: 0 0x2b4-0x2b7.7 (4) +0x2b0| 9c 00 | .. | ip_posid: 156 0x2b8-0x2b9.7 (2) +0x2b0| 06 00 | .. | t_infomask2: 6 0x2ba-0x2bb.7 (2) + | | | Infomask2{}: 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2ba-0x2bb.7 (2) +0x2b0| 01 09 | .. | t_infomask: 2305 0x2bc-0x2bd.7 (2) + | | | Infomask{}: 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASNULL: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_COMBOCID: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_UPDATED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 18 | . | t_hoff: 24 0x2be-0x2be.7 (1) +0x2b0| 1f| .| padding0: 31 0x2bf-0x2bf.7 (1) +0x2c0|09 00 00 00 01 00 00 00 17 13 00 00 50 ed ff ff|............P...| t_bits: "09000000010000001713000050edffffe8934c237a88020..." (raw bits) 0x2c0-0x2d7.7 (24) +0x2d0|e8 93 4c 23 7a 88 02 00 |..L#z... | diff --git a/format/postgres/testdata/flavours/pgproee10/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee10/pg_control.fqtest index 28c8941cb..3bc41aeec 100644 --- a/format/postgres/testdata/flavours/pgproee10/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/pg_control.fqtest @@ -1,58 +1,73 @@ -$ fq -d pg_control -o flavour=pgproee10 tovalue pg_control -{ - "MaxConnections": 93, - "backupEndPoint": "0/0", - "backupEndRequired": 0, - "backupStartPoint": "0/0", - "blcksz": 8192, - "catalog_version_no": 201709292, - "checkPoint": "0/2FC2758", - "checkPointCopy": { - "PrevTimeLineID": 1, - "ThisTimeLineID": 1, - "fullPageWrites": 1, - "newestCommitTsXid": 0, - "nextMulti": 5000000000, - "nextMultiOffset": 0, - "nextOid": 24576, - "nextXid": 10000020566, - "oldestActiveXid": 10000020566, - "oldestCommitTsXid": 0, - "oldestMulti": 5000000000, - "oldestMultiDB": 1, - "oldestXid": 10000000547, - "oldestXidDB": 1, - "redo": "0/2FC2708", - "time": "Fri, 05 Aug 2022 09:51:35 UTC" - }, - "crc": 3968423158, - "data_checksum_version": 1, - "float4ByVal": 1, - "float8ByVal": 1, - "floatFormat": 1234567, - "icu_version": "60.3.0.0", - "indexMaxKeys": 32, - "loblksize": 2048, - "maxAlign": 8, - "max_locks_per_xact": 64, - "max_prepared_xacts": 0, - "max_worker_processes": 8, - "minRecoveryPoint": "0/0", - "minRecoveryPointTLI": 0, - "mock_authentication_nonce": "392f4acdc59d4d3b2c9968b782191526dbfa9ba84acd37dc4f6f86e96acaf145", - "nameDataLen": 64, - "pg_control_version": "Postgres Pro Enterprise 1002", - "pg_old_version": 4294901760, - "prevCheckPoint": "0/2FC2668", - "relseg_size": 131072, - "state": "DB_IN_PRODUCTION", - "system_identifier": 7128324455138589021, - "time": "Fri, 05 Aug 2022 09:51:35 UTC", - "toast_max_chunk_size": 1996, - "track_commit_timestamp": 0, - "unloggedLSN": "0/1", - "wal_level": "WAL_LEVEL_REPLICA", - "wal_log_hints": 0, - "xlog_blcksz": 8192, - "xlog_seg_size": 16777216 -} +$ fq -d pg_control -o flavour=pgproee10 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|5d f9 43 10 53 e5 ec 62 |].C.S..b | system_identifier: 7128324455138589021 0x0-0x7.7 (8) +0x0000| ea 03 45 50 | ..EP | pg_control_version: "Postgres Pro Enterprise 1002" (1346700266) 0x8-0xb.7 (4) +0x0000| ec d6 05 0c| ....| catalog_version_no: 201709292 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 27 e8 ec 62 00 00 00 00| '..b....| time: "Fri, 05 Aug 2022 09:51:35 UTC" (1659693095) 0x18-0x1f.7 (8) +0x0020|58 27 fc 02 00 00 00 00 |X'...... | checkPoint: "0/2FC2758" (50079576) 0x20-0x27.7 (8) +0x0020| 68 26 fc 02 00 00 00 00| h&......| prevCheckPoint: "0/2FC2668" (50079336) 0x28-0x2f.7 (8) + | | | checkPointCopy{}: 0x30-0xa7.7 (120) +0x0030|08 27 fc 02 00 00 00 00 |.'...... | redo: "0/2FC2708" (50079496) 0x30-0x37.7 (8) +0x0030| 01 00 00 00 | .... | ThisTimeLineID: 1 0x38-0x3b.7 (4) +0x0030| 01 00 00 00| ....| PrevTimeLineID: 1 0x3c-0x3f.7 (4) +0x0040|01 |. | fullPageWrites: 1 0x40-0x40.7 (1) +0x0040| 00 00 00 00 00 00 00 | ....... | hole1: 0 0x41-0x47.7 (7) +0x0040| 56 34 0c 54 02 00 00 00| V4.T....| nextXid: 10000020566 0x48-0x4f.7 (8) +0x0050|00 60 00 00 |.`.. | nextOid: 24576 0x50-0x53.7 (4) +0x0050| 00 00 00 00 | .... | hole2: 0 0x54-0x57.7 (4) +0x0050| 00 f2 05 2a 01 00 00 00| ...*....| nextMulti: 5000000000 0x58-0x5f.7 (8) +0x0060|00 00 00 00 00 00 00 00 |........ | nextMultiOffset: 0 0x60-0x67.7 (8) +0x0060| 23 e6 0b 54 02 00 00 00| #..T....| oldestXid: 10000000547 0x68-0x6f.7 (8) +0x0070|01 00 00 00 |.... | oldestXidDB: 1 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | hole3: 0 0x74-0x77.7 (4) +0x0070| 00 f2 05 2a 01 00 00 00| ...*....| oldestMulti: 5000000000 0x78-0x7f.7 (8) +0x0080|01 00 00 00 |.... | oldestMultiDB: 1 0x80-0x83.7 (4) +0x0080| 00 00 00 00 | .... | hole4: 0 0x84-0x87.7 (4) +0x0080| 27 e8 ec 62 00 00 00 00| '..b....| time: "Fri, 05 Aug 2022 09:51:35 UTC" (1659693095) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | oldestCommitTsXid: 0 0x90-0x97.7 (8) +0x0090| 00 00 00 00 00 00 00 00| ........| newestCommitTsXid: 0 0x98-0x9f.7 (8) +0x00a0|56 34 0c 54 02 00 00 00 |V4.T.... | oldestActiveXid: 10000020566 0xa0-0xa7.7 (8) +0x00a0| 01 00 00 00 00 00 00 00| ........| unloggedLSN: "0/1" (1) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 00 00 00 00 |........ | minRecoveryPoint: "0/0" (0) 0xb0-0xb7.7 (8) +0x00b0| 00 00 00 00 | .... | minRecoveryPointTLI: 0 0xb8-0xbb.7 (4) +0x00b0| 00 00 00 00| ....| hole5: 0 0xbc-0xbf.7 (4) +0x00c0|00 00 00 00 00 00 00 00 |........ | backupStartPoint: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 00 00 00 00 00 00 00| ........| backupEndPoint: "0/0" (0) 0xc8-0xcf.7 (8) +0x00d0|00 |. | backupEndRequired: 0 0xd0-0xd0.7 (1) +0x00d0| 00 00 00 | ... | hole6: 0 0xd1-0xd3.7 (3) +0x00d0| 01 00 00 00 | .... | wal_level: "WAL_LEVEL_REPLICA" (1) 0xd4-0xd7.7 (4) +0x00d0| 00 | . | wal_log_hints: 0 0xd8-0xd8.7 (1) +0x00d0| 00 00 00 | ... | hole7: 0 0xd9-0xdb.7 (3) +0x00d0| 5d 00 00 00| ]...| MaxConnections: 93 0xdc-0xdf.7 (4) +0x00e0|08 00 00 00 |.... | max_worker_processes: 8 0xe0-0xe3.7 (4) +0x00e0| 00 00 00 00 | .... | max_prepared_xacts: 0 0xe4-0xe7.7 (4) +0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe8-0xeb.7 (4) +0x00e0| 00 | . | track_commit_timestamp: 0 0xec-0xec.7 (1) +0x00e0| 00 00 00| ...| hole8: 0 0xed-0xef.7 (3) +0x00f0|08 00 00 00 |.... | maxAlign: 8 0xf0-0xf3.7 (4) +0x00f0| 00 00 00 00 | .... | hole9: 0 0xf4-0xf7.7 (4) +0x00f0| 00 00 00 00 87 d6 32 41| ......2A| floatFormat: 1.234567e+06 0xf8-0xff.7 (8) +0x0100|00 20 00 00 |. .. | blcksz: 8192 0x100-0x103.7 (4) +0x0100| 00 00 02 00 | .... | relseg_size: 131072 0x104-0x107.7 (4) +0x0100| 00 20 00 00 | . .. | xlog_blcksz: 8192 0x108-0x10b.7 (4) +0x0100| 00 00 00 01| ....| xlog_seg_size: 16777216 0x10c-0x10f.7 (4) +0x0110|40 00 00 00 |@... | nameDataLen: 64 0x110-0x113.7 (4) +0x0110| 20 00 00 00 | ... | indexMaxKeys: 32 0x114-0x117.7 (4) +0x0110| cc 07 00 00 | .... | toast_max_chunk_size: 1996 0x118-0x11b.7 (4) +0x0110| 00 08 00 00| ....| loblksize: 2048 0x11c-0x11f.7 (4) +0x0120|01 |. | float4ByVal: 1 0x120-0x120.7 (1) +0x0120| 01 | . | float8ByVal: 1 0x121-0x121.7 (1) +0x0120| 00 00 | .. | hole10: 0 0x122-0x123.7 (2) +0x0120| 01 00 00 00 | .... | data_checksum_version: 1 0x124-0x127.7 (4) +0x0120| 39 2f 4a cd c5 9d 4d 3b| 9/J...M;| mock_authentication_nonce: "392f4acdc59d4d3b2c9968b782191526dbfa9ba84acd37d..." (raw bits) 0x128-0x147.7 (32) +0x0130|2c 99 68 b7 82 19 15 26 db fa 9b a8 4a cd 37 dc|,.h....&....J.7.| +0x0140|4f 6f 86 e9 6a ca f1 45 |Oo..j..E | +0x0140| 3c 03 00 00 | <... | icu_version: "60.3.0.0" (828) 0x148-0x14b.7 (4) +0x0140| 00 00 ff ff| ....| pg_old_version: 4294901760 0x14c-0x14f.7 (4) +0x0150|f6 54 89 ec |.T.. | crc: 3968423158 0x150-0x153.7 (4) +0x0150| 00 00 00 00 | .... | hole11: 0 0x154-0x157.7 (4) +0x0150| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x158-0x1fff.7 (7848) +0x0160|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7848) | | diff --git a/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest b/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest index 8ebb81dd0..10c6f75b8 100644 --- a/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee11 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 90150 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 8040 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 360 -} +$ fq -d pg_heap -o flavour=pgproee11 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 90150 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[60]{}: ItemIdData 0x104-0x107.7 (4) +0x100| 68 81 f2 00 | h... | lp_off: 360 0x104-0x107.7 (4) +0x100| 68 81 f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x104-0x107.7 (4) +0x100| 68 81 f2 00 | h... | lp_len: 121 0x104-0x107.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest b/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest index 58edc4f9a..ff608ab46 100644 --- a/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest +++ b/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest @@ -1,105 +1,91 @@ -$ fq -d pg_heap -o flavour=pgproee11 ".[0].Tuples[0,-1] | tovalue" 90153 -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 1, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 1 - }, - "t_bits": "650000000b0000004ff80000", - "t_choice": { - "t_datum": { - "datum_len_": 176742, - "datum_typeid": 1, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 1, - "t_xvac": 1 - }, - "t_xmax": 0, - "t_xmin": "10015117002" - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 4 - }, - "t_hoff": 24, - "t_infomask": 10497, - "t_infomask2": 32772 -} -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 1, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 1 - }, - "t_bits": "640000000a00000041590000", - "t_choice": { - "t_datum": { - "datum_len_": 176212, - "datum_typeid": 1, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 1, - "t_xvac": 1 - }, - "t_xmax": 0, - "t_xmin": "10015116472" - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 254 - }, - "t_hoff": 24, - "t_infomask": 10497, - "t_infomask2": 32772 -} +$ fq -d pg_heap -o flavour=pgproee11 ".[0].Tuples[0,-1] | dv" 90153 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x11d8-0x11fb.7 (36) + | | | t_choice{}: 0x11d8-0x11e3.7 (12) + | | | t_heap{}: 0x11d8-0x11e3.7 (12) +0x11d0| 66 b2 02 00 | f... | t_xmin: "10015117002" (176742) 0x11d8-0x11db.7 (4) +0x11d0| 00 00 00 00| ....| t_xmax: 0 0x11dc-0x11df.7 (4) + | | | t_field3{}: 0x11e0-0x11e3.7 (4) +0x11e0|01 00 00 00 |.... | t_cid: 1 0x11e0-0x11e3.7 (4) +0x11e0|01 00 00 00 |.... | t_xvac: 1 0x11e0-0x11e3.7 (4) + | | | t_datum{}: 0x11d8-0x11e3.7 (12) +0x11d0| 66 b2 02 00 | f... | datum_len_: 176742 0x11d8-0x11db.7 (4) +0x11d0| 00 00 00 00| ....| datum_typmod: 0 0x11dc-0x11df.7 (4) +0x11e0|01 00 00 00 |.... | datum_typeid: 1 0x11e0-0x11e3.7 (4) + | | | t_ctid{}: 0x11e4-0x11e9.7 (6) +0x11e0| 00 00 00 00 | .... | ip_blkid: 0 0x11e4-0x11e7.7 (4) +0x11e0| 04 00 | .. | ip_posid: 4 0x11e8-0x11e9.7 (2) +0x11e0| 04 80 | .. | t_infomask2: 32772 0x11ea-0x11eb.7 (2) + | | | Infomask2{}: 0x11ea-0x11eb.7 (2) +0x11e0| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x11ea-0x11eb.7 (2) +0x11e0| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x11ea-0x11eb.7 (2) +0x11e0| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x11ea-0x11eb.7 (2) +0x11e0| 01 29 | .) | t_infomask: 10497 0x11ec-0x11ed.7 (2) + | | | Infomask{}: 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_HASNULL: 1 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_HASVARWIDTH: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_HASEXTERNAL: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_HASOID_OLD: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_KEYSHR_LOCK: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_COMBOCID: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_EXCL_LOCK: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_LOCK_ONLY: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_SHR_LOCK: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_LOCK_MASK: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMIN_COMMITTED: 1 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMIN_INVALID: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMIN_FROZEN: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_COMMITTED: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_INVALID: 1 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_IS_MULTI: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_UPDATED: 1 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_MOVED_OFF: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_MOVED_IN: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_MOVED: 0 0x11ec-0x11ed.7 (2) +0x11e0| 18 | . | t_hoff: 24 0x11ee-0x11ee.7 (1) +0x11e0| 07| .| padding0: 7 0x11ef-0x11ef.7 (1) +0x11f0|65 00 00 00 0b 00 00 00 4f f8 00 00 |e.......O... | t_bits: "650000000b0000004ff80000" (raw bits) 0x11f0-0x11fb.7 (12) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[99]{}: HeapTupleHeaderData 0x1818-0x183b.7 (36) + | | | t_choice{}: 0x1818-0x1823.7 (12) + | | | t_heap{}: 0x1818-0x1823.7 (12) +0x1810| 54 b0 02 00 | T... | t_xmin: "10015116472" (176212) 0x1818-0x181b.7 (4) +0x1810| 00 00 00 00| ....| t_xmax: 0 0x181c-0x181f.7 (4) + | | | t_field3{}: 0x1820-0x1823.7 (4) +0x1820|01 00 00 00 |.... | t_cid: 1 0x1820-0x1823.7 (4) +0x1820|01 00 00 00 |.... | t_xvac: 1 0x1820-0x1823.7 (4) + | | | t_datum{}: 0x1818-0x1823.7 (12) +0x1810| 54 b0 02 00 | T... | datum_len_: 176212 0x1818-0x181b.7 (4) +0x1810| 00 00 00 00| ....| datum_typmod: 0 0x181c-0x181f.7 (4) +0x1820|01 00 00 00 |.... | datum_typeid: 1 0x1820-0x1823.7 (4) + | | | t_ctid{}: 0x1824-0x1829.7 (6) +0x1820| 00 00 00 00 | .... | ip_blkid: 0 0x1824-0x1827.7 (4) +0x1820| fe 00 | .. | ip_posid: 254 0x1828-0x1829.7 (2) +0x1820| 04 80 | .. | t_infomask2: 32772 0x182a-0x182b.7 (2) + | | | Infomask2{}: 0x182a-0x182b.7 (2) +0x1820| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x182a-0x182b.7 (2) +0x1820| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x182a-0x182b.7 (2) +0x1820| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x182a-0x182b.7 (2) +0x1820| 01 29 | .) | t_infomask: 10497 0x182c-0x182d.7 (2) + | | | Infomask{}: 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_HASNULL: 1 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_HASVARWIDTH: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_HASEXTERNAL: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_HASOID_OLD: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_KEYSHR_LOCK: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_COMBOCID: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_EXCL_LOCK: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_LOCK_ONLY: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_SHR_LOCK: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_LOCK_MASK: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMIN_COMMITTED: 1 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMIN_INVALID: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMIN_FROZEN: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_COMMITTED: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_INVALID: 1 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_IS_MULTI: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_UPDATED: 1 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_MOVED_OFF: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_MOVED_IN: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_MOVED: 0 0x182c-0x182d.7 (2) +0x1820| 18 | . | t_hoff: 24 0x182e-0x182e.7 (1) +0x1820| 07| .| padding0: 7 0x182f-0x182f.7 (1) +0x1830|64 00 00 00 0a 00 00 00 41 59 00 00 |d.......AY.. | t_bits: "640000000a00000041590000" (raw bits) 0x1830-0x183b.7 (12) diff --git a/format/postgres/testdata/flavours/pgproee11/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee11/pg_control.fqtest index 220a086fc..f8ac6f2e2 100644 --- a/format/postgres/testdata/flavours/pgproee11/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgproee11/pg_control.fqtest @@ -1,60 +1,73 @@ -$ fq -d pg_control -o flavour=pgproee11 tovalue pg_control -{ - "MaxConnections": 395, - "active_snapshot": 0, - "backupEndPoint": "0/0", - "backupEndRequired": 0, - "backupStartPoint": "0/0", - "blcksz": 8192, - "catalog_version_no": 201809182, - "checkPoint": "4/353A88", - "checkPointCopy": { - "PrevTimeLineID": 1, - "ThisTimeLineID": 1, - "fullPageWrites": 1, - "newestCommitTsXid": 0, - "nextMulti": 5000000000, - "nextMultiOffset": 0, - "nextOid": 98304, - "nextXid": 10015100674, - "oldestActiveXid": 10015100664, - "oldestCommitTsXid": 0, - "oldestMulti": 5000000000, - "oldestMultiDB": 1, - "oldestXid": 10000000571, - "oldestXidDB": 1, - "redo": "3/C8525640", - "time": "Tue, 02 Aug 2022 10:13:30 UTC" - }, - "crc": 2569379933, - "data_checksum_version": 1, - "float4ByVal": 1, - "float8ByVal": 1, - "floatFormat": 1234567, - "icu_version": "50.2.0.0", - "indexMaxKeys": 32, - "loblksize": 2048, - "maxAlign": 8, - "max_locks_per_xact": 64, - "max_prepared_xacts": 0, - "max_worker_processes": 8, - "minRecoveryPoint": "0/0", - "minRecoveryPointTLI": 0, - "mock_authentication_nonce": "4c9a5d04f18324463c503e7d429469a70fe34aacd9f4cb2a42d22b5e7cf01cc9", - "nameDataLen": 64, - "oldest_snapshot": 1, - "pg_control_version": "Postgres Pro Enterprise 1200", - "pg_old_version": 4294901760, - "recent_snapshot": 0, - "relseg_size": 131072, - "state": "DB_IN_PRODUCTION", - "system_identifier": 7115406925904922932, - "time": "Tue, 02 Aug 2022 10:18:00 UTC", - "toast_max_chunk_size": 1996, - "track_commit_timestamp": 0, - "unloggedLSN": "0/1", - "wal_level": "WAL_LEVEL_REPLICA", - "wal_log_hints": 0, - "xlog_blcksz": 8192, - "xlog_seg_size": 16777216 -} +$ fq -d pg_control -o flavour=pgproee11 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|34 c9 ea 6a e6 00 bf 62 |4..j...b | system_identifier: 7115406925904922932 0x0-0x7.7 (8) +0x0000| b0 04 45 50 | ..EP | pg_control_version: "Postgres Pro Enterprise 1200" (1346700464) 0x8-0xb.7 (4) +0x0000| 1e 5d 07 0c| .]..| catalog_version_no: 201809182 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| d8 f9 e8 62 00 00 00 00| ...b....| time: "Tue, 02 Aug 2022 10:18:00 UTC" (1659435480) 0x18-0x1f.7 (8) +0x0020|88 3a 35 00 04 00 00 00 |.:5..... | checkPoint: "4/353A88" (17183357576) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x9f.7 (120) +0x0020| 40 56 52 c8 03 00 00 00| @VR.....| redo: "3/C8525640" (16245741120) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|02 4f f2 54 02 00 00 00 |.O.T.... | nextXid: 10015100674 0x40-0x47.7 (8) +0x0040| 00 80 01 00 | .... | nextOid: 98304 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) +0x0060|3b e6 0b 54 02 00 00 00 |;..T.... | oldestXid: 10000000571 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) +0x0080|ca f8 e8 62 00 00 00 00 |...b.... | time: "Tue, 02 Aug 2022 10:13:30 UTC" (1659435210) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) +0x0090| f8 4e f2 54 02 00 00 00| .N.T....| oldestActiveXid: 10015100664 0x98-0x9f.7 (8) +0x00a0|01 00 00 00 00 00 00 00 |........ | unloggedLSN: "0/1" (1) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) +0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) +0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) +0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) +0x00d0| 8b 01 00 00 | .... | MaxConnections: 395 0xd4-0xd7.7 (4) +0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) +0x00d0| 00 00 00 00| ....| max_prepared_xacts: 0 0xdc-0xdf.7 (4) +0x00e0|40 00 00 00 |@... | max_locks_per_xact: 64 0xe0-0xe3.7 (4) +0x00e0| 00 | . | track_commit_timestamp: 0 0xe4-0xe4.7 (1) +0x00e0| 00 00 00 | ... | hole8: 0 0xe5-0xe7.7 (3) +0x00e0| 08 00 00 00 | .... | maxAlign: 8 0xe8-0xeb.7 (4) +0x00e0| 00 00 00 00| ....| hole9: 0 0xec-0xef.7 (4) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) +0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) +0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) +0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) +0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) +0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) +0x0110| 01 | . | float4ByVal: 1 0x118-0x118.7 (1) +0x0110| 01 | . | float8ByVal: 1 0x119-0x119.7 (1) +0x0110| 00 00 | .. | hole10: 0 0x11a-0x11b.7 (2) +0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) +0x0120|4c 9a 5d 04 f1 83 24 46 3c 50 3e 7d 42 94 69 a7|L.]...$F

}B.i.| mock_authentication_nonce: "4c9a5d04f18324463c503e7d429469a70fe34aacd9f4cb2..." (raw bits) 0x120-0x13f.7 (32) +0x0130|0f e3 4a ac d9 f4 cb 2a 42 d2 2b 5e 7c f0 1c c9|..J....*B.+^|...| +0x0140|32 02 00 00 |2... | icu_version: "50.2.0.0" (562) 0x140-0x143.7 (4) +0x0140| 00 00 ff ff | .... | pg_old_version: 4294901760 0x144-0x147.7 (4) +0x0140| 01 00 00 00 | .... | oldest_snapshot: 1 0x148-0x14b.7 (4) +0x0140| 00 00 00 00| ....| recent_snapshot: 0 0x14c-0x14f.7 (4) +0x0150|00 00 00 00 |.... | active_snapshot: 0 0x150-0x153.7 (4) +0x0150| 5d a0 25 99 | ].%. | crc: 2569379933 0x154-0x157.7 (4) +0x0150| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x158-0x1fff.7 (7848) +0x0160|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7848) | | diff --git a/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest index fe67b6c16..7d3a566a5 100644 --- a/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee12 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 8040 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 360 -} +$ fq -d pg_heap -o flavour=pgproee12 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[65]{}: ItemIdData 0x118-0x11b.7 (4) +0x110| 68 81 f2 00 | h... | lp_off: 360 0x118-0x11b.7 (4) +0x110| 68 81 f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x118-0x11b.7 (4) +0x110| 68 81 f2 00 | h... | lp_len: 121 0x118-0x11b.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest b/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest index 09a19e2ad..f3c466aaf 100644 --- a/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee12 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 8120 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 680 -} +$ fq -d pg_heap -o flavour=pgproee12 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +0x10| b8 9f 60 00 | ..`. | lp_off: 8120 0x14-0x17.7 (4) +0x10| b8 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) +0x10| b8 9f 60 00 | ..`. | lp_len: 48 0x14-0x17.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[155]{}: ItemIdData 0x280-0x283.7 (4) +0x280|a8 82 60 00 |..`. | lp_off: 680 0x280-0x283.7 (4) +0x280|a8 82 60 00 |..`. | lp_flags: "LP_NORMAL" (1) 0x280-0x283.7 (4) +0x280|a8 82 60 00 |..`. | lp_len: 48 0x280-0x283.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest b/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest index 22872afdd..7dd501fe2 100644 --- a/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest @@ -1,105 +1,93 @@ -$ fq -d pg_heap -o flavour=pgproee12 ".[0].Tuples[0,-1] | tovalue" 16406 -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "020000000100000038fd0000890c0000c025676d63880200", - "t_choice": { - "t_datum": { - "datum_len_": 3, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": "10000000509" - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 1 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "0800000001000000e4f50000c9060000d0a36f6d63880200", - "t_choice": { - "t_datum": { - "datum_len_": 158, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": "10000000664" - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 156 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} +$ fq -d pg_heap -o flavour=pgproee12 ".[0].Tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fb8-0x1fe7.7 (48) + | | | t_choice{}: 0x1fb8-0x1fc3.7 (12) + | | | t_heap{}: 0x1fb8-0x1fc3.7 (12) +0x1fb0| 03 00 00 00 | .... | t_xmin: "10000000509" (3) 0x1fb8-0x1fbb.7 (4) +0x1fb0| 00 00 00 00| ....| t_xmax: 0 0x1fbc-0x1fbf.7 (4) + | | | t_field3{}: 0x1fc0-0x1fc3.7 (4) +0x1fc0|03 00 00 00 |.... | t_cid: 3 0x1fc0-0x1fc3.7 (4) +0x1fc0|03 00 00 00 |.... | t_xvac: 3 0x1fc0-0x1fc3.7 (4) + | | | t_datum{}: 0x1fb8-0x1fc3.7 (12) +0x1fb0| 03 00 00 00 | .... | datum_len_: 3 0x1fb8-0x1fbb.7 (4) +0x1fb0| 00 00 00 00| ....| datum_typmod: 0 0x1fbc-0x1fbf.7 (4) +0x1fc0|03 00 00 00 |.... | datum_typeid: 3 0x1fc0-0x1fc3.7 (4) + | | | t_ctid{}: 0x1fc4-0x1fc9.7 (6) +0x1fc0| 00 00 00 00 | .... | ip_blkid: 0 0x1fc4-0x1fc7.7 (4) +0x1fc0| 01 00 | .. | ip_posid: 1 0x1fc8-0x1fc9.7 (2) +0x1fc0| 06 00 | .. | t_infomask2: 6 0x1fca-0x1fcb.7 (2) + | | | Infomask2{}: 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 01 09 | .. | t_infomask: 2305 0x1fcc-0x1fcd.7 (2) + | | | Infomask{}: 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASNULL: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_UPDATED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 18 | . | t_hoff: 24 0x1fce-0x1fce.7 (1) +0x1fc0| 1f| .| padding0: 31 0x1fcf-0x1fcf.7 (1) +0x1fd0|02 00 00 00 01 00 00 00 38 fd 00 00 89 0c 00 00|........8.......| t_bits: "020000000100000038fd0000890c0000c025676d6388020..." (raw bits) 0x1fd0-0x1fe7.7 (24) +0x1fe0|c0 25 67 6d 63 88 02 00 |.%gmc... | + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[155]{}: HeapTupleHeaderData 0x2a8-0x2d7.7 (48) + | | | t_choice{}: 0x2a8-0x2b3.7 (12) + | | | t_heap{}: 0x2a8-0x2b3.7 (12) +0x2a0| 9e 00 00 00 | .... | t_xmin: "10000000664" (158) 0x2a8-0x2ab.7 (4) +0x2a0| 00 00 00 00| ....| t_xmax: 0 0x2ac-0x2af.7 (4) + | | | t_field3{}: 0x2b0-0x2b3.7 (4) +0x2b0|03 00 00 00 |.... | t_cid: 3 0x2b0-0x2b3.7 (4) +0x2b0|03 00 00 00 |.... | t_xvac: 3 0x2b0-0x2b3.7 (4) + | | | t_datum{}: 0x2a8-0x2b3.7 (12) +0x2a0| 9e 00 00 00 | .... | datum_len_: 158 0x2a8-0x2ab.7 (4) +0x2a0| 00 00 00 00| ....| datum_typmod: 0 0x2ac-0x2af.7 (4) +0x2b0|03 00 00 00 |.... | datum_typeid: 3 0x2b0-0x2b3.7 (4) + | | | t_ctid{}: 0x2b4-0x2b9.7 (6) +0x2b0| 00 00 00 00 | .... | ip_blkid: 0 0x2b4-0x2b7.7 (4) +0x2b0| 9c 00 | .. | ip_posid: 156 0x2b8-0x2b9.7 (2) +0x2b0| 06 00 | .. | t_infomask2: 6 0x2ba-0x2bb.7 (2) + | | | Infomask2{}: 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2ba-0x2bb.7 (2) +0x2b0| 01 09 | .. | t_infomask: 2305 0x2bc-0x2bd.7 (2) + | | | Infomask{}: 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASNULL: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_COMBOCID: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_UPDATED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 18 | . | t_hoff: 24 0x2be-0x2be.7 (1) +0x2b0| 1f| .| padding0: 31 0x2bf-0x2bf.7 (1) +0x2c0|08 00 00 00 01 00 00 00 e4 f5 00 00 c9 06 00 00|................| t_bits: "0800000001000000e4f50000c9060000d0a36f6d6388020..." (raw bits) 0x2c0-0x2d7.7 (24) +0x2d0|d0 a3 6f 6d 63 88 02 00 |..omc... | diff --git a/format/postgres/testdata/flavours/pgproee12/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee12/pg_control.fqtest index 2c73bb773..a3f252e6f 100644 --- a/format/postgres/testdata/flavours/pgproee12/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/pg_control.fqtest @@ -1,61 +1,45 @@ -$ fq -d pg_control -o flavour=pgproee12 tovalue pg_control -{ - "MaxConnections": 394, - "active_snapshot": 0, - "backupEndPoint": "0/0", - "backupEndRequired": 0, - "backupStartPoint": "0/0", - "blcksz": 8192, - "catalog_version_no": 201911201, - "checkPoint": "0/30777B8", - "checkPointCopy": { - "PrevTimeLineID": 1, - "ThisTimeLineID": 1, - "fullPageWrites": 1, - "newestCommitTsXid": 0, - "nextMulti": 5000000000, - "nextMultiOffset": 0, - "nextOid": 24576, - "nextXid": 10000020699, - "oldestActiveXid": 10000020699, - "oldestCommitTsXid": 0, - "oldestMulti": 5000000000, - "oldestMultiDB": 1, - "oldestXid": 10000000489, - "oldestXidDB": 1, - "redo": "0/3077768", - "time": "Thu, 04 Aug 2022 06:44:43 UTC" - }, - "crc": 3721875444, - "data_checksum_version": 1, - "float4ByVal": 1, - "float8ByVal": 1, - "floatFormat": 1234567, - "icu_version": "60.3.0.0", - "indexMaxKeys": 32, - "loblksize": 2048, - "maxAlign": 8, - "max_locks_per_xact": 64, - "max_prepared_xacts": 0, - "max_wal_senders": 10, - "max_worker_processes": 8, - "minRecoveryPoint": "0/0", - "minRecoveryPointTLI": 0, - "mock_authentication_nonce": "0bdb53d242ff029574e6aa87ff984b67e4a76678383559a314f265019e618ce4", - "nameDataLen": 64, - "oldest_snapshot": 1, - "pg_control_version": "Postgres Pro Enterprise 1201", - "pg_old_version": 4294901760, - "recent_snapshot": 0, - "relseg_size": 131072, - "state": "DB_IN_PRODUCTION", - "system_identifier": 7127906874857294296, - "time": "Thu, 04 Aug 2022 06:44:43 UTC", - "toast_max_chunk_size": 1996, - "track_commit_timestamp": 0, - "unloggedLSN": "0/3E8", - "wal_level": "WAL_LEVEL_REPLICA", - "wal_log_hints": 0, - "xlog_blcksz": 8192, - "xlog_seg_size": 16777216 -} +$ fq -d pg_control -o flavour=pgproee12 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) + | | | error: pg_control: error at position 0x50: "hole1" already exist in struct checkPointCopy + | | | github.com/wader/fq/pkg/decode.(*D).Fatalf + | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode.go:334 + | | | github.com/wader/fq/pkg/decode.(*D).AddChild + | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode.go:726 + | | | github.com/wader/fq/pkg/decode.(*D).TryFieldValue + | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode.go:1191 + | | | github.com/wader/fq/pkg/decode.(*D).TryFieldScalarFn + | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode.go:1206 + | | | github.com/wader/fq/pkg/decode.(*D).TryFieldScalarU32 + | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode_gen.go:2419 + | | | github.com/wader/fq/pkg/decode.(*D).FieldScalarU32 + | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode_gen.go:2432 + | | | github.com/wader/fq/pkg/decode.(*D).FieldU32 + | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode_gen.go:2447 + | | | github.com/wader/fq/format/postgres/flavours/pgproee12.DecodePgControl.func1 + | | | /home/pavel/work/tools/fq/fq/format/postgres/flavours/pgproee12/pg_control.go:119 + | | | github.com/wader/fq/pkg/decode.(*D).FieldStruct + | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode.go:774 + | | | github.com/wader/fq/format/postgres/flavours/pgproee12.DecodePgControl + | | | /home/pavel/work/tools/fq/fq/format/postgres/flavours/pgproee12/pg_control.go:102 + | | | github.com/wader/fq/format/postgres.decodePgControl + | | | /home/pavel/work/tools/fq/fq/format/postgres/pg_control.go:83 + | | | github.com/wader/fq/pkg/decode.decode.func1 + | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode.go:88 +0x0000|d8 09 ef 93 89 69 eb 62 |.....i.b | system_identifier: 7127906874857294296 0x0-0x7.7 (8) +0x0000| b1 04 45 50 | ..EP | pg_control_version: "Postgres Pro Enterprise 1201" (1346700465) 0x8-0xb.7 (4) +0x0000| a1 eb 08 0c| ....| catalog_version_no: 201911201 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| db 6a eb 62 00 00 00 00| .j.b....| time: "Thu, 04 Aug 2022 06:44:43 UTC" (1659595483) 0x18-0x1f.7 (8) +0x0020|b8 77 07 03 00 00 00 00 |.w...... | checkPoint: "0/30777B8" (50821048) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x4b.7 (36) +0x0020| 68 77 07 03 00 00 00 00| hw......| redo: "0/3077768" (50820968) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|db 34 0c 54 02 00 00 00 |.4.T.... | nextXid: 10000020699 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| unknown0: raw bits 0x4c-0x1fff.7 (8116) +0x0050|00 f2 05 2a 01 00 00 00 00 00 00 00 00 00 00 00|...*............| +* |until 0x1fff.7 (end) (8116) | | diff --git a/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest index 415969da6..2792304b5 100644 --- a/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee13 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 8040 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 360 -} +$ fq -d pg_heap -o flavour=pgproee13 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[68]{}: ItemIdData 0x124-0x127.7 (4) +0x120| 68 81 f2 00 | h... | lp_off: 360 0x124-0x127.7 (4) +0x120| 68 81 f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x124-0x127.7 (4) +0x120| 68 81 f2 00 | h... | lp_len: 121 0x124-0x127.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest b/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest index 21a26724a..063f35fb6 100644 --- a/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee13 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 8120 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 680 -} +$ fq -d pg_heap -o flavour=pgproee13 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +0x10| b8 9f 60 00 | ..`. | lp_off: 8120 0x14-0x17.7 (4) +0x10| b8 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) +0x10| b8 9f 60 00 | ..`. | lp_len: 48 0x14-0x17.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[155]{}: ItemIdData 0x280-0x283.7 (4) +0x280|a8 82 60 00 |..`. | lp_off: 680 0x280-0x283.7 (4) +0x280|a8 82 60 00 |..`. | lp_flags: "LP_NORMAL" (1) 0x280-0x283.7 (4) +0x280|a8 82 60 00 |..`. | lp_len: 48 0x280-0x283.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest b/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest index a2c4fbba3..a1f0bf0a0 100644 --- a/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest @@ -1,105 +1,93 @@ -$ fq -d pg_heap -o flavour=pgproee13 ".[0].Tuples[0,-1] | tovalue" 16406 -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "010000000100000076cd00003dfcffff088e15d477880200", - "t_choice": { - "t_datum": { - "datum_len_": 3, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": "10000000510" - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 1 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "0400000001000000718a000081fbffff546f1cd477880200", - "t_choice": { - "t_datum": { - "datum_len_": 158, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": "10000000665" - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 156 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} +$ fq -d pg_heap -o flavour=pgproee13 ".[0].Tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fb8-0x1fe7.7 (48) + | | | t_choice{}: 0x1fb8-0x1fc3.7 (12) + | | | t_heap{}: 0x1fb8-0x1fc3.7 (12) +0x1fb0| 03 00 00 00 | .... | t_xmin: "10000000510" (3) 0x1fb8-0x1fbb.7 (4) +0x1fb0| 00 00 00 00| ....| t_xmax: 0 0x1fbc-0x1fbf.7 (4) + | | | t_field3{}: 0x1fc0-0x1fc3.7 (4) +0x1fc0|03 00 00 00 |.... | t_cid: 3 0x1fc0-0x1fc3.7 (4) +0x1fc0|03 00 00 00 |.... | t_xvac: 3 0x1fc0-0x1fc3.7 (4) + | | | t_datum{}: 0x1fb8-0x1fc3.7 (12) +0x1fb0| 03 00 00 00 | .... | datum_len_: 3 0x1fb8-0x1fbb.7 (4) +0x1fb0| 00 00 00 00| ....| datum_typmod: 0 0x1fbc-0x1fbf.7 (4) +0x1fc0|03 00 00 00 |.... | datum_typeid: 3 0x1fc0-0x1fc3.7 (4) + | | | t_ctid{}: 0x1fc4-0x1fc9.7 (6) +0x1fc0| 00 00 00 00 | .... | ip_blkid: 0 0x1fc4-0x1fc7.7 (4) +0x1fc0| 01 00 | .. | ip_posid: 1 0x1fc8-0x1fc9.7 (2) +0x1fc0| 06 00 | .. | t_infomask2: 6 0x1fca-0x1fcb.7 (2) + | | | Infomask2{}: 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 01 09 | .. | t_infomask: 2305 0x1fcc-0x1fcd.7 (2) + | | | Infomask{}: 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASNULL: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_UPDATED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 18 | . | t_hoff: 24 0x1fce-0x1fce.7 (1) +0x1fc0| 1f| .| padding0: 31 0x1fcf-0x1fcf.7 (1) +0x1fd0|01 00 00 00 01 00 00 00 76 cd 00 00 3d fc ff ff|........v...=...| t_bits: "010000000100000076cd00003dfcffff088e15d47788020..." (raw bits) 0x1fd0-0x1fe7.7 (24) +0x1fe0|08 8e 15 d4 77 88 02 00 |....w... | + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[155]{}: HeapTupleHeaderData 0x2a8-0x2d7.7 (48) + | | | t_choice{}: 0x2a8-0x2b3.7 (12) + | | | t_heap{}: 0x2a8-0x2b3.7 (12) +0x2a0| 9e 00 00 00 | .... | t_xmin: "10000000665" (158) 0x2a8-0x2ab.7 (4) +0x2a0| 00 00 00 00| ....| t_xmax: 0 0x2ac-0x2af.7 (4) + | | | t_field3{}: 0x2b0-0x2b3.7 (4) +0x2b0|03 00 00 00 |.... | t_cid: 3 0x2b0-0x2b3.7 (4) +0x2b0|03 00 00 00 |.... | t_xvac: 3 0x2b0-0x2b3.7 (4) + | | | t_datum{}: 0x2a8-0x2b3.7 (12) +0x2a0| 9e 00 00 00 | .... | datum_len_: 158 0x2a8-0x2ab.7 (4) +0x2a0| 00 00 00 00| ....| datum_typmod: 0 0x2ac-0x2af.7 (4) +0x2b0|03 00 00 00 |.... | datum_typeid: 3 0x2b0-0x2b3.7 (4) + | | | t_ctid{}: 0x2b4-0x2b9.7 (6) +0x2b0| 00 00 00 00 | .... | ip_blkid: 0 0x2b4-0x2b7.7 (4) +0x2b0| 9c 00 | .. | ip_posid: 156 0x2b8-0x2b9.7 (2) +0x2b0| 06 00 | .. | t_infomask2: 6 0x2ba-0x2bb.7 (2) + | | | Infomask2{}: 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2ba-0x2bb.7 (2) +0x2b0| 01 09 | .. | t_infomask: 2305 0x2bc-0x2bd.7 (2) + | | | Infomask{}: 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASNULL: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_COMBOCID: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_UPDATED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 18 | . | t_hoff: 24 0x2be-0x2be.7 (1) +0x2b0| 1f| .| padding0: 31 0x2bf-0x2bf.7 (1) +0x2c0|04 00 00 00 01 00 00 00 71 8a 00 00 81 fb ff ff|........q.......| t_bits: "0400000001000000718a000081fbffff546f1cd47788020..." (raw bits) 0x2c0-0x2d7.7 (24) +0x2d0|54 6f 1c d4 77 88 02 00 |To..w... | diff --git a/format/postgres/testdata/flavours/pgproee13/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee13/pg_control.fqtest index 1b9e8c45d..08dbe2fca 100644 --- a/format/postgres/testdata/flavours/pgproee13/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgproee13/pg_control.fqtest @@ -1,57 +1,69 @@ -$ fq -d pg_control -o flavour=pgproee13 tovalue pg_control -{ - "MaxConnections": 93, - "backupEndPoint": "0/0", - "backupEndRequired": 0, - "backupStartPoint": "0/0", - "blcksz": 8192, - "catalog_version_no": 202010151, - "checkPoint": "0/2E90A78", - "checkPointCopy": { - "PrevTimeLineID": 1, - "ThisTimeLineID": 1, - "fullPageWrites": 1, - "newestCommitTsXid": 0, - "nextMulti": 5000000000, - "nextMultiOffset": 0, - "nextOid": 24576, - "nextXid": 10000017810, - "oldestActiveXid": 10000017810, - "oldestCommitTsXid": 0, - "oldestMulti": 5000000000, - "oldestMultiDB": 1, - "oldestXid": 10000000491, - "oldestXidDB": 1, - "redo": "0/2E90A28", - "time": "Fri, 05 Aug 2022 07:10:29 UTC" - }, - "crc": 2265363627, - "data_checksum_version": 1, - "float8ByVal": 1, - "floatFormat": 1234567, - "icu_version": "60.3.0.0", - "indexMaxKeys": 32, - "loblksize": 2048, - "maxAlign": 8, - "max_locks_per_xact": 64, - "max_prepared_xacts": 0, - "max_wal_senders": 10, - "max_worker_processes": 8, - "minRecoveryPoint": "0/0", - "minRecoveryPointTLI": 0, - "mock_authentication_nonce": "9e645921b6ed3038f8bec1a78240dfcd0cbfdafcba223be1e7b27950c6038439", - "nameDataLen": 64, - "pg_control_version": "Postgres Pro Enterprise 1300", - "pg_old_version": 4294901760, - "relseg_size": 131072, - "state": "DB_IN_PRODUCTION", - "system_identifier": 7128279481940273503, - "time": "Fri, 05 Aug 2022 07:10:30 UTC", - "toast_max_chunk_size": 1996, - "track_commit_timestamp": 0, - "unloggedLSN": "0/3E8", - "wal_level": "WAL_LEVEL_REPLICA", - "wal_log_hints": 0, - "xlog_blcksz": 8192, - "xlog_seg_size": 16777216 -} +$ fq -d pg_control -o flavour=pgproee13 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|5f 69 c1 ec 6b bc ec 62 |_i..k..b | system_identifier: 7128279481940273503 0x0-0x7.7 (8) +0x0000| 14 05 45 50 | ..EP | pg_control_version: "Postgres Pro Enterprise 1300" (1346700564) 0x8-0xb.7 (4) +0x0000| 27 6e 0a 0c| 'n..| catalog_version_no: 202010151 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 66 c2 ec 62 00 00 00 00| f..b....| time: "Fri, 05 Aug 2022 07:10:30 UTC" (1659683430) 0x18-0x1f.7 (8) +0x0020|78 0a e9 02 00 00 00 00 |x....... | checkPoint: "0/2E90A78" (48827000) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x9f.7 (120) +0x0020| 28 0a e9 02 00 00 00 00| (.......| redo: "0/2E90A28" (48826920) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|92 29 0c 54 02 00 00 00 |.).T.... | nextXid: 10000017810 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) +0x0060|eb e5 0b 54 02 00 00 00 |...T.... | oldestXid: 10000000491 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) +0x0080|65 c2 ec 62 00 00 00 00 |e..b.... | time: "Fri, 05 Aug 2022 07:10:29 UTC" (1659683429) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) +0x0090| 92 29 0c 54 02 00 00 00| .).T....| oldestActiveXid: 10000017810 0x98-0x9f.7 (8) +0x00a0|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) +0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) +0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) +0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) +0x00d0| 5d 00 00 00 | ]... | MaxConnections: 93 0xd4-0xd7.7 (4) +0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) +0x00d0| 0a 00 00 00| ....| max_wal_senders: 10 0xdc-0xdf.7 (4) +0x00e0|00 00 00 00 |.... | max_prepared_xacts: 0 0xe0-0xe3.7 (4) +0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe4-0xe7.7 (4) +0x00e0| 00 | . | track_commit_timestamp: 0 0xe8-0xe8.7 (1) +0x00e0| 00 00 00 | ... | hole8: 0 0xe9-0xeb.7 (3) +0x00e0| 08 00 00 00| ....| maxAlign: 8 0xec-0xef.7 (4) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) +0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) +0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) +0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) +0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) +0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) +0x0110| 01 | . | float8ByVal: 1 0x118-0x118.7 (1) +0x0110| 00 00 00 | ... | hole9: 0 0x119-0x11b.7 (3) +0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) +0x0120|9e 64 59 21 b6 ed 30 38 f8 be c1 a7 82 40 df cd|.dY!..08.....@..| mock_authentication_nonce: "9e645921b6ed3038f8bec1a78240dfcd0cbfdafcba223be..." (raw bits) 0x120-0x13f.7 (32) +0x0130|0c bf da fc ba 22 3b e1 e7 b2 79 50 c6 03 84 39|.....";...yP...9| +0x0140|3c 03 00 00 |<... | icu_version: "60.3.0.0" (828) 0x140-0x143.7 (4) +0x0140| 00 00 ff ff | .... | pg_old_version: 4294901760 0x144-0x147.7 (4) +0x0140| ab b4 06 87 | .... | crc: 2265363627 0x148-0x14b.7 (4) +0x0140| 00 00 00 00| ....| padding0: 0 0x14c-0x14f.7 (4) +0x0150|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| unused: raw bits 0x150-0x1fff.7 (7856) +* |until 0x1fff.7 (end) (7856) | | diff --git a/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest index baef5eebf..ca8168286 100644 --- a/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee14 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 -{ - "lp_flags": "LP_REDIRECT", - "lp_len": 0, - "lp_off": 83 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 488 -} +$ fq -d pg_heap -o flavour=pgproee14 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +0x10| 53 00 01 00 | S... | lp_off: 83 0x14-0x17.7 (4) +0x10| 53 00 01 00 | S... | lp_flags: "LP_REDIRECT" (2) 0x14-0x17.7 (4) +0x10| 53 00 01 00 | S... | lp_len: 0 0x14-0x17.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[85]{}: ItemIdData 0x168-0x16b.7 (4) +0x160| e8 81 f2 00 | .... | lp_off: 488 0x168-0x16b.7 (4) +0x160| e8 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x168-0x16b.7 (4) +0x160| e8 81 f2 00 | .... | lp_len: 121 0x168-0x16b.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee14/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee14/pg_control.fqtest index 34b9ea48c..3007b7a5b 100644 --- a/format/postgres/testdata/flavours/pgproee14/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgproee14/pg_control.fqtest @@ -1,57 +1,69 @@ -$ fq -d pg_control -o flavour=pgproee14 tovalue pg_control -{ - "MaxConnections": 198, - "backupEndPoint": "0/0", - "backupEndRequired": 0, - "backupStartPoint": "0/0", - "blcksz": 8192, - "catalog_version_no": 202203031, - "checkPoint": "0/1A001F8", - "checkPointCopy": { - "PrevTimeLineID": 1, - "ThisTimeLineID": 1, - "fullPageWrites": 1, - "newestCommitTsXid": 0, - "nextMulti": 5000000000, - "nextMultiOffset": 0, - "nextOid": 13779, - "nextXid": 10000000753, - "oldestActiveXid": 10000000753, - "oldestCommitTsXid": 0, - "oldestMulti": 5000000000, - "oldestMultiDB": 1, - "oldestXid": 10000000744, - "oldestXidDB": 1, - "redo": "0/1A001A8", - "time": "Mon, 04 Jul 2022 05:03:12 UTC" - }, - "crc": 546321267, - "data_checksum_version": 1, - "float8ByVal": 1, - "floatFormat": 1234567, - "icu_version": "67.1.0.0", - "indexMaxKeys": 32, - "loblksize": 2048, - "maxAlign": 8, - "max_locks_per_xact": 64, - "max_prepared_xacts": 0, - "max_wal_senders": 10, - "max_worker_processes": 8, - "minRecoveryPoint": "0/0", - "minRecoveryPointTLI": 0, - "mock_authentication_nonce": "ddf2b7da2f4a5cac5dcee93421d6a803d6a08dabff417697f5d172b0db8e80cb", - "nameDataLen": 64, - "pg_control_version": "Postgres Pro Enterprise 1300", - "pg_old_version": 4294901760, - "relseg_size": 131072, - "state": "DB_IN_PRODUCTION", - "system_identifier": 7114200320151217064, - "time": "Mon, 04 Jul 2022 05:03:12 UTC", - "toast_max_chunk_size": 1996, - "track_commit_timestamp": 0, - "unloggedLSN": "0/3E8", - "wal_level": "WAL_LEVEL_REPLICA", - "wal_log_hints": 0, - "xlog_blcksz": 8192, - "xlog_seg_size": 16777216 -} +$ fq -d pg_control -o flavour=pgproee14 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|a8 63 95 9f 7f b7 ba 62 |.c.....b | system_identifier: 7114200320151217064 0x0-0x7.7 (8) +0x0000| 14 05 45 50 | ..EP | pg_control_version: "Postgres Pro Enterprise 1300" (1346700564) 0x8-0xb.7 (4) +0x0000| 97 5f 0d 0c| ._..| catalog_version_no: 202203031 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 90 74 c2 62 00 00 00 00| .t.b....| time: "Mon, 04 Jul 2022 05:03:12 UTC" (1656910992) 0x18-0x1f.7 (8) +0x0020|f8 01 a0 01 00 00 00 00 |........ | checkPoint: "0/1A001F8" (27263480) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x9f.7 (120) +0x0020| a8 01 a0 01 00 00 00 00| ........| redo: "0/1A001A8" (27263400) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|f1 e6 0b 54 02 00 00 00 |...T.... | nextXid: 10000000753 0x40-0x47.7 (8) +0x0040| d3 35 00 00 | .5.. | nextOid: 13779 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) +0x0060|e8 e6 0b 54 02 00 00 00 |...T.... | oldestXid: 10000000744 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) +0x0080|90 74 c2 62 00 00 00 00 |.t.b.... | time: "Mon, 04 Jul 2022 05:03:12 UTC" (1656910992) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) +0x0090| f1 e6 0b 54 02 00 00 00| ...T....| oldestActiveXid: 10000000753 0x98-0x9f.7 (8) +0x00a0|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) +0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) +0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) +0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) +0x00d0| c6 00 00 00 | .... | MaxConnections: 198 0xd4-0xd7.7 (4) +0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) +0x00d0| 0a 00 00 00| ....| max_wal_senders: 10 0xdc-0xdf.7 (4) +0x00e0|00 00 00 00 |.... | max_prepared_xacts: 0 0xe0-0xe3.7 (4) +0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe4-0xe7.7 (4) +0x00e0| 00 | . | track_commit_timestamp: 0 0xe8-0xe8.7 (1) +0x00e0| 00 00 00 | ... | hole8: 0 0xe9-0xeb.7 (3) +0x00e0| 08 00 00 00| ....| maxAlign: 8 0xec-0xef.7 (4) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) +0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) +0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) +0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) +0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) +0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) +0x0110| 01 | . | float8ByVal: 1 0x118-0x118.7 (1) +0x0110| 00 00 00 | ... | hole9: 0 0x119-0x11b.7 (3) +0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) +0x0120|dd f2 b7 da 2f 4a 5c ac 5d ce e9 34 21 d6 a8 03|..../J\.]..4!...| mock_authentication_nonce: "ddf2b7da2f4a5cac5dcee93421d6a803d6a08dabff41769..." (raw bits) 0x120-0x13f.7 (32) +0x0130|d6 a0 8d ab ff 41 76 97 f5 d1 72 b0 db 8e 80 cb|.....Av...r.....| +0x0140|43 01 00 00 |C... | icu_version: "67.1.0.0" (323) 0x140-0x143.7 (4) +0x0140| 00 00 ff ff | .... | pg_old_version: 4294901760 0x144-0x147.7 (4) +0x0140| 73 33 90 20 | s3. | crc: 546321267 0x148-0x14b.7 (4) +0x0140| 00 00 00 00| ....| padding0: 0 0x14c-0x14f.7 (4) +0x0150|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| unused: raw bits 0x150-0x1fff.7 (7856) +* |until 0x1fff.7 (end) (7856) | | diff --git a/format/postgres/testdata/flavours/postgres11/16396_1.fqtest b/format/postgres/testdata/flavours/postgres11/16396_1.fqtest index ffd74b637..217dab71d 100644 --- a/format/postgres/testdata/flavours/postgres11/16396_1.fqtest +++ b/format/postgres/testdata/flavours/postgres11/16396_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=postgres11 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 8064 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 512 -} +$ fq -d pg_heap -o flavour=postgres11 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[82]{}: ItemIdData 0x160-0x163.7 (4) +0x160|00 82 f2 00 |.... | lp_off: 512 0x160-0x163.7 (4) +0x160|00 82 f2 00 |.... | lp_flags: "LP_NORMAL" (1) 0x160-0x163.7 (4) +0x160|00 82 f2 00 |.... | lp_len: 121 0x160-0x163.7 (4) diff --git a/format/postgres/testdata/flavours/postgres11/16406_1.fqtest b/format/postgres/testdata/flavours/postgres11/16406_1.fqtest index fb6cd9ed1..5db5c0fd3 100644 --- a/format/postgres/testdata/flavours/postgres11/16406_1.fqtest +++ b/format/postgres/testdata/flavours/postgres11/16406_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=postgres11 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 8144 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 656 -} +$ fq -d pg_heap -o flavour=postgres11 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/postgres11/16406_2.fqtest b/format/postgres/testdata/flavours/postgres11/16406_2.fqtest index aae9ce058..aa8a8332b 100644 --- a/format/postgres/testdata/flavours/postgres11/16406_2.fqtest +++ b/format/postgres/testdata/flavours/postgres11/16406_2.fqtest @@ -1,105 +1,93 @@ -$ fq -d pg_heap -o flavour=postgres11 ".[0].Tuples[0,-1] | tovalue" 16406 -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "07000000010000007419010097f5ffffb55804f053880200", - "t_choice": { - "t_datum": { - "datum_len_": 581, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 581 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 1 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "0900000001000000feda000081050000e36412f053880200", - "t_choice": { - "t_datum": { - "datum_len_": 739, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 739 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 157 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} +$ fq -d pg_heap -o flavour=postgres11 ".[0].Tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|45 02 00 00 |E... | t_xmin: 581 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|45 02 00 00 |E... | datum_len_: 581 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 07 00 00 00 01 00 00 00| ........| t_bits: "07000000010000007419010097f5ffffb55804f05388020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1ff0|74 19 01 00 97 f5 ff ff b5 58 04 f0 53 88 02 00|t........X..S...| + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|e3 02 00 00 |.... | t_xmin: 739 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|e3 02 00 00 |.... | datum_len_: 739 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 09 00 00 00 01 00 00 00| ........| t_bits: "0900000001000000feda000081050000e36412f05388020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2b0|fe da 00 00 81 05 00 00 e3 64 12 f0 53 88 02 00|.........d..S...| diff --git a/format/postgres/testdata/flavours/postgres11/pg_control.fqtest b/format/postgres/testdata/flavours/postgres11/pg_control.fqtest index 1ea20a316..0d68d5df2 100644 --- a/format/postgres/testdata/flavours/postgres11/pg_control.fqtest +++ b/format/postgres/testdata/flavours/postgres11/pg_control.fqtest @@ -1,56 +1,68 @@ -$ fq -d pg_control -o flavour=postgres11 tovalue pg_control -{ - "MaxConnections": 1000, - "backupEndPoint": "0/0", - "backupEndRequired": 0, - "backupStartPoint": "0/0", - "blcksz": 8192, - "catalog_version_no": 201809051, - "checkPoint": "0/36A2DB8", - "checkPointCopy": { - "PrevTimeLineID": 1, - "ThisTimeLineID": 1, - "fullPageWrites": 1, - "newestCommitTsXid": 0, - "nextMulti": 1, - "nextMultiOffset": 0, - "nextOid": 24576, - "nextXid": 41090, - "nextXidEpoch": 0, - "oldestActiveXid": 41090, - "oldestCommitTsXid": 0, - "oldestMulti": 1, - "oldestMultiDB": 1, - "oldestXid": 561, - "oldestXidDB": 1, - "redo": "0/36A2D80", - "time": "Wed, 03 Aug 2022 12:16:33 UTC" - }, - "crc": 458179718, - "data_checksum_version": 0, - "float4ByVal": 1, - "float8ByVal": 1, - "floatFormat": 1234567, - "indexMaxKeys": 32, - "loblksize": 2048, - "maxAlign": 8, - "max_locks_per_xact": 64, - "max_prepared_xacts": 0, - "max_worker_processes": 8, - "minRecoveryPoint": "0/0", - "minRecoveryPointTLI": 0, - "mock_authentication_nonce": "8fd4c021b88de7556e475cdd35b16790492bd588c0e7919063eeec9abb6cb28e", - "nameDataLen": 64, - "pg_control_version": 1100, - "relseg_size": 131072, - "state": "DB_IN_PRODUCTION", - "system_identifier": 7121744337699454457, - "time": "Wed, 03 Aug 2022 12:16:33 UTC", - "toast_max_chunk_size": 1996, - "track_commit_timestamp": 0, - "unloggedLSN": "0/1", - "wal_level": "WAL_LEVEL_REPLICA", - "wal_log_hints": 0, - "xlog_blcksz": 8192, - "xlog_seg_size": 16777216 -} +$ fq -d pg_control -o flavour=postgres11 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|f9 bd b9 15 be 84 d5 62 |.......b | system_identifier: 7121744337699454457 0x0-0x7.7 (8) +0x0000| 4c 04 00 00 | L... | pg_control_version: 1100 0x8-0xb.7 (4) +0x0000| 9b 5c 07 0c| .\..| catalog_version_no: 201809051 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 21 67 ea 62 00 00 00 00| !g.b....| time: "Wed, 03 Aug 2022 12:16:33 UTC" (1659528993) 0x18-0x1f.7 (8) +0x0020|b8 2d 6a 03 00 00 00 00 |.-j..... | checkPoint: "0/36A2DB8" (57290168) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x77.7 (80) +0x0020| 80 2d 6a 03 00 00 00 00| .-j.....| redo: "0/36A2D80" (57290112) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 | ... | hole1: 0 0x39-0x3b.7 (3) +0x0030| 00 00 00 00| ....| nextXidEpoch: 0 0x3c-0x3f.7 (4) +0x0040|82 a0 00 00 |.... | nextXid: 41090 0x40-0x43.7 (4) +0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x44-0x47.7 (4) +0x0040| 01 00 00 00 | .... | nextMulti: 1 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| nextMultiOffset: 0 0x4c-0x4f.7 (4) +0x0050|31 02 00 00 |1... | oldestXid: 561 0x50-0x53.7 (4) +0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldestMulti: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldestMultiDB: 1 0x5c-0x5f.7 (4) +0x0060|21 67 ea 62 00 00 00 00 |!g.b.... | time: "Wed, 03 Aug 2022 12:16:33 UTC" (1659528993) 0x60-0x67.7 (8) +0x0060| 00 00 00 00 | .... | oldestCommitTsXid: 0 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| newestCommitTsXid: 0 0x6c-0x6f.7 (4) +0x0070|82 a0 00 00 |.... | oldestActiveXid: 41090 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | padding0: 0 0x74-0x77.7 (4) +0x0070| 01 00 00 00 00 00 00 00| ........| unloggedLSN: "0/1" (1) 0x78-0x7f.7 (8) +0x0080|00 00 00 00 00 00 00 00 |........ | minRecoveryPoint: "0/0" (0) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 | .... | minRecoveryPointTLI: 0 0x88-0x8b.7 (4) +0x0080| 00 00 00 00| ....| hole2: 0 0x8c-0x8f.7 (4) +0x0090|00 00 00 00 00 00 00 00 |........ | backupStartPoint: "0/0" (0) 0x90-0x97.7 (8) +0x0090| 00 00 00 00 00 00 00 00| ........| backupEndPoint: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 |. | backupEndRequired: 0 0xa0-0xa0.7 (1) +0x00a0| 00 00 00 | ... | hole3: 0 0xa1-0xa3.7 (3) +0x00a0| 01 00 00 00 | .... | wal_level: "WAL_LEVEL_REPLICA" (1) 0xa4-0xa7.7 (4) +0x00a0| 00 | . | wal_log_hints: 0 0xa8-0xa8.7 (1) +0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) +0x00a0| e8 03 00 00| ....| MaxConnections: 1000 0xac-0xaf.7 (4) +0x00b0|08 00 00 00 |.... | max_worker_processes: 8 0xb0-0xb3.7 (4) +0x00b0| 00 00 00 00 | .... | max_prepared_xacts: 0 0xb4-0xb7.7 (4) +0x00b0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xb8-0xbb.7 (4) +0x00b0| 00 | . | track_commit_timestamp: 0 0xbc-0xbc.7 (1) +0x00b0| 00 00 00| ...| hole5: 0 0xbd-0xbf.7 (3) +0x00c0|08 00 00 00 |.... | maxAlign: 8 0xc0-0xc3.7 (4) +0x00c0| 00 00 00 00 | .... | hole6: 0 0xc4-0xc7.7 (4) +0x00c0| 00 00 00 00 87 d6 32 41| ......2A| floatFormat: 1.234567e+06 0xc8-0xcf.7 (8) +0x00d0|00 20 00 00 |. .. | blcksz: 8192 0xd0-0xd3.7 (4) +0x00d0| 00 00 02 00 | .... | relseg_size: 131072 0xd4-0xd7.7 (4) +0x00d0| 00 20 00 00 | . .. | xlog_blcksz: 8192 0xd8-0xdb.7 (4) +0x00d0| 00 00 00 01| ....| xlog_seg_size: 16777216 0xdc-0xdf.7 (4) +0x00e0|40 00 00 00 |@... | nameDataLen: 64 0xe0-0xe3.7 (4) +0x00e0| 20 00 00 00 | ... | indexMaxKeys: 32 0xe4-0xe7.7 (4) +0x00e0| cc 07 00 00 | .... | toast_max_chunk_size: 1996 0xe8-0xeb.7 (4) +0x00e0| 00 08 00 00| ....| loblksize: 2048 0xec-0xef.7 (4) +0x00f0|01 |. | float4ByVal: 1 0xf0-0xf0.7 (1) +0x00f0| 01 | . | float8ByVal: 1 0xf1-0xf1.7 (1) +0x00f0| 00 00 | .. | hole7: 0 0xf2-0xf3.7 (2) +0x00f0| 00 00 00 00 | .... | data_checksum_version: 0 0xf4-0xf7.7 (4) +0x00f0| 8f d4 c0 21 b8 8d e7 55| ...!...U| mock_authentication_nonce: "8fd4c021b88de7556e475cdd35b16790492bd588c0e7919..." (raw bits) 0xf8-0x117.7 (32) +0x0100|6e 47 5c dd 35 b1 67 90 49 2b d5 88 c0 e7 91 90|nG\.5.g.I+......| +0x0110|63 ee ec 9a bb 6c b2 8e |c....l.. | +0x0110| 86 44 4f 1b | .DO. | crc: 458179718 0x118-0x11b.7 (4) +0x0110| 00 00 00 00| ....| padding1: 0 0x11c-0x11f.7 (4) +0x0120|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| unused: raw bits 0x120-0x1fff.7 (7904) +* |until 0x1fff.7 (end) (7904) | | diff --git a/format/postgres/testdata/flavours/postgres12/16396_1.fqtest b/format/postgres/testdata/flavours/postgres12/16396_1.fqtest index 274429290..94834323c 100644 --- a/format/postgres/testdata/flavours/postgres12/16396_1.fqtest +++ b/format/postgres/testdata/flavours/postgres12/16396_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=postgres12 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16396 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 8064 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 512 -} +$ fq -d pg_heap -o flavour=postgres12 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[81]{}: ItemIdData 0x15c-0x15f.7 (4) +0x150| 00 82 f2 00| ....| lp_off: 512 0x15c-0x15f.7 (4) +0x150| 00 82 f2 00| ....| lp_flags: "LP_NORMAL" (1) 0x15c-0x15f.7 (4) +0x150| 00 82 f2 00| ....| lp_len: 121 0x15c-0x15f.7 (4) diff --git a/format/postgres/testdata/flavours/postgres12/16406_1.fqtest b/format/postgres/testdata/flavours/postgres12/16406_1.fqtest index 91bd7137b..f99fe4790 100644 --- a/format/postgres/testdata/flavours/postgres12/16406_1.fqtest +++ b/format/postgres/testdata/flavours/postgres12/16406_1.fqtest @@ -1,11 +1,9 @@ -$ fq -d pg_heap -o flavour=postgres12 ".[0].PageHeaderData.pd_linp[0,-1] | tovalue" 16406 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 8144 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 656 -} +$ fq -d pg_heap -o flavour=postgres12 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/postgres12/16406_2.fqtest b/format/postgres/testdata/flavours/postgres12/16406_2.fqtest index ef1f5fe35..f70467f91 100644 --- a/format/postgres/testdata/flavours/postgres12/16406_2.fqtest +++ b/format/postgres/testdata/flavours/postgres12/16406_2.fqtest @@ -1,105 +1,93 @@ -$ fq -d pg_heap -o flavour=postgres12 ".[0].Tuples[0,-1] | tovalue" 16406 -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "0100000001000000df60000041090000c772ccc34f880200", - "t_choice": { - "t_datum": { - "datum_len_": 499, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 499 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 1 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "0a00000001000000d68c00009d0d0000b275d1c34f880200", - "t_choice": { - "t_datum": { - "datum_len_": 661, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 661 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 157 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} +$ fq -d pg_heap -o flavour=postgres12 ".[0].Tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f3 01 00 00 |.... | t_xmin: 499 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f3 01 00 00 |.... | datum_len_: 499 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 01 00 00 00 01 00 00 00| ........| t_bits: "0100000001000000df60000041090000c772ccc34f88020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1ff0|df 60 00 00 41 09 00 00 c7 72 cc c3 4f 88 02 00|.`..A....r..O...| + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|95 02 00 00 |.... | t_xmin: 661 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|95 02 00 00 |.... | datum_len_: 661 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 0a 00 00 00 01 00 00 00| ........| t_bits: "0a00000001000000d68c00009d0d0000b275d1c34f88020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2b0|d6 8c 00 00 9d 0d 00 00 b2 75 d1 c3 4f 88 02 00|.........u..O...| diff --git a/format/postgres/testdata/flavours/postgres12/pg_control.fqtest b/format/postgres/testdata/flavours/postgres12/pg_control.fqtest index 86fbb5cce..f483e4e9b 100644 --- a/format/postgres/testdata/flavours/postgres12/pg_control.fqtest +++ b/format/postgres/testdata/flavours/postgres12/pg_control.fqtest @@ -1,56 +1,68 @@ -$ fq -d pg_control -o flavour=postgres12 tovalue pg_control -{ - "MaxConnections": 1000, - "backupEndPoint": "0/0", - "backupEndRequired": 0, - "backupStartPoint": "0/0", - "blcksz": 8192, - "catalog_version_no": 201909212, - "checkPoint": "0/3A5A1B8", - "checkPointCopy": { - "PrevTimeLineID": 1, - "ThisTimeLineID": 1, - "fullPageWrites": 1, - "newestCommitTsXid": 0, - "nextFullXid": "0:48957", - "nextMulti": 1, - "nextMultiOffset": 0, - "nextOid": 24576, - "oldestActiveXid": 48957, - "oldestCommitTsXid": 0, - "oldestMulti": 1, - "oldestMultiDB": 1, - "oldestXid": 479, - "oldestXidDB": 1, - "redo": "0/3A5A180", - "time": "Wed, 03 Aug 2022 07:40:53 UTC" - }, - "crc": 249001740, - "data_checksum_version": 0, - "float4ByVal": 1, - "float8ByVal": 1, - "floatFormat": 1234567, - "indexMaxKeys": 32, - "loblksize": 2048, - "maxAlign": 8, - "max_locks_per_xact": 64, - "max_prepared_xacts": 0, - "max_wal_senders": 10, - "max_worker_processes": 8, - "minRecoveryPoint": "0/0", - "minRecoveryPointTLI": 0, - "mock_authentication_nonce": "63401528f0e744aac9a9f56c7a4d435929f511dce0812c222eb7b399051faad6", - "nameDataLen": 64, - "pg_control_version": 1201, - "relseg_size": 131072, - "state": "DB_IN_PRODUCTION", - "system_identifier": 7127543828843588018, - "time": "Wed, 03 Aug 2022 07:44:53 UTC", - "toast_max_chunk_size": 1996, - "track_commit_timestamp": 0, - "unloggedLSN": "0/3E8", - "wal_level": "WAL_LEVEL_REPLICA", - "wal_log_hints": 0, - "xlog_blcksz": 8192, - "xlog_seg_size": 16777216 -} +$ fq -d pg_control -o flavour=postgres12 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|b2 e9 3f 57 59 1f ea 62 |..?WY..b | system_identifier: 7127543828843588018 0x0-0x7.7 (8) +0x0000| b1 04 00 00 | .... | pg_control_version: 1201 0x8-0xb.7 (4) +0x0000| dc e3 08 0c| ....| catalog_version_no: 201909212 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 75 27 ea 62 00 00 00 00| u'.b....| time: "Wed, 03 Aug 2022 07:44:53 UTC" (1659512693) 0x18-0x1f.7 (8) +0x0020|b8 a1 a5 03 00 00 00 00 |........ | checkPoint: "0/3A5A1B8" (61186488) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020| 80 a1 a5 03 00 00 00 00| ........| redo: "0/3A5A180" (61186432) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|3d bf 00 00 00 00 00 00 |=....... | nextFullXid: "0:48957" (48957) 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) +0x0050| df 01 00 00 | .... | oldestXid: 479 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) +0x0060| 85 26 ea 62 00 00 00 00| .&.b....| time: "Wed, 03 Aug 2022 07:40:53 UTC" (1659512453) 0x68-0x6f.7 (8) +0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) +0x0070| 3d bf 00 00 | =... | oldestActiveXid: 48957 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) +0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) +0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) +0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) +0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) +0x00b0| e8 03 00 00 | .... | MaxConnections: 1000 0xb4-0xb7.7 (4) +0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) +0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) +0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) +0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) +0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) +0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) +0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) +0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) +0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) +0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) +0x00f0| 01 | . | float4ByVal: 1 0xf8-0xf8.7 (1) +0x00f0| 01 | . | float8ByVal: 1 0xf9-0xf9.7 (1) +0x00f0| 00 00 | .. | hole7: 0 0xfa-0xfb.7 (2) +0x00f0| 00 00 00 00| ....| data_checksum_version: 0 0xfc-0xff.7 (4) +0x0100|63 40 15 28 f0 e7 44 aa c9 a9 f5 6c 7a 4d 43 59|c@.(..D....lzMCY| mock_authentication_nonce: "63401528f0e744aac9a9f56c7a4d435929f511dce0812c2..." (raw bits) 0x100-0x11f.7 (32) +0x0110|29 f5 11 dc e0 81 2c 22 2e b7 b3 99 05 1f aa d6|).....,"........| +0x0120|0c 77 d7 0e |.w.. | crc: 249001740 0x120-0x123.7 (4) +0x0120| 00 00 00 00 | .... | padding1: 0 0x124-0x127.7 (4) +0x0120| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x128-0x1fff.7 (7896) +0x0130|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7896) | | diff --git a/format/postgres/testdata/flavours/postgres13/16396_1.fqtest b/format/postgres/testdata/flavours/postgres13/16396_1.fqtest index e92da387f..c3e2266ae 100644 --- a/format/postgres/testdata/flavours/postgres13/16396_1.fqtest +++ b/format/postgres/testdata/flavours/postgres13/16396_1.fqtest @@ -1,105 +1,95 @@ -$ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | tovalue" 16396 -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 0, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 1, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "010000000100000000000000ab202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020", - "t_choice": { - "t_datum": { - "datum_len_": 489, - "datum_typeid": 15, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 15, - "t_xvac": 15 - }, - "t_xmax": 0, - "t_xmin": 489 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 1 - }, - "t_hoff": 24, - "t_infomask": 2306, - "t_infomask2": 4 -} -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 0, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 1, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 1, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 0, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 1 - }, - "t_bits": "20000000010000003efbffffab202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020", - "t_choice": { - "t_datum": { - "datum_len_": 12258, - "datum_typeid": 0, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 0, - "t_xvac": 0 - }, - "t_xmax": 0, - "t_xmin": 12258 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 69 - }, - "t_hoff": 24, - "t_infomask": 10242, - "t_infomask2": 32772 -} +$ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1f80-0x1ff8.7 (121) + | | | t_choice{}: 0x1f80-0x1f8b.7 (12) + | | | t_heap{}: 0x1f80-0x1f8b.7 (12) +0x1f80|e9 01 00 00 |.... | t_xmin: 489 0x1f80-0x1f83.7 (4) +0x1f80| 00 00 00 00 | .... | t_xmax: 0 0x1f84-0x1f87.7 (4) + | | | t_field3{}: 0x1f88-0x1f8b.7 (4) +0x1f80| 0f 00 00 00 | .... | t_cid: 15 0x1f88-0x1f8b.7 (4) +0x1f80| 0f 00 00 00 | .... | t_xvac: 15 0x1f88-0x1f8b.7 (4) + | | | t_datum{}: 0x1f80-0x1f8b.7 (12) +0x1f80|e9 01 00 00 |.... | datum_len_: 489 0x1f80-0x1f83.7 (4) +0x1f80| 00 00 00 00 | .... | datum_typmod: 0 0x1f84-0x1f87.7 (4) +0x1f80| 0f 00 00 00 | .... | datum_typeid: 15 0x1f88-0x1f8b.7 (4) + | | | t_ctid{}: 0x1f8c-0x1f91.7 (6) +0x1f80| 00 00 00 00| ....| ip_blkid: 0 0x1f8c-0x1f8f.7 (4) +0x1f90|01 00 |.. | ip_posid: 1 0x1f90-0x1f91.7 (2) +0x1f90| 04 00 | .. | t_infomask2: 4 0x1f92-0x1f93.7 (2) + | | | Infomask2{}: 0x1f92-0x1f93.7 (2) +0x1f90| 04 00 | .. | HEAP_KEYS_UPDATED: 0 0x1f92-0x1f93.7 (2) +0x1f90| 04 00 | .. | HEAP_HOT_UPDATED: 0 0x1f92-0x1f93.7 (2) +0x1f90| 04 00 | .. | HEAP_ONLY_TUPLE: 0 0x1f92-0x1f93.7 (2) +0x1f90| 02 09 | .. | t_infomask: 2306 0x1f94-0x1f95.7 (2) + | | | Infomask{}: 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASNULL: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASVARWIDTH: 1 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASEXTERNAL: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASOID_OLD: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_COMBOCID: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_LOCK_MASK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMIN_INVALID: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMIN_FROZEN: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_INVALID: 1 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_UPDATED: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_MOVED_OFF: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_MOVED_IN: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_MOVED: 0 0x1f94-0x1f95.7 (2) +0x1f90| 18 | . | t_hoff: 24 0x1f96-0x1f96.7 (1) +0x1f90| 00 | . | padding0: 0 0x1f97-0x1f97.7 (1) +0x1f90| 01 00 00 00 01 00 00 00| ........| t_bits: "010000000100000000000000ab202020202020202020202..." (raw bits) 0x1f98-0x1ff8.7 (97) +0x1fa0|00 00 00 00 ab 20 20 20 20 20 20 20 20 20 20 20|..... | +* |until 0x1ff8.7 (97) | | + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[60]{}: HeapTupleHeaderData 0x180-0x1f8.7 (121) + | | | t_choice{}: 0x180-0x18b.7 (12) + | | | t_heap{}: 0x180-0x18b.7 (12) +0x180|e2 2f 00 00 |./.. | t_xmin: 12258 0x180-0x183.7 (4) +0x180| 00 00 00 00 | .... | t_xmax: 0 0x184-0x187.7 (4) + | | | t_field3{}: 0x188-0x18b.7 (4) +0x180| 00 00 00 00 | .... | t_cid: 0 0x188-0x18b.7 (4) +0x180| 00 00 00 00 | .... | t_xvac: 0 0x188-0x18b.7 (4) + | | | t_datum{}: 0x180-0x18b.7 (12) +0x180|e2 2f 00 00 |./.. | datum_len_: 12258 0x180-0x183.7 (4) +0x180| 00 00 00 00 | .... | datum_typmod: 0 0x184-0x187.7 (4) +0x180| 00 00 00 00 | .... | datum_typeid: 0 0x188-0x18b.7 (4) + | | | t_ctid{}: 0x18c-0x191.7 (6) +0x180| 00 00 00 00| ....| ip_blkid: 0 0x18c-0x18f.7 (4) +0x190|45 00 |E. | ip_posid: 69 0x190-0x191.7 (2) +0x190| 04 80 | .. | t_infomask2: 32772 0x192-0x193.7 (2) + | | | Infomask2{}: 0x192-0x193.7 (2) +0x190| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x192-0x193.7 (2) +0x190| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x192-0x193.7 (2) +0x190| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x192-0x193.7 (2) +0x190| 02 28 | .( | t_infomask: 10242 0x194-0x195.7 (2) + | | | Infomask{}: 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_HASNULL: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_HASVARWIDTH: 1 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_HASEXTERNAL: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_HASOID_OLD: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_KEYSHR_LOCK: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_COMBOCID: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_EXCL_LOCK: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_LOCK_ONLY: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_SHR_LOCK: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_LOCK_MASK: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMIN_COMMITTED: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMIN_INVALID: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMIN_FROZEN: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_COMMITTED: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_INVALID: 1 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_IS_MULTI: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_UPDATED: 1 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_MOVED_OFF: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_MOVED_IN: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_MOVED: 0 0x194-0x195.7 (2) +0x190| 18 | . | t_hoff: 24 0x196-0x196.7 (1) +0x190| 00 | . | padding0: 0 0x197-0x197.7 (1) +0x190| 20 00 00 00 01 00 00 00| .......| t_bits: "20000000010000003efbffffab202020202020202020202..." (raw bits) 0x198-0x1f8.7 (97) +0x1a0|3e fb ff ff ab 20 20 20 20 20 20 20 20 20 20 20|>.... | +* |until 0x1f8.7 (97) | | diff --git a/format/postgres/testdata/flavours/postgres13/16407_1.fqtest b/format/postgres/testdata/flavours/postgres13/16407_1.fqtest index 3da9e897d..ab283679f 100644 --- a/format/postgres/testdata/flavours/postgres13/16407_1.fqtest +++ b/format/postgres/testdata/flavours/postgres13/16407_1.fqtest @@ -1,16 +1,13 @@ -$ fq -d pg_heap -o flavour=postgres13 ".[0].PageHeaderData.pd_linp[0, 1, -1] | tovalue" 16407 -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 8144 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 8096 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 48, - "lp_off": 656 -} +$ fq -d pg_heap -o flavour=postgres13 ".[0].PageHeaderData.pd_linp[0, 1, -1] | dv" 16407 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[1]{}: ItemIdData 0x1c-0x1f.7 (4) +0x10| a0 9f 60 00| ..`.| lp_off: 8096 0x1c-0x1f.7 (4) +0x10| a0 9f 60 00| ..`.| lp_flags: "LP_NORMAL" (1) 0x1c-0x1f.7 (4) +0x10| a0 9f 60 00| ..`.| lp_len: 48 0x1c-0x1f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/postgres13/16407_2.fqtest b/format/postgres/testdata/flavours/postgres13/16407_2.fqtest index 7e9235918..e4a51b08a 100644 --- a/format/postgres/testdata/flavours/postgres13/16407_2.fqtest +++ b/format/postgres/testdata/flavours/postgres13/16407_2.fqtest @@ -1,105 +1,93 @@ -$ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | tovalue" 16407 -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "060000000100000091220000141000008f939dc268880200", - "t_choice": { - "t_datum": { - "datum_len_": 509, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 509 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 1 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 1, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 0, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "0900000001000000ce39000086130000159eb7c268880200", - "t_choice": { - "t_datum": { - "datum_len_": 665, - "datum_typeid": 3, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 3, - "t_xvac": 3 - }, - "t_xmax": 0, - "t_xmin": 665 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 157 - }, - "t_hoff": 24, - "t_infomask": 2305, - "t_infomask2": 6 -} +$ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | dv" 16407 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|fd 01 00 00 |.... | t_xmin: 509 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|fd 01 00 00 |.... | datum_len_: 509 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 06 00 00 00 01 00 00 00| ........| t_bits: "060000000100000091220000141000008f939dc26888020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1ff0|91 22 00 00 14 10 00 00 8f 93 9d c2 68 88 02 00|."..........h...| + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|99 02 00 00 |.... | t_xmin: 665 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|99 02 00 00 |.... | datum_len_: 665 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 09 00 00 00 01 00 00 00| ........| t_bits: "0900000001000000ce39000086130000159eb7c26888020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2b0|ce 39 00 00 86 13 00 00 15 9e b7 c2 68 88 02 00|.9..........h...| diff --git a/format/postgres/testdata/flavours/postgres13/pg_control.fqtest b/format/postgres/testdata/flavours/postgres13/pg_control.fqtest index 72c1c1224..22741183f 100644 --- a/format/postgres/testdata/flavours/postgres13/pg_control.fqtest +++ b/format/postgres/testdata/flavours/postgres13/pg_control.fqtest @@ -1,55 +1,67 @@ -$ fq -d pg_control -o flavour=postgres13 tovalue pg_control -{ - "MaxConnections": 1000, - "backupEndPoint": "0/0", - "backupEndRequired": 0, - "backupStartPoint": "0/0", - "blcksz": 8192, - "catalog_version_no": 202007201, - "checkPoint": "0/2777C58", - "checkPointCopy": { - "PrevTimeLineID": 1, - "ThisTimeLineID": 1, - "fullPageWrites": 1, - "newestCommitTsXid": 0, - "nextFullXid": 12507, - "nextMulti": 1, - "nextMultiOffset": 0, - "nextOid": 24576, - "oldestActiveXid": 12507, - "oldestCommitTsXid": 0, - "oldestMulti": 1, - "oldestMultiDB": 1, - "oldestXid": 478, - "oldestXidDB": 1, - "redo": "0/2777C20", - "time": "Thu, 04 Aug 2022 13:06:07 UTC" - }, - "crc": 3267750983, - "data_checksum_version": 0, - "float8ByVal": 1, - "floatFormat": 1234567, - "indexMaxKeys": 32, - "loblksize": 2048, - "maxAlign": 8, - "max_locks_per_xact": 64, - "max_prepared_xacts": 0, - "max_wal_senders": 10, - "max_worker_processes": 8, - "minRecoveryPoint": "0/0", - "minRecoveryPointTLI": 0, - "mock_authentication_nonce": "40306a6b3a0112b39c0daa29b2393be3a10e6a9823b4df248c37a9128c5a12cb", - "nameDataLen": 64, - "pg_control_version": 1300, - "relseg_size": 131072, - "state": "DB_IN_PRODUCTION", - "system_identifier": 7121739110011544578, - "time": "Thu, 04 Aug 2022 13:06:07 UTC", - "toast_max_chunk_size": 1996, - "track_commit_timestamp": 0, - "unloggedLSN": "0/3E8", - "wal_level": "WAL_LEVEL_REPLICA", - "wal_log_hints": 0, - "xlog_blcksz": 8192, - "xlog_seg_size": 16777216 -} +$ fq -d pg_control -o flavour=postgres13 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|02 a4 3e eb fc 7f d5 62 |..>....b | system_identifier: 7121739110011544578 0x0-0x7.7 (8) +0x0000| 14 05 00 00 | .... | pg_control_version: 1300 0x8-0xb.7 (4) +0x0000| a1 62 0a 0c| .b..| catalog_version_no: 202007201 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 3f c4 eb 62 00 00 00 00| ?..b....| time: "Thu, 04 Aug 2022 13:06:07 UTC" (1659618367) 0x18-0x1f.7 (8) +0x0020|58 7c 77 02 00 00 00 00 |X|w..... | checkPoint: "0/2777C58" (41385048) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020| 20 7c 77 02 00 00 00 00| |w.....| redo: "0/2777C20" (41384992) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|db 30 00 00 00 00 00 00 |.0...... | nextFullXid: 12507 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) +0x0050| de 01 00 00 | .... | oldestXid: 478 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) +0x0060| 3f c4 eb 62 00 00 00 00| ?..b....| time: "Thu, 04 Aug 2022 13:06:07 UTC" (1659618367) 0x68-0x6f.7 (8) +0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) +0x0070| db 30 00 00 | .0.. | oldestActiveXid: 12507 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) +0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) +0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) +0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) +0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) +0x00b0| e8 03 00 00 | .... | MaxConnections: 1000 0xb4-0xb7.7 (4) +0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) +0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) +0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) +0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) +0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) +0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) +0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) +0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) +0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) +0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) +0x00f0| 01 | . | float8ByVal: 1 0xf8-0xf8.7 (1) +0x00f0| 00 00 00 | ... | hole7: 0 0xf9-0xfb.7 (3) +0x00f0| 00 00 00 00| ....| data_checksum_version: 0 0xfc-0xff.7 (4) +0x0100|40 30 6a 6b 3a 01 12 b3 9c 0d aa 29 b2 39 3b e3|@0jk:......).9;.| mock_authentication_nonce: "40306a6b3a0112b39c0daa29b2393be3a10e6a9823b4df2..." (raw bits) 0x100-0x11f.7 (32) +0x0110|a1 0e 6a 98 23 b4 df 24 8c 37 a9 12 8c 5a 12 cb|..j.#..$.7...Z..| +0x0120|47 ec c5 c2 |G... | crc: 3267750983 0x120-0x123.7 (4) +0x0120| 00 00 00 00 | .... | padding1: 0 0x124-0x127.7 (4) +0x0120| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x128-0x1fff.7 (7896) +0x0130|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7896) | | diff --git a/format/postgres/testdata/flavours/postgres14/16994_1.fqtest b/format/postgres/testdata/flavours/postgres14/16994_1.fqtest index 7e72e2789..a15f704e0 100644 --- a/format/postgres/testdata/flavours/postgres14/16994_1.fqtest +++ b/format/postgres/testdata/flavours/postgres14/16994_1.fqtest @@ -1,21 +1,17 @@ -$ fq -d pg_heap -o flavour=postgres14 ".[0].PageHeaderData.pd_linp[0, 1, 2, -1] | tovalue" 16994 -{ - "lp_flags": "LP_DEAD", - "lp_len": 0, - "lp_off": 0 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 28, - "lp_off": 8160 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 28, - "lp_off": 8128 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 28, - "lp_off": 992 -} +$ fq -d pg_heap -o flavour=postgres14 ".[0].PageHeaderData.pd_linp[0, 1, 2, -1] | dv" 16994 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| 00 80 01 00 | .... | lp_off: 0 0x18-0x1b.7 (4) +0x10| 00 80 01 00 | .... | lp_flags: "LP_DEAD" (3) 0x18-0x1b.7 (4) +0x10| 00 80 01 00 | .... | lp_len: 0 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[1]{}: ItemIdData 0x1c-0x1f.7 (4) +0x10| e0 9f 38 00| ..8.| lp_off: 8160 0x1c-0x1f.7 (4) +0x10| e0 9f 38 00| ..8.| lp_flags: "LP_NORMAL" (1) 0x1c-0x1f.7 (4) +0x10| e0 9f 38 00| ..8.| lp_len: 28 0x1c-0x1f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[2]{}: ItemIdData 0x20-0x23.7 (4) +0x20|c0 9f 38 00 |..8. | lp_off: 8128 0x20-0x23.7 (4) +0x20|c0 9f 38 00 |..8. | lp_flags: "LP_NORMAL" (1) 0x20-0x23.7 (4) +0x20|c0 9f 38 00 |..8. | lp_len: 28 0x20-0x23.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[225]{}: ItemIdData 0x39c-0x39f.7 (4) +0x390| e0 83 38 00| ..8.| lp_off: 992 0x39c-0x39f.7 (4) +0x390| e0 83 38 00| ..8.| lp_flags: "LP_NORMAL" (1) 0x39c-0x39f.7 (4) +0x390| e0 83 38 00| ..8.| lp_len: 28 0x39c-0x39f.7 (4) diff --git a/format/postgres/testdata/flavours/postgres14/33233_1.fqtest b/format/postgres/testdata/flavours/postgres14/33233_1.fqtest index 5dc01d9f2..23bb40b5c 100644 --- a/format/postgres/testdata/flavours/postgres14/33233_1.fqtest +++ b/format/postgres/testdata/flavours/postgres14/33233_1.fqtest @@ -1,16 +1,13 @@ -$ fq -d pg_heap -o flavour=postgres14 ".[0].PageHeaderData.pd_linp[0, 1, -1] | tovalue" 33233 -{ - "lp_flags": "LP_REDIRECT", - "lp_len": 0, - "lp_off": 77 -} -{ - "lp_flags": "LP_REDIRECT", - "lp_len": 0, - "lp_off": 106 -} -{ - "lp_flags": "LP_NORMAL", - "lp_len": 121, - "lp_off": 640 -} +$ fq -d pg_heap -o flavour=postgres14 ".[0].PageHeaderData.pd_linp[0, 1, -1] | dv" 33233 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +0x10| 4d 00 01 00 | M... | lp_off: 77 0x18-0x1b.7 (4) +0x10| 4d 00 01 00 | M... | lp_flags: "LP_REDIRECT" (2) 0x18-0x1b.7 (4) +0x10| 4d 00 01 00 | M... | lp_len: 0 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[1]{}: ItemIdData 0x1c-0x1f.7 (4) +0x10| 6a 00 01 00| j...| lp_off: 106 0x1c-0x1f.7 (4) +0x10| 6a 00 01 00| j...| lp_flags: "LP_REDIRECT" (2) 0x1c-0x1f.7 (4) +0x10| 6a 00 01 00| j...| lp_len: 0 0x1c-0x1f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[119]{}: ItemIdData 0x1f4-0x1f7.7 (4) +0x1f0| 80 82 f2 00 | .... | lp_off: 640 0x1f4-0x1f7.7 (4) +0x1f0| 80 82 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x1f4-0x1f7.7 (4) +0x1f0| 80 82 f2 00 | .... | lp_len: 121 0x1f4-0x1f7.7 (4) diff --git a/format/postgres/testdata/flavours/postgres14/33233_2.fqtest b/format/postgres/testdata/flavours/postgres14/33233_2.fqtest index 430cdf6ff..1c15d53e5 100644 --- a/format/postgres/testdata/flavours/postgres14/33233_2.fqtest +++ b/format/postgres/testdata/flavours/postgres14/33233_2.fqtest @@ -1,105 +1,95 @@ -$ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0,-1] | tovalue" 33233 -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 0, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 1, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 0, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 0 - }, - "t_bits": "150000000100000000000000ab202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020", - "t_choice": { - "t_datum": { - "datum_len_": 1577094, - "datum_typeid": 15, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 15, - "t_xvac": 15 - }, - "t_xmax": 0, - "t_xmin": 1577094 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 21 - }, - "t_hoff": 24, - "t_infomask": 2306, - "t_infomask2": 4 -} -{ - "Infomask": { - "HEAP_COMBOCID": 0, - "HEAP_HASEXTERNAL": 0, - "HEAP_HASNULL": 0, - "HEAP_HASOID_OLD": 0, - "HEAP_HASVARWIDTH": 1, - "HEAP_LOCK_MASK": 0, - "HEAP_MOVED": 0, - "HEAP_MOVED_IN": 0, - "HEAP_MOVED_OFF": 0, - "HEAP_UPDATED": 1, - "HEAP_XMAX_COMMITTED": 0, - "HEAP_XMAX_EXCL_LOCK": 0, - "HEAP_XMAX_INVALID": 1, - "HEAP_XMAX_IS_MULTI": 0, - "HEAP_XMAX_KEYSHR_LOCK": 0, - "HEAP_XMAX_LOCK_ONLY": 0, - "HEAP_XMAX_SHR_LOCK": 0, - "HEAP_XMIN_COMMITTED": 1, - "HEAP_XMIN_FROZEN": 0, - "HEAP_XMIN_INVALID": 0 - }, - "Infomask2": { - "HEAP_HOT_UPDATED": 0, - "HEAP_KEYS_UPDATED": 0, - "HEAP_ONLY_TUPLE": 1 - }, - "t_bits": "210000000100000053fdffffab202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020", - "t_choice": { - "t_datum": { - "datum_len_": 1857686, - "datum_typeid": 0, - "datum_typmod": 0 - }, - "t_heap": { - "t_field3": { - "t_cid": 0, - "t_xvac": 0 - }, - "t_xmax": 0, - "t_xmin": 1857686 - } - }, - "t_ctid": { - "ip_blkid": 0, - "ip_posid": 120 - }, - "t_hoff": 24, - "t_infomask": 10498, - "t_infomask2": 32772 -} +$ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0,-1] | dv" 33233 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1f80-0x1ff8.7 (121) + | | | t_choice{}: 0x1f80-0x1f8b.7 (12) + | | | t_heap{}: 0x1f80-0x1f8b.7 (12) +0x1f80|86 10 18 00 |.... | t_xmin: 1577094 0x1f80-0x1f83.7 (4) +0x1f80| 00 00 00 00 | .... | t_xmax: 0 0x1f84-0x1f87.7 (4) + | | | t_field3{}: 0x1f88-0x1f8b.7 (4) +0x1f80| 0f 00 00 00 | .... | t_cid: 15 0x1f88-0x1f8b.7 (4) +0x1f80| 0f 00 00 00 | .... | t_xvac: 15 0x1f88-0x1f8b.7 (4) + | | | t_datum{}: 0x1f80-0x1f8b.7 (12) +0x1f80|86 10 18 00 |.... | datum_len_: 1577094 0x1f80-0x1f83.7 (4) +0x1f80| 00 00 00 00 | .... | datum_typmod: 0 0x1f84-0x1f87.7 (4) +0x1f80| 0f 00 00 00 | .... | datum_typeid: 15 0x1f88-0x1f8b.7 (4) + | | | t_ctid{}: 0x1f8c-0x1f91.7 (6) +0x1f80| 00 00 00 00| ....| ip_blkid: 0 0x1f8c-0x1f8f.7 (4) +0x1f90|15 00 |.. | ip_posid: 21 0x1f90-0x1f91.7 (2) +0x1f90| 04 00 | .. | t_infomask2: 4 0x1f92-0x1f93.7 (2) + | | | Infomask2{}: 0x1f92-0x1f93.7 (2) +0x1f90| 04 00 | .. | HEAP_KEYS_UPDATED: 0 0x1f92-0x1f93.7 (2) +0x1f90| 04 00 | .. | HEAP_HOT_UPDATED: 0 0x1f92-0x1f93.7 (2) +0x1f90| 04 00 | .. | HEAP_ONLY_TUPLE: 0 0x1f92-0x1f93.7 (2) +0x1f90| 02 09 | .. | t_infomask: 2306 0x1f94-0x1f95.7 (2) + | | | Infomask{}: 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASNULL: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASVARWIDTH: 1 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASEXTERNAL: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASOID_OLD: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_COMBOCID: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_LOCK_MASK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMIN_INVALID: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMIN_FROZEN: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_INVALID: 1 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_UPDATED: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_MOVED_OFF: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_MOVED_IN: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_MOVED: 0 0x1f94-0x1f95.7 (2) +0x1f90| 18 | . | t_hoff: 24 0x1f96-0x1f96.7 (1) +0x1f90| 00 | . | padding0: 0 0x1f97-0x1f97.7 (1) +0x1f90| 15 00 00 00 01 00 00 00| ........| t_bits: "150000000100000000000000ab202020202020202020202..." (raw bits) 0x1f98-0x1ff8.7 (97) +0x1fa0|00 00 00 00 ab 20 20 20 20 20 20 20 20 20 20 20|..... | +* |until 0x1ff8.7 (97) | | + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[58]{}: HeapTupleHeaderData 0x280-0x2f8.7 (121) + | | | t_choice{}: 0x280-0x28b.7 (12) + | | | t_heap{}: 0x280-0x28b.7 (12) +0x280|96 58 1c 00 |.X.. | t_xmin: 1857686 0x280-0x283.7 (4) +0x280| 00 00 00 00 | .... | t_xmax: 0 0x284-0x287.7 (4) + | | | t_field3{}: 0x288-0x28b.7 (4) +0x280| 00 00 00 00 | .... | t_cid: 0 0x288-0x28b.7 (4) +0x280| 00 00 00 00 | .... | t_xvac: 0 0x288-0x28b.7 (4) + | | | t_datum{}: 0x280-0x28b.7 (12) +0x280|96 58 1c 00 |.X.. | datum_len_: 1857686 0x280-0x283.7 (4) +0x280| 00 00 00 00 | .... | datum_typmod: 0 0x284-0x287.7 (4) +0x280| 00 00 00 00 | .... | datum_typeid: 0 0x288-0x28b.7 (4) + | | | t_ctid{}: 0x28c-0x291.7 (6) +0x280| 00 00 00 00| ....| ip_blkid: 0 0x28c-0x28f.7 (4) +0x290|78 00 |x. | ip_posid: 120 0x290-0x291.7 (2) +0x290| 04 80 | .. | t_infomask2: 32772 0x292-0x293.7 (2) + | | | Infomask2{}: 0x292-0x293.7 (2) +0x290| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x292-0x293.7 (2) +0x290| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x292-0x293.7 (2) +0x290| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x292-0x293.7 (2) +0x290| 02 29 | .) | t_infomask: 10498 0x294-0x295.7 (2) + | | | Infomask{}: 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_HASNULL: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_HASVARWIDTH: 1 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_HASEXTERNAL: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_HASOID_OLD: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_KEYSHR_LOCK: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_COMBOCID: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_EXCL_LOCK: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_LOCK_ONLY: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_SHR_LOCK: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_LOCK_MASK: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMIN_COMMITTED: 1 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMIN_INVALID: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMIN_FROZEN: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_COMMITTED: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_INVALID: 1 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_IS_MULTI: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_UPDATED: 1 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_MOVED_OFF: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_MOVED_IN: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_MOVED: 0 0x294-0x295.7 (2) +0x290| 18 | . | t_hoff: 24 0x296-0x296.7 (1) +0x290| 00 | . | padding0: 0 0x297-0x297.7 (1) +0x290| 21 00 00 00 01 00 00 00| !.......| t_bits: "210000000100000053fdffffab202020202020202020202..." (raw bits) 0x298-0x2f8.7 (97) +0x2a0|53 fd ff ff ab 20 20 20 20 20 20 20 20 20 20 20|S.... | +* |until 0x2f8.7 (97) | | diff --git a/format/postgres/testdata/flavours/postgres14/pg_control.fqtest b/format/postgres/testdata/flavours/postgres14/pg_control.fqtest index 565095a91..36c3aa80a 100644 --- a/format/postgres/testdata/flavours/postgres14/pg_control.fqtest +++ b/format/postgres/testdata/flavours/postgres14/pg_control.fqtest @@ -1,55 +1,67 @@ -$ fq -d pg_control -o flavour=postgres14 tovalue pg_control -{ - "MaxConnections": 100, - "backupEndPoint": "0/0", - "backupEndRequired": 0, - "backupStartPoint": "0/0", - "blcksz": 8192, - "catalog_version_no": 202107181, - "checkPoint": "0/9AD688C0", - "checkPointCopy": { - "PrevTimeLineID": 1, - "ThisTimeLineID": 1, - "fullPageWrites": 1, - "newestCommitTsXid": 0, - "nextMulti": 1, - "nextMultiOffset": 0, - "nextOid": 33245, - "nextXid": 1878859, - "oldestActiveXid": 0, - "oldestCommitTsXid": 0, - "oldestMulti": 1, - "oldestMultiDB": 1, - "oldestXid": 726, - "oldestXidDB": 1, - "redo": "0/9AD688C0", - "time": "Mon, 04 Jul 2022 08:13:58 UTC" - }, - "crc": 3945231947, - "data_checksum_version": 0, - "float8ByVal": 1, - "floatFormat": 1234567, - "indexMaxKeys": 32, - "loblksize": 2048, - "maxAlign": 8, - "max_locks_per_xact": 64, - "max_prepared_xacts": 0, - "max_wal_senders": 10, - "max_worker_processes": 8, - "minRecoveryPoint": "0/0", - "minRecoveryPointTLI": 0, - "mock_authentication_nonce": "0045fd647ed4d35382750ab7d6bec19a77af72bae00f72804a5743fb76c8988c", - "nameDataLen": 64, - "pg_control_version": 1300, - "relseg_size": 131072, - "state": "DB_IN_PRODUCTION", - "system_identifier": 7040120944989169512, - "time": "Mon, 04 Jul 2022 08:13:58 UTC", - "toast_max_chunk_size": 1996, - "track_commit_timestamp": 0, - "unloggedLSN": "0/3E8", - "wal_level": "WAL_LEVEL_REPLICA", - "wal_log_hints": 0, - "xlog_blcksz": 8192, - "xlog_seg_size": 16777216 -} +$ fq -d pg_control -o flavour=postgres14 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|68 e7 dd 05 b3 88 b3 61 |h......a | system_identifier: 7040120944989169512 0x0-0x7.7 (8) +0x0000| 14 05 00 00 | .... | pg_control_version: 1300 0x8-0xb.7 (4) +0x0000| 2d e9 0b 0c| -...| catalog_version_no: 202107181 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 46 a1 c2 62 00 00 00 00| F..b....| time: "Mon, 04 Jul 2022 08:13:58 UTC" (1656922438) 0x18-0x1f.7 (8) +0x0020|c0 88 d6 9a 00 00 00 00 |........ | checkPoint: "0/9AD688C0" (2597750976) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020| c0 88 d6 9a 00 00 00 00| ........| redo: "0/9AD688C0" (2597750976) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|4b ab 1c 00 00 00 00 00 |K....... | nextXid: 1878859 0x40-0x47.7 (8) +0x0040| dd 81 00 00 | .... | nextOid: 33245 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) +0x0050| d6 02 00 00 | .... | oldestXid: 726 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) +0x0060| 46 a1 c2 62 00 00 00 00| F..b....| time: "Mon, 04 Jul 2022 08:13:58 UTC" (1656922438) 0x68-0x6f.7 (8) +0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) +0x0070| 00 00 00 00 | .... | oldestActiveXid: 0 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) +0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) +0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) +0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) +0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) +0x00b0| 64 00 00 00 | d... | MaxConnections: 100 0xb4-0xb7.7 (4) +0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) +0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) +0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) +0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) +0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) +0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) +0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) +0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) +0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) +0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) +0x00f0| 01 | . | float8ByVal: 1 0xf8-0xf8.7 (1) +0x00f0| 00 00 00 | ... | hole7: 0 0xf9-0xfb.7 (3) +0x00f0| 00 00 00 00| ....| data_checksum_version: 0 0xfc-0xff.7 (4) +0x0100|00 45 fd 64 7e d4 d3 53 82 75 0a b7 d6 be c1 9a|.E.d~..S.u......| mock_authentication_nonce: "0045fd647ed4d35382750ab7d6bec19a77af72bae00f728..." (raw bits) 0x100-0x11f.7 (32) +0x0110|77 af 72 ba e0 0f 72 80 4a 57 43 fb 76 c8 98 8c|w.r...r.JWC.v...| +0x0120|4b 76 27 eb |Kv'. | crc: 3945231947 0x120-0x123.7 (4) +0x0120| 00 00 00 00 | .... | padding1: 0 0x124-0x127.7 (4) +0x0120| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x128-0x1fff.7 (7896) +0x0130|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7896) | | diff --git a/pkg/decode/decode.go b/pkg/decode/decode.go index 5962495de..67f2ad85c 100644 --- a/pkg/decode/decode.go +++ b/pkg/decode/decode.go @@ -118,7 +118,7 @@ func decode(ctx context.Context, br bitio.ReaderAtSeeker, group Group, opts Opti } // TODO: maybe move to Format* funcs? - if d.Options.FillGaps { + if opts.FillGaps { d.FillGaps(ranges.Range{Start: 0, Len: decodeRange.Len}, "unknown") } From ba8b90ba81c5c620b7ca56990b288317498de596 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 5 Sep 2022 14:54:42 +0300 Subject: [PATCH 050/141] postgres: fill gap alignment in heap tuple --- .../flavours/postgres14/common14/pgheap.go | 22 +++++++++++++++---- .../flavours/pgproee11/90153_2.fqtest | 6 +++-- .../flavours/postgres13/16396_1.fqtest | 6 +++-- .../flavours/postgres14/33233_2.fqtest | 6 +++-- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index 1686416b4..b75fdcd64 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -80,7 +80,7 @@ const ( // /* total size (bytes): 12 */ /* } t_choice; // -/* 12 | 6 */ // ItemPointerData t_ctid; +/* 12 | 6 */// ItemPointerData t_ctid; /* 18 | 2 */ // uint16 t_infomask2; /* 20 | 2 */ // uint16 t_infomask; /* 22 | 1 */ // uint8 t_hoff; @@ -160,9 +160,9 @@ type itemIdDataD struct { /* 0: 0 | 4 */ // unsigned int lp_off: 15 /* 1: 7 | 4 */ // unsigned int lp_flags: 2 /* 2: 1 | 4 */ // unsigned int lp_len: 15 - lpOff uint32 - lpFlags uint32 - lpLen uint32 + lpOff uint32 + lpFlags uint32 + lpLen uint32 } func GetHeapD(d *decode.D) *HeapD { @@ -358,7 +358,21 @@ func decodeTuples(d *decode.D) { d.FieldRawLen("t_bits", int64(tupleDataLen*8), scalar.RawHex) + // data alignment + pos2 := uint64(d.Pos() / 8) + pos1Aligned := common.TypeAlign8(pos2) + if pos2 != pos1Aligned { + alignedLen := (pos1Aligned - pos2) * 8 + d.FieldRawLen("padding1", int64(alignedLen), scalar.RawHex) + } + pos3 := uint64(d.Pos() / 8) + pos2Aligned := common.TypeAlign8(pos3) + if pos3 != pos2Aligned { + d.Fatalf("pos3 isn't aligned, pos2 = %d, pos3 = %d\n", pos2, pos3) + } + }) // HeapTupleHeaderData + } // for ItemsIds } diff --git a/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest b/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest index ff608ab46..8f4f924a7 100644 --- a/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest +++ b/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest @@ -1,5 +1,5 @@ $ fq -d pg_heap -o flavour=pgproee11 ".[0].Tuples[0,-1] | dv" 90153 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x11d8-0x11fb.7 (36) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x11d8-0x11ff.7 (40) | | | t_choice{}: 0x11d8-0x11e3.7 (12) | | | t_heap{}: 0x11d8-0x11e3.7 (12) 0x11d0| 66 b2 02 00 | f... | t_xmin: "10015117002" (176742) 0x11d8-0x11db.7 (4) @@ -44,7 +44,8 @@ $ fq -d pg_heap -o flavour=pgproee11 ".[0].Tuples[0,-1] | dv" 90153 0x11e0| 18 | . | t_hoff: 24 0x11ee-0x11ee.7 (1) 0x11e0| 07| .| padding0: 7 0x11ef-0x11ef.7 (1) 0x11f0|65 00 00 00 0b 00 00 00 4f f8 00 00 |e.......O... | t_bits: "650000000b0000004ff80000" (raw bits) 0x11f0-0x11fb.7 (12) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[99]{}: HeapTupleHeaderData 0x1818-0x183b.7 (36) +0x11f0| 00 00 00 00| ....| padding1: "00000000" (raw bits) 0x11fc-0x11ff.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[99]{}: HeapTupleHeaderData 0x1818-0x183f.7 (40) | | | t_choice{}: 0x1818-0x1823.7 (12) | | | t_heap{}: 0x1818-0x1823.7 (12) 0x1810| 54 b0 02 00 | T... | t_xmin: "10015116472" (176212) 0x1818-0x181b.7 (4) @@ -89,3 +90,4 @@ $ fq -d pg_heap -o flavour=pgproee11 ".[0].Tuples[0,-1] | dv" 90153 0x1820| 18 | . | t_hoff: 24 0x182e-0x182e.7 (1) 0x1820| 07| .| padding0: 7 0x182f-0x182f.7 (1) 0x1830|64 00 00 00 0a 00 00 00 41 59 00 00 |d.......AY.. | t_bits: "640000000a00000041590000" (raw bits) 0x1830-0x183b.7 (12) +0x1830| 00 00 00 00| ....| padding1: "00000000" (raw bits) 0x183c-0x183f.7 (4) diff --git a/format/postgres/testdata/flavours/postgres13/16396_1.fqtest b/format/postgres/testdata/flavours/postgres13/16396_1.fqtest index c3e2266ae..703353286 100644 --- a/format/postgres/testdata/flavours/postgres13/16396_1.fqtest +++ b/format/postgres/testdata/flavours/postgres13/16396_1.fqtest @@ -1,5 +1,5 @@ $ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1f80-0x1ff8.7 (121) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1f80-0x1fff.7 (128) | | | t_choice{}: 0x1f80-0x1f8b.7 (12) | | | t_heap{}: 0x1f80-0x1f8b.7 (12) 0x1f80|e9 01 00 00 |.... | t_xmin: 489 0x1f80-0x1f83.7 (4) @@ -46,7 +46,8 @@ $ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | dv" 16396 0x1f90| 01 00 00 00 01 00 00 00| ........| t_bits: "010000000100000000000000ab202020202020202020202..." (raw bits) 0x1f98-0x1ff8.7 (97) 0x1fa0|00 00 00 00 ab 20 20 20 20 20 20 20 20 20 20 20|..... | * |until 0x1ff8.7 (97) | | - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[60]{}: HeapTupleHeaderData 0x180-0x1f8.7 (121) +0x1ff0| 00 00 00 00 00 00 00| .......| padding1: "00000000000000" (raw bits) 0x1ff9-0x1fff.7 (7) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[60]{}: HeapTupleHeaderData 0x180-0x1ff.7 (128) | | | t_choice{}: 0x180-0x18b.7 (12) | | | t_heap{}: 0x180-0x18b.7 (12) 0x180|e2 2f 00 00 |./.. | t_xmin: 12258 0x180-0x183.7 (4) @@ -93,3 +94,4 @@ $ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | dv" 16396 0x190| 20 00 00 00 01 00 00 00| .......| t_bits: "20000000010000003efbffffab202020202020202020202..." (raw bits) 0x198-0x1f8.7 (97) 0x1a0|3e fb ff ff ab 20 20 20 20 20 20 20 20 20 20 20|>.... | * |until 0x1f8.7 (97) | | +0x1f0| 00 00 00 00 00 00 00| .......| padding1: "00000000000000" (raw bits) 0x1f9-0x1ff.7 (7) diff --git a/format/postgres/testdata/flavours/postgres14/33233_2.fqtest b/format/postgres/testdata/flavours/postgres14/33233_2.fqtest index 1c15d53e5..217bc9ed2 100644 --- a/format/postgres/testdata/flavours/postgres14/33233_2.fqtest +++ b/format/postgres/testdata/flavours/postgres14/33233_2.fqtest @@ -1,5 +1,5 @@ $ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0,-1] | dv" 33233 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1f80-0x1ff8.7 (121) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1f80-0x1fff.7 (128) | | | t_choice{}: 0x1f80-0x1f8b.7 (12) | | | t_heap{}: 0x1f80-0x1f8b.7 (12) 0x1f80|86 10 18 00 |.... | t_xmin: 1577094 0x1f80-0x1f83.7 (4) @@ -46,7 +46,8 @@ $ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0,-1] | dv" 33233 0x1f90| 15 00 00 00 01 00 00 00| ........| t_bits: "150000000100000000000000ab202020202020202020202..." (raw bits) 0x1f98-0x1ff8.7 (97) 0x1fa0|00 00 00 00 ab 20 20 20 20 20 20 20 20 20 20 20|..... | * |until 0x1ff8.7 (97) | | - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[58]{}: HeapTupleHeaderData 0x280-0x2f8.7 (121) +0x1ff0| 00 00 00 00 00 00 00| .......| padding1: "00000000000000" (raw bits) 0x1ff9-0x1fff.7 (7) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[58]{}: HeapTupleHeaderData 0x280-0x2ff.7 (128) | | | t_choice{}: 0x280-0x28b.7 (12) | | | t_heap{}: 0x280-0x28b.7 (12) 0x280|96 58 1c 00 |.X.. | t_xmin: 1857686 0x280-0x283.7 (4) @@ -93,3 +94,4 @@ $ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0,-1] | dv" 33233 0x290| 21 00 00 00 01 00 00 00| !.......| t_bits: "210000000100000053fdffffab202020202020202020202..." (raw bits) 0x298-0x2f8.7 (97) 0x2a0|53 fd ff ff ab 20 20 20 20 20 20 20 20 20 20 20|S.... | * |until 0x2f8.7 (97) | | +0x2f0| 00 00 00 00 00 00 00| .......| padding1: "00000000000000" (raw bits) 0x2f9-0x2ff.7 (7) From 3e09f9f12d1a7641b1ecc457c80981de32f0819c Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 5 Sep 2022 15:01:59 +0300 Subject: [PATCH 051/141] postgres: change tuple struct in heap --- .../flavours/postgres14/common14/pgheap.go | 86 +++++---- .../testdata/flavours/pgpro11/16406_2.fqtest | 182 +++++++++--------- .../testdata/flavours/pgpro12/16406_2.fqtest | 182 +++++++++--------- .../testdata/flavours/pgpro13/16406_2.fqtest | 182 +++++++++--------- .../testdata/flavours/pgpro14/16406_2.fqtest | 182 +++++++++--------- .../flavours/pgproee10/16403_2.fqtest | 182 +++++++++--------- .../flavours/pgproee11/90153_2.fqtest | 182 +++++++++--------- .../flavours/pgproee12/16406_2.fqtest | 182 +++++++++--------- .../flavours/pgproee13/16406_2.fqtest | 182 +++++++++--------- .../flavours/postgres11/16406_2.fqtest | 182 +++++++++--------- .../flavours/postgres12/16406_2.fqtest | 182 +++++++++--------- .../flavours/postgres13/16396_1.fqtest | 182 +++++++++--------- .../flavours/postgres13/16407_2.fqtest | 182 +++++++++--------- .../flavours/postgres14/33233_2.fqtest | 182 +++++++++--------- 14 files changed, 1241 insertions(+), 1211 deletions(-) diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index b75fdcd64..79b9ee76b 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -80,7 +80,7 @@ const ( // /* total size (bytes): 12 */ /* } t_choice; // -/* 12 | 6 */// ItemPointerData t_ctid; +/* 12 | 6 */ // ItemPointerData t_ctid; /* 18 | 2 */ // uint16 t_infomask2; /* 20 | 2 */ // uint16 t_infomask; /* 22 | 1 */ // uint8 t_hoff; @@ -160,9 +160,9 @@ type itemIdDataD struct { /* 0: 0 | 4 */ // unsigned int lp_off: 15 /* 1: 7 | 4 */ // unsigned int lp_flags: 2 /* 2: 1 | 4 */ // unsigned int lp_len: 15 - lpOff uint32 - lpFlags uint32 - lpLen uint32 + lpOff uint32 + lpFlags uint32 + lpLen uint32 } func GetHeapD(d *decode.D) *HeapD { @@ -321,42 +321,46 @@ func decodeTuples(d *decode.D) { /* XXX 1-byte padding */ // /* total size (bytes): 24 */ - d.FieldStruct("HeapTupleHeaderData", func(d *decode.D) { - - pos1 := d.Pos() - // we need infomask before t_xmin, t_xmax - d.SeekAbs(pos1 + 18*8) - d.FieldU16("t_infomask2") - d.FieldStruct("Infomask2", decodeInfomask2) - d.FieldU16("t_infomask") - d.FieldStruct("Infomask", decodeInfomask) - - // restore pos and continue - d.SeekAbs(pos1) - d.FieldStruct("t_choice", decodeTChoice) - d.FieldStruct("t_ctid", func(d *decode.D) { - /* 0 | 4 */ // BlockIdData ip_blkid; - /* 4 | 2 */ // OffsetNumber ip_posid; - d.FieldU32("ip_blkid") - d.FieldU16("ip_posid") - }) // ItemPointerData t_ctid - - /* 18 | 2 */ // uint16 t_infomask2; - /* 20 | 2 */ // uint16 t_infomask; - /* 22 | 1 */ // uint8 t_hoff; - /* 23 | 0 */ // bits8 t_bits[]; - /* XXX 1-byte padding */ - //d.FieldU16("t_infomask2") - //d.FieldStruct("Infomask2", decodeInfomask2) - //d.FieldU16("t_infomask") - //d.FieldStruct("Infomask", decodeInfomask) - // already done - d.SeekRel(32) - - d.FieldU8("t_hoff") - d.FieldU8("padding0") - - d.FieldRawLen("t_bits", int64(tupleDataLen*8), scalar.RawHex) + d.FieldStruct("Tuple", func(d *decode.D) { + d.FieldStruct("HeapTupleHeaderData", func(d *decode.D) { + + pos1 := d.Pos() + // we need infomask before t_xmin, t_xmax + d.SeekAbs(pos1 + 18*8) + d.FieldU16("t_infomask2") + d.FieldStruct("Infomask2", decodeInfomask2) + d.FieldU16("t_infomask") + d.FieldStruct("Infomask", decodeInfomask) + + // restore pos and continue + d.SeekAbs(pos1) + d.FieldStruct("t_choice", decodeTChoice) + d.FieldStruct("t_ctid", func(d *decode.D) { + /* 0 | 4 */ // BlockIdData ip_blkid; + /* 4 | 2 */ // OffsetNumber ip_posid; + d.FieldU32("ip_blkid") + d.FieldU16("ip_posid") + }) // ItemPointerData t_ctid + + /* 18 | 2 */ // uint16 t_infomask2; + /* 20 | 2 */ // uint16 t_infomask; + /* 22 | 1 */ // uint8 t_hoff; + /* 23 | 0 */ // bits8 t_bits[]; + /* XXX 1-byte padding */ + //d.FieldU16("t_infomask2") + //d.FieldStruct("Infomask2", decodeInfomask2) + //d.FieldU16("t_infomask") + //d.FieldStruct("Infomask", decodeInfomask) + // already done + d.SeekRel(32) + + d.FieldU8("t_hoff") + d.FieldU8("padding0") + + //d.FieldRawLen("t_bits", int64(tupleDataLen*8), scalar.RawHex) + }) // HeapTupleHeaderData + + d.FieldRawLen("Data", int64(tupleDataLen*8), scalar.RawHex) // data alignment pos2 := uint64(d.Pos() / 8) @@ -371,7 +375,7 @@ func decodeTuples(d *decode.D) { d.Fatalf("pos3 isn't aligned, pos2 = %d, pos3 = %d\n", pos2, pos3) } - }) // HeapTupleHeaderData + }) } // for ItemsIds } diff --git a/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest index 47871f6dd..21b28123e 100644 --- a/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest @@ -1,93 +1,95 @@ $ fq -d pg_heap -o flavour=pgpro11 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) - | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) - | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|47 02 00 00 |G... | t_xmin: 583 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) - | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) - | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|47 02 00 00 |G... | datum_len_: 583 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) -0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) - | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) -0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) -0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) -0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 01 08 | .. | t_infomask: 2049 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMIN_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) -0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 0d 00 00 00 02 00 00 00| ........| t_bits: "0d00000002000000ccf20100f8feffffc43021b0218a020..." (raw bits) 0x1fe8-0x1fff.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) + | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|47 02 00 00 |G... | t_xmin: 583 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|47 02 00 00 |G... | datum_len_: 583 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 08 | .. | t_infomask: 2049 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMIN_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 08 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 0d 00 00 00 02 00 00 00| ........| Data: "0d00000002000000ccf20100f8feffffc43021b0218a020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|cc f2 01 00 f8 fe ff ff c4 30 21 b0 21 8a 02 00|.........0!.!...| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) - | | | t_choice{}: 0x290-0x29b.7 (12) - | | | t_heap{}: 0x290-0x29b.7 (12) -0x290|e3 02 00 00 |.... | t_xmin: 739 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) - | | | t_field3{}: 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) - | | | t_datum{}: 0x290-0x29b.7 (12) -0x290|e3 02 00 00 |.... | datum_len_: 739 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) -0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) - | | | t_ctid{}: 0x29c-0x2a1.7 (6) -0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) -0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) -0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) -0x2a0| 01 08 | .. | t_infomask: 2049 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMIN_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) -0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 09 00 00 00 03 00 00 00| ........| t_bits: "0900000003000000b2e003007bf8fffffda429b0218a020..." (raw bits) 0x2a8-0x2bf.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) + | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|e3 02 00 00 |.... | t_xmin: 739 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|e3 02 00 00 |.... | datum_len_: 739 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 08 | .. | t_infomask: 2049 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMIN_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 08 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 09 00 00 00 03 00 00 00| ........| Data: "0900000003000000b2e003007bf8fffffda429b0218a020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|b2 e0 03 00 7b f8 ff ff fd a4 29 b0 21 8a 02 00|....{.....).!...| diff --git a/format/postgres/testdata/flavours/pgpro12/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro12/16406_2.fqtest index 3f2385422..55d92e664 100644 --- a/format/postgres/testdata/flavours/pgpro12/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/16406_2.fqtest @@ -1,93 +1,95 @@ $ fq -d pg_heap -o flavour=pgpro12 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) - | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) - | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|f3 01 00 00 |.... | t_xmin: 499 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) - | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) - | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|f3 01 00 00 |.... | datum_len_: 499 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) -0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) - | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) -0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) -0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) -0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) -0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 61 00 00 00 08 00 00 00| a.......| t_bits: "61000000080000003aaa080009040000d1b3823d1f8a020..." (raw bits) 0x1fe8-0x1fff.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) + | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f3 01 00 00 |.... | t_xmin: 499 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f3 01 00 00 |.... | datum_len_: 499 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 61 00 00 00 08 00 00 00| a.......| Data: "61000000080000003aaa080009040000d1b3823d1f8a020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|3a aa 08 00 09 04 00 00 d1 b3 82 3d 1f 8a 02 00|:..........=....| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) - | | | t_choice{}: 0x290-0x29b.7 (12) - | | | t_heap{}: 0x290-0x29b.7 (12) -0x290|8f 02 00 00 |.... | t_xmin: 655 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) - | | | t_field3{}: 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) - | | | t_datum{}: 0x290-0x29b.7 (12) -0x290|8f 02 00 00 |.... | datum_len_: 655 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) -0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) - | | | t_ctid{}: 0x29c-0x2a1.7 (6) -0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) -0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) -0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) -0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) -0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 26 00 00 00 01 00 00 00| &.......| t_bits: "2600000001000000c5900800c5f6ffffe658893d1f8a020..." (raw bits) 0x2a8-0x2bf.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) + | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|8f 02 00 00 |.... | t_xmin: 655 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|8f 02 00 00 |.... | datum_len_: 655 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 26 00 00 00 01 00 00 00| &.......| Data: "2600000001000000c5900800c5f6ffffe658893d1f8a020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|c5 90 08 00 c5 f6 ff ff e6 58 89 3d 1f 8a 02 00|.........X.=....| diff --git a/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest index 662684dce..393d0fb04 100644 --- a/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest @@ -1,93 +1,95 @@ $ fq -d pg_heap -o flavour=pgpro13 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) - | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) - | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|f2 01 00 00 |.... | t_xmin: 498 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) - | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) - | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|f2 01 00 00 |.... | datum_len_: 498 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) -0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) - | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) -0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) -0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) -0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) -0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 4e 00 00 00 04 00 00 00| N.......| t_bits: "4e0000000400000053b40a00d6ffffff9982147e1d8a020..." (raw bits) 0x1fe8-0x1fff.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) + | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f2 01 00 00 |.... | t_xmin: 498 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f2 01 00 00 |.... | datum_len_: 498 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 4e 00 00 00 04 00 00 00| N.......| Data: "4e0000000400000053b40a00d6ffffff9982147e1d8a020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|53 b4 0a 00 d6 ff ff ff 99 82 14 7e 1d 8a 02 00|S..........~....| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) - | | | t_choice{}: 0x290-0x29b.7 (12) - | | | t_heap{}: 0x290-0x29b.7 (12) -0x290|8e 02 00 00 |.... | t_xmin: 654 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) - | | | t_field3{}: 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) - | | | t_datum{}: 0x290-0x29b.7 (12) -0x290|8e 02 00 00 |.... | datum_len_: 654 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) -0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) - | | | t_ctid{}: 0x29c-0x2a1.7 (6) -0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) -0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) -0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) -0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) -0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 44 00 00 00 09 00 00 00| D.......| t_bits: "44000000090000003f9b0e00fc090000446d1c7e1d8a020..." (raw bits) 0x2a8-0x2bf.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) + | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|8e 02 00 00 |.... | t_xmin: 654 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|8e 02 00 00 |.... | datum_len_: 654 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 44 00 00 00 09 00 00 00| D.......| Data: "44000000090000003f9b0e00fc090000446d1c7e1d8a020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|3f 9b 0e 00 fc 09 00 00 44 6d 1c 7e 1d 8a 02 00|?.......Dm.~....| diff --git a/format/postgres/testdata/flavours/pgpro14/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro14/16406_2.fqtest index dfc91d3db..f42ad381c 100644 --- a/format/postgres/testdata/flavours/pgpro14/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/16406_2.fqtest @@ -1,93 +1,95 @@ $ fq -d pg_heap -o flavour=pgpro14 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) - | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) - | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|f1 02 00 00 |.... | t_xmin: 753 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) - | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) - | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|f1 02 00 00 |.... | datum_len_: 753 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) -0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) - | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) -0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) -0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) -0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) -0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 04 00 00 00 01 00 00 00| ........| t_bits: "040000000100000075840100f2fcffff00853c937688020..." (raw bits) 0x1fe8-0x1fff.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) + | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f1 02 00 00 |.... | t_xmin: 753 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f1 02 00 00 |.... | datum_len_: 753 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 04 00 00 00 01 00 00 00| ........| Data: "040000000100000075840100f2fcffff00853c937688020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|75 84 01 00 f2 fc ff ff 00 85 3c 93 76 88 02 00|u.........<.v...| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) - | | | t_choice{}: 0x290-0x29b.7 (12) - | | | t_heap{}: 0x290-0x29b.7 (12) -0x290|8d 03 00 00 |.... | t_xmin: 909 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) - | | | t_field3{}: 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) - | | | t_datum{}: 0x290-0x29b.7 (12) -0x290|8d 03 00 00 |.... | datum_len_: 909 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) -0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) - | | | t_ctid{}: 0x29c-0x2a1.7 (6) -0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) -0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) -0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) -0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) -0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 09 00 00 00 01 00 00 00| ........| t_bits: "09000000010000004ff60000b70c00006e1f43937688020..." (raw bits) 0x2a8-0x2bf.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) + | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|8d 03 00 00 |.... | t_xmin: 909 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|8d 03 00 00 |.... | datum_len_: 909 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 09 00 00 00 01 00 00 00| ........| Data: "09000000010000004ff60000b70c00006e1f43937688020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|4f f6 00 00 b7 0c 00 00 6e 1f 43 93 76 88 02 00|O.......n.C.v...| diff --git a/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest b/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest index bb2f6a35d..49d7451ed 100644 --- a/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest @@ -1,93 +1,95 @@ $ fq -d pg_heap -o flavour=pgproee10 ".[0].Tuples[0,-1] | dv" 16403 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fb8-0x1fe7.7 (48) - | | | t_choice{}: 0x1fb8-0x1fc3.7 (12) - | | | t_heap{}: 0x1fb8-0x1fc3.7 (12) -0x1fb0| 03 00 00 00 | .... | t_xmin: "10000000568" (3) 0x1fb8-0x1fbb.7 (4) -0x1fb0| 00 00 00 00| ....| t_xmax: 0 0x1fbc-0x1fbf.7 (4) - | | | t_field3{}: 0x1fc0-0x1fc3.7 (4) -0x1fc0|03 00 00 00 |.... | t_cid: 3 0x1fc0-0x1fc3.7 (4) -0x1fc0|03 00 00 00 |.... | t_xvac: 3 0x1fc0-0x1fc3.7 (4) - | | | t_datum{}: 0x1fb8-0x1fc3.7 (12) -0x1fb0| 03 00 00 00 | .... | datum_len_: 3 0x1fb8-0x1fbb.7 (4) -0x1fb0| 00 00 00 00| ....| datum_typmod: 0 0x1fbc-0x1fbf.7 (4) -0x1fc0|03 00 00 00 |.... | datum_typeid: 3 0x1fc0-0x1fc3.7 (4) - | | | t_ctid{}: 0x1fc4-0x1fc9.7 (6) -0x1fc0| 00 00 00 00 | .... | ip_blkid: 0 0x1fc4-0x1fc7.7 (4) -0x1fc0| 01 00 | .. | ip_posid: 1 0x1fc8-0x1fc9.7 (2) -0x1fc0| 06 00 | .. | t_infomask2: 6 0x1fca-0x1fcb.7 (2) - | | | Infomask2{}: 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 01 09 | .. | t_infomask: 2305 0x1fcc-0x1fcd.7 (2) - | | | Infomask{}: 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASNULL: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_UPDATED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 18 | . | t_hoff: 24 0x1fce-0x1fce.7 (1) -0x1fc0| 1f| .| padding0: 31 0x1fcf-0x1fcf.7 (1) -0x1fd0|09 00 00 00 01 00 00 00 43 ff 00 00 f7 0e 00 00|........C.......| t_bits: "090000000100000043ff0000f70e000043c144237a88020..." (raw bits) 0x1fd0-0x1fe7.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fb8-0x1fe7.7 (48) + | | | HeapTupleHeaderData{}: 0x1fb8-0x1fcf.7 (24) + | | | t_choice{}: 0x1fb8-0x1fc3.7 (12) + | | | t_heap{}: 0x1fb8-0x1fc3.7 (12) +0x1fb0| 03 00 00 00 | .... | t_xmin: "10000000568" (3) 0x1fb8-0x1fbb.7 (4) +0x1fb0| 00 00 00 00| ....| t_xmax: 0 0x1fbc-0x1fbf.7 (4) + | | | t_field3{}: 0x1fc0-0x1fc3.7 (4) +0x1fc0|03 00 00 00 |.... | t_cid: 3 0x1fc0-0x1fc3.7 (4) +0x1fc0|03 00 00 00 |.... | t_xvac: 3 0x1fc0-0x1fc3.7 (4) + | | | t_datum{}: 0x1fb8-0x1fc3.7 (12) +0x1fb0| 03 00 00 00 | .... | datum_len_: 3 0x1fb8-0x1fbb.7 (4) +0x1fb0| 00 00 00 00| ....| datum_typmod: 0 0x1fbc-0x1fbf.7 (4) +0x1fc0|03 00 00 00 |.... | datum_typeid: 3 0x1fc0-0x1fc3.7 (4) + | | | t_ctid{}: 0x1fc4-0x1fc9.7 (6) +0x1fc0| 00 00 00 00 | .... | ip_blkid: 0 0x1fc4-0x1fc7.7 (4) +0x1fc0| 01 00 | .. | ip_posid: 1 0x1fc8-0x1fc9.7 (2) +0x1fc0| 06 00 | .. | t_infomask2: 6 0x1fca-0x1fcb.7 (2) + | | | Infomask2{}: 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 01 09 | .. | t_infomask: 2305 0x1fcc-0x1fcd.7 (2) + | | | Infomask{}: 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASNULL: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_UPDATED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 18 | . | t_hoff: 24 0x1fce-0x1fce.7 (1) +0x1fc0| 1f| .| padding0: 31 0x1fcf-0x1fcf.7 (1) +0x1fd0|09 00 00 00 01 00 00 00 43 ff 00 00 f7 0e 00 00|........C.......| Data: "090000000100000043ff0000f70e000043c144237a88020..." (raw bits) 0x1fd0-0x1fe7.7 (24) 0x1fe0|43 c1 44 23 7a 88 02 00 |C.D#z... | - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[155]{}: HeapTupleHeaderData 0x2a8-0x2d7.7 (48) - | | | t_choice{}: 0x2a8-0x2b3.7 (12) - | | | t_heap{}: 0x2a8-0x2b3.7 (12) -0x2a0| 9e 00 00 00 | .... | t_xmin: "10000000723" (158) 0x2a8-0x2ab.7 (4) -0x2a0| 00 00 00 00| ....| t_xmax: 0 0x2ac-0x2af.7 (4) - | | | t_field3{}: 0x2b0-0x2b3.7 (4) -0x2b0|03 00 00 00 |.... | t_cid: 3 0x2b0-0x2b3.7 (4) -0x2b0|03 00 00 00 |.... | t_xvac: 3 0x2b0-0x2b3.7 (4) - | | | t_datum{}: 0x2a8-0x2b3.7 (12) -0x2a0| 9e 00 00 00 | .... | datum_len_: 158 0x2a8-0x2ab.7 (4) -0x2a0| 00 00 00 00| ....| datum_typmod: 0 0x2ac-0x2af.7 (4) -0x2b0|03 00 00 00 |.... | datum_typeid: 3 0x2b0-0x2b3.7 (4) - | | | t_ctid{}: 0x2b4-0x2b9.7 (6) -0x2b0| 00 00 00 00 | .... | ip_blkid: 0 0x2b4-0x2b7.7 (4) -0x2b0| 9c 00 | .. | ip_posid: 156 0x2b8-0x2b9.7 (2) -0x2b0| 06 00 | .. | t_infomask2: 6 0x2ba-0x2bb.7 (2) - | | | Infomask2{}: 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2ba-0x2bb.7 (2) -0x2b0| 01 09 | .. | t_infomask: 2305 0x2bc-0x2bd.7 (2) - | | | Infomask{}: 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASNULL: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_COMBOCID: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_UPDATED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 18 | . | t_hoff: 24 0x2be-0x2be.7 (1) -0x2b0| 1f| .| padding0: 31 0x2bf-0x2bf.7 (1) -0x2c0|09 00 00 00 01 00 00 00 17 13 00 00 50 ed ff ff|............P...| t_bits: "09000000010000001713000050edffffe8934c237a88020..." (raw bits) 0x2c0-0x2d7.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[155]{}: Tuple 0x2a8-0x2d7.7 (48) + | | | HeapTupleHeaderData{}: 0x2a8-0x2bf.7 (24) + | | | t_choice{}: 0x2a8-0x2b3.7 (12) + | | | t_heap{}: 0x2a8-0x2b3.7 (12) +0x2a0| 9e 00 00 00 | .... | t_xmin: "10000000723" (158) 0x2a8-0x2ab.7 (4) +0x2a0| 00 00 00 00| ....| t_xmax: 0 0x2ac-0x2af.7 (4) + | | | t_field3{}: 0x2b0-0x2b3.7 (4) +0x2b0|03 00 00 00 |.... | t_cid: 3 0x2b0-0x2b3.7 (4) +0x2b0|03 00 00 00 |.... | t_xvac: 3 0x2b0-0x2b3.7 (4) + | | | t_datum{}: 0x2a8-0x2b3.7 (12) +0x2a0| 9e 00 00 00 | .... | datum_len_: 158 0x2a8-0x2ab.7 (4) +0x2a0| 00 00 00 00| ....| datum_typmod: 0 0x2ac-0x2af.7 (4) +0x2b0|03 00 00 00 |.... | datum_typeid: 3 0x2b0-0x2b3.7 (4) + | | | t_ctid{}: 0x2b4-0x2b9.7 (6) +0x2b0| 00 00 00 00 | .... | ip_blkid: 0 0x2b4-0x2b7.7 (4) +0x2b0| 9c 00 | .. | ip_posid: 156 0x2b8-0x2b9.7 (2) +0x2b0| 06 00 | .. | t_infomask2: 6 0x2ba-0x2bb.7 (2) + | | | Infomask2{}: 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2ba-0x2bb.7 (2) +0x2b0| 01 09 | .. | t_infomask: 2305 0x2bc-0x2bd.7 (2) + | | | Infomask{}: 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASNULL: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_COMBOCID: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_UPDATED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 18 | . | t_hoff: 24 0x2be-0x2be.7 (1) +0x2b0| 1f| .| padding0: 31 0x2bf-0x2bf.7 (1) +0x2c0|09 00 00 00 01 00 00 00 17 13 00 00 50 ed ff ff|............P...| Data: "09000000010000001713000050edffffe8934c237a88020..." (raw bits) 0x2c0-0x2d7.7 (24) 0x2d0|e8 93 4c 23 7a 88 02 00 |..L#z... | diff --git a/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest b/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest index 8f4f924a7..621706007 100644 --- a/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest +++ b/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest @@ -1,93 +1,95 @@ $ fq -d pg_heap -o flavour=pgproee11 ".[0].Tuples[0,-1] | dv" 90153 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x11d8-0x11ff.7 (40) - | | | t_choice{}: 0x11d8-0x11e3.7 (12) - | | | t_heap{}: 0x11d8-0x11e3.7 (12) -0x11d0| 66 b2 02 00 | f... | t_xmin: "10015117002" (176742) 0x11d8-0x11db.7 (4) -0x11d0| 00 00 00 00| ....| t_xmax: 0 0x11dc-0x11df.7 (4) - | | | t_field3{}: 0x11e0-0x11e3.7 (4) -0x11e0|01 00 00 00 |.... | t_cid: 1 0x11e0-0x11e3.7 (4) -0x11e0|01 00 00 00 |.... | t_xvac: 1 0x11e0-0x11e3.7 (4) - | | | t_datum{}: 0x11d8-0x11e3.7 (12) -0x11d0| 66 b2 02 00 | f... | datum_len_: 176742 0x11d8-0x11db.7 (4) -0x11d0| 00 00 00 00| ....| datum_typmod: 0 0x11dc-0x11df.7 (4) -0x11e0|01 00 00 00 |.... | datum_typeid: 1 0x11e0-0x11e3.7 (4) - | | | t_ctid{}: 0x11e4-0x11e9.7 (6) -0x11e0| 00 00 00 00 | .... | ip_blkid: 0 0x11e4-0x11e7.7 (4) -0x11e0| 04 00 | .. | ip_posid: 4 0x11e8-0x11e9.7 (2) -0x11e0| 04 80 | .. | t_infomask2: 32772 0x11ea-0x11eb.7 (2) - | | | Infomask2{}: 0x11ea-0x11eb.7 (2) -0x11e0| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x11ea-0x11eb.7 (2) -0x11e0| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x11ea-0x11eb.7 (2) -0x11e0| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x11ea-0x11eb.7 (2) -0x11e0| 01 29 | .) | t_infomask: 10497 0x11ec-0x11ed.7 (2) - | | | Infomask{}: 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_HASNULL: 1 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_HASVARWIDTH: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_HASEXTERNAL: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_HASOID_OLD: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_KEYSHR_LOCK: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_COMBOCID: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_EXCL_LOCK: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_LOCK_ONLY: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_SHR_LOCK: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_LOCK_MASK: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMIN_COMMITTED: 1 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMIN_INVALID: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMIN_FROZEN: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_COMMITTED: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_INVALID: 1 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_IS_MULTI: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_UPDATED: 1 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_MOVED_OFF: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_MOVED_IN: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_MOVED: 0 0x11ec-0x11ed.7 (2) -0x11e0| 18 | . | t_hoff: 24 0x11ee-0x11ee.7 (1) -0x11e0| 07| .| padding0: 7 0x11ef-0x11ef.7 (1) -0x11f0|65 00 00 00 0b 00 00 00 4f f8 00 00 |e.......O... | t_bits: "650000000b0000004ff80000" (raw bits) 0x11f0-0x11fb.7 (12) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x11d8-0x11ff.7 (40) + | | | HeapTupleHeaderData{}: 0x11d8-0x11ef.7 (24) + | | | t_choice{}: 0x11d8-0x11e3.7 (12) + | | | t_heap{}: 0x11d8-0x11e3.7 (12) +0x11d0| 66 b2 02 00 | f... | t_xmin: "10015117002" (176742) 0x11d8-0x11db.7 (4) +0x11d0| 00 00 00 00| ....| t_xmax: 0 0x11dc-0x11df.7 (4) + | | | t_field3{}: 0x11e0-0x11e3.7 (4) +0x11e0|01 00 00 00 |.... | t_cid: 1 0x11e0-0x11e3.7 (4) +0x11e0|01 00 00 00 |.... | t_xvac: 1 0x11e0-0x11e3.7 (4) + | | | t_datum{}: 0x11d8-0x11e3.7 (12) +0x11d0| 66 b2 02 00 | f... | datum_len_: 176742 0x11d8-0x11db.7 (4) +0x11d0| 00 00 00 00| ....| datum_typmod: 0 0x11dc-0x11df.7 (4) +0x11e0|01 00 00 00 |.... | datum_typeid: 1 0x11e0-0x11e3.7 (4) + | | | t_ctid{}: 0x11e4-0x11e9.7 (6) +0x11e0| 00 00 00 00 | .... | ip_blkid: 0 0x11e4-0x11e7.7 (4) +0x11e0| 04 00 | .. | ip_posid: 4 0x11e8-0x11e9.7 (2) +0x11e0| 04 80 | .. | t_infomask2: 32772 0x11ea-0x11eb.7 (2) + | | | Infomask2{}: 0x11ea-0x11eb.7 (2) +0x11e0| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x11ea-0x11eb.7 (2) +0x11e0| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x11ea-0x11eb.7 (2) +0x11e0| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x11ea-0x11eb.7 (2) +0x11e0| 01 29 | .) | t_infomask: 10497 0x11ec-0x11ed.7 (2) + | | | Infomask{}: 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_HASNULL: 1 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_HASVARWIDTH: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_HASEXTERNAL: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_HASOID_OLD: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_KEYSHR_LOCK: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_COMBOCID: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_EXCL_LOCK: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_LOCK_ONLY: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_SHR_LOCK: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_LOCK_MASK: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMIN_COMMITTED: 1 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMIN_INVALID: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMIN_FROZEN: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_COMMITTED: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_INVALID: 1 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_XMAX_IS_MULTI: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_UPDATED: 1 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_MOVED_OFF: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_MOVED_IN: 0 0x11ec-0x11ed.7 (2) +0x11e0| 01 29 | .) | HEAP_MOVED: 0 0x11ec-0x11ed.7 (2) +0x11e0| 18 | . | t_hoff: 24 0x11ee-0x11ee.7 (1) +0x11e0| 07| .| padding0: 7 0x11ef-0x11ef.7 (1) +0x11f0|65 00 00 00 0b 00 00 00 4f f8 00 00 |e.......O... | Data: "650000000b0000004ff80000" (raw bits) 0x11f0-0x11fb.7 (12) 0x11f0| 00 00 00 00| ....| padding1: "00000000" (raw bits) 0x11fc-0x11ff.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[99]{}: HeapTupleHeaderData 0x1818-0x183f.7 (40) - | | | t_choice{}: 0x1818-0x1823.7 (12) - | | | t_heap{}: 0x1818-0x1823.7 (12) -0x1810| 54 b0 02 00 | T... | t_xmin: "10015116472" (176212) 0x1818-0x181b.7 (4) -0x1810| 00 00 00 00| ....| t_xmax: 0 0x181c-0x181f.7 (4) - | | | t_field3{}: 0x1820-0x1823.7 (4) -0x1820|01 00 00 00 |.... | t_cid: 1 0x1820-0x1823.7 (4) -0x1820|01 00 00 00 |.... | t_xvac: 1 0x1820-0x1823.7 (4) - | | | t_datum{}: 0x1818-0x1823.7 (12) -0x1810| 54 b0 02 00 | T... | datum_len_: 176212 0x1818-0x181b.7 (4) -0x1810| 00 00 00 00| ....| datum_typmod: 0 0x181c-0x181f.7 (4) -0x1820|01 00 00 00 |.... | datum_typeid: 1 0x1820-0x1823.7 (4) - | | | t_ctid{}: 0x1824-0x1829.7 (6) -0x1820| 00 00 00 00 | .... | ip_blkid: 0 0x1824-0x1827.7 (4) -0x1820| fe 00 | .. | ip_posid: 254 0x1828-0x1829.7 (2) -0x1820| 04 80 | .. | t_infomask2: 32772 0x182a-0x182b.7 (2) - | | | Infomask2{}: 0x182a-0x182b.7 (2) -0x1820| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x182a-0x182b.7 (2) -0x1820| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x182a-0x182b.7 (2) -0x1820| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x182a-0x182b.7 (2) -0x1820| 01 29 | .) | t_infomask: 10497 0x182c-0x182d.7 (2) - | | | Infomask{}: 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_HASNULL: 1 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_HASVARWIDTH: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_HASEXTERNAL: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_HASOID_OLD: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_KEYSHR_LOCK: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_COMBOCID: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_EXCL_LOCK: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_LOCK_ONLY: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_SHR_LOCK: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_LOCK_MASK: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMIN_COMMITTED: 1 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMIN_INVALID: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMIN_FROZEN: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_COMMITTED: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_INVALID: 1 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_IS_MULTI: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_UPDATED: 1 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_MOVED_OFF: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_MOVED_IN: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_MOVED: 0 0x182c-0x182d.7 (2) -0x1820| 18 | . | t_hoff: 24 0x182e-0x182e.7 (1) -0x1820| 07| .| padding0: 7 0x182f-0x182f.7 (1) -0x1830|64 00 00 00 0a 00 00 00 41 59 00 00 |d.......AY.. | t_bits: "640000000a00000041590000" (raw bits) 0x1830-0x183b.7 (12) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[99]{}: Tuple 0x1818-0x183f.7 (40) + | | | HeapTupleHeaderData{}: 0x1818-0x182f.7 (24) + | | | t_choice{}: 0x1818-0x1823.7 (12) + | | | t_heap{}: 0x1818-0x1823.7 (12) +0x1810| 54 b0 02 00 | T... | t_xmin: "10015116472" (176212) 0x1818-0x181b.7 (4) +0x1810| 00 00 00 00| ....| t_xmax: 0 0x181c-0x181f.7 (4) + | | | t_field3{}: 0x1820-0x1823.7 (4) +0x1820|01 00 00 00 |.... | t_cid: 1 0x1820-0x1823.7 (4) +0x1820|01 00 00 00 |.... | t_xvac: 1 0x1820-0x1823.7 (4) + | | | t_datum{}: 0x1818-0x1823.7 (12) +0x1810| 54 b0 02 00 | T... | datum_len_: 176212 0x1818-0x181b.7 (4) +0x1810| 00 00 00 00| ....| datum_typmod: 0 0x181c-0x181f.7 (4) +0x1820|01 00 00 00 |.... | datum_typeid: 1 0x1820-0x1823.7 (4) + | | | t_ctid{}: 0x1824-0x1829.7 (6) +0x1820| 00 00 00 00 | .... | ip_blkid: 0 0x1824-0x1827.7 (4) +0x1820| fe 00 | .. | ip_posid: 254 0x1828-0x1829.7 (2) +0x1820| 04 80 | .. | t_infomask2: 32772 0x182a-0x182b.7 (2) + | | | Infomask2{}: 0x182a-0x182b.7 (2) +0x1820| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x182a-0x182b.7 (2) +0x1820| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x182a-0x182b.7 (2) +0x1820| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x182a-0x182b.7 (2) +0x1820| 01 29 | .) | t_infomask: 10497 0x182c-0x182d.7 (2) + | | | Infomask{}: 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_HASNULL: 1 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_HASVARWIDTH: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_HASEXTERNAL: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_HASOID_OLD: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_KEYSHR_LOCK: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_COMBOCID: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_EXCL_LOCK: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_LOCK_ONLY: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_SHR_LOCK: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_LOCK_MASK: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMIN_COMMITTED: 1 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMIN_INVALID: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMIN_FROZEN: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_COMMITTED: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_INVALID: 1 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_XMAX_IS_MULTI: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_UPDATED: 1 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_MOVED_OFF: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_MOVED_IN: 0 0x182c-0x182d.7 (2) +0x1820| 01 29 | .) | HEAP_MOVED: 0 0x182c-0x182d.7 (2) +0x1820| 18 | . | t_hoff: 24 0x182e-0x182e.7 (1) +0x1820| 07| .| padding0: 7 0x182f-0x182f.7 (1) +0x1830|64 00 00 00 0a 00 00 00 41 59 00 00 |d.......AY.. | Data: "640000000a00000041590000" (raw bits) 0x1830-0x183b.7 (12) 0x1830| 00 00 00 00| ....| padding1: "00000000" (raw bits) 0x183c-0x183f.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest b/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest index 7dd501fe2..211d974e1 100644 --- a/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest @@ -1,93 +1,95 @@ $ fq -d pg_heap -o flavour=pgproee12 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fb8-0x1fe7.7 (48) - | | | t_choice{}: 0x1fb8-0x1fc3.7 (12) - | | | t_heap{}: 0x1fb8-0x1fc3.7 (12) -0x1fb0| 03 00 00 00 | .... | t_xmin: "10000000509" (3) 0x1fb8-0x1fbb.7 (4) -0x1fb0| 00 00 00 00| ....| t_xmax: 0 0x1fbc-0x1fbf.7 (4) - | | | t_field3{}: 0x1fc0-0x1fc3.7 (4) -0x1fc0|03 00 00 00 |.... | t_cid: 3 0x1fc0-0x1fc3.7 (4) -0x1fc0|03 00 00 00 |.... | t_xvac: 3 0x1fc0-0x1fc3.7 (4) - | | | t_datum{}: 0x1fb8-0x1fc3.7 (12) -0x1fb0| 03 00 00 00 | .... | datum_len_: 3 0x1fb8-0x1fbb.7 (4) -0x1fb0| 00 00 00 00| ....| datum_typmod: 0 0x1fbc-0x1fbf.7 (4) -0x1fc0|03 00 00 00 |.... | datum_typeid: 3 0x1fc0-0x1fc3.7 (4) - | | | t_ctid{}: 0x1fc4-0x1fc9.7 (6) -0x1fc0| 00 00 00 00 | .... | ip_blkid: 0 0x1fc4-0x1fc7.7 (4) -0x1fc0| 01 00 | .. | ip_posid: 1 0x1fc8-0x1fc9.7 (2) -0x1fc0| 06 00 | .. | t_infomask2: 6 0x1fca-0x1fcb.7 (2) - | | | Infomask2{}: 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 01 09 | .. | t_infomask: 2305 0x1fcc-0x1fcd.7 (2) - | | | Infomask{}: 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASNULL: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_UPDATED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 18 | . | t_hoff: 24 0x1fce-0x1fce.7 (1) -0x1fc0| 1f| .| padding0: 31 0x1fcf-0x1fcf.7 (1) -0x1fd0|02 00 00 00 01 00 00 00 38 fd 00 00 89 0c 00 00|........8.......| t_bits: "020000000100000038fd0000890c0000c025676d6388020..." (raw bits) 0x1fd0-0x1fe7.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fb8-0x1fe7.7 (48) + | | | HeapTupleHeaderData{}: 0x1fb8-0x1fcf.7 (24) + | | | t_choice{}: 0x1fb8-0x1fc3.7 (12) + | | | t_heap{}: 0x1fb8-0x1fc3.7 (12) +0x1fb0| 03 00 00 00 | .... | t_xmin: "10000000509" (3) 0x1fb8-0x1fbb.7 (4) +0x1fb0| 00 00 00 00| ....| t_xmax: 0 0x1fbc-0x1fbf.7 (4) + | | | t_field3{}: 0x1fc0-0x1fc3.7 (4) +0x1fc0|03 00 00 00 |.... | t_cid: 3 0x1fc0-0x1fc3.7 (4) +0x1fc0|03 00 00 00 |.... | t_xvac: 3 0x1fc0-0x1fc3.7 (4) + | | | t_datum{}: 0x1fb8-0x1fc3.7 (12) +0x1fb0| 03 00 00 00 | .... | datum_len_: 3 0x1fb8-0x1fbb.7 (4) +0x1fb0| 00 00 00 00| ....| datum_typmod: 0 0x1fbc-0x1fbf.7 (4) +0x1fc0|03 00 00 00 |.... | datum_typeid: 3 0x1fc0-0x1fc3.7 (4) + | | | t_ctid{}: 0x1fc4-0x1fc9.7 (6) +0x1fc0| 00 00 00 00 | .... | ip_blkid: 0 0x1fc4-0x1fc7.7 (4) +0x1fc0| 01 00 | .. | ip_posid: 1 0x1fc8-0x1fc9.7 (2) +0x1fc0| 06 00 | .. | t_infomask2: 6 0x1fca-0x1fcb.7 (2) + | | | Infomask2{}: 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 01 09 | .. | t_infomask: 2305 0x1fcc-0x1fcd.7 (2) + | | | Infomask{}: 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASNULL: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_UPDATED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 18 | . | t_hoff: 24 0x1fce-0x1fce.7 (1) +0x1fc0| 1f| .| padding0: 31 0x1fcf-0x1fcf.7 (1) +0x1fd0|02 00 00 00 01 00 00 00 38 fd 00 00 89 0c 00 00|........8.......| Data: "020000000100000038fd0000890c0000c025676d6388020..." (raw bits) 0x1fd0-0x1fe7.7 (24) 0x1fe0|c0 25 67 6d 63 88 02 00 |.%gmc... | - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[155]{}: HeapTupleHeaderData 0x2a8-0x2d7.7 (48) - | | | t_choice{}: 0x2a8-0x2b3.7 (12) - | | | t_heap{}: 0x2a8-0x2b3.7 (12) -0x2a0| 9e 00 00 00 | .... | t_xmin: "10000000664" (158) 0x2a8-0x2ab.7 (4) -0x2a0| 00 00 00 00| ....| t_xmax: 0 0x2ac-0x2af.7 (4) - | | | t_field3{}: 0x2b0-0x2b3.7 (4) -0x2b0|03 00 00 00 |.... | t_cid: 3 0x2b0-0x2b3.7 (4) -0x2b0|03 00 00 00 |.... | t_xvac: 3 0x2b0-0x2b3.7 (4) - | | | t_datum{}: 0x2a8-0x2b3.7 (12) -0x2a0| 9e 00 00 00 | .... | datum_len_: 158 0x2a8-0x2ab.7 (4) -0x2a0| 00 00 00 00| ....| datum_typmod: 0 0x2ac-0x2af.7 (4) -0x2b0|03 00 00 00 |.... | datum_typeid: 3 0x2b0-0x2b3.7 (4) - | | | t_ctid{}: 0x2b4-0x2b9.7 (6) -0x2b0| 00 00 00 00 | .... | ip_blkid: 0 0x2b4-0x2b7.7 (4) -0x2b0| 9c 00 | .. | ip_posid: 156 0x2b8-0x2b9.7 (2) -0x2b0| 06 00 | .. | t_infomask2: 6 0x2ba-0x2bb.7 (2) - | | | Infomask2{}: 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2ba-0x2bb.7 (2) -0x2b0| 01 09 | .. | t_infomask: 2305 0x2bc-0x2bd.7 (2) - | | | Infomask{}: 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASNULL: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_COMBOCID: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_UPDATED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 18 | . | t_hoff: 24 0x2be-0x2be.7 (1) -0x2b0| 1f| .| padding0: 31 0x2bf-0x2bf.7 (1) -0x2c0|08 00 00 00 01 00 00 00 e4 f5 00 00 c9 06 00 00|................| t_bits: "0800000001000000e4f50000c9060000d0a36f6d6388020..." (raw bits) 0x2c0-0x2d7.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[155]{}: Tuple 0x2a8-0x2d7.7 (48) + | | | HeapTupleHeaderData{}: 0x2a8-0x2bf.7 (24) + | | | t_choice{}: 0x2a8-0x2b3.7 (12) + | | | t_heap{}: 0x2a8-0x2b3.7 (12) +0x2a0| 9e 00 00 00 | .... | t_xmin: "10000000664" (158) 0x2a8-0x2ab.7 (4) +0x2a0| 00 00 00 00| ....| t_xmax: 0 0x2ac-0x2af.7 (4) + | | | t_field3{}: 0x2b0-0x2b3.7 (4) +0x2b0|03 00 00 00 |.... | t_cid: 3 0x2b0-0x2b3.7 (4) +0x2b0|03 00 00 00 |.... | t_xvac: 3 0x2b0-0x2b3.7 (4) + | | | t_datum{}: 0x2a8-0x2b3.7 (12) +0x2a0| 9e 00 00 00 | .... | datum_len_: 158 0x2a8-0x2ab.7 (4) +0x2a0| 00 00 00 00| ....| datum_typmod: 0 0x2ac-0x2af.7 (4) +0x2b0|03 00 00 00 |.... | datum_typeid: 3 0x2b0-0x2b3.7 (4) + | | | t_ctid{}: 0x2b4-0x2b9.7 (6) +0x2b0| 00 00 00 00 | .... | ip_blkid: 0 0x2b4-0x2b7.7 (4) +0x2b0| 9c 00 | .. | ip_posid: 156 0x2b8-0x2b9.7 (2) +0x2b0| 06 00 | .. | t_infomask2: 6 0x2ba-0x2bb.7 (2) + | | | Infomask2{}: 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2ba-0x2bb.7 (2) +0x2b0| 01 09 | .. | t_infomask: 2305 0x2bc-0x2bd.7 (2) + | | | Infomask{}: 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASNULL: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_COMBOCID: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_UPDATED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 18 | . | t_hoff: 24 0x2be-0x2be.7 (1) +0x2b0| 1f| .| padding0: 31 0x2bf-0x2bf.7 (1) +0x2c0|08 00 00 00 01 00 00 00 e4 f5 00 00 c9 06 00 00|................| Data: "0800000001000000e4f50000c9060000d0a36f6d6388020..." (raw bits) 0x2c0-0x2d7.7 (24) 0x2d0|d0 a3 6f 6d 63 88 02 00 |..omc... | diff --git a/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest b/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest index a1f0bf0a0..23c80ec5f 100644 --- a/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest @@ -1,93 +1,95 @@ $ fq -d pg_heap -o flavour=pgproee13 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fb8-0x1fe7.7 (48) - | | | t_choice{}: 0x1fb8-0x1fc3.7 (12) - | | | t_heap{}: 0x1fb8-0x1fc3.7 (12) -0x1fb0| 03 00 00 00 | .... | t_xmin: "10000000510" (3) 0x1fb8-0x1fbb.7 (4) -0x1fb0| 00 00 00 00| ....| t_xmax: 0 0x1fbc-0x1fbf.7 (4) - | | | t_field3{}: 0x1fc0-0x1fc3.7 (4) -0x1fc0|03 00 00 00 |.... | t_cid: 3 0x1fc0-0x1fc3.7 (4) -0x1fc0|03 00 00 00 |.... | t_xvac: 3 0x1fc0-0x1fc3.7 (4) - | | | t_datum{}: 0x1fb8-0x1fc3.7 (12) -0x1fb0| 03 00 00 00 | .... | datum_len_: 3 0x1fb8-0x1fbb.7 (4) -0x1fb0| 00 00 00 00| ....| datum_typmod: 0 0x1fbc-0x1fbf.7 (4) -0x1fc0|03 00 00 00 |.... | datum_typeid: 3 0x1fc0-0x1fc3.7 (4) - | | | t_ctid{}: 0x1fc4-0x1fc9.7 (6) -0x1fc0| 00 00 00 00 | .... | ip_blkid: 0 0x1fc4-0x1fc7.7 (4) -0x1fc0| 01 00 | .. | ip_posid: 1 0x1fc8-0x1fc9.7 (2) -0x1fc0| 06 00 | .. | t_infomask2: 6 0x1fca-0x1fcb.7 (2) - | | | Infomask2{}: 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 01 09 | .. | t_infomask: 2305 0x1fcc-0x1fcd.7 (2) - | | | Infomask{}: 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASNULL: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_UPDATED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 18 | . | t_hoff: 24 0x1fce-0x1fce.7 (1) -0x1fc0| 1f| .| padding0: 31 0x1fcf-0x1fcf.7 (1) -0x1fd0|01 00 00 00 01 00 00 00 76 cd 00 00 3d fc ff ff|........v...=...| t_bits: "010000000100000076cd00003dfcffff088e15d47788020..." (raw bits) 0x1fd0-0x1fe7.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fb8-0x1fe7.7 (48) + | | | HeapTupleHeaderData{}: 0x1fb8-0x1fcf.7 (24) + | | | t_choice{}: 0x1fb8-0x1fc3.7 (12) + | | | t_heap{}: 0x1fb8-0x1fc3.7 (12) +0x1fb0| 03 00 00 00 | .... | t_xmin: "10000000510" (3) 0x1fb8-0x1fbb.7 (4) +0x1fb0| 00 00 00 00| ....| t_xmax: 0 0x1fbc-0x1fbf.7 (4) + | | | t_field3{}: 0x1fc0-0x1fc3.7 (4) +0x1fc0|03 00 00 00 |.... | t_cid: 3 0x1fc0-0x1fc3.7 (4) +0x1fc0|03 00 00 00 |.... | t_xvac: 3 0x1fc0-0x1fc3.7 (4) + | | | t_datum{}: 0x1fb8-0x1fc3.7 (12) +0x1fb0| 03 00 00 00 | .... | datum_len_: 3 0x1fb8-0x1fbb.7 (4) +0x1fb0| 00 00 00 00| ....| datum_typmod: 0 0x1fbc-0x1fbf.7 (4) +0x1fc0|03 00 00 00 |.... | datum_typeid: 3 0x1fc0-0x1fc3.7 (4) + | | | t_ctid{}: 0x1fc4-0x1fc9.7 (6) +0x1fc0| 00 00 00 00 | .... | ip_blkid: 0 0x1fc4-0x1fc7.7 (4) +0x1fc0| 01 00 | .. | ip_posid: 1 0x1fc8-0x1fc9.7 (2) +0x1fc0| 06 00 | .. | t_infomask2: 6 0x1fca-0x1fcb.7 (2) + | | | Infomask2{}: 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fca-0x1fcb.7 (2) +0x1fc0| 01 09 | .. | t_infomask: 2305 0x1fcc-0x1fcd.7 (2) + | | | Infomask{}: 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASNULL: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_UPDATED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 01 09 | .. | HEAP_MOVED: 0 0x1fcc-0x1fcd.7 (2) +0x1fc0| 18 | . | t_hoff: 24 0x1fce-0x1fce.7 (1) +0x1fc0| 1f| .| padding0: 31 0x1fcf-0x1fcf.7 (1) +0x1fd0|01 00 00 00 01 00 00 00 76 cd 00 00 3d fc ff ff|........v...=...| Data: "010000000100000076cd00003dfcffff088e15d47788020..." (raw bits) 0x1fd0-0x1fe7.7 (24) 0x1fe0|08 8e 15 d4 77 88 02 00 |....w... | - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[155]{}: HeapTupleHeaderData 0x2a8-0x2d7.7 (48) - | | | t_choice{}: 0x2a8-0x2b3.7 (12) - | | | t_heap{}: 0x2a8-0x2b3.7 (12) -0x2a0| 9e 00 00 00 | .... | t_xmin: "10000000665" (158) 0x2a8-0x2ab.7 (4) -0x2a0| 00 00 00 00| ....| t_xmax: 0 0x2ac-0x2af.7 (4) - | | | t_field3{}: 0x2b0-0x2b3.7 (4) -0x2b0|03 00 00 00 |.... | t_cid: 3 0x2b0-0x2b3.7 (4) -0x2b0|03 00 00 00 |.... | t_xvac: 3 0x2b0-0x2b3.7 (4) - | | | t_datum{}: 0x2a8-0x2b3.7 (12) -0x2a0| 9e 00 00 00 | .... | datum_len_: 158 0x2a8-0x2ab.7 (4) -0x2a0| 00 00 00 00| ....| datum_typmod: 0 0x2ac-0x2af.7 (4) -0x2b0|03 00 00 00 |.... | datum_typeid: 3 0x2b0-0x2b3.7 (4) - | | | t_ctid{}: 0x2b4-0x2b9.7 (6) -0x2b0| 00 00 00 00 | .... | ip_blkid: 0 0x2b4-0x2b7.7 (4) -0x2b0| 9c 00 | .. | ip_posid: 156 0x2b8-0x2b9.7 (2) -0x2b0| 06 00 | .. | t_infomask2: 6 0x2ba-0x2bb.7 (2) - | | | Infomask2{}: 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2ba-0x2bb.7 (2) -0x2b0| 01 09 | .. | t_infomask: 2305 0x2bc-0x2bd.7 (2) - | | | Infomask{}: 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASNULL: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_COMBOCID: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_UPDATED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 18 | . | t_hoff: 24 0x2be-0x2be.7 (1) -0x2b0| 1f| .| padding0: 31 0x2bf-0x2bf.7 (1) -0x2c0|04 00 00 00 01 00 00 00 71 8a 00 00 81 fb ff ff|........q.......| t_bits: "0400000001000000718a000081fbffff546f1cd47788020..." (raw bits) 0x2c0-0x2d7.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[155]{}: Tuple 0x2a8-0x2d7.7 (48) + | | | HeapTupleHeaderData{}: 0x2a8-0x2bf.7 (24) + | | | t_choice{}: 0x2a8-0x2b3.7 (12) + | | | t_heap{}: 0x2a8-0x2b3.7 (12) +0x2a0| 9e 00 00 00 | .... | t_xmin: "10000000665" (158) 0x2a8-0x2ab.7 (4) +0x2a0| 00 00 00 00| ....| t_xmax: 0 0x2ac-0x2af.7 (4) + | | | t_field3{}: 0x2b0-0x2b3.7 (4) +0x2b0|03 00 00 00 |.... | t_cid: 3 0x2b0-0x2b3.7 (4) +0x2b0|03 00 00 00 |.... | t_xvac: 3 0x2b0-0x2b3.7 (4) + | | | t_datum{}: 0x2a8-0x2b3.7 (12) +0x2a0| 9e 00 00 00 | .... | datum_len_: 158 0x2a8-0x2ab.7 (4) +0x2a0| 00 00 00 00| ....| datum_typmod: 0 0x2ac-0x2af.7 (4) +0x2b0|03 00 00 00 |.... | datum_typeid: 3 0x2b0-0x2b3.7 (4) + | | | t_ctid{}: 0x2b4-0x2b9.7 (6) +0x2b0| 00 00 00 00 | .... | ip_blkid: 0 0x2b4-0x2b7.7 (4) +0x2b0| 9c 00 | .. | ip_posid: 156 0x2b8-0x2b9.7 (2) +0x2b0| 06 00 | .. | t_infomask2: 6 0x2ba-0x2bb.7 (2) + | | | Infomask2{}: 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2ba-0x2bb.7 (2) +0x2b0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2ba-0x2bb.7 (2) +0x2b0| 01 09 | .. | t_infomask: 2305 0x2bc-0x2bd.7 (2) + | | | Infomask{}: 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASNULL: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_COMBOCID: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_UPDATED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2bc-0x2bd.7 (2) +0x2b0| 01 09 | .. | HEAP_MOVED: 0 0x2bc-0x2bd.7 (2) +0x2b0| 18 | . | t_hoff: 24 0x2be-0x2be.7 (1) +0x2b0| 1f| .| padding0: 31 0x2bf-0x2bf.7 (1) +0x2c0|04 00 00 00 01 00 00 00 71 8a 00 00 81 fb ff ff|........q.......| Data: "0400000001000000718a000081fbffff546f1cd47788020..." (raw bits) 0x2c0-0x2d7.7 (24) 0x2d0|54 6f 1c d4 77 88 02 00 |To..w... | diff --git a/format/postgres/testdata/flavours/postgres11/16406_2.fqtest b/format/postgres/testdata/flavours/postgres11/16406_2.fqtest index aa8a8332b..fb1924445 100644 --- a/format/postgres/testdata/flavours/postgres11/16406_2.fqtest +++ b/format/postgres/testdata/flavours/postgres11/16406_2.fqtest @@ -1,93 +1,95 @@ $ fq -d pg_heap -o flavour=postgres11 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) - | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) - | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|45 02 00 00 |E... | t_xmin: 581 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) - | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) - | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|45 02 00 00 |E... | datum_len_: 581 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) -0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) - | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) -0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) -0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) -0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) -0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 07 00 00 00 01 00 00 00| ........| t_bits: "07000000010000007419010097f5ffffb55804f05388020..." (raw bits) 0x1fe8-0x1fff.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) + | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|45 02 00 00 |E... | t_xmin: 581 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|45 02 00 00 |E... | datum_len_: 581 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 07 00 00 00 01 00 00 00| ........| Data: "07000000010000007419010097f5ffffb55804f05388020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|74 19 01 00 97 f5 ff ff b5 58 04 f0 53 88 02 00|t........X..S...| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) - | | | t_choice{}: 0x290-0x29b.7 (12) - | | | t_heap{}: 0x290-0x29b.7 (12) -0x290|e3 02 00 00 |.... | t_xmin: 739 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) - | | | t_field3{}: 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) - | | | t_datum{}: 0x290-0x29b.7 (12) -0x290|e3 02 00 00 |.... | datum_len_: 739 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) -0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) - | | | t_ctid{}: 0x29c-0x2a1.7 (6) -0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) -0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) -0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) -0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) -0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 09 00 00 00 01 00 00 00| ........| t_bits: "0900000001000000feda000081050000e36412f05388020..." (raw bits) 0x2a8-0x2bf.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) + | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|e3 02 00 00 |.... | t_xmin: 739 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|e3 02 00 00 |.... | datum_len_: 739 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 09 00 00 00 01 00 00 00| ........| Data: "0900000001000000feda000081050000e36412f05388020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|fe da 00 00 81 05 00 00 e3 64 12 f0 53 88 02 00|.........d..S...| diff --git a/format/postgres/testdata/flavours/postgres12/16406_2.fqtest b/format/postgres/testdata/flavours/postgres12/16406_2.fqtest index f70467f91..1b9292c6a 100644 --- a/format/postgres/testdata/flavours/postgres12/16406_2.fqtest +++ b/format/postgres/testdata/flavours/postgres12/16406_2.fqtest @@ -1,93 +1,95 @@ $ fq -d pg_heap -o flavour=postgres12 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) - | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) - | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|f3 01 00 00 |.... | t_xmin: 499 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) - | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) - | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|f3 01 00 00 |.... | datum_len_: 499 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) -0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) - | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) -0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) -0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) -0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) -0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 01 00 00 00 01 00 00 00| ........| t_bits: "0100000001000000df60000041090000c772ccc34f88020..." (raw bits) 0x1fe8-0x1fff.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) + | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f3 01 00 00 |.... | t_xmin: 499 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|f3 01 00 00 |.... | datum_len_: 499 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 01 00 00 00 01 00 00 00| ........| Data: "0100000001000000df60000041090000c772ccc34f88020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|df 60 00 00 41 09 00 00 c7 72 cc c3 4f 88 02 00|.`..A....r..O...| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) - | | | t_choice{}: 0x290-0x29b.7 (12) - | | | t_heap{}: 0x290-0x29b.7 (12) -0x290|95 02 00 00 |.... | t_xmin: 661 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) - | | | t_field3{}: 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) - | | | t_datum{}: 0x290-0x29b.7 (12) -0x290|95 02 00 00 |.... | datum_len_: 661 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) -0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) - | | | t_ctid{}: 0x29c-0x2a1.7 (6) -0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) -0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) -0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) -0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) -0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 0a 00 00 00 01 00 00 00| ........| t_bits: "0a00000001000000d68c00009d0d0000b275d1c34f88020..." (raw bits) 0x2a8-0x2bf.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) + | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|95 02 00 00 |.... | t_xmin: 661 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|95 02 00 00 |.... | datum_len_: 661 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 0a 00 00 00 01 00 00 00| ........| Data: "0a00000001000000d68c00009d0d0000b275d1c34f88020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|d6 8c 00 00 9d 0d 00 00 b2 75 d1 c3 4f 88 02 00|.........u..O...| diff --git a/format/postgres/testdata/flavours/postgres13/16396_1.fqtest b/format/postgres/testdata/flavours/postgres13/16396_1.fqtest index 703353286..5e441e60d 100644 --- a/format/postgres/testdata/flavours/postgres13/16396_1.fqtest +++ b/format/postgres/testdata/flavours/postgres13/16396_1.fqtest @@ -1,97 +1,99 @@ $ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1f80-0x1fff.7 (128) - | | | t_choice{}: 0x1f80-0x1f8b.7 (12) - | | | t_heap{}: 0x1f80-0x1f8b.7 (12) -0x1f80|e9 01 00 00 |.... | t_xmin: 489 0x1f80-0x1f83.7 (4) -0x1f80| 00 00 00 00 | .... | t_xmax: 0 0x1f84-0x1f87.7 (4) - | | | t_field3{}: 0x1f88-0x1f8b.7 (4) -0x1f80| 0f 00 00 00 | .... | t_cid: 15 0x1f88-0x1f8b.7 (4) -0x1f80| 0f 00 00 00 | .... | t_xvac: 15 0x1f88-0x1f8b.7 (4) - | | | t_datum{}: 0x1f80-0x1f8b.7 (12) -0x1f80|e9 01 00 00 |.... | datum_len_: 489 0x1f80-0x1f83.7 (4) -0x1f80| 00 00 00 00 | .... | datum_typmod: 0 0x1f84-0x1f87.7 (4) -0x1f80| 0f 00 00 00 | .... | datum_typeid: 15 0x1f88-0x1f8b.7 (4) - | | | t_ctid{}: 0x1f8c-0x1f91.7 (6) -0x1f80| 00 00 00 00| ....| ip_blkid: 0 0x1f8c-0x1f8f.7 (4) -0x1f90|01 00 |.. | ip_posid: 1 0x1f90-0x1f91.7 (2) -0x1f90| 04 00 | .. | t_infomask2: 4 0x1f92-0x1f93.7 (2) - | | | Infomask2{}: 0x1f92-0x1f93.7 (2) -0x1f90| 04 00 | .. | HEAP_KEYS_UPDATED: 0 0x1f92-0x1f93.7 (2) -0x1f90| 04 00 | .. | HEAP_HOT_UPDATED: 0 0x1f92-0x1f93.7 (2) -0x1f90| 04 00 | .. | HEAP_ONLY_TUPLE: 0 0x1f92-0x1f93.7 (2) -0x1f90| 02 09 | .. | t_infomask: 2306 0x1f94-0x1f95.7 (2) - | | | Infomask{}: 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASNULL: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASVARWIDTH: 1 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASEXTERNAL: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASOID_OLD: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_COMBOCID: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_LOCK_MASK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMIN_INVALID: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMIN_FROZEN: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_INVALID: 1 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_UPDATED: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_MOVED_OFF: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_MOVED_IN: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_MOVED: 0 0x1f94-0x1f95.7 (2) -0x1f90| 18 | . | t_hoff: 24 0x1f96-0x1f96.7 (1) -0x1f90| 00 | . | padding0: 0 0x1f97-0x1f97.7 (1) -0x1f90| 01 00 00 00 01 00 00 00| ........| t_bits: "010000000100000000000000ab202020202020202020202..." (raw bits) 0x1f98-0x1ff8.7 (97) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1f80-0x1fff.7 (128) + | | | HeapTupleHeaderData{}: 0x1f80-0x1f97.7 (24) + | | | t_choice{}: 0x1f80-0x1f8b.7 (12) + | | | t_heap{}: 0x1f80-0x1f8b.7 (12) +0x1f80|e9 01 00 00 |.... | t_xmin: 489 0x1f80-0x1f83.7 (4) +0x1f80| 00 00 00 00 | .... | t_xmax: 0 0x1f84-0x1f87.7 (4) + | | | t_field3{}: 0x1f88-0x1f8b.7 (4) +0x1f80| 0f 00 00 00 | .... | t_cid: 15 0x1f88-0x1f8b.7 (4) +0x1f80| 0f 00 00 00 | .... | t_xvac: 15 0x1f88-0x1f8b.7 (4) + | | | t_datum{}: 0x1f80-0x1f8b.7 (12) +0x1f80|e9 01 00 00 |.... | datum_len_: 489 0x1f80-0x1f83.7 (4) +0x1f80| 00 00 00 00 | .... | datum_typmod: 0 0x1f84-0x1f87.7 (4) +0x1f80| 0f 00 00 00 | .... | datum_typeid: 15 0x1f88-0x1f8b.7 (4) + | | | t_ctid{}: 0x1f8c-0x1f91.7 (6) +0x1f80| 00 00 00 00| ....| ip_blkid: 0 0x1f8c-0x1f8f.7 (4) +0x1f90|01 00 |.. | ip_posid: 1 0x1f90-0x1f91.7 (2) +0x1f90| 04 00 | .. | t_infomask2: 4 0x1f92-0x1f93.7 (2) + | | | Infomask2{}: 0x1f92-0x1f93.7 (2) +0x1f90| 04 00 | .. | HEAP_KEYS_UPDATED: 0 0x1f92-0x1f93.7 (2) +0x1f90| 04 00 | .. | HEAP_HOT_UPDATED: 0 0x1f92-0x1f93.7 (2) +0x1f90| 04 00 | .. | HEAP_ONLY_TUPLE: 0 0x1f92-0x1f93.7 (2) +0x1f90| 02 09 | .. | t_infomask: 2306 0x1f94-0x1f95.7 (2) + | | | Infomask{}: 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASNULL: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASVARWIDTH: 1 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASEXTERNAL: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASOID_OLD: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_COMBOCID: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_LOCK_MASK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMIN_INVALID: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMIN_FROZEN: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_INVALID: 1 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_UPDATED: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_MOVED_OFF: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_MOVED_IN: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_MOVED: 0 0x1f94-0x1f95.7 (2) +0x1f90| 18 | . | t_hoff: 24 0x1f96-0x1f96.7 (1) +0x1f90| 00 | . | padding0: 0 0x1f97-0x1f97.7 (1) +0x1f90| 01 00 00 00 01 00 00 00| ........| Data: "010000000100000000000000ab202020202020202020202..." (raw bits) 0x1f98-0x1ff8.7 (97) 0x1fa0|00 00 00 00 ab 20 20 20 20 20 20 20 20 20 20 20|..... | * |until 0x1ff8.7 (97) | | 0x1ff0| 00 00 00 00 00 00 00| .......| padding1: "00000000000000" (raw bits) 0x1ff9-0x1fff.7 (7) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[60]{}: HeapTupleHeaderData 0x180-0x1ff.7 (128) - | | | t_choice{}: 0x180-0x18b.7 (12) - | | | t_heap{}: 0x180-0x18b.7 (12) -0x180|e2 2f 00 00 |./.. | t_xmin: 12258 0x180-0x183.7 (4) -0x180| 00 00 00 00 | .... | t_xmax: 0 0x184-0x187.7 (4) - | | | t_field3{}: 0x188-0x18b.7 (4) -0x180| 00 00 00 00 | .... | t_cid: 0 0x188-0x18b.7 (4) -0x180| 00 00 00 00 | .... | t_xvac: 0 0x188-0x18b.7 (4) - | | | t_datum{}: 0x180-0x18b.7 (12) -0x180|e2 2f 00 00 |./.. | datum_len_: 12258 0x180-0x183.7 (4) -0x180| 00 00 00 00 | .... | datum_typmod: 0 0x184-0x187.7 (4) -0x180| 00 00 00 00 | .... | datum_typeid: 0 0x188-0x18b.7 (4) - | | | t_ctid{}: 0x18c-0x191.7 (6) -0x180| 00 00 00 00| ....| ip_blkid: 0 0x18c-0x18f.7 (4) -0x190|45 00 |E. | ip_posid: 69 0x190-0x191.7 (2) -0x190| 04 80 | .. | t_infomask2: 32772 0x192-0x193.7 (2) - | | | Infomask2{}: 0x192-0x193.7 (2) -0x190| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x192-0x193.7 (2) -0x190| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x192-0x193.7 (2) -0x190| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x192-0x193.7 (2) -0x190| 02 28 | .( | t_infomask: 10242 0x194-0x195.7 (2) - | | | Infomask{}: 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_HASNULL: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_HASVARWIDTH: 1 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_HASEXTERNAL: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_HASOID_OLD: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_KEYSHR_LOCK: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_COMBOCID: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_EXCL_LOCK: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_LOCK_ONLY: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_SHR_LOCK: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_LOCK_MASK: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMIN_COMMITTED: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMIN_INVALID: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMIN_FROZEN: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_COMMITTED: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_INVALID: 1 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_IS_MULTI: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_UPDATED: 1 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_MOVED_OFF: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_MOVED_IN: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_MOVED: 0 0x194-0x195.7 (2) -0x190| 18 | . | t_hoff: 24 0x196-0x196.7 (1) -0x190| 00 | . | padding0: 0 0x197-0x197.7 (1) -0x190| 20 00 00 00 01 00 00 00| .......| t_bits: "20000000010000003efbffffab202020202020202020202..." (raw bits) 0x198-0x1f8.7 (97) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[60]{}: Tuple 0x180-0x1ff.7 (128) + | | | HeapTupleHeaderData{}: 0x180-0x197.7 (24) + | | | t_choice{}: 0x180-0x18b.7 (12) + | | | t_heap{}: 0x180-0x18b.7 (12) +0x180|e2 2f 00 00 |./.. | t_xmin: 12258 0x180-0x183.7 (4) +0x180| 00 00 00 00 | .... | t_xmax: 0 0x184-0x187.7 (4) + | | | t_field3{}: 0x188-0x18b.7 (4) +0x180| 00 00 00 00 | .... | t_cid: 0 0x188-0x18b.7 (4) +0x180| 00 00 00 00 | .... | t_xvac: 0 0x188-0x18b.7 (4) + | | | t_datum{}: 0x180-0x18b.7 (12) +0x180|e2 2f 00 00 |./.. | datum_len_: 12258 0x180-0x183.7 (4) +0x180| 00 00 00 00 | .... | datum_typmod: 0 0x184-0x187.7 (4) +0x180| 00 00 00 00 | .... | datum_typeid: 0 0x188-0x18b.7 (4) + | | | t_ctid{}: 0x18c-0x191.7 (6) +0x180| 00 00 00 00| ....| ip_blkid: 0 0x18c-0x18f.7 (4) +0x190|45 00 |E. | ip_posid: 69 0x190-0x191.7 (2) +0x190| 04 80 | .. | t_infomask2: 32772 0x192-0x193.7 (2) + | | | Infomask2{}: 0x192-0x193.7 (2) +0x190| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x192-0x193.7 (2) +0x190| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x192-0x193.7 (2) +0x190| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x192-0x193.7 (2) +0x190| 02 28 | .( | t_infomask: 10242 0x194-0x195.7 (2) + | | | Infomask{}: 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_HASNULL: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_HASVARWIDTH: 1 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_HASEXTERNAL: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_HASOID_OLD: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_KEYSHR_LOCK: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_COMBOCID: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_EXCL_LOCK: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_LOCK_ONLY: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_SHR_LOCK: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_LOCK_MASK: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMIN_COMMITTED: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMIN_INVALID: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMIN_FROZEN: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_COMMITTED: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_INVALID: 1 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_XMAX_IS_MULTI: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_UPDATED: 1 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_MOVED_OFF: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_MOVED_IN: 0 0x194-0x195.7 (2) +0x190| 02 28 | .( | HEAP_MOVED: 0 0x194-0x195.7 (2) +0x190| 18 | . | t_hoff: 24 0x196-0x196.7 (1) +0x190| 00 | . | padding0: 0 0x197-0x197.7 (1) +0x190| 20 00 00 00 01 00 00 00| .......| Data: "20000000010000003efbffffab202020202020202020202..." (raw bits) 0x198-0x1f8.7 (97) 0x1a0|3e fb ff ff ab 20 20 20 20 20 20 20 20 20 20 20|>.... | * |until 0x1f8.7 (97) | | 0x1f0| 00 00 00 00 00 00 00| .......| padding1: "00000000000000" (raw bits) 0x1f9-0x1ff.7 (7) diff --git a/format/postgres/testdata/flavours/postgres13/16407_2.fqtest b/format/postgres/testdata/flavours/postgres13/16407_2.fqtest index e4a51b08a..7773d635c 100644 --- a/format/postgres/testdata/flavours/postgres13/16407_2.fqtest +++ b/format/postgres/testdata/flavours/postgres13/16407_2.fqtest @@ -1,93 +1,95 @@ $ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | dv" 16407 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1fd0-0x1fff.7 (48) - | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) - | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|fd 01 00 00 |.... | t_xmin: 509 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) - | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) -0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) - | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) -0x1fd0|fd 01 00 00 |.... | datum_len_: 509 0x1fd0-0x1fd3.7 (4) -0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) -0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) - | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) -0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) -0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) -0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) -0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 06 00 00 00 01 00 00 00| ........| t_bits: "060000000100000091220000141000008f939dc26888020..." (raw bits) 0x1fe8-0x1fff.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) + | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|fd 01 00 00 |.... | t_xmin: 509 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|fd 01 00 00 |.... | datum_len_: 509 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) +0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) + | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 06 00 00 00 01 00 00 00| ........| Data: "060000000100000091220000141000008f939dc26888020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|91 22 00 00 14 10 00 00 8f 93 9d c2 68 88 02 00|."..........h...| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: HeapTupleHeaderData 0x290-0x2bf.7 (48) - | | | t_choice{}: 0x290-0x29b.7 (12) - | | | t_heap{}: 0x290-0x29b.7 (12) -0x290|99 02 00 00 |.... | t_xmin: 665 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) - | | | t_field3{}: 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) -0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) - | | | t_datum{}: 0x290-0x29b.7 (12) -0x290|99 02 00 00 |.... | datum_len_: 665 0x290-0x293.7 (4) -0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) -0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) - | | | t_ctid{}: 0x29c-0x2a1.7 (6) -0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) -0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) -0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) -0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) -0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 09 00 00 00 01 00 00 00| ........| t_bits: "0900000001000000ce39000086130000159eb7c26888020..." (raw bits) 0x2a8-0x2bf.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) + | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|99 02 00 00 |.... | t_xmin: 665 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|99 02 00 00 |.... | datum_len_: 665 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | Infomask2{}: 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) +0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) +0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) + | | | Infomask{}: 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) +0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 09 00 00 00 01 00 00 00| ........| Data: "0900000001000000ce39000086130000159eb7c26888020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|ce 39 00 00 86 13 00 00 15 9e b7 c2 68 88 02 00|.9..........h...| diff --git a/format/postgres/testdata/flavours/postgres14/33233_2.fqtest b/format/postgres/testdata/flavours/postgres14/33233_2.fqtest index 217bc9ed2..744e4759b 100644 --- a/format/postgres/testdata/flavours/postgres14/33233_2.fqtest +++ b/format/postgres/testdata/flavours/postgres14/33233_2.fqtest @@ -1,97 +1,99 @@ $ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0,-1] | dv" 33233 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: HeapTupleHeaderData 0x1f80-0x1fff.7 (128) - | | | t_choice{}: 0x1f80-0x1f8b.7 (12) - | | | t_heap{}: 0x1f80-0x1f8b.7 (12) -0x1f80|86 10 18 00 |.... | t_xmin: 1577094 0x1f80-0x1f83.7 (4) -0x1f80| 00 00 00 00 | .... | t_xmax: 0 0x1f84-0x1f87.7 (4) - | | | t_field3{}: 0x1f88-0x1f8b.7 (4) -0x1f80| 0f 00 00 00 | .... | t_cid: 15 0x1f88-0x1f8b.7 (4) -0x1f80| 0f 00 00 00 | .... | t_xvac: 15 0x1f88-0x1f8b.7 (4) - | | | t_datum{}: 0x1f80-0x1f8b.7 (12) -0x1f80|86 10 18 00 |.... | datum_len_: 1577094 0x1f80-0x1f83.7 (4) -0x1f80| 00 00 00 00 | .... | datum_typmod: 0 0x1f84-0x1f87.7 (4) -0x1f80| 0f 00 00 00 | .... | datum_typeid: 15 0x1f88-0x1f8b.7 (4) - | | | t_ctid{}: 0x1f8c-0x1f91.7 (6) -0x1f80| 00 00 00 00| ....| ip_blkid: 0 0x1f8c-0x1f8f.7 (4) -0x1f90|15 00 |.. | ip_posid: 21 0x1f90-0x1f91.7 (2) -0x1f90| 04 00 | .. | t_infomask2: 4 0x1f92-0x1f93.7 (2) - | | | Infomask2{}: 0x1f92-0x1f93.7 (2) -0x1f90| 04 00 | .. | HEAP_KEYS_UPDATED: 0 0x1f92-0x1f93.7 (2) -0x1f90| 04 00 | .. | HEAP_HOT_UPDATED: 0 0x1f92-0x1f93.7 (2) -0x1f90| 04 00 | .. | HEAP_ONLY_TUPLE: 0 0x1f92-0x1f93.7 (2) -0x1f90| 02 09 | .. | t_infomask: 2306 0x1f94-0x1f95.7 (2) - | | | Infomask{}: 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASNULL: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASVARWIDTH: 1 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASEXTERNAL: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASOID_OLD: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_COMBOCID: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_LOCK_MASK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMIN_INVALID: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMIN_FROZEN: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_INVALID: 1 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_UPDATED: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_MOVED_OFF: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_MOVED_IN: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_MOVED: 0 0x1f94-0x1f95.7 (2) -0x1f90| 18 | . | t_hoff: 24 0x1f96-0x1f96.7 (1) -0x1f90| 00 | . | padding0: 0 0x1f97-0x1f97.7 (1) -0x1f90| 15 00 00 00 01 00 00 00| ........| t_bits: "150000000100000000000000ab202020202020202020202..." (raw bits) 0x1f98-0x1ff8.7 (97) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1f80-0x1fff.7 (128) + | | | HeapTupleHeaderData{}: 0x1f80-0x1f97.7 (24) + | | | t_choice{}: 0x1f80-0x1f8b.7 (12) + | | | t_heap{}: 0x1f80-0x1f8b.7 (12) +0x1f80|86 10 18 00 |.... | t_xmin: 1577094 0x1f80-0x1f83.7 (4) +0x1f80| 00 00 00 00 | .... | t_xmax: 0 0x1f84-0x1f87.7 (4) + | | | t_field3{}: 0x1f88-0x1f8b.7 (4) +0x1f80| 0f 00 00 00 | .... | t_cid: 15 0x1f88-0x1f8b.7 (4) +0x1f80| 0f 00 00 00 | .... | t_xvac: 15 0x1f88-0x1f8b.7 (4) + | | | t_datum{}: 0x1f80-0x1f8b.7 (12) +0x1f80|86 10 18 00 |.... | datum_len_: 1577094 0x1f80-0x1f83.7 (4) +0x1f80| 00 00 00 00 | .... | datum_typmod: 0 0x1f84-0x1f87.7 (4) +0x1f80| 0f 00 00 00 | .... | datum_typeid: 15 0x1f88-0x1f8b.7 (4) + | | | t_ctid{}: 0x1f8c-0x1f91.7 (6) +0x1f80| 00 00 00 00| ....| ip_blkid: 0 0x1f8c-0x1f8f.7 (4) +0x1f90|15 00 |.. | ip_posid: 21 0x1f90-0x1f91.7 (2) +0x1f90| 04 00 | .. | t_infomask2: 4 0x1f92-0x1f93.7 (2) + | | | Infomask2{}: 0x1f92-0x1f93.7 (2) +0x1f90| 04 00 | .. | HEAP_KEYS_UPDATED: 0 0x1f92-0x1f93.7 (2) +0x1f90| 04 00 | .. | HEAP_HOT_UPDATED: 0 0x1f92-0x1f93.7 (2) +0x1f90| 04 00 | .. | HEAP_ONLY_TUPLE: 0 0x1f92-0x1f93.7 (2) +0x1f90| 02 09 | .. | t_infomask: 2306 0x1f94-0x1f95.7 (2) + | | | Infomask{}: 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASNULL: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASVARWIDTH: 1 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASEXTERNAL: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_HASOID_OLD: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_COMBOCID: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_LOCK_MASK: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMIN_INVALID: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMIN_FROZEN: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_INVALID: 1 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_UPDATED: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_MOVED_OFF: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_MOVED_IN: 0 0x1f94-0x1f95.7 (2) +0x1f90| 02 09 | .. | HEAP_MOVED: 0 0x1f94-0x1f95.7 (2) +0x1f90| 18 | . | t_hoff: 24 0x1f96-0x1f96.7 (1) +0x1f90| 00 | . | padding0: 0 0x1f97-0x1f97.7 (1) +0x1f90| 15 00 00 00 01 00 00 00| ........| Data: "150000000100000000000000ab202020202020202020202..." (raw bits) 0x1f98-0x1ff8.7 (97) 0x1fa0|00 00 00 00 ab 20 20 20 20 20 20 20 20 20 20 20|..... | * |until 0x1ff8.7 (97) | | 0x1ff0| 00 00 00 00 00 00 00| .......| padding1: "00000000000000" (raw bits) 0x1ff9-0x1fff.7 (7) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[58]{}: HeapTupleHeaderData 0x280-0x2ff.7 (128) - | | | t_choice{}: 0x280-0x28b.7 (12) - | | | t_heap{}: 0x280-0x28b.7 (12) -0x280|96 58 1c 00 |.X.. | t_xmin: 1857686 0x280-0x283.7 (4) -0x280| 00 00 00 00 | .... | t_xmax: 0 0x284-0x287.7 (4) - | | | t_field3{}: 0x288-0x28b.7 (4) -0x280| 00 00 00 00 | .... | t_cid: 0 0x288-0x28b.7 (4) -0x280| 00 00 00 00 | .... | t_xvac: 0 0x288-0x28b.7 (4) - | | | t_datum{}: 0x280-0x28b.7 (12) -0x280|96 58 1c 00 |.X.. | datum_len_: 1857686 0x280-0x283.7 (4) -0x280| 00 00 00 00 | .... | datum_typmod: 0 0x284-0x287.7 (4) -0x280| 00 00 00 00 | .... | datum_typeid: 0 0x288-0x28b.7 (4) - | | | t_ctid{}: 0x28c-0x291.7 (6) -0x280| 00 00 00 00| ....| ip_blkid: 0 0x28c-0x28f.7 (4) -0x290|78 00 |x. | ip_posid: 120 0x290-0x291.7 (2) -0x290| 04 80 | .. | t_infomask2: 32772 0x292-0x293.7 (2) - | | | Infomask2{}: 0x292-0x293.7 (2) -0x290| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x292-0x293.7 (2) -0x290| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x292-0x293.7 (2) -0x290| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x292-0x293.7 (2) -0x290| 02 29 | .) | t_infomask: 10498 0x294-0x295.7 (2) - | | | Infomask{}: 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_HASNULL: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_HASVARWIDTH: 1 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_HASEXTERNAL: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_HASOID_OLD: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_KEYSHR_LOCK: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_COMBOCID: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_EXCL_LOCK: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_LOCK_ONLY: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_SHR_LOCK: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_LOCK_MASK: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMIN_COMMITTED: 1 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMIN_INVALID: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMIN_FROZEN: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_COMMITTED: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_INVALID: 1 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_IS_MULTI: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_UPDATED: 1 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_MOVED_OFF: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_MOVED_IN: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_MOVED: 0 0x294-0x295.7 (2) -0x290| 18 | . | t_hoff: 24 0x296-0x296.7 (1) -0x290| 00 | . | padding0: 0 0x297-0x297.7 (1) -0x290| 21 00 00 00 01 00 00 00| !.......| t_bits: "210000000100000053fdffffab202020202020202020202..." (raw bits) 0x298-0x2f8.7 (97) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[58]{}: Tuple 0x280-0x2ff.7 (128) + | | | HeapTupleHeaderData{}: 0x280-0x297.7 (24) + | | | t_choice{}: 0x280-0x28b.7 (12) + | | | t_heap{}: 0x280-0x28b.7 (12) +0x280|96 58 1c 00 |.X.. | t_xmin: 1857686 0x280-0x283.7 (4) +0x280| 00 00 00 00 | .... | t_xmax: 0 0x284-0x287.7 (4) + | | | t_field3{}: 0x288-0x28b.7 (4) +0x280| 00 00 00 00 | .... | t_cid: 0 0x288-0x28b.7 (4) +0x280| 00 00 00 00 | .... | t_xvac: 0 0x288-0x28b.7 (4) + | | | t_datum{}: 0x280-0x28b.7 (12) +0x280|96 58 1c 00 |.X.. | datum_len_: 1857686 0x280-0x283.7 (4) +0x280| 00 00 00 00 | .... | datum_typmod: 0 0x284-0x287.7 (4) +0x280| 00 00 00 00 | .... | datum_typeid: 0 0x288-0x28b.7 (4) + | | | t_ctid{}: 0x28c-0x291.7 (6) +0x280| 00 00 00 00| ....| ip_blkid: 0 0x28c-0x28f.7 (4) +0x290|78 00 |x. | ip_posid: 120 0x290-0x291.7 (2) +0x290| 04 80 | .. | t_infomask2: 32772 0x292-0x293.7 (2) + | | | Infomask2{}: 0x292-0x293.7 (2) +0x290| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x292-0x293.7 (2) +0x290| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x292-0x293.7 (2) +0x290| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x292-0x293.7 (2) +0x290| 02 29 | .) | t_infomask: 10498 0x294-0x295.7 (2) + | | | Infomask{}: 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_HASNULL: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_HASVARWIDTH: 1 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_HASEXTERNAL: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_HASOID_OLD: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_KEYSHR_LOCK: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_COMBOCID: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_EXCL_LOCK: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_LOCK_ONLY: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_SHR_LOCK: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_LOCK_MASK: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMIN_COMMITTED: 1 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMIN_INVALID: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMIN_FROZEN: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_COMMITTED: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_INVALID: 1 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_XMAX_IS_MULTI: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_UPDATED: 1 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_MOVED_OFF: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_MOVED_IN: 0 0x294-0x295.7 (2) +0x290| 02 29 | .) | HEAP_MOVED: 0 0x294-0x295.7 (2) +0x290| 18 | . | t_hoff: 24 0x296-0x296.7 (1) +0x290| 00 | . | padding0: 0 0x297-0x297.7 (1) +0x290| 21 00 00 00 01 00 00 00| !.......| Data: "210000000100000053fdffffab202020202020202020202..." (raw bits) 0x298-0x2f8.7 (97) 0x2a0|53 fd ff ff ab 20 20 20 20 20 20 20 20 20 20 20|S.... | * |until 0x2f8.7 (97) | | 0x2f0| 00 00 00 00 00 00 00| .......| padding1: "00000000000000" (raw bits) 0x2f9-0x2ff.7 (7) From ccf2edb526de482fc778bba2dc706ae1cf5c9a57 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 6 Sep 2022 09:20:10 +0300 Subject: [PATCH 052/141] postgres: better versions probing in pg_control, fix holes, better tests --- format/postgres/common/pg_control.go | 9 +- .../postgres/flavours/pgpro11/pg_control.go | 4 +- .../postgres/flavours/pgproee12/pg_control.go | 16 ++-- format/postgres/pg_control.go | 54 +++++++++--- .../flavours/pgpro11/pg_control.fqtest | 4 +- .../flavours/pgpro11/pg_control_1.fqtest | 68 +++++++++++++++ .../flavours/pgpro12/pg_control_1.fqtest | 68 +++++++++++++++ .../flavours/pgpro14/pg_control_1.fqtest | 67 +++++++++++++++ .../flavours/pgproee10/pg_control_1.fqtest | 73 ++++++++++++++++ .../flavours/pgproee11/pg_control_1.fqtest | 73 ++++++++++++++++ .../flavours/pgproee12/pg_control.fqtest | 86 ++++++++++++------- .../flavours/pgproee12/pg_control_1.fqtest | 73 ++++++++++++++++ .../flavours/pgproee14/pg_control_1.fqtest | 69 +++++++++++++++ 13 files changed, 609 insertions(+), 55 deletions(-) create mode 100644 format/postgres/testdata/flavours/pgpro11/pg_control_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro12/pg_control_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro14/pg_control_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee10/pg_control_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee11/pg_control_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee12/pg_control_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee14/pg_control_1.fqtest diff --git a/format/postgres/common/pg_control.go b/format/postgres/common/pg_control.go index aaf915d52..182d16684 100644 --- a/format/postgres/common/pg_control.go +++ b/format/postgres/common/pg_control.go @@ -107,8 +107,7 @@ type versionMapper struct{} func (m versionMapper) MapScalar(s scalar.S) (scalar.S, error) { v := s.ActualU() - v1 := uint32(v >> 16) - v2 := uint32(v & 0xffff) + v1, v2 := ParsePgProVersion(uint32(v)) switch v1 { case PG_UNKNOWN: s.Sym = fmt.Sprintf("%s %d", PG_UNKNOWN_STR, v2) @@ -124,6 +123,12 @@ func (m versionMapper) MapScalar(s scalar.S) (scalar.S, error) { var VersionMapper = versionMapper{} +func ParsePgProVersion(v uint32) (pgProVersion uint32, oriVer uint32) { + pgProVersion = v >> 16 + oriVer = v & 0xffff + return +} + type hexMapper struct{} func (m hexMapper) MapScalar(s scalar.S) (scalar.S, error) { diff --git a/format/postgres/flavours/pgpro11/pg_control.go b/format/postgres/flavours/pgpro11/pg_control.go index c8e2d03eb..eae1699fe 100644 --- a/format/postgres/flavours/pgpro11/pg_control.go +++ b/format/postgres/flavours/pgpro11/pg_control.go @@ -84,7 +84,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 16 | 4 */ // DBState state; /* XXX 4-byte hole */ d.FieldU64("system_identifier") - d.FieldU32("pg_control_version") + d.FieldU32("pg_control_version", common.VersionMapper) d.FieldU32("catalog_version_no") d.FieldU32("state", common.DBState) d.FieldU32("hole0") @@ -210,7 +210,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 284 | 4 */ // pg_crc32c crc d.FieldU32("data_checksum_version") d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) - d.FieldU32("icu_version") + d.FieldU32("icu_version", common.IcuVersionMapper) d.FieldU32("crc") /* total size (bytes): 288 */ diff --git a/format/postgres/flavours/pgproee12/pg_control.go b/format/postgres/flavours/pgproee12/pg_control.go index 7bc3e475d..79e48147e 100644 --- a/format/postgres/flavours/pgproee12/pg_control.go +++ b/format/postgres/flavours/pgproee12/pg_control.go @@ -116,7 +116,7 @@ func DecodePgControl(d *decode.D, in any) any { /* XXX 4-byte hole */ d.FieldU64("nextXid") d.FieldU32("nextOid") - d.FieldU32("hole1") + d.FieldU32("hole2") /* 40 | 8 */ // MultiXactId nextMulti; /* 48 | 8 */ // MultiXactOffset nextMultiOffset; @@ -127,14 +127,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("nextMultiOffset") d.FieldU64("oldestXid") d.FieldU32("oldestXidDB") - d.FieldU32("hole2") + d.FieldU32("hole3") /* 72 | 8 */ // MultiXactId oldestMulti; /* 80 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ d.FieldU64("oldestMulti") d.FieldU32("oldestMultiDB") - d.FieldU32("hole3") + d.FieldU32("hole4") /* 88 | 8 */ // pg_time_t time; /* 96 | 8 */ // TransactionId oldestCommitTsXid; @@ -153,7 +153,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("unloggedLSN", common.LocPtrMapper) d.FieldU64("minRecoveryPoint", common.LocPtrMapper) d.FieldU32("minRecoveryPointTLI") - d.FieldU32("hole4") + d.FieldU32("hole5") /* 184 | 8 */ // XLogRecPtr backupStartPoint; /* 192 | 8 */ // XLogRecPtr backupEndPoint; @@ -162,14 +162,14 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backupStartPoint", common.LocPtrMapper) d.FieldU64("backupEndPoint", common.LocPtrMapper) d.FieldU8("backupEndRequired") - d.FieldU24("hole5") + d.FieldU24("hole6") /* 204 | 4 */ // int wal_level; /* 208 | 1 */ // _Bool wal_log_hints; /* XXX 3-byte hole */ d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") - d.FieldU24("hole5") + d.FieldU24("hole7") /* 212 | 4 */ // int MaxConnections; /* 216 | 4 */ // int max_worker_processes; @@ -184,7 +184,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") d.FieldU8("track_commit_timestamp") - d.FieldU24("hole5") + d.FieldU24("hole8") /* 236 | 4 */ // uint32 maxAlign; /* 240 | 8 */ // double floatFormat; @@ -211,7 +211,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("loblksize") d.FieldU8("float4ByVal") d.FieldU8("float8ByVal") - d.FieldU16("hole6") + d.FieldU16("hole9") /* 284 | 4 */ // uint32 data_checksum_version; /* 288 | 32 */ // char mock_authentication_nonce[32]; diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index f10e13c8f..a41cef0ce 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -2,6 +2,7 @@ package postgres import ( "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/pgpro11" "github.com/wader/fq/format/postgres/flavours/pgpro12" "github.com/wader/fq/format/postgres/flavours/pgpro13" @@ -31,8 +32,10 @@ func init() { } const ( - PG_CONTROL_VERSION_11 = 1100 - PG_CONTROL_VERSION_12 = 1201 + PG_CONTROL_VERSION_10 = 1002 + PG_CONTROL_VERSION_11 = 1100 + PGPRO_CONTROL_VERSION_11 = 1200 + PG_CONTROL_VERSION_12 = 1201 //PG_CONTROL_VERSION_13 = 1300 PG_CONTROL_VERSION_14 = 1300 ) @@ -98,16 +101,43 @@ func probeForDecode(d *decode.D, in any) any { d.U64() pgControlVersion := d.U32() - // try to guess version - switch pgControlVersion { - case PG_CONTROL_VERSION_11: - return postgres11.DecodePgControl(d, in) - case PG_CONTROL_VERSION_12: - return postgres12.DecodePgControl(d, in) - case PG_CONTROL_VERSION_14: - return postgres14.DecodePgControl(d, in) - default: - d.Fatalf("unsupported PG_CONTROL_VERSION = %d\n", pgControlVersion) + pgProVersion, oriVersion := common.ParsePgProVersion(uint32(pgControlVersion)) + + if pgProVersion == common.PG_ORIGINAL { + switch oriVersion { + case PG_CONTROL_VERSION_11: + return postgres11.DecodePgControl(d, in) + case PG_CONTROL_VERSION_12: + return postgres12.DecodePgControl(d, in) + case PG_CONTROL_VERSION_14: + return postgres14.DecodePgControl(d, in) + } } + + if pgProVersion == common.PGPRO_STANDARD { + switch oriVersion { + case PG_CONTROL_VERSION_11: + return pgpro11.DecodePgControl(d, in) + case PG_CONTROL_VERSION_12: + return pgpro12.DecodePgControl(d, in) + case PG_CONTROL_VERSION_14: + return pgpro14.DecodePgControl(d, in) + } + } + + if pgProVersion == common.PGPRO_ENTERPRISE { + switch oriVersion { + case PG_CONTROL_VERSION_10: + return pgproee10.DecodePgControl(d, in) + case PGPRO_CONTROL_VERSION_11: + return pgproee11.DecodePgControl(d, in) + case PG_CONTROL_VERSION_12: + return pgproee12.DecodePgControl(d, in) + case PG_CONTROL_VERSION_14: + return pgproee14.DecodePgControl(d, in) + } + } + + d.Fatalf("unsupported PG_CONTROL_VERSION = %d\n", pgControlVersion) return nil } diff --git a/format/postgres/testdata/flavours/pgpro11/pg_control.fqtest b/format/postgres/testdata/flavours/pgpro11/pg_control.fqtest index bb237a335..09bbaefd4 100644 --- a/format/postgres/testdata/flavours/pgpro11/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/pg_control.fqtest @@ -1,7 +1,7 @@ $ fq -d pg_control -o flavour=pgpro11 dv pg_control |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) 0x0000|90 49 6c b5 6e a8 08 63 |.Il.n..c | system_identifier: 7136138803012192656 0x0-0x7.7 (8) -0x0000| 4c 04 50 50 | L.PP | pg_control_version: 1347421260 0x8-0xb.7 (4) +0x0000| 4c 04 50 50 | L.PP | pg_control_version: "Postgres Pro Standard 1100" (1347421260) 0x8-0xb.7 (4) 0x0000| 1d 5d 07 0c| .]..| catalog_version_no: 201809181 0xc-0xf.7 (4) 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) @@ -62,7 +62,7 @@ $ fq -d pg_control -o flavour=pgpro11 dv pg_control 0x00f0| f6 a2 53 c7 68 b8 81 35| ..S.h..5| mock_authentication_nonce: "f6a253c768b8813567e90b7670f403b446b7807d992f1c9..." (raw bits) 0xf8-0x117.7 (32) 0x0100|67 e9 0b 76 70 f4 03 b4 46 b7 80 7d 99 2f 1c 9b|g..vp...F..}./..| 0x0110|cb 85 91 74 a5 e6 75 51 |...t..uQ | -0x0110| 3c 03 00 00 | <... | icu_version: 828 0x118-0x11b.7 (4) +0x0110| 3c 03 00 00 | <... | icu_version: "60.3.0.0" (828) 0x118-0x11b.7 (4) 0x0110| b0 52 3e d2| .R>.| crc: 3527299760 0x11c-0x11f.7 (4) 0x0120|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| unused: raw bits 0x120-0x1fff.7 (7904) * |until 0x1fff.7 (end) (7904) | | diff --git a/format/postgres/testdata/flavours/pgpro11/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgpro11/pg_control_1.fqtest new file mode 100644 index 000000000..6af3f4f39 --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro11/pg_control_1.fqtest @@ -0,0 +1,68 @@ +$ fq -d pg_control dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|90 49 6c b5 6e a8 08 63 |.Il.n..c | system_identifier: 7136138803012192656 0x0-0x7.7 (8) +0x0000| 4c 04 50 50 | L.PP | pg_control_version: "Postgres Pro Standard 1100" (1347421260) 0x8-0xb.7 (4) +0x0000| 1d 5d 07 0c| .]..| catalog_version_no: 201809181 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 94 a9 08 63 00 00 00 00| ...c....| time: "Fri, 26 Aug 2022 11:08:04 UTC" (1661512084) 0x18-0x1f.7 (8) +0x0020|58 d8 f2 03 00 00 00 00 |X....... | checkPoint: "0/3F2D858" (66246744) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x77.7 (80) +0x0020| 20 d8 f2 03 00 00 00 00| .......| redo: "0/3F2D820" (66246688) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 | ... | hole1: 0 0x39-0x3b.7 (3) +0x0030| 00 00 00 00| ....| nextXidEpoch: 0 0x3c-0x3f.7 (4) +0x0040|0e 0e 00 00 |.... | nextXid: 3598 0x40-0x43.7 (4) +0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x44-0x47.7 (4) +0x0040| 01 00 00 00 | .... | nextMulti: 1 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| nextMultiOffset: 0 0x4c-0x4f.7 (4) +0x0050|34 02 00 00 |4... | oldestXid: 564 0x50-0x53.7 (4) +0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldestMulti: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldestMultiDB: 1 0x5c-0x5f.7 (4) +0x0060|94 a9 08 63 00 00 00 00 |...c.... | time: "Fri, 26 Aug 2022 11:08:04 UTC" (1661512084) 0x60-0x67.7 (8) +0x0060| 00 00 00 00 | .... | oldestCommitTsXid: 0 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| newestCommitTsXid: 0 0x6c-0x6f.7 (4) +0x0070|0e 0e 00 00 |.... | oldestActiveXid: 3598 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | padding1: 0 0x74-0x77.7 (4) +0x0070| 01 00 00 00 00 00 00 00| ........| unloggedLSN: "0/1" (1) 0x78-0x7f.7 (8) +0x0080|00 00 00 00 00 00 00 00 |........ | minRecoveryPoint: "0/0" (0) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 | .... | minRecoveryPointTLI: 0 0x88-0x8b.7 (4) +0x0080| 00 00 00 00| ....| hole2: 0 0x8c-0x8f.7 (4) +0x0090|00 00 00 00 00 00 00 00 |........ | backupStartPoint: "0/0" (0) 0x90-0x97.7 (8) +0x0090| 00 00 00 00 00 00 00 00| ........| backupEndPoint: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 |. | backupEndRequired: 0 0xa0-0xa0.7 (1) +0x00a0| 00 00 00 | ... | hole3: 0 0xa1-0xa3.7 (3) +0x00a0| 01 00 00 00 | .... | wal_level: "WAL_LEVEL_REPLICA" (1) 0xa4-0xa7.7 (4) +0x00a0| 00 | . | wal_log_hints: 0 0xa8-0xa8.7 (1) +0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) +0x00a0| c2 00 00 00| ....| MaxConnections: 194 0xac-0xaf.7 (4) +0x00b0|08 00 00 00 |.... | max_worker_processes: 8 0xb0-0xb3.7 (4) +0x00b0| 00 00 00 00 | .... | max_prepared_xacts: 0 0xb4-0xb7.7 (4) +0x00b0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xb8-0xbb.7 (4) +0x00b0| 00 | . | track_commit_timestamp: 0 0xbc-0xbc.7 (1) +0x00b0| 00 00 00| ...| hole5: 0 0xbd-0xbf.7 (3) +0x00c0|08 00 00 00 |.... | maxAlign: 8 0xc0-0xc3.7 (4) +0x00c0| 00 00 00 00 | .... | hole6: 0 0xc4-0xc7.7 (4) +0x00c0| 00 00 00 00 87 d6 32 41| ......2A| floatFormat: 1.234567e+06 0xc8-0xcf.7 (8) +0x00d0|00 20 00 00 |. .. | blcksz: 8192 0xd0-0xd3.7 (4) +0x00d0| 00 00 02 00 | .... | relseg_size: 131072 0xd4-0xd7.7 (4) +0x00d0| 00 20 00 00 | . .. | xlog_blcksz: 8192 0xd8-0xdb.7 (4) +0x00d0| 00 00 00 01| ....| xlog_seg_size: 16777216 0xdc-0xdf.7 (4) +0x00e0|40 00 00 00 |@... | nameDataLen: 64 0xe0-0xe3.7 (4) +0x00e0| 20 00 00 00 | ... | indexMaxKeys: 32 0xe4-0xe7.7 (4) +0x00e0| cc 07 00 00 | .... | toast_max_chunk_size: 1996 0xe8-0xeb.7 (4) +0x00e0| 00 08 00 00| ....| loblksize: 2048 0xec-0xef.7 (4) +0x00f0|01 |. | float4ByVal: 1 0xf0-0xf0.7 (1) +0x00f0| 01 | . | float8ByVal: 1 0xf1-0xf1.7 (1) +0x00f0| 00 00 | .. | hole7: 0 0xf2-0xf3.7 (2) +0x00f0| 01 00 00 00 | .... | data_checksum_version: 1 0xf4-0xf7.7 (4) +0x00f0| f6 a2 53 c7 68 b8 81 35| ..S.h..5| mock_authentication_nonce: "f6a253c768b8813567e90b7670f403b446b7807d992f1c9..." (raw bits) 0xf8-0x117.7 (32) +0x0100|67 e9 0b 76 70 f4 03 b4 46 b7 80 7d 99 2f 1c 9b|g..vp...F..}./..| +0x0110|cb 85 91 74 a5 e6 75 51 |...t..uQ | +0x0110| 3c 03 00 00 | <... | icu_version: "60.3.0.0" (828) 0x118-0x11b.7 (4) +0x0110| b0 52 3e d2| .R>.| crc: 3527299760 0x11c-0x11f.7 (4) +0x0120|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| unused: raw bits 0x120-0x1fff.7 (7904) +* |until 0x1fff.7 (end) (7904) | | diff --git a/format/postgres/testdata/flavours/pgpro12/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgpro12/pg_control_1.fqtest new file mode 100644 index 000000000..4bfe37785 --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro12/pg_control_1.fqtest @@ -0,0 +1,68 @@ +$ fq -d pg_control dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|86 c9 07 43 7d 7e 08 63 |...C}~.c | system_identifier: 7136092686029146502 0x0-0x7.7 (8) +0x0000| b1 04 50 50 | ..PP | pg_control_version: "Postgres Pro Standard 1201" (1347421361) 0x8-0xb.7 (4) +0x0000| 97 eb 08 0c| ....| catalog_version_no: 201911191 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| b0 81 08 63 00 00 00 00| ...c....| time: "Fri, 26 Aug 2022 08:17:52 UTC" (1661501872) 0x18-0x1f.7 (8) +0x0020|90 5d 59 09 00 00 00 00 |.]Y..... | checkPoint: "0/9595D90" (156851600) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020| 58 5d 59 09 00 00 00 00| X]Y.....| redo: "0/9595D58" (156851544) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|5d 0f 00 00 00 00 00 00 |]....... | nextFullXid: 3933 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) +0x0050| e0 01 00 00 | .... | oldestXid: 480 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) +0x0060| ad 81 08 63 00 00 00 00| ...c....| time: "Fri, 26 Aug 2022 08:17:49 UTC" (1661501869) 0x68-0x6f.7 (8) +0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) +0x0070| 5d 0f 00 00 | ]... | oldestActiveXid: 3933 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) +0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) +0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) +0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) +0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) +0x00b0| c2 00 00 00 | .... | MaxConnections: 194 0xb4-0xb7.7 (4) +0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) +0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) +0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) +0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) +0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) +0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) +0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) +0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) +0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) +0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) +0x00f0| 01 | . | float4ByVal: 1 0xf8-0xf8.7 (1) +0x00f0| 01 | . | float8ByVal: 1 0xf9-0xf9.7 (1) +0x00f0| 00 00 | .. | hole7: 0 0xfa-0xfb.7 (2) +0x00f0| 01 00 00 00| ....| data_checksum_version: 1 0xfc-0xff.7 (4) +0x0100|ee 89 1b 8b f8 aa 7f f5 9a d9 10 da e0 68 9b 40|.............h.@| mock_authentication_nonce: "ee891b8bf8aa7ff59ad910dae0689b40dd36952da495341..." (raw bits) 0x100-0x11f.7 (32) +0x0110|dd 36 95 2d a4 95 34 14 72 f7 7d c0 2c 04 6e 19|.6.-..4.r.}.,.n.| +0x0120|3c 03 00 00 |<... | icu_version: "60.3.0.0" (828) 0x120-0x123.7 (4) +0x0120| 47 73 b3 44 | Gs.D | crc: 1152611143 0x124-0x127.7 (4) +0x0120| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x128-0x1fff.7 (7896) +0x0130|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7896) | | diff --git a/format/postgres/testdata/flavours/pgpro14/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgpro14/pg_control_1.fqtest new file mode 100644 index 000000000..770afe3de --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro14/pg_control_1.fqtest @@ -0,0 +1,67 @@ +$ fq -d pg_control dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|93 99 98 16 b2 a9 ec 62 |.......b | system_identifier: 7128258892569024915 0x0-0x7.7 (8) +0x0000| 14 05 50 50 | ..PP | pg_control_version: "Postgres Pro Standard 1300" (1347421460) 0x8-0xb.7 (4) +0x0000| 59 f4 0b 0c| Y...| catalog_version_no: 202110041 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 7b ac ec 62 00 00 00 00| {..b....| time: "Fri, 05 Aug 2022 05:36:59 UTC" (1659677819) 0x18-0x1f.7 (8) +0x0020|58 b8 d5 02 00 00 00 00 |X....... | checkPoint: "0/2D5B858" (47560792) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020| 20 b8 d5 02 00 00 00 00| .......| redo: "0/2D5B820" (47560736) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|24 45 00 00 00 00 00 00 |$E...... | nextXid: 17700 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) +0x0050| dd 02 00 00 | .... | oldestXid: 733 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) +0x0060| 7b ac ec 62 00 00 00 00| {..b....| time: "Fri, 05 Aug 2022 05:36:59 UTC" (1659677819) 0x68-0x6f.7 (8) +0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) +0x0070| 24 45 00 00 | $E.. | oldestActiveXid: 17700 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) +0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) +0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) +0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) +0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) +0x00b0| c2 00 00 00 | .... | MaxConnections: 194 0xb4-0xb7.7 (4) +0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) +0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) +0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) +0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) +0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) +0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) +0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) +0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) +0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) +0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) +0x00f0| 01 | . | float8ByVal: 1 0xf8-0xf8.7 (1) +0x00f0| 00 00 00 | ... | hole7: 0 0xf9-0xfb.7 (3) +0x00f0| 01 00 00 00| ....| data_checksum_version: 1 0xfc-0xff.7 (4) +0x0100|fe e1 b1 f5 c4 52 ba e6 c9 ac dc ce 6c ed 4a cd|.....R......l.J.| mock_authentication_nonce: "fee1b1f5c452bae6c9acdcce6ced4acd5ee657c0f6e4c7a..." (raw bits) 0x100-0x11f.7 (32) +0x0110|5e e6 57 c0 f6 e4 c7 a5 b0 e0 95 3f 1d e7 b2 5e|^.W........?...^| +0x0120|3c 03 00 00 |<... | icu_version: "60.3.0.0" (828) 0x120-0x123.7 (4) +0x0120| 95 77 34 f0 | .w4. | crc: 4029970325 0x124-0x127.7 (4) +0x0120| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x128-0x1fff.7 (7896) +0x0130|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7896) | | diff --git a/format/postgres/testdata/flavours/pgproee10/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgproee10/pg_control_1.fqtest new file mode 100644 index 000000000..d8893c2ed --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee10/pg_control_1.fqtest @@ -0,0 +1,73 @@ +$ fq -d pg_control dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|5d f9 43 10 53 e5 ec 62 |].C.S..b | system_identifier: 7128324455138589021 0x0-0x7.7 (8) +0x0000| ea 03 45 50 | ..EP | pg_control_version: "Postgres Pro Enterprise 1002" (1346700266) 0x8-0xb.7 (4) +0x0000| ec d6 05 0c| ....| catalog_version_no: 201709292 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 27 e8 ec 62 00 00 00 00| '..b....| time: "Fri, 05 Aug 2022 09:51:35 UTC" (1659693095) 0x18-0x1f.7 (8) +0x0020|58 27 fc 02 00 00 00 00 |X'...... | checkPoint: "0/2FC2758" (50079576) 0x20-0x27.7 (8) +0x0020| 68 26 fc 02 00 00 00 00| h&......| prevCheckPoint: "0/2FC2668" (50079336) 0x28-0x2f.7 (8) + | | | checkPointCopy{}: 0x30-0xa7.7 (120) +0x0030|08 27 fc 02 00 00 00 00 |.'...... | redo: "0/2FC2708" (50079496) 0x30-0x37.7 (8) +0x0030| 01 00 00 00 | .... | ThisTimeLineID: 1 0x38-0x3b.7 (4) +0x0030| 01 00 00 00| ....| PrevTimeLineID: 1 0x3c-0x3f.7 (4) +0x0040|01 |. | fullPageWrites: 1 0x40-0x40.7 (1) +0x0040| 00 00 00 00 00 00 00 | ....... | hole1: 0 0x41-0x47.7 (7) +0x0040| 56 34 0c 54 02 00 00 00| V4.T....| nextXid: 10000020566 0x48-0x4f.7 (8) +0x0050|00 60 00 00 |.`.. | nextOid: 24576 0x50-0x53.7 (4) +0x0050| 00 00 00 00 | .... | hole2: 0 0x54-0x57.7 (4) +0x0050| 00 f2 05 2a 01 00 00 00| ...*....| nextMulti: 5000000000 0x58-0x5f.7 (8) +0x0060|00 00 00 00 00 00 00 00 |........ | nextMultiOffset: 0 0x60-0x67.7 (8) +0x0060| 23 e6 0b 54 02 00 00 00| #..T....| oldestXid: 10000000547 0x68-0x6f.7 (8) +0x0070|01 00 00 00 |.... | oldestXidDB: 1 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | hole3: 0 0x74-0x77.7 (4) +0x0070| 00 f2 05 2a 01 00 00 00| ...*....| oldestMulti: 5000000000 0x78-0x7f.7 (8) +0x0080|01 00 00 00 |.... | oldestMultiDB: 1 0x80-0x83.7 (4) +0x0080| 00 00 00 00 | .... | hole4: 0 0x84-0x87.7 (4) +0x0080| 27 e8 ec 62 00 00 00 00| '..b....| time: "Fri, 05 Aug 2022 09:51:35 UTC" (1659693095) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | oldestCommitTsXid: 0 0x90-0x97.7 (8) +0x0090| 00 00 00 00 00 00 00 00| ........| newestCommitTsXid: 0 0x98-0x9f.7 (8) +0x00a0|56 34 0c 54 02 00 00 00 |V4.T.... | oldestActiveXid: 10000020566 0xa0-0xa7.7 (8) +0x00a0| 01 00 00 00 00 00 00 00| ........| unloggedLSN: "0/1" (1) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 00 00 00 00 |........ | minRecoveryPoint: "0/0" (0) 0xb0-0xb7.7 (8) +0x00b0| 00 00 00 00 | .... | minRecoveryPointTLI: 0 0xb8-0xbb.7 (4) +0x00b0| 00 00 00 00| ....| hole5: 0 0xbc-0xbf.7 (4) +0x00c0|00 00 00 00 00 00 00 00 |........ | backupStartPoint: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 00 00 00 00 00 00 00| ........| backupEndPoint: "0/0" (0) 0xc8-0xcf.7 (8) +0x00d0|00 |. | backupEndRequired: 0 0xd0-0xd0.7 (1) +0x00d0| 00 00 00 | ... | hole6: 0 0xd1-0xd3.7 (3) +0x00d0| 01 00 00 00 | .... | wal_level: "WAL_LEVEL_REPLICA" (1) 0xd4-0xd7.7 (4) +0x00d0| 00 | . | wal_log_hints: 0 0xd8-0xd8.7 (1) +0x00d0| 00 00 00 | ... | hole7: 0 0xd9-0xdb.7 (3) +0x00d0| 5d 00 00 00| ]...| MaxConnections: 93 0xdc-0xdf.7 (4) +0x00e0|08 00 00 00 |.... | max_worker_processes: 8 0xe0-0xe3.7 (4) +0x00e0| 00 00 00 00 | .... | max_prepared_xacts: 0 0xe4-0xe7.7 (4) +0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe8-0xeb.7 (4) +0x00e0| 00 | . | track_commit_timestamp: 0 0xec-0xec.7 (1) +0x00e0| 00 00 00| ...| hole8: 0 0xed-0xef.7 (3) +0x00f0|08 00 00 00 |.... | maxAlign: 8 0xf0-0xf3.7 (4) +0x00f0| 00 00 00 00 | .... | hole9: 0 0xf4-0xf7.7 (4) +0x00f0| 00 00 00 00 87 d6 32 41| ......2A| floatFormat: 1.234567e+06 0xf8-0xff.7 (8) +0x0100|00 20 00 00 |. .. | blcksz: 8192 0x100-0x103.7 (4) +0x0100| 00 00 02 00 | .... | relseg_size: 131072 0x104-0x107.7 (4) +0x0100| 00 20 00 00 | . .. | xlog_blcksz: 8192 0x108-0x10b.7 (4) +0x0100| 00 00 00 01| ....| xlog_seg_size: 16777216 0x10c-0x10f.7 (4) +0x0110|40 00 00 00 |@... | nameDataLen: 64 0x110-0x113.7 (4) +0x0110| 20 00 00 00 | ... | indexMaxKeys: 32 0x114-0x117.7 (4) +0x0110| cc 07 00 00 | .... | toast_max_chunk_size: 1996 0x118-0x11b.7 (4) +0x0110| 00 08 00 00| ....| loblksize: 2048 0x11c-0x11f.7 (4) +0x0120|01 |. | float4ByVal: 1 0x120-0x120.7 (1) +0x0120| 01 | . | float8ByVal: 1 0x121-0x121.7 (1) +0x0120| 00 00 | .. | hole10: 0 0x122-0x123.7 (2) +0x0120| 01 00 00 00 | .... | data_checksum_version: 1 0x124-0x127.7 (4) +0x0120| 39 2f 4a cd c5 9d 4d 3b| 9/J...M;| mock_authentication_nonce: "392f4acdc59d4d3b2c9968b782191526dbfa9ba84acd37d..." (raw bits) 0x128-0x147.7 (32) +0x0130|2c 99 68 b7 82 19 15 26 db fa 9b a8 4a cd 37 dc|,.h....&....J.7.| +0x0140|4f 6f 86 e9 6a ca f1 45 |Oo..j..E | +0x0140| 3c 03 00 00 | <... | icu_version: "60.3.0.0" (828) 0x148-0x14b.7 (4) +0x0140| 00 00 ff ff| ....| pg_old_version: 4294901760 0x14c-0x14f.7 (4) +0x0150|f6 54 89 ec |.T.. | crc: 3968423158 0x150-0x153.7 (4) +0x0150| 00 00 00 00 | .... | hole11: 0 0x154-0x157.7 (4) +0x0150| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x158-0x1fff.7 (7848) +0x0160|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7848) | | diff --git a/format/postgres/testdata/flavours/pgproee11/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgproee11/pg_control_1.fqtest new file mode 100644 index 000000000..818efbc41 --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee11/pg_control_1.fqtest @@ -0,0 +1,73 @@ +$ fq -d pg_control dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|34 c9 ea 6a e6 00 bf 62 |4..j...b | system_identifier: 7115406925904922932 0x0-0x7.7 (8) +0x0000| b0 04 45 50 | ..EP | pg_control_version: "Postgres Pro Enterprise 1200" (1346700464) 0x8-0xb.7 (4) +0x0000| 1e 5d 07 0c| .]..| catalog_version_no: 201809182 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| d8 f9 e8 62 00 00 00 00| ...b....| time: "Tue, 02 Aug 2022 10:18:00 UTC" (1659435480) 0x18-0x1f.7 (8) +0x0020|88 3a 35 00 04 00 00 00 |.:5..... | checkPoint: "4/353A88" (17183357576) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x9f.7 (120) +0x0020| 40 56 52 c8 03 00 00 00| @VR.....| redo: "3/C8525640" (16245741120) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|02 4f f2 54 02 00 00 00 |.O.T.... | nextXid: 10015100674 0x40-0x47.7 (8) +0x0040| 00 80 01 00 | .... | nextOid: 98304 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) +0x0060|3b e6 0b 54 02 00 00 00 |;..T.... | oldestXid: 10000000571 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) +0x0080|ca f8 e8 62 00 00 00 00 |...b.... | time: "Tue, 02 Aug 2022 10:13:30 UTC" (1659435210) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) +0x0090| f8 4e f2 54 02 00 00 00| .N.T....| oldestActiveXid: 10015100664 0x98-0x9f.7 (8) +0x00a0|01 00 00 00 00 00 00 00 |........ | unloggedLSN: "0/1" (1) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) +0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) +0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) +0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) +0x00d0| 8b 01 00 00 | .... | MaxConnections: 395 0xd4-0xd7.7 (4) +0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) +0x00d0| 00 00 00 00| ....| max_prepared_xacts: 0 0xdc-0xdf.7 (4) +0x00e0|40 00 00 00 |@... | max_locks_per_xact: 64 0xe0-0xe3.7 (4) +0x00e0| 00 | . | track_commit_timestamp: 0 0xe4-0xe4.7 (1) +0x00e0| 00 00 00 | ... | hole8: 0 0xe5-0xe7.7 (3) +0x00e0| 08 00 00 00 | .... | maxAlign: 8 0xe8-0xeb.7 (4) +0x00e0| 00 00 00 00| ....| hole9: 0 0xec-0xef.7 (4) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) +0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) +0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) +0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) +0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) +0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) +0x0110| 01 | . | float4ByVal: 1 0x118-0x118.7 (1) +0x0110| 01 | . | float8ByVal: 1 0x119-0x119.7 (1) +0x0110| 00 00 | .. | hole10: 0 0x11a-0x11b.7 (2) +0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) +0x0120|4c 9a 5d 04 f1 83 24 46 3c 50 3e 7d 42 94 69 a7|L.]...$F

}B.i.| mock_authentication_nonce: "4c9a5d04f18324463c503e7d429469a70fe34aacd9f4cb2..." (raw bits) 0x120-0x13f.7 (32) +0x0130|0f e3 4a ac d9 f4 cb 2a 42 d2 2b 5e 7c f0 1c c9|..J....*B.+^|...| +0x0140|32 02 00 00 |2... | icu_version: "50.2.0.0" (562) 0x140-0x143.7 (4) +0x0140| 00 00 ff ff | .... | pg_old_version: 4294901760 0x144-0x147.7 (4) +0x0140| 01 00 00 00 | .... | oldest_snapshot: 1 0x148-0x14b.7 (4) +0x0140| 00 00 00 00| ....| recent_snapshot: 0 0x14c-0x14f.7 (4) +0x0150|00 00 00 00 |.... | active_snapshot: 0 0x150-0x153.7 (4) +0x0150| 5d a0 25 99 | ].%. | crc: 2569379933 0x154-0x157.7 (4) +0x0150| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x158-0x1fff.7 (7848) +0x0160|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7848) | | diff --git a/format/postgres/testdata/flavours/pgproee12/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee12/pg_control.fqtest index a3f252e6f..c9183b46a 100644 --- a/format/postgres/testdata/flavours/pgproee12/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/pg_control.fqtest @@ -1,30 +1,5 @@ $ fq -d pg_control -o flavour=pgproee12 dv pg_control |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) - | | | error: pg_control: error at position 0x50: "hole1" already exist in struct checkPointCopy - | | | github.com/wader/fq/pkg/decode.(*D).Fatalf - | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode.go:334 - | | | github.com/wader/fq/pkg/decode.(*D).AddChild - | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode.go:726 - | | | github.com/wader/fq/pkg/decode.(*D).TryFieldValue - | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode.go:1191 - | | | github.com/wader/fq/pkg/decode.(*D).TryFieldScalarFn - | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode.go:1206 - | | | github.com/wader/fq/pkg/decode.(*D).TryFieldScalarU32 - | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode_gen.go:2419 - | | | github.com/wader/fq/pkg/decode.(*D).FieldScalarU32 - | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode_gen.go:2432 - | | | github.com/wader/fq/pkg/decode.(*D).FieldU32 - | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode_gen.go:2447 - | | | github.com/wader/fq/format/postgres/flavours/pgproee12.DecodePgControl.func1 - | | | /home/pavel/work/tools/fq/fq/format/postgres/flavours/pgproee12/pg_control.go:119 - | | | github.com/wader/fq/pkg/decode.(*D).FieldStruct - | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode.go:774 - | | | github.com/wader/fq/format/postgres/flavours/pgproee12.DecodePgControl - | | | /home/pavel/work/tools/fq/fq/format/postgres/flavours/pgproee12/pg_control.go:102 - | | | github.com/wader/fq/format/postgres.decodePgControl - | | | /home/pavel/work/tools/fq/fq/format/postgres/pg_control.go:83 - | | | github.com/wader/fq/pkg/decode.decode.func1 - | | | /home/pavel/work/tools/fq/fq/pkg/decode/decode.go:88 0x0000|d8 09 ef 93 89 69 eb 62 |.....i.b | system_identifier: 7127906874857294296 0x0-0x7.7 (8) 0x0000| b1 04 45 50 | ..EP | pg_control_version: "Postgres Pro Enterprise 1201" (1346700465) 0x8-0xb.7 (4) 0x0000| a1 eb 08 0c| ....| catalog_version_no: 201911201 0xc-0xf.7 (4) @@ -32,7 +7,7 @@ $ fq -d pg_control -o flavour=pgproee12 dv pg_control 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| db 6a eb 62 00 00 00 00| .j.b....| time: "Thu, 04 Aug 2022 06:44:43 UTC" (1659595483) 0x18-0x1f.7 (8) 0x0020|b8 77 07 03 00 00 00 00 |.w...... | checkPoint: "0/30777B8" (50821048) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x4b.7 (36) + | | | checkPointCopy{}: 0x28-0x9f.7 (120) 0x0020| 68 77 07 03 00 00 00 00| hw......| redo: "0/3077768" (50820968) 0x28-0x2f.7 (8) 0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) 0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) @@ -40,6 +15,59 @@ $ fq -d pg_control -o flavour=pgproee12 dv pg_control 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) 0x0040|db 34 0c 54 02 00 00 00 |.4.T.... | nextXid: 10000020699 0x40-0x47.7 (8) 0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) -0x0040| 00 00 00 00| ....| unknown0: raw bits 0x4c-0x1fff.7 (8116) -0x0050|00 f2 05 2a 01 00 00 00 00 00 00 00 00 00 00 00|...*............| -* |until 0x1fff.7 (end) (8116) | | +0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) +0x0060|e9 e5 0b 54 02 00 00 00 |...T.... | oldestXid: 10000000489 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) +0x0080|db 6a eb 62 00 00 00 00 |.j.b.... | time: "Thu, 04 Aug 2022 06:44:43 UTC" (1659595483) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) +0x0090| db 34 0c 54 02 00 00 00| .4.T....| oldestActiveXid: 10000020699 0x98-0x9f.7 (8) +0x00a0|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) +0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) +0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) +0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) +0x00d0| 8a 01 00 00 | .... | MaxConnections: 394 0xd4-0xd7.7 (4) +0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) +0x00d0| 0a 00 00 00| ....| max_wal_senders: 10 0xdc-0xdf.7 (4) +0x00e0|00 00 00 00 |.... | max_prepared_xacts: 0 0xe0-0xe3.7 (4) +0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe4-0xe7.7 (4) +0x00e0| 00 | . | track_commit_timestamp: 0 0xe8-0xe8.7 (1) +0x00e0| 00 00 00 | ... | hole8: 0 0xe9-0xeb.7 (3) +0x00e0| 08 00 00 00| ....| maxAlign: 8 0xec-0xef.7 (4) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) +0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) +0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) +0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) +0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) +0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) +0x0110| 01 | . | float4ByVal: 1 0x118-0x118.7 (1) +0x0110| 01 | . | float8ByVal: 1 0x119-0x119.7 (1) +0x0110| 00 00 | .. | hole9: 0 0x11a-0x11b.7 (2) +0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) +0x0120|0b db 53 d2 42 ff 02 95 74 e6 aa 87 ff 98 4b 67|..S.B...t.....Kg| mock_authentication_nonce: "0bdb53d242ff029574e6aa87ff984b67e4a76678383559a..." (raw bits) 0x120-0x13f.7 (32) +0x0130|e4 a7 66 78 38 35 59 a3 14 f2 65 01 9e 61 8c e4|..fx85Y...e..a..| +0x0140|3c 03 00 00 |<... | icu_version: "60.3.0.0" (828) 0x140-0x143.7 (4) +0x0140| 00 00 ff ff | .... | pg_old_version: 4294901760 0x144-0x147.7 (4) +0x0140| 01 00 00 00 | .... | oldest_snapshot: 1 0x148-0x14b.7 (4) +0x0140| 00 00 00 00| ....| recent_snapshot: 0 0x14c-0x14f.7 (4) +0x0150|00 00 00 00 |.... | active_snapshot: 0 0x150-0x153.7 (4) +0x0150| f4 4f d7 dd | .O.. | crc: 3721875444 0x154-0x157.7 (4) +0x0150| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x158-0x1fff.7 (7848) +0x0160|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7848) | | diff --git a/format/postgres/testdata/flavours/pgproee12/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgproee12/pg_control_1.fqtest new file mode 100644 index 000000000..c09af7b37 --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee12/pg_control_1.fqtest @@ -0,0 +1,73 @@ +$ fq -d pg_control dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|d8 09 ef 93 89 69 eb 62 |.....i.b | system_identifier: 7127906874857294296 0x0-0x7.7 (8) +0x0000| b1 04 45 50 | ..EP | pg_control_version: "Postgres Pro Enterprise 1201" (1346700465) 0x8-0xb.7 (4) +0x0000| a1 eb 08 0c| ....| catalog_version_no: 201911201 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| db 6a eb 62 00 00 00 00| .j.b....| time: "Thu, 04 Aug 2022 06:44:43 UTC" (1659595483) 0x18-0x1f.7 (8) +0x0020|b8 77 07 03 00 00 00 00 |.w...... | checkPoint: "0/30777B8" (50821048) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x9f.7 (120) +0x0020| 68 77 07 03 00 00 00 00| hw......| redo: "0/3077768" (50820968) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|db 34 0c 54 02 00 00 00 |.4.T.... | nextXid: 10000020699 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) +0x0060|e9 e5 0b 54 02 00 00 00 |...T.... | oldestXid: 10000000489 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) +0x0080|db 6a eb 62 00 00 00 00 |.j.b.... | time: "Thu, 04 Aug 2022 06:44:43 UTC" (1659595483) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) +0x0090| db 34 0c 54 02 00 00 00| .4.T....| oldestActiveXid: 10000020699 0x98-0x9f.7 (8) +0x00a0|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) +0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) +0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) +0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) +0x00d0| 8a 01 00 00 | .... | MaxConnections: 394 0xd4-0xd7.7 (4) +0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) +0x00d0| 0a 00 00 00| ....| max_wal_senders: 10 0xdc-0xdf.7 (4) +0x00e0|00 00 00 00 |.... | max_prepared_xacts: 0 0xe0-0xe3.7 (4) +0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe4-0xe7.7 (4) +0x00e0| 00 | . | track_commit_timestamp: 0 0xe8-0xe8.7 (1) +0x00e0| 00 00 00 | ... | hole8: 0 0xe9-0xeb.7 (3) +0x00e0| 08 00 00 00| ....| maxAlign: 8 0xec-0xef.7 (4) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) +0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) +0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) +0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) +0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) +0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) +0x0110| 01 | . | float4ByVal: 1 0x118-0x118.7 (1) +0x0110| 01 | . | float8ByVal: 1 0x119-0x119.7 (1) +0x0110| 00 00 | .. | hole9: 0 0x11a-0x11b.7 (2) +0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) +0x0120|0b db 53 d2 42 ff 02 95 74 e6 aa 87 ff 98 4b 67|..S.B...t.....Kg| mock_authentication_nonce: "0bdb53d242ff029574e6aa87ff984b67e4a76678383559a..." (raw bits) 0x120-0x13f.7 (32) +0x0130|e4 a7 66 78 38 35 59 a3 14 f2 65 01 9e 61 8c e4|..fx85Y...e..a..| +0x0140|3c 03 00 00 |<... | icu_version: "60.3.0.0" (828) 0x140-0x143.7 (4) +0x0140| 00 00 ff ff | .... | pg_old_version: 4294901760 0x144-0x147.7 (4) +0x0140| 01 00 00 00 | .... | oldest_snapshot: 1 0x148-0x14b.7 (4) +0x0140| 00 00 00 00| ....| recent_snapshot: 0 0x14c-0x14f.7 (4) +0x0150|00 00 00 00 |.... | active_snapshot: 0 0x150-0x153.7 (4) +0x0150| f4 4f d7 dd | .O.. | crc: 3721875444 0x154-0x157.7 (4) +0x0150| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x158-0x1fff.7 (7848) +0x0160|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7848) | | diff --git a/format/postgres/testdata/flavours/pgproee14/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgproee14/pg_control_1.fqtest new file mode 100644 index 000000000..3189f4933 --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee14/pg_control_1.fqtest @@ -0,0 +1,69 @@ +$ fq -d pg_control dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|a8 63 95 9f 7f b7 ba 62 |.c.....b | system_identifier: 7114200320151217064 0x0-0x7.7 (8) +0x0000| 14 05 45 50 | ..EP | pg_control_version: "Postgres Pro Enterprise 1300" (1346700564) 0x8-0xb.7 (4) +0x0000| 97 5f 0d 0c| ._..| catalog_version_no: 202203031 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 90 74 c2 62 00 00 00 00| .t.b....| time: "Mon, 04 Jul 2022 05:03:12 UTC" (1656910992) 0x18-0x1f.7 (8) +0x0020|f8 01 a0 01 00 00 00 00 |........ | checkPoint: "0/1A001F8" (27263480) 0x20-0x27.7 (8) + | | | checkPointCopy{}: 0x28-0x9f.7 (120) +0x0020| a8 01 a0 01 00 00 00 00| ........| redo: "0/1A001A8" (27263400) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) +0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|f1 e6 0b 54 02 00 00 00 |...T.... | nextXid: 10000000753 0x40-0x47.7 (8) +0x0040| d3 35 00 00 | .5.. | nextOid: 13779 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) +0x0060|e8 e6 0b 54 02 00 00 00 |...T.... | oldestXid: 10000000744 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) +0x0080|90 74 c2 62 00 00 00 00 |.t.b.... | time: "Mon, 04 Jul 2022 05:03:12 UTC" (1656910992) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) +0x0090| f1 e6 0b 54 02 00 00 00| ...T....| oldestActiveXid: 10000000753 0x98-0x9f.7 (8) +0x00a0|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) +0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) +0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) +0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) +0x00d0| c6 00 00 00 | .... | MaxConnections: 198 0xd4-0xd7.7 (4) +0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) +0x00d0| 0a 00 00 00| ....| max_wal_senders: 10 0xdc-0xdf.7 (4) +0x00e0|00 00 00 00 |.... | max_prepared_xacts: 0 0xe0-0xe3.7 (4) +0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe4-0xe7.7 (4) +0x00e0| 00 | . | track_commit_timestamp: 0 0xe8-0xe8.7 (1) +0x00e0| 00 00 00 | ... | hole8: 0 0xe9-0xeb.7 (3) +0x00e0| 08 00 00 00| ....| maxAlign: 8 0xec-0xef.7 (4) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) +0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) +0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) +0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) +0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) +0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) +0x0110| 01 | . | float8ByVal: 1 0x118-0x118.7 (1) +0x0110| 00 00 00 | ... | hole9: 0 0x119-0x11b.7 (3) +0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) +0x0120|dd f2 b7 da 2f 4a 5c ac 5d ce e9 34 21 d6 a8 03|..../J\.]..4!...| mock_authentication_nonce: "ddf2b7da2f4a5cac5dcee93421d6a803d6a08dabff41769..." (raw bits) 0x120-0x13f.7 (32) +0x0130|d6 a0 8d ab ff 41 76 97 f5 d1 72 b0 db 8e 80 cb|.....Av...r.....| +0x0140|43 01 00 00 |C... | icu_version: "67.1.0.0" (323) 0x140-0x143.7 (4) +0x0140| 00 00 ff ff | .... | pg_old_version: 4294901760 0x144-0x147.7 (4) +0x0140| 73 33 90 20 | s3. | crc: 546321267 0x148-0x14b.7 (4) +0x0140| 00 00 00 00| ....| padding0: 0 0x14c-0x14f.7 (4) +0x0150|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| unused: raw bits 0x150-0x1fff.7 (7856) +* |until 0x1fff.7 (end) (7856) | | From 1e24d70e45c909a050cbb34f338b3bb3ad864755 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 6 Sep 2022 09:27:04 +0300 Subject: [PATCH 053/141] postgres: move SeekAbs(0) to Probe --- format/postgres/flavours/pgpro11/pg_control.go | 1 - format/postgres/flavours/pgpro12/pg_control.go | 1 - format/postgres/flavours/pgpro13/pg_control.go | 1 - format/postgres/flavours/pgpro14/pg_control.go | 1 - format/postgres/flavours/pgproee10/pg_control.go | 1 - format/postgres/flavours/pgproee11/pg_control.go | 1 - format/postgres/flavours/pgproee12/pg_control.go | 1 - format/postgres/flavours/pgproee13/pg_control.go | 1 - format/postgres/flavours/pgproee14/pg_control.go | 1 - format/postgres/flavours/postgres11/pg_control.go | 1 - format/postgres/flavours/postgres12/pg_control.go | 1 - format/postgres/flavours/postgres13/pg_control.go | 1 - format/postgres/flavours/postgres14/pg_control.go | 1 - format/postgres/pg_control.go | 1 + 14 files changed, 1 insertion(+), 13 deletions(-) diff --git a/format/postgres/flavours/pgpro11/pg_control.go b/format/postgres/flavours/pgpro11/pg_control.go index eae1699fe..d2e392e79 100644 --- a/format/postgres/flavours/pgpro11/pg_control.go +++ b/format/postgres/flavours/pgpro11/pg_control.go @@ -77,7 +77,6 @@ import ( /* total size (bytes): 80 */ func DecodePgControl(d *decode.D, in any) any { - d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgpro12/pg_control.go b/format/postgres/flavours/pgpro12/pg_control.go index b3d670fe1..b69b97a2f 100644 --- a/format/postgres/flavours/pgpro12/pg_control.go +++ b/format/postgres/flavours/pgpro12/pg_control.go @@ -77,7 +77,6 @@ import ( /* total size (bytes): 88 */ func DecodePgControl(d *decode.D, in any) any { - d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgpro13/pg_control.go b/format/postgres/flavours/pgpro13/pg_control.go index c92045a95..dcbd6c431 100644 --- a/format/postgres/flavours/pgpro13/pg_control.go +++ b/format/postgres/flavours/pgpro13/pg_control.go @@ -75,7 +75,6 @@ import ( /* total size (bytes): 88 */ func DecodePgControl(d *decode.D, in any) any { - d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgpro14/pg_control.go b/format/postgres/flavours/pgpro14/pg_control.go index 23f8c6852..d769609ce 100644 --- a/format/postgres/flavours/pgpro14/pg_control.go +++ b/format/postgres/flavours/pgpro14/pg_control.go @@ -75,7 +75,6 @@ import ( // /* total size (bytes): 88 */ func DecodePgControl(d *decode.D, in any) any { - d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgproee10/pg_control.go b/format/postgres/flavours/pgproee10/pg_control.go index 2c0dacc06..112902a54 100644 --- a/format/postgres/flavours/pgproee10/pg_control.go +++ b/format/postgres/flavours/pgproee10/pg_control.go @@ -81,7 +81,6 @@ import ( /* total size (bytes): 120 */ func DecodePgControl(d *decode.D, in any) any { - d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgproee11/pg_control.go b/format/postgres/flavours/pgproee11/pg_control.go index 406fdaebd..b366a79ed 100644 --- a/format/postgres/flavours/pgproee11/pg_control.go +++ b/format/postgres/flavours/pgproee11/pg_control.go @@ -82,7 +82,6 @@ import ( /* total size (bytes): 120 */ func DecodePgControl(d *decode.D, in any) any { - d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgproee12/pg_control.go b/format/postgres/flavours/pgproee12/pg_control.go index 79e48147e..a66ffe2fa 100644 --- a/format/postgres/flavours/pgproee12/pg_control.go +++ b/format/postgres/flavours/pgproee12/pg_control.go @@ -82,7 +82,6 @@ import ( /* total size (bytes): 120 */ func DecodePgControl(d *decode.D, in any) any { - d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgproee13/pg_control.go b/format/postgres/flavours/pgproee13/pg_control.go index 8df47998a..fd7ad20d8 100644 --- a/format/postgres/flavours/pgproee13/pg_control.go +++ b/format/postgres/flavours/pgproee13/pg_control.go @@ -79,7 +79,6 @@ import ( /* total size (bytes): 120 */ func DecodePgControl(d *decode.D, in any) any { - d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go index e0de09ad6..ebb25936a 100644 --- a/format/postgres/flavours/pgproee14/pg_control.go +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -79,7 +79,6 @@ import ( /* total size (bytes): 120 */ func DecodePgControl(d *decode.D, in any) any { - d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/postgres11/pg_control.go b/format/postgres/flavours/postgres11/pg_control.go index 991fecb5b..cd3a2e7e3 100644 --- a/format/postgres/flavours/postgres11/pg_control.go +++ b/format/postgres/flavours/postgres11/pg_control.go @@ -77,7 +77,6 @@ import ( /* total size (bytes): 80 */ // func DecodePgControl(d *decode.D, in any) any { - d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/postgres12/pg_control.go b/format/postgres/flavours/postgres12/pg_control.go index a53ee2b0c..d8e140955 100644 --- a/format/postgres/flavours/postgres12/pg_control.go +++ b/format/postgres/flavours/postgres12/pg_control.go @@ -76,7 +76,6 @@ import ( // /* total size (bytes): 88 */ func DecodePgControl(d *decode.D, in any) any { - d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/postgres13/pg_control.go b/format/postgres/flavours/postgres13/pg_control.go index c6ace39c3..d0e6f64c0 100644 --- a/format/postgres/flavours/postgres13/pg_control.go +++ b/format/postgres/flavours/postgres13/pg_control.go @@ -75,7 +75,6 @@ import ( // /* total size (bytes): 88 */ func DecodePgControl(d *decode.D, in any) any { - d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/postgres14/pg_control.go b/format/postgres/flavours/postgres14/pg_control.go index efd3411b3..d387e5493 100644 --- a/format/postgres/flavours/postgres14/pg_control.go +++ b/format/postgres/flavours/postgres14/pg_control.go @@ -75,7 +75,6 @@ import ( // /* total size (bytes): 88 */ func DecodePgControl(d *decode.D, in any) any { - d.SeekAbs(0) /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index a41cef0ce..0fbdc6f8e 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -100,6 +100,7 @@ func probeForDecode(d *decode.D, in any) any { /* 8 | 4 */ // uint32 pg_control_version; d.U64() pgControlVersion := d.U32() + d.SeekAbs(0) pgProVersion, oriVersion := common.ParsePgProVersion(uint32(pgControlVersion)) From 5eea605f1293a0fd92785dd86ea6cd95031c7102 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 6 Sep 2022 09:27:40 +0300 Subject: [PATCH 054/141] postgres: remove duplicate tests --- format/postgres/fqtest_test.go | 91 ---------------------------------- 1 file changed, 91 deletions(-) delete mode 100644 format/postgres/fqtest_test.go diff --git a/format/postgres/fqtest_test.go b/format/postgres/fqtest_test.go deleted file mode 100644 index 36b7dc105..000000000 --- a/format/postgres/fqtest_test.go +++ /dev/null @@ -1,91 +0,0 @@ -package postgres_test - -import ( - "context" - "github.com/wader/fq/internal/difftest" - "github.com/wader/fq/internal/script" - "os" - "strconv" - "testing" - - _ "github.com/wader/fq/format/all" - "github.com/wader/fq/pkg/interp" -) - -// get testdata dir from: -// git clone https://github.com/pnsafonov/testdata.git - -// 1 GB postgres heap file: -// https://github.com/pnsafonov/fq_testdata_postgres14/raw/master/16397 -// git clone https://github.com/pnsafonov/fq_testdata_postgres14.git -// -// time fq -d pgheap -o flavour=postgres14 ".Pages[0].PageHeaderData.pd_linp[0, 1, 2, -1] | tovalue" 16397 -// Killed -// -// real 0m50.794s -// user 1m11.962s -// sys 0m8.994s -// -// sudo dmesg | tail -2 -// [193541.830725] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=user.slice,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-1.scope,task=fq,pid=454783,uid=1000 -// [193541.830748] Out of memory: Killed process 454783 (fq) total-vm:31508780kB, anon-rss:26629332kB, file-rss:272kB, shmem-rss:0kB, UID:1000 pgtables:58860kB oom_score_adj:0 - -// to make mem, cpu profiling: -// go test -cpuprofile "cpu.prof" -memprofile "mem.prof" -bench . -// -// go tool pprof mem.prof -// top20 -// q -// -// go tool pprof cpu.prof -// top20 -// q - -// run only postgres tests -func TestFQTests(t *testing.T) { - testPath(t, interp.DefaultRegistry) -} - -func testPath(t *testing.T, registry *interp.Registry) { - difftest.TestWithOptions(t, difftest.Options{ - Path: "testdata", - Pattern: "*.fqtest", - ColorDiff: os.Getenv("DIFF_COLOR") != "", - WriteOutput: os.Getenv("WRITE_ACTUAL") != "", - Fn: func(t *testing.T, path, input string) (string, string, error) { - t.Parallel() - - b, err := os.ReadFile(path) - if err != nil { - t.Fatal(err) - } - c := script.ParseCases(string(b)) - c.Path = path - - for _, p := range c.Parts { - cr, ok := p.(*script.CaseRun) - if !ok { - continue - } - - t.Run(strconv.Itoa(cr.LineNr)+"/"+cr.Command, func(t *testing.T) { - cr.WasRun = true - - i, err := interp.New(cr, registry) - if err != nil { - t.Fatal(err) - } - - err = i.Main(context.Background(), cr.Stdout(), "testversion") - if err != nil { - if ex, ok := err.(interp.Exiter); ok { //nolint:errorlint - cr.ActualExitCode = ex.ExitCode() - } - } - }) - } - - return path, c.ToActual(), nil - }, - }) -} From ff4b6fdf141c579f4eddbcec0d6458fe0d872709 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 6 Sep 2022 10:19:52 +0300 Subject: [PATCH 055/141] postgres: refactoring - remove GetHeapD --- .../flavours/pgproee14/ee14/pgheap.go | 10 +-- .../flavours/postgres14/common14/pgheap.go | 73 +++++++++---------- 2 files changed, 38 insertions(+), 45 deletions(-) diff --git a/format/postgres/flavours/pgproee14/ee14/pgheap.go b/format/postgres/flavours/pgproee14/ee14/pgheap.go index 41571d374..8133d1e1e 100644 --- a/format/postgres/flavours/pgproee14/ee14/pgheap.go +++ b/format/postgres/flavours/pgproee14/ee14/pgheap.go @@ -15,8 +15,7 @@ import ( /* 16 | 2 */ // LocationIndex pd_special; /* 18 | 2 */ // uint16 pd_pagesize_version; /* 20 | 0 */ // ItemIdData pd_linp[]; -func DecodePageHeaderData(d *decode.D) { - heap := common14.GetHeapD(d) +func DecodePageHeaderData(heap *common14.HeapD, d *decode.D) { page := heap.Page d.FieldStruct("pd_lsn", func(d *decode.D) { @@ -34,7 +33,9 @@ func DecodePageHeaderData(d *decode.D) { // ItemIdData pd_linp[]; page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) - d.FieldArray("pd_linp", common14.DecodeItemIds) + d.FieldArray("pd_linp", func(d *decode.D) { + common14.DecodeItemIds(heap, d) + }) } // type = struct HeapPageSpecialData { @@ -44,8 +45,7 @@ func DecodePageHeaderData(d *decode.D) { /* 20 | 4 */ // uint32 pd_magic; // /* total size (bytes): 24 */ -func DecodePageSpecial(d *decode.D) { - heap := common14.GetHeapD(d) +func DecodePageSpecial(heap *common14.HeapD, d *decode.D) { page := heap.Page specialPos := int64(page.PagePosBegin*8) + int64(page.PdSpecial*8) diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index 79b9ee76b..d5e5a75c1 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -1,7 +1,6 @@ package common14 import ( - "context" "fmt" "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" @@ -122,8 +121,8 @@ type HeapD struct { // current tuple Tuple *TupleD - DecodePageHeaderDataFn func(d *decode.D) - DecodePageSpecialFn func(d *decode.D) + DecodePageHeaderDataFn func(heap *HeapD, d *decode.D) + DecodePageSpecialFn func(heap *HeapD, d *decode.D) } type HeapPageD struct { @@ -165,25 +164,14 @@ type itemIdDataD struct { lpLen uint32 } -func GetHeapD(d *decode.D) *HeapD { - val := d.Ctx.Value("heap") - return val.(*HeapD) -} - func DecodeHeap(d *decode.D, heap *HeapD) any { - parentCtx := d.Ctx - ctx := context.WithValue(parentCtx, "heap", heap) - d.Ctx = ctx - d.SeekAbs(0) - decodeHeapPages(d) + decodeHeapPages(heap, d) return nil } -func decodeHeapPages(d *decode.D) { - heap := GetHeapD(d) - +func decodeHeapPages(heap *HeapD, d *decode.D) { for { if end, _ := d.TryEnd(); end { return @@ -192,7 +180,9 @@ func decodeHeapPages(d *decode.D) { page := &HeapPageD{} heap.Page = page - d.FieldStruct("HeapPage", decodeHeapPage) + d.FieldStruct("HeapPage", func(d *decode.D) { + decodeHeapPage(heap, d) + }) // end of Page endLen := uint64(d.Pos() / 8) @@ -201,9 +191,7 @@ func decodeHeapPages(d *decode.D) { } } -func decodeHeapPage(d *decode.D) { - heap := GetHeapD(d) - +func decodeHeapPage(heap *HeapD, d *decode.D) { page := &HeapPageD{} heap.Page = page @@ -211,7 +199,9 @@ func decodeHeapPage(d *decode.D) { page.PagePosBegin = pagePosBegin // PageHeader - d.FieldStruct("PageHeaderData", heap.DecodePageHeaderDataFn) + d.FieldStruct("PageHeaderData", func(d *decode.D) { + heap.DecodePageHeaderDataFn(heap, d) + }) // free space freeSpaceEnd := int64(pagePosBegin*8) + int64(page.PdUpper*8) @@ -221,11 +211,13 @@ func decodeHeapPage(d *decode.D) { } if uint64(page.PdSpecial) != heap.PageSize && heap.DecodePageSpecialFn != nil { - heap.DecodePageSpecialFn(d) + heap.DecodePageSpecialFn(heap, d) } // Tuples - d.FieldArray("Tuples", decodeTuples) + d.FieldArray("Tuples", func(d *decode.D) { + decodeTuples(heap, d) + }) } /* 0 | 8 */ // PageXLogRecPtr pd_lsn; @@ -237,8 +229,7 @@ func decodeHeapPage(d *decode.D) { /* 18 | 2 */ // uint16 PdPagesizeVersion; /* 20 | 4 */ // TransactionId pd_prune_xid; /* 24 | 0 */ // ItemIdData pd_linp[]; -func DecodePageHeaderData(d *decode.D) { - heap := GetHeapD(d) +func DecodePageHeaderData(heap *HeapD, d *decode.D) { page := heap.Page d.FieldStruct("pd_lsn", func(d *decode.D) { @@ -257,11 +248,12 @@ func DecodePageHeaderData(d *decode.D) { // ItemIdData pd_linp[]; page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) - d.FieldArray("pd_linp", DecodeItemIds) + d.FieldArray("pd_linp", func(d *decode.D) { + DecodeItemIds(heap, d) + }) } -func DecodeItemIds(d *decode.D) { - heap := GetHeapD(d) +func DecodeItemIds(heap *HeapD, d *decode.D) { page := heap.Page for { @@ -287,10 +279,8 @@ func DecodeItemIds(d *decode.D) { } // for pd_linp } -func decodeTuples(d *decode.D) { - heap := GetHeapD(d) +func decodeTuples(heap *HeapD, d *decode.D) { page := heap.Page - for i := 0; i < len(page.ItemIds); i++ { id := page.ItemIds[i] if id.lpOff == 0 || id.lpLen == 0 { @@ -328,13 +318,19 @@ func decodeTuples(d *decode.D) { // we need infomask before t_xmin, t_xmax d.SeekAbs(pos1 + 18*8) d.FieldU16("t_infomask2") - d.FieldStruct("Infomask2", decodeInfomask2) + d.FieldStruct("Infomask2", func(d *decode.D) { + decodeInfomask2(heap, d) + }) d.FieldU16("t_infomask") - d.FieldStruct("Infomask", decodeInfomask) + d.FieldStruct("Infomask", func(d *decode.D) { + decodeInfomask(heap, d) + }) // restore pos and continue d.SeekAbs(pos1) - d.FieldStruct("t_choice", decodeTChoice) + d.FieldStruct("t_choice", func(d *decode.D) { + decodeTChoice(heap, d) + }) d.FieldStruct("t_ctid", func(d *decode.D) { /* 0 | 4 */ // BlockIdData ip_blkid; /* 4 | 2 */ // OffsetNumber ip_posid; @@ -380,8 +376,7 @@ func decodeTuples(d *decode.D) { } // for ItemsIds } -func decodeInfomask2(d *decode.D) { - heap := GetHeapD(d) +func decodeInfomask2(heap *HeapD, d *decode.D) { tuple := &TupleD{} heap.Tuple = tuple @@ -394,8 +389,7 @@ func decodeInfomask2(d *decode.D) { d.FieldU16("HEAP_ONLY_TUPLE", common.Mask{Mask: HEAP_ONLY_TUPLE}) } -func decodeInfomask(d *decode.D) { - heap := GetHeapD(d) +func decodeInfomask(heap *HeapD, d *decode.D) { tuple := heap.Tuple pos := d.Pos() - 16 @@ -445,8 +439,7 @@ func decodeInfomask(d *decode.D) { /* 12 */ // HeapTupleFields t_heap; /* 12 */ // DatumTupleFields t_datum; // } t_choice; -func decodeTChoice(d *decode.D) { - heap := GetHeapD(d) +func decodeTChoice(heap *HeapD, d *decode.D) { page := heap.Page tuple := heap.Tuple From f224ed000eedf520820c6307236ac9e2b0d47bbe Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 6 Sep 2022 10:23:08 +0300 Subject: [PATCH 056/141] postgres: refactoring --- format/postgres/flavours/pgpro11/pg_heap.go | 2 +- format/postgres/flavours/pgpro12/pg_heap.go | 2 +- format/postgres/flavours/pgpro13/pgheap.go | 2 +- format/postgres/flavours/pgpro14/pgheap.go | 2 +- format/postgres/flavours/pgproee10/pgheap.go | 2 +- format/postgres/flavours/pgproee11/pgheap.go | 2 +- format/postgres/flavours/pgproee12/pgheap.go | 2 +- format/postgres/flavours/pgproee13/pgheap.go | 2 +- format/postgres/flavours/pgproee14/pgheap.go | 2 +- format/postgres/flavours/postgres11/pgheap.go | 2 +- format/postgres/flavours/postgres12/pgheap.go | 2 +- format/postgres/flavours/postgres13/pgheap.go | 2 +- format/postgres/flavours/postgres14/common14/pgheap.go | 2 +- format/postgres/flavours/postgres14/pgheap.go | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/format/postgres/flavours/pgpro11/pg_heap.go b/format/postgres/flavours/pgpro11/pg_heap.go index b9ee33e0b..9332ecfdd 100644 --- a/format/postgres/flavours/pgpro11/pg_heap.go +++ b/format/postgres/flavours/pgpro11/pg_heap.go @@ -57,5 +57,5 @@ func DecodeHeap(d *decode.D) any { PageSize: common.HeapPageSize, DecodePageHeaderDataFn: common14.DecodePageHeaderData, } - return common14.DecodeHeap(d, heap) + return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgpro12/pg_heap.go b/format/postgres/flavours/pgpro12/pg_heap.go index 57081a5d4..9730da0b3 100644 --- a/format/postgres/flavours/pgpro12/pg_heap.go +++ b/format/postgres/flavours/pgpro12/pg_heap.go @@ -58,5 +58,5 @@ func DecodeHeap(d *decode.D) any { PageSize: common.HeapPageSize, DecodePageHeaderDataFn: common14.DecodePageHeaderData, } - return common14.DecodeHeap(d, heap) + return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgpro13/pgheap.go b/format/postgres/flavours/pgpro13/pgheap.go index 52ef71789..32b9976e9 100644 --- a/format/postgres/flavours/pgpro13/pgheap.go +++ b/format/postgres/flavours/pgpro13/pgheap.go @@ -58,5 +58,5 @@ func DecodeHeap(d *decode.D) any { PageSize: common.HeapPageSize, DecodePageHeaderDataFn: common14.DecodePageHeaderData, } - return common14.DecodeHeap(d, heap) + return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgpro14/pgheap.go b/format/postgres/flavours/pgpro14/pgheap.go index 0979c56e1..f93189c3b 100644 --- a/format/postgres/flavours/pgpro14/pgheap.go +++ b/format/postgres/flavours/pgpro14/pgheap.go @@ -58,5 +58,5 @@ func DecodeHeap(d *decode.D) any { PageSize: common.HeapPageSize, DecodePageHeaderDataFn: common14.DecodePageHeaderData, } - return common14.DecodeHeap(d, heap) + return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee10/pgheap.go b/format/postgres/flavours/pgproee10/pgheap.go index a5a13014b..b78126c2a 100644 --- a/format/postgres/flavours/pgproee10/pgheap.go +++ b/format/postgres/flavours/pgproee10/pgheap.go @@ -60,5 +60,5 @@ func DecodeHeap(d *decode.D) any { DecodePageHeaderDataFn: ee14.DecodePageHeaderData, DecodePageSpecialFn: ee14.DecodePageSpecial, } - return common14.DecodeHeap(d, heap) + return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee11/pgheap.go b/format/postgres/flavours/pgproee11/pgheap.go index c8c75e00e..7a0ad78d7 100644 --- a/format/postgres/flavours/pgproee11/pgheap.go +++ b/format/postgres/flavours/pgproee11/pgheap.go @@ -79,5 +79,5 @@ func DecodeHeap(d *decode.D) any { DecodePageHeaderDataFn: ee14.DecodePageHeaderData, DecodePageSpecialFn: ee14.DecodePageSpecial, } - return common14.DecodeHeap(d, heap) + return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee12/pgheap.go b/format/postgres/flavours/pgproee12/pgheap.go index 43ff9136f..bb218b559 100644 --- a/format/postgres/flavours/pgproee12/pgheap.go +++ b/format/postgres/flavours/pgproee12/pgheap.go @@ -60,5 +60,5 @@ func DecodeHeap(d *decode.D) any { DecodePageHeaderDataFn: ee14.DecodePageHeaderData, DecodePageSpecialFn: ee14.DecodePageSpecial, } - return common14.DecodeHeap(d, heap) + return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee13/pgheap.go b/format/postgres/flavours/pgproee13/pgheap.go index 49cfac7c3..8e8501679 100644 --- a/format/postgres/flavours/pgproee13/pgheap.go +++ b/format/postgres/flavours/pgproee13/pgheap.go @@ -60,5 +60,5 @@ func DecodeHeap(d *decode.D) any { DecodePageHeaderDataFn: ee14.DecodePageHeaderData, DecodePageSpecialFn: ee14.DecodePageSpecial, } - return common14.DecodeHeap(d, heap) + return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee14/pgheap.go b/format/postgres/flavours/pgproee14/pgheap.go index 7481a034f..05799c3da 100644 --- a/format/postgres/flavours/pgproee14/pgheap.go +++ b/format/postgres/flavours/pgproee14/pgheap.go @@ -87,5 +87,5 @@ func DecodeHeap(d *decode.D) any { DecodePageHeaderDataFn: ee14.DecodePageHeaderData, DecodePageSpecialFn: ee14.DecodePageSpecial, } - return common14.DecodeHeap(d, heap) + return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres11/pgheap.go b/format/postgres/flavours/postgres11/pgheap.go index cf027b9a1..3ff7d4de2 100644 --- a/format/postgres/flavours/postgres11/pgheap.go +++ b/format/postgres/flavours/postgres11/pgheap.go @@ -70,5 +70,5 @@ func DecodeHeap(d *decode.D) any { PageSize: common.HeapPageSize, DecodePageHeaderDataFn: common14.DecodePageHeaderData, } - return common14.DecodeHeap(d, heap) + return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres12/pgheap.go b/format/postgres/flavours/postgres12/pgheap.go index 660796d25..8764b7a03 100644 --- a/format/postgres/flavours/postgres12/pgheap.go +++ b/format/postgres/flavours/postgres12/pgheap.go @@ -70,5 +70,5 @@ func DecodeHeap(d *decode.D) any { PageSize: common.HeapPageSize, DecodePageHeaderDataFn: common14.DecodePageHeaderData, } - return common14.DecodeHeap(d, heap) + return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres13/pgheap.go b/format/postgres/flavours/postgres13/pgheap.go index 27175141f..b4f5d742d 100644 --- a/format/postgres/flavours/postgres13/pgheap.go +++ b/format/postgres/flavours/postgres13/pgheap.go @@ -51,5 +51,5 @@ func DecodeHeap(d *decode.D) any { PageSize: common.HeapPageSize, DecodePageHeaderDataFn: common14.DecodePageHeaderData, } - return common14.DecodeHeap(d, heap) + return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index d5e5a75c1..4a29ec769 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -164,7 +164,7 @@ type itemIdDataD struct { lpLen uint32 } -func DecodeHeap(d *decode.D, heap *HeapD) any { +func DecodeHeap(heap *HeapD, d *decode.D) any { d.SeekAbs(0) decodeHeapPages(heap, d) diff --git a/format/postgres/flavours/postgres14/pgheap.go b/format/postgres/flavours/postgres14/pgheap.go index de6dbebf0..ce2758ebb 100644 --- a/format/postgres/flavours/postgres14/pgheap.go +++ b/format/postgres/flavours/postgres14/pgheap.go @@ -24,5 +24,5 @@ func DecodeHeap(d *decode.D) any { PageSize: common.HeapPageSize, DecodePageHeaderDataFn: common14.DecodePageHeaderData, } - return common14.DecodeHeap(d, heap) + return common14.DecodeHeap(heap, d) } From 85c042289dff351ddf422a54741ae971cb3cc584 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 6 Sep 2022 12:55:15 +0300 Subject: [PATCH 057/141] postgres: fix linter --- format/postgres/common/pg_control.go | 3 + format/postgres/common/pgheap.go | 7 +- format/postgres/common/utils_test.go | 3 +- .../flavours/postgres14/common14/pgheap.go | 31 ++-- format/postgres/flavours/postgres14/pgwal.go | 89 +++++----- format/postgres/pg_control.go | 10 +- format/postgres/pg_heap.go | 8 +- format/postgres/pg_multixact.go | 161 +++++++++--------- format/postgres/pg_wal.go | 117 ++++++------- 9 files changed, 211 insertions(+), 218 deletions(-) diff --git a/format/postgres/common/pg_control.go b/format/postgres/common/pg_control.go index 182d16684..37bf05d7c 100644 --- a/format/postgres/common/pg_control.go +++ b/format/postgres/common/pg_control.go @@ -2,7 +2,9 @@ package common import ( "fmt" + "github.com/wader/fq/pkg/scalar" + "time" ) @@ -91,6 +93,7 @@ var TimeMapper = timeMapper{} // PGPRO_STANDARD = ('P'<<8|'P'), // PGPRO_ENTERPRISE = ('P'<<8|'E'), //} PgEdition; +//nolint:revive const ( PG_UNKNOWN = 0xFFFF PG_ORIGINAL = 0 diff --git a/format/postgres/common/pgheap.go b/format/postgres/common/pgheap.go index d01ed369f..45b84fe70 100644 --- a/format/postgres/common/pgheap.go +++ b/format/postgres/common/pgheap.go @@ -4,9 +4,10 @@ import ( "github.com/wader/fq/pkg/scalar" ) +//nolint:revive const ( HeapPageSize = 8192 - FirstNormalTransactionId = 3 + FirstNormalTransactionID = 3 LP_UNUSED = 0 /* unused (should always have lp_len=0) */ LP_NORMAL = 1 /* used (should always have lp_len>0) */ @@ -14,8 +15,8 @@ const ( LP_DEAD = 3 ) -func TransactionIdIsNormal(xid uint64) bool { - return xid >= FirstNormalTransactionId +func TransactionIDIsNormal(xid uint64) bool { + return xid >= FirstNormalTransactionID } type lpOffMapper struct{} diff --git a/format/postgres/common/utils_test.go b/format/postgres/common/utils_test.go index b1915a7ec..79d1e6f5f 100644 --- a/format/postgres/common/utils_test.go +++ b/format/postgres/common/utils_test.go @@ -1,8 +1,9 @@ package common_test import ( - "github.com/wader/fq/format/postgres/common" "testing" + + "github.com/wader/fq/format/postgres/common" ) func TestTypeAlign8(t *testing.T) { diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index 4a29ec769..ff89c4ec7 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -2,11 +2,14 @@ package common14 import ( "fmt" + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/scalar" ) +//nolint:revive const ( HEAP_HASNULL = 0x0001 /* has null attribute(s) */ HEAP_HASVARWIDTH = 0x0002 /* has variable-width attribute(s) */ @@ -37,6 +40,7 @@ const ( HEAP_MOVED = HEAP_MOVED_OFF | HEAP_MOVED_IN ) +//nolint:revive const ( HEAP_KEYS_UPDATED = 0x2000 /* tuple was updated and key cols modified, or tuple deleted */ HEAP_HOT_UPDATED = 0x4000 /* tuple was HOT-updated */ @@ -131,7 +135,7 @@ type HeapPageD struct { PdSpecial uint16 PdPagesizeVersion uint16 - ItemIds []itemIdDataD + ItemIds []itemIDDataD PagePosBegin uint64 ItemsEnd int64 @@ -146,16 +150,7 @@ type TupleD struct { IsMulti uint64 } -func (hp *HeapPageD) getItemId(offset uint32) (bool, itemIdDataD) { - for _, id := range hp.ItemIds { - if id.lpOff == offset { - return true, id - } - } - return false, itemIdDataD{} -} - -type itemIdDataD struct { +type itemIDDataD struct { /* 0: 0 | 4 */ // unsigned int lp_off: 15 /* 1: 7 | 4 */ // unsigned int lp_flags: 2 /* 2: 1 | 4 */ // unsigned int lp_len: 15 @@ -265,16 +260,16 @@ func DecodeItemIds(heap *HeapD, d *decode.D) { /* 1: 7 | 4 */ // unsigned int lp_flags: 2 /* 2: 1 | 4 */ // unsigned int lp_len: 15 d.FieldStruct("ItemIdData", func(d *decode.D) { - itemId := itemIdDataD{} + itemID := itemIDDataD{} itemPos := d.Pos() - itemId.lpOff = uint32(d.FieldU32("lp_off", common.LpOffMapper)) + itemID.lpOff = uint32(d.FieldU32("lp_off", common.LpOffMapper)) d.SeekAbs(itemPos) - itemId.lpFlags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) + itemID.lpFlags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) d.SeekAbs(itemPos) - itemId.lpLen = uint32(d.FieldU32("lp_len", common.LpLenMapper)) + itemID.lpLen = uint32(d.FieldU32("lp_len", common.LpLenMapper)) - page.ItemIds = append(page.ItemIds, itemId) + page.ItemIds = append(page.ItemIds, itemID) }) } // for pd_linp } @@ -489,12 +484,12 @@ type TransactionMapper struct { func (m TransactionMapper) MapScalar(s scalar.S) (scalar.S, error) { xid := s.ActualU() - if m.Page.PdXidBase != 0 && m.Tuple.IsMulti == 0 && common.TransactionIdIsNormal(xid) { + if m.Page.PdXidBase != 0 && m.Tuple.IsMulti == 0 && common.TransactionIDIsNormal(xid) { xid64 := xid + m.Page.PdXidBase s.Sym = fmt.Sprintf("%d", xid64) } - if m.Page.PdMultiBase != 0 && m.Tuple.IsMulti != 0 && common.TransactionIdIsNormal(xid) { + if m.Page.PdMultiBase != 0 && m.Tuple.IsMulti != 0 && common.TransactionIDIsNormal(xid) { xid64 := xid + m.Page.PdMultiBase s.Sym = fmt.Sprintf("%d", xid64) } diff --git a/format/postgres/flavours/postgres14/pgwal.go b/format/postgres/flavours/postgres14/pgwal.go index 4d8015ac4..cdb2923ef 100644 --- a/format/postgres/flavours/postgres14/pgwal.go +++ b/format/postgres/flavours/postgres14/pgwal.go @@ -1,8 +1,8 @@ package postgres14 import ( - "context" "fmt" + "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/scalar" @@ -10,16 +10,19 @@ import ( //func init() { // interp.RegisterFormat(decode.Format{ -// Name: format.PGWAL, +// Name: format.PG_WAL, // Description: "PostgreSQL write-ahead log file", -// DecodeFn: pgwalDecode, +// DecodeFn: DecodePgwal, // }) //} -const XLOG_BLCKSZ = 8192 - -const XLP_LONG_HEADER = 2 +//nolint:revive +const ( + XLOG_BLCKSZ = 8192 + XLP_LONG_HEADER = 2 +) +//nolint:revive const ( BKPBLOCK_FORK_MASK = 0x0F /* block data is an XLogRecordBlockImage */ @@ -32,6 +35,7 @@ const ( ) /* Information stored in bimg_info */ +//nolint:revive const ( /* page image has "hole" */ BKPIMAGE_HAS_HOLE = 0x01 @@ -41,8 +45,6 @@ const ( BKPIMAGE_APPLY = 0x04 ) -var expected_rem_len uint64 = 0 - var rmgrIds = scalar.UToScalar{ 0: {Sym: "XLOG", Description: "RM_XLOG_ID"}, 1: {Sym: "Transaction", Description: "RM_XACT_ID"}, @@ -132,30 +134,21 @@ type walD struct { record *decode.D } -func getWalD(d *decode.D) *walD { - val := d.Ctx.Value("wald") - return val.(*walD) -} - func DecodePgwal(d *decode.D, in any) any { walD := &walD{ pages: d.FieldArrayValue("pages"), records: d.FieldArrayValue("records"), } - parentCtx := d.Ctx - ctx := context.WithValue(parentCtx, "wald", walD) - d.Ctx = ctx d.SeekAbs(0) - d.FieldArray("XLogPages", decodeXLogPage) + d.FieldArray("XLogPages", func(d *decode.D) { + decodeXLogPage(walD, d) + }) return nil } -func decodeXLogPage(d *decode.D) { - - wal := getWalD(d) - +func decodeXLogPage(wal *walD, d *decode.D) { // type = struct XLogPageHeaderData { /* 0 | 2 */ // uint16 xlp_magic; /* 2 | 2 */ // uint16 xlp_info; @@ -169,7 +162,7 @@ func decodeXLogPage(d *decode.D) { xlpInfo := page.FieldU16("xlp_info") page.FieldU32("xlp_tli") page.FieldU64("xlp_pageaddr") - remLen := page.FieldU32("xlp_rem_len") + page.FieldU32("xlp_rem_len") page.U32() if xlpInfo&XLP_LONG_HEADER != 0 { @@ -181,19 +174,19 @@ func decodeXLogPage(d *decode.D) { }) } - remLen = 40 + remLen := 40 wal.remLen = uint32(remLen) record := wal.record if record == nil { - rawLen := int64(common.TypeAlign8(remLen)) + rawLen := int64(common.TypeAlign8(uint64(remLen))) page.FieldRawLen("prev_file_rec", rawLen*8) } pageRecords := page.FieldArrayValue("records") wal.pageRecords = pageRecords - decodeXLogRecords(d) + decodeXLogRecords(wal, d) //page.Pos() //for { @@ -202,8 +195,7 @@ func decodeXLogPage(d *decode.D) { //fmt.Printf("d pos = %d\n", d.Pos()) } -func decodeXLogRecords(d *decode.D) { - wal := getWalD(d) +func decodeXLogRecords(wal *walD, d *decode.D) { pageRecords := wal.pageRecords pos := d.Pos() / 8 @@ -279,16 +271,21 @@ func DecodePgwalOri(d *decode.D, in any) any { pageHeaders := d.FieldArrayValue("XLogPageHeaders") header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) - d.FieldRawLen("prev_file_rec", int64(header.FieldGet("xlp_rem_len").V.(uint32)*8)) + xlpRemLen, ok := header.FieldGet("xlp_rem_len").V.(uint32) + if !ok { + d.Fatalf("can't get xlp_rem_len\n") + } + + d.FieldRawLen("prev_file_rec", int64(xlpRemLen*8)) d.FieldRawLen("prev_file_rec_padding", int64(d.AlignBits(64))) d.FieldArray("XLogRecords", func(d *decode.D) { for { d.FieldStruct("XLogRecord", func(d *decode.D) { - record_pos := uint64(d.Pos()) >> 3 - record_len := d.FieldU32("xl_tot_len") - record_end := record_pos + record_len - header_pos := record_end - record_end%XLOG_BLCKSZ + recordPos := uint64(d.Pos()) >> 3 + recordLen := d.FieldU32("xl_tot_len") + recordEnd := recordPos + recordLen + headerPos := recordEnd - recordEnd%XLOG_BLCKSZ d.FieldU32("xl_xid") d.FieldU64("xl_prev", scalar.ActualHex) d.FieldU8("xl_info") @@ -296,7 +293,7 @@ func DecodePgwalOri(d *decode.D, in any) any { d.FieldRawLen("padding", int64(d.AlignBits(32))) d.FieldU32("xl_crc", scalar.ActualHex) - var lenghts []uint64 = []uint64{} + var lengths []uint64 d.FieldArray("XLogRecordBlockHeader", func(d *decode.D) { for blkheaderid := uint64(0); d.PeekBits(8) == blkheaderid; blkheaderid++ { @@ -304,25 +301,25 @@ func DecodePgwalOri(d *decode.D, in any) any { /* block reference ID */ d.FieldU8("id", d.AssertU(blkheaderid)) /* fork within the relation, and flags */ - fork_flags := d.FieldU8("fork_flags") + forkFlags := d.FieldU8("fork_flags") /* number of payload bytes (not including page image) */ - lenghts = append(lenghts, d.FieldU16("data_length")) - if fork_flags&BKPBLOCK_HAS_IMAGE != 0 { + lengths = append(lengths, d.FieldU16("data_length")) + if forkFlags&BKPBLOCK_HAS_IMAGE != 0 { d.FieldStruct("XLogRecordBlockImageHeader", func(d *decode.D) { /* number of page image bytes */ d.FieldU16("length") /* number of bytes before "hole" */ d.FieldU16("hole_offset") /* flag bits, see below */ - bimg_info := d.FieldU8("bimg_info") + bimgInfo := d.FieldU8("bimg_info") d.FieldRawLen("padding", int64(d.AlignBits(16))) - if bimg_info&BKPIMAGE_HAS_HOLE != 0 && - bimg_info&BKPIMAGE_IS_COMPRESSED != 0 { + if bimgInfo&BKPIMAGE_HAS_HOLE != 0 && + bimgInfo&BKPIMAGE_IS_COMPRESSED != 0 { d.FieldU16("hole_length") } }) } - if fork_flags&BKPBLOCK_SAME_REL == 0 { + if forkFlags&BKPBLOCK_SAME_REL == 0 { d.FieldStruct("RelFileNode", func(d *decode.D) { /* tablespace */ d.FieldU32("spcNode") @@ -339,18 +336,18 @@ func DecodePgwalOri(d *decode.D, in any) any { if d.PeekBits(8) == 0xff { d.FieldStruct("XLogRecordDataHeaderShort", func(d *decode.D) { d.FieldU8("id", d.AssertU(0xff)) - lenghts = append(lenghts, d.FieldU8("data_length")) + lengths = append(lengths, d.FieldU8("data_length")) }) } d.FieldArray("data", func(d *decode.D) { - for _, x := range lenghts { + for _, x := range lengths { pos := uint64(d.Pos()) >> 3 - if pos < header_pos && (header_pos < pos+x) { - d.FieldRawLen("data", int64((header_pos-pos)*8)) + if pos < headerPos && (headerPos < pos+x) { + d.FieldRawLen("data", int64((headerPos-pos)*8)) header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) - header.FieldGet("xlp_rem_len").TryScalarFn(d.ValidateU(record_end - header_pos)) - d.FieldRawLen("data", int64((x+pos-header_pos)*8)) + _ = header.FieldGet("xlp_rem_len").TryScalarFn(d.ValidateU(recordEnd - headerPos)) + d.FieldRawLen("data", int64((x+pos-headerPos)*8)) } else { d.FieldRawLen("data", int64(x*8)) } diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 0fbdc6f8e..7ea4c6ccd 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -31,6 +31,7 @@ func init() { }) } +//nolint:revive const ( PG_CONTROL_VERSION_10 = 1002 PG_CONTROL_VERSION_11 = 1100 @@ -40,6 +41,7 @@ const ( PG_CONTROL_VERSION_14 = 1300 ) +//nolint:revive const ( PG_FLAVOUR_POSTGRES = "postgres" PG_FLAVOUR_POSTGRES11 = "postgres11" @@ -60,8 +62,12 @@ const ( func decodePgControl(d *decode.D, in any) any { d.Endian = decode.LittleEndian - flavour := in.(format.PostgresIn).Flavour - switch flavour { + pgIn, ok := in.(format.PostgresIn) + if !ok { + d.Fatalf("DecodeInArg must be PostgresIn!\n") + } + + switch pgIn.Flavour { case PG_FLAVOUR_POSTGRES11: return postgres11.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES12: diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index 36c0c141c..c8a810cdc 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -38,8 +38,12 @@ func init() { func decodePgheap(d *decode.D, in any) any { d.Endian = decode.LittleEndian - flavour := in.(format.PostgresIn).Flavour - switch flavour { + pgIn, ok := in.(format.PostgresIn) + if !ok { + d.Fatalf("DecodeInArg must be PostgresIn!\n") + } + + switch pgIn.Flavour { case PG_FLAVOUR_POSTGRES11: return postgres11.DecodeHeap(d) case PG_FLAVOUR_POSTGRES12: diff --git a/format/postgres/pg_multixact.go b/format/postgres/pg_multixact.go index c5db2e1ff..f47d10a1a 100644 --- a/format/postgres/pg_multixact.go +++ b/format/postgres/pg_multixact.go @@ -1,89 +1,82 @@ package postgres -import ( - "github.com/wader/fq/format" - "github.com/wader/fq/pkg/decode" - "github.com/wader/fq/pkg/interp" - "github.com/wader/fq/pkg/scalar" -) - // TO DO // actualize -const BLCKSZ = 8192 - -func init() { - interp.RegisterFormat(decode.Format{ - Name: format.PG_MULTIXACTOFF, - Description: "PostgreSQL multixact offset file", - DecodeFn: mxOffsetDecode, - }) - interp.RegisterFormat(decode.Format{ - Name: format.PG_MULTIXACTMEM, - Description: "PostgreSQL multixact members file", - DecodeFn: mxMembersDecode, - }) -} - -func mxOffsetDecode(d *decode.D, in interface{}) interface{} { - d.Endian = decode.LittleEndian - - d.FieldArray("offsets", func(d *decode.D) { - for { - if d.End() { - break - } - d.FieldU32("offset", scalar.ActualHex) - - } - }) - return nil -} - -var flags = scalar.UToScalar{ - 0: {Sym: "ForKeyShare", Description: "For Key Share"}, - 1: {Sym: "ForShare", Description: "For Share"}, - 2: {Sym: "ForNoKeyUpdate", Description: "For No Key Update"}, - 3: {Sym: "ForUpdate", Description: "For Update"}, - 4: {Sym: "NoKeyUpdate", Description: "No Key Update"}, - 5: {Sym: "Update", Description: "Update"}, -} - -func mxMembersDecode(d *decode.D, in interface{}) interface{} { - var xidLen uint = 4 - var groupLen uint = 4 * (1 + xidLen) - d.Endian = decode.LittleEndian - - m := d.FieldArrayValue("members") - p := d.FieldArrayValue("paddings") - - for { - var xacts []*decode.D = make([]*decode.D, 4) - - for i := 0; i < 4; i++ { - xacts[i] = m.FieldStructValue("xact") - xacts[i].FieldU8("status", flags) - } - - for i := 0; i < 4; i++ { - xacts[i].FieldU32("xid") - } - - // Check if rest of bytes are padding before EOF - if d.BitsLeft() < int64(groupLen*8) && d.BitsLeft() > 0 { - p.FieldRawLen("padding", d.BitsLeft()) - break - } - - // Check on EOF - if d.End() { - break - } - - // Not EOF, let's check on block boundary - if blkLeft := BLCKSZ - (uint(d.Pos())>>3)%BLCKSZ; blkLeft < groupLen { - p.FieldRawLen("padding", int64(blkLeft*8)) - } - } - return nil -} +//const BLCKSZ = 8192 +// +//func init() { +// interp.RegisterFormat(decode.Format{ +// Name: format.PG_MULTIXACTOFF, +// Description: "PostgreSQL multixact offset file", +// DecodeFn: mxOffsetDecode, +// }) +// interp.RegisterFormat(decode.Format{ +// Name: format.PG_MULTIXACTMEM, +// Description: "PostgreSQL multixact members file", +// DecodeFn: mxMembersDecode, +// }) +//} +// +//func mxOffsetDecode(d *decode.D, in interface{}) interface{} { +// d.Endian = decode.LittleEndian +// +// d.FieldArray("offsets", func(d *decode.D) { +// for { +// if d.End() { +// break +// } +// d.FieldU32("offset", scalar.ActualHex) +// +// } +// }) +// return nil +//} +// +//var flags = scalar.UToScalar{ +// 0: {Sym: "ForKeyShare", Description: "For Key Share"}, +// 1: {Sym: "ForShare", Description: "For Share"}, +// 2: {Sym: "ForNoKeyUpdate", Description: "For No Key Update"}, +// 3: {Sym: "ForUpdate", Description: "For Update"}, +// 4: {Sym: "NoKeyUpdate", Description: "No Key Update"}, +// 5: {Sym: "Update", Description: "Update"}, +//} +// +//func mxMembersDecode(d *decode.D, in interface{}) interface{} { +// var xidLen uint = 4 +// var groupLen uint = 4 * (1 + xidLen) +// d.Endian = decode.LittleEndian +// +// m := d.FieldArrayValue("members") +// p := d.FieldArrayValue("paddings") +// +// for { +// var xacts []*decode.D = make([]*decode.D, 4) +// +// for i := 0; i < 4; i++ { +// xacts[i] = m.FieldStructValue("xact") +// xacts[i].FieldU8("status", flags) +// } +// +// for i := 0; i < 4; i++ { +// xacts[i].FieldU32("xid") +// } +// +// // Check if rest of bytes are padding before EOF +// if d.BitsLeft() < int64(groupLen*8) && d.BitsLeft() > 0 { +// p.FieldRawLen("padding", d.BitsLeft()) +// break +// } +// +// // Check on EOF +// if d.End() { +// break +// } +// +// // Not EOF, let's check on block boundary +// if blkLeft := BLCKSZ - (uint(d.Pos())>>3)%BLCKSZ; blkLeft < groupLen { +// p.FieldRawLen("padding", int64(blkLeft*8)) +// } +// } +// return nil +//} diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index a56709461..2a3c98209 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -1,67 +1,60 @@ package postgres -import ( - "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/postgres14" - "github.com/wader/fq/pkg/decode" - "github.com/wader/fq/pkg/interp" -) - // TO DO // not ready yet -func init() { - interp.RegisterFormat(decode.Format{ - Name: format.PG_WAL, - Description: "PostgreSQL write-ahead log file", - DecodeFn: decodePgwal, - DecodeInArg: format.PostgresIn{ - Flavour: "default", - }, - }) -} - -// https://pgpedia.info/x/XLOG_PAGE_MAGIC.html -const ( - XLOG_PAGE_MAGIC_15 = uint16(0xD10F) - XLOG_PAGE_MAGIC_14 = uint16(0xD10D) - XLOG_PAGE_MAGIC_13 = uint16(0xD106) - XLOG_PAGE_MAGIC_12 = uint16(0xD101) - XLOG_PAGE_MAGIC_11 = uint16(0xD098) - XLOG_PAGE_MAGIC_10 = uint16(0xD097) - XLOG_PAGE_MAGIC_96 = uint16(0xD093) -) - -func decodePgwal(d *decode.D, in any) any { - d.Endian = decode.LittleEndian - - flavour := in.(format.PostgresIn).Flavour - switch flavour { - //case PG_FLAVOUR_POSTGRES11: - // return postgres11.DecodePgControl(d, in) - case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: - return postgres14.DecodePgwal(d, in) - //case PG_FLAVOUR_PGPROEE14: - // return pgproee14.DecodePgControl(d, in) - default: - break - } - - return probePgwal(d, in) -} - -func probePgwal(d *decode.D, in any) any { - // read version - xlp_magic := uint16(d.U16()) - - // restore position - d.SeekAbs(0) - - switch xlp_magic { - case XLOG_PAGE_MAGIC_14: - return postgres14.DecodePgwal(d, in) - default: - d.Fatalf("unsupported xlp_magic = %X\n", xlp_magic) - } - return nil -} +//func init() { +// interp.RegisterFormat(decode.Format{ +// Name: format.PG_WAL, +// Description: "PostgreSQL write-ahead log file", +// DecodeFn: decodePgwal, +// DecodeInArg: format.PostgresIn{ +// Flavour: "default", +// }, +// }) +//} +// +//// https://pgpedia.info/x/XLOG_PAGE_MAGIC.html +//const ( +// XLOG_PAGE_MAGIC_15 = uint16(0xD10F) +// XLOG_PAGE_MAGIC_14 = uint16(0xD10D) +// XLOG_PAGE_MAGIC_13 = uint16(0xD106) +// XLOG_PAGE_MAGIC_12 = uint16(0xD101) +// XLOG_PAGE_MAGIC_11 = uint16(0xD098) +// XLOG_PAGE_MAGIC_10 = uint16(0xD097) +// XLOG_PAGE_MAGIC_96 = uint16(0xD093) +//) +// +//func decodePgwal(d *decode.D, in any) any { +// d.Endian = decode.LittleEndian +// +// flavour := in.(format.PostgresIn).Flavour +// switch flavour { +// //case PG_FLAVOUR_POSTGRES11: +// // return postgres11.DecodePgControl(d, in) +// case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: +// return postgres14.DecodePgwal(d, in) +// //case PG_FLAVOUR_PGPROEE14: +// // return pgproee14.DecodePgControl(d, in) +// default: +// break +// } +// +// return probePgwal(d, in) +//} +// +//func probePgwal(d *decode.D, in any) any { +// // read version +// xlp_magic := uint16(d.U16()) +// +// // restore position +// d.SeekAbs(0) +// +// switch xlp_magic { +// case XLOG_PAGE_MAGIC_14: +// return postgres14.DecodePgwal(d, in) +// default: +// d.Fatalf("unsupported xlp_magic = %X\n", xlp_magic) +// } +// return nil +//} From c2591ac80a70c94b5823188f9b0f4c679911caf3 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 7 Sep 2022 14:14:11 +0300 Subject: [PATCH 058/141] postgres: add test data with specific values --- .../testdata/flavours/pgproee14/16451 | Bin 0 -> 16384 bytes .../flavours/pgproee14/16451_1.fqtest | 143 ++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 format/postgres/testdata/flavours/pgproee14/16451 create mode 100644 format/postgres/testdata/flavours/pgproee14/16451_1.fqtest diff --git a/format/postgres/testdata/flavours/pgproee14/16451 b/format/postgres/testdata/flavours/pgproee14/16451 new file mode 100644 index 0000000000000000000000000000000000000000..c2f0571fa87ee32148ad9199ff41b6571ef0b7c0 GIT binary patch literal 16384 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 c3)k5k^EjKUW(n8H9P>Dvt7e*eT Date: Fri, 9 Sep 2022 07:55:36 +0300 Subject: [PATCH 059/141] postgres: try to implement wal --- format/postgres/common/utils_test.go | 27 +++ .../postgres14/{pgwal.go => pg_wal.go} | 212 +++++++++++------- format/postgres/pg_wal.go | 117 +++++----- .../testdata/flavours/pgproee14/.gitignore | 1 + .../testdata/flavours/postgres14/.gitignore | 1 + 5 files changed, 218 insertions(+), 140 deletions(-) rename format/postgres/flavours/postgres14/{pgwal.go => pg_wal.go} (67%) create mode 100644 format/postgres/testdata/flavours/pgproee14/.gitignore create mode 100644 format/postgres/testdata/flavours/postgres14/.gitignore diff --git a/format/postgres/common/utils_test.go b/format/postgres/common/utils_test.go index 79d1e6f5f..ccfc68b5f 100644 --- a/format/postgres/common/utils_test.go +++ b/format/postgres/common/utils_test.go @@ -6,6 +6,33 @@ import ( "github.com/wader/fq/format/postgres/common" ) +func TestTypeAlign(t *testing.T) { + expected0 := common.TypeAlign(8192, 8192+0) + if expected0 != 8192 { + t.Errorf("must be 8192\n") + } + + expected1 := common.TypeAlign(8192, 8192+100) + if expected1 != 8192*2 { + t.Errorf("must be 8192*2\n") + } + + expected2 := common.TypeAlign(8192, 0) + if expected2 != 0 { + t.Errorf("must be 0\n") + } + + expected3 := common.TypeAlign(8192, 700) + if expected3 != 8192 { + t.Errorf("must be 8192\n") + } + + expected4 := common.TypeAlign(8192, 8192*2+5000) + if expected4 != 8192*3 { + t.Errorf("must be 8192*3\n") + } +} + func TestTypeAlign8(t *testing.T) { expected39 := common.TypeAlign8(39) if expected39 != 40 { diff --git a/format/postgres/flavours/postgres14/pgwal.go b/format/postgres/flavours/postgres14/pg_wal.go similarity index 67% rename from format/postgres/flavours/postgres14/pgwal.go rename to format/postgres/flavours/postgres14/pg_wal.go index cdb2923ef..d0d6617ad 100644 --- a/format/postgres/flavours/postgres14/pgwal.go +++ b/format/postgres/flavours/postgres14/pg_wal.go @@ -8,14 +8,6 @@ import ( "github.com/wader/fq/pkg/scalar" ) -//func init() { -// interp.RegisterFormat(decode.Format{ -// Name: format.PG_WAL, -// Description: "PostgreSQL write-ahead log file", -// DecodeFn: DecodePgwal, -// }) -//} - //nolint:revive const ( XLOG_BLCKSZ = 8192 @@ -70,7 +62,16 @@ var rmgrIds = scalar.UToScalar{ 21: {Sym: "LogicalMessage", Description: "RM_LOGICALMSG_ID"}, } -// type = struct XLogPageHeaderData { +// struct XLogLongPageHeaderData { +// /* 0 | 24 */ XLogPageHeaderData std; +// /* 24 | 8 */ uint64 xlp_sysid; +// /* 32 | 4 */ uint32 xlp_seg_size; +// /* 36 | 4 */ uint32 xlp_xlog_blcksz; +// +// /* total size (bytes): 40 */ +//} + +// struct XLogPageHeaderData { /* 0 | 2 */ // uint16 xlp_magic; /* 2 | 2 */ // uint16 xlp_info; /* 4 | 4 */ // TimeLineID xlp_tli; @@ -80,7 +81,7 @@ var rmgrIds = scalar.UToScalar{ // /* total size (bytes): 24 */ -// type = struct XLogRecord { +// struct XLogRecord { /* 0 | 4 */ // uint32 xl_tot_len /* 4 | 4 */ // TransactionId xl_xid /* 8 | 8 */ // XLogRecPtr xl_prev @@ -129,26 +130,40 @@ type walD struct { records *decode.D pageRecords *decode.D - remLen uint32 - record *decode.D + record *decode.D + recordRemLenBytes int64 } -func DecodePgwal(d *decode.D, in any) any { +func DecodePgwal(d *decode.D) any { + pages := d.FieldArrayValue("Pages") walD := &walD{ - pages: d.FieldArrayValue("pages"), - records: d.FieldArrayValue("records"), + pages: pages, + records: d.FieldArrayValue("Records"), + recordRemLenBytes: -1, } - d.SeekAbs(0) - d.FieldArray("XLogPages", func(d *decode.D) { - decodeXLogPage(walD, d) - }) + for { + decodeXLogPage(walD, pages) + + posBytes := pages.Pos() / 8 + remBytes := posBytes % XLOG_BLCKSZ + if remBytes != 0 { + d.Fatalf("invalid page remBytes = %d\n", remBytes) + } + + if pages.End() { + break + } + } return nil } func decodeXLogPage(wal *walD, d *decode.D) { + + xLogPage := d.FieldStructValue("Page") + // type = struct XLogPageHeaderData { /* 0 | 2 */ // uint16 xlp_magic; /* 2 | 2 */ // uint16 xlp_info; @@ -156,51 +171,57 @@ func decodeXLogPage(wal *walD, d *decode.D) { /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; /* 16 | 4 */ // uint32 xlp_rem_len; /* XXX 4-byte padding */ - page := wal.pages.FieldStructValue("XLogPageHeaderData") + header := xLogPage.FieldStructValue("XLogPageHeaderData") - page.FieldU16("xlp_magic") - xlpInfo := page.FieldU16("xlp_info") - page.FieldU32("xlp_tli") - page.FieldU64("xlp_pageaddr") - page.FieldU32("xlp_rem_len") - page.U32() + header.FieldU16("xlp_magic") + xlpInfo := header.FieldU16("xlp_info") + header.FieldU32("xlp_tli") + header.FieldU64("xlp_pageaddr") + remLenBytes := header.FieldU32("xlp_rem_len") + header.FieldU32("padding0") if xlpInfo&XLP_LONG_HEADER != 0 { // Long header - d.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { + header.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { d.FieldU64("xlp_sysid") d.FieldU32("xlp_seg_size") d.FieldU32("xlp_xlog_blcksz") }) } - remLen := 40 - wal.remLen = uint32(remLen) + if wal.recordRemLenBytes >= 0 { + if wal.recordRemLenBytes != int64(remLenBytes) { + d.Fatalf("incorrect wal.recordRemLenBytes = %d, remLenBytes = %d", wal.recordRemLenBytes, remLenBytes) + } + } - record := wal.record - if record == nil { - rawLen := int64(common.TypeAlign8(uint64(remLen))) - page.FieldRawLen("prev_file_rec", rawLen*8) + remLenBytesAligned := common.TypeAlign8(remLenBytes) + remLen := remLenBytesAligned * 8 + + pos1 := header.Pos() + xLogPage.SeekAbs(pos1) + // TODO + xLogPage.FieldRawLen("RecordOfPreviousPage", int64(remLen)) + pos2 := xLogPage.Pos() + + if wal.record != nil { + wal.record.SeekAbs(pos1) } - pageRecords := page.FieldArrayValue("records") + xLogPage.SeekAbs(pos2) + pageRecords := xLogPage.FieldArrayValue("Records") + wal.pageRecords = pageRecords decodeXLogRecords(wal, d) - - //page.Pos() - //for { - // - //} - //fmt.Printf("d pos = %d\n", d.Pos()) } func decodeXLogRecords(wal *walD, d *decode.D) { pageRecords := wal.pageRecords - pos := d.Pos() / 8 - posMaxOfPage := int64(common.TypeAlign(8192, uint64(pos))) - fmt.Printf("posMaxOfPage = %d\n", posMaxOfPage) + posBytes := d.Pos() / 8 + posMaxOfPageBytes := int64(common.TypeAlign(8192, uint64(posBytes))) + fmt.Printf("posMaxOfPageBytes = %d\n", posMaxOfPageBytes) for { /* 0 | 4 */ // uint32 xl_tot_len @@ -211,52 +232,71 @@ func decodeXLogRecords(wal *walD, d *decode.D) { /* XXX 2-byte hole */ /* 20 | 4 */ // pg_crc32c xl_crc - //record := page.FieldStructValue("XLogRecord") - //wal.record = record - //wal.records.AddChild(record.Value) - // - //xLogRecordBegin := record.Pos() - //xlTotLen := record.FieldU32("xl_tot_len") - //record.FieldU32("xl_xid") - //record.FieldU64("xl_prev") - //record.FieldU8("xl_info") - //record.FieldU8("xl_rmid") - //record.U16() - //record.FieldU32("xl_crc") - //xLogRecordEnd := record.Pos() - //sizeOfXLogRecord := (xLogRecordEnd - xLogRecordBegin) / 8 - // - //xLogRecordBodyLen := xlTotLen - uint64(sizeOfXLogRecord) - // - //rawLen := int64(TypeAlign8(xLogRecordBodyLen)) - //page.FieldRawLen("xLogBody", rawLen*8) - - pos := d.Pos() / 8 - if pos >= posMaxOfPage { + posBytes1 := d.Pos() / 8 + posBytes1Aligned := common.TypeAlign8(uint64(posBytes1)) + d.SeekAbs(int64(posBytes1Aligned * 8)) + + record := pageRecords.FieldStructValue("XLogRecord") + wal.record = record + wal.records.AddChild(record.Value) + + xLogRecordBegin := record.Pos() + xlTotLen := record.FieldU32("xl_tot_len") + record.FieldU32("xl_xid") + record.FieldU64("xl_prev") + record.FieldU8("xl_info") + record.FieldU8("xl_rmid") + record.U16() + record.FieldU32("xl_crc") + xLogRecordEnd := record.Pos() + sizeOfXLogRecord := (xLogRecordEnd - xLogRecordBegin) / 8 + + xLogRecordBodyLen := xlTotLen - uint64(sizeOfXLogRecord) + + rawLen := int64(common.TypeAlign8(xLogRecordBodyLen)) + pos1Bytes := d.Pos() / 8 + + remOnPage := posMaxOfPageBytes - pos1Bytes + if remOnPage < rawLen { + record.FieldRawLen("xLogBody", remOnPage*8) + wal.recordRemLenBytes = rawLen - remOnPage break } - pageRecords.FieldStruct("XLogRecord", func(d *decode.D) { - record := d - wal.record = record - wal.records.AddChild(record.Value) - - xLogRecordBegin := record.Pos() - xlTotLen := record.FieldU32("xl_tot_len") - record.FieldU32("xl_xid") - record.FieldU64("xl_prev") - record.FieldU8("xl_info") - record.FieldU8("xl_rmid") - record.U16() - record.FieldU32("xl_crc") - xLogRecordEnd := record.Pos() - sizeOfXLogRecord := (xLogRecordEnd - xLogRecordBegin) / 8 - - xLogRecordBodyLen := xlTotLen - uint64(sizeOfXLogRecord) - - rawLen := int64(common.TypeAlign8(xLogRecordBodyLen)) - record.FieldRawLen("xLogBody", rawLen*8) - }) + record.FieldRawLen("xLogBody", rawLen*8) + wal.recordRemLenBytes = -1 + + //pos1Bytes := d.Pos() / 8 + //if pos1Bytes > posMaxOfPageBytes { + // d.Fatalf("out of page, error in logic!") + //} + + //pos := d.Pos() / 8 + //if pos >= posMaxOfPage { + // break + //} + // + //pageRecords.FieldStruct("XLogRecord", func(d *decode.D) { + // record := d + // wal.record = record + // wal.records.AddChild(record.Value) + // + // xLogRecordBegin := record.Pos() + // xlTotLen := record.FieldU32("xl_tot_len") + // record.FieldU32("xl_xid") + // record.FieldU64("xl_prev") + // record.FieldU8("xl_info") + // record.FieldU8("xl_rmid") + // record.U16() + // record.FieldU32("xl_crc") + // xLogRecordEnd := record.Pos() + // sizeOfXLogRecord := (xLogRecordEnd - xLogRecordBegin) / 8 + // + // xLogRecordBodyLen := xlTotLen - uint64(sizeOfXLogRecord) + // + // rawLen := int64(common.TypeAlign8(xLogRecordBodyLen)) + // record.FieldRawLen("xLogBody", rawLen*8) + //}) //pos := d.Pos() //if pos >= (4000 * 8) { diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index 2a3c98209..30818d662 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -1,60 +1,69 @@ package postgres +import ( + "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/postgres14" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/interp" +) + // TO DO // not ready yet -//func init() { -// interp.RegisterFormat(decode.Format{ -// Name: format.PG_WAL, -// Description: "PostgreSQL write-ahead log file", -// DecodeFn: decodePgwal, -// DecodeInArg: format.PostgresIn{ -// Flavour: "default", -// }, -// }) -//} -// +func init() { + interp.RegisterFormat(decode.Format{ + Name: format.PG_WAL, + Description: "PostgreSQL write-ahead log file", + DecodeFn: decodePgwal, + DecodeInArg: format.PostgresIn{ + Flavour: "default", + }, + }) +} + //// https://pgpedia.info/x/XLOG_PAGE_MAGIC.html -//const ( -// XLOG_PAGE_MAGIC_15 = uint16(0xD10F) -// XLOG_PAGE_MAGIC_14 = uint16(0xD10D) -// XLOG_PAGE_MAGIC_13 = uint16(0xD106) -// XLOG_PAGE_MAGIC_12 = uint16(0xD101) -// XLOG_PAGE_MAGIC_11 = uint16(0xD098) -// XLOG_PAGE_MAGIC_10 = uint16(0xD097) -// XLOG_PAGE_MAGIC_96 = uint16(0xD093) -//) -// -//func decodePgwal(d *decode.D, in any) any { -// d.Endian = decode.LittleEndian -// -// flavour := in.(format.PostgresIn).Flavour -// switch flavour { -// //case PG_FLAVOUR_POSTGRES11: -// // return postgres11.DecodePgControl(d, in) -// case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: -// return postgres14.DecodePgwal(d, in) -// //case PG_FLAVOUR_PGPROEE14: -// // return pgproee14.DecodePgControl(d, in) -// default: -// break -// } -// -// return probePgwal(d, in) -//} -// -//func probePgwal(d *decode.D, in any) any { -// // read version -// xlp_magic := uint16(d.U16()) -// -// // restore position -// d.SeekAbs(0) -// -// switch xlp_magic { -// case XLOG_PAGE_MAGIC_14: -// return postgres14.DecodePgwal(d, in) -// default: -// d.Fatalf("unsupported xlp_magic = %X\n", xlp_magic) -// } -// return nil -//} +const ( + XLOG_PAGE_MAGIC_15 = uint16(0xD10F) + XLOG_PAGE_MAGIC_14 = uint16(0xD10D) + XLOG_PAGE_MAGIC_13 = uint16(0xD106) + XLOG_PAGE_MAGIC_12 = uint16(0xD101) + XLOG_PAGE_MAGIC_11 = uint16(0xD098) + XLOG_PAGE_MAGIC_10 = uint16(0xD097) + XLOG_PAGE_MAGIC_96 = uint16(0xD093) +) + +func decodePgwal(d *decode.D, in any) any { + d.Endian = decode.LittleEndian + + pgIn, ok := in.(format.PostgresIn) + if !ok { + d.Fatalf("DecodeInArg must be PostgresIn!\n") + } + + switch pgIn.Flavour { + //case PG_FLAVOUR_POSTGRES11: + // return postgres11.DecodePgControl(d, in) + case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: + return postgres14.DecodePgwal(d) + //case PG_FLAVOUR_PGPROEE14: + // return pgproee14.DecodePgControl(d, in) + } + + return probePgwal(d, in) +} + +func probePgwal(d *decode.D, in any) any { + // read version + xlpMagic := uint16(d.U16()) + + // restore position + d.SeekAbs(0) + + switch xlpMagic { + case XLOG_PAGE_MAGIC_14: + return postgres14.DecodePgwal(d) + } + + d.Fatalf("unsupported xlp_magic = %X\n", xlpMagic) + return nil +} diff --git a/format/postgres/testdata/flavours/pgproee14/.gitignore b/format/postgres/testdata/flavours/pgproee14/.gitignore new file mode 100644 index 000000000..6ba21b1cd --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee14/.gitignore @@ -0,0 +1 @@ +0000* \ No newline at end of file diff --git a/format/postgres/testdata/flavours/postgres14/.gitignore b/format/postgres/testdata/flavours/postgres14/.gitignore new file mode 100644 index 000000000..6ba21b1cd --- /dev/null +++ b/format/postgres/testdata/flavours/postgres14/.gitignore @@ -0,0 +1 @@ +0000* \ No newline at end of file From 1d9ef300b9e16f5bba2631816f6414e145c4987d Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 9 Sep 2022 15:16:48 +0300 Subject: [PATCH 060/141] postgres: first correct read of WAL file --- format/format.go | 1 + format/postgres/common/utils_test.go | 5 + format/postgres/flavours/postgres14/pg_wal.go | 138 ++++++++++-------- .../flavours/postgres14/pg_wal_test.go | 31 ++++ format/postgres/pg_wal.go | 45 +++++- format/postgres/pg_wal_test.go | 31 ++++ 6 files changed, 187 insertions(+), 64 deletions(-) create mode 100644 format/postgres/flavours/postgres14/pg_wal_test.go create mode 100644 format/postgres/pg_wal_test.go diff --git a/format/format.go b/format/format.go index d6a5c7a87..f13b07b23 100644 --- a/format/format.go +++ b/format/format.go @@ -323,4 +323,5 @@ type BitCoinBlockIn struct { type PostgresIn struct { Flavour string `doc:"PostgreSQL flavour: postgres, postgres13, pgpro..."` + Lsn string `doc:"Current LSN for WAL, use \"select pg_current_wal_lsn()\""` } diff --git a/format/postgres/common/utils_test.go b/format/postgres/common/utils_test.go index ccfc68b5f..b7a80a794 100644 --- a/format/postgres/common/utils_test.go +++ b/format/postgres/common/utils_test.go @@ -31,6 +31,11 @@ func TestTypeAlign(t *testing.T) { if expected4 != 8192*3 { t.Errorf("must be 8192*3\n") } + + expected5 := common.TypeAlign(8192, 114720) + if expected5 != 122880 { + t.Errorf("must be 8192*3\n") + } } func TestTypeAlign8(t *testing.T) { diff --git a/format/postgres/flavours/postgres14/pg_wal.go b/format/postgres/flavours/postgres14/pg_wal.go index d0d6617ad..0117ba6d9 100644 --- a/format/postgres/flavours/postgres14/pg_wal.go +++ b/format/postgres/flavours/postgres14/pg_wal.go @@ -2,7 +2,6 @@ package postgres14 import ( "fmt" - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/scalar" @@ -126,6 +125,8 @@ func decodeXLogPageHeaderData(d *decode.D) { } type walD struct { + maxOffset int64 + pages *decode.D records *decode.D @@ -135,26 +136,32 @@ type walD struct { recordRemLenBytes int64 } -func DecodePgwal(d *decode.D) any { +func DecodePgwal(d *decode.D, maxOffset uint32) any { pages := d.FieldArrayValue("Pages") - walD := &walD{ + wal := &walD{ + maxOffset: int64(maxOffset), pages: pages, records: d.FieldArrayValue("Records"), recordRemLenBytes: -1, } for { - decodeXLogPage(walD, pages) + decodeXLogPage(wal, pages) + + if pages.End() { + break + } posBytes := pages.Pos() / 8 + if posBytes >= wal.maxOffset { + d.FieldRawLen("unused", d.BitsLeft()) + break + } + remBytes := posBytes % XLOG_BLCKSZ if remBytes != 0 { d.Fatalf("invalid page remBytes = %d\n", remBytes) } - - if pages.End() { - break - } } return nil @@ -233,75 +240,86 @@ func decodeXLogRecords(wal *walD, d *decode.D) { /* 20 | 4 */ // pg_crc32c xl_crc posBytes1 := d.Pos() / 8 - posBytes1Aligned := common.TypeAlign8(uint64(posBytes1)) - d.SeekAbs(int64(posBytes1Aligned * 8)) + posBytes1Aligned := int64(common.TypeAlign8(uint64(posBytes1))) + // check aligned - this is correct + // record header is 8 byte aligned + if posBytes1Aligned >= wal.maxOffset { + d.FieldRawLen("unused", d.BitsLeft()) + break + } + + // check what we cat read xl_tot_len on this page + if posMaxOfPageBytes < posBytes1Aligned+4 { + remOnPage := posMaxOfPageBytes - posBytes1 + d.FieldRawLen("page_padding0", remOnPage*8) + // can't read xl_tot_len on this page + // can't create row in this page + // continue on next page + wal.record = nil + wal.recordRemLenBytes = -1 + return + } + + d.SeekAbs(posBytes1Aligned * 8) record := pageRecords.FieldStructValue("XLogRecord") wal.record = record wal.records.AddChild(record.Value) - xLogRecordBegin := record.Pos() + //xLogRecordBegin := record.Pos() xlTotLen := record.FieldU32("xl_tot_len") - record.FieldU32("xl_xid") - record.FieldU64("xl_prev") - record.FieldU8("xl_info") - record.FieldU8("xl_rmid") - record.U16() - record.FieldU32("xl_crc") - xLogRecordEnd := record.Pos() - sizeOfXLogRecord := (xLogRecordEnd - xLogRecordBegin) / 8 - - xLogRecordBodyLen := xlTotLen - uint64(sizeOfXLogRecord) - - rawLen := int64(common.TypeAlign8(xLogRecordBodyLen)) - pos1Bytes := d.Pos() / 8 - - remOnPage := posMaxOfPageBytes - pos1Bytes - if remOnPage < rawLen { + + xlTotLen1Bytes := xlTotLen - 4 + //xlTotLen1 := xlTotLen1Bytes * 8 + + //pos2 := d.Pos() + pos2Bytes := d.Pos() / 8 + + remOnPage := posMaxOfPageBytes - pos2Bytes + if remOnPage <= 0 { + d.Fatalf("remOnPage is negative\n") + } + + if remOnPage < int64(xlTotLen1Bytes) { record.FieldRawLen("xLogBody", remOnPage*8) - wal.recordRemLenBytes = rawLen - remOnPage + wal.recordRemLenBytes = int64(xlTotLen1Bytes) - remOnPage break } - record.FieldRawLen("xLogBody", rawLen*8) - wal.recordRemLenBytes = -1 + xLogBodyLen := int64(xlTotLen1Bytes) * 8 + if xLogBodyLen <= 0 { + d.Fatalf("xlTotLen1Bytes is negative, xLogBodyLen = %d\n", xLogBodyLen) + } - //pos1Bytes := d.Pos() / 8 - //if pos1Bytes > posMaxOfPageBytes { - // d.Fatalf("out of page, error in logic!") - //} + record.FieldRawLen("xLogBody", xLogBodyLen) + wal.recordRemLenBytes = -1 - //pos := d.Pos() / 8 - //if pos >= posMaxOfPage { - // break - //} - // - //pageRecords.FieldStruct("XLogRecord", func(d *decode.D) { - // record := d - // wal.record = record - // wal.records.AddChild(record.Value) + //xLogRecordBegin := record.Pos() + //xlTotLen := record.FieldU32("xl_tot_len") + //record.FieldU32("xl_xid") + //record.FieldU64("xl_prev") + //record.FieldU8("xl_info") + //record.FieldU8("xl_rmid") + //record.U16() + //record.FieldU32("xl_crc") + //xLogRecordEnd := record.Pos() + //sizeOfXLogRecord := (xLogRecordEnd - xLogRecordBegin) / 8 // - // xLogRecordBegin := record.Pos() - // xlTotLen := record.FieldU32("xl_tot_len") - // record.FieldU32("xl_xid") - // record.FieldU64("xl_prev") - // record.FieldU8("xl_info") - // record.FieldU8("xl_rmid") - // record.U16() - // record.FieldU32("xl_crc") - // xLogRecordEnd := record.Pos() - // sizeOfXLogRecord := (xLogRecordEnd - xLogRecordBegin) / 8 + //xLogRecordBodyLen := xlTotLen - uint64(sizeOfXLogRecord) // - // xLogRecordBodyLen := xlTotLen - uint64(sizeOfXLogRecord) + //rawLen := int64(common.TypeAlign8(xLogRecordBodyLen)) + //pos1Bytes := d.Pos() / 8 // - // rawLen := int64(common.TypeAlign8(xLogRecordBodyLen)) - // record.FieldRawLen("xLogBody", rawLen*8) - //}) - - //pos := d.Pos() - //if pos >= (4000 * 8) { + //remOnPage := posMaxOfPageBytes - pos1Bytes + //if remOnPage < rawLen { + // record.FieldRawLen("xLogBody", remOnPage*8) + // wal.recordRemLenBytes = rawLen - remOnPage // break //} + // + //record.FieldRawLen("xLogBody", rawLen*8) + //wal.recordRemLenBytes = -1 + } } diff --git a/format/postgres/flavours/postgres14/pg_wal_test.go b/format/postgres/flavours/postgres14/pg_wal_test.go new file mode 100644 index 000000000..02eafacac --- /dev/null +++ b/format/postgres/flavours/postgres14/pg_wal_test.go @@ -0,0 +1,31 @@ +package postgres14_test + +import ( + "github.com/wader/fq/format/postgres/flavours/postgres14" + "testing" +) + +func TestParseLsn(t *testing.T) { + lsn1, err := postgres14.ParseLsn("0/4E394440") + if err != nil { + t.Fatalf("TestParseLsn 1, err = %v\n", err) + } + if lsn1 != 0x4E394440 { + t.Fatalf("TestParseLsn 2, invalid lsn value\n") + } + + lsn2, err := postgres14.ParseLsn("0/4469E930") + if err != nil { + t.Fatalf("TestParseLsn 3, err = %v\n", err) + } + if lsn2 != 0x4469E930 { + t.Fatalf("TestParseLsn 4, invalid lsn value\n") + } +} + +func TestXLogSegmentOffset(t *testing.T) { + offset := postgres14.XLogSegmentOffset(0x4E394440) + if offset == 0 { + t.Fatalf("TestXLogSegmentOffset 1, invalid offset\n") + } +} diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index 30818d662..c308d98f5 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -1,10 +1,14 @@ package postgres import ( + "errors" + "fmt" "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" + "strconv" + "strings" ) // TO DO @@ -17,6 +21,7 @@ func init() { DecodeFn: decodePgwal, DecodeInArg: format.PostgresIn{ Flavour: "default", + Lsn: "", }, }) } @@ -32,6 +37,29 @@ const ( XLOG_PAGE_MAGIC_96 = uint16(0xD093) ) +func ParseLsn(lsn string) (uint32, error) { + // check for 0/4E394440 + str1 := lsn + if strings.Contains(lsn, "/") { + parts := strings.Split(lsn, "/") + if len(parts) != 2 { + return 0, errors.New(fmt.Sprintf("Invalid lsn = %s", lsn)) + } + str1 = parts[1] + } + // parse hex to coded file name + file offset + r1, err := strconv.ParseInt(str1, 16, 64) + if err != nil { + return 0, err + } + return uint32(r1), err +} + +func XLogSegmentOffset(xLogPtr uint32) uint32 { + const walSegSizeBytes = 16 * 1024 * 1024 + return xLogPtr & (walSegSizeBytes - 1) +} + func decodePgwal(d *decode.D, in any) any { d.Endian = decode.LittleEndian @@ -40,19 +68,28 @@ func decodePgwal(d *decode.D, in any) any { d.Fatalf("DecodeInArg must be PostgresIn!\n") } + maxOffset := uint32(0xFFFFFFFF) + if pgIn.Lsn != "" { + lsn, err := ParseLsn(pgIn.Lsn) + if err != nil { + d.Fatalf("Failed to ParseLsn, err = %v\n", err) + } + maxOffset = XLogSegmentOffset(lsn) + } + switch pgIn.Flavour { //case PG_FLAVOUR_POSTGRES11: // return postgres11.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: - return postgres14.DecodePgwal(d) + return postgres14.DecodePgwal(d, maxOffset) //case PG_FLAVOUR_PGPROEE14: // return pgproee14.DecodePgControl(d, in) } - return probePgwal(d, in) + return probePgwal(d, maxOffset) } -func probePgwal(d *decode.D, in any) any { +func probePgwal(d *decode.D, maxOffset uint32) any { // read version xlpMagic := uint16(d.U16()) @@ -61,7 +98,7 @@ func probePgwal(d *decode.D, in any) any { switch xlpMagic { case XLOG_PAGE_MAGIC_14: - return postgres14.DecodePgwal(d) + return postgres14.DecodePgwal(d, maxOffset) } d.Fatalf("unsupported xlp_magic = %X\n", xlpMagic) diff --git a/format/postgres/pg_wal_test.go b/format/postgres/pg_wal_test.go new file mode 100644 index 000000000..71c5fdcf9 --- /dev/null +++ b/format/postgres/pg_wal_test.go @@ -0,0 +1,31 @@ +package postgres_test + +import ( + "github.com/wader/fq/format/postgres" + "testing" +) + +func TestParseLsn(t *testing.T) { + lsn1, err := postgres.ParseLsn("0/4E394440") + if err != nil { + t.Fatalf("TestParseLsn 1, err = %v\n", err) + } + if lsn1 != 0x4E394440 { + t.Fatalf("TestParseLsn 2, invalid lsn value\n") + } + + lsn2, err := postgres.ParseLsn("0/4469E930") + if err != nil { + t.Fatalf("TestParseLsn 3, err = %v\n", err) + } + if lsn2 != 0x4469E930 { + t.Fatalf("TestParseLsn 4, invalid lsn value\n") + } +} + +func TestXLogSegmentOffset(t *testing.T) { + offset := postgres.XLogSegmentOffset(0x4E394440) + if offset == 0 { + t.Fatalf("TestXLogSegmentOffset 1, invalid offset\n") + } +} From 6281b50dddc8e78059f214b07ce06a8773d38c3d Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 9 Sep 2022 17:14:30 +0300 Subject: [PATCH 061/141] postgres: exclude wal tests for now --- format/postgres/testdata/flavours/postgres14/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/format/postgres/testdata/flavours/postgres14/.gitignore b/format/postgres/testdata/flavours/postgres14/.gitignore index 6ba21b1cd..3fe3a1511 100644 --- a/format/postgres/testdata/flavours/postgres14/.gitignore +++ b/format/postgres/testdata/flavours/postgres14/.gitignore @@ -1 +1,2 @@ -0000* \ No newline at end of file +0000* +wal* \ No newline at end of file From e311434b8fd783805db78d5e1e7f1a1584e86898 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 12 Sep 2022 13:19:32 +0300 Subject: [PATCH 062/141] postgres: wal decoding implement --- format/postgres/flavours/postgres14/pg_wal.go | 101 +++++++++++++++++- 1 file changed, 97 insertions(+), 4 deletions(-) diff --git a/format/postgres/flavours/postgres14/pg_wal.go b/format/postgres/flavours/postgres14/pg_wal.go index 0117ba6d9..d088a1115 100644 --- a/format/postgres/flavours/postgres14/pg_wal.go +++ b/format/postgres/flavours/postgres14/pg_wal.go @@ -202,13 +202,18 @@ func decodeXLogPage(wal *walD, d *decode.D) { } } - remLenBytesAligned := common.TypeAlign8(remLenBytes) + remLenBytesAligned := int64(common.TypeAlign8(remLenBytes)) remLen := remLenBytesAligned * 8 pos1 := header.Pos() xLogPage.SeekAbs(pos1) // TODO - xLogPage.FieldRawLen("RecordOfPreviousPage", int64(remLen)) + if wal.record == nil { + xLogPage.FieldRawLen("RawBytesOfPreviousWalFile", remLen) + } else { + decodeXLogRecord(wal, remLenBytesAligned) + } + pos2 := xLogPage.Pos() if wal.record != nil { @@ -281,7 +286,8 @@ func decodeXLogRecords(wal *walD, d *decode.D) { } if remOnPage < int64(xlTotLen1Bytes) { - record.FieldRawLen("xLogBody", remOnPage*8) + //record.FieldRawLen("xLogBody", remOnPage*8) + decodeXLogRecord(wal, int64(remOnPage)) wal.recordRemLenBytes = int64(xlTotLen1Bytes) - remOnPage break } @@ -291,7 +297,8 @@ func decodeXLogRecords(wal *walD, d *decode.D) { d.Fatalf("xlTotLen1Bytes is negative, xLogBodyLen = %d\n", xLogBodyLen) } - record.FieldRawLen("xLogBody", xLogBodyLen) + //record.FieldRawLen("xLogBody", xLogBodyLen) + decodeXLogRecord(wal, int64(xlTotLen1Bytes)) wal.recordRemLenBytes = -1 //xLogRecordBegin := record.Pos() @@ -323,6 +330,92 @@ func decodeXLogRecords(wal *walD, d *decode.D) { } } +// check that we can read bitsCount on page (with posMax?) +func isEnd(d *decode.D, posMax int64, bitsCount int64) bool { + pos := d.Pos() + posRead := pos + bitsCount + result := posRead > posMax + if result { + // set reader at and position to continue reading + d.SeekAbs(posMax) + } + return result +} + +func decodeXLogRecord(wal *walD, maxBytes int64) { + record := wal.record + + pos0 := record.Pos() + maxLen := maxBytes * 8 + if record.FieldGet("xLogBody0") == nil { + // body on first page + record.FieldRawLen("xLogBody0", maxLen) + } else { + // body on second page + record.FieldRawLen("xLogBody1", maxLen) + } + pos1 := record.Pos() + posMax := pos1 + record.SeekAbs(pos0) + + // struct XLogRecord { + /* 0 | 4 */ // uint32 xl_tot_len + /* 4 | 4 */ // TransactionId xl_xid + /* 8 | 8 */ // XLogRecPtr xl_prev + /* 16 | 1 */ // uint8 xl_info + /* 17 | 1 */ // RmgrId xl_rmid + /* XXX 2-byte hole */ + /* 20 | 4 */ // pg_crc32c xl_crc + + // xl_tot_len already read + + if record.FieldGet("xl_xid") == nil { + if isEnd(record, posMax, 32) { + return + } + record.FieldU32("xl_xid") + } + + if record.FieldGet("xl_prev") == nil { + if isEnd(record, posMax, 64) { + return + } + record.FieldU64("xl_prev") + } + + if record.FieldGet("xl_info") == nil { + if isEnd(record, posMax, 8) { + return + } + record.FieldU8("xl_info") + } + + if record.FieldGet("xl_rmid") == nil { + if isEnd(record, posMax, 8) { + return + } + record.FieldU8("xl_rmid") + } + + if record.FieldGet("hole1") == nil { + if isEnd(record, posMax, 16) { + return + } + record.FieldU16("hole1") + } + + if record.FieldGet("xl_crc") == nil { + if isEnd(record, posMax, 32) { + return + } + record.FieldU32("xl_crc") + } + + // TODO + + record.SeekAbs(posMax) +} + func DecodePgwalOri(d *decode.D, in any) any { d.SeekAbs(0) From e66baa75f370dda07a98863eebcb2772dfab3a1e Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 12 Sep 2022 13:40:59 +0300 Subject: [PATCH 063/141] postgres: add wal checks --- format/postgres/flavours/postgres14/pg_wal.go | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/format/postgres/flavours/postgres14/pg_wal.go b/format/postgres/flavours/postgres14/pg_wal.go index d088a1115..bedbbcf8d 100644 --- a/format/postgres/flavours/postgres14/pg_wal.go +++ b/format/postgres/flavours/postgres14/pg_wal.go @@ -61,6 +61,11 @@ var rmgrIds = scalar.UToScalar{ 21: {Sym: "LogicalMessage", Description: "RM_LOGICALMSG_ID"}, } +const ( + XLOG_PAGE_MAGIC_MASK = 0xD000 + XLOG_PAGE_MAGIC_POSTGRES14 = 0xD10D +) + // struct XLogLongPageHeaderData { // /* 0 | 24 */ XLogPageHeaderData std; // /* 24 | 8 */ uint64 xlp_sysid; @@ -92,29 +97,24 @@ var rmgrIds = scalar.UToScalar{ /* total size (bytes): 24 */ func decodeXLogPageHeaderData(d *decode.D) { - var info uint64 - - //pages := d.FieldArrayValue("pages") - - //pages.SeekAbs() - - //d.FieldStructValue() - /* 0 | 2 */ // uint16 xlp_magic; /* 2 | 2 */ // uint16 xlp_info; /* 4 | 4 */ // TimeLineID xlp_tli; /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; /* 16 | 4 */ // uint32 xlp_rem_len; - d.FieldU16("xlp_magic") - d.FieldU16("xlp_info") + /* XXX 4-byte padding */ + xlpMagic := d.FieldU16("xlp_magic") + xlpInfo := d.FieldU16("xlp_info") d.FieldU32("xlp_timeline") d.FieldU64("xlp_pageaddr") d.FieldU32("xlp_rem_len") + d.FieldU32("padding0") - //d.FieldRawLen("padding", int64(d.AlignBits(64))) - d.U32() + if (xlpMagic & XLOG_PAGE_MAGIC_MASK) == 0 { + d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) + } - if info&XLP_LONG_HEADER != 0 { + if xlpInfo&XLP_LONG_HEADER != 0 { // Long header d.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { d.FieldU64("xlp_sysid") @@ -180,13 +180,17 @@ func decodeXLogPage(wal *walD, d *decode.D) { /* XXX 4-byte padding */ header := xLogPage.FieldStructValue("XLogPageHeaderData") - header.FieldU16("xlp_magic") + xlpMagic := header.FieldU16("xlp_magic") xlpInfo := header.FieldU16("xlp_info") header.FieldU32("xlp_tli") header.FieldU64("xlp_pageaddr") remLenBytes := header.FieldU32("xlp_rem_len") header.FieldU32("padding0") + if (xlpMagic & XLOG_PAGE_MAGIC_MASK) == 0 { + d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) + } + if xlpInfo&XLP_LONG_HEADER != 0 { // Long header header.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { From 067f8d569db921145471852accafc9024dbf1183 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 12 Sep 2022 14:01:16 +0300 Subject: [PATCH 064/141] postgres: pgwal checks --- format/postgres/flavours/postgres14/pg_wal.go | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/format/postgres/flavours/postgres14/pg_wal.go b/format/postgres/flavours/postgres14/pg_wal.go index bedbbcf8d..d916523bb 100644 --- a/format/postgres/flavours/postgres14/pg_wal.go +++ b/format/postgres/flavours/postgres14/pg_wal.go @@ -142,7 +142,7 @@ func DecodePgwal(d *decode.D, maxOffset uint32) any { maxOffset: int64(maxOffset), pages: pages, records: d.FieldArrayValue("Records"), - recordRemLenBytes: -1, + recordRemLenBytes: -1, // -1 means not initialized } for { @@ -200,7 +200,7 @@ func decodeXLogPage(wal *walD, d *decode.D) { }) } - if wal.recordRemLenBytes >= 0 { + if wal.recordRemLenBytes >= 0 { // check recordRemLenBytes is initialized if wal.recordRemLenBytes != int64(remLenBytes) { d.Fatalf("incorrect wal.recordRemLenBytes = %d, remLenBytes = %d", wal.recordRemLenBytes, remLenBytes) } @@ -211,11 +211,20 @@ func decodeXLogPage(wal *walD, d *decode.D) { pos1 := header.Pos() xLogPage.SeekAbs(pos1) - // TODO - if wal.record == nil { - xLogPage.FieldRawLen("RawBytesOfPreviousWalFile", remLen) - } else { - decodeXLogRecord(wal, remLenBytesAligned) + + // parted XLogRecord + if remLen > 0 { + if wal.record == nil { + // record of previous file + checkPosBytes := xLogPage.Pos() / 8 + if checkPosBytes >= XLOG_BLCKSZ { + d.Fatalf("invalid pos for RawBytesOfPreviousWalFile, it must be on first page only, pos = %d\n", checkPosBytes) + } + xLogPage.FieldRawLen("RawBytesOfPreviousWalFile", remLen) + } else { + // record of previous page + decodeXLogRecord(wal, remLenBytesAligned) + } } pos2 := xLogPage.Pos() @@ -236,7 +245,7 @@ func decodeXLogRecords(wal *walD, d *decode.D) { pageRecords := wal.pageRecords posBytes := d.Pos() / 8 - posMaxOfPageBytes := int64(common.TypeAlign(8192, uint64(posBytes))) + posMaxOfPageBytes := int64(common.TypeAlign(XLOG_BLCKSZ, uint64(posBytes))) fmt.Printf("posMaxOfPageBytes = %d\n", posMaxOfPageBytes) for { @@ -265,7 +274,7 @@ func decodeXLogRecords(wal *walD, d *decode.D) { // can't create row in this page // continue on next page wal.record = nil - wal.recordRemLenBytes = -1 + wal.recordRemLenBytes = 0 return } @@ -291,7 +300,7 @@ func decodeXLogRecords(wal *walD, d *decode.D) { if remOnPage < int64(xlTotLen1Bytes) { //record.FieldRawLen("xLogBody", remOnPage*8) - decodeXLogRecord(wal, int64(remOnPage)) + decodeXLogRecord(wal, remOnPage) wal.recordRemLenBytes = int64(xlTotLen1Bytes) - remOnPage break } @@ -303,7 +312,8 @@ func decodeXLogRecords(wal *walD, d *decode.D) { //record.FieldRawLen("xLogBody", xLogBodyLen) decodeXLogRecord(wal, int64(xlTotLen1Bytes)) - wal.recordRemLenBytes = -1 + wal.record = nil + wal.recordRemLenBytes = 0 //xLogRecordBegin := record.Pos() //xlTotLen := record.FieldU32("xl_tot_len") From 448c3690143ad83f46b4097eb3f5f8f23cc51127 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 15 Sep 2022 16:34:22 +0300 Subject: [PATCH 065/141] postgres: try to implement pg_wal --- format/postgres/flavours/postgres14/pg_wal.go | 296 +++++++++++++++--- pkg/decode/decode.go | 20 ++ 2 files changed, 267 insertions(+), 49 deletions(-) diff --git a/format/postgres/flavours/postgres14/pg_wal.go b/format/postgres/flavours/postgres14/pg_wal.go index d916523bb..f74d2b501 100644 --- a/format/postgres/flavours/postgres14/pg_wal.go +++ b/format/postgres/flavours/postgres14/pg_wal.go @@ -16,24 +16,19 @@ const ( //nolint:revive const ( BKPBLOCK_FORK_MASK = 0x0F - /* block data is an XLogRecordBlockImage */ - BKPBLOCK_HAS_IMAGE = 0x10 + BKPBLOCK_FLAG_MASK = 0xF0 + BKPBLOCK_HAS_IMAGE = 0x10 /* block data is an XLogRecordBlockImage */ BKPBLOCK_HAS_DATA = 0x20 - /* redo will re-init the page */ - BKPBLOCK_WILL_INIT = 0x40 - /* RelFileNode omitted, same as previous */ - BKPBLOCK_SAME_REL = 0x80 + BKPBLOCK_WILL_INIT = 0x40 /* redo will re-init the page */ + BKPBLOCK_SAME_REL = 0x80 /* RelFileNode omitted, same as previous */ ) /* Information stored in bimg_info */ //nolint:revive const ( - /* page image has "hole" */ - BKPIMAGE_HAS_HOLE = 0x01 - /* page image is compressed */ - BKPIMAGE_IS_COMPRESSED = 0x02 - /* page image should be restored during replay */ - BKPIMAGE_APPLY = 0x04 + BKPIMAGE_HAS_HOLE = 0x01 /* page image has "hole" */ + BKPIMAGE_IS_COMPRESSED = 0x02 /* page image is compressed */ + BKPIMAGE_APPLY = 0x04 /* page image should be restored during replay */ ) var rmgrIds = scalar.UToScalar{ @@ -66,6 +61,14 @@ const ( XLOG_PAGE_MAGIC_POSTGRES14 = 0xD10D ) +const ( + XLR_MAX_BLOCK_ID = 32 + XLR_BLOCK_ID_DATA_SHORT = 255 + XLR_BLOCK_ID_DATA_LONG = 254 + XLR_BLOCK_ID_ORIGIN = 253 + XLR_BLOCK_ID_TOPLEVEL_XID = 252 +) + // struct XLogLongPageHeaderData { // /* 0 | 24 */ XLogPageHeaderData std; // /* 24 | 8 */ uint64 xlp_sysid; @@ -93,9 +96,16 @@ const ( /* 17 | 1 */ // RmgrId xl_rmid /* XXX 2-byte hole */ /* 20 | 4 */ // pg_crc32c xl_crc - +// /* total size (bytes): 24 */ +// struct RelFileNode { +/* 0 | 4 */ // Oid spcNode +/* 4 | 4 */ // Oid dbNode +/* 8 | 4 */ // Oid relNode +// +/* total size (bytes): 12 */ + func decodeXLogPageHeaderData(d *decode.D) { /* 0 | 2 */ // uint16 xlp_magic; /* 2 | 2 */ // uint16 xlp_info; @@ -114,7 +124,7 @@ func decodeXLogPageHeaderData(d *decode.D) { d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) } - if xlpInfo&XLP_LONG_HEADER != 0 { + if (xlpInfo & XLP_LONG_HEADER) != 0 { // Long header d.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { d.FieldU64("xlp_sysid") @@ -191,7 +201,7 @@ func decodeXLogPage(wal *walD, d *decode.D) { d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) } - if xlpInfo&XLP_LONG_HEADER != 0 { + if (xlpInfo & XLP_LONG_HEADER) != 0 { // Long header header.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { d.FieldU64("xlp_sysid") @@ -256,7 +266,6 @@ func decodeXLogRecords(wal *walD, d *decode.D) { /* 17 | 1 */ // RmgrId xl_rmid /* XXX 2-byte hole */ /* 20 | 4 */ // pg_crc32c xl_crc - posBytes1 := d.Pos() / 8 posBytes1Aligned := int64(common.TypeAlign8(uint64(posBytes1))) // check aligned - this is correct @@ -284,13 +293,8 @@ func decodeXLogRecords(wal *walD, d *decode.D) { wal.record = record wal.records.AddChild(record.Value) - //xLogRecordBegin := record.Pos() xlTotLen := record.FieldU32("xl_tot_len") - xlTotLen1Bytes := xlTotLen - 4 - //xlTotLen1 := xlTotLen1Bytes * 8 - - //pos2 := d.Pos() pos2Bytes := d.Pos() / 8 remOnPage := posMaxOfPageBytes - pos2Bytes @@ -314,33 +318,6 @@ func decodeXLogRecords(wal *walD, d *decode.D) { decodeXLogRecord(wal, int64(xlTotLen1Bytes)) wal.record = nil wal.recordRemLenBytes = 0 - - //xLogRecordBegin := record.Pos() - //xlTotLen := record.FieldU32("xl_tot_len") - //record.FieldU32("xl_xid") - //record.FieldU64("xl_prev") - //record.FieldU8("xl_info") - //record.FieldU8("xl_rmid") - //record.U16() - //record.FieldU32("xl_crc") - //xLogRecordEnd := record.Pos() - //sizeOfXLogRecord := (xLogRecordEnd - xLogRecordBegin) / 8 - // - //xLogRecordBodyLen := xlTotLen - uint64(sizeOfXLogRecord) - // - //rawLen := int64(common.TypeAlign8(xLogRecordBodyLen)) - //pos1Bytes := d.Pos() / 8 - // - //remOnPage := posMaxOfPageBytes - pos1Bytes - //if remOnPage < rawLen { - // record.FieldRawLen("xLogBody", remOnPage*8) - // wal.recordRemLenBytes = rawLen - remOnPage - // break - //} - // - //record.FieldRawLen("xLogBody", rawLen*8) - //wal.recordRemLenBytes = -1 - } } @@ -356,6 +333,31 @@ func isEnd(d *decode.D, posMax int64, bitsCount int64) bool { return result } +func fieldTryGetScalarActualU(d *decode.D, name string, posMax int64, bitsCount int64) (value uint64, end bool) { + if ok, val := d.FieldTryGetScalarActualU("block_id"); ok { + value = val + } else { + if isEnd(d, posMax, bitsCount) { + return 0, true + } + switch bitsCount { + case 8: + value = d.FieldU8(name) + case 16: + value = d.FieldU16(name) + case 24: + value = d.FieldU24(name) + case 32: + value = d.FieldU32(name) + case 64: + value = d.FieldU64(name) + default: + d.Fatalf("not implemented bitsCount = %d\n", bitsCount) + } + } + return value, false +} + func decodeXLogRecord(wal *walD, maxBytes int64) { record := wal.record @@ -425,7 +427,203 @@ func decodeXLogRecord(wal *walD, maxBytes int64) { record.FieldU32("xl_crc") } - // TODO + //blockId := uint64(0) + //if ok, val := record.FieldTryGetScalarActualU("block_id"); ok { + // blockId = val + //} else { + // if isEnd(record, posMax, 8) { + // return + // } + // blockId = record.FieldU8("block_id") + //} + blockId, end := fieldTryGetScalarActualU(record, "block_id", posMax, 8) + if end { + return + } + + if blockId == XLR_BLOCK_ID_DATA_SHORT { + //typedef struct XLogRecordDataHeaderShort + //{ + // uint8 id; /* XLR_BLOCK_ID_DATA_SHORT */ + // uint8 data_length; /* number of payload bytes */ + //} + // + /* total size (bytes): 24 */ + } + + //XLR_BLOCK_ID_DATA_SHORT = 255 + //XLR_BLOCK_ID_DATA_LONG = 254 + //XLR_BLOCK_ID_ORIGIN = 253 + //XLR_BLOCK_ID_TOPLEVEL_XID = 252 + + mainDataLen := uint64(0) + recordOrigin := uint64(0) + toplevelXid := uint64(0) + if blockId == XLR_BLOCK_ID_DATA_SHORT { + // COPY_HEADER_FIELD(&main_data_len, sizeof(uint8)); + mainDataLen, end = fieldTryGetScalarActualU(record, "main_data_len", posMax, 8) + if end { + return + } + } else if blockId == XLR_BLOCK_ID_DATA_LONG { + // COPY_HEADER_FIELD(&main_data_len, sizeof(uint32)); + mainDataLen, end = fieldTryGetScalarActualU(record, "main_data_len", posMax, 32) + if end { + return + } + } else if blockId == XLR_BLOCK_ID_ORIGIN { + // COPY_HEADER_FIELD(&state->record_origin, sizeof(RepOriginId)); + // unsigned short - 2 bytes + recordOrigin, end = fieldTryGetScalarActualU(record, "record_origin", posMax, 16) + if end { + return + } + } else if blockId == XLR_BLOCK_ID_TOPLEVEL_XID { + // COPY_HEADER_FIELD(&state->toplevel_xid, sizeof(TransactionId)); + // 4 bytes + toplevelXid, end = fieldTryGetScalarActualU(record, "record_origin", posMax, 32) + if end { + return + } + } else if blockId >= XLR_MAX_BLOCK_ID { + record.Fatalf("catched blockId = %d\n", blockId) + } else if blockId < XLR_MAX_BLOCK_ID { + // COPY_HEADER_FIELD(&fork_flags, sizeof(uint8)); + //forkFlags := uint64(0) + //if ok, val := record.FieldTryGetScalarActualU("fork_flags"); ok { + // forkFlags = val + //} else { + // if isEnd(record, posMax, 8) { + // return + // } + // forkFlags = record.FieldU8("fork_flags") + //} + forkFlags, end := fieldTryGetScalarActualU(record, "fork_flags", posMax, 8) + if end { + return + } + + // blk->forknum = fork_flags & BKPBLOCK_FORK_MASK; + // blk->flags = fork_flags; + // blk->has_image = ((fork_flags & BKPBLOCK_HAS_IMAGE) != 0); + // blk->has_data = ((fork_flags & BKPBLOCK_HAS_DATA) != 0); + hasImage := uint64(0) + hasData := uint64(0) + forkNum := forkFlags & BKPBLOCK_FORK_MASK + if (forkFlags & BKPBLOCK_HAS_IMAGE) != 0 { + hasImage = 1 + } + if (forkFlags & BKPBLOCK_HAS_DATA) != 0 { + hasData = 1 + } + if record.FieldGet("forknum") == nil { + record.FieldValueU("forknum", forkNum) + } + if record.FieldGet("has_image") == nil { + record.FieldValueU("has_image", hasImage) + } + if record.FieldGet("has_data") == nil { + record.FieldValueU("has_data", hasData) + } + + // COPY_HEADER_FIELD(&blk->data_len, sizeof(uint16)); + //dataLen := uint64(0) + //if ok, val := record.FieldTryGetScalarActualU("data_len"); ok { + // dataLen = val + //} else { + // if isEnd(record, posMax, 8) { + // return + // } + // dataLen = record.FieldU8("data_len") + //} + dataLen, end := fieldTryGetScalarActualU(record, "data_len", posMax, 8) + if end { + return + } + + // if (blk->has_data && blk->data_len == 0) + if hasData != 0 && dataLen == 0 { + record.Fatalf("invalid record with hasData = %d, dataLen = %d\n", hasData, dataLen) + } + // if (!blk->has_data && blk->data_len != 0) + if hasData == 0 && dataLen != 0 { + record.Fatalf("invalid record with hasData = %d, dataLen = %d\n", hasData, dataLen) + } + + // if (blk->has_image) + if hasImage != 0 { + // COPY_HEADER_FIELD(&blk->bimg_len, sizeof(uint16)); + bimgLen, end := fieldTryGetScalarActualU(record, "bimg_len", posMax, 16) + if end { + return + } + + // COPY_HEADER_FIELD(&blk->hole_offset, sizeof(uint16)); + holeOffset, end := fieldTryGetScalarActualU(record, "hole_offset", posMax, 16) + if end { + return + } + + // COPY_HEADER_FIELD(&blk->bimg_info, sizeof(uint8)); + bimgInfo, end := fieldTryGetScalarActualU(record, "bimg_info", posMax, 8) + if end { + return + } + + // if (blk->bimg_info & BKPIMAGE_IS_COMPRESSED) + bimgIsCompressed := uint64(0) + if (bimgInfo & BKPIMAGE_IS_COMPRESSED) != 0 { + bimgIsCompressed = 1 + } + if record.FieldGet("bimg_is_compressed") == nil { + record.FieldValueU("bimg_is_compressed", bimgIsCompressed) + } + + holeLength := uint64(0) + bimgHasHole := uint64(0) + if bimgIsCompressed != 0 { + if (bimgInfo & BKPIMAGE_HAS_HOLE) != 0 { + bimgHasHole = 1 + } + if record.FieldGet("bimg_has_hole") == nil { + record.FieldValueU("bimg_has_hole", bimgHasHole) + } + if bimgHasHole != 0 { + // COPY_HEADER_FIELD(&blk->hole_length, sizeof(uint16)); + holeLength, end = fieldTryGetScalarActualU(record, "hole_length", posMax, 16) + if end { + return + } + } + } else { // bimgIsCompressed is false + holeLength = XLOG_BLCKSZ - bimgLen + } + if record.FieldGet("hole_length") == nil { + record.FieldValueU("hole_length", holeLength) + } + + if bimgHasHole != 0 && (holeOffset != 0 || holeLength != 0 || bimgLen == XLOG_BLCKSZ) { + record.Fatalf("check failed 1") + } + if (bimgInfo&BKPIMAGE_HAS_HOLE) == 0 && (holeOffset != 0 || holeLength != 0) { + record.Fatalf("check failed 2") + } + if (bimgInfo&BKPIMAGE_IS_COMPRESSED) != 0 && bimgLen == XLOG_BLCKSZ { + record.Fatalf("check failed 3") + } + if (bimgInfo&BKPIMAGE_HAS_HOLE) == 0 && (bimgInfo&BKPIMAGE_IS_COMPRESSED) == 0 && bimgLen != XLOG_BLCKSZ { + record.Fatalf("check failed 4") + } + + if (forkFlags & BKPBLOCK_SAME_REL) == 0 { + // COPY_HEADER_FIELD(&blk->rnode, sizeof(RelFileNode)); + + } + + } + } + + fmt.Printf("mainDataLen = %d, recordOrigin = %d, toplevelXid = %d\n", mainDataLen, recordOrigin, toplevelXid) record.SeekAbs(posMax) } diff --git a/pkg/decode/decode.go b/pkg/decode/decode.go index e13e5a2a4..24e956276 100644 --- a/pkg/decode/decode.go +++ b/pkg/decode/decode.go @@ -755,6 +755,26 @@ func (d *D) FieldGet(name string) *Value { return nil } +func (d *D) FieldGetScalar(name string) *scalar.S { + v := d.FieldGet(name) + if v == nil { + return nil + } + sr, ok := v.V.(*scalar.S) + if !ok { + panic("not a scalar value") + } + return sr +} + +func (d *D) FieldTryGetScalarActualU(name string) (bool, uint64) { + sr := d.FieldGetScalar(name) + if sr == nil { + return false, 0 + } + return true, sr.ActualU() +} + func (d *D) FieldMustGet(name string) *Value { if v := d.FieldGet(name); v != nil { return v From 09c42c3551fe713530a7eacfaef37fdbdff9a657 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 16 Sep 2022 16:31:13 +0300 Subject: [PATCH 066/141] postgres: add state to wal struct --- format/postgres/flavours/postgres14/pg_wal.go | 53 +++++++++---------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/format/postgres/flavours/postgres14/pg_wal.go b/format/postgres/flavours/postgres14/pg_wal.go index f74d2b501..5b3f7f4e4 100644 --- a/format/postgres/flavours/postgres14/pg_wal.go +++ b/format/postgres/flavours/postgres14/pg_wal.go @@ -142,6 +142,10 @@ type walD struct { pageRecords *decode.D + state *walState +} + +type walState struct { record *decode.D recordRemLenBytes int64 } @@ -149,10 +153,9 @@ type walD struct { func DecodePgwal(d *decode.D, maxOffset uint32) any { pages := d.FieldArrayValue("Pages") wal := &walD{ - maxOffset: int64(maxOffset), - pages: pages, - records: d.FieldArrayValue("Records"), - recordRemLenBytes: -1, // -1 means not initialized + maxOffset: int64(maxOffset), + pages: pages, + records: d.FieldArrayValue("Records"), } for { @@ -210,9 +213,9 @@ func decodeXLogPage(wal *walD, d *decode.D) { }) } - if wal.recordRemLenBytes >= 0 { // check recordRemLenBytes is initialized - if wal.recordRemLenBytes != int64(remLenBytes) { - d.Fatalf("incorrect wal.recordRemLenBytes = %d, remLenBytes = %d", wal.recordRemLenBytes, remLenBytes) + if wal.state != nil { // check recordRemLenBytes is initialized + if wal.state.recordRemLenBytes != int64(remLenBytes) { + d.Fatalf("recordRemLenBytes = %d != remLenBytes = %d", wal.state.recordRemLenBytes, remLenBytes) } } @@ -224,7 +227,7 @@ func decodeXLogPage(wal *walD, d *decode.D) { // parted XLogRecord if remLen > 0 { - if wal.record == nil { + if wal.state == nil { // record of previous file checkPosBytes := xLogPage.Pos() / 8 if checkPosBytes >= XLOG_BLCKSZ { @@ -239,8 +242,8 @@ func decodeXLogPage(wal *walD, d *decode.D) { pos2 := xLogPage.Pos() - if wal.record != nil { - wal.record.SeekAbs(pos1) + if wal.state != nil && wal.state.record != nil { + wal.state.record.SeekAbs(pos1) } xLogPage.SeekAbs(pos2) @@ -282,15 +285,16 @@ func decodeXLogRecords(wal *walD, d *decode.D) { // can't read xl_tot_len on this page // can't create row in this page // continue on next page - wal.record = nil - wal.recordRemLenBytes = 0 + wal.state = nil return } d.SeekAbs(posBytes1Aligned * 8) record := pageRecords.FieldStructValue("XLogRecord") - wal.record = record + wal.state = &walState{ + record: record, + } wal.records.AddChild(record.Value) xlTotLen := record.FieldU32("xl_tot_len") @@ -305,7 +309,7 @@ func decodeXLogRecords(wal *walD, d *decode.D) { if remOnPage < int64(xlTotLen1Bytes) { //record.FieldRawLen("xLogBody", remOnPage*8) decodeXLogRecord(wal, remOnPage) - wal.recordRemLenBytes = int64(xlTotLen1Bytes) - remOnPage + wal.state.recordRemLenBytes = int64(xlTotLen1Bytes) - remOnPage break } @@ -316,8 +320,7 @@ func decodeXLogRecords(wal *walD, d *decode.D) { //record.FieldRawLen("xLogBody", xLogBodyLen) decodeXLogRecord(wal, int64(xlTotLen1Bytes)) - wal.record = nil - wal.recordRemLenBytes = 0 + wal.state = nil } } @@ -359,7 +362,7 @@ func fieldTryGetScalarActualU(d *decode.D, name string, posMax int64, bitsCount } func decodeXLogRecord(wal *walD, maxBytes int64) { - record := wal.record + record := wal.state.record pos0 := record.Pos() maxLen := maxBytes * 8 @@ -441,16 +444,6 @@ func decodeXLogRecord(wal *walD, maxBytes int64) { return } - if blockId == XLR_BLOCK_ID_DATA_SHORT { - //typedef struct XLogRecordDataHeaderShort - //{ - // uint8 id; /* XLR_BLOCK_ID_DATA_SHORT */ - // uint8 data_length; /* number of payload bytes */ - //} - // - /* total size (bytes): 24 */ - } - //XLR_BLOCK_ID_DATA_SHORT = 255 //XLR_BLOCK_ID_DATA_LONG = 254 //XLR_BLOCK_ID_ORIGIN = 253 @@ -460,6 +453,12 @@ func decodeXLogRecord(wal *walD, maxBytes int64) { recordOrigin := uint64(0) toplevelXid := uint64(0) if blockId == XLR_BLOCK_ID_DATA_SHORT { + //typedef struct XLogRecordDataHeaderShort + //{ + // uint8 id; /* XLR_BLOCK_ID_DATA_SHORT */ + // uint8 data_length; /* number of payload bytes */ + //} + // // COPY_HEADER_FIELD(&main_data_len, sizeof(uint8)); mainDataLen, end = fieldTryGetScalarActualU(record, "main_data_len", posMax, 8) if end { From d7bcca0a4a2bf74e48f731365c61087795ae4056 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 16 Sep 2022 17:15:56 +0300 Subject: [PATCH 067/141] postgres: refactoring --- format/postgres/flavours/postgres14/pg_wal.go | 248 ++---------------- .../flavours/postgres14/pg_wal_test.go | 31 --- format/postgres/pg_wal.go | 8 +- format/postgres/pg_wal_test.go | 1 + 4 files changed, 23 insertions(+), 265 deletions(-) delete mode 100644 format/postgres/flavours/postgres14/pg_wal_test.go diff --git a/format/postgres/flavours/postgres14/pg_wal.go b/format/postgres/flavours/postgres14/pg_wal.go index d916523bb..91588af64 100644 --- a/format/postgres/flavours/postgres14/pg_wal.go +++ b/format/postgres/flavours/postgres14/pg_wal.go @@ -1,69 +1,15 @@ package postgres14 import ( - "fmt" "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" - "github.com/wader/fq/pkg/scalar" ) //nolint:revive const ( - XLOG_BLCKSZ = 8192 - XLP_LONG_HEADER = 2 -) - -//nolint:revive -const ( - BKPBLOCK_FORK_MASK = 0x0F - /* block data is an XLogRecordBlockImage */ - BKPBLOCK_HAS_IMAGE = 0x10 - BKPBLOCK_HAS_DATA = 0x20 - /* redo will re-init the page */ - BKPBLOCK_WILL_INIT = 0x40 - /* RelFileNode omitted, same as previous */ - BKPBLOCK_SAME_REL = 0x80 -) - -/* Information stored in bimg_info */ -//nolint:revive -const ( - /* page image has "hole" */ - BKPIMAGE_HAS_HOLE = 0x01 - /* page image is compressed */ - BKPIMAGE_IS_COMPRESSED = 0x02 - /* page image should be restored during replay */ - BKPIMAGE_APPLY = 0x04 -) - -var rmgrIds = scalar.UToScalar{ - 0: {Sym: "XLOG", Description: "RM_XLOG_ID"}, - 1: {Sym: "Transaction", Description: "RM_XACT_ID"}, - 2: {Sym: "Storage", Description: "RM_SMGR_ID"}, - 3: {Sym: "CLOG", Description: "RM_CLOG_ID"}, - 4: {Sym: "Database", Description: "RM_DBASE_ID"}, - 5: {Sym: "Tablespace", Description: "RM_TBLSPC_ID"}, - 6: {Sym: "MultiXact", Description: "RM_MULTIXACT_ID"}, - 7: {Sym: "RelMap", Description: "RM_RELMAP_ID"}, - 8: {Sym: "Standby", Description: "RM_STANDBY_ID"}, - 9: {Sym: "Heap2", Description: "RM_HEAP2_ID"}, - 10: {Sym: "Heap", Description: "RM_HEAP_ID"}, - 11: {Sym: "Btree", Description: "RM_BTREE_ID"}, - 12: {Sym: "Hash", Description: "RM_HASH_ID"}, - 13: {Sym: "Gin", Description: "RM_GIN_ID"}, - 14: {Sym: "Gist", Description: "RM_GIST_ID"}, - 15: {Sym: "Sequence", Description: "RM_SEQ_ID"}, - 16: {Sym: "SPGist", Description: "RM_SPGIST_ID"}, - 17: {Sym: "BRIN", Description: "RM_BRIN_ID"}, - 18: {Sym: "CommitTs", Description: "RM_COMMIT_TS_ID"}, - 19: {Sym: "ReplicationOrigin", Description: "RM_REPLORIGIN_ID"}, - 20: {Sym: "Generic", Description: "RM_GENERIC_ID"}, - 21: {Sym: "LogicalMessage", Description: "RM_LOGICALMSG_ID"}, -} - -const ( - XLOG_PAGE_MAGIC_MASK = 0xD000 - XLOG_PAGE_MAGIC_POSTGRES14 = 0xD10D + XLOG_BLCKSZ = 8192 + XLP_LONG_HEADER = 2 + XLOG_PAGE_MAGIC_MASK = 0xD000 ) // struct XLogLongPageHeaderData { @@ -93,37 +39,9 @@ const ( /* 17 | 1 */ // RmgrId xl_rmid /* XXX 2-byte hole */ /* 20 | 4 */ // pg_crc32c xl_crc - +// /* total size (bytes): 24 */ -func decodeXLogPageHeaderData(d *decode.D) { - /* 0 | 2 */ // uint16 xlp_magic; - /* 2 | 2 */ // uint16 xlp_info; - /* 4 | 4 */ // TimeLineID xlp_tli; - /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; - /* 16 | 4 */ // uint32 xlp_rem_len; - /* XXX 4-byte padding */ - xlpMagic := d.FieldU16("xlp_magic") - xlpInfo := d.FieldU16("xlp_info") - d.FieldU32("xlp_timeline") - d.FieldU64("xlp_pageaddr") - d.FieldU32("xlp_rem_len") - d.FieldU32("padding0") - - if (xlpMagic & XLOG_PAGE_MAGIC_MASK) == 0 { - d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) - } - - if xlpInfo&XLP_LONG_HEADER != 0 { - // Long header - d.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { - d.FieldU64("xlp_sysid") - d.FieldU32("xlp_seg_size") - d.FieldU32("xlp_xlog_blcksz") - }) - } -} - type walD struct { maxOffset int64 @@ -137,11 +55,11 @@ type walD struct { } func DecodePgwal(d *decode.D, maxOffset uint32) any { - pages := d.FieldArrayValue("Pages") + pages := d.FieldArrayValue("pages") wal := &walD{ maxOffset: int64(maxOffset), pages: pages, - records: d.FieldArrayValue("Records"), + records: d.FieldArrayValue("records"), recordRemLenBytes: -1, // -1 means not initialized } @@ -169,7 +87,7 @@ func DecodePgwal(d *decode.D, maxOffset uint32) any { func decodeXLogPage(wal *walD, d *decode.D) { - xLogPage := d.FieldStructValue("Page") + xLogPage := d.FieldStructValue("page") // type = struct XLogPageHeaderData { /* 0 | 2 */ // uint16 xlp_magic; @@ -178,7 +96,7 @@ func decodeXLogPage(wal *walD, d *decode.D) { /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; /* 16 | 4 */ // uint32 xlp_rem_len; /* XXX 4-byte padding */ - header := xLogPage.FieldStructValue("XLogPageHeaderData") + header := xLogPage.FieldStructValue("xlog_page_header_data") xlpMagic := header.FieldU16("xlp_magic") xlpInfo := header.FieldU16("xlp_info") @@ -193,7 +111,7 @@ func decodeXLogPage(wal *walD, d *decode.D) { if xlpInfo&XLP_LONG_HEADER != 0 { // Long header - header.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { + header.FieldStruct("xlog_long_page_header_data", func(d *decode.D) { d.FieldU64("xlp_sysid") d.FieldU32("xlp_seg_size") d.FieldU32("xlp_xlog_blcksz") @@ -220,7 +138,7 @@ func decodeXLogPage(wal *walD, d *decode.D) { if checkPosBytes >= XLOG_BLCKSZ { d.Fatalf("invalid pos for RawBytesOfPreviousWalFile, it must be on first page only, pos = %d\n", checkPosBytes) } - xLogPage.FieldRawLen("RawBytesOfPreviousWalFile", remLen) + xLogPage.FieldRawLen("raw_bytes_of_previous_wal_file", remLen) } else { // record of previous page decodeXLogRecord(wal, remLenBytesAligned) @@ -234,7 +152,7 @@ func decodeXLogPage(wal *walD, d *decode.D) { } xLogPage.SeekAbs(pos2) - pageRecords := xLogPage.FieldArrayValue("Records") + pageRecords := xLogPage.FieldArrayValue("records") wal.pageRecords = pageRecords @@ -246,7 +164,6 @@ func decodeXLogRecords(wal *walD, d *decode.D) { posBytes := d.Pos() / 8 posMaxOfPageBytes := int64(common.TypeAlign(XLOG_BLCKSZ, uint64(posBytes))) - fmt.Printf("posMaxOfPageBytes = %d\n", posMaxOfPageBytes) for { /* 0 | 4 */ // uint32 xl_tot_len @@ -280,17 +197,12 @@ func decodeXLogRecords(wal *walD, d *decode.D) { d.SeekAbs(posBytes1Aligned * 8) - record := pageRecords.FieldStructValue("XLogRecord") + record := pageRecords.FieldStructValue("xlog_record") wal.record = record wal.records.AddChild(record.Value) - //xLogRecordBegin := record.Pos() xlTotLen := record.FieldU32("xl_tot_len") - xlTotLen1Bytes := xlTotLen - 4 - //xlTotLen1 := xlTotLen1Bytes * 8 - - //pos2 := d.Pos() pos2Bytes := d.Pos() / 8 remOnPage := posMaxOfPageBytes - pos2Bytes @@ -299,7 +211,6 @@ func decodeXLogRecords(wal *walD, d *decode.D) { } if remOnPage < int64(xlTotLen1Bytes) { - //record.FieldRawLen("xLogBody", remOnPage*8) decodeXLogRecord(wal, remOnPage) wal.recordRemLenBytes = int64(xlTotLen1Bytes) - remOnPage break @@ -310,37 +221,9 @@ func decodeXLogRecords(wal *walD, d *decode.D) { d.Fatalf("xlTotLen1Bytes is negative, xLogBodyLen = %d\n", xLogBodyLen) } - //record.FieldRawLen("xLogBody", xLogBodyLen) decodeXLogRecord(wal, int64(xlTotLen1Bytes)) wal.record = nil wal.recordRemLenBytes = 0 - - //xLogRecordBegin := record.Pos() - //xlTotLen := record.FieldU32("xl_tot_len") - //record.FieldU32("xl_xid") - //record.FieldU64("xl_prev") - //record.FieldU8("xl_info") - //record.FieldU8("xl_rmid") - //record.U16() - //record.FieldU32("xl_crc") - //xLogRecordEnd := record.Pos() - //sizeOfXLogRecord := (xLogRecordEnd - xLogRecordBegin) / 8 - // - //xLogRecordBodyLen := xlTotLen - uint64(sizeOfXLogRecord) - // - //rawLen := int64(common.TypeAlign8(xLogRecordBodyLen)) - //pos1Bytes := d.Pos() / 8 - // - //remOnPage := posMaxOfPageBytes - pos1Bytes - //if remOnPage < rawLen { - // record.FieldRawLen("xLogBody", remOnPage*8) - // wal.recordRemLenBytes = rawLen - remOnPage - // break - //} - // - //record.FieldRawLen("xLogBody", rawLen*8) - //wal.recordRemLenBytes = -1 - } } @@ -361,12 +244,12 @@ func decodeXLogRecord(wal *walD, maxBytes int64) { pos0 := record.Pos() maxLen := maxBytes * 8 - if record.FieldGet("xLogBody0") == nil { + if record.FieldGet("xlog_body0") == nil { // body on first page - record.FieldRawLen("xLogBody0", maxLen) + record.FieldRawLen("xlog_body0", maxLen) } else { // body on second page - record.FieldRawLen("xLogBody1", maxLen) + record.FieldRawLen("xlog_body1", maxLen) } pos1 := record.Pos() posMax := pos1 @@ -411,11 +294,11 @@ func decodeXLogRecord(wal *walD, maxBytes int64) { record.FieldU8("xl_rmid") } - if record.FieldGet("hole1") == nil { + if record.FieldGet("hole0") == nil { if isEnd(record, posMax, 16) { return } - record.FieldU16("hole1") + record.FieldU16("hole0") } if record.FieldGet("xl_crc") == nil { @@ -429,100 +312,3 @@ func decodeXLogRecord(wal *walD, maxBytes int64) { record.SeekAbs(posMax) } - -func DecodePgwalOri(d *decode.D, in any) any { - d.SeekAbs(0) - - pageHeaders := d.FieldArrayValue("XLogPageHeaders") - header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) - - xlpRemLen, ok := header.FieldGet("xlp_rem_len").V.(uint32) - if !ok { - d.Fatalf("can't get xlp_rem_len\n") - } - - d.FieldRawLen("prev_file_rec", int64(xlpRemLen*8)) - d.FieldRawLen("prev_file_rec_padding", int64(d.AlignBits(64))) - - d.FieldArray("XLogRecords", func(d *decode.D) { - for { - d.FieldStruct("XLogRecord", func(d *decode.D) { - recordPos := uint64(d.Pos()) >> 3 - recordLen := d.FieldU32("xl_tot_len") - recordEnd := recordPos + recordLen - headerPos := recordEnd - recordEnd%XLOG_BLCKSZ - d.FieldU32("xl_xid") - d.FieldU64("xl_prev", scalar.ActualHex) - d.FieldU8("xl_info") - d.FieldU8("xl_rmid", rmgrIds) - d.FieldRawLen("padding", int64(d.AlignBits(32))) - d.FieldU32("xl_crc", scalar.ActualHex) - - var lengths []uint64 - - d.FieldArray("XLogRecordBlockHeader", func(d *decode.D) { - for blkheaderid := uint64(0); d.PeekBits(8) == blkheaderid; blkheaderid++ { - d.FieldStruct("XlogRecordBlockHeader", func(d *decode.D) { - /* block reference ID */ - d.FieldU8("id", d.AssertU(blkheaderid)) - /* fork within the relation, and flags */ - forkFlags := d.FieldU8("fork_flags") - /* number of payload bytes (not including page image) */ - lengths = append(lengths, d.FieldU16("data_length")) - if forkFlags&BKPBLOCK_HAS_IMAGE != 0 { - d.FieldStruct("XLogRecordBlockImageHeader", func(d *decode.D) { - /* number of page image bytes */ - d.FieldU16("length") - /* number of bytes before "hole" */ - d.FieldU16("hole_offset") - /* flag bits, see below */ - bimgInfo := d.FieldU8("bimg_info") - d.FieldRawLen("padding", int64(d.AlignBits(16))) - if bimgInfo&BKPIMAGE_HAS_HOLE != 0 && - bimgInfo&BKPIMAGE_IS_COMPRESSED != 0 { - d.FieldU16("hole_length") - } - }) - } - if forkFlags&BKPBLOCK_SAME_REL == 0 { - d.FieldStruct("RelFileNode", func(d *decode.D) { - /* tablespace */ - d.FieldU32("spcNode") - /* database */ - d.FieldU32("dbNode") - /* relation */ - d.FieldU32("relNode") - }) - d.FieldU32("BlockNum") - } - }) - } - }) - if d.PeekBits(8) == 0xff { - d.FieldStruct("XLogRecordDataHeaderShort", func(d *decode.D) { - d.FieldU8("id", d.AssertU(0xff)) - lengths = append(lengths, d.FieldU8("data_length")) - }) - } - - d.FieldArray("data", func(d *decode.D) { - for _, x := range lengths { - pos := uint64(d.Pos()) >> 3 - if pos < headerPos && (headerPos < pos+x) { - d.FieldRawLen("data", int64((headerPos-pos)*8)) - header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) - _ = header.FieldGet("xlp_rem_len").TryScalarFn(d.ValidateU(recordEnd - headerPos)) - d.FieldRawLen("data", int64((x+pos-headerPos)*8)) - } else { - d.FieldRawLen("data", int64(x*8)) - } - } - }) - - d.FieldRawLen("ending_padding", int64(d.AlignBits(64))) - }) - } - }) - - return nil -} diff --git a/format/postgres/flavours/postgres14/pg_wal_test.go b/format/postgres/flavours/postgres14/pg_wal_test.go deleted file mode 100644 index 02eafacac..000000000 --- a/format/postgres/flavours/postgres14/pg_wal_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package postgres14_test - -import ( - "github.com/wader/fq/format/postgres/flavours/postgres14" - "testing" -) - -func TestParseLsn(t *testing.T) { - lsn1, err := postgres14.ParseLsn("0/4E394440") - if err != nil { - t.Fatalf("TestParseLsn 1, err = %v\n", err) - } - if lsn1 != 0x4E394440 { - t.Fatalf("TestParseLsn 2, invalid lsn value\n") - } - - lsn2, err := postgres14.ParseLsn("0/4469E930") - if err != nil { - t.Fatalf("TestParseLsn 3, err = %v\n", err) - } - if lsn2 != 0x4469E930 { - t.Fatalf("TestParseLsn 4, invalid lsn value\n") - } -} - -func TestXLogSegmentOffset(t *testing.T) { - offset := postgres14.XLogSegmentOffset(0x4E394440) - if offset == 0 { - t.Fatalf("TestXLogSegmentOffset 1, invalid offset\n") - } -} diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index c308d98f5..fcc0d4590 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -1,12 +1,13 @@ package postgres import ( - "errors" "fmt" + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" + "strconv" "strings" ) @@ -26,7 +27,8 @@ func init() { }) } -//// https://pgpedia.info/x/XLOG_PAGE_MAGIC.html +// https://pgpedia.info/x/XLOG_PAGE_MAGIC.html +//nolint:revive const ( XLOG_PAGE_MAGIC_15 = uint16(0xD10F) XLOG_PAGE_MAGIC_14 = uint16(0xD10D) @@ -43,7 +45,7 @@ func ParseLsn(lsn string) (uint32, error) { if strings.Contains(lsn, "/") { parts := strings.Split(lsn, "/") if len(parts) != 2 { - return 0, errors.New(fmt.Sprintf("Invalid lsn = %s", lsn)) + return 0, fmt.Errorf("invalid lsn = %s", lsn) } str1 = parts[1] } diff --git a/format/postgres/pg_wal_test.go b/format/postgres/pg_wal_test.go index 71c5fdcf9..40e11ddf1 100644 --- a/format/postgres/pg_wal_test.go +++ b/format/postgres/pg_wal_test.go @@ -2,6 +2,7 @@ package postgres_test import ( "github.com/wader/fq/format/postgres" + "testing" ) From dd84d3218c21bac59faab0d5635f55ce1b154506 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 19 Sep 2022 15:45:54 +0300 Subject: [PATCH 068/141] postgres: pg_btree begin impl --- format/format.go | 1 + .../postgres/flavours/postgres14/pg_btree.go | 146 ++++++++++++++++++ format/postgres/pg_btree.go | 37 +++++ 3 files changed, 184 insertions(+) create mode 100644 format/postgres/flavours/postgres14/pg_btree.go create mode 100644 format/postgres/pg_btree.go diff --git a/format/format.go b/format/format.go index 55ac3181f..ddb8aaedc 100644 --- a/format/format.go +++ b/format/format.go @@ -103,6 +103,7 @@ const ( OPUS_PACKET = "opus_packet" PCAP = "pcap" PCAPNG = "pcapng" + PG_BTREE = "pg_btree" PG_WAL = "pg_wal" PG_WALPAGE = "pg_wal_page" PG_MULTIXACTOFF = "pg_multixact_offsets" diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/flavours/postgres14/pg_btree.go new file mode 100644 index 000000000..04dbc9f6a --- /dev/null +++ b/format/postgres/flavours/postgres14/pg_btree.go @@ -0,0 +1,146 @@ +package postgres14 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" +) + +const ( + BTREE_MAGIC = 0x053162 +) + +// struct BTMetaPageData { +/* 0 | 4 */ // uint32 btm_magic +/* 4 | 4 */ // uint32 btm_version +/* 8 | 4 */ // BlockNumber btm_root +/* 12 | 4 */ // uint32 btm_level +/* 16 | 4 */ // BlockNumber btm_fastroot +/* 20 | 4 */ // uint32 btm_fastlevel +/* 24 | 4 */ // uint32 btm_last_cleanup_num_delpages +/* XXX 4-byte hole */ +/* 32 | 8 */ // float8 btm_last_cleanup_num_heap_tuples +/* 40 | 1 */ // _Bool btm_allequalimage +/* XXX 7-byte padding */ +// +/* total size (bytes): 48 */ + +func DecodePgBTree(d *decode.D) any { + d.SeekAbs(0) + + btree := &BTreeD{ + PageSize: common.HeapPageSize, + } + decodeBTreePages(btree, d) + + return nil +} + +type BTreeD struct { + PageSize uint64 + page *BTreePage +} + +type BTreePage struct { + heap HeapPage + bytesPosBegin uint64 // bytes pos of page's beginning + bytesPosEnd uint64 // bytes pos of page's ending + bytesPosSpecial uint64 // bytes pos of page's special +} + +type HeapPage struct { + PdLower uint16 + PdUpper uint16 + PdSpecial uint16 + PdPagesizeVersion uint16 +} + +func decodeBTreePages(btree *BTreeD, d *decode.D) { + for i := 0; ; i++ { + if end, _ := d.TryEnd(); end { + return + } + + page := &BTreePage{} + if btree.page != nil { + // use prev page + page.bytesPosBegin = btree.page.bytesPosEnd + } + page.bytesPosEnd = common.TypeAlign(btree.PageSize, page.bytesPosBegin+1) + btree.page = page + + if i == 0 { + // first page contains meta information + d.FieldStruct("heap_page", func(d *decode.D) { + decodeBTreeMetaPage(btree, d) + }) + continue + } + + if i > 0 { + return + } + } +} + +func decodeBTreeMetaPage(btree *BTreeD, d *decode.D) { + d.FieldStruct("page_header", func(d *decode.D) { + decodePageHeader(btree, d) + }) + d.FieldStruct("meta_page_data", func(d *decode.D) { + decodeBTMetaPageData(btree, d) + }) +} + +func decodePageHeader(btree *BTreeD, d *decode.D) { + heap := btree.page.heap + + d.FieldStruct("pd_lsn", func(d *decode.D) { + /* 0 | 4 */ // uint32 xlogid; + /* 4 | 4 */ // uint32 xrecoff; + d.FieldU32("xlogid", common.HexMapper) + d.FieldU32("xrecoff", common.HexMapper) + }) + d.FieldU16("pd_checksum") + d.FieldU16("pd_flags") + heap.PdLower = uint16(d.FieldU16("pd_lower")) + heap.PdUpper = uint16(d.FieldU16("pd_upper")) + heap.PdSpecial = uint16(d.FieldU16("pd_special")) + heap.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) + d.FieldU32("pd_prune_xid") + + // ItemIdData pd_linp[]; + //page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) + //d.FieldArray("pd_linp", func(d *decode.D) { + // DecodeItemIds(heap, d) + //}) +} + +func decodeBTMetaPageData(btree *BTreeD, d *decode.D) { + /* 0 | 4 */ // uint32 btm_magic + /* 4 | 4 */ // uint32 btm_version + /* 8 | 4 */ // BlockNumber btm_root + /* 12 | 4 */ // uint32 btm_level + /* 16 | 4 */ // BlockNumber btm_fastroot + /* 20 | 4 */ // uint32 btm_fastlevel + /* 24 | 4 */ // uint32 btm_last_cleanup_num_delpages + /* XXX 4-byte hole */ + /* 32 | 8 */ // float8 btm_last_cleanup_num_heap_tuples + /* 40 | 1 */ // _Bool btm_allequalimage + /* XXX 7-byte padding */ + + btmMagic := d.FieldU32("btm_magic") + d.FieldU32("btm_version") + d.FieldU32("btm_root") + d.FieldU32("btm_level") + d.FieldU32("btm_fastroot") + d.FieldU32("btm_fastlevel") + d.FieldU32("btm_last_cleanup_num_delpages") + d.FieldU32("hole0") + d.FieldF64("btm_last_cleanup_num_heap_tuples") + d.FieldU8("btm_allequalimage") + d.FieldU56("padding0") + + if btmMagic != BTREE_MAGIC { + d.Fatalf("invalid btmMagic = %X, must be %X\n", btmMagic, BTREE_MAGIC) + } +} diff --git a/format/postgres/pg_btree.go b/format/postgres/pg_btree.go new file mode 100644 index 000000000..ac62406b3 --- /dev/null +++ b/format/postgres/pg_btree.go @@ -0,0 +1,37 @@ +package postgres + +import ( + "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/postgres14" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/interp" +) + +func init() { + interp.RegisterFormat(decode.Format{ + Name: format.PG_BTREE, + Description: "PostgreSQL btree index file", + DecodeFn: decodePgBTree, + DecodeInArg: format.PostgresIn{ + Flavour: "default", + }, + RootArray: true, + RootName: "pages", + }) +} + +func decodePgBTree(d *decode.D, in any) any { + d.Endian = decode.LittleEndian + + pgIn, ok := in.(format.PostgresIn) + if !ok { + d.Fatalf("DecodeInArg must be PostgresIn!\n") + } + + switch pgIn.Flavour { + case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: + return postgres14.DecodePgBTree(d) + } + + return nil +} From 22a6cfa572b854ef875549b1fd297ffb42487884 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 19 Sep 2022 17:10:18 +0300 Subject: [PATCH 069/141] postgres: pg_btree add opaque flags --- .../postgres/flavours/postgres14/pg_btree.go | 90 +++++++++++++++++-- 1 file changed, 85 insertions(+), 5 deletions(-) diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/flavours/postgres14/pg_btree.go index 04dbc9f6a..5ebc97d60 100644 --- a/format/postgres/flavours/postgres14/pg_btree.go +++ b/format/postgres/flavours/postgres14/pg_btree.go @@ -7,6 +7,18 @@ import ( const ( BTREE_MAGIC = 0x053162 + P_NONE = 0 + + /* Bits defined in btpo_flags */ + BTP_LEAF = 1 << 0 /* leaf page, i.e. not internal page */ + BTP_ROOT = 1 << 1 /* root page (has no parent) */ + BTP_DELETED = 1 << 2 /* page has been deleted from tree */ + BTP_META = 1 << 3 /* meta-page */ + BTP_HALF_DEAD = 1 << 4 /* empty, but still in tree */ + BTP_SPLIT_END = 1 << 5 /* rightmost page of split group */ + BTP_HAS_GARBAGE = 1 << 6 /* page has LP_DEAD tuples (deprecated) */ + BTP_INCOMPLETE_SPLIT = 1 << 7 /* right sibling's downlink is missing */ + BTP_HAS_FULLXID = 1 << 8 /* contains BTDeletedPageData */ ) // struct BTMetaPageData { @@ -24,6 +36,15 @@ const ( // /* total size (bytes): 48 */ +// struct BTPageOpaqueData { +/* 0 | 4 */ // BlockNumber btpo_prev; +/* 4 | 4 */ // BlockNumber btpo_next; +/* 8 | 4 */ // uint32 btpo_level; +/* 12 | 2 */ // uint16 btpo_flags; +/* 14 | 2 */ // BTCycleId btpo_cycleid; +// +/* total size (bytes): 16 */ + func DecodePgBTree(d *decode.D) any { d.SeekAbs(0) @@ -42,9 +63,9 @@ type BTreeD struct { type BTreePage struct { heap HeapPage - bytesPosBegin uint64 // bytes pos of page's beginning - bytesPosEnd uint64 // bytes pos of page's ending - bytesPosSpecial uint64 // bytes pos of page's special + bytesPosBegin int64 // bytes pos of page's beginning + bytesPosEnd int64 // bytes pos of page's ending + bytesPosSpecial int64 // bytes pos of page's special } type HeapPage struct { @@ -65,7 +86,7 @@ func decodeBTreePages(btree *BTreeD, d *decode.D) { // use prev page page.bytesPosBegin = btree.page.bytesPosEnd } - page.bytesPosEnd = common.TypeAlign(btree.PageSize, page.bytesPosBegin+1) + page.bytesPosEnd = int64(common.TypeAlign(btree.PageSize, uint64(page.bytesPosBegin)+1)) btree.page = page if i == 0 { @@ -83,16 +104,33 @@ func decodeBTreePages(btree *BTreeD, d *decode.D) { } func decodeBTreeMetaPage(btree *BTreeD, d *decode.D) { + page := btree.page + d.FieldStruct("page_header", func(d *decode.D) { decodePageHeader(btree, d) }) d.FieldStruct("meta_page_data", func(d *decode.D) { decodeBTMetaPageData(btree, d) }) + + pos0 := d.Pos() + pos1 := int64(btree.page.bytesPosSpecial) * 8 + d.SeekAbs(pos1) + d.FieldStruct("page_opaque_data", func(d *decode.D) { + decodeBTPageOpaqueData(btree, d) + }) + pos2 := d.Pos() + bytesPos2 := pos2 / 8 + if bytesPos2 != page.bytesPosEnd { + d.Fatalf("invalid pos after read page_opaque_data\n") + } + + d.SeekAbs(pos0) } func decodePageHeader(btree *BTreeD, d *decode.D) { - heap := btree.page.heap + page := btree.page + heap := page.heap d.FieldStruct("pd_lsn", func(d *decode.D) { /* 0 | 4 */ // uint32 xlogid; @@ -108,6 +146,8 @@ func decodePageHeader(btree *BTreeD, d *decode.D) { heap.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) d.FieldU32("pd_prune_xid") + page.bytesPosSpecial = page.bytesPosBegin + int64(heap.PdSpecial) + // ItemIdData pd_linp[]; //page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) //d.FieldArray("pd_linp", func(d *decode.D) { @@ -144,3 +184,43 @@ func decodeBTMetaPageData(btree *BTreeD, d *decode.D) { d.Fatalf("invalid btmMagic = %X, must be %X\n", btmMagic, BTREE_MAGIC) } } + +// struct BTPageOpaqueData { +/* 0 | 4 */ // BlockNumber btpo_prev; +/* 4 | 4 */ // BlockNumber btpo_next; +/* 8 | 4 */ // uint32 btpo_level; +/* 12 | 2 */ // uint16 btpo_flags; +/* 14 | 2 */ // BTCycleId btpo_cycleid; +func decodeBTPageOpaqueData(btree *BTreeD, d *decode.D) { + prev := d.FieldU32("btpo_prev") + next := d.FieldU32("btpo_next") + d.FieldU32("btpo_level") + flags := d.FieldU16("btpo_flags") + d.FieldU16("btpo_cycleid") + + isLeftMost := prev == P_NONE + isRightMost := next == P_NONE + isLeaf := (flags & BTP_LEAF) != 0 + isRoot := (flags & BTP_ROOT) != 0 + isDeleted := (flags & BTP_DELETED) != 0 + isMeta := (flags & BTP_META) != 0 + isHalfDead := (flags & BTP_HALF_DEAD) != 0 + isIgnore := isDeleted || isHalfDead + hasGarbage := (flags & BTP_HAS_GARBAGE) != 0 + isIncompleteSplit := (flags & BTP_INCOMPLETE_SPLIT) != 0 + hasFullXid := (flags & BTP_HAS_FULLXID) != 0 + + d.FieldStruct("flags", func(d *decode.D) { + d.FieldValueBool("is_leftmost", isLeftMost) + d.FieldValueBool("is_right_most", isRightMost) + d.FieldValueBool("is_leaf", isLeaf) + d.FieldValueBool("is_root", isRoot) + d.FieldValueBool("is_deleted", isDeleted) + d.FieldValueBool("is_meta", isMeta) + d.FieldValueBool("is_half_dead", isHalfDead) + d.FieldValueBool("is_ignore", isIgnore) + d.FieldValueBool("has_garbage", hasGarbage) + d.FieldValueBool("is_incompleteSplit", isIncompleteSplit) + d.FieldValueBool("has_fullXid", hasFullXid) + }) +} From d370f5d925908c7548b22599faeffec59851aa18 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 20 Sep 2022 10:11:10 +0300 Subject: [PATCH 070/141] postgres: btree impl --- .../flavours/postgres14/common14/heap_page.go | 16 +++ .../flavours/postgres14/common14/pgheap.go | 34 ++---- .../postgres/flavours/postgres14/pg_btree.go | 107 ++++++++++++++---- 3 files changed, 110 insertions(+), 47 deletions(-) create mode 100644 format/postgres/flavours/postgres14/common14/heap_page.go diff --git a/format/postgres/flavours/postgres14/common14/heap_page.go b/format/postgres/flavours/postgres14/common14/heap_page.go new file mode 100644 index 000000000..0cc551962 --- /dev/null +++ b/format/postgres/flavours/postgres14/common14/heap_page.go @@ -0,0 +1,16 @@ +package common14 + +// HeapPage used in tables, indexes... + +// type = struct ItemIdData { +/* 0: 0 | 4 */ // unsigned int lp_off: 15 +/* 1: 7 | 4 */ // unsigned int lp_flags: 2 +/* 2: 1 | 4 */ // unsigned int lp_len: 15 +// +/* total size (bytes): 4 */ + +type ItemIdData struct { + Off uint32 // unsigned int lp_off: 15 + Flags uint32 // unsigned int lp_flags: 2 + Len uint32 // unsigned int lp_len: 15 +} diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index ff89c4ec7..f3969f966 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -66,13 +66,6 @@ const ( /* total size (bytes): 8 */ -// type = struct ItemIdData { -/* 0: 0 | 4 */ // unsigned int lp_off: 15 -/* 1: 7 | 4 */ // unsigned int lp_flags: 2 -/* 2: 1 | 4 */ // unsigned int lp_len: 15 - -/* total size (bytes): 4 */ - // typedef uint16 LocationIndex; // #define SizeOfPageHeaderData (offsetof(PageHeaderData, pd_linp)) @@ -135,7 +128,7 @@ type HeapPageD struct { PdSpecial uint16 PdPagesizeVersion uint16 - ItemIds []itemIDDataD + ItemIds []ItemIdData PagePosBegin uint64 ItemsEnd int64 @@ -150,15 +143,6 @@ type TupleD struct { IsMulti uint64 } -type itemIDDataD struct { - /* 0: 0 | 4 */ // unsigned int lp_off: 15 - /* 1: 7 | 4 */ // unsigned int lp_flags: 2 - /* 2: 1 | 4 */ // unsigned int lp_len: 15 - lpOff uint32 - lpFlags uint32 - lpLen uint32 -} - func DecodeHeap(heap *HeapD, d *decode.D) any { d.SeekAbs(0) decodeHeapPages(heap, d) @@ -260,14 +244,14 @@ func DecodeItemIds(heap *HeapD, d *decode.D) { /* 1: 7 | 4 */ // unsigned int lp_flags: 2 /* 2: 1 | 4 */ // unsigned int lp_len: 15 d.FieldStruct("ItemIdData", func(d *decode.D) { - itemID := itemIDDataD{} + itemID := ItemIdData{} itemPos := d.Pos() - itemID.lpOff = uint32(d.FieldU32("lp_off", common.LpOffMapper)) + itemID.Off = uint32(d.FieldU32("lp_off", common.LpOffMapper)) d.SeekAbs(itemPos) - itemID.lpFlags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) + itemID.Flags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) d.SeekAbs(itemPos) - itemID.lpLen = uint32(d.FieldU32("lp_len", common.LpLenMapper)) + itemID.Len = uint32(d.FieldU32("lp_len", common.LpLenMapper)) page.ItemIds = append(page.ItemIds, itemID) }) @@ -278,15 +262,15 @@ func decodeTuples(heap *HeapD, d *decode.D) { page := heap.Page for i := 0; i < len(page.ItemIds); i++ { id := page.ItemIds[i] - if id.lpOff == 0 || id.lpLen == 0 { + if id.Off == 0 || id.Len == 0 { continue } - if id.lpFlags != common.LP_NORMAL { + if id.Flags != common.LP_NORMAL { continue } - pos := int64(page.PagePosBegin)*8 + int64(id.lpOff)*8 - tupleDataLen := id.lpLen - SizeOfHeapTupleHeaderData + pos := int64(page.PagePosBegin)*8 + int64(id.Off)*8 + tupleDataLen := id.Len - SizeOfHeapTupleHeaderData // seek to tuple with ItemId offset d.SeekAbs(pos) diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/flavours/postgres14/pg_btree.go index 5ebc97d60..6e637e0b4 100644 --- a/format/postgres/flavours/postgres14/pg_btree.go +++ b/format/postgres/flavours/postgres14/pg_btree.go @@ -2,6 +2,7 @@ package postgres14 import ( "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -58,21 +59,26 @@ func DecodePgBTree(d *decode.D) any { type BTreeD struct { PageSize uint64 - page *BTreePage -} - -type BTreePage struct { - heap HeapPage - bytesPosBegin int64 // bytes pos of page's beginning - bytesPosEnd int64 // bytes pos of page's ending - bytesPosSpecial int64 // bytes pos of page's special + page *HeapPage } type HeapPage struct { + // PageHeaderData fields PdLower uint16 PdUpper uint16 PdSpecial uint16 PdPagesizeVersion uint16 + + // calculated bytes positions + bytesPosBegin int64 // bytes pos of page's beginning + bytesPosEnd int64 // bytes pos of page's ending + bytesPosSpecial int64 // bytes pos of page's special + + // calculated bits positions + posItemsEnd int64 // bits pos of items end + + // parsed items positions + ItemIds []common14.ItemIdData } func decodeBTreePages(btree *BTreeD, d *decode.D) { @@ -81,7 +87,7 @@ func decodeBTreePages(btree *BTreeD, d *decode.D) { return } - page := &BTreePage{} + page := &HeapPage{} if btree.page != nil { // use prev page page.bytesPosBegin = btree.page.bytesPosEnd @@ -89,17 +95,25 @@ func decodeBTreePages(btree *BTreeD, d *decode.D) { page.bytesPosEnd = int64(common.TypeAlign(btree.PageSize, uint64(page.bytesPosBegin)+1)) btree.page = page + pos0 := page.bytesPosBegin * 8 + d.SeekAbs(pos0) + if i == 0 { // first page contains meta information - d.FieldStruct("heap_page", func(d *decode.D) { + d.FieldStruct("page", func(d *decode.D) { decodeBTreeMetaPage(btree, d) }) continue } - if i > 0 { - return + if i > 2 { + // limit for dev only + break } + + d.FieldStruct("page", func(d *decode.D) { + decodeBTreePage(btree, d) + }) } } @@ -115,22 +129,19 @@ func decodeBTreeMetaPage(btree *BTreeD, d *decode.D) { pos0 := d.Pos() pos1 := int64(btree.page.bytesPosSpecial) * 8 - d.SeekAbs(pos1) + d.FieldRawLen("unused0", pos1-pos0) d.FieldStruct("page_opaque_data", func(d *decode.D) { decodeBTPageOpaqueData(btree, d) }) pos2 := d.Pos() bytesPos2 := pos2 / 8 if bytesPos2 != page.bytesPosEnd { - d.Fatalf("invalid pos after read page_opaque_data\n") + d.Fatalf("invalid pos after read page_opaque_data on meta page\n") } - - d.SeekAbs(pos0) } func decodePageHeader(btree *BTreeD, d *decode.D) { page := btree.page - heap := page.heap d.FieldStruct("pd_lsn", func(d *decode.D) { /* 0 | 4 */ // uint32 xlogid; @@ -140,13 +151,14 @@ func decodePageHeader(btree *BTreeD, d *decode.D) { }) d.FieldU16("pd_checksum") d.FieldU16("pd_flags") - heap.PdLower = uint16(d.FieldU16("pd_lower")) - heap.PdUpper = uint16(d.FieldU16("pd_upper")) - heap.PdSpecial = uint16(d.FieldU16("pd_special")) - heap.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) + page.PdLower = uint16(d.FieldU16("pd_lower")) + page.PdUpper = uint16(d.FieldU16("pd_upper")) + page.PdSpecial = uint16(d.FieldU16("pd_special")) + page.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) d.FieldU32("pd_prune_xid") - page.bytesPosSpecial = page.bytesPosBegin + int64(heap.PdSpecial) + page.bytesPosSpecial = page.bytesPosBegin + int64(page.PdSpecial) + page.posItemsEnd = (page.bytesPosBegin * 8) + int64(page.PdLower*8) // ItemIdData pd_linp[]; //page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) @@ -224,3 +236,54 @@ func decodeBTPageOpaqueData(btree *BTreeD, d *decode.D) { d.FieldValueBool("has_fullXid", hasFullXid) }) } + +func decodeBTreePage(btree *BTreeD, d *decode.D) { + page := btree.page + + d.FieldStruct("page_header", func(d *decode.D) { + decodePageHeader(btree, d) + }) + + pos0 := d.Pos() + pos1 := int64(btree.page.bytesPosSpecial) * 8 + d.SeekAbs(pos1) + d.FieldStruct("page_opaque_data", func(d *decode.D) { + decodeBTPageOpaqueData(btree, d) + }) + pos2 := d.Pos() + bytesPos2 := pos2 / 8 + if bytesPos2 != page.bytesPosEnd { + d.Fatalf("invalid pos after read page_opaque_data on btree page\n") + } + + d.SeekAbs(pos0) + d.FieldArray("pd_linp", func(d *decode.D) { + decodeItemIds(btree, d) + }) +} + +func decodeItemIds(btree *BTreeD, d *decode.D) { + page := btree.page + + for { + checkPos := d.Pos() + if checkPos >= page.posItemsEnd { + break + } + /* 0: 0 | 4 */ // unsigned int lp_off: 15 + /* 1: 7 | 4 */ // unsigned int lp_flags: 2 + /* 2: 1 | 4 */ // unsigned int lp_len: 15 + d.FieldStruct("ItemIdData", func(d *decode.D) { + itemID := common14.ItemIdData{} + + itemPos := d.Pos() + itemID.Off = uint32(d.FieldU32("lp_off", common.LpOffMapper)) + d.SeekAbs(itemPos) + itemID.Flags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) + d.SeekAbs(itemPos) + itemID.Len = uint32(d.FieldU32("lp_len", common.LpLenMapper)) + + page.ItemIds = append(page.ItemIds, itemID) + }) + } // for pd_linp +} From 87b7acf39a3ccf51881b2942080c666943012deb Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 20 Sep 2022 16:57:24 +0300 Subject: [PATCH 071/141] postgres: btree impl --- .../postgres/flavours/postgres14/pg_btree.go | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/flavours/postgres14/pg_btree.go index 6e637e0b4..4ac5fc942 100644 --- a/format/postgres/flavours/postgres14/pg_btree.go +++ b/format/postgres/flavours/postgres14/pg_btree.go @@ -22,6 +22,17 @@ const ( BTP_HAS_FULLXID = 1 << 8 /* contains BTDeletedPageData */ ) +const ( + INDEX_SIZE_MASK = 0x1FFF + INDEX_AM_RESERVED_BIT = 0x2000 /* reserved for index-AM specific usage */ + INDEX_VAR_MASK = 0x4000 + INDEX_NULL_MASK = 0x8000 +) + +const ( + IndexTupleDataSize = 8 +) + // struct BTMetaPageData { /* 0 | 4 */ // uint32 btm_magic /* 4 | 4 */ // uint32 btm_version @@ -46,6 +57,13 @@ const ( // /* total size (bytes): 16 */ +// struct IndexTupleData { +/* 0 | 6 */ // ItemPointerData t_tid; +/* 6 | 2 */ // unsigned short t_info; +// +// IndexTupleData *IndexTuple; +/* total size (bytes): 8 */ + func DecodePgBTree(d *decode.D) any { d.SeekAbs(0) @@ -260,6 +278,10 @@ func decodeBTreePage(btree *BTreeD, d *decode.D) { d.FieldArray("pd_linp", func(d *decode.D) { decodeItemIds(btree, d) }) + + d.FieldArray("tuples", func(d *decode.D) { + decodeIndexTuples(btree, d) + }) } func decodeItemIds(btree *BTreeD, d *decode.D) { @@ -287,3 +309,57 @@ func decodeItemIds(btree *BTreeD, d *decode.D) { }) } // for pd_linp } + +func decodeIndexTuples(btree *BTreeD, d *decode.D) { + page := btree.page + + for i := 0; i < len(page.ItemIds); i++ { + id := page.ItemIds[i] + if id.Off == 0 || id.Len == 0 { + continue + } + if id.Flags != common.LP_NORMAL { + continue + } + + //pos := int64(page.PagePosBegin)*8 + int64(id.Off)*8 + pos := int64(page.bytesPosBegin)*8 + int64(id.Off)*8 + //tupleDataLen := id.Len - SizeOfHeapTupleHeaderData + + // seek to tuple with ItemId offset + d.SeekAbs(pos) + d.FieldStruct("tuple", func(d *decode.D) { + + // IndexTupleData + d.FieldStruct("index_tuple_data", func(d *decode.D) { + // struct IndexTupleData { + /* 0 | 6 */ // ItemPointerData t_tid; + /* 6 | 2 */ // unsigned short t_info; + // + d.FieldStruct("t_tid", func(d *decode.D) { + /* 0 | 4 */ // BlockIdData ip_blkid; + /* 4 | 2 */ // OffsetNumber ip_posid; + d.FieldU32("ip_blkid") + d.FieldU16("ip_posid") + }) + tInfo := d.FieldU16("t_info") + + size := tInfo & INDEX_SIZE_MASK + hasNulls := (tInfo & INDEX_NULL_MASK) != 0 + hasVarWidths := (tInfo & INDEX_VAR_MASK) != 0 + d.FieldStruct("flags", func(d *decode.D) { + d.FieldValueBool("has_nulls", hasNulls) + d.FieldValueBool("has_var_widths", hasVarWidths) + }) + d.FieldValueU("size", size) + if size < IndexTupleDataSize { + d.Fatalf("invalid size of tuple = %d\n", size) + } + dataSize := size - IndexTupleDataSize + d.FieldRawLen("data", int64(dataSize*8)) + }) + + }) + + } +} From f3f259af2dea42507bc455e6490219e169a64e47 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 20 Sep 2022 17:19:01 +0300 Subject: [PATCH 072/141] postgres: btree add free space --- .../postgres/flavours/postgres14/pg_btree.go | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/flavours/postgres14/pg_btree.go index 4ac5fc942..89087d9db 100644 --- a/format/postgres/flavours/postgres14/pg_btree.go +++ b/format/postgres/flavours/postgres14/pg_btree.go @@ -4,6 +4,7 @@ import ( "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" ) const ( @@ -93,7 +94,8 @@ type HeapPage struct { bytesPosSpecial int64 // bytes pos of page's special // calculated bits positions - posItemsEnd int64 // bits pos of items end + posItemsEnd int64 // bits pos of items end + posFreeSpaceEnd int64 // bits pos free space end // parsed items positions ItemIds []common14.ItemIdData @@ -177,12 +179,7 @@ func decodePageHeader(btree *BTreeD, d *decode.D) { page.bytesPosSpecial = page.bytesPosBegin + int64(page.PdSpecial) page.posItemsEnd = (page.bytesPosBegin * 8) + int64(page.PdLower*8) - - // ItemIdData pd_linp[]; - //page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) - //d.FieldArray("pd_linp", func(d *decode.D) { - // DecodeItemIds(heap, d) - //}) + page.posFreeSpaceEnd = (page.bytesPosBegin * 8) + int64(page.PdUpper*8) } func decodeBTMetaPageData(btree *BTreeD, d *decode.D) { @@ -242,7 +239,7 @@ func decodeBTPageOpaqueData(btree *BTreeD, d *decode.D) { d.FieldStruct("flags", func(d *decode.D) { d.FieldValueBool("is_leftmost", isLeftMost) - d.FieldValueBool("is_right_most", isRightMost) + d.FieldValueBool("is_rightmost", isRightMost) d.FieldValueBool("is_leaf", isLeaf) d.FieldValueBool("is_root", isRoot) d.FieldValueBool("is_deleted", isDeleted) @@ -250,8 +247,8 @@ func decodeBTPageOpaqueData(btree *BTreeD, d *decode.D) { d.FieldValueBool("is_half_dead", isHalfDead) d.FieldValueBool("is_ignore", isIgnore) d.FieldValueBool("has_garbage", hasGarbage) - d.FieldValueBool("is_incompleteSplit", isIncompleteSplit) - d.FieldValueBool("has_fullXid", hasFullXid) + d.FieldValueBool("is_incomplete_split", isIncompleteSplit) + d.FieldValueBool("has_full_xid", hasFullXid) }) } @@ -308,6 +305,13 @@ func decodeItemIds(btree *BTreeD, d *decode.D) { page.ItemIds = append(page.ItemIds, itemID) }) } // for pd_linp + + pos0 := d.Pos() + if pos0 > page.posFreeSpaceEnd { + d.Fatalf("items overflows free space") + } + freeSpaceLen := page.posFreeSpaceEnd - pos0 + d.FieldRawLen("free_space", freeSpaceLen, scalar.RawHex) } func decodeIndexTuples(btree *BTreeD, d *decode.D) { @@ -322,9 +326,7 @@ func decodeIndexTuples(btree *BTreeD, d *decode.D) { continue } - //pos := int64(page.PagePosBegin)*8 + int64(id.Off)*8 pos := int64(page.bytesPosBegin)*8 + int64(id.Off)*8 - //tupleDataLen := id.Len - SizeOfHeapTupleHeaderData // seek to tuple with ItemId offset d.SeekAbs(pos) From efda7b3299fa6124d7e4fb9d99b79610cf52bb70 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Tue, 20 Sep 2022 18:32:18 +0300 Subject: [PATCH 073/141] postgres: btree handle full file --- format/postgres/flavours/postgres14/pg_btree.go | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/flavours/postgres14/pg_btree.go index 89087d9db..b9bd108aa 100644 --- a/format/postgres/flavours/postgres14/pg_btree.go +++ b/format/postgres/flavours/postgres14/pg_btree.go @@ -103,9 +103,6 @@ type HeapPage struct { func decodeBTreePages(btree *BTreeD, d *decode.D) { for i := 0; ; i++ { - if end, _ := d.TryEnd(); end { - return - } page := &HeapPage{} if btree.page != nil { @@ -118,6 +115,10 @@ func decodeBTreePages(btree *BTreeD, d *decode.D) { pos0 := page.bytesPosBegin * 8 d.SeekAbs(pos0) + if end, _ := d.TryEnd(); end { + return + } + if i == 0 { // first page contains meta information d.FieldStruct("page", func(d *decode.D) { @@ -126,11 +127,6 @@ func decodeBTreePages(btree *BTreeD, d *decode.D) { continue } - if i > 2 { - // limit for dev only - break - } - d.FieldStruct("page", func(d *decode.D) { decodeBTreePage(btree, d) }) From 00de0a96e3f59bfaac41fe5b00b2310f3f3508a3 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 21 Sep 2022 12:49:40 +0300 Subject: [PATCH 074/141] postgres: pg_heap refactoring --- format/postgres/common/utils.go | 4 + .../flavours/pgproee14/ee14/pgheap.go | 2 +- .../flavours/postgres14/common14/pgheap.go | 117 +++++------- .../postgres/flavours/postgres14/pg_btree.go | 2 +- .../testdata/flavours/pgpro11/16396_1.fqtest | 6 +- .../testdata/flavours/pgpro11/16406_1.fqtest | 6 +- .../testdata/flavours/pgpro11/16406_2.fqtest | 114 ++++++------ .../testdata/flavours/pgpro12/16396_1.fqtest | 6 +- .../testdata/flavours/pgpro12/16406_1.fqtest | 6 +- .../testdata/flavours/pgpro12/16406_2.fqtest | 114 ++++++------ .../testdata/flavours/pgpro13/16396_1.fqtest | 6 +- .../testdata/flavours/pgpro13/16406_1.fqtest | 6 +- .../testdata/flavours/pgpro13/16406_2.fqtest | 114 ++++++------ .../testdata/flavours/pgpro14/16396_1.fqtest | 6 +- .../testdata/flavours/pgpro14/16406_1.fqtest | 6 +- .../testdata/flavours/pgpro14/16406_2.fqtest | 114 ++++++------ .../flavours/pgproee10/16396_1.fqtest | 6 +- .../flavours/pgproee10/16403_1.fqtest | 6 +- .../flavours/pgproee10/16403_2.fqtest | 118 ++++++------ .../flavours/pgproee11/90150_1.fqtest | 6 +- .../flavours/pgproee11/90153_2.fqtest | 118 ++++++------ .../flavours/pgproee12/16396_1.fqtest | 6 +- .../flavours/pgproee12/16406_1.fqtest | 6 +- .../flavours/pgproee12/16406_2.fqtest | 118 ++++++------ .../flavours/pgproee13/16396_1.fqtest | 6 +- .../flavours/pgproee13/16406_1.fqtest | 6 +- .../flavours/pgproee13/16406_2.fqtest | 118 ++++++------ .../flavours/pgproee14/16396_1.fqtest | 6 +- .../flavours/pgproee14/16451_1.fqtest | 176 +++++++++--------- .../flavours/postgres11/16396_1.fqtest | 6 +- .../flavours/postgres11/16406_1.fqtest | 6 +- .../flavours/postgres11/16406_2.fqtest | 114 ++++++------ .../flavours/postgres12/16396_1.fqtest | 6 +- .../flavours/postgres12/16406_1.fqtest | 6 +- .../flavours/postgres12/16406_2.fqtest | 114 ++++++------ .../flavours/postgres13/16396_1.fqtest | 114 ++++++------ .../flavours/postgres13/16407_1.fqtest | 8 +- .../flavours/postgres13/16407_2.fqtest | 114 ++++++------ .../flavours/postgres14/16994_1.fqtest | 10 +- .../flavours/postgres14/33233_1.fqtest | 8 +- .../flavours/postgres14/33233_2.fqtest | 114 ++++++------ 41 files changed, 963 insertions(+), 982 deletions(-) diff --git a/format/postgres/common/utils.go b/format/postgres/common/utils.go index 0038c7bf7..18d0b5126 100644 --- a/format/postgres/common/utils.go +++ b/format/postgres/common/utils.go @@ -18,3 +18,7 @@ func IsMaskSet(value uint64, mask uint64) uint64 { } return 0 } + +func IsMaskSet0(value uint64, mask uint64) bool { + return (value & mask) > 0 +} diff --git a/format/postgres/flavours/pgproee14/ee14/pgheap.go b/format/postgres/flavours/pgproee14/ee14/pgheap.go index 8133d1e1e..eeacb57e5 100644 --- a/format/postgres/flavours/pgproee14/ee14/pgheap.go +++ b/format/postgres/flavours/pgproee14/ee14/pgheap.go @@ -51,7 +51,7 @@ func DecodePageSpecial(heap *common14.HeapD, d *decode.D) { specialPos := int64(page.PagePosBegin*8) + int64(page.PdSpecial*8) d.SeekAbs(specialPos) - d.FieldStruct("HeapPageSpecialData", func(d *decode.D) { + d.FieldStruct("special_data", func(d *decode.D) { page.PdXidBase = d.FieldU64("pd_xid_base") page.PdMultiBase = d.FieldU64("pd_multi_base") page.PdPruneXid = d.FieldU32("pd_prune_xid") diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pgheap.go index f3969f966..1d18bf67e 100644 --- a/format/postgres/flavours/postgres14/common14/pgheap.go +++ b/format/postgres/flavours/postgres14/common14/pgheap.go @@ -140,7 +140,7 @@ type HeapPageD struct { } type TupleD struct { - IsMulti uint64 + IsMulti bool } func DecodeHeap(heap *HeapD, d *decode.D) any { @@ -159,7 +159,7 @@ func decodeHeapPages(heap *HeapD, d *decode.D) { page := &HeapPageD{} heap.Page = page - d.FieldStruct("HeapPage", func(d *decode.D) { + d.FieldStruct("page", func(d *decode.D) { decodeHeapPage(heap, d) }) @@ -178,7 +178,7 @@ func decodeHeapPage(heap *HeapD, d *decode.D) { page.PagePosBegin = pagePosBegin // PageHeader - d.FieldStruct("PageHeaderData", func(d *decode.D) { + d.FieldStruct("page_header", func(d *decode.D) { heap.DecodePageHeaderDataFn(heap, d) }) @@ -186,7 +186,7 @@ func decodeHeapPage(heap *HeapD, d *decode.D) { freeSpaceEnd := int64(pagePosBegin*8) + int64(page.PdUpper*8) freeSpaceNBits := freeSpaceEnd - d.Pos() if freeSpaceNBits != 0 { - d.FieldRawLen("FreeSpace", freeSpaceNBits, scalar.RawHex) + d.FieldRawLen("free_space", freeSpaceNBits, scalar.RawHex) } if uint64(page.PdSpecial) != heap.PageSize && heap.DecodePageSpecialFn != nil { @@ -194,7 +194,7 @@ func decodeHeapPage(heap *HeapD, d *decode.D) { } // Tuples - d.FieldArray("Tuples", func(d *decode.D) { + d.FieldArray("tuples", func(d *decode.D) { decodeTuples(heap, d) }) } @@ -243,7 +243,7 @@ func DecodeItemIds(heap *HeapD, d *decode.D) { /* 0: 0 | 4 */ // unsigned int lp_off: 15 /* 1: 7 | 4 */ // unsigned int lp_flags: 2 /* 2: 1 | 4 */ // unsigned int lp_len: 15 - d.FieldStruct("ItemIdData", func(d *decode.D) { + d.FieldStruct("item_id", func(d *decode.D) { itemID := ItemIdData{} itemPos := d.Pos() @@ -290,19 +290,21 @@ func decodeTuples(heap *HeapD, d *decode.D) { /* XXX 1-byte padding */ // /* total size (bytes): 24 */ - d.FieldStruct("Tuple", func(d *decode.D) { - d.FieldStruct("HeapTupleHeaderData", func(d *decode.D) { + d.FieldStruct("tuple", func(d *decode.D) { + heap.Tuple = &TupleD{} + + d.FieldStruct("header", func(d *decode.D) { pos1 := d.Pos() // we need infomask before t_xmin, t_xmax d.SeekAbs(pos1 + 18*8) - d.FieldU16("t_infomask2") - d.FieldStruct("Infomask2", func(d *decode.D) { - decodeInfomask2(heap, d) + infomask2 := d.FieldU16("t_infomask2") + d.FieldStruct("infomask2", func(d *decode.D) { + decodeInfomask2(d, infomask2) }) - d.FieldU16("t_infomask") - d.FieldStruct("Infomask", func(d *decode.D) { - decodeInfomask(heap, d) + infomask := d.FieldU16("t_infomask") + d.FieldStruct("infomask", func(d *decode.D) { + decodeInfomask(heap, d, infomask) }) // restore pos and continue @@ -335,7 +337,7 @@ func decodeTuples(heap *HeapD, d *decode.D) { //d.FieldRawLen("t_bits", int64(tupleDataLen*8), scalar.RawHex) }) // HeapTupleHeaderData - d.FieldRawLen("Data", int64(tupleDataLen*8), scalar.RawHex) + d.FieldRawLen("data", int64(tupleDataLen*8), scalar.RawHex) // data alignment pos2 := uint64(d.Pos() / 8) @@ -355,63 +357,38 @@ func decodeTuples(heap *HeapD, d *decode.D) { } // for ItemsIds } -func decodeInfomask2(heap *HeapD, d *decode.D) { - tuple := &TupleD{} - heap.Tuple = tuple - - pos := d.Pos() - 16 - d.SeekAbs(pos) - d.FieldU16("HEAP_KEYS_UPDATED", common.Mask{Mask: HEAP_KEYS_UPDATED}) - d.SeekAbs(pos) - d.FieldU16("HEAP_HOT_UPDATED", common.Mask{Mask: HEAP_HOT_UPDATED}) - d.SeekAbs(pos) - d.FieldU16("HEAP_ONLY_TUPLE", common.Mask{Mask: HEAP_ONLY_TUPLE}) +func decodeInfomask2(d *decode.D, infomask2 uint64) { + d.FieldValueBool("heap_keys_updated", common.IsMaskSet0(infomask2, HEAP_KEYS_UPDATED)) + d.FieldValueBool("heap_hot_updated", common.IsMaskSet0(infomask2, HEAP_HOT_UPDATED)) + d.FieldValueBool("heap_only_tuple", common.IsMaskSet0(infomask2, HEAP_ONLY_TUPLE)) } -func decodeInfomask(heap *HeapD, d *decode.D) { +func decodeInfomask(heap *HeapD, d *decode.D, infomask uint64) { tuple := heap.Tuple - pos := d.Pos() - 16 - d.SeekAbs(pos) - d.FieldU16("HEAP_HASNULL", common.Mask{Mask: HEAP_HASNULL}) - d.SeekAbs(pos) - d.FieldU16("HEAP_HASVARWIDTH", common.Mask{Mask: HEAP_HASVARWIDTH}) - d.SeekAbs(pos) - d.FieldU16("HEAP_HASEXTERNAL", common.Mask{Mask: HEAP_HASEXTERNAL}) - d.SeekAbs(pos) - d.FieldU16("HEAP_HASOID_OLD", common.Mask{Mask: HEAP_HASOID_OLD}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMAX_KEYSHR_LOCK", common.Mask{Mask: HEAP_XMAX_KEYSHR_LOCK}) - d.SeekAbs(pos) - d.FieldU16("HEAP_COMBOCID", common.Mask{Mask: HEAP_COMBOCID}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMAX_EXCL_LOCK", common.Mask{Mask: HEAP_XMAX_EXCL_LOCK}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMAX_LOCK_ONLY", common.Mask{Mask: HEAP_XMAX_LOCK_ONLY}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMAX_SHR_LOCK", common.Mask{Mask: HEAP_XMAX_SHR_LOCK}) - d.SeekAbs(pos) - d.FieldU16("HEAP_LOCK_MASK", common.Mask{Mask: HEAP_LOCK_MASK}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMIN_COMMITTED", common.Mask{Mask: HEAP_XMIN_COMMITTED}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMIN_INVALID", common.Mask{Mask: HEAP_XMIN_INVALID}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMIN_FROZEN", common.Mask{Mask: HEAP_XMIN_FROZEN}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMAX_COMMITTED", common.Mask{Mask: HEAP_XMAX_COMMITTED}) - d.SeekAbs(pos) - d.FieldU16("HEAP_XMAX_INVALID", common.Mask{Mask: HEAP_XMAX_INVALID}) - d.SeekAbs(pos) - tuple.IsMulti = d.FieldU16("HEAP_XMAX_IS_MULTI", common.Mask{Mask: HEAP_XMAX_IS_MULTI}) - d.SeekAbs(pos) - d.FieldU16("HEAP_UPDATED", common.Mask{Mask: HEAP_UPDATED}) - d.SeekAbs(pos) - d.FieldU16("HEAP_MOVED_OFF", common.Mask{Mask: HEAP_MOVED_OFF}) - d.SeekAbs(pos) - d.FieldU16("HEAP_MOVED_IN", common.Mask{Mask: HEAP_MOVED_IN}) - d.SeekAbs(pos) - d.FieldU16("HEAP_MOVED", common.Mask{Mask: HEAP_MOVED}) + isMulti := common.IsMaskSet0(infomask, HEAP_XMAX_IS_MULTI) + tuple.IsMulti = isMulti + + d.FieldValueBool("heap_hasnull", common.IsMaskSet0(infomask, HEAP_HASNULL)) + d.FieldValueBool("heap_hasvarwidth", common.IsMaskSet0(infomask, HEAP_HASVARWIDTH)) + d.FieldValueBool("heap_hasexternal", common.IsMaskSet0(infomask, HEAP_HASEXTERNAL)) + d.FieldValueBool("heap_hasoid_old", common.IsMaskSet0(infomask, HEAP_HASOID_OLD)) + d.FieldValueBool("heap_xmax_keyshr_lock", common.IsMaskSet0(infomask, HEAP_XMAX_KEYSHR_LOCK)) + d.FieldValueBool("heap_combocid", common.IsMaskSet0(infomask, HEAP_COMBOCID)) + d.FieldValueBool("heap_xmax_excl_lock", common.IsMaskSet0(infomask, HEAP_XMAX_EXCL_LOCK)) + d.FieldValueBool("heap_xmax_lock_only", common.IsMaskSet0(infomask, HEAP_XMAX_LOCK_ONLY)) + d.FieldValueBool("heap_xmax_shr_lock", common.IsMaskSet0(infomask, HEAP_XMAX_SHR_LOCK)) + d.FieldValueBool("heap_lock_mask", common.IsMaskSet0(infomask, HEAP_LOCK_MASK)) + d.FieldValueBool("heap_xmin_committed", common.IsMaskSet0(infomask, HEAP_XMIN_COMMITTED)) + d.FieldValueBool("heap_xmin_invalid", common.IsMaskSet0(infomask, HEAP_XMIN_INVALID)) + d.FieldValueBool("heap_xmin_frozen", common.IsMaskSet0(infomask, HEAP_XMIN_FROZEN)) + d.FieldValueBool("heap_xmax_committed", common.IsMaskSet0(infomask, HEAP_XMAX_COMMITTED)) + d.FieldValueBool("heap_xmax_invalid", common.IsMaskSet0(infomask, HEAP_XMAX_INVALID)) + d.FieldValueBool("heap_xmax_is_multi", isMulti) + d.FieldValueBool("heap_updated", common.IsMaskSet0(infomask, HEAP_UPDATED)) + d.FieldValueBool("heap_moved_off", common.IsMaskSet0(infomask, HEAP_MOVED_OFF)) + d.FieldValueBool("heap_moved_in", common.IsMaskSet0(infomask, HEAP_MOVED_IN)) + d.FieldValueBool("heap_moved", common.IsMaskSet0(infomask, HEAP_MOVED)) } /* 0 | 12 */ // union { @@ -468,12 +445,12 @@ type TransactionMapper struct { func (m TransactionMapper) MapScalar(s scalar.S) (scalar.S, error) { xid := s.ActualU() - if m.Page.PdXidBase != 0 && m.Tuple.IsMulti == 0 && common.TransactionIDIsNormal(xid) { + if m.Page.PdXidBase != 0 && m.Tuple.IsMulti && common.TransactionIDIsNormal(xid) { xid64 := xid + m.Page.PdXidBase s.Sym = fmt.Sprintf("%d", xid64) } - if m.Page.PdMultiBase != 0 && m.Tuple.IsMulti != 0 && common.TransactionIDIsNormal(xid) { + if m.Page.PdMultiBase != 0 && !m.Tuple.IsMulti && common.TransactionIDIsNormal(xid) { xid64 := xid + m.Page.PdMultiBase s.Sym = fmt.Sprintf("%d", xid64) } diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/flavours/postgres14/pg_btree.go index b9bd108aa..bff4bdf81 100644 --- a/format/postgres/flavours/postgres14/pg_btree.go +++ b/format/postgres/flavours/postgres14/pg_btree.go @@ -288,7 +288,7 @@ func decodeItemIds(btree *BTreeD, d *decode.D) { /* 0: 0 | 4 */ // unsigned int lp_off: 15 /* 1: 7 | 4 */ // unsigned int lp_flags: 2 /* 2: 1 | 4 */ // unsigned int lp_len: 15 - d.FieldStruct("ItemIdData", func(d *decode.D) { + d.FieldStruct("item_id", func(d *decode.D) { itemID := common14.ItemIdData{} itemPos := d.Pos() diff --git a/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest index a6ecde472..06b88e4d4 100644 --- a/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro11 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro11 ".[0].page_header.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[60]{}: ItemIdData 0x108-0x10b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[60]{}: item_id 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_off: 384 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_len: 121 0x108-0x10b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest index 261ddb960..605f820db 100644 --- a/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro11 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro11 ".[0].page_header.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest index 21b28123e..b4b6ef196 100644 --- a/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/16406_2.fqtest @@ -1,6 +1,6 @@ -$ fq -d pg_heap -o flavour=pgpro11 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) - | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) +$ fq -d pg_heap -o flavour=pgpro11 ".[0].tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fd0-0x1fff.7 (48) + | | | header{}: 0x1fd0-0x1fe7.7 (24) | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) 0x1fd0|47 02 00 00 |G... | t_xmin: 583 0x1fd0-0x1fd3.7 (4) @@ -16,38 +16,38 @@ $ fq -d pg_heap -o flavour=pgpro11 ".[0].Tuples[0,-1] | dv" 16406 0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) 0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) 0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) + | | | infomask2{}: 0x1fe4-NA (0) + | | | heap_keys_updated: false 0x1fe4-NA (0) + | | | heap_hot_updated: false 0x1fe4-NA (0) + | | | heap_only_tuple: false 0x1fe4-NA (0) 0x1fe0| 01 08 | .. | t_infomask: 2049 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMIN_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 08 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) + | | | infomask{}: 0x1fe6-NA (0) + | | | heap_hasnull: true 0x1fe6-NA (0) + | | | heap_hasvarwidth: false 0x1fe6-NA (0) + | | | heap_hasexternal: false 0x1fe6-NA (0) + | | | heap_hasoid_old: false 0x1fe6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fe6-NA (0) + | | | heap_combocid: false 0x1fe6-NA (0) + | | | heap_xmax_excl_lock: false 0x1fe6-NA (0) + | | | heap_xmax_lock_only: false 0x1fe6-NA (0) + | | | heap_xmax_shr_lock: false 0x1fe6-NA (0) + | | | heap_lock_mask: false 0x1fe6-NA (0) + | | | heap_xmin_committed: false 0x1fe6-NA (0) + | | | heap_xmin_invalid: false 0x1fe6-NA (0) + | | | heap_xmin_frozen: false 0x1fe6-NA (0) + | | | heap_xmax_committed: false 0x1fe6-NA (0) + | | | heap_xmax_invalid: true 0x1fe6-NA (0) + | | | heap_xmax_is_multi: false 0x1fe6-NA (0) + | | | heap_updated: false 0x1fe6-NA (0) + | | | heap_moved_off: false 0x1fe6-NA (0) + | | | heap_moved_in: false 0x1fe6-NA (0) + | | | heap_moved: false 0x1fe6-NA (0) 0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) 0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 0d 00 00 00 02 00 00 00| ........| Data: "0d00000002000000ccf20100f8feffffc43021b0218a020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1fe0| 0d 00 00 00 02 00 00 00| ........| data: "0d00000002000000ccf20100f8feffffc43021b0218a020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|cc f2 01 00 f8 fe ff ff c4 30 21 b0 21 8a 02 00|.........0!.!...| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) - | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[156]{}: tuple 0x290-0x2bf.7 (48) + | | | header{}: 0x290-0x2a7.7 (24) | | | t_choice{}: 0x290-0x29b.7 (12) | | | t_heap{}: 0x290-0x29b.7 (12) 0x290|e3 02 00 00 |.... | t_xmin: 739 0x290-0x293.7 (4) @@ -63,33 +63,33 @@ $ fq -d pg_heap -o flavour=pgpro11 ".[0].Tuples[0,-1] | dv" 16406 0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) 0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) 0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) + | | | infomask2{}: 0x2a4-NA (0) + | | | heap_keys_updated: false 0x2a4-NA (0) + | | | heap_hot_updated: false 0x2a4-NA (0) + | | | heap_only_tuple: false 0x2a4-NA (0) 0x2a0| 01 08 | .. | t_infomask: 2049 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMIN_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 08 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) + | | | infomask{}: 0x2a6-NA (0) + | | | heap_hasnull: true 0x2a6-NA (0) + | | | heap_hasvarwidth: false 0x2a6-NA (0) + | | | heap_hasexternal: false 0x2a6-NA (0) + | | | heap_hasoid_old: false 0x2a6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x2a6-NA (0) + | | | heap_combocid: false 0x2a6-NA (0) + | | | heap_xmax_excl_lock: false 0x2a6-NA (0) + | | | heap_xmax_lock_only: false 0x2a6-NA (0) + | | | heap_xmax_shr_lock: false 0x2a6-NA (0) + | | | heap_lock_mask: false 0x2a6-NA (0) + | | | heap_xmin_committed: false 0x2a6-NA (0) + | | | heap_xmin_invalid: false 0x2a6-NA (0) + | | | heap_xmin_frozen: false 0x2a6-NA (0) + | | | heap_xmax_committed: false 0x2a6-NA (0) + | | | heap_xmax_invalid: true 0x2a6-NA (0) + | | | heap_xmax_is_multi: false 0x2a6-NA (0) + | | | heap_updated: false 0x2a6-NA (0) + | | | heap_moved_off: false 0x2a6-NA (0) + | | | heap_moved_in: false 0x2a6-NA (0) + | | | heap_moved: false 0x2a6-NA (0) 0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) 0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 09 00 00 00 03 00 00 00| ........| Data: "0900000003000000b2e003007bf8fffffda429b0218a020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2a0| 09 00 00 00 03 00 00 00| ........| data: "0900000003000000b2e003007bf8fffffda429b0218a020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|b2 e0 03 00 7b f8 ff ff fd a4 29 b0 21 8a 02 00|....{.....).!...| diff --git a/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest index 2e8d59464..517e59333 100644 --- a/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro12 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro12 ".[0].page_header.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[60]{}: ItemIdData 0x108-0x10b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[60]{}: item_id 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_off: 384 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_len: 121 0x108-0x10b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest index 701825105..cad6d1add 100644 --- a/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro12 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro12 ".[0].page_header.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro12/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro12/16406_2.fqtest index 55d92e664..c483effa9 100644 --- a/format/postgres/testdata/flavours/pgpro12/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/16406_2.fqtest @@ -1,6 +1,6 @@ -$ fq -d pg_heap -o flavour=pgpro12 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) - | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) +$ fq -d pg_heap -o flavour=pgpro12 ".[0].tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fd0-0x1fff.7 (48) + | | | header{}: 0x1fd0-0x1fe7.7 (24) | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) 0x1fd0|f3 01 00 00 |.... | t_xmin: 499 0x1fd0-0x1fd3.7 (4) @@ -16,38 +16,38 @@ $ fq -d pg_heap -o flavour=pgpro12 ".[0].Tuples[0,-1] | dv" 16406 0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) 0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) 0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) + | | | infomask2{}: 0x1fe4-NA (0) + | | | heap_keys_updated: false 0x1fe4-NA (0) + | | | heap_hot_updated: false 0x1fe4-NA (0) + | | | heap_only_tuple: false 0x1fe4-NA (0) 0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) + | | | infomask{}: 0x1fe6-NA (0) + | | | heap_hasnull: true 0x1fe6-NA (0) + | | | heap_hasvarwidth: false 0x1fe6-NA (0) + | | | heap_hasexternal: false 0x1fe6-NA (0) + | | | heap_hasoid_old: false 0x1fe6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fe6-NA (0) + | | | heap_combocid: false 0x1fe6-NA (0) + | | | heap_xmax_excl_lock: false 0x1fe6-NA (0) + | | | heap_xmax_lock_only: false 0x1fe6-NA (0) + | | | heap_xmax_shr_lock: false 0x1fe6-NA (0) + | | | heap_lock_mask: false 0x1fe6-NA (0) + | | | heap_xmin_committed: true 0x1fe6-NA (0) + | | | heap_xmin_invalid: false 0x1fe6-NA (0) + | | | heap_xmin_frozen: true 0x1fe6-NA (0) + | | | heap_xmax_committed: false 0x1fe6-NA (0) + | | | heap_xmax_invalid: true 0x1fe6-NA (0) + | | | heap_xmax_is_multi: false 0x1fe6-NA (0) + | | | heap_updated: false 0x1fe6-NA (0) + | | | heap_moved_off: false 0x1fe6-NA (0) + | | | heap_moved_in: false 0x1fe6-NA (0) + | | | heap_moved: false 0x1fe6-NA (0) 0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) 0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 61 00 00 00 08 00 00 00| a.......| Data: "61000000080000003aaa080009040000d1b3823d1f8a020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1fe0| 61 00 00 00 08 00 00 00| a.......| data: "61000000080000003aaa080009040000d1b3823d1f8a020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|3a aa 08 00 09 04 00 00 d1 b3 82 3d 1f 8a 02 00|:..........=....| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) - | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[156]{}: tuple 0x290-0x2bf.7 (48) + | | | header{}: 0x290-0x2a7.7 (24) | | | t_choice{}: 0x290-0x29b.7 (12) | | | t_heap{}: 0x290-0x29b.7 (12) 0x290|8f 02 00 00 |.... | t_xmin: 655 0x290-0x293.7 (4) @@ -63,33 +63,33 @@ $ fq -d pg_heap -o flavour=pgpro12 ".[0].Tuples[0,-1] | dv" 16406 0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) 0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) 0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) + | | | infomask2{}: 0x2a4-NA (0) + | | | heap_keys_updated: false 0x2a4-NA (0) + | | | heap_hot_updated: false 0x2a4-NA (0) + | | | heap_only_tuple: false 0x2a4-NA (0) 0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) + | | | infomask{}: 0x2a6-NA (0) + | | | heap_hasnull: true 0x2a6-NA (0) + | | | heap_hasvarwidth: false 0x2a6-NA (0) + | | | heap_hasexternal: false 0x2a6-NA (0) + | | | heap_hasoid_old: false 0x2a6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x2a6-NA (0) + | | | heap_combocid: false 0x2a6-NA (0) + | | | heap_xmax_excl_lock: false 0x2a6-NA (0) + | | | heap_xmax_lock_only: false 0x2a6-NA (0) + | | | heap_xmax_shr_lock: false 0x2a6-NA (0) + | | | heap_lock_mask: false 0x2a6-NA (0) + | | | heap_xmin_committed: true 0x2a6-NA (0) + | | | heap_xmin_invalid: false 0x2a6-NA (0) + | | | heap_xmin_frozen: true 0x2a6-NA (0) + | | | heap_xmax_committed: false 0x2a6-NA (0) + | | | heap_xmax_invalid: true 0x2a6-NA (0) + | | | heap_xmax_is_multi: false 0x2a6-NA (0) + | | | heap_updated: false 0x2a6-NA (0) + | | | heap_moved_off: false 0x2a6-NA (0) + | | | heap_moved_in: false 0x2a6-NA (0) + | | | heap_moved: false 0x2a6-NA (0) 0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) 0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 26 00 00 00 01 00 00 00| &.......| Data: "2600000001000000c5900800c5f6ffffe658893d1f8a020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2a0| 26 00 00 00 01 00 00 00| &.......| data: "2600000001000000c5900800c5f6ffffe658893d1f8a020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|c5 90 08 00 c5 f6 ff ff e6 58 89 3d 1f 8a 02 00|.........X.=....| diff --git a/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest index e65a56766..f4b59129c 100644 --- a/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro13 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro13 ".[0].page_header.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[60]{}: ItemIdData 0x108-0x10b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[60]{}: item_id 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_off: 384 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_len: 121 0x108-0x10b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest index 3ab627df2..e380abe8d 100644 --- a/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro13 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro13 ".[0].page_header.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest index 393d0fb04..101bcd12a 100644 --- a/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgpro13/16406_2.fqtest @@ -1,6 +1,6 @@ -$ fq -d pg_heap -o flavour=pgpro13 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) - | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) +$ fq -d pg_heap -o flavour=pgpro13 ".[0].tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fd0-0x1fff.7 (48) + | | | header{}: 0x1fd0-0x1fe7.7 (24) | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) 0x1fd0|f2 01 00 00 |.... | t_xmin: 498 0x1fd0-0x1fd3.7 (4) @@ -16,38 +16,38 @@ $ fq -d pg_heap -o flavour=pgpro13 ".[0].Tuples[0,-1] | dv" 16406 0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) 0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) 0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) + | | | infomask2{}: 0x1fe4-NA (0) + | | | heap_keys_updated: false 0x1fe4-NA (0) + | | | heap_hot_updated: false 0x1fe4-NA (0) + | | | heap_only_tuple: false 0x1fe4-NA (0) 0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) + | | | infomask{}: 0x1fe6-NA (0) + | | | heap_hasnull: true 0x1fe6-NA (0) + | | | heap_hasvarwidth: false 0x1fe6-NA (0) + | | | heap_hasexternal: false 0x1fe6-NA (0) + | | | heap_hasoid_old: false 0x1fe6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fe6-NA (0) + | | | heap_combocid: false 0x1fe6-NA (0) + | | | heap_xmax_excl_lock: false 0x1fe6-NA (0) + | | | heap_xmax_lock_only: false 0x1fe6-NA (0) + | | | heap_xmax_shr_lock: false 0x1fe6-NA (0) + | | | heap_lock_mask: false 0x1fe6-NA (0) + | | | heap_xmin_committed: true 0x1fe6-NA (0) + | | | heap_xmin_invalid: false 0x1fe6-NA (0) + | | | heap_xmin_frozen: true 0x1fe6-NA (0) + | | | heap_xmax_committed: false 0x1fe6-NA (0) + | | | heap_xmax_invalid: true 0x1fe6-NA (0) + | | | heap_xmax_is_multi: false 0x1fe6-NA (0) + | | | heap_updated: false 0x1fe6-NA (0) + | | | heap_moved_off: false 0x1fe6-NA (0) + | | | heap_moved_in: false 0x1fe6-NA (0) + | | | heap_moved: false 0x1fe6-NA (0) 0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) 0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 4e 00 00 00 04 00 00 00| N.......| Data: "4e0000000400000053b40a00d6ffffff9982147e1d8a020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1fe0| 4e 00 00 00 04 00 00 00| N.......| data: "4e0000000400000053b40a00d6ffffff9982147e1d8a020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|53 b4 0a 00 d6 ff ff ff 99 82 14 7e 1d 8a 02 00|S..........~....| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) - | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[156]{}: tuple 0x290-0x2bf.7 (48) + | | | header{}: 0x290-0x2a7.7 (24) | | | t_choice{}: 0x290-0x29b.7 (12) | | | t_heap{}: 0x290-0x29b.7 (12) 0x290|8e 02 00 00 |.... | t_xmin: 654 0x290-0x293.7 (4) @@ -63,33 +63,33 @@ $ fq -d pg_heap -o flavour=pgpro13 ".[0].Tuples[0,-1] | dv" 16406 0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) 0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) 0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) + | | | infomask2{}: 0x2a4-NA (0) + | | | heap_keys_updated: false 0x2a4-NA (0) + | | | heap_hot_updated: false 0x2a4-NA (0) + | | | heap_only_tuple: false 0x2a4-NA (0) 0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) + | | | infomask{}: 0x2a6-NA (0) + | | | heap_hasnull: true 0x2a6-NA (0) + | | | heap_hasvarwidth: false 0x2a6-NA (0) + | | | heap_hasexternal: false 0x2a6-NA (0) + | | | heap_hasoid_old: false 0x2a6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x2a6-NA (0) + | | | heap_combocid: false 0x2a6-NA (0) + | | | heap_xmax_excl_lock: false 0x2a6-NA (0) + | | | heap_xmax_lock_only: false 0x2a6-NA (0) + | | | heap_xmax_shr_lock: false 0x2a6-NA (0) + | | | heap_lock_mask: false 0x2a6-NA (0) + | | | heap_xmin_committed: true 0x2a6-NA (0) + | | | heap_xmin_invalid: false 0x2a6-NA (0) + | | | heap_xmin_frozen: true 0x2a6-NA (0) + | | | heap_xmax_committed: false 0x2a6-NA (0) + | | | heap_xmax_invalid: true 0x2a6-NA (0) + | | | heap_xmax_is_multi: false 0x2a6-NA (0) + | | | heap_updated: false 0x2a6-NA (0) + | | | heap_moved_off: false 0x2a6-NA (0) + | | | heap_moved_in: false 0x2a6-NA (0) + | | | heap_moved: false 0x2a6-NA (0) 0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) 0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 44 00 00 00 09 00 00 00| D.......| Data: "44000000090000003f9b0e00fc090000446d1c7e1d8a020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2a0| 44 00 00 00 09 00 00 00| D.......| data: "44000000090000003f9b0e00fc090000446d1c7e1d8a020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|3f 9b 0e 00 fc 09 00 00 44 6d 1c 7e 1d 8a 02 00|?.......Dm.~....| diff --git a/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest index 2342d7ab4..dbb600123 100644 --- a/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro14 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro14 ".[0].page_header.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[71]{}: ItemIdData 0x134-0x137.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[71]{}: item_id 0x134-0x137.7 (4) 0x130| 80 81 f2 00 | .... | lp_off: 384 0x134-0x137.7 (4) 0x130| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x134-0x137.7 (4) 0x130| 80 81 f2 00 | .... | lp_len: 121 0x134-0x137.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest index 297ce2f14..a48f1de82 100644 --- a/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro14 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro14 ".[0].page_header.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro14/16406_2.fqtest b/format/postgres/testdata/flavours/pgpro14/16406_2.fqtest index f42ad381c..5bcf38e98 100644 --- a/format/postgres/testdata/flavours/pgpro14/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/16406_2.fqtest @@ -1,6 +1,6 @@ -$ fq -d pg_heap -o flavour=pgpro14 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) - | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) +$ fq -d pg_heap -o flavour=pgpro14 ".[0].tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fd0-0x1fff.7 (48) + | | | header{}: 0x1fd0-0x1fe7.7 (24) | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) 0x1fd0|f1 02 00 00 |.... | t_xmin: 753 0x1fd0-0x1fd3.7 (4) @@ -16,38 +16,38 @@ $ fq -d pg_heap -o flavour=pgpro14 ".[0].Tuples[0,-1] | dv" 16406 0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) 0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) 0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) + | | | infomask2{}: 0x1fe4-NA (0) + | | | heap_keys_updated: false 0x1fe4-NA (0) + | | | heap_hot_updated: false 0x1fe4-NA (0) + | | | heap_only_tuple: false 0x1fe4-NA (0) 0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) + | | | infomask{}: 0x1fe6-NA (0) + | | | heap_hasnull: true 0x1fe6-NA (0) + | | | heap_hasvarwidth: false 0x1fe6-NA (0) + | | | heap_hasexternal: false 0x1fe6-NA (0) + | | | heap_hasoid_old: false 0x1fe6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fe6-NA (0) + | | | heap_combocid: false 0x1fe6-NA (0) + | | | heap_xmax_excl_lock: false 0x1fe6-NA (0) + | | | heap_xmax_lock_only: false 0x1fe6-NA (0) + | | | heap_xmax_shr_lock: false 0x1fe6-NA (0) + | | | heap_lock_mask: false 0x1fe6-NA (0) + | | | heap_xmin_committed: true 0x1fe6-NA (0) + | | | heap_xmin_invalid: false 0x1fe6-NA (0) + | | | heap_xmin_frozen: true 0x1fe6-NA (0) + | | | heap_xmax_committed: false 0x1fe6-NA (0) + | | | heap_xmax_invalid: true 0x1fe6-NA (0) + | | | heap_xmax_is_multi: false 0x1fe6-NA (0) + | | | heap_updated: false 0x1fe6-NA (0) + | | | heap_moved_off: false 0x1fe6-NA (0) + | | | heap_moved_in: false 0x1fe6-NA (0) + | | | heap_moved: false 0x1fe6-NA (0) 0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) 0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 04 00 00 00 01 00 00 00| ........| Data: "040000000100000075840100f2fcffff00853c937688020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1fe0| 04 00 00 00 01 00 00 00| ........| data: "040000000100000075840100f2fcffff00853c937688020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|75 84 01 00 f2 fc ff ff 00 85 3c 93 76 88 02 00|u.........<.v...| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) - | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[156]{}: tuple 0x290-0x2bf.7 (48) + | | | header{}: 0x290-0x2a7.7 (24) | | | t_choice{}: 0x290-0x29b.7 (12) | | | t_heap{}: 0x290-0x29b.7 (12) 0x290|8d 03 00 00 |.... | t_xmin: 909 0x290-0x293.7 (4) @@ -63,33 +63,33 @@ $ fq -d pg_heap -o flavour=pgpro14 ".[0].Tuples[0,-1] | dv" 16406 0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) 0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) 0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) + | | | infomask2{}: 0x2a4-NA (0) + | | | heap_keys_updated: false 0x2a4-NA (0) + | | | heap_hot_updated: false 0x2a4-NA (0) + | | | heap_only_tuple: false 0x2a4-NA (0) 0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) + | | | infomask{}: 0x2a6-NA (0) + | | | heap_hasnull: true 0x2a6-NA (0) + | | | heap_hasvarwidth: false 0x2a6-NA (0) + | | | heap_hasexternal: false 0x2a6-NA (0) + | | | heap_hasoid_old: false 0x2a6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x2a6-NA (0) + | | | heap_combocid: false 0x2a6-NA (0) + | | | heap_xmax_excl_lock: false 0x2a6-NA (0) + | | | heap_xmax_lock_only: false 0x2a6-NA (0) + | | | heap_xmax_shr_lock: false 0x2a6-NA (0) + | | | heap_lock_mask: false 0x2a6-NA (0) + | | | heap_xmin_committed: true 0x2a6-NA (0) + | | | heap_xmin_invalid: false 0x2a6-NA (0) + | | | heap_xmin_frozen: true 0x2a6-NA (0) + | | | heap_xmax_committed: false 0x2a6-NA (0) + | | | heap_xmax_invalid: true 0x2a6-NA (0) + | | | heap_xmax_is_multi: false 0x2a6-NA (0) + | | | heap_updated: false 0x2a6-NA (0) + | | | heap_moved_off: false 0x2a6-NA (0) + | | | heap_moved_in: false 0x2a6-NA (0) + | | | heap_moved: false 0x2a6-NA (0) 0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) 0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 09 00 00 00 01 00 00 00| ........| Data: "09000000010000004ff60000b70c00006e1f43937688020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2a0| 09 00 00 00 01 00 00 00| ........| data: "09000000010000004ff60000b70c00006e1f43937688020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|4f f6 00 00 b7 0c 00 00 6e 1f 43 93 76 88 02 00|O.......n.C.v...| diff --git a/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest index 93a2743bb..1c9fbea24 100644 --- a/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee10 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee10 ".[0].page_header.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[67]{}: ItemIdData 0x120-0x123.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[67]{}: item_id 0x120-0x123.7 (4) 0x120|68 81 f2 00 |h... | lp_off: 360 0x120-0x123.7 (4) 0x120|68 81 f2 00 |h... | lp_flags: "LP_NORMAL" (1) 0x120-0x123.7 (4) 0x120|68 81 f2 00 |h... | lp_len: 121 0x120-0x123.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest b/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest index ec17c1291..635c2d2cf 100644 --- a/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee10 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16403 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee10 ".[0].page_header.pd_linp[0,-1] | dv" 16403 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_off: 8120 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_len: 48 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[155]{}: ItemIdData 0x280-0x283.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[155]{}: item_id 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_off: 680 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_flags: "LP_NORMAL" (1) 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_len: 48 0x280-0x283.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest b/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest index 49d7451ed..a1fecbc21 100644 --- a/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/16403_2.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee10 ".[0].Tuples[0,-1] | dv" 16403 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fb8-0x1fe7.7 (48) - | | | HeapTupleHeaderData{}: 0x1fb8-0x1fcf.7 (24) +$ fq -d pg_heap -o flavour=pgproee10 ".[0].tuples[0,-1] | dv" 16403 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fb8-0x1fe7.7 (48) + | | | header{}: 0x1fb8-0x1fcf.7 (24) | | | t_choice{}: 0x1fb8-0x1fc3.7 (12) | | | t_heap{}: 0x1fb8-0x1fc3.7 (12) -0x1fb0| 03 00 00 00 | .... | t_xmin: "10000000568" (3) 0x1fb8-0x1fbb.7 (4) +0x1fb0| 03 00 00 00 | .... | t_xmin: 3 0x1fb8-0x1fbb.7 (4) 0x1fb0| 00 00 00 00| ....| t_xmax: 0 0x1fbc-0x1fbf.7 (4) | | | t_field3{}: 0x1fc0-0x1fc3.7 (4) 0x1fc0|03 00 00 00 |.... | t_cid: 3 0x1fc0-0x1fc3.7 (4) @@ -16,41 +16,41 @@ $ fq -d pg_heap -o flavour=pgproee10 ".[0].Tuples[0,-1] | dv" 16403 0x1fc0| 00 00 00 00 | .... | ip_blkid: 0 0x1fc4-0x1fc7.7 (4) 0x1fc0| 01 00 | .. | ip_posid: 1 0x1fc8-0x1fc9.7 (2) 0x1fc0| 06 00 | .. | t_infomask2: 6 0x1fca-0x1fcb.7 (2) - | | | Infomask2{}: 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fca-0x1fcb.7 (2) + | | | infomask2{}: 0x1fcc-NA (0) + | | | heap_keys_updated: false 0x1fcc-NA (0) + | | | heap_hot_updated: false 0x1fcc-NA (0) + | | | heap_only_tuple: false 0x1fcc-NA (0) 0x1fc0| 01 09 | .. | t_infomask: 2305 0x1fcc-0x1fcd.7 (2) - | | | Infomask{}: 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASNULL: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_UPDATED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED: 0 0x1fcc-0x1fcd.7 (2) + | | | infomask{}: 0x1fce-NA (0) + | | | heap_hasnull: true 0x1fce-NA (0) + | | | heap_hasvarwidth: false 0x1fce-NA (0) + | | | heap_hasexternal: false 0x1fce-NA (0) + | | | heap_hasoid_old: false 0x1fce-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fce-NA (0) + | | | heap_combocid: false 0x1fce-NA (0) + | | | heap_xmax_excl_lock: false 0x1fce-NA (0) + | | | heap_xmax_lock_only: false 0x1fce-NA (0) + | | | heap_xmax_shr_lock: false 0x1fce-NA (0) + | | | heap_lock_mask: false 0x1fce-NA (0) + | | | heap_xmin_committed: true 0x1fce-NA (0) + | | | heap_xmin_invalid: false 0x1fce-NA (0) + | | | heap_xmin_frozen: true 0x1fce-NA (0) + | | | heap_xmax_committed: false 0x1fce-NA (0) + | | | heap_xmax_invalid: true 0x1fce-NA (0) + | | | heap_xmax_is_multi: false 0x1fce-NA (0) + | | | heap_updated: false 0x1fce-NA (0) + | | | heap_moved_off: false 0x1fce-NA (0) + | | | heap_moved_in: false 0x1fce-NA (0) + | | | heap_moved: false 0x1fce-NA (0) 0x1fc0| 18 | . | t_hoff: 24 0x1fce-0x1fce.7 (1) 0x1fc0| 1f| .| padding0: 31 0x1fcf-0x1fcf.7 (1) -0x1fd0|09 00 00 00 01 00 00 00 43 ff 00 00 f7 0e 00 00|........C.......| Data: "090000000100000043ff0000f70e000043c144237a88020..." (raw bits) 0x1fd0-0x1fe7.7 (24) +0x1fd0|09 00 00 00 01 00 00 00 43 ff 00 00 f7 0e 00 00|........C.......| data: "090000000100000043ff0000f70e000043c144237a88020..." (raw bits) 0x1fd0-0x1fe7.7 (24) 0x1fe0|43 c1 44 23 7a 88 02 00 |C.D#z... | - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[155]{}: Tuple 0x2a8-0x2d7.7 (48) - | | | HeapTupleHeaderData{}: 0x2a8-0x2bf.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[155]{}: tuple 0x2a8-0x2d7.7 (48) + | | | header{}: 0x2a8-0x2bf.7 (24) | | | t_choice{}: 0x2a8-0x2b3.7 (12) | | | t_heap{}: 0x2a8-0x2b3.7 (12) -0x2a0| 9e 00 00 00 | .... | t_xmin: "10000000723" (158) 0x2a8-0x2ab.7 (4) +0x2a0| 9e 00 00 00 | .... | t_xmin: 158 0x2a8-0x2ab.7 (4) 0x2a0| 00 00 00 00| ....| t_xmax: 0 0x2ac-0x2af.7 (4) | | | t_field3{}: 0x2b0-0x2b3.7 (4) 0x2b0|03 00 00 00 |.... | t_cid: 3 0x2b0-0x2b3.7 (4) @@ -63,33 +63,33 @@ $ fq -d pg_heap -o flavour=pgproee10 ".[0].Tuples[0,-1] | dv" 16403 0x2b0| 00 00 00 00 | .... | ip_blkid: 0 0x2b4-0x2b7.7 (4) 0x2b0| 9c 00 | .. | ip_posid: 156 0x2b8-0x2b9.7 (2) 0x2b0| 06 00 | .. | t_infomask2: 6 0x2ba-0x2bb.7 (2) - | | | Infomask2{}: 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2ba-0x2bb.7 (2) + | | | infomask2{}: 0x2bc-NA (0) + | | | heap_keys_updated: false 0x2bc-NA (0) + | | | heap_hot_updated: false 0x2bc-NA (0) + | | | heap_only_tuple: false 0x2bc-NA (0) 0x2b0| 01 09 | .. | t_infomask: 2305 0x2bc-0x2bd.7 (2) - | | | Infomask{}: 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASNULL: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_COMBOCID: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_UPDATED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED: 0 0x2bc-0x2bd.7 (2) + | | | infomask{}: 0x2be-NA (0) + | | | heap_hasnull: true 0x2be-NA (0) + | | | heap_hasvarwidth: false 0x2be-NA (0) + | | | heap_hasexternal: false 0x2be-NA (0) + | | | heap_hasoid_old: false 0x2be-NA (0) + | | | heap_xmax_keyshr_lock: false 0x2be-NA (0) + | | | heap_combocid: false 0x2be-NA (0) + | | | heap_xmax_excl_lock: false 0x2be-NA (0) + | | | heap_xmax_lock_only: false 0x2be-NA (0) + | | | heap_xmax_shr_lock: false 0x2be-NA (0) + | | | heap_lock_mask: false 0x2be-NA (0) + | | | heap_xmin_committed: true 0x2be-NA (0) + | | | heap_xmin_invalid: false 0x2be-NA (0) + | | | heap_xmin_frozen: true 0x2be-NA (0) + | | | heap_xmax_committed: false 0x2be-NA (0) + | | | heap_xmax_invalid: true 0x2be-NA (0) + | | | heap_xmax_is_multi: false 0x2be-NA (0) + | | | heap_updated: false 0x2be-NA (0) + | | | heap_moved_off: false 0x2be-NA (0) + | | | heap_moved_in: false 0x2be-NA (0) + | | | heap_moved: false 0x2be-NA (0) 0x2b0| 18 | . | t_hoff: 24 0x2be-0x2be.7 (1) 0x2b0| 1f| .| padding0: 31 0x2bf-0x2bf.7 (1) -0x2c0|09 00 00 00 01 00 00 00 17 13 00 00 50 ed ff ff|............P...| Data: "09000000010000001713000050edffffe8934c237a88020..." (raw bits) 0x2c0-0x2d7.7 (24) +0x2c0|09 00 00 00 01 00 00 00 17 13 00 00 50 ed ff ff|............P...| data: "09000000010000001713000050edffffe8934c237a88020..." (raw bits) 0x2c0-0x2d7.7 (24) 0x2d0|e8 93 4c 23 7a 88 02 00 |..L#z... | diff --git a/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest b/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest index 10c6f75b8..0acab8372 100644 --- a/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee11 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 90150 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee11 ".[0].page_header.pd_linp[0,-1] | dv" 90150 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[60]{}: ItemIdData 0x104-0x107.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[60]{}: item_id 0x104-0x107.7 (4) 0x100| 68 81 f2 00 | h... | lp_off: 360 0x104-0x107.7 (4) 0x100| 68 81 f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x104-0x107.7 (4) 0x100| 68 81 f2 00 | h... | lp_len: 121 0x104-0x107.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest b/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest index 621706007..520105c02 100644 --- a/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest +++ b/format/postgres/testdata/flavours/pgproee11/90153_2.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee11 ".[0].Tuples[0,-1] | dv" 90153 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x11d8-0x11ff.7 (40) - | | | HeapTupleHeaderData{}: 0x11d8-0x11ef.7 (24) +$ fq -d pg_heap -o flavour=pgproee11 ".[0].tuples[0,-1] | dv" 90153 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x11d8-0x11ff.7 (40) + | | | header{}: 0x11d8-0x11ef.7 (24) | | | t_choice{}: 0x11d8-0x11e3.7 (12) | | | t_heap{}: 0x11d8-0x11e3.7 (12) -0x11d0| 66 b2 02 00 | f... | t_xmin: "10015117002" (176742) 0x11d8-0x11db.7 (4) +0x11d0| 66 b2 02 00 | f... | t_xmin: 176742 0x11d8-0x11db.7 (4) 0x11d0| 00 00 00 00| ....| t_xmax: 0 0x11dc-0x11df.7 (4) | | | t_field3{}: 0x11e0-0x11e3.7 (4) 0x11e0|01 00 00 00 |.... | t_cid: 1 0x11e0-0x11e3.7 (4) @@ -16,41 +16,41 @@ $ fq -d pg_heap -o flavour=pgproee11 ".[0].Tuples[0,-1] | dv" 90153 0x11e0| 00 00 00 00 | .... | ip_blkid: 0 0x11e4-0x11e7.7 (4) 0x11e0| 04 00 | .. | ip_posid: 4 0x11e8-0x11e9.7 (2) 0x11e0| 04 80 | .. | t_infomask2: 32772 0x11ea-0x11eb.7 (2) - | | | Infomask2{}: 0x11ea-0x11eb.7 (2) -0x11e0| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x11ea-0x11eb.7 (2) -0x11e0| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x11ea-0x11eb.7 (2) -0x11e0| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x11ea-0x11eb.7 (2) + | | | infomask2{}: 0x11ec-NA (0) + | | | heap_keys_updated: false 0x11ec-NA (0) + | | | heap_hot_updated: false 0x11ec-NA (0) + | | | heap_only_tuple: true 0x11ec-NA (0) 0x11e0| 01 29 | .) | t_infomask: 10497 0x11ec-0x11ed.7 (2) - | | | Infomask{}: 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_HASNULL: 1 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_HASVARWIDTH: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_HASEXTERNAL: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_HASOID_OLD: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_KEYSHR_LOCK: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_COMBOCID: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_EXCL_LOCK: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_LOCK_ONLY: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_SHR_LOCK: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_LOCK_MASK: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMIN_COMMITTED: 1 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMIN_INVALID: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMIN_FROZEN: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_COMMITTED: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_INVALID: 1 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_XMAX_IS_MULTI: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_UPDATED: 1 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_MOVED_OFF: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_MOVED_IN: 0 0x11ec-0x11ed.7 (2) -0x11e0| 01 29 | .) | HEAP_MOVED: 0 0x11ec-0x11ed.7 (2) + | | | infomask{}: 0x11ee-NA (0) + | | | heap_hasnull: true 0x11ee-NA (0) + | | | heap_hasvarwidth: false 0x11ee-NA (0) + | | | heap_hasexternal: false 0x11ee-NA (0) + | | | heap_hasoid_old: false 0x11ee-NA (0) + | | | heap_xmax_keyshr_lock: false 0x11ee-NA (0) + | | | heap_combocid: false 0x11ee-NA (0) + | | | heap_xmax_excl_lock: false 0x11ee-NA (0) + | | | heap_xmax_lock_only: false 0x11ee-NA (0) + | | | heap_xmax_shr_lock: false 0x11ee-NA (0) + | | | heap_lock_mask: false 0x11ee-NA (0) + | | | heap_xmin_committed: true 0x11ee-NA (0) + | | | heap_xmin_invalid: false 0x11ee-NA (0) + | | | heap_xmin_frozen: true 0x11ee-NA (0) + | | | heap_xmax_committed: false 0x11ee-NA (0) + | | | heap_xmax_invalid: true 0x11ee-NA (0) + | | | heap_xmax_is_multi: false 0x11ee-NA (0) + | | | heap_updated: true 0x11ee-NA (0) + | | | heap_moved_off: false 0x11ee-NA (0) + | | | heap_moved_in: false 0x11ee-NA (0) + | | | heap_moved: false 0x11ee-NA (0) 0x11e0| 18 | . | t_hoff: 24 0x11ee-0x11ee.7 (1) 0x11e0| 07| .| padding0: 7 0x11ef-0x11ef.7 (1) -0x11f0|65 00 00 00 0b 00 00 00 4f f8 00 00 |e.......O... | Data: "650000000b0000004ff80000" (raw bits) 0x11f0-0x11fb.7 (12) +0x11f0|65 00 00 00 0b 00 00 00 4f f8 00 00 |e.......O... | data: "650000000b0000004ff80000" (raw bits) 0x11f0-0x11fb.7 (12) 0x11f0| 00 00 00 00| ....| padding1: "00000000" (raw bits) 0x11fc-0x11ff.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[99]{}: Tuple 0x1818-0x183f.7 (40) - | | | HeapTupleHeaderData{}: 0x1818-0x182f.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[99]{}: tuple 0x1818-0x183f.7 (40) + | | | header{}: 0x1818-0x182f.7 (24) | | | t_choice{}: 0x1818-0x1823.7 (12) | | | t_heap{}: 0x1818-0x1823.7 (12) -0x1810| 54 b0 02 00 | T... | t_xmin: "10015116472" (176212) 0x1818-0x181b.7 (4) +0x1810| 54 b0 02 00 | T... | t_xmin: 176212 0x1818-0x181b.7 (4) 0x1810| 00 00 00 00| ....| t_xmax: 0 0x181c-0x181f.7 (4) | | | t_field3{}: 0x1820-0x1823.7 (4) 0x1820|01 00 00 00 |.... | t_cid: 1 0x1820-0x1823.7 (4) @@ -63,33 +63,33 @@ $ fq -d pg_heap -o flavour=pgproee11 ".[0].Tuples[0,-1] | dv" 90153 0x1820| 00 00 00 00 | .... | ip_blkid: 0 0x1824-0x1827.7 (4) 0x1820| fe 00 | .. | ip_posid: 254 0x1828-0x1829.7 (2) 0x1820| 04 80 | .. | t_infomask2: 32772 0x182a-0x182b.7 (2) - | | | Infomask2{}: 0x182a-0x182b.7 (2) -0x1820| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x182a-0x182b.7 (2) -0x1820| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x182a-0x182b.7 (2) -0x1820| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x182a-0x182b.7 (2) + | | | infomask2{}: 0x182c-NA (0) + | | | heap_keys_updated: false 0x182c-NA (0) + | | | heap_hot_updated: false 0x182c-NA (0) + | | | heap_only_tuple: true 0x182c-NA (0) 0x1820| 01 29 | .) | t_infomask: 10497 0x182c-0x182d.7 (2) - | | | Infomask{}: 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_HASNULL: 1 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_HASVARWIDTH: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_HASEXTERNAL: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_HASOID_OLD: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_KEYSHR_LOCK: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_COMBOCID: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_EXCL_LOCK: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_LOCK_ONLY: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_SHR_LOCK: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_LOCK_MASK: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMIN_COMMITTED: 1 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMIN_INVALID: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMIN_FROZEN: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_COMMITTED: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_INVALID: 1 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_XMAX_IS_MULTI: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_UPDATED: 1 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_MOVED_OFF: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_MOVED_IN: 0 0x182c-0x182d.7 (2) -0x1820| 01 29 | .) | HEAP_MOVED: 0 0x182c-0x182d.7 (2) + | | | infomask{}: 0x182e-NA (0) + | | | heap_hasnull: true 0x182e-NA (0) + | | | heap_hasvarwidth: false 0x182e-NA (0) + | | | heap_hasexternal: false 0x182e-NA (0) + | | | heap_hasoid_old: false 0x182e-NA (0) + | | | heap_xmax_keyshr_lock: false 0x182e-NA (0) + | | | heap_combocid: false 0x182e-NA (0) + | | | heap_xmax_excl_lock: false 0x182e-NA (0) + | | | heap_xmax_lock_only: false 0x182e-NA (0) + | | | heap_xmax_shr_lock: false 0x182e-NA (0) + | | | heap_lock_mask: false 0x182e-NA (0) + | | | heap_xmin_committed: true 0x182e-NA (0) + | | | heap_xmin_invalid: false 0x182e-NA (0) + | | | heap_xmin_frozen: true 0x182e-NA (0) + | | | heap_xmax_committed: false 0x182e-NA (0) + | | | heap_xmax_invalid: true 0x182e-NA (0) + | | | heap_xmax_is_multi: false 0x182e-NA (0) + | | | heap_updated: true 0x182e-NA (0) + | | | heap_moved_off: false 0x182e-NA (0) + | | | heap_moved_in: false 0x182e-NA (0) + | | | heap_moved: false 0x182e-NA (0) 0x1820| 18 | . | t_hoff: 24 0x182e-0x182e.7 (1) 0x1820| 07| .| padding0: 7 0x182f-0x182f.7 (1) -0x1830|64 00 00 00 0a 00 00 00 41 59 00 00 |d.......AY.. | Data: "640000000a00000041590000" (raw bits) 0x1830-0x183b.7 (12) +0x1830|64 00 00 00 0a 00 00 00 41 59 00 00 |d.......AY.. | data: "640000000a00000041590000" (raw bits) 0x1830-0x183b.7 (12) 0x1830| 00 00 00 00| ....| padding1: "00000000" (raw bits) 0x183c-0x183f.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest index 7d3a566a5..12553ab78 100644 --- a/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee12 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee12 ".[0].page_header.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[65]{}: ItemIdData 0x118-0x11b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[65]{}: item_id 0x118-0x11b.7 (4) 0x110| 68 81 f2 00 | h... | lp_off: 360 0x118-0x11b.7 (4) 0x110| 68 81 f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x118-0x11b.7 (4) 0x110| 68 81 f2 00 | h... | lp_len: 121 0x118-0x11b.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest b/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest index f3c466aaf..bb905ea76 100644 --- a/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee12 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee12 ".[0].page_header.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_off: 8120 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_len: 48 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[155]{}: ItemIdData 0x280-0x283.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[155]{}: item_id 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_off: 680 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_flags: "LP_NORMAL" (1) 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_len: 48 0x280-0x283.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest b/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest index 211d974e1..05871daeb 100644 --- a/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/16406_2.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee12 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fb8-0x1fe7.7 (48) - | | | HeapTupleHeaderData{}: 0x1fb8-0x1fcf.7 (24) +$ fq -d pg_heap -o flavour=pgproee12 ".[0].tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fb8-0x1fe7.7 (48) + | | | header{}: 0x1fb8-0x1fcf.7 (24) | | | t_choice{}: 0x1fb8-0x1fc3.7 (12) | | | t_heap{}: 0x1fb8-0x1fc3.7 (12) -0x1fb0| 03 00 00 00 | .... | t_xmin: "10000000509" (3) 0x1fb8-0x1fbb.7 (4) +0x1fb0| 03 00 00 00 | .... | t_xmin: 3 0x1fb8-0x1fbb.7 (4) 0x1fb0| 00 00 00 00| ....| t_xmax: 0 0x1fbc-0x1fbf.7 (4) | | | t_field3{}: 0x1fc0-0x1fc3.7 (4) 0x1fc0|03 00 00 00 |.... | t_cid: 3 0x1fc0-0x1fc3.7 (4) @@ -16,41 +16,41 @@ $ fq -d pg_heap -o flavour=pgproee12 ".[0].Tuples[0,-1] | dv" 16406 0x1fc0| 00 00 00 00 | .... | ip_blkid: 0 0x1fc4-0x1fc7.7 (4) 0x1fc0| 01 00 | .. | ip_posid: 1 0x1fc8-0x1fc9.7 (2) 0x1fc0| 06 00 | .. | t_infomask2: 6 0x1fca-0x1fcb.7 (2) - | | | Infomask2{}: 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fca-0x1fcb.7 (2) + | | | infomask2{}: 0x1fcc-NA (0) + | | | heap_keys_updated: false 0x1fcc-NA (0) + | | | heap_hot_updated: false 0x1fcc-NA (0) + | | | heap_only_tuple: false 0x1fcc-NA (0) 0x1fc0| 01 09 | .. | t_infomask: 2305 0x1fcc-0x1fcd.7 (2) - | | | Infomask{}: 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASNULL: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_UPDATED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED: 0 0x1fcc-0x1fcd.7 (2) + | | | infomask{}: 0x1fce-NA (0) + | | | heap_hasnull: true 0x1fce-NA (0) + | | | heap_hasvarwidth: false 0x1fce-NA (0) + | | | heap_hasexternal: false 0x1fce-NA (0) + | | | heap_hasoid_old: false 0x1fce-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fce-NA (0) + | | | heap_combocid: false 0x1fce-NA (0) + | | | heap_xmax_excl_lock: false 0x1fce-NA (0) + | | | heap_xmax_lock_only: false 0x1fce-NA (0) + | | | heap_xmax_shr_lock: false 0x1fce-NA (0) + | | | heap_lock_mask: false 0x1fce-NA (0) + | | | heap_xmin_committed: true 0x1fce-NA (0) + | | | heap_xmin_invalid: false 0x1fce-NA (0) + | | | heap_xmin_frozen: true 0x1fce-NA (0) + | | | heap_xmax_committed: false 0x1fce-NA (0) + | | | heap_xmax_invalid: true 0x1fce-NA (0) + | | | heap_xmax_is_multi: false 0x1fce-NA (0) + | | | heap_updated: false 0x1fce-NA (0) + | | | heap_moved_off: false 0x1fce-NA (0) + | | | heap_moved_in: false 0x1fce-NA (0) + | | | heap_moved: false 0x1fce-NA (0) 0x1fc0| 18 | . | t_hoff: 24 0x1fce-0x1fce.7 (1) 0x1fc0| 1f| .| padding0: 31 0x1fcf-0x1fcf.7 (1) -0x1fd0|02 00 00 00 01 00 00 00 38 fd 00 00 89 0c 00 00|........8.......| Data: "020000000100000038fd0000890c0000c025676d6388020..." (raw bits) 0x1fd0-0x1fe7.7 (24) +0x1fd0|02 00 00 00 01 00 00 00 38 fd 00 00 89 0c 00 00|........8.......| data: "020000000100000038fd0000890c0000c025676d6388020..." (raw bits) 0x1fd0-0x1fe7.7 (24) 0x1fe0|c0 25 67 6d 63 88 02 00 |.%gmc... | - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[155]{}: Tuple 0x2a8-0x2d7.7 (48) - | | | HeapTupleHeaderData{}: 0x2a8-0x2bf.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[155]{}: tuple 0x2a8-0x2d7.7 (48) + | | | header{}: 0x2a8-0x2bf.7 (24) | | | t_choice{}: 0x2a8-0x2b3.7 (12) | | | t_heap{}: 0x2a8-0x2b3.7 (12) -0x2a0| 9e 00 00 00 | .... | t_xmin: "10000000664" (158) 0x2a8-0x2ab.7 (4) +0x2a0| 9e 00 00 00 | .... | t_xmin: 158 0x2a8-0x2ab.7 (4) 0x2a0| 00 00 00 00| ....| t_xmax: 0 0x2ac-0x2af.7 (4) | | | t_field3{}: 0x2b0-0x2b3.7 (4) 0x2b0|03 00 00 00 |.... | t_cid: 3 0x2b0-0x2b3.7 (4) @@ -63,33 +63,33 @@ $ fq -d pg_heap -o flavour=pgproee12 ".[0].Tuples[0,-1] | dv" 16406 0x2b0| 00 00 00 00 | .... | ip_blkid: 0 0x2b4-0x2b7.7 (4) 0x2b0| 9c 00 | .. | ip_posid: 156 0x2b8-0x2b9.7 (2) 0x2b0| 06 00 | .. | t_infomask2: 6 0x2ba-0x2bb.7 (2) - | | | Infomask2{}: 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2ba-0x2bb.7 (2) + | | | infomask2{}: 0x2bc-NA (0) + | | | heap_keys_updated: false 0x2bc-NA (0) + | | | heap_hot_updated: false 0x2bc-NA (0) + | | | heap_only_tuple: false 0x2bc-NA (0) 0x2b0| 01 09 | .. | t_infomask: 2305 0x2bc-0x2bd.7 (2) - | | | Infomask{}: 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASNULL: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_COMBOCID: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_UPDATED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED: 0 0x2bc-0x2bd.7 (2) + | | | infomask{}: 0x2be-NA (0) + | | | heap_hasnull: true 0x2be-NA (0) + | | | heap_hasvarwidth: false 0x2be-NA (0) + | | | heap_hasexternal: false 0x2be-NA (0) + | | | heap_hasoid_old: false 0x2be-NA (0) + | | | heap_xmax_keyshr_lock: false 0x2be-NA (0) + | | | heap_combocid: false 0x2be-NA (0) + | | | heap_xmax_excl_lock: false 0x2be-NA (0) + | | | heap_xmax_lock_only: false 0x2be-NA (0) + | | | heap_xmax_shr_lock: false 0x2be-NA (0) + | | | heap_lock_mask: false 0x2be-NA (0) + | | | heap_xmin_committed: true 0x2be-NA (0) + | | | heap_xmin_invalid: false 0x2be-NA (0) + | | | heap_xmin_frozen: true 0x2be-NA (0) + | | | heap_xmax_committed: false 0x2be-NA (0) + | | | heap_xmax_invalid: true 0x2be-NA (0) + | | | heap_xmax_is_multi: false 0x2be-NA (0) + | | | heap_updated: false 0x2be-NA (0) + | | | heap_moved_off: false 0x2be-NA (0) + | | | heap_moved_in: false 0x2be-NA (0) + | | | heap_moved: false 0x2be-NA (0) 0x2b0| 18 | . | t_hoff: 24 0x2be-0x2be.7 (1) 0x2b0| 1f| .| padding0: 31 0x2bf-0x2bf.7 (1) -0x2c0|08 00 00 00 01 00 00 00 e4 f5 00 00 c9 06 00 00|................| Data: "0800000001000000e4f50000c9060000d0a36f6d6388020..." (raw bits) 0x2c0-0x2d7.7 (24) +0x2c0|08 00 00 00 01 00 00 00 e4 f5 00 00 c9 06 00 00|................| data: "0800000001000000e4f50000c9060000d0a36f6d6388020..." (raw bits) 0x2c0-0x2d7.7 (24) 0x2d0|d0 a3 6f 6d 63 88 02 00 |..omc... | diff --git a/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest index 2792304b5..cd5d39c47 100644 --- a/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee13 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee13 ".[0].page_header.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[68]{}: ItemIdData 0x124-0x127.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[68]{}: item_id 0x124-0x127.7 (4) 0x120| 68 81 f2 00 | h... | lp_off: 360 0x124-0x127.7 (4) 0x120| 68 81 f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x124-0x127.7 (4) 0x120| 68 81 f2 00 | h... | lp_len: 121 0x124-0x127.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest b/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest index 063f35fb6..307c95577 100644 --- a/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee13 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee13 ".[0].page_header.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_off: 8120 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_len: 48 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[155]{}: ItemIdData 0x280-0x283.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[155]{}: item_id 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_off: 680 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_flags: "LP_NORMAL" (1) 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_len: 48 0x280-0x283.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest b/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest index 23c80ec5f..f2bd51aa5 100644 --- a/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest +++ b/format/postgres/testdata/flavours/pgproee13/16406_2.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee13 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fb8-0x1fe7.7 (48) - | | | HeapTupleHeaderData{}: 0x1fb8-0x1fcf.7 (24) +$ fq -d pg_heap -o flavour=pgproee13 ".[0].tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fb8-0x1fe7.7 (48) + | | | header{}: 0x1fb8-0x1fcf.7 (24) | | | t_choice{}: 0x1fb8-0x1fc3.7 (12) | | | t_heap{}: 0x1fb8-0x1fc3.7 (12) -0x1fb0| 03 00 00 00 | .... | t_xmin: "10000000510" (3) 0x1fb8-0x1fbb.7 (4) +0x1fb0| 03 00 00 00 | .... | t_xmin: 3 0x1fb8-0x1fbb.7 (4) 0x1fb0| 00 00 00 00| ....| t_xmax: 0 0x1fbc-0x1fbf.7 (4) | | | t_field3{}: 0x1fc0-0x1fc3.7 (4) 0x1fc0|03 00 00 00 |.... | t_cid: 3 0x1fc0-0x1fc3.7 (4) @@ -16,41 +16,41 @@ $ fq -d pg_heap -o flavour=pgproee13 ".[0].Tuples[0,-1] | dv" 16406 0x1fc0| 00 00 00 00 | .... | ip_blkid: 0 0x1fc4-0x1fc7.7 (4) 0x1fc0| 01 00 | .. | ip_posid: 1 0x1fc8-0x1fc9.7 (2) 0x1fc0| 06 00 | .. | t_infomask2: 6 0x1fca-0x1fcb.7 (2) - | | | Infomask2{}: 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fca-0x1fcb.7 (2) -0x1fc0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fca-0x1fcb.7 (2) + | | | infomask2{}: 0x1fcc-NA (0) + | | | heap_keys_updated: false 0x1fcc-NA (0) + | | | heap_hot_updated: false 0x1fcc-NA (0) + | | | heap_only_tuple: false 0x1fcc-NA (0) 0x1fc0| 01 09 | .. | t_infomask: 2305 0x1fcc-0x1fcd.7 (2) - | | | Infomask{}: 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASNULL: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_UPDATED: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fcc-0x1fcd.7 (2) -0x1fc0| 01 09 | .. | HEAP_MOVED: 0 0x1fcc-0x1fcd.7 (2) + | | | infomask{}: 0x1fce-NA (0) + | | | heap_hasnull: true 0x1fce-NA (0) + | | | heap_hasvarwidth: false 0x1fce-NA (0) + | | | heap_hasexternal: false 0x1fce-NA (0) + | | | heap_hasoid_old: false 0x1fce-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fce-NA (0) + | | | heap_combocid: false 0x1fce-NA (0) + | | | heap_xmax_excl_lock: false 0x1fce-NA (0) + | | | heap_xmax_lock_only: false 0x1fce-NA (0) + | | | heap_xmax_shr_lock: false 0x1fce-NA (0) + | | | heap_lock_mask: false 0x1fce-NA (0) + | | | heap_xmin_committed: true 0x1fce-NA (0) + | | | heap_xmin_invalid: false 0x1fce-NA (0) + | | | heap_xmin_frozen: true 0x1fce-NA (0) + | | | heap_xmax_committed: false 0x1fce-NA (0) + | | | heap_xmax_invalid: true 0x1fce-NA (0) + | | | heap_xmax_is_multi: false 0x1fce-NA (0) + | | | heap_updated: false 0x1fce-NA (0) + | | | heap_moved_off: false 0x1fce-NA (0) + | | | heap_moved_in: false 0x1fce-NA (0) + | | | heap_moved: false 0x1fce-NA (0) 0x1fc0| 18 | . | t_hoff: 24 0x1fce-0x1fce.7 (1) 0x1fc0| 1f| .| padding0: 31 0x1fcf-0x1fcf.7 (1) -0x1fd0|01 00 00 00 01 00 00 00 76 cd 00 00 3d fc ff ff|........v...=...| Data: "010000000100000076cd00003dfcffff088e15d47788020..." (raw bits) 0x1fd0-0x1fe7.7 (24) +0x1fd0|01 00 00 00 01 00 00 00 76 cd 00 00 3d fc ff ff|........v...=...| data: "010000000100000076cd00003dfcffff088e15d47788020..." (raw bits) 0x1fd0-0x1fe7.7 (24) 0x1fe0|08 8e 15 d4 77 88 02 00 |....w... | - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[155]{}: Tuple 0x2a8-0x2d7.7 (48) - | | | HeapTupleHeaderData{}: 0x2a8-0x2bf.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[155]{}: tuple 0x2a8-0x2d7.7 (48) + | | | header{}: 0x2a8-0x2bf.7 (24) | | | t_choice{}: 0x2a8-0x2b3.7 (12) | | | t_heap{}: 0x2a8-0x2b3.7 (12) -0x2a0| 9e 00 00 00 | .... | t_xmin: "10000000665" (158) 0x2a8-0x2ab.7 (4) +0x2a0| 9e 00 00 00 | .... | t_xmin: 158 0x2a8-0x2ab.7 (4) 0x2a0| 00 00 00 00| ....| t_xmax: 0 0x2ac-0x2af.7 (4) | | | t_field3{}: 0x2b0-0x2b3.7 (4) 0x2b0|03 00 00 00 |.... | t_cid: 3 0x2b0-0x2b3.7 (4) @@ -63,33 +63,33 @@ $ fq -d pg_heap -o flavour=pgproee13 ".[0].Tuples[0,-1] | dv" 16406 0x2b0| 00 00 00 00 | .... | ip_blkid: 0 0x2b4-0x2b7.7 (4) 0x2b0| 9c 00 | .. | ip_posid: 156 0x2b8-0x2b9.7 (2) 0x2b0| 06 00 | .. | t_infomask2: 6 0x2ba-0x2bb.7 (2) - | | | Infomask2{}: 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2ba-0x2bb.7 (2) -0x2b0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2ba-0x2bb.7 (2) + | | | infomask2{}: 0x2bc-NA (0) + | | | heap_keys_updated: false 0x2bc-NA (0) + | | | heap_hot_updated: false 0x2bc-NA (0) + | | | heap_only_tuple: false 0x2bc-NA (0) 0x2b0| 01 09 | .. | t_infomask: 2305 0x2bc-0x2bd.7 (2) - | | | Infomask{}: 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASNULL: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_COMBOCID: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_UPDATED: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2bc-0x2bd.7 (2) -0x2b0| 01 09 | .. | HEAP_MOVED: 0 0x2bc-0x2bd.7 (2) + | | | infomask{}: 0x2be-NA (0) + | | | heap_hasnull: true 0x2be-NA (0) + | | | heap_hasvarwidth: false 0x2be-NA (0) + | | | heap_hasexternal: false 0x2be-NA (0) + | | | heap_hasoid_old: false 0x2be-NA (0) + | | | heap_xmax_keyshr_lock: false 0x2be-NA (0) + | | | heap_combocid: false 0x2be-NA (0) + | | | heap_xmax_excl_lock: false 0x2be-NA (0) + | | | heap_xmax_lock_only: false 0x2be-NA (0) + | | | heap_xmax_shr_lock: false 0x2be-NA (0) + | | | heap_lock_mask: false 0x2be-NA (0) + | | | heap_xmin_committed: true 0x2be-NA (0) + | | | heap_xmin_invalid: false 0x2be-NA (0) + | | | heap_xmin_frozen: true 0x2be-NA (0) + | | | heap_xmax_committed: false 0x2be-NA (0) + | | | heap_xmax_invalid: true 0x2be-NA (0) + | | | heap_xmax_is_multi: false 0x2be-NA (0) + | | | heap_updated: false 0x2be-NA (0) + | | | heap_moved_off: false 0x2be-NA (0) + | | | heap_moved_in: false 0x2be-NA (0) + | | | heap_moved: false 0x2be-NA (0) 0x2b0| 18 | . | t_hoff: 24 0x2be-0x2be.7 (1) 0x2b0| 1f| .| padding0: 31 0x2bf-0x2bf.7 (1) -0x2c0|04 00 00 00 01 00 00 00 71 8a 00 00 81 fb ff ff|........q.......| Data: "0400000001000000718a000081fbffff546f1cd47788020..." (raw bits) 0x2c0-0x2d7.7 (24) +0x2c0|04 00 00 00 01 00 00 00 71 8a 00 00 81 fb ff ff|........q.......| data: "0400000001000000718a000081fbffff546f1cd47788020..." (raw bits) 0x2c0-0x2d7.7 (24) 0x2d0|54 6f 1c d4 77 88 02 00 |To..w... | diff --git a/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest index ca8168286..85a3ba7ae 100644 --- a/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee14 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee14 ".[0].page_header.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| 53 00 01 00 | S... | lp_off: 83 0x14-0x17.7 (4) 0x10| 53 00 01 00 | S... | lp_flags: "LP_REDIRECT" (2) 0x14-0x17.7 (4) 0x10| 53 00 01 00 | S... | lp_len: 0 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[85]{}: ItemIdData 0x168-0x16b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[85]{}: item_id 0x168-0x16b.7 (4) 0x160| e8 81 f2 00 | .... | lp_off: 488 0x168-0x16b.7 (4) 0x160| e8 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x168-0x16b.7 (4) 0x160| e8 81 f2 00 | .... | lp_len: 121 0x168-0x16b.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee14/16451_1.fqtest b/format/postgres/testdata/flavours/pgproee14/16451_1.fqtest index 314e54d69..a0501efd4 100644 --- a/format/postgres/testdata/flavours/pgproee14/16451_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee14/16451_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee14 ".[0].Tuples[1,2,3] | dv" 16451 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[1]{}: Tuple 0x1f78-0x1faf.7 (56) - | | | HeapTupleHeaderData{}: 0x1f78-0x1f8f.7 (24) +$ fq -d pg_heap -o flavour=pgproee14 ".[0].tuples[1,2,3] | dv" 16451 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[1]{}: tuple 0x1f78-0x1faf.7 (56) + | | | header{}: 0x1f78-0x1f8f.7 (24) | | | t_choice{}: 0x1f78-0x1f83.7 (12) | | | t_heap{}: 0x1f78-0x1f83.7 (12) -0x1f70| 04 00 00 00 | .... | t_xmin: "10000040106" (4) 0x1f78-0x1f7b.7 (4) +0x1f70| 04 00 00 00 | .... | t_xmin: 4 0x1f78-0x1f7b.7 (4) 0x1f70| 00 00 00 00| ....| t_xmax: 0 0x1f7c-0x1f7f.7 (4) | | | t_field3{}: 0x1f80-0x1f83.7 (4) 0x1f80|00 00 00 00 |.... | t_cid: 0 0x1f80-0x1f83.7 (4) @@ -16,41 +16,41 @@ $ fq -d pg_heap -o flavour=pgproee14 ".[0].Tuples[1,2,3] | dv" 16451 0x1f80| 00 00 00 00 | .... | ip_blkid: 0 0x1f84-0x1f87.7 (4) 0x1f80| 02 00 | .. | ip_posid: 2 0x1f88-0x1f89.7 (2) 0x1f80| 03 00 | .. | t_infomask2: 3 0x1f8a-0x1f8b.7 (2) - | | | Infomask2{}: 0x1f8a-0x1f8b.7 (2) -0x1f80| 03 00 | .. | HEAP_KEYS_UPDATED: 0 0x1f8a-0x1f8b.7 (2) -0x1f80| 03 00 | .. | HEAP_HOT_UPDATED: 0 0x1f8a-0x1f8b.7 (2) -0x1f80| 03 00 | .. | HEAP_ONLY_TUPLE: 0 0x1f8a-0x1f8b.7 (2) + | | | infomask2{}: 0x1f8c-NA (0) + | | | heap_keys_updated: false 0x1f8c-NA (0) + | | | heap_hot_updated: false 0x1f8c-NA (0) + | | | heap_only_tuple: false 0x1f8c-NA (0) 0x1f80| 02 09 | .. | t_infomask: 2306 0x1f8c-0x1f8d.7 (2) - | | | Infomask{}: 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_HASNULL: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_HASVARWIDTH: 1 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_HASEXTERNAL: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_HASOID_OLD: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_COMBOCID: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_LOCK_MASK: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_XMIN_INVALID: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_XMIN_FROZEN: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_XMAX_INVALID: 1 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_UPDATED: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_MOVED_OFF: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_MOVED_IN: 0 0x1f8c-0x1f8d.7 (2) -0x1f80| 02 09 | .. | HEAP_MOVED: 0 0x1f8c-0x1f8d.7 (2) + | | | infomask{}: 0x1f8e-NA (0) + | | | heap_hasnull: false 0x1f8e-NA (0) + | | | heap_hasvarwidth: true 0x1f8e-NA (0) + | | | heap_hasexternal: false 0x1f8e-NA (0) + | | | heap_hasoid_old: false 0x1f8e-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1f8e-NA (0) + | | | heap_combocid: false 0x1f8e-NA (0) + | | | heap_xmax_excl_lock: false 0x1f8e-NA (0) + | | | heap_xmax_lock_only: false 0x1f8e-NA (0) + | | | heap_xmax_shr_lock: false 0x1f8e-NA (0) + | | | heap_lock_mask: false 0x1f8e-NA (0) + | | | heap_xmin_committed: true 0x1f8e-NA (0) + | | | heap_xmin_invalid: false 0x1f8e-NA (0) + | | | heap_xmin_frozen: true 0x1f8e-NA (0) + | | | heap_xmax_committed: false 0x1f8e-NA (0) + | | | heap_xmax_invalid: true 0x1f8e-NA (0) + | | | heap_xmax_is_multi: false 0x1f8e-NA (0) + | | | heap_updated: false 0x1f8e-NA (0) + | | | heap_moved_off: false 0x1f8e-NA (0) + | | | heap_moved_in: false 0x1f8e-NA (0) + | | | heap_moved: false 0x1f8e-NA (0) 0x1f80| 18 | . | t_hoff: 24 0x1f8e-0x1f8e.7 (1) 0x1f80| 00| .| padding0: 0 0x1f8f-0x1f8f.7 (1) -0x1f90|02 00 00 00 23 31 31 31 31 31 31 31 31 31 31 31|....#11111111111| Data: "02000000233131313131313131313131313131313100000..." (raw bits) 0x1f90-0x1faf.7 (32) +0x1f90|02 00 00 00 23 31 31 31 31 31 31 31 31 31 31 31|....#11111111111| data: "02000000233131313131313131313131313131313100000..." (raw bits) 0x1f90-0x1faf.7 (32) 0x1fa0|31 31 31 31 31 00 00 00 ce fa be ba ff ff ff ff|11111...........| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[2]{}: Tuple 0x1f40-0x1f77.7 (56) - | | | HeapTupleHeaderData{}: 0x1f40-0x1f57.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[2]{}: tuple 0x1f40-0x1f77.7 (56) + | | | header{}: 0x1f40-0x1f57.7 (24) | | | t_choice{}: 0x1f40-0x1f4b.7 (12) | | | t_heap{}: 0x1f40-0x1f4b.7 (12) -0x1f40|04 00 00 00 |.... | t_xmin: "10000040106" (4) 0x1f40-0x1f43.7 (4) +0x1f40|04 00 00 00 |.... | t_xmin: 4 0x1f40-0x1f43.7 (4) 0x1f40| 00 00 00 00 | .... | t_xmax: 0 0x1f44-0x1f47.7 (4) | | | t_field3{}: 0x1f48-0x1f4b.7 (4) 0x1f40| 00 00 00 00 | .... | t_cid: 0 0x1f48-0x1f4b.7 (4) @@ -63,42 +63,42 @@ $ fq -d pg_heap -o flavour=pgproee14 ".[0].Tuples[1,2,3] | dv" 16451 0x1f40| 00 00 00 00| ....| ip_blkid: 0 0x1f4c-0x1f4f.7 (4) 0x1f50|03 00 |.. | ip_posid: 3 0x1f50-0x1f51.7 (2) 0x1f50| 03 00 | .. | t_infomask2: 3 0x1f52-0x1f53.7 (2) - | | | Infomask2{}: 0x1f52-0x1f53.7 (2) -0x1f50| 03 00 | .. | HEAP_KEYS_UPDATED: 0 0x1f52-0x1f53.7 (2) -0x1f50| 03 00 | .. | HEAP_HOT_UPDATED: 0 0x1f52-0x1f53.7 (2) -0x1f50| 03 00 | .. | HEAP_ONLY_TUPLE: 0 0x1f52-0x1f53.7 (2) + | | | infomask2{}: 0x1f54-NA (0) + | | | heap_keys_updated: false 0x1f54-NA (0) + | | | heap_hot_updated: false 0x1f54-NA (0) + | | | heap_only_tuple: false 0x1f54-NA (0) 0x1f50| 02 09 | .. | t_infomask: 2306 0x1f54-0x1f55.7 (2) - | | | Infomask{}: 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_HASNULL: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_HASVARWIDTH: 1 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_HASEXTERNAL: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_HASOID_OLD: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_COMBOCID: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_LOCK_MASK: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_XMIN_INVALID: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_XMIN_FROZEN: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_XMAX_INVALID: 1 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_UPDATED: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_MOVED_OFF: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_MOVED_IN: 0 0x1f54-0x1f55.7 (2) -0x1f50| 02 09 | .. | HEAP_MOVED: 0 0x1f54-0x1f55.7 (2) + | | | infomask{}: 0x1f56-NA (0) + | | | heap_hasnull: false 0x1f56-NA (0) + | | | heap_hasvarwidth: true 0x1f56-NA (0) + | | | heap_hasexternal: false 0x1f56-NA (0) + | | | heap_hasoid_old: false 0x1f56-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1f56-NA (0) + | | | heap_combocid: false 0x1f56-NA (0) + | | | heap_xmax_excl_lock: false 0x1f56-NA (0) + | | | heap_xmax_lock_only: false 0x1f56-NA (0) + | | | heap_xmax_shr_lock: false 0x1f56-NA (0) + | | | heap_lock_mask: false 0x1f56-NA (0) + | | | heap_xmin_committed: true 0x1f56-NA (0) + | | | heap_xmin_invalid: false 0x1f56-NA (0) + | | | heap_xmin_frozen: true 0x1f56-NA (0) + | | | heap_xmax_committed: false 0x1f56-NA (0) + | | | heap_xmax_invalid: true 0x1f56-NA (0) + | | | heap_xmax_is_multi: false 0x1f56-NA (0) + | | | heap_updated: false 0x1f56-NA (0) + | | | heap_moved_off: false 0x1f56-NA (0) + | | | heap_moved_in: false 0x1f56-NA (0) + | | | heap_moved: false 0x1f56-NA (0) 0x1f50| 18 | . | t_hoff: 24 0x1f56-0x1f56.7 (1) 0x1f50| 00 | . | padding0: 0 0x1f57-0x1f57.7 (1) -0x1f50| 03 00 00 00 23 32 32 32| ....#222| Data: "03000000233232323232323232323232323232323200000..." (raw bits) 0x1f58-0x1f77.7 (32) +0x1f50| 03 00 00 00 23 32 32 32| ....#222| data: "03000000233232323232323232323232323232323200000..." (raw bits) 0x1f58-0x1f77.7 (32) 0x1f60|32 32 32 32 32 32 32 32 32 32 32 32 32 00 00 00|2222222222222...| 0x1f70|ef cd ab 89 ff ff ff ff |........ | - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[3]{}: Tuple 0x1f08-0x1f3f.7 (56) - | | | HeapTupleHeaderData{}: 0x1f08-0x1f1f.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[3]{}: tuple 0x1f08-0x1f3f.7 (56) + | | | header{}: 0x1f08-0x1f1f.7 (24) | | | t_choice{}: 0x1f08-0x1f13.7 (12) | | | t_heap{}: 0x1f08-0x1f13.7 (12) -0x1f00| 04 00 00 00 | .... | t_xmin: "10000040106" (4) 0x1f08-0x1f0b.7 (4) +0x1f00| 04 00 00 00 | .... | t_xmin: 4 0x1f08-0x1f0b.7 (4) 0x1f00| 00 00 00 00| ....| t_xmax: 0 0x1f0c-0x1f0f.7 (4) | | | t_field3{}: 0x1f10-0x1f13.7 (4) 0x1f10|00 00 00 00 |.... | t_cid: 0 0x1f10-0x1f13.7 (4) @@ -111,33 +111,33 @@ $ fq -d pg_heap -o flavour=pgproee14 ".[0].Tuples[1,2,3] | dv" 16451 0x1f10| 00 00 00 00 | .... | ip_blkid: 0 0x1f14-0x1f17.7 (4) 0x1f10| 04 00 | .. | ip_posid: 4 0x1f18-0x1f19.7 (2) 0x1f10| 03 00 | .. | t_infomask2: 3 0x1f1a-0x1f1b.7 (2) - | | | Infomask2{}: 0x1f1a-0x1f1b.7 (2) -0x1f10| 03 00 | .. | HEAP_KEYS_UPDATED: 0 0x1f1a-0x1f1b.7 (2) -0x1f10| 03 00 | .. | HEAP_HOT_UPDATED: 0 0x1f1a-0x1f1b.7 (2) -0x1f10| 03 00 | .. | HEAP_ONLY_TUPLE: 0 0x1f1a-0x1f1b.7 (2) + | | | infomask2{}: 0x1f1c-NA (0) + | | | heap_keys_updated: false 0x1f1c-NA (0) + | | | heap_hot_updated: false 0x1f1c-NA (0) + | | | heap_only_tuple: false 0x1f1c-NA (0) 0x1f10| 02 09 | .. | t_infomask: 2306 0x1f1c-0x1f1d.7 (2) - | | | Infomask{}: 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_HASNULL: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_HASVARWIDTH: 1 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_HASEXTERNAL: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_HASOID_OLD: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_COMBOCID: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_LOCK_MASK: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_XMIN_INVALID: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_XMIN_FROZEN: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_XMAX_INVALID: 1 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_UPDATED: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_MOVED_OFF: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_MOVED_IN: 0 0x1f1c-0x1f1d.7 (2) -0x1f10| 02 09 | .. | HEAP_MOVED: 0 0x1f1c-0x1f1d.7 (2) + | | | infomask{}: 0x1f1e-NA (0) + | | | heap_hasnull: false 0x1f1e-NA (0) + | | | heap_hasvarwidth: true 0x1f1e-NA (0) + | | | heap_hasexternal: false 0x1f1e-NA (0) + | | | heap_hasoid_old: false 0x1f1e-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1f1e-NA (0) + | | | heap_combocid: false 0x1f1e-NA (0) + | | | heap_xmax_excl_lock: false 0x1f1e-NA (0) + | | | heap_xmax_lock_only: false 0x1f1e-NA (0) + | | | heap_xmax_shr_lock: false 0x1f1e-NA (0) + | | | heap_lock_mask: false 0x1f1e-NA (0) + | | | heap_xmin_committed: true 0x1f1e-NA (0) + | | | heap_xmin_invalid: false 0x1f1e-NA (0) + | | | heap_xmin_frozen: true 0x1f1e-NA (0) + | | | heap_xmax_committed: false 0x1f1e-NA (0) + | | | heap_xmax_invalid: true 0x1f1e-NA (0) + | | | heap_xmax_is_multi: false 0x1f1e-NA (0) + | | | heap_updated: false 0x1f1e-NA (0) + | | | heap_moved_off: false 0x1f1e-NA (0) + | | | heap_moved_in: false 0x1f1e-NA (0) + | | | heap_moved: false 0x1f1e-NA (0) 0x1f10| 18 | . | t_hoff: 24 0x1f1e-0x1f1e.7 (1) 0x1f10| 00| .| padding0: 0 0x1f1f-0x1f1f.7 (1) -0x1f20|04 00 00 00 23 33 33 33 33 33 33 33 33 33 33 33|....#33333333333| Data: "04000000233333333333333333333333333333333300000..." (raw bits) 0x1f20-0x1f3f.7 (32) +0x1f20|04 00 00 00 23 33 33 33 33 33 33 33 33 33 33 33|....#33333333333| data: "04000000233333333333333333333333333333333300000..." (raw bits) 0x1f20-0x1f3f.7 (32) 0x1f30|33 33 33 33 33 00 00 00 af be ad de ff ff ff ff|33333...........| diff --git a/format/postgres/testdata/flavours/postgres11/16396_1.fqtest b/format/postgres/testdata/flavours/postgres11/16396_1.fqtest index 217dab71d..0c2eaa74e 100644 --- a/format/postgres/testdata/flavours/postgres11/16396_1.fqtest +++ b/format/postgres/testdata/flavours/postgres11/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=postgres11 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres11 ".[0].page_header.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[82]{}: ItemIdData 0x160-0x163.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[82]{}: item_id 0x160-0x163.7 (4) 0x160|00 82 f2 00 |.... | lp_off: 512 0x160-0x163.7 (4) 0x160|00 82 f2 00 |.... | lp_flags: "LP_NORMAL" (1) 0x160-0x163.7 (4) 0x160|00 82 f2 00 |.... | lp_len: 121 0x160-0x163.7 (4) diff --git a/format/postgres/testdata/flavours/postgres11/16406_1.fqtest b/format/postgres/testdata/flavours/postgres11/16406_1.fqtest index 5db5c0fd3..261ec909c 100644 --- a/format/postgres/testdata/flavours/postgres11/16406_1.fqtest +++ b/format/postgres/testdata/flavours/postgres11/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=postgres11 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres11 ".[0].page_header.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/postgres11/16406_2.fqtest b/format/postgres/testdata/flavours/postgres11/16406_2.fqtest index fb1924445..6b53b61da 100644 --- a/format/postgres/testdata/flavours/postgres11/16406_2.fqtest +++ b/format/postgres/testdata/flavours/postgres11/16406_2.fqtest @@ -1,6 +1,6 @@ -$ fq -d pg_heap -o flavour=postgres11 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) - | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) +$ fq -d pg_heap -o flavour=postgres11 ".[0].tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fd0-0x1fff.7 (48) + | | | header{}: 0x1fd0-0x1fe7.7 (24) | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) 0x1fd0|45 02 00 00 |E... | t_xmin: 581 0x1fd0-0x1fd3.7 (4) @@ -16,38 +16,38 @@ $ fq -d pg_heap -o flavour=postgres11 ".[0].Tuples[0,-1] | dv" 16406 0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) 0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) 0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) + | | | infomask2{}: 0x1fe4-NA (0) + | | | heap_keys_updated: false 0x1fe4-NA (0) + | | | heap_hot_updated: false 0x1fe4-NA (0) + | | | heap_only_tuple: false 0x1fe4-NA (0) 0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) + | | | infomask{}: 0x1fe6-NA (0) + | | | heap_hasnull: true 0x1fe6-NA (0) + | | | heap_hasvarwidth: false 0x1fe6-NA (0) + | | | heap_hasexternal: false 0x1fe6-NA (0) + | | | heap_hasoid_old: false 0x1fe6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fe6-NA (0) + | | | heap_combocid: false 0x1fe6-NA (0) + | | | heap_xmax_excl_lock: false 0x1fe6-NA (0) + | | | heap_xmax_lock_only: false 0x1fe6-NA (0) + | | | heap_xmax_shr_lock: false 0x1fe6-NA (0) + | | | heap_lock_mask: false 0x1fe6-NA (0) + | | | heap_xmin_committed: true 0x1fe6-NA (0) + | | | heap_xmin_invalid: false 0x1fe6-NA (0) + | | | heap_xmin_frozen: true 0x1fe6-NA (0) + | | | heap_xmax_committed: false 0x1fe6-NA (0) + | | | heap_xmax_invalid: true 0x1fe6-NA (0) + | | | heap_xmax_is_multi: false 0x1fe6-NA (0) + | | | heap_updated: false 0x1fe6-NA (0) + | | | heap_moved_off: false 0x1fe6-NA (0) + | | | heap_moved_in: false 0x1fe6-NA (0) + | | | heap_moved: false 0x1fe6-NA (0) 0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) 0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 07 00 00 00 01 00 00 00| ........| Data: "07000000010000007419010097f5ffffb55804f05388020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1fe0| 07 00 00 00 01 00 00 00| ........| data: "07000000010000007419010097f5ffffb55804f05388020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|74 19 01 00 97 f5 ff ff b5 58 04 f0 53 88 02 00|t........X..S...| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) - | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[156]{}: tuple 0x290-0x2bf.7 (48) + | | | header{}: 0x290-0x2a7.7 (24) | | | t_choice{}: 0x290-0x29b.7 (12) | | | t_heap{}: 0x290-0x29b.7 (12) 0x290|e3 02 00 00 |.... | t_xmin: 739 0x290-0x293.7 (4) @@ -63,33 +63,33 @@ $ fq -d pg_heap -o flavour=postgres11 ".[0].Tuples[0,-1] | dv" 16406 0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) 0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) 0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) + | | | infomask2{}: 0x2a4-NA (0) + | | | heap_keys_updated: false 0x2a4-NA (0) + | | | heap_hot_updated: false 0x2a4-NA (0) + | | | heap_only_tuple: false 0x2a4-NA (0) 0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) + | | | infomask{}: 0x2a6-NA (0) + | | | heap_hasnull: true 0x2a6-NA (0) + | | | heap_hasvarwidth: false 0x2a6-NA (0) + | | | heap_hasexternal: false 0x2a6-NA (0) + | | | heap_hasoid_old: false 0x2a6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x2a6-NA (0) + | | | heap_combocid: false 0x2a6-NA (0) + | | | heap_xmax_excl_lock: false 0x2a6-NA (0) + | | | heap_xmax_lock_only: false 0x2a6-NA (0) + | | | heap_xmax_shr_lock: false 0x2a6-NA (0) + | | | heap_lock_mask: false 0x2a6-NA (0) + | | | heap_xmin_committed: true 0x2a6-NA (0) + | | | heap_xmin_invalid: false 0x2a6-NA (0) + | | | heap_xmin_frozen: true 0x2a6-NA (0) + | | | heap_xmax_committed: false 0x2a6-NA (0) + | | | heap_xmax_invalid: true 0x2a6-NA (0) + | | | heap_xmax_is_multi: false 0x2a6-NA (0) + | | | heap_updated: false 0x2a6-NA (0) + | | | heap_moved_off: false 0x2a6-NA (0) + | | | heap_moved_in: false 0x2a6-NA (0) + | | | heap_moved: false 0x2a6-NA (0) 0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) 0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 09 00 00 00 01 00 00 00| ........| Data: "0900000001000000feda000081050000e36412f05388020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2a0| 09 00 00 00 01 00 00 00| ........| data: "0900000001000000feda000081050000e36412f05388020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|fe da 00 00 81 05 00 00 e3 64 12 f0 53 88 02 00|.........d..S...| diff --git a/format/postgres/testdata/flavours/postgres12/16396_1.fqtest b/format/postgres/testdata/flavours/postgres12/16396_1.fqtest index 94834323c..5926a2d26 100644 --- a/format/postgres/testdata/flavours/postgres12/16396_1.fqtest +++ b/format/postgres/testdata/flavours/postgres12/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=postgres12 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres12 ".[0].page_header.pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[81]{}: ItemIdData 0x15c-0x15f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[81]{}: item_id 0x15c-0x15f.7 (4) 0x150| 00 82 f2 00| ....| lp_off: 512 0x15c-0x15f.7 (4) 0x150| 00 82 f2 00| ....| lp_flags: "LP_NORMAL" (1) 0x15c-0x15f.7 (4) 0x150| 00 82 f2 00| ....| lp_len: 121 0x15c-0x15f.7 (4) diff --git a/format/postgres/testdata/flavours/postgres12/16406_1.fqtest b/format/postgres/testdata/flavours/postgres12/16406_1.fqtest index f99fe4790..6ea97d77a 100644 --- a/format/postgres/testdata/flavours/postgres12/16406_1.fqtest +++ b/format/postgres/testdata/flavours/postgres12/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=postgres12 ".[0].PageHeaderData.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres12 ".[0].page_header.pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/postgres12/16406_2.fqtest b/format/postgres/testdata/flavours/postgres12/16406_2.fqtest index 1b9292c6a..83cb0ba75 100644 --- a/format/postgres/testdata/flavours/postgres12/16406_2.fqtest +++ b/format/postgres/testdata/flavours/postgres12/16406_2.fqtest @@ -1,6 +1,6 @@ -$ fq -d pg_heap -o flavour=postgres12 ".[0].Tuples[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) - | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) +$ fq -d pg_heap -o flavour=postgres12 ".[0].tuples[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fd0-0x1fff.7 (48) + | | | header{}: 0x1fd0-0x1fe7.7 (24) | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) 0x1fd0|f3 01 00 00 |.... | t_xmin: 499 0x1fd0-0x1fd3.7 (4) @@ -16,38 +16,38 @@ $ fq -d pg_heap -o flavour=postgres12 ".[0].Tuples[0,-1] | dv" 16406 0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) 0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) 0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) + | | | infomask2{}: 0x1fe4-NA (0) + | | | heap_keys_updated: false 0x1fe4-NA (0) + | | | heap_hot_updated: false 0x1fe4-NA (0) + | | | heap_only_tuple: false 0x1fe4-NA (0) 0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) + | | | infomask{}: 0x1fe6-NA (0) + | | | heap_hasnull: true 0x1fe6-NA (0) + | | | heap_hasvarwidth: false 0x1fe6-NA (0) + | | | heap_hasexternal: false 0x1fe6-NA (0) + | | | heap_hasoid_old: false 0x1fe6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fe6-NA (0) + | | | heap_combocid: false 0x1fe6-NA (0) + | | | heap_xmax_excl_lock: false 0x1fe6-NA (0) + | | | heap_xmax_lock_only: false 0x1fe6-NA (0) + | | | heap_xmax_shr_lock: false 0x1fe6-NA (0) + | | | heap_lock_mask: false 0x1fe6-NA (0) + | | | heap_xmin_committed: true 0x1fe6-NA (0) + | | | heap_xmin_invalid: false 0x1fe6-NA (0) + | | | heap_xmin_frozen: true 0x1fe6-NA (0) + | | | heap_xmax_committed: false 0x1fe6-NA (0) + | | | heap_xmax_invalid: true 0x1fe6-NA (0) + | | | heap_xmax_is_multi: false 0x1fe6-NA (0) + | | | heap_updated: false 0x1fe6-NA (0) + | | | heap_moved_off: false 0x1fe6-NA (0) + | | | heap_moved_in: false 0x1fe6-NA (0) + | | | heap_moved: false 0x1fe6-NA (0) 0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) 0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 01 00 00 00 01 00 00 00| ........| Data: "0100000001000000df60000041090000c772ccc34f88020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1fe0| 01 00 00 00 01 00 00 00| ........| data: "0100000001000000df60000041090000c772ccc34f88020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|df 60 00 00 41 09 00 00 c7 72 cc c3 4f 88 02 00|.`..A....r..O...| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) - | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[156]{}: tuple 0x290-0x2bf.7 (48) + | | | header{}: 0x290-0x2a7.7 (24) | | | t_choice{}: 0x290-0x29b.7 (12) | | | t_heap{}: 0x290-0x29b.7 (12) 0x290|95 02 00 00 |.... | t_xmin: 661 0x290-0x293.7 (4) @@ -63,33 +63,33 @@ $ fq -d pg_heap -o flavour=postgres12 ".[0].Tuples[0,-1] | dv" 16406 0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) 0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) 0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) + | | | infomask2{}: 0x2a4-NA (0) + | | | heap_keys_updated: false 0x2a4-NA (0) + | | | heap_hot_updated: false 0x2a4-NA (0) + | | | heap_only_tuple: false 0x2a4-NA (0) 0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) + | | | infomask{}: 0x2a6-NA (0) + | | | heap_hasnull: true 0x2a6-NA (0) + | | | heap_hasvarwidth: false 0x2a6-NA (0) + | | | heap_hasexternal: false 0x2a6-NA (0) + | | | heap_hasoid_old: false 0x2a6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x2a6-NA (0) + | | | heap_combocid: false 0x2a6-NA (0) + | | | heap_xmax_excl_lock: false 0x2a6-NA (0) + | | | heap_xmax_lock_only: false 0x2a6-NA (0) + | | | heap_xmax_shr_lock: false 0x2a6-NA (0) + | | | heap_lock_mask: false 0x2a6-NA (0) + | | | heap_xmin_committed: true 0x2a6-NA (0) + | | | heap_xmin_invalid: false 0x2a6-NA (0) + | | | heap_xmin_frozen: true 0x2a6-NA (0) + | | | heap_xmax_committed: false 0x2a6-NA (0) + | | | heap_xmax_invalid: true 0x2a6-NA (0) + | | | heap_xmax_is_multi: false 0x2a6-NA (0) + | | | heap_updated: false 0x2a6-NA (0) + | | | heap_moved_off: false 0x2a6-NA (0) + | | | heap_moved_in: false 0x2a6-NA (0) + | | | heap_moved: false 0x2a6-NA (0) 0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) 0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 0a 00 00 00 01 00 00 00| ........| Data: "0a00000001000000d68c00009d0d0000b275d1c34f88020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2a0| 0a 00 00 00 01 00 00 00| ........| data: "0a00000001000000d68c00009d0d0000b275d1c34f88020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|d6 8c 00 00 9d 0d 00 00 b2 75 d1 c3 4f 88 02 00|.........u..O...| diff --git a/format/postgres/testdata/flavours/postgres13/16396_1.fqtest b/format/postgres/testdata/flavours/postgres13/16396_1.fqtest index 5e441e60d..985b6af4f 100644 --- a/format/postgres/testdata/flavours/postgres13/16396_1.fqtest +++ b/format/postgres/testdata/flavours/postgres13/16396_1.fqtest @@ -1,6 +1,6 @@ -$ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1f80-0x1fff.7 (128) - | | | HeapTupleHeaderData{}: 0x1f80-0x1f97.7 (24) +$ fq -d pg_heap -o flavour=postgres13 ".[0].tuples[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1f80-0x1fff.7 (128) + | | | header{}: 0x1f80-0x1f97.7 (24) | | | t_choice{}: 0x1f80-0x1f8b.7 (12) | | | t_heap{}: 0x1f80-0x1f8b.7 (12) 0x1f80|e9 01 00 00 |.... | t_xmin: 489 0x1f80-0x1f83.7 (4) @@ -16,40 +16,40 @@ $ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | dv" 16396 0x1f80| 00 00 00 00| ....| ip_blkid: 0 0x1f8c-0x1f8f.7 (4) 0x1f90|01 00 |.. | ip_posid: 1 0x1f90-0x1f91.7 (2) 0x1f90| 04 00 | .. | t_infomask2: 4 0x1f92-0x1f93.7 (2) - | | | Infomask2{}: 0x1f92-0x1f93.7 (2) -0x1f90| 04 00 | .. | HEAP_KEYS_UPDATED: 0 0x1f92-0x1f93.7 (2) -0x1f90| 04 00 | .. | HEAP_HOT_UPDATED: 0 0x1f92-0x1f93.7 (2) -0x1f90| 04 00 | .. | HEAP_ONLY_TUPLE: 0 0x1f92-0x1f93.7 (2) + | | | infomask2{}: 0x1f94-NA (0) + | | | heap_keys_updated: false 0x1f94-NA (0) + | | | heap_hot_updated: false 0x1f94-NA (0) + | | | heap_only_tuple: false 0x1f94-NA (0) 0x1f90| 02 09 | .. | t_infomask: 2306 0x1f94-0x1f95.7 (2) - | | | Infomask{}: 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASNULL: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASVARWIDTH: 1 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASEXTERNAL: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASOID_OLD: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_COMBOCID: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_LOCK_MASK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMIN_INVALID: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMIN_FROZEN: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_INVALID: 1 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_UPDATED: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_MOVED_OFF: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_MOVED_IN: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_MOVED: 0 0x1f94-0x1f95.7 (2) + | | | infomask{}: 0x1f96-NA (0) + | | | heap_hasnull: false 0x1f96-NA (0) + | | | heap_hasvarwidth: true 0x1f96-NA (0) + | | | heap_hasexternal: false 0x1f96-NA (0) + | | | heap_hasoid_old: false 0x1f96-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1f96-NA (0) + | | | heap_combocid: false 0x1f96-NA (0) + | | | heap_xmax_excl_lock: false 0x1f96-NA (0) + | | | heap_xmax_lock_only: false 0x1f96-NA (0) + | | | heap_xmax_shr_lock: false 0x1f96-NA (0) + | | | heap_lock_mask: false 0x1f96-NA (0) + | | | heap_xmin_committed: true 0x1f96-NA (0) + | | | heap_xmin_invalid: false 0x1f96-NA (0) + | | | heap_xmin_frozen: true 0x1f96-NA (0) + | | | heap_xmax_committed: false 0x1f96-NA (0) + | | | heap_xmax_invalid: true 0x1f96-NA (0) + | | | heap_xmax_is_multi: false 0x1f96-NA (0) + | | | heap_updated: false 0x1f96-NA (0) + | | | heap_moved_off: false 0x1f96-NA (0) + | | | heap_moved_in: false 0x1f96-NA (0) + | | | heap_moved: false 0x1f96-NA (0) 0x1f90| 18 | . | t_hoff: 24 0x1f96-0x1f96.7 (1) 0x1f90| 00 | . | padding0: 0 0x1f97-0x1f97.7 (1) -0x1f90| 01 00 00 00 01 00 00 00| ........| Data: "010000000100000000000000ab202020202020202020202..." (raw bits) 0x1f98-0x1ff8.7 (97) +0x1f90| 01 00 00 00 01 00 00 00| ........| data: "010000000100000000000000ab202020202020202020202..." (raw bits) 0x1f98-0x1ff8.7 (97) 0x1fa0|00 00 00 00 ab 20 20 20 20 20 20 20 20 20 20 20|..... | * |until 0x1ff8.7 (97) | | 0x1ff0| 00 00 00 00 00 00 00| .......| padding1: "00000000000000" (raw bits) 0x1ff9-0x1fff.7 (7) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[60]{}: Tuple 0x180-0x1ff.7 (128) - | | | HeapTupleHeaderData{}: 0x180-0x197.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[60]{}: tuple 0x180-0x1ff.7 (128) + | | | header{}: 0x180-0x197.7 (24) | | | t_choice{}: 0x180-0x18b.7 (12) | | | t_heap{}: 0x180-0x18b.7 (12) 0x180|e2 2f 00 00 |./.. | t_xmin: 12258 0x180-0x183.7 (4) @@ -65,35 +65,35 @@ $ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | dv" 16396 0x180| 00 00 00 00| ....| ip_blkid: 0 0x18c-0x18f.7 (4) 0x190|45 00 |E. | ip_posid: 69 0x190-0x191.7 (2) 0x190| 04 80 | .. | t_infomask2: 32772 0x192-0x193.7 (2) - | | | Infomask2{}: 0x192-0x193.7 (2) -0x190| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x192-0x193.7 (2) -0x190| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x192-0x193.7 (2) -0x190| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x192-0x193.7 (2) + | | | infomask2{}: 0x194-NA (0) + | | | heap_keys_updated: false 0x194-NA (0) + | | | heap_hot_updated: false 0x194-NA (0) + | | | heap_only_tuple: true 0x194-NA (0) 0x190| 02 28 | .( | t_infomask: 10242 0x194-0x195.7 (2) - | | | Infomask{}: 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_HASNULL: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_HASVARWIDTH: 1 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_HASEXTERNAL: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_HASOID_OLD: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_KEYSHR_LOCK: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_COMBOCID: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_EXCL_LOCK: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_LOCK_ONLY: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_SHR_LOCK: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_LOCK_MASK: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMIN_COMMITTED: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMIN_INVALID: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMIN_FROZEN: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_COMMITTED: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_INVALID: 1 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_XMAX_IS_MULTI: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_UPDATED: 1 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_MOVED_OFF: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_MOVED_IN: 0 0x194-0x195.7 (2) -0x190| 02 28 | .( | HEAP_MOVED: 0 0x194-0x195.7 (2) + | | | infomask{}: 0x196-NA (0) + | | | heap_hasnull: false 0x196-NA (0) + | | | heap_hasvarwidth: true 0x196-NA (0) + | | | heap_hasexternal: false 0x196-NA (0) + | | | heap_hasoid_old: false 0x196-NA (0) + | | | heap_xmax_keyshr_lock: false 0x196-NA (0) + | | | heap_combocid: false 0x196-NA (0) + | | | heap_xmax_excl_lock: false 0x196-NA (0) + | | | heap_xmax_lock_only: false 0x196-NA (0) + | | | heap_xmax_shr_lock: false 0x196-NA (0) + | | | heap_lock_mask: false 0x196-NA (0) + | | | heap_xmin_committed: false 0x196-NA (0) + | | | heap_xmin_invalid: false 0x196-NA (0) + | | | heap_xmin_frozen: false 0x196-NA (0) + | | | heap_xmax_committed: false 0x196-NA (0) + | | | heap_xmax_invalid: true 0x196-NA (0) + | | | heap_xmax_is_multi: false 0x196-NA (0) + | | | heap_updated: true 0x196-NA (0) + | | | heap_moved_off: false 0x196-NA (0) + | | | heap_moved_in: false 0x196-NA (0) + | | | heap_moved: false 0x196-NA (0) 0x190| 18 | . | t_hoff: 24 0x196-0x196.7 (1) 0x190| 00 | . | padding0: 0 0x197-0x197.7 (1) -0x190| 20 00 00 00 01 00 00 00| .......| Data: "20000000010000003efbffffab202020202020202020202..." (raw bits) 0x198-0x1f8.7 (97) +0x190| 20 00 00 00 01 00 00 00| .......| data: "20000000010000003efbffffab202020202020202020202..." (raw bits) 0x198-0x1f8.7 (97) 0x1a0|3e fb ff ff ab 20 20 20 20 20 20 20 20 20 20 20|>.... | * |until 0x1f8.7 (97) | | 0x1f0| 00 00 00 00 00 00 00| .......| padding1: "00000000000000" (raw bits) 0x1f9-0x1ff.7 (7) diff --git a/format/postgres/testdata/flavours/postgres13/16407_1.fqtest b/format/postgres/testdata/flavours/postgres13/16407_1.fqtest index ab283679f..87941bd67 100644 --- a/format/postgres/testdata/flavours/postgres13/16407_1.fqtest +++ b/format/postgres/testdata/flavours/postgres13/16407_1.fqtest @@ -1,13 +1,13 @@ -$ fq -d pg_heap -o flavour=postgres13 ".[0].PageHeaderData.pd_linp[0, 1, -1] | dv" 16407 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres13 ".[0].page_header.pd_linp[0, 1, -1] | dv" 16407 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[1]{}: ItemIdData 0x1c-0x1f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) 0x10| a0 9f 60 00| ..`.| lp_off: 8096 0x1c-0x1f.7 (4) 0x10| a0 9f 60 00| ..`.| lp_flags: "LP_NORMAL" (1) 0x1c-0x1f.7 (4) 0x10| a0 9f 60 00| ..`.| lp_len: 48 0x1c-0x1f.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[156]{}: ItemIdData 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/postgres13/16407_2.fqtest b/format/postgres/testdata/flavours/postgres13/16407_2.fqtest index 7773d635c..a0bb5c8f2 100644 --- a/format/postgres/testdata/flavours/postgres13/16407_2.fqtest +++ b/format/postgres/testdata/flavours/postgres13/16407_2.fqtest @@ -1,6 +1,6 @@ -$ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | dv" 16407 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1fd0-0x1fff.7 (48) - | | | HeapTupleHeaderData{}: 0x1fd0-0x1fe7.7 (24) +$ fq -d pg_heap -o flavour=postgres13 ".[0].tuples[0,-1] | dv" 16407 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fd0-0x1fff.7 (48) + | | | header{}: 0x1fd0-0x1fe7.7 (24) | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) 0x1fd0|fd 01 00 00 |.... | t_xmin: 509 0x1fd0-0x1fd3.7 (4) @@ -16,38 +16,38 @@ $ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | dv" 16407 0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) 0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) 0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) - | | | Infomask2{}: 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x1fe2-0x1fe3.7 (2) -0x1fe0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x1fe2-0x1fe3.7 (2) + | | | infomask2{}: 0x1fe4-NA (0) + | | | heap_keys_updated: false 0x1fe4-NA (0) + | | | heap_hot_updated: false 0x1fe4-NA (0) + | | | heap_only_tuple: false 0x1fe4-NA (0) 0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) - | | | Infomask{}: 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASNULL: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_COMBOCID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_UPDATED: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED_IN: 0 0x1fe4-0x1fe5.7 (2) -0x1fe0| 01 09 | .. | HEAP_MOVED: 0 0x1fe4-0x1fe5.7 (2) + | | | infomask{}: 0x1fe6-NA (0) + | | | heap_hasnull: true 0x1fe6-NA (0) + | | | heap_hasvarwidth: false 0x1fe6-NA (0) + | | | heap_hasexternal: false 0x1fe6-NA (0) + | | | heap_hasoid_old: false 0x1fe6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fe6-NA (0) + | | | heap_combocid: false 0x1fe6-NA (0) + | | | heap_xmax_excl_lock: false 0x1fe6-NA (0) + | | | heap_xmax_lock_only: false 0x1fe6-NA (0) + | | | heap_xmax_shr_lock: false 0x1fe6-NA (0) + | | | heap_lock_mask: false 0x1fe6-NA (0) + | | | heap_xmin_committed: true 0x1fe6-NA (0) + | | | heap_xmin_invalid: false 0x1fe6-NA (0) + | | | heap_xmin_frozen: true 0x1fe6-NA (0) + | | | heap_xmax_committed: false 0x1fe6-NA (0) + | | | heap_xmax_invalid: true 0x1fe6-NA (0) + | | | heap_xmax_is_multi: false 0x1fe6-NA (0) + | | | heap_updated: false 0x1fe6-NA (0) + | | | heap_moved_off: false 0x1fe6-NA (0) + | | | heap_moved_in: false 0x1fe6-NA (0) + | | | heap_moved: false 0x1fe6-NA (0) 0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) 0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) -0x1fe0| 06 00 00 00 01 00 00 00| ........| Data: "060000000100000091220000141000008f939dc26888020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1fe0| 06 00 00 00 01 00 00 00| ........| data: "060000000100000091220000141000008f939dc26888020..." (raw bits) 0x1fe8-0x1fff.7 (24) 0x1ff0|91 22 00 00 14 10 00 00 8f 93 9d c2 68 88 02 00|."..........h...| - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[156]{}: Tuple 0x290-0x2bf.7 (48) - | | | HeapTupleHeaderData{}: 0x290-0x2a7.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[156]{}: tuple 0x290-0x2bf.7 (48) + | | | header{}: 0x290-0x2a7.7 (24) | | | t_choice{}: 0x290-0x29b.7 (12) | | | t_heap{}: 0x290-0x29b.7 (12) 0x290|99 02 00 00 |.... | t_xmin: 665 0x290-0x293.7 (4) @@ -63,33 +63,33 @@ $ fq -d pg_heap -o flavour=postgres13 ".[0].Tuples[0,-1] | dv" 16407 0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) 0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) 0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) - | | | Infomask2{}: 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_KEYS_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_HOT_UPDATED: 0 0x2a2-0x2a3.7 (2) -0x2a0| 06 00 | .. | HEAP_ONLY_TUPLE: 0 0x2a2-0x2a3.7 (2) + | | | infomask2{}: 0x2a4-NA (0) + | | | heap_keys_updated: false 0x2a4-NA (0) + | | | heap_hot_updated: false 0x2a4-NA (0) + | | | heap_only_tuple: false 0x2a4-NA (0) 0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) - | | | Infomask{}: 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASNULL: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASVARWIDTH: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASEXTERNAL: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_HASOID_OLD: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_COMBOCID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_LOCK_MASK: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_COMMITTED: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_INVALID: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMIN_FROZEN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_COMMITTED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_INVALID: 1 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_UPDATED: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_OFF: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED_IN: 0 0x2a4-0x2a5.7 (2) -0x2a0| 01 09 | .. | HEAP_MOVED: 0 0x2a4-0x2a5.7 (2) + | | | infomask{}: 0x2a6-NA (0) + | | | heap_hasnull: true 0x2a6-NA (0) + | | | heap_hasvarwidth: false 0x2a6-NA (0) + | | | heap_hasexternal: false 0x2a6-NA (0) + | | | heap_hasoid_old: false 0x2a6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x2a6-NA (0) + | | | heap_combocid: false 0x2a6-NA (0) + | | | heap_xmax_excl_lock: false 0x2a6-NA (0) + | | | heap_xmax_lock_only: false 0x2a6-NA (0) + | | | heap_xmax_shr_lock: false 0x2a6-NA (0) + | | | heap_lock_mask: false 0x2a6-NA (0) + | | | heap_xmin_committed: true 0x2a6-NA (0) + | | | heap_xmin_invalid: false 0x2a6-NA (0) + | | | heap_xmin_frozen: true 0x2a6-NA (0) + | | | heap_xmax_committed: false 0x2a6-NA (0) + | | | heap_xmax_invalid: true 0x2a6-NA (0) + | | | heap_xmax_is_multi: false 0x2a6-NA (0) + | | | heap_updated: false 0x2a6-NA (0) + | | | heap_moved_off: false 0x2a6-NA (0) + | | | heap_moved_in: false 0x2a6-NA (0) + | | | heap_moved: false 0x2a6-NA (0) 0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) 0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) -0x2a0| 09 00 00 00 01 00 00 00| ........| Data: "0900000001000000ce39000086130000159eb7c26888020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2a0| 09 00 00 00 01 00 00 00| ........| data: "0900000001000000ce39000086130000159eb7c26888020..." (raw bits) 0x2a8-0x2bf.7 (24) 0x2b0|ce 39 00 00 86 13 00 00 15 9e b7 c2 68 88 02 00|.9..........h...| diff --git a/format/postgres/testdata/flavours/postgres14/16994_1.fqtest b/format/postgres/testdata/flavours/postgres14/16994_1.fqtest index a15f704e0..62b4ffcd4 100644 --- a/format/postgres/testdata/flavours/postgres14/16994_1.fqtest +++ b/format/postgres/testdata/flavours/postgres14/16994_1.fqtest @@ -1,17 +1,17 @@ -$ fq -d pg_heap -o flavour=postgres14 ".[0].PageHeaderData.pd_linp[0, 1, 2, -1] | dv" 16994 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres14 ".[0].page_header.pd_linp[0, 1, 2, -1] | dv" 16994 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 00 80 01 00 | .... | lp_off: 0 0x18-0x1b.7 (4) 0x10| 00 80 01 00 | .... | lp_flags: "LP_DEAD" (3) 0x18-0x1b.7 (4) 0x10| 00 80 01 00 | .... | lp_len: 0 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[1]{}: ItemIdData 0x1c-0x1f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) 0x10| e0 9f 38 00| ..8.| lp_off: 8160 0x1c-0x1f.7 (4) 0x10| e0 9f 38 00| ..8.| lp_flags: "LP_NORMAL" (1) 0x1c-0x1f.7 (4) 0x10| e0 9f 38 00| ..8.| lp_len: 28 0x1c-0x1f.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[2]{}: ItemIdData 0x20-0x23.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[2]{}: item_id 0x20-0x23.7 (4) 0x20|c0 9f 38 00 |..8. | lp_off: 8128 0x20-0x23.7 (4) 0x20|c0 9f 38 00 |..8. | lp_flags: "LP_NORMAL" (1) 0x20-0x23.7 (4) 0x20|c0 9f 38 00 |..8. | lp_len: 28 0x20-0x23.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[225]{}: ItemIdData 0x39c-0x39f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[225]{}: item_id 0x39c-0x39f.7 (4) 0x390| e0 83 38 00| ..8.| lp_off: 992 0x39c-0x39f.7 (4) 0x390| e0 83 38 00| ..8.| lp_flags: "LP_NORMAL" (1) 0x39c-0x39f.7 (4) 0x390| e0 83 38 00| ..8.| lp_len: 28 0x39c-0x39f.7 (4) diff --git a/format/postgres/testdata/flavours/postgres14/33233_1.fqtest b/format/postgres/testdata/flavours/postgres14/33233_1.fqtest index 23bb40b5c..bc0f77aec 100644 --- a/format/postgres/testdata/flavours/postgres14/33233_1.fqtest +++ b/format/postgres/testdata/flavours/postgres14/33233_1.fqtest @@ -1,13 +1,13 @@ -$ fq -d pg_heap -o flavour=postgres14 ".[0].PageHeaderData.pd_linp[0, 1, -1] | dv" 33233 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres14 ".[0].page_header.pd_linp[0, 1, -1] | dv" 33233 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 4d 00 01 00 | M... | lp_off: 77 0x18-0x1b.7 (4) 0x10| 4d 00 01 00 | M... | lp_flags: "LP_REDIRECT" (2) 0x18-0x1b.7 (4) 0x10| 4d 00 01 00 | M... | lp_len: 0 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[1]{}: ItemIdData 0x1c-0x1f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) 0x10| 6a 00 01 00| j...| lp_off: 106 0x1c-0x1f.7 (4) 0x10| 6a 00 01 00| j...| lp_flags: "LP_REDIRECT" (2) 0x1c-0x1f.7 (4) 0x10| 6a 00 01 00| j...| lp_len: 0 0x1c-0x1f.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].PageHeaderData.pd_linp[119]{}: ItemIdData 0x1f4-0x1f7.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[119]{}: item_id 0x1f4-0x1f7.7 (4) 0x1f0| 80 82 f2 00 | .... | lp_off: 640 0x1f4-0x1f7.7 (4) 0x1f0| 80 82 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x1f4-0x1f7.7 (4) 0x1f0| 80 82 f2 00 | .... | lp_len: 121 0x1f4-0x1f7.7 (4) diff --git a/format/postgres/testdata/flavours/postgres14/33233_2.fqtest b/format/postgres/testdata/flavours/postgres14/33233_2.fqtest index 744e4759b..418e17635 100644 --- a/format/postgres/testdata/flavours/postgres14/33233_2.fqtest +++ b/format/postgres/testdata/flavours/postgres14/33233_2.fqtest @@ -1,6 +1,6 @@ -$ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0,-1] | dv" 33233 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[0]{}: Tuple 0x1f80-0x1fff.7 (128) - | | | HeapTupleHeaderData{}: 0x1f80-0x1f97.7 (24) +$ fq -d pg_heap -o flavour=postgres14 ".[0].tuples[0,-1] | dv" 33233 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1f80-0x1fff.7 (128) + | | | header{}: 0x1f80-0x1f97.7 (24) | | | t_choice{}: 0x1f80-0x1f8b.7 (12) | | | t_heap{}: 0x1f80-0x1f8b.7 (12) 0x1f80|86 10 18 00 |.... | t_xmin: 1577094 0x1f80-0x1f83.7 (4) @@ -16,40 +16,40 @@ $ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0,-1] | dv" 33233 0x1f80| 00 00 00 00| ....| ip_blkid: 0 0x1f8c-0x1f8f.7 (4) 0x1f90|15 00 |.. | ip_posid: 21 0x1f90-0x1f91.7 (2) 0x1f90| 04 00 | .. | t_infomask2: 4 0x1f92-0x1f93.7 (2) - | | | Infomask2{}: 0x1f92-0x1f93.7 (2) -0x1f90| 04 00 | .. | HEAP_KEYS_UPDATED: 0 0x1f92-0x1f93.7 (2) -0x1f90| 04 00 | .. | HEAP_HOT_UPDATED: 0 0x1f92-0x1f93.7 (2) -0x1f90| 04 00 | .. | HEAP_ONLY_TUPLE: 0 0x1f92-0x1f93.7 (2) + | | | infomask2{}: 0x1f94-NA (0) + | | | heap_keys_updated: false 0x1f94-NA (0) + | | | heap_hot_updated: false 0x1f94-NA (0) + | | | heap_only_tuple: false 0x1f94-NA (0) 0x1f90| 02 09 | .. | t_infomask: 2306 0x1f94-0x1f95.7 (2) - | | | Infomask{}: 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASNULL: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASVARWIDTH: 1 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASEXTERNAL: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_HASOID_OLD: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_COMBOCID: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_LOCK_MASK: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMIN_INVALID: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMIN_FROZEN: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_INVALID: 1 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_UPDATED: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_MOVED_OFF: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_MOVED_IN: 0 0x1f94-0x1f95.7 (2) -0x1f90| 02 09 | .. | HEAP_MOVED: 0 0x1f94-0x1f95.7 (2) + | | | infomask{}: 0x1f96-NA (0) + | | | heap_hasnull: false 0x1f96-NA (0) + | | | heap_hasvarwidth: true 0x1f96-NA (0) + | | | heap_hasexternal: false 0x1f96-NA (0) + | | | heap_hasoid_old: false 0x1f96-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1f96-NA (0) + | | | heap_combocid: false 0x1f96-NA (0) + | | | heap_xmax_excl_lock: false 0x1f96-NA (0) + | | | heap_xmax_lock_only: false 0x1f96-NA (0) + | | | heap_xmax_shr_lock: false 0x1f96-NA (0) + | | | heap_lock_mask: false 0x1f96-NA (0) + | | | heap_xmin_committed: true 0x1f96-NA (0) + | | | heap_xmin_invalid: false 0x1f96-NA (0) + | | | heap_xmin_frozen: true 0x1f96-NA (0) + | | | heap_xmax_committed: false 0x1f96-NA (0) + | | | heap_xmax_invalid: true 0x1f96-NA (0) + | | | heap_xmax_is_multi: false 0x1f96-NA (0) + | | | heap_updated: false 0x1f96-NA (0) + | | | heap_moved_off: false 0x1f96-NA (0) + | | | heap_moved_in: false 0x1f96-NA (0) + | | | heap_moved: false 0x1f96-NA (0) 0x1f90| 18 | . | t_hoff: 24 0x1f96-0x1f96.7 (1) 0x1f90| 00 | . | padding0: 0 0x1f97-0x1f97.7 (1) -0x1f90| 15 00 00 00 01 00 00 00| ........| Data: "150000000100000000000000ab202020202020202020202..." (raw bits) 0x1f98-0x1ff8.7 (97) +0x1f90| 15 00 00 00 01 00 00 00| ........| data: "150000000100000000000000ab202020202020202020202..." (raw bits) 0x1f98-0x1ff8.7 (97) 0x1fa0|00 00 00 00 ab 20 20 20 20 20 20 20 20 20 20 20|..... | * |until 0x1ff8.7 (97) | | 0x1ff0| 00 00 00 00 00 00 00| .......| padding1: "00000000000000" (raw bits) 0x1ff9-0x1fff.7 (7) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].Tuples[58]{}: Tuple 0x280-0x2ff.7 (128) - | | | HeapTupleHeaderData{}: 0x280-0x297.7 (24) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[58]{}: tuple 0x280-0x2ff.7 (128) + | | | header{}: 0x280-0x297.7 (24) | | | t_choice{}: 0x280-0x28b.7 (12) | | | t_heap{}: 0x280-0x28b.7 (12) 0x280|96 58 1c 00 |.X.. | t_xmin: 1857686 0x280-0x283.7 (4) @@ -65,35 +65,35 @@ $ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0,-1] | dv" 33233 0x280| 00 00 00 00| ....| ip_blkid: 0 0x28c-0x28f.7 (4) 0x290|78 00 |x. | ip_posid: 120 0x290-0x291.7 (2) 0x290| 04 80 | .. | t_infomask2: 32772 0x292-0x293.7 (2) - | | | Infomask2{}: 0x292-0x293.7 (2) -0x290| 04 80 | .. | HEAP_KEYS_UPDATED: 0 0x292-0x293.7 (2) -0x290| 04 80 | .. | HEAP_HOT_UPDATED: 0 0x292-0x293.7 (2) -0x290| 04 80 | .. | HEAP_ONLY_TUPLE: 1 0x292-0x293.7 (2) + | | | infomask2{}: 0x294-NA (0) + | | | heap_keys_updated: false 0x294-NA (0) + | | | heap_hot_updated: false 0x294-NA (0) + | | | heap_only_tuple: true 0x294-NA (0) 0x290| 02 29 | .) | t_infomask: 10498 0x294-0x295.7 (2) - | | | Infomask{}: 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_HASNULL: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_HASVARWIDTH: 1 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_HASEXTERNAL: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_HASOID_OLD: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_KEYSHR_LOCK: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_COMBOCID: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_EXCL_LOCK: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_LOCK_ONLY: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_SHR_LOCK: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_LOCK_MASK: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMIN_COMMITTED: 1 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMIN_INVALID: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMIN_FROZEN: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_COMMITTED: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_INVALID: 1 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_XMAX_IS_MULTI: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_UPDATED: 1 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_MOVED_OFF: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_MOVED_IN: 0 0x294-0x295.7 (2) -0x290| 02 29 | .) | HEAP_MOVED: 0 0x294-0x295.7 (2) + | | | infomask{}: 0x296-NA (0) + | | | heap_hasnull: false 0x296-NA (0) + | | | heap_hasvarwidth: true 0x296-NA (0) + | | | heap_hasexternal: false 0x296-NA (0) + | | | heap_hasoid_old: false 0x296-NA (0) + | | | heap_xmax_keyshr_lock: false 0x296-NA (0) + | | | heap_combocid: false 0x296-NA (0) + | | | heap_xmax_excl_lock: false 0x296-NA (0) + | | | heap_xmax_lock_only: false 0x296-NA (0) + | | | heap_xmax_shr_lock: false 0x296-NA (0) + | | | heap_lock_mask: false 0x296-NA (0) + | | | heap_xmin_committed: true 0x296-NA (0) + | | | heap_xmin_invalid: false 0x296-NA (0) + | | | heap_xmin_frozen: true 0x296-NA (0) + | | | heap_xmax_committed: false 0x296-NA (0) + | | | heap_xmax_invalid: true 0x296-NA (0) + | | | heap_xmax_is_multi: false 0x296-NA (0) + | | | heap_updated: true 0x296-NA (0) + | | | heap_moved_off: false 0x296-NA (0) + | | | heap_moved_in: false 0x296-NA (0) + | | | heap_moved: false 0x296-NA (0) 0x290| 18 | . | t_hoff: 24 0x296-0x296.7 (1) 0x290| 00 | . | padding0: 0 0x297-0x297.7 (1) -0x290| 21 00 00 00 01 00 00 00| !.......| Data: "210000000100000053fdffffab202020202020202020202..." (raw bits) 0x298-0x2f8.7 (97) +0x290| 21 00 00 00 01 00 00 00| !.......| data: "210000000100000053fdffffab202020202020202020202..." (raw bits) 0x298-0x2f8.7 (97) 0x2a0|53 fd ff ff ab 20 20 20 20 20 20 20 20 20 20 20|S.... | * |until 0x2f8.7 (97) | | 0x2f0| 00 00 00 00 00 00 00| .......| padding1: "00000000000000" (raw bits) 0x2f9-0x2ff.7 (7) From edb565028dd1acd5b8221c03371ec34e23969ad0 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 21 Sep 2022 13:14:57 +0300 Subject: [PATCH 075/141] postgres: pg_control refactoring --- .../postgres/flavours/pgpro11/pg_control.go | 60 +++++++++---------- .../postgres/flavours/pgpro12/pg_control.go | 58 +++++++++--------- .../postgres/flavours/pgpro13/pg_control.go | 56 ++++++++--------- .../postgres/flavours/pgpro14/pg_control.go | 56 ++++++++--------- .../postgres/flavours/pgproee10/pg_control.go | 60 +++++++++---------- .../postgres/flavours/pgproee11/pg_control.go | 58 +++++++++--------- .../postgres/flavours/pgproee12/pg_control.go | 58 +++++++++--------- .../postgres/flavours/pgproee13/pg_control.go | 56 ++++++++--------- .../postgres/flavours/pgproee14/pg_control.go | 56 ++++++++--------- .../flavours/postgres11/pg_control.go | 60 +++++++++---------- .../flavours/postgres12/pg_control.go | 58 +++++++++--------- .../flavours/postgres13/pg_control.go | 56 ++++++++--------- .../flavours/postgres14/pg_control.go | 56 ++++++++--------- .../flavours/pgpro11/pg_control.fqtest | 60 +++++++++---------- .../flavours/pgpro11/pg_control_1.fqtest | 60 +++++++++---------- .../flavours/pgpro12/pg_control.fqtest | 58 +++++++++--------- .../flavours/pgpro12/pg_control_1.fqtest | 58 +++++++++--------- .../flavours/pgpro13/pg_control.fqtest | 56 ++++++++--------- .../flavours/pgpro14/pg_control.fqtest | 56 ++++++++--------- .../flavours/pgpro14/pg_control_1.fqtest | 56 ++++++++--------- .../flavours/pgproee10/pg_control.fqtest | 60 +++++++++---------- .../flavours/pgproee10/pg_control_1.fqtest | 60 +++++++++---------- .../flavours/pgproee11/pg_control.fqtest | 58 +++++++++--------- .../flavours/pgproee11/pg_control_1.fqtest | 58 +++++++++--------- .../flavours/pgproee12/pg_control.fqtest | 58 +++++++++--------- .../flavours/pgproee12/pg_control_1.fqtest | 58 +++++++++--------- .../flavours/pgproee13/pg_control.fqtest | 56 ++++++++--------- .../flavours/pgproee14/pg_control.fqtest | 56 ++++++++--------- .../flavours/pgproee14/pg_control_1.fqtest | 56 ++++++++--------- .../flavours/postgres11/pg_control.fqtest | 60 +++++++++---------- .../flavours/postgres12/pg_control.fqtest | 58 +++++++++--------- .../flavours/postgres13/pg_control.fqtest | 56 ++++++++--------- .../flavours/postgres14/pg_control.fqtest | 56 ++++++++--------- 33 files changed, 951 insertions(+), 951 deletions(-) diff --git a/format/postgres/flavours/pgpro11/pg_control.go b/format/postgres/flavours/pgpro11/pg_control.go index d2e392e79..cc3929839 100644 --- a/format/postgres/flavours/pgpro11/pg_control.go +++ b/format/postgres/flavours/pgpro11/pg_control.go @@ -92,17 +92,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 80 */ // CheckPoint checkPointCopy; d.FieldS64("time", common.TimeMapper) - d.FieldU64("checkPoint", common.XLogRecPtrMapper) - d.FieldStruct("checkPointCopy", func(d *decode.D) { + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 3-byte hole */ d.FieldU64("redo", common.XLogRecPtrMapper) - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") d.FieldU24("hole1") /* 20 | 4 */ // uint32 nextXidEpoch; @@ -119,19 +119,19 @@ func DecodePgControl(d *decode.D, in any) any { /* 68 | 4 */ // TransactionId newestCommitTsXid; /* 72 | 4 */ // TransactionId oldestActiveXid; /* XXX 4-byte padding */ - d.FieldU32("nextXidEpoch") - d.FieldU32("nextXid") - d.FieldU32("nextOid") - d.FieldU32("nextMulti") - d.FieldU32("nextMultiOffset") - d.FieldU32("oldestXid") - d.FieldU32("oldestXidDB") - d.FieldU32("oldestMulti") - d.FieldU32("oldestMultiDB") + d.FieldU32("next_xid_epoch") + d.FieldU32("next_xid") + d.FieldU32("next_oid") + d.FieldU32("next_multi") + d.FieldU32("next_multi_offset") + d.FieldU32("oldest_xid") + d.FieldU32("oldest_xid_db") + d.FieldU32("oldest_multi") + d.FieldU32("oldest_multi_db") d.FieldS64("time", common.TimeMapper) - d.FieldU32("oldestCommitTsXid") - d.FieldU32("newestCommitTsXid") - d.FieldU32("oldestActiveXid") + d.FieldU32("oldest_commit_ts_xid") + d.FieldU32("newest_commit_ts_xid") + d.FieldU32("oldest_active_xid") d.FieldU32("padding1") }) @@ -139,18 +139,18 @@ func DecodePgControl(d *decode.D, in any) any { /* 128 | 8 */ // XLogRecPtr minRecoveryPoint; /* 136 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN", common.LocPtrMapper) - d.FieldU64("minRecoveryPoint", common.LocPtrMapper) - d.FieldU32("minRecoveryPointTLI") + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") d.FieldU32("hole2") /* 144 | 8 */ // XLogRecPtr backupStartPoint; /* 152 | 8 */ // XLogRecPtr backupEndPoint; /* 160 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint", common.LocPtrMapper) - d.FieldU64("backupEndPoint", common.LocPtrMapper) - d.FieldU8("backupEndRequired") + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") d.FieldU24("hole3") /* 164 | 4 */ // int wal_level; @@ -166,7 +166,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 184 | 4 */ // int max_locks_per_xact; /* 188 | 1 */ // _Bool track_commit_timestamp; /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") + d.FieldS32("max_connections") d.FieldS32("max_worker_processes") d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") @@ -175,7 +175,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 192 | 4 */ // uint32 maxAlign; /* XXX 4-byte hole */ - d.FieldU32("maxAlign") + d.FieldU32("max_align") d.FieldU32("hole6") /* 200 | 8 */ // double floatFormat; @@ -190,17 +190,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 240 | 1 */ // _Bool float4ByVal; /* 241 | 1 */ // _Bool float8ByVal; /* XXX 2-byte hole */ - d.FieldF64("floatFormat") + d.FieldF64("float_format") d.FieldU32("blcksz") d.FieldU32("relseg_size") d.FieldU32("xlog_blcksz") d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") - d.FieldU8("float4ByVal") - d.FieldU8("float8ByVal") + d.FieldU8("float4_by_val") + d.FieldU8("float8_by_val") d.FieldU16("hole7") /* 244 | 4 */ // uint32 data_checksum_version; diff --git a/format/postgres/flavours/pgpro12/pg_control.go b/format/postgres/flavours/pgpro12/pg_control.go index b69b97a2f..36481ef97 100644 --- a/format/postgres/flavours/pgpro12/pg_control.go +++ b/format/postgres/flavours/pgpro12/pg_control.go @@ -92,17 +92,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 88 */ // CheckPoint checkPointCopy; d.FieldS64("time", common.TimeMapper) - d.FieldU64("checkPoint", common.XLogRecPtrMapper) - d.FieldStruct("checkPointCopy", func(d *decode.D) { + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 7-byte hole */ d.FieldU64("redo", common.XLogRecPtrMapper) - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextFullXid; @@ -114,14 +114,14 @@ func DecodePgControl(d *decode.D, in any) any { /* 52 | 4 */ // MultiXactId oldestMulti; /* 56 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ - d.FieldU64("nextFullXid") - d.FieldU32("nextOid") - d.FieldU32("nextMulti") - d.FieldU32("nextMultiOffset") - d.FieldU32("oldestXid") - d.FieldU32("oldestXidDB") - d.FieldU32("oldestMulti") - d.FieldU32("oldestMultiDB") + d.FieldU64("next_full_xid") + d.FieldU32("next_oid") + d.FieldU32("next_multi") + d.FieldU32("next_multi_offset") + d.FieldU32("oldest_xid") + d.FieldU32("oldest_xid_db") + d.FieldU32("oldest_multi") + d.FieldU32("oldest_multi_db") d.FieldU32("hole2") /* 64 | 8 */ // pg_time_t time; @@ -130,9 +130,9 @@ func DecodePgControl(d *decode.D, in any) any { /* 80 | 4 */ // TransactionId oldestActiveXid; /* XXX 4-byte padding */ d.FieldS64("time", common.TimeMapper) - d.FieldU32("oldestCommitTsXid") - d.FieldU32("newestCommitTsXid") - d.FieldU32("oldestActiveXid") + d.FieldU32("oldest_commit_ts_xid") + d.FieldU32("newest_commit_ts_xid") + d.FieldU32("oldest_active_xid") d.FieldU32("padding0") }) @@ -140,18 +140,18 @@ func DecodePgControl(d *decode.D, in any) any { /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN", common.LocPtrMapper) - d.FieldU64("minRecoveryPoint", common.LocPtrMapper) - d.FieldU32("minRecoveryPointTLI") + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") d.FieldU32("hole3") /* 152 | 8 */ // XLogRecPtr backupStartPoint; /* 160 | 8 */ // XLogRecPtr backupEndPoint; /* 168 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint", common.LocPtrMapper) - d.FieldU64("backupEndPoint", common.LocPtrMapper) - d.FieldU8("backupEndRequired") + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") d.FieldU24("hole4") /* 172 | 4 */ // int wal_level; @@ -168,7 +168,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 196 | 4 */ // int max_locks_per_xact; /* 200 | 1 */ // _Bool track_commit_timestamp; /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") + d.FieldS32("max_connections") d.FieldS32("max_worker_processes") d.FieldS32("max_wal_senders") d.FieldS32("max_prepared_xacts") @@ -189,18 +189,18 @@ func DecodePgControl(d *decode.D, in any) any { /* 248 | 1 */ // _Bool float4ByVal; /* 249 | 1 */ // _Bool float8ByVal; /* XXX 2-byte hole */ - d.FieldU32("maxAlign") - d.FieldF64("floatFormat") + d.FieldU32("max_align") + d.FieldF64("float_format") d.FieldU32("blcksz") d.FieldU32("relseg_size") d.FieldU32("xlog_blcksz") d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") - d.FieldU8("float4ByVal") - d.FieldU8("float8ByVal") + d.FieldU8("float4_by_val") + d.FieldU8("float8_by_val") d.FieldU16("hole7") /* 252 | 4 */ // uint32 data_checksum_version; diff --git a/format/postgres/flavours/pgpro13/pg_control.go b/format/postgres/flavours/pgpro13/pg_control.go index dcbd6c431..dcbe4245c 100644 --- a/format/postgres/flavours/pgpro13/pg_control.go +++ b/format/postgres/flavours/pgpro13/pg_control.go @@ -90,17 +90,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 88 */ // CheckPoint checkPointCopy; d.FieldS64("time", common.TimeMapper) - d.FieldU64("checkPoint", common.XLogRecPtrMapper) - d.FieldStruct("checkPointCopy", func(d *decode.D) { + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 7-byte hole */ d.FieldU64("redo", common.XLogRecPtrMapper) - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextFullXid; @@ -112,14 +112,14 @@ func DecodePgControl(d *decode.D, in any) any { /* 52 | 4 */ // MultiXactId oldestMulti; /* 56 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ - d.FieldU64("nextFullXid") - d.FieldU32("nextOid") - d.FieldU32("nextMulti") - d.FieldU32("nextMultiOffset") - d.FieldU32("oldestXid") - d.FieldU32("oldestXidDB") - d.FieldU32("oldestMulti") - d.FieldU32("oldestMultiDB") + d.FieldU64("next_full_xid") + d.FieldU32("next_oid") + d.FieldU32("next_multi") + d.FieldU32("next_multi_offset") + d.FieldU32("oldest_xid") + d.FieldU32("oldest_xid_db") + d.FieldU32("oldest_multi") + d.FieldU32("oldest_multi_db") d.FieldU32("hole2") /* 64 | 8 */ // pg_time_t time; @@ -128,9 +128,9 @@ func DecodePgControl(d *decode.D, in any) any { /* 80 | 4 */ // TransactionId oldestActiveXid; /* XXX 4-byte padding */ d.FieldS64("time", common.TimeMapper) - d.FieldU32("oldestCommitTsXid") - d.FieldU32("newestCommitTsXid") - d.FieldU32("oldestActiveXid") + d.FieldU32("oldest_commit_ts_xid") + d.FieldU32("newest_commit_ts_xid") + d.FieldU32("oldest_active_xid") d.FieldU32("padding0") }) @@ -138,18 +138,18 @@ func DecodePgControl(d *decode.D, in any) any { /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN", common.LocPtrMapper) - d.FieldU64("minRecoveryPoint", common.LocPtrMapper) - d.FieldU32("minRecoveryPointTLI") + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") d.FieldU32("hole3") /* 152 | 8 */ // XLogRecPtr backupStartPoint; /* 160 | 8 */ // XLogRecPtr backupEndPoint; /* 168 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint", common.LocPtrMapper) - d.FieldU64("backupEndPoint", common.LocPtrMapper) - d.FieldU8("backupEndRequired") + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") d.FieldU24("hole4") /* 172 | 4 */ // int wal_level; @@ -166,7 +166,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 196 | 4 */ // int max_locks_per_xact; /* 200 | 1 */ // _Bool track_commit_timestamp; /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") + d.FieldS32("max_connections") d.FieldS32("max_worker_processes") d.FieldS32("max_wal_senders") d.FieldS32("max_prepared_xacts") @@ -186,17 +186,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 244 | 4 */ // uint32 loblksize; /* 248 | 1 */ // _Bool float8ByVal; /* XXX 3-byte hole */ - d.FieldU32("maxAlign") - d.FieldF64("floatFormat") + d.FieldU32("max_align") + d.FieldF64("float_format") d.FieldU32("blcksz") d.FieldU32("relseg_size") d.FieldU32("xlog_blcksz") d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") - d.FieldU8("float8ByVal") + d.FieldU8("float8_by_val") d.FieldU24("hole7") /* 252 | 4 */ // uint32 data_checksum_version; diff --git a/format/postgres/flavours/pgpro14/pg_control.go b/format/postgres/flavours/pgpro14/pg_control.go index d769609ce..50a228519 100644 --- a/format/postgres/flavours/pgpro14/pg_control.go +++ b/format/postgres/flavours/pgpro14/pg_control.go @@ -90,17 +90,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 88 */ // CheckPoint checkPointCopy; d.FieldS64("time", common.TimeMapper) - d.FieldU64("checkPoint", common.XLogRecPtrMapper) - d.FieldStruct("checkPointCopy", func(d *decode.D) { + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 7-byte hole */ d.FieldU64("redo", common.XLogRecPtrMapper) - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; @@ -112,14 +112,14 @@ func DecodePgControl(d *decode.D, in any) any { /* 52 | 4 */ // MultiXactId oldestMulti; /* 56 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ - d.FieldU64("nextXid") - d.FieldU32("nextOid") - d.FieldU32("nextMulti") - d.FieldU32("nextMultiOffset") - d.FieldU32("oldestXid") - d.FieldU32("oldestXidDB") - d.FieldU32("oldestMulti") - d.FieldU32("oldestMultiDB") + d.FieldU64("next_xid") + d.FieldU32("next_oid") + d.FieldU32("next_multi") + d.FieldU32("next_multi_offset") + d.FieldU32("oldest_xid") + d.FieldU32("oldest_xid_db") + d.FieldU32("oldest_multi") + d.FieldU32("oldest_multi_db") d.FieldU32("hole2") /* 64 | 8 */ // pg_time_t time; @@ -128,9 +128,9 @@ func DecodePgControl(d *decode.D, in any) any { /* 80 | 4 */ // TransactionId oldestActiveXid; /* XXX 4-byte padding */ d.FieldS64("time", common.TimeMapper) - d.FieldU32("oldestCommitTsXid") - d.FieldU32("newestCommitTsXid") - d.FieldU32("oldestActiveXid") + d.FieldU32("oldest_commit_ts_xid") + d.FieldU32("newest_commit_ts_xid") + d.FieldU32("oldest_active_xid") d.FieldU32("padding0") }) @@ -138,18 +138,18 @@ func DecodePgControl(d *decode.D, in any) any { /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN", common.LocPtrMapper) - d.FieldU64("minRecoveryPoint", common.LocPtrMapper) - d.FieldU32("minRecoveryPointTLI") + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") d.FieldU32("hole3") /* 152 | 8 */ // XLogRecPtr backupStartPoint; /* 160 | 8 */ // XLogRecPtr backupEndPoint; /* 168 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint", common.LocPtrMapper) - d.FieldU64("backupEndPoint", common.LocPtrMapper) - d.FieldU8("backupEndRequired") + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") d.FieldU24("hole4") /* 172 | 4 */ // int wal_level; @@ -166,7 +166,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 196 | 4 */ // int max_locks_per_xact; /* 200 | 1 */ // _Bool track_commit_timestamp; /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") + d.FieldS32("max_connections") d.FieldS32("max_worker_processes") d.FieldS32("max_wal_senders") d.FieldS32("max_prepared_xacts") @@ -186,17 +186,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 244 | 4 */ // uint32 loblksize; /* 248 | 1 */ // _Bool float8ByVal; /* XXX 3-byte hole */ - d.FieldU32("maxAlign") - d.FieldF64("floatFormat") + d.FieldU32("max_align") + d.FieldF64("float_format") d.FieldU32("blcksz") d.FieldU32("relseg_size") d.FieldU32("xlog_blcksz") d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") - d.FieldU8("float8ByVal") + d.FieldU8("float8_by_val") d.FieldU24("hole7") /* 252 | 4 */ // uint32 data_checksum_version; diff --git a/format/postgres/flavours/pgproee10/pg_control.go b/format/postgres/flavours/pgproee10/pg_control.go index 112902a54..25e7d2383 100644 --- a/format/postgres/flavours/pgproee10/pg_control.go +++ b/format/postgres/flavours/pgproee10/pg_control.go @@ -98,25 +98,25 @@ func DecodePgControl(d *decode.D, in any) any { /* 40 | 8 */ // XLogRecPtr prevCheckPoint; /* 48 | 120 */ // CheckPoint checkPointCopy; d.FieldS64("time", common.TimeMapper) - d.FieldU64("checkPoint", common.XLogRecPtrMapper) - d.FieldU64("prevCheckPoint", common.XLogRecPtrMapper) - d.FieldStruct("checkPointCopy", func(d *decode.D) { + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldU64("prev_check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 7-byte hole */ d.FieldU64("redo", common.XLogRecPtrMapper) - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; /* 32 | 4 */ // Oid nextOid; /* XXX 4-byte hole */ - d.FieldU64("nextXid") - d.FieldU32("nextOid") + d.FieldU64("next_xid") + d.FieldU32("next_oid") d.FieldU32("hole2") /* 40 | 8 */ // MultiXactId nextMulti; @@ -124,17 +124,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 56 | 8 */ // TransactionId oldestXid; /* 64 | 4 */ // Oid oldestXidDB; /* XXX 4-byte hole */ - d.FieldU64("nextMulti") - d.FieldU64("nextMultiOffset") - d.FieldU64("oldestXid") - d.FieldU32("oldestXidDB") + d.FieldU64("next_multi") + d.FieldU64("next_multi_offset") + d.FieldU64("oldest_xid") + d.FieldU32("oldest_xid_db") d.FieldU32("hole3") /* 72 | 8 */ // MultiXactId oldestMulti; /* 80 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ - d.FieldU64("oldestMulti") - d.FieldU32("oldestMultiDB") + d.FieldU64("oldest_multi") + d.FieldU32("oldest_multi_db") d.FieldU32("hole4") /* 88 | 8 */ // pg_time_t time; @@ -142,27 +142,27 @@ func DecodePgControl(d *decode.D, in any) any { /* 104 | 8 */ // TransactionId newestCommitTsXid; /* 112 | 8 */ // TransactionId oldestActiveXid; d.FieldS64("time", common.TimeMapper) - d.FieldU64("oldestCommitTsXid") - d.FieldU64("newestCommitTsXid") - d.FieldU64("oldestActiveXid") + d.FieldU64("oldest_commit_ts_xid") + d.FieldU64("newest_commit_ts_xid") + d.FieldU64("oldest_active_xid") }) /* 168 | 8 */ // XLogRecPtr unloggedLSN; /* 176 | 8 */ // XLogRecPtr minRecoveryPoint; /* 184 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN", common.LocPtrMapper) - d.FieldU64("minRecoveryPoint", common.LocPtrMapper) - d.FieldU32("minRecoveryPointTLI") + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") d.FieldU32("hole5") /* 192 | 8 */ // XLogRecPtr backupStartPoint; /* 200 | 8 */ // XLogRecPtr backupEndPoint; /* 208 | 1 */ // bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint", common.LocPtrMapper) - d.FieldU64("backupEndPoint", common.LocPtrMapper) - d.FieldU8("backupEndRequired") + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") d.FieldU24("hole6") /* 212 | 4 */ // int wal_level @@ -178,7 +178,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 232 | 4 */ // int max_locks_per_xact /* 236 | 1 */ // bool track_commit_timestamp /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") + d.FieldS32("max_connections") d.FieldS32("max_worker_processes") d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") @@ -187,7 +187,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 240 | 4 */ // uint32 maxAlign /* XXX 4-byte hole */ - d.FieldU32("maxAlign") + d.FieldU32("max_align") d.FieldU32("hole9") /* 248 | 8 */ // double floatFormat @@ -202,17 +202,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 288 | 1 */ // bool float4ByVal /* 289 | 1 */ // bool float8ByVal /* XXX 2-byte hole */ - d.FieldF64("floatFormat") + d.FieldF64("float_format") d.FieldU32("blcksz") d.FieldU32("relseg_size") d.FieldU32("xlog_blcksz") d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") - d.FieldU8("float4ByVal") - d.FieldU8("float8ByVal") + d.FieldU8("float4_by_val") + d.FieldU8("float8_by_val") d.FieldU16("hole10") /* 292 | 4 */ // uint32 data_checksum_version diff --git a/format/postgres/flavours/pgproee11/pg_control.go b/format/postgres/flavours/pgproee11/pg_control.go index b366a79ed..2160f1fb3 100644 --- a/format/postgres/flavours/pgproee11/pg_control.go +++ b/format/postgres/flavours/pgproee11/pg_control.go @@ -97,24 +97,24 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 120 */ // CheckPoint checkPointCopy; d.FieldS64("time", common.TimeMapper) - d.FieldU64("checkPoint", common.XLogRecPtrMapper) - d.FieldStruct("checkPointCopy", func(d *decode.D) { + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 7-byte hole */ d.FieldU64("redo", common.XLogRecPtrMapper) - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; /* 32 | 4 */ // Oid nextOid; /* XXX 4-byte hole */ - d.FieldU64("nextXid") - d.FieldU32("nextOid") + d.FieldU64("next_xid") + d.FieldU32("next_oid") d.FieldU32("hole2") /* 40 | 8 */ // MultiXactId nextMulti; @@ -122,17 +122,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 56 | 8 */ // TransactionId oldestXid; /* 64 | 4 */ // Oid oldestXidDB; /* XXX 4-byte hole */ - d.FieldU64("nextMulti") - d.FieldU64("nextMultiOffset") - d.FieldU64("oldestXid") - d.FieldU32("oldestXidDB") + d.FieldU64("next_multi") + d.FieldU64("next_multi_offset") + d.FieldU64("oldest_xid") + d.FieldU32("oldest_xid_db") d.FieldU32("hole3") /* 72 | 8 */ // MultiXactId oldestMulti; /* 80 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ - d.FieldU64("oldestMulti") - d.FieldU32("oldestMultiDB") + d.FieldU64("oldest_multi") + d.FieldU32("oldest_multi_db") d.FieldU32("hole4") /* 88 | 8 */ // pg_time_t time; @@ -140,27 +140,27 @@ func DecodePgControl(d *decode.D, in any) any { /* 104 | 8 */ // TransactionId newestCommitTsXid; /* 112 | 8 */ // TransactionId oldestActiveXid; d.FieldS64("time", common.TimeMapper) - d.FieldU64("oldestCommitTsXid") - d.FieldU64("newestCommitTsXid") - d.FieldU64("oldestActiveXid") + d.FieldU64("oldest_commit_ts_xid") + d.FieldU64("newest_commit_ts_xid") + d.FieldU64("oldest_active_xid") }) /* 160 | 8 */ // XLogRecPtr unloggedLSN; /* 168 | 8 */ // XLogRecPtr minRecoveryPoint; /* 176 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN", common.LocPtrMapper) - d.FieldU64("minRecoveryPoint", common.LocPtrMapper) - d.FieldU32("minRecoveryPointTLI") + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") d.FieldU32("hole5") /* 184 | 8 */ // XLogRecPtr backupStartPoint; /* 192 | 8 */ // XLogRecPtr backupEndPoint; /* 200 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint", common.LocPtrMapper) - d.FieldU64("backupEndPoint", common.LocPtrMapper) - d.FieldU8("backupEndRequired") + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") d.FieldU24("hole6") /* 204 | 4 */ // int wal_level; @@ -176,7 +176,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 224 | 4 */ // int max_locks_per_xact; /* 228 | 1 */ // _Bool track_commit_timestamp; /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") + d.FieldS32("max_connections") d.FieldS32("max_worker_processes") d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") @@ -185,7 +185,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 232 | 4 */ // uint32 maxAlign; /* XXX 4-byte hole */ - d.FieldU32("maxAlign") + d.FieldU32("max_align") d.FieldU32("hole9") /* 240 | 8 */ // double floatFormat; @@ -200,17 +200,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 280 | 1 */ // _Bool float4ByVal; /* 281 | 1 */ // _Bool float8ByVal; /* XXX 2-byte hole */ - d.FieldF64("floatFormat") + d.FieldF64("float_format") d.FieldU32("blcksz") d.FieldU32("relseg_size") d.FieldU32("xlog_blcksz") d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") - d.FieldU8("float4ByVal") - d.FieldU8("float8ByVal") + d.FieldU8("float4_by_val") + d.FieldU8("float8_by_val") d.FieldU16("hole10") /* 284 | 4 */ // uint32 data_checksum_version; diff --git a/format/postgres/flavours/pgproee12/pg_control.go b/format/postgres/flavours/pgproee12/pg_control.go index a66ffe2fa..791f9a8ca 100644 --- a/format/postgres/flavours/pgproee12/pg_control.go +++ b/format/postgres/flavours/pgproee12/pg_control.go @@ -97,24 +97,24 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 120 */ // CheckPoint checkPointCopy; d.FieldS64("time", common.TimeMapper) - d.FieldU64("checkPoint", common.XLogRecPtrMapper) - d.FieldStruct("checkPointCopy", func(d *decode.D) { + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 7-byte hole */ d.FieldU64("redo", common.XLogRecPtrMapper) - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; /* 32 | 4 */ // Oid nextOid; /* XXX 4-byte hole */ - d.FieldU64("nextXid") - d.FieldU32("nextOid") + d.FieldU64("next_xid") + d.FieldU32("next_oid") d.FieldU32("hole2") /* 40 | 8 */ // MultiXactId nextMulti; @@ -122,17 +122,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 56 | 8 */ // TransactionId oldestXid; /* 64 | 4 */ // Oid oldestXidDB; /* XXX 4-byte hole */ - d.FieldU64("nextMulti") - d.FieldU64("nextMultiOffset") - d.FieldU64("oldestXid") - d.FieldU32("oldestXidDB") + d.FieldU64("next_multi") + d.FieldU64("next_multi_offset") + d.FieldU64("oldest_xid") + d.FieldU32("oldest_xid_db") d.FieldU32("hole3") /* 72 | 8 */ // MultiXactId oldestMulti; /* 80 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ - d.FieldU64("oldestMulti") - d.FieldU32("oldestMultiDB") + d.FieldU64("oldest_multi") + d.FieldU32("oldest_multi_db") d.FieldU32("hole4") /* 88 | 8 */ // pg_time_t time; @@ -140,27 +140,27 @@ func DecodePgControl(d *decode.D, in any) any { /* 104 | 8 */ // TransactionId newestCommitTsXid; /* 112 | 8 */ // TransactionId oldestActiveXid; d.FieldS64("time", common.TimeMapper) - d.FieldU64("oldestCommitTsXid") - d.FieldU64("newestCommitTsXid") - d.FieldU64("oldestActiveXid") + d.FieldU64("oldest_commit_ts_xid") + d.FieldU64("newest_commit_ts_xid") + d.FieldU64("oldest_active_xid") }) /* 160 | 8 */ // XLogRecPtr unloggedLSN; /* 168 | 8 */ // XLogRecPtr minRecoveryPoint; /* 176 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN", common.LocPtrMapper) - d.FieldU64("minRecoveryPoint", common.LocPtrMapper) - d.FieldU32("minRecoveryPointTLI") + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") d.FieldU32("hole5") /* 184 | 8 */ // XLogRecPtr backupStartPoint; /* 192 | 8 */ // XLogRecPtr backupEndPoint; /* 200 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint", common.LocPtrMapper) - d.FieldU64("backupEndPoint", common.LocPtrMapper) - d.FieldU8("backupEndRequired") + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") d.FieldU24("hole6") /* 204 | 4 */ // int wal_level; @@ -177,7 +177,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 228 | 4 */ // int max_locks_per_xact; /* 232 | 1 */ // _Bool track_commit_timestamp; /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") + d.FieldS32("max_connections") d.FieldS32("max_worker_processes") d.FieldS32("max_wal_senders") d.FieldS32("max_prepared_xacts") @@ -198,18 +198,18 @@ func DecodePgControl(d *decode.D, in any) any { /* 280 | 1 */ // _Bool float4ByVal; /* 281 | 1 */ // _Bool float8ByVal; /* XXX 2-byte hole */ - d.FieldU32("maxAlign") - d.FieldF64("floatFormat") + d.FieldU32("max_align") + d.FieldF64("float_format") d.FieldU32("blcksz") d.FieldU32("relseg_size") d.FieldU32("xlog_blcksz") d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") - d.FieldU8("float4ByVal") - d.FieldU8("float8ByVal") + d.FieldU8("float4_by_val") + d.FieldU8("float8_by_val") d.FieldU16("hole9") /* 284 | 4 */ // uint32 data_checksum_version; diff --git a/format/postgres/flavours/pgproee13/pg_control.go b/format/postgres/flavours/pgproee13/pg_control.go index fd7ad20d8..db8440f07 100644 --- a/format/postgres/flavours/pgproee13/pg_control.go +++ b/format/postgres/flavours/pgproee13/pg_control.go @@ -94,24 +94,24 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 120 */ // CheckPoint checkPointCopy; d.FieldS64("time", common.TimeMapper) - d.FieldU64("checkPoint", common.XLogRecPtrMapper) - d.FieldStruct("checkPointCopy", func(d *decode.D) { + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 7-byte hole */ d.FieldU64("redo", common.XLogRecPtrMapper) - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; /* 32 | 4 */ // Oid nextOid; /* XXX 4-byte hole */ - d.FieldU64("nextXid") - d.FieldU32("nextOid") + d.FieldU64("next_xid") + d.FieldU32("next_oid") d.FieldU32("hole2") /* 40 | 8 */ // MultiXactId nextMulti; @@ -119,17 +119,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 56 | 8 */ // TransactionId oldestXid; /* 64 | 4 */ // Oid oldestXidDB; /* XXX 4-byte hole */ - d.FieldU64("nextMulti") - d.FieldU64("nextMultiOffset") - d.FieldU64("oldestXid") - d.FieldU32("oldestXidDB") + d.FieldU64("next_multi") + d.FieldU64("next_multi_offset") + d.FieldU64("oldest_xid") + d.FieldU32("oldest_xid_db") d.FieldU32("hole3") /* 72 | 8 */ // MultiXactId oldestMulti; /* 80 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ - d.FieldU64("oldestMulti") - d.FieldU32("oldestMultiDB") + d.FieldU64("oldest_multi") + d.FieldU32("oldest_multi_db") d.FieldU32("hole4") /* 88 | 8 */ // pg_time_t time; @@ -137,27 +137,27 @@ func DecodePgControl(d *decode.D, in any) any { /* 104 | 8 */ // TransactionId newestCommitTsXid; /* 112 | 8 */ // TransactionId oldestActiveXid; d.FieldS64("time", common.TimeMapper) - d.FieldU64("oldestCommitTsXid") - d.FieldU64("newestCommitTsXid") - d.FieldU64("oldestActiveXid") + d.FieldU64("oldest_commit_ts_xid") + d.FieldU64("newest_commit_ts_xid") + d.FieldU64("oldest_active_xid") }) /* 160 | 8 */ // XLogRecPtr unloggedLSN; /* 168 | 8 */ // XLogRecPtr minRecoveryPoint; /* 176 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN", common.LocPtrMapper) - d.FieldU64("minRecoveryPoint", common.LocPtrMapper) - d.FieldU32("minRecoveryPointTLI") + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") d.FieldU32("hole5") /* 184 | 8 */ // XLogRecPtr backupStartPoint; /* 192 | 8 */ // XLogRecPtr backupEndPoint; /* 200 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint", common.LocPtrMapper) - d.FieldU64("backupEndPoint", common.LocPtrMapper) - d.FieldU8("backupEndRequired") + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") d.FieldU24("hole6") /* 204 | 4 */ // int wal_level; @@ -174,7 +174,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 228 | 4 */ // int max_locks_per_xact; /* 232 | 1 */ // _Bool track_commit_timestamp; /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") + d.FieldS32("max_connections") d.FieldS32("max_worker_processes") d.FieldS32("max_wal_senders") d.FieldS32("max_prepared_xacts") @@ -195,17 +195,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 280 | 1 */ // _Bool float4ByVal; /* 281 | 1 */ // _Bool float8ByVal; /* XXX 2-byte hole */ - d.FieldU32("maxAlign") - d.FieldF64("floatFormat") + d.FieldU32("max_align") + d.FieldF64("float_format") d.FieldU32("blcksz") d.FieldU32("relseg_size") d.FieldU32("xlog_blcksz") d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") - d.FieldU8("float8ByVal") + d.FieldU8("float8_by_val") d.FieldU24("hole9") /* 284 | 4 */ // uint32 data_checksum_version diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go index ebb25936a..a3da6ebc4 100644 --- a/format/postgres/flavours/pgproee14/pg_control.go +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -94,24 +94,24 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 120 */ // CheckPoint checkPointCopy; d.FieldS64("time", common.TimeMapper) - d.FieldU64("checkPoint", common.XLogRecPtrMapper) - d.FieldStruct("checkPointCopy", func(d *decode.D) { + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 7-byte hole */ d.FieldU64("redo", common.XLogRecPtrMapper) - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; /* 32 | 4 */ // Oid nextOid; /* XXX 4-byte hole */ - d.FieldU64("nextXid") - d.FieldU32("nextOid") + d.FieldU64("next_xid") + d.FieldU32("next_oid") d.FieldU32("hole2") /* 40 | 8 */ // MultiXactId nextMulti; @@ -119,17 +119,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 56 | 8 */ // TransactionId oldestXid; /* 64 | 4 */ // Oid oldestXidDB; /* XXX 4-byte hole */ - d.FieldU64("nextMulti") - d.FieldU64("nextMultiOffset") - d.FieldU64("oldestXid") - d.FieldU32("oldestXidDB") + d.FieldU64("next_multi") + d.FieldU64("next_multi_offset") + d.FieldU64("oldest_xid") + d.FieldU32("oldest_xid_db") d.FieldU32("hole3") /* 72 | 8 */ // MultiXactId oldestMulti; /* 80 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ - d.FieldU64("oldestMulti") - d.FieldU32("oldestMultiDB") + d.FieldU64("oldest_multi") + d.FieldU32("oldest_multi_db") d.FieldU32("hole4") /* 88 | 8 */ // pg_time_t time; @@ -137,27 +137,27 @@ func DecodePgControl(d *decode.D, in any) any { /* 104 | 8 */ // TransactionId newestCommitTsXid; /* 112 | 8 */ // TransactionId oldestActiveXid; d.FieldS64("time", common.TimeMapper) - d.FieldU64("oldestCommitTsXid") - d.FieldU64("newestCommitTsXid") - d.FieldU64("oldestActiveXid") + d.FieldU64("oldest_commit_ts_xid") + d.FieldU64("newest_commit_ts_xid") + d.FieldU64("oldest_active_xid") }) /* 160 | 8 */ // XLogRecPtr unloggedLSN; /* 168 | 8 */ // XLogRecPtr minRecoveryPoint; /* 176 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN", common.LocPtrMapper) - d.FieldU64("minRecoveryPoint", common.LocPtrMapper) - d.FieldU32("minRecoveryPointTLI") + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") d.FieldU32("hole5") /* 184 | 8 */ // XLogRecPtr backupStartPoint; /* 192 | 8 */ // XLogRecPtr backupEndPoint; /* 200 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint", common.LocPtrMapper) - d.FieldU64("backupEndPoint", common.LocPtrMapper) - d.FieldU8("backupEndRequired") + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") d.FieldU24("hole6") /* 204 | 4 */ // int wal_level; @@ -174,7 +174,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 228 | 4 */ // int max_locks_per_xact; /* 232 | 1 */ // _Bool track_commit_timestamp; /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") + d.FieldS32("max_connections") d.FieldS32("max_worker_processes") d.FieldS32("max_wal_senders") d.FieldS32("max_prepared_xacts") @@ -194,17 +194,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 276 | 4 */ // uint32 loblksize; /* 280 | 1 */ // _Bool float8ByVal; /* XXX 3-byte hole */ - d.FieldU32("maxAlign") - d.FieldF64("floatFormat") + d.FieldU32("max_align") + d.FieldF64("float_format") d.FieldU32("blcksz") d.FieldU32("relseg_size") d.FieldU32("xlog_blcksz") d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") - d.FieldU8("float8ByVal") + d.FieldU8("float8_by_val") d.FieldU24("hole9") /* 284 | 4 */ // uint32 data_checksum_version; diff --git a/format/postgres/flavours/postgres11/pg_control.go b/format/postgres/flavours/postgres11/pg_control.go index cd3a2e7e3..f29083552 100644 --- a/format/postgres/flavours/postgres11/pg_control.go +++ b/format/postgres/flavours/postgres11/pg_control.go @@ -92,17 +92,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 80 */ // CheckPoint checkPointCopy; d.FieldS64("time", common.TimeMapper) - d.FieldU64("checkPoint", common.XLogRecPtrMapper) - d.FieldStruct("checkPointCopy", func(d *decode.D) { + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 3-byte hole */ d.FieldU64("redo", common.XLogRecPtrMapper) - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") d.FieldU24("hole1") /* 20 | 4 */ // uint32 nextXidEpoch; @@ -119,19 +119,19 @@ func DecodePgControl(d *decode.D, in any) any { /* 68 | 4 */ // TransactionId newestCommitTsXid; /* 72 | 4 */ // TransactionId oldestActiveXid; /* XXX 4-byte padding */ - d.FieldU32("nextXidEpoch") - d.FieldU32("nextXid") - d.FieldU32("nextOid") - d.FieldU32("nextMulti") - d.FieldU32("nextMultiOffset") - d.FieldU32("oldestXid") - d.FieldU32("oldestXidDB") - d.FieldU32("oldestMulti") - d.FieldU32("oldestMultiDB") + d.FieldU32("next_xid_epoch") + d.FieldU32("next_xid") + d.FieldU32("next_oid") + d.FieldU32("next_multi") + d.FieldU32("next_multi_offset") + d.FieldU32("oldest_xid") + d.FieldU32("oldest_xid_db") + d.FieldU32("oldest_multi") + d.FieldU32("oldest_multi_db") d.FieldS64("time", common.TimeMapper) - d.FieldU32("oldestCommitTsXid") - d.FieldU32("newestCommitTsXid") - d.FieldU32("oldestActiveXid") + d.FieldU32("oldest_commit_ts_xid") + d.FieldU32("newest_commit_ts_xid") + d.FieldU32("oldest_active_xid") d.FieldU32("padding0") }) @@ -139,18 +139,18 @@ func DecodePgControl(d *decode.D, in any) any { /* 128 | 8 */ // XLogRecPtr minRecoveryPoint; /* 136 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN", common.LocPtrMapper) - d.FieldU64("minRecoveryPoint", common.LocPtrMapper) - d.FieldU32("minRecoveryPointTLI") + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") d.FieldU32("hole2") /* 144 | 8 */ // XLogRecPtr backupStartPoint; /* 152 | 8 */ // XLogRecPtr backupEndPoint; /* 160 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint", common.LocPtrMapper) - d.FieldU64("backupEndPoint", common.LocPtrMapper) - d.FieldU8("backupEndRequired") + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") d.FieldU24("hole3") /* 164 | 4 */ // int wal_level; @@ -166,7 +166,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 184 | 4 */ // int max_locks_per_xact; /* 188 | 1 */ // _Bool track_commit_timestamp; /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") + d.FieldS32("max_connections") d.FieldS32("max_worker_processes") d.FieldS32("max_prepared_xacts") d.FieldS32("max_locks_per_xact") @@ -175,7 +175,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 192 | 4 */ // uint32 maxAlign; /* XXX 4-byte hole */ - d.FieldU32("maxAlign") + d.FieldU32("max_align") d.FieldU32("hole6") /* 200 | 8 */ // double floatFormat; @@ -190,17 +190,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 240 | 1 */ // _Bool float4ByVal; /* 241 | 1 */ // _Bool float8ByVal; /* XXX 2-byte hole */ - d.FieldF64("floatFormat") + d.FieldF64("float_format") d.FieldU32("blcksz") d.FieldU32("relseg_size") d.FieldU32("xlog_blcksz") d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") - d.FieldU8("float4ByVal") - d.FieldU8("float8ByVal") + d.FieldU8("float4_by_val") + d.FieldU8("float8_by_val") d.FieldU16("hole7") /* 252 | 4 */ // uint32 data_checksum_version; diff --git a/format/postgres/flavours/postgres12/pg_control.go b/format/postgres/flavours/postgres12/pg_control.go index d8e140955..13286a754 100644 --- a/format/postgres/flavours/postgres12/pg_control.go +++ b/format/postgres/flavours/postgres12/pg_control.go @@ -91,17 +91,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 88 */ // CheckPoint checkPointCopy; d.FieldS64("time", common.TimeMapper) - d.FieldU64("checkPoint", common.XLogRecPtrMapper) - d.FieldStruct("checkPointCopy", func(d *decode.D) { + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 7-byte hole */ d.FieldU64("redo", common.XLogRecPtrMapper) - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextFullXid; @@ -113,14 +113,14 @@ func DecodePgControl(d *decode.D, in any) any { /* 52 | 4 */ // MultiXactId oldestMulti; /* 56 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ - d.FieldU64("nextFullXid", common.NextFullXidMapper) - d.FieldU32("nextOid") - d.FieldU32("nextMulti") - d.FieldU32("nextMultiOffset") - d.FieldU32("oldestXid") - d.FieldU32("oldestXidDB") - d.FieldU32("oldestMulti") - d.FieldU32("oldestMultiDB") + d.FieldU64("next_full_xid", common.NextFullXidMapper) + d.FieldU32("next_oid") + d.FieldU32("next_multi") + d.FieldU32("next_multi_offset") + d.FieldU32("oldest_xid") + d.FieldU32("oldest_xid_db") + d.FieldU32("oldest_multi") + d.FieldU32("oldest_multi_db") d.FieldU32("hole2") /* 64 | 8 */ // pg_time_t time; @@ -129,9 +129,9 @@ func DecodePgControl(d *decode.D, in any) any { /* 80 | 4 */ // TransactionId oldestActiveXid; /* XXX 4-byte padding */ d.FieldS64("time", common.TimeMapper) - d.FieldU32("oldestCommitTsXid") - d.FieldU32("newestCommitTsXid") - d.FieldU32("oldestActiveXid") + d.FieldU32("oldest_commit_ts_xid") + d.FieldU32("newest_commit_ts_xid") + d.FieldU32("oldest_active_xid") d.FieldU32("padding0") }) @@ -139,18 +139,18 @@ func DecodePgControl(d *decode.D, in any) any { /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN", common.LocPtrMapper) - d.FieldU64("minRecoveryPoint", common.LocPtrMapper) - d.FieldU32("minRecoveryPointTLI") + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") d.FieldU32("hole3") /* 152 | 8 */ // XLogRecPtr backupStartPoint; /* 160 | 8 */ // XLogRecPtr backupEndPoint; /* 168 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint", common.LocPtrMapper) - d.FieldU64("backupEndPoint", common.LocPtrMapper) - d.FieldU8("backupEndRequired") + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") d.FieldU24("hole4") /* 172 | 4 */ // int wal_level; @@ -167,7 +167,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 196 | 4 */ // int max_locks_per_xact; /* 200 | 1 */ // _Bool track_commit_timestamp; /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") + d.FieldS32("max_connections") d.FieldS32("max_worker_processes") d.FieldS32("max_wal_senders") d.FieldS32("max_prepared_xacts") @@ -188,18 +188,18 @@ func DecodePgControl(d *decode.D, in any) any { /* 248 | 1 */ // _Bool float4ByVal; /* 249 | 1 */ // _Bool float8ByVal; /* XXX 2-byte hole */ - d.FieldU32("maxAlign") - d.FieldF64("floatFormat") + d.FieldU32("max_align") + d.FieldF64("float_format") d.FieldU32("blcksz") d.FieldU32("relseg_size") d.FieldU32("xlog_blcksz") d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") - d.FieldU8("float4ByVal") - d.FieldU8("float8ByVal") + d.FieldU8("float4_by_val") + d.FieldU8("float8_by_val") d.FieldU16("hole7") /* 252 | 4 */ // uint32 data_checksum_version; diff --git a/format/postgres/flavours/postgres13/pg_control.go b/format/postgres/flavours/postgres13/pg_control.go index d0e6f64c0..b2e617ba1 100644 --- a/format/postgres/flavours/postgres13/pg_control.go +++ b/format/postgres/flavours/postgres13/pg_control.go @@ -90,17 +90,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 88 */ // CheckPoint checkPointCopy; d.FieldS64("time", common.TimeMapper) - d.FieldU64("checkPoint", common.XLogRecPtrMapper) - d.FieldStruct("checkPointCopy", func(d *decode.D) { + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 7-byte hole */ d.FieldU64("redo", common.XLogRecPtrMapper) - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextFullXid @@ -112,14 +112,14 @@ func DecodePgControl(d *decode.D, in any) any { /* 52 | 4 */ // MultiXactId oldestMulti /* 56 | 4 */ // Oid oldestMultiDB /* XXX 4-byte hole */ - d.FieldU64("nextFullXid") - d.FieldU32("nextOid") - d.FieldU32("nextMulti") - d.FieldU32("nextMultiOffset") - d.FieldU32("oldestXid") - d.FieldU32("oldestXidDB") - d.FieldU32("oldestMulti") - d.FieldU32("oldestMultiDB") + d.FieldU64("next_full_xid") + d.FieldU32("next_oid") + d.FieldU32("next_multi") + d.FieldU32("next_multi_offset") + d.FieldU32("oldest_xid") + d.FieldU32("oldest_xid_db") + d.FieldU32("oldest_multi") + d.FieldU32("oldest_multi_db") d.FieldU32("hole2") /* 64 | 8 */ // pg_time_t time @@ -128,9 +128,9 @@ func DecodePgControl(d *decode.D, in any) any { /* 80 | 4 */ // TransactionId oldestActiveXid /* XXX 4-byte padding */ d.FieldS64("time", common.TimeMapper) - d.FieldU32("oldestCommitTsXid") - d.FieldU32("newestCommitTsXid") - d.FieldU32("oldestActiveXid") + d.FieldU32("oldest_commit_ts_xid") + d.FieldU32("newest_commit_ts_xid") + d.FieldU32("oldest_active_xid") d.FieldU32("padding0") }) @@ -138,18 +138,18 @@ func DecodePgControl(d *decode.D, in any) any { /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN", common.LocPtrMapper) - d.FieldU64("minRecoveryPoint", common.LocPtrMapper) - d.FieldU32("minRecoveryPointTLI") + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") d.FieldU32("hole3") /* 152 | 8 */ // XLogRecPtr backupStartPoint; /* 160 | 8 */ // XLogRecPtr backupEndPoint; /* 168 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint", common.LocPtrMapper) - d.FieldU64("backupEndPoint", common.LocPtrMapper) - d.FieldU8("backupEndRequired") + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") d.FieldU24("hole4") /* 172 | 4 */ // int wal_level; @@ -166,7 +166,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 196 | 4 */ // int max_locks_per_xact /* 200 | 1 */ // _Bool track_commit_timestamp /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") + d.FieldS32("max_connections") d.FieldS32("max_worker_processes") d.FieldS32("max_wal_senders") d.FieldS32("max_prepared_xacts") @@ -186,17 +186,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 244 | 4 */ // uint32 loblksize /* 248 | 1 */ // _Bool float8ByVal /* XXX 3-byte hole */ - d.FieldU32("maxAlign") - d.FieldF64("floatFormat") + d.FieldU32("max_align") + d.FieldF64("float_format") d.FieldU32("blcksz") d.FieldU32("relseg_size") d.FieldU32("xlog_blcksz") d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") - d.FieldU8("float8ByVal") + d.FieldU8("float8_by_val") d.FieldU24("hole7") /* 252 | 4 */ // uint32 data_checksum_version; diff --git a/format/postgres/flavours/postgres14/pg_control.go b/format/postgres/flavours/postgres14/pg_control.go index d387e5493..cb3d32635 100644 --- a/format/postgres/flavours/postgres14/pg_control.go +++ b/format/postgres/flavours/postgres14/pg_control.go @@ -90,17 +90,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 32 | 8 */ // XLogRecPtr checkPoint; /* 40 | 88 */ // CheckPoint checkPointCopy; d.FieldS64("time", common.TimeMapper) - d.FieldU64("checkPoint", common.XLogRecPtrMapper) - d.FieldStruct("checkPointCopy", func(d *decode.D) { + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { /* 0 | 8 */ // XLogRecPtr redo; /* 8 | 4 */ // TimeLineID ThisTimeLineID; /* 12 | 4 */ // TimeLineID PrevTimeLineID; /* 16 | 1 */ // _Bool fullPageWrites; /* XXX 7-byte hole */ d.FieldU64("redo", common.XLogRecPtrMapper) - d.FieldU32("ThisTimeLineID") - d.FieldU32("PrevTimeLineID") - d.FieldU8("fullPageWrites") + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") d.FieldU56("hole1") /* 24 | 8 */ // FullTransactionId nextXid; @@ -112,14 +112,14 @@ func DecodePgControl(d *decode.D, in any) any { /* 52 | 4 */ // MultiXactId oldestMulti; /* 56 | 4 */ // Oid oldestMultiDB; /* XXX 4-byte hole */ - d.FieldU64("nextXid") - d.FieldU32("nextOid") - d.FieldU32("nextMulti") - d.FieldU32("nextMultiOffset") - d.FieldU32("oldestXid") - d.FieldU32("oldestXidDB") - d.FieldU32("oldestMulti") - d.FieldU32("oldestMultiDB") + d.FieldU64("next_xid") + d.FieldU32("next_oid") + d.FieldU32("next_multi") + d.FieldU32("next_multi_offset") + d.FieldU32("oldest_xid") + d.FieldU32("oldest_xid_db") + d.FieldU32("oldest_multi") + d.FieldU32("oldest_multi_db") d.FieldU32("hole2") /* 64 | 8 */ // pg_time_t time; @@ -128,9 +128,9 @@ func DecodePgControl(d *decode.D, in any) any { /* 80 | 4 */ // TransactionId oldestActiveXid; /* XXX 4-byte padding */ d.FieldS64("time", common.TimeMapper) - d.FieldU32("oldestCommitTsXid") - d.FieldU32("newestCommitTsXid") - d.FieldU32("oldestActiveXid") + d.FieldU32("oldest_commit_ts_xid") + d.FieldU32("newest_commit_ts_xid") + d.FieldU32("oldest_active_xid") d.FieldU32("padding0") }) @@ -138,18 +138,18 @@ func DecodePgControl(d *decode.D, in any) any { /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; /* XXX 4-byte hole */ - d.FieldU64("unloggedLSN", common.LocPtrMapper) - d.FieldU64("minRecoveryPoint", common.LocPtrMapper) - d.FieldU32("minRecoveryPointTLI") + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") d.FieldU32("hole3") /* 152 | 8 */ // XLogRecPtr backupStartPoint; /* 160 | 8 */ // XLogRecPtr backupEndPoint; /* 168 | 1 */ // _Bool backupEndRequired; /* XXX 3-byte hole */ - d.FieldU64("backupStartPoint", common.LocPtrMapper) - d.FieldU64("backupEndPoint", common.LocPtrMapper) - d.FieldU8("backupEndRequired") + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") d.FieldU24("hole4") /* 172 | 4 */ // int wal_level; @@ -166,7 +166,7 @@ func DecodePgControl(d *decode.D, in any) any { /* 196 | 4 */ // int max_locks_per_xact; /* 200 | 1 */ // _Bool track_commit_timestamp; /* XXX 3-byte hole */ - d.FieldS32("MaxConnections") + d.FieldS32("max_connections") d.FieldS32("max_worker_processes") d.FieldS32("max_wal_senders") d.FieldS32("max_prepared_xacts") @@ -186,17 +186,17 @@ func DecodePgControl(d *decode.D, in any) any { /* 244 | 4 */ // uint32 loblksize; /* 248 | 1 */ // _Bool float8ByVal; /* XXX 3-byte hole */ - d.FieldU32("maxAlign") - d.FieldF64("floatFormat") + d.FieldU32("max_align") + d.FieldF64("float_format") d.FieldU32("blcksz") d.FieldU32("relseg_size") d.FieldU32("xlog_blcksz") d.FieldU32("xlog_seg_size") - d.FieldU32("nameDataLen") - d.FieldU32("indexMaxKeys") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") d.FieldU32("toast_max_chunk_size") d.FieldU32("loblksize") - d.FieldU8("float8ByVal") + d.FieldU8("float8_by_val") d.FieldU24("hole7") /* 252 | 4 */ // uint32 data_checksum_version; diff --git a/format/postgres/testdata/flavours/pgpro11/pg_control.fqtest b/format/postgres/testdata/flavours/pgpro11/pg_control.fqtest index 09bbaefd4..27fee75e7 100644 --- a/format/postgres/testdata/flavours/pgpro11/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/pg_control.fqtest @@ -6,57 +6,57 @@ $ fq -d pg_control -o flavour=pgpro11 dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 94 a9 08 63 00 00 00 00| ...c....| time: "Fri, 26 Aug 2022 11:08:04 UTC" (1661512084) 0x18-0x1f.7 (8) -0x0020|58 d8 f2 03 00 00 00 00 |X....... | checkPoint: "0/3F2D858" (66246744) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x77.7 (80) +0x0020|58 d8 f2 03 00 00 00 00 |X....... | check_point: "0/3F2D858" (66246744) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x77.7 (80) 0x0020| 20 d8 f2 03 00 00 00 00| .......| redo: "0/3F2D820" (66246688) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 | ... | hole1: 0 0x39-0x3b.7 (3) -0x0030| 00 00 00 00| ....| nextXidEpoch: 0 0x3c-0x3f.7 (4) -0x0040|0e 0e 00 00 |.... | nextXid: 3598 0x40-0x43.7 (4) -0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x44-0x47.7 (4) -0x0040| 01 00 00 00 | .... | nextMulti: 1 0x48-0x4b.7 (4) -0x0040| 00 00 00 00| ....| nextMultiOffset: 0 0x4c-0x4f.7 (4) -0x0050|34 02 00 00 |4... | oldestXid: 564 0x50-0x53.7 (4) -0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x54-0x57.7 (4) -0x0050| 01 00 00 00 | .... | oldestMulti: 1 0x58-0x5b.7 (4) -0x0050| 01 00 00 00| ....| oldestMultiDB: 1 0x5c-0x5f.7 (4) +0x0030| 00 00 00 00| ....| next_xid_epoch: 0 0x3c-0x3f.7 (4) +0x0040|0e 0e 00 00 |.... | next_xid: 3598 0x40-0x43.7 (4) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x44-0x47.7 (4) +0x0040| 01 00 00 00 | .... | next_multi: 1 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| next_multi_offset: 0 0x4c-0x4f.7 (4) +0x0050|34 02 00 00 |4... | oldest_xid: 564 0x50-0x53.7 (4) +0x0050| 01 00 00 00 | .... | oldest_xid_db: 1 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldest_multi: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldest_multi_db: 1 0x5c-0x5f.7 (4) 0x0060|94 a9 08 63 00 00 00 00 |...c.... | time: "Fri, 26 Aug 2022 11:08:04 UTC" (1661512084) 0x60-0x67.7 (8) -0x0060| 00 00 00 00 | .... | oldestCommitTsXid: 0 0x68-0x6b.7 (4) -0x0060| 00 00 00 00| ....| newestCommitTsXid: 0 0x6c-0x6f.7 (4) -0x0070|0e 0e 00 00 |.... | oldestActiveXid: 3598 0x70-0x73.7 (4) +0x0060| 00 00 00 00 | .... | oldest_commit_ts_xid: 0 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| newest_commit_ts_xid: 0 0x6c-0x6f.7 (4) +0x0070|0e 0e 00 00 |.... | oldest_active_xid: 3598 0x70-0x73.7 (4) 0x0070| 00 00 00 00 | .... | padding1: 0 0x74-0x77.7 (4) -0x0070| 01 00 00 00 00 00 00 00| ........| unloggedLSN: "0/1" (1) 0x78-0x7f.7 (8) -0x0080|00 00 00 00 00 00 00 00 |........ | minRecoveryPoint: "0/0" (0) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 | .... | minRecoveryPointTLI: 0 0x88-0x8b.7 (4) +0x0070| 01 00 00 00 00 00 00 00| ........| unlogged_lsn: "0/1" (1) 0x78-0x7f.7 (8) +0x0080|00 00 00 00 00 00 00 00 |........ | min_recovery_point: "0/0" (0) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 | .... | min_recovery_point_tli: 0 0x88-0x8b.7 (4) 0x0080| 00 00 00 00| ....| hole2: 0 0x8c-0x8f.7 (4) -0x0090|00 00 00 00 00 00 00 00 |........ | backupStartPoint: "0/0" (0) 0x90-0x97.7 (8) -0x0090| 00 00 00 00 00 00 00 00| ........| backupEndPoint: "0/0" (0) 0x98-0x9f.7 (8) -0x00a0|00 |. | backupEndRequired: 0 0xa0-0xa0.7 (1) +0x0090|00 00 00 00 00 00 00 00 |........ | backup_start_point: "0/0" (0) 0x90-0x97.7 (8) +0x0090| 00 00 00 00 00 00 00 00| ........| backup_end_point: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 |. | backup_end_required: 0 0xa0-0xa0.7 (1) 0x00a0| 00 00 00 | ... | hole3: 0 0xa1-0xa3.7 (3) 0x00a0| 01 00 00 00 | .... | wal_level: "WAL_LEVEL_REPLICA" (1) 0xa4-0xa7.7 (4) 0x00a0| 00 | . | wal_log_hints: 0 0xa8-0xa8.7 (1) 0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) -0x00a0| c2 00 00 00| ....| MaxConnections: 194 0xac-0xaf.7 (4) +0x00a0| c2 00 00 00| ....| max_connections: 194 0xac-0xaf.7 (4) 0x00b0|08 00 00 00 |.... | max_worker_processes: 8 0xb0-0xb3.7 (4) 0x00b0| 00 00 00 00 | .... | max_prepared_xacts: 0 0xb4-0xb7.7 (4) 0x00b0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xb8-0xbb.7 (4) 0x00b0| 00 | . | track_commit_timestamp: 0 0xbc-0xbc.7 (1) 0x00b0| 00 00 00| ...| hole5: 0 0xbd-0xbf.7 (3) -0x00c0|08 00 00 00 |.... | maxAlign: 8 0xc0-0xc3.7 (4) +0x00c0|08 00 00 00 |.... | max_align: 8 0xc0-0xc3.7 (4) 0x00c0| 00 00 00 00 | .... | hole6: 0 0xc4-0xc7.7 (4) -0x00c0| 00 00 00 00 87 d6 32 41| ......2A| floatFormat: 1.234567e+06 0xc8-0xcf.7 (8) +0x00c0| 00 00 00 00 87 d6 32 41| ......2A| float_format: 1.234567e+06 0xc8-0xcf.7 (8) 0x00d0|00 20 00 00 |. .. | blcksz: 8192 0xd0-0xd3.7 (4) 0x00d0| 00 00 02 00 | .... | relseg_size: 131072 0xd4-0xd7.7 (4) 0x00d0| 00 20 00 00 | . .. | xlog_blcksz: 8192 0xd8-0xdb.7 (4) 0x00d0| 00 00 00 01| ....| xlog_seg_size: 16777216 0xdc-0xdf.7 (4) -0x00e0|40 00 00 00 |@... | nameDataLen: 64 0xe0-0xe3.7 (4) -0x00e0| 20 00 00 00 | ... | indexMaxKeys: 32 0xe4-0xe7.7 (4) +0x00e0|40 00 00 00 |@... | name_data_len: 64 0xe0-0xe3.7 (4) +0x00e0| 20 00 00 00 | ... | index_max_keys: 32 0xe4-0xe7.7 (4) 0x00e0| cc 07 00 00 | .... | toast_max_chunk_size: 1996 0xe8-0xeb.7 (4) 0x00e0| 00 08 00 00| ....| loblksize: 2048 0xec-0xef.7 (4) -0x00f0|01 |. | float4ByVal: 1 0xf0-0xf0.7 (1) -0x00f0| 01 | . | float8ByVal: 1 0xf1-0xf1.7 (1) +0x00f0|01 |. | float4_by_val: 1 0xf0-0xf0.7 (1) +0x00f0| 01 | . | float8_by_val: 1 0xf1-0xf1.7 (1) 0x00f0| 00 00 | .. | hole7: 0 0xf2-0xf3.7 (2) 0x00f0| 01 00 00 00 | .... | data_checksum_version: 1 0xf4-0xf7.7 (4) 0x00f0| f6 a2 53 c7 68 b8 81 35| ..S.h..5| mock_authentication_nonce: "f6a253c768b8813567e90b7670f403b446b7807d992f1c9..." (raw bits) 0xf8-0x117.7 (32) diff --git a/format/postgres/testdata/flavours/pgpro11/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgpro11/pg_control_1.fqtest index 6af3f4f39..9bea13b31 100644 --- a/format/postgres/testdata/flavours/pgpro11/pg_control_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/pg_control_1.fqtest @@ -6,57 +6,57 @@ $ fq -d pg_control dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 94 a9 08 63 00 00 00 00| ...c....| time: "Fri, 26 Aug 2022 11:08:04 UTC" (1661512084) 0x18-0x1f.7 (8) -0x0020|58 d8 f2 03 00 00 00 00 |X....... | checkPoint: "0/3F2D858" (66246744) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x77.7 (80) +0x0020|58 d8 f2 03 00 00 00 00 |X....... | check_point: "0/3F2D858" (66246744) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x77.7 (80) 0x0020| 20 d8 f2 03 00 00 00 00| .......| redo: "0/3F2D820" (66246688) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 | ... | hole1: 0 0x39-0x3b.7 (3) -0x0030| 00 00 00 00| ....| nextXidEpoch: 0 0x3c-0x3f.7 (4) -0x0040|0e 0e 00 00 |.... | nextXid: 3598 0x40-0x43.7 (4) -0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x44-0x47.7 (4) -0x0040| 01 00 00 00 | .... | nextMulti: 1 0x48-0x4b.7 (4) -0x0040| 00 00 00 00| ....| nextMultiOffset: 0 0x4c-0x4f.7 (4) -0x0050|34 02 00 00 |4... | oldestXid: 564 0x50-0x53.7 (4) -0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x54-0x57.7 (4) -0x0050| 01 00 00 00 | .... | oldestMulti: 1 0x58-0x5b.7 (4) -0x0050| 01 00 00 00| ....| oldestMultiDB: 1 0x5c-0x5f.7 (4) +0x0030| 00 00 00 00| ....| next_xid_epoch: 0 0x3c-0x3f.7 (4) +0x0040|0e 0e 00 00 |.... | next_xid: 3598 0x40-0x43.7 (4) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x44-0x47.7 (4) +0x0040| 01 00 00 00 | .... | next_multi: 1 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| next_multi_offset: 0 0x4c-0x4f.7 (4) +0x0050|34 02 00 00 |4... | oldest_xid: 564 0x50-0x53.7 (4) +0x0050| 01 00 00 00 | .... | oldest_xid_db: 1 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldest_multi: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldest_multi_db: 1 0x5c-0x5f.7 (4) 0x0060|94 a9 08 63 00 00 00 00 |...c.... | time: "Fri, 26 Aug 2022 11:08:04 UTC" (1661512084) 0x60-0x67.7 (8) -0x0060| 00 00 00 00 | .... | oldestCommitTsXid: 0 0x68-0x6b.7 (4) -0x0060| 00 00 00 00| ....| newestCommitTsXid: 0 0x6c-0x6f.7 (4) -0x0070|0e 0e 00 00 |.... | oldestActiveXid: 3598 0x70-0x73.7 (4) +0x0060| 00 00 00 00 | .... | oldest_commit_ts_xid: 0 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| newest_commit_ts_xid: 0 0x6c-0x6f.7 (4) +0x0070|0e 0e 00 00 |.... | oldest_active_xid: 3598 0x70-0x73.7 (4) 0x0070| 00 00 00 00 | .... | padding1: 0 0x74-0x77.7 (4) -0x0070| 01 00 00 00 00 00 00 00| ........| unloggedLSN: "0/1" (1) 0x78-0x7f.7 (8) -0x0080|00 00 00 00 00 00 00 00 |........ | minRecoveryPoint: "0/0" (0) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 | .... | minRecoveryPointTLI: 0 0x88-0x8b.7 (4) +0x0070| 01 00 00 00 00 00 00 00| ........| unlogged_lsn: "0/1" (1) 0x78-0x7f.7 (8) +0x0080|00 00 00 00 00 00 00 00 |........ | min_recovery_point: "0/0" (0) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 | .... | min_recovery_point_tli: 0 0x88-0x8b.7 (4) 0x0080| 00 00 00 00| ....| hole2: 0 0x8c-0x8f.7 (4) -0x0090|00 00 00 00 00 00 00 00 |........ | backupStartPoint: "0/0" (0) 0x90-0x97.7 (8) -0x0090| 00 00 00 00 00 00 00 00| ........| backupEndPoint: "0/0" (0) 0x98-0x9f.7 (8) -0x00a0|00 |. | backupEndRequired: 0 0xa0-0xa0.7 (1) +0x0090|00 00 00 00 00 00 00 00 |........ | backup_start_point: "0/0" (0) 0x90-0x97.7 (8) +0x0090| 00 00 00 00 00 00 00 00| ........| backup_end_point: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 |. | backup_end_required: 0 0xa0-0xa0.7 (1) 0x00a0| 00 00 00 | ... | hole3: 0 0xa1-0xa3.7 (3) 0x00a0| 01 00 00 00 | .... | wal_level: "WAL_LEVEL_REPLICA" (1) 0xa4-0xa7.7 (4) 0x00a0| 00 | . | wal_log_hints: 0 0xa8-0xa8.7 (1) 0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) -0x00a0| c2 00 00 00| ....| MaxConnections: 194 0xac-0xaf.7 (4) +0x00a0| c2 00 00 00| ....| max_connections: 194 0xac-0xaf.7 (4) 0x00b0|08 00 00 00 |.... | max_worker_processes: 8 0xb0-0xb3.7 (4) 0x00b0| 00 00 00 00 | .... | max_prepared_xacts: 0 0xb4-0xb7.7 (4) 0x00b0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xb8-0xbb.7 (4) 0x00b0| 00 | . | track_commit_timestamp: 0 0xbc-0xbc.7 (1) 0x00b0| 00 00 00| ...| hole5: 0 0xbd-0xbf.7 (3) -0x00c0|08 00 00 00 |.... | maxAlign: 8 0xc0-0xc3.7 (4) +0x00c0|08 00 00 00 |.... | max_align: 8 0xc0-0xc3.7 (4) 0x00c0| 00 00 00 00 | .... | hole6: 0 0xc4-0xc7.7 (4) -0x00c0| 00 00 00 00 87 d6 32 41| ......2A| floatFormat: 1.234567e+06 0xc8-0xcf.7 (8) +0x00c0| 00 00 00 00 87 d6 32 41| ......2A| float_format: 1.234567e+06 0xc8-0xcf.7 (8) 0x00d0|00 20 00 00 |. .. | blcksz: 8192 0xd0-0xd3.7 (4) 0x00d0| 00 00 02 00 | .... | relseg_size: 131072 0xd4-0xd7.7 (4) 0x00d0| 00 20 00 00 | . .. | xlog_blcksz: 8192 0xd8-0xdb.7 (4) 0x00d0| 00 00 00 01| ....| xlog_seg_size: 16777216 0xdc-0xdf.7 (4) -0x00e0|40 00 00 00 |@... | nameDataLen: 64 0xe0-0xe3.7 (4) -0x00e0| 20 00 00 00 | ... | indexMaxKeys: 32 0xe4-0xe7.7 (4) +0x00e0|40 00 00 00 |@... | name_data_len: 64 0xe0-0xe3.7 (4) +0x00e0| 20 00 00 00 | ... | index_max_keys: 32 0xe4-0xe7.7 (4) 0x00e0| cc 07 00 00 | .... | toast_max_chunk_size: 1996 0xe8-0xeb.7 (4) 0x00e0| 00 08 00 00| ....| loblksize: 2048 0xec-0xef.7 (4) -0x00f0|01 |. | float4ByVal: 1 0xf0-0xf0.7 (1) -0x00f0| 01 | . | float8ByVal: 1 0xf1-0xf1.7 (1) +0x00f0|01 |. | float4_by_val: 1 0xf0-0xf0.7 (1) +0x00f0| 01 | . | float8_by_val: 1 0xf1-0xf1.7 (1) 0x00f0| 00 00 | .. | hole7: 0 0xf2-0xf3.7 (2) 0x00f0| 01 00 00 00 | .... | data_checksum_version: 1 0xf4-0xf7.7 (4) 0x00f0| f6 a2 53 c7 68 b8 81 35| ..S.h..5| mock_authentication_nonce: "f6a253c768b8813567e90b7670f403b446b7807d992f1c9..." (raw bits) 0xf8-0x117.7 (32) diff --git a/format/postgres/testdata/flavours/pgpro12/pg_control.fqtest b/format/postgres/testdata/flavours/pgpro12/pg_control.fqtest index e43685a32..d24e3420a 100644 --- a/format/postgres/testdata/flavours/pgpro12/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/pg_control.fqtest @@ -6,57 +6,57 @@ $ fq -d pg_control -o flavour=pgpro12 dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| b0 81 08 63 00 00 00 00| ...c....| time: "Fri, 26 Aug 2022 08:17:52 UTC" (1661501872) 0x18-0x1f.7 (8) -0x0020|90 5d 59 09 00 00 00 00 |.]Y..... | checkPoint: "0/9595D90" (156851600) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020|90 5d 59 09 00 00 00 00 |.]Y..... | check_point: "0/9595D90" (156851600) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x7f.7 (88) 0x0020| 58 5d 59 09 00 00 00 00| X]Y.....| redo: "0/9595D58" (156851544) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|5d 0f 00 00 00 00 00 00 |]....... | nextFullXid: 3933 0x40-0x47.7 (8) -0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) -0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) -0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) -0x0050| e0 01 00 00 | .... | oldestXid: 480 0x54-0x57.7 (4) -0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) -0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) -0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0040|5d 0f 00 00 00 00 00 00 |]....... | next_full_xid: 3933 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| next_multi: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | next_multi_offset: 0 0x50-0x53.7 (4) +0x0050| e0 01 00 00 | .... | oldest_xid: 480 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldest_xid_db: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldest_multi: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldest_multi_db: 1 0x60-0x63.7 (4) 0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) 0x0060| ad 81 08 63 00 00 00 00| ...c....| time: "Fri, 26 Aug 2022 08:17:49 UTC" (1661501869) 0x68-0x6f.7 (8) -0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) -0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) -0x0070| 5d 0f 00 00 | ]... | oldestActiveXid: 3933 0x78-0x7b.7 (4) +0x0070|00 00 00 00 |.... | oldest_commit_ts_xid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newest_commit_ts_xid: 0 0x74-0x77.7 (4) +0x0070| 5d 0f 00 00 | ]... | oldest_active_xid: 3933 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) -0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) -0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | min_recovery_point_tli: 0 0x90-0x93.7 (4) 0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) -0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) -0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) -0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x0090| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backup_end_required: 0 0xa8-0xa8.7 (1) 0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) 0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) 0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) 0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) -0x00b0| c2 00 00 00 | .... | MaxConnections: 194 0xb4-0xb7.7 (4) +0x00b0| c2 00 00 00 | .... | max_connections: 194 0xb4-0xb7.7 (4) 0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) 0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) 0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) 0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) 0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) -0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) -0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00c0| 08 00 00 00| ....| max_align: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xd0-0xd7.7 (8) 0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) 0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) 0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) 0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) -0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) -0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00e0| 40 00 00 00 | @... | name_data_len: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| index_max_keys: 32 0xec-0xef.7 (4) 0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) 0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) -0x00f0| 01 | . | float4ByVal: 1 0xf8-0xf8.7 (1) -0x00f0| 01 | . | float8ByVal: 1 0xf9-0xf9.7 (1) +0x00f0| 01 | . | float4_by_val: 1 0xf8-0xf8.7 (1) +0x00f0| 01 | . | float8_by_val: 1 0xf9-0xf9.7 (1) 0x00f0| 00 00 | .. | hole7: 0 0xfa-0xfb.7 (2) 0x00f0| 01 00 00 00| ....| data_checksum_version: 1 0xfc-0xff.7 (4) 0x0100|ee 89 1b 8b f8 aa 7f f5 9a d9 10 da e0 68 9b 40|.............h.@| mock_authentication_nonce: "ee891b8bf8aa7ff59ad910dae0689b40dd36952da495341..." (raw bits) 0x100-0x11f.7 (32) diff --git a/format/postgres/testdata/flavours/pgpro12/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgpro12/pg_control_1.fqtest index 4bfe37785..2aeba887e 100644 --- a/format/postgres/testdata/flavours/pgpro12/pg_control_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/pg_control_1.fqtest @@ -6,57 +6,57 @@ $ fq -d pg_control dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| b0 81 08 63 00 00 00 00| ...c....| time: "Fri, 26 Aug 2022 08:17:52 UTC" (1661501872) 0x18-0x1f.7 (8) -0x0020|90 5d 59 09 00 00 00 00 |.]Y..... | checkPoint: "0/9595D90" (156851600) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020|90 5d 59 09 00 00 00 00 |.]Y..... | check_point: "0/9595D90" (156851600) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x7f.7 (88) 0x0020| 58 5d 59 09 00 00 00 00| X]Y.....| redo: "0/9595D58" (156851544) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|5d 0f 00 00 00 00 00 00 |]....... | nextFullXid: 3933 0x40-0x47.7 (8) -0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) -0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) -0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) -0x0050| e0 01 00 00 | .... | oldestXid: 480 0x54-0x57.7 (4) -0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) -0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) -0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0040|5d 0f 00 00 00 00 00 00 |]....... | next_full_xid: 3933 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| next_multi: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | next_multi_offset: 0 0x50-0x53.7 (4) +0x0050| e0 01 00 00 | .... | oldest_xid: 480 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldest_xid_db: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldest_multi: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldest_multi_db: 1 0x60-0x63.7 (4) 0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) 0x0060| ad 81 08 63 00 00 00 00| ...c....| time: "Fri, 26 Aug 2022 08:17:49 UTC" (1661501869) 0x68-0x6f.7 (8) -0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) -0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) -0x0070| 5d 0f 00 00 | ]... | oldestActiveXid: 3933 0x78-0x7b.7 (4) +0x0070|00 00 00 00 |.... | oldest_commit_ts_xid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newest_commit_ts_xid: 0 0x74-0x77.7 (4) +0x0070| 5d 0f 00 00 | ]... | oldest_active_xid: 3933 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) -0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) -0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | min_recovery_point_tli: 0 0x90-0x93.7 (4) 0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) -0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) -0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) -0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x0090| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backup_end_required: 0 0xa8-0xa8.7 (1) 0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) 0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) 0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) 0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) -0x00b0| c2 00 00 00 | .... | MaxConnections: 194 0xb4-0xb7.7 (4) +0x00b0| c2 00 00 00 | .... | max_connections: 194 0xb4-0xb7.7 (4) 0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) 0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) 0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) 0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) 0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) -0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) -0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00c0| 08 00 00 00| ....| max_align: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xd0-0xd7.7 (8) 0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) 0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) 0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) 0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) -0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) -0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00e0| 40 00 00 00 | @... | name_data_len: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| index_max_keys: 32 0xec-0xef.7 (4) 0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) 0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) -0x00f0| 01 | . | float4ByVal: 1 0xf8-0xf8.7 (1) -0x00f0| 01 | . | float8ByVal: 1 0xf9-0xf9.7 (1) +0x00f0| 01 | . | float4_by_val: 1 0xf8-0xf8.7 (1) +0x00f0| 01 | . | float8_by_val: 1 0xf9-0xf9.7 (1) 0x00f0| 00 00 | .. | hole7: 0 0xfa-0xfb.7 (2) 0x00f0| 01 00 00 00| ....| data_checksum_version: 1 0xfc-0xff.7 (4) 0x0100|ee 89 1b 8b f8 aa 7f f5 9a d9 10 da e0 68 9b 40|.............h.@| mock_authentication_nonce: "ee891b8bf8aa7ff59ad910dae0689b40dd36952da495341..." (raw bits) 0x100-0x11f.7 (32) diff --git a/format/postgres/testdata/flavours/pgpro13/pg_control.fqtest b/format/postgres/testdata/flavours/pgpro13/pg_control.fqtest index d3ffe89dc..4a3982a39 100644 --- a/format/postgres/testdata/flavours/pgpro13/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgpro13/pg_control.fqtest @@ -6,56 +6,56 @@ $ fq -d pg_control -o flavour=pgpro13 dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 33 65 08 63 00 00 00 00| 3e.c....| time: "Fri, 26 Aug 2022 06:16:19 UTC" (1661494579) 0x18-0x1f.7 (8) -0x0020|90 84 80 09 00 00 00 00 |........ | checkPoint: "0/9808490" (159417488) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020|90 84 80 09 00 00 00 00 |........ | check_point: "0/9808490" (159417488) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x7f.7 (88) 0x0020| 58 84 80 09 00 00 00 00| X.......| redo: "0/9808458" (159417432) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|4e 24 00 00 00 00 00 00 |N$...... | nextFullXid: 9294 0x40-0x47.7 (8) -0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) -0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) -0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) -0x0050| df 01 00 00 | .... | oldestXid: 479 0x54-0x57.7 (4) -0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) -0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) -0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0040|4e 24 00 00 00 00 00 00 |N$...... | next_full_xid: 9294 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| next_multi: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | next_multi_offset: 0 0x50-0x53.7 (4) +0x0050| df 01 00 00 | .... | oldest_xid: 479 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldest_xid_db: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldest_multi: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldest_multi_db: 1 0x60-0x63.7 (4) 0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) 0x0060| 2f 65 08 63 00 00 00 00| /e.c....| time: "Fri, 26 Aug 2022 06:16:15 UTC" (1661494575) 0x68-0x6f.7 (8) -0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) -0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) -0x0070| 4e 24 00 00 | N$.. | oldestActiveXid: 9294 0x78-0x7b.7 (4) +0x0070|00 00 00 00 |.... | oldest_commit_ts_xid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newest_commit_ts_xid: 0 0x74-0x77.7 (4) +0x0070| 4e 24 00 00 | N$.. | oldest_active_xid: 9294 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) -0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) -0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | min_recovery_point_tli: 0 0x90-0x93.7 (4) 0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) -0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) -0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) -0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x0090| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backup_end_required: 0 0xa8-0xa8.7 (1) 0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) 0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) 0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) 0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) -0x00b0| c2 00 00 00 | .... | MaxConnections: 194 0xb4-0xb7.7 (4) +0x00b0| c2 00 00 00 | .... | max_connections: 194 0xb4-0xb7.7 (4) 0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) 0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) 0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) 0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) 0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) -0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) -0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00c0| 08 00 00 00| ....| max_align: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xd0-0xd7.7 (8) 0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) 0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) 0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) 0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) -0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) -0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00e0| 40 00 00 00 | @... | name_data_len: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| index_max_keys: 32 0xec-0xef.7 (4) 0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) 0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) -0x00f0| 01 | . | float8ByVal: 1 0xf8-0xf8.7 (1) +0x00f0| 01 | . | float8_by_val: 1 0xf8-0xf8.7 (1) 0x00f0| 00 00 00 | ... | hole7: 0 0xf9-0xfb.7 (3) 0x00f0| 01 00 00 00| ....| data_checksum_version: 1 0xfc-0xff.7 (4) 0x0100|69 11 33 1c d8 dc 8e d9 81 2b f6 69 c0 c7 ae e0|i.3......+.i....| mock_authentication_nonce: "6911331cd8dc8ed9812bf669c0c7aee023a99bdd6909509..." (raw bits) 0x100-0x11f.7 (32) diff --git a/format/postgres/testdata/flavours/pgpro14/pg_control.fqtest b/format/postgres/testdata/flavours/pgpro14/pg_control.fqtest index 85dcdcfe8..efe64e2f3 100644 --- a/format/postgres/testdata/flavours/pgpro14/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/pg_control.fqtest @@ -6,56 +6,56 @@ $ fq -d pg_control -o flavour=pgpro14 dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 7b ac ec 62 00 00 00 00| {..b....| time: "Fri, 05 Aug 2022 05:36:59 UTC" (1659677819) 0x18-0x1f.7 (8) -0x0020|58 b8 d5 02 00 00 00 00 |X....... | checkPoint: "0/2D5B858" (47560792) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020|58 b8 d5 02 00 00 00 00 |X....... | check_point: "0/2D5B858" (47560792) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x7f.7 (88) 0x0020| 20 b8 d5 02 00 00 00 00| .......| redo: "0/2D5B820" (47560736) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|24 45 00 00 00 00 00 00 |$E...... | nextXid: 17700 0x40-0x47.7 (8) -0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) -0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) -0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) -0x0050| dd 02 00 00 | .... | oldestXid: 733 0x54-0x57.7 (4) -0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) -0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) -0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0040|24 45 00 00 00 00 00 00 |$E...... | next_xid: 17700 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| next_multi: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | next_multi_offset: 0 0x50-0x53.7 (4) +0x0050| dd 02 00 00 | .... | oldest_xid: 733 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldest_xid_db: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldest_multi: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldest_multi_db: 1 0x60-0x63.7 (4) 0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) 0x0060| 7b ac ec 62 00 00 00 00| {..b....| time: "Fri, 05 Aug 2022 05:36:59 UTC" (1659677819) 0x68-0x6f.7 (8) -0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) -0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) -0x0070| 24 45 00 00 | $E.. | oldestActiveXid: 17700 0x78-0x7b.7 (4) +0x0070|00 00 00 00 |.... | oldest_commit_ts_xid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newest_commit_ts_xid: 0 0x74-0x77.7 (4) +0x0070| 24 45 00 00 | $E.. | oldest_active_xid: 17700 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) -0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) -0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | min_recovery_point_tli: 0 0x90-0x93.7 (4) 0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) -0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) -0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) -0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x0090| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backup_end_required: 0 0xa8-0xa8.7 (1) 0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) 0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) 0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) 0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) -0x00b0| c2 00 00 00 | .... | MaxConnections: 194 0xb4-0xb7.7 (4) +0x00b0| c2 00 00 00 | .... | max_connections: 194 0xb4-0xb7.7 (4) 0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) 0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) 0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) 0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) 0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) -0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) -0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00c0| 08 00 00 00| ....| max_align: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xd0-0xd7.7 (8) 0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) 0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) 0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) 0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) -0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) -0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00e0| 40 00 00 00 | @... | name_data_len: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| index_max_keys: 32 0xec-0xef.7 (4) 0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) 0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) -0x00f0| 01 | . | float8ByVal: 1 0xf8-0xf8.7 (1) +0x00f0| 01 | . | float8_by_val: 1 0xf8-0xf8.7 (1) 0x00f0| 00 00 00 | ... | hole7: 0 0xf9-0xfb.7 (3) 0x00f0| 01 00 00 00| ....| data_checksum_version: 1 0xfc-0xff.7 (4) 0x0100|fe e1 b1 f5 c4 52 ba e6 c9 ac dc ce 6c ed 4a cd|.....R......l.J.| mock_authentication_nonce: "fee1b1f5c452bae6c9acdcce6ced4acd5ee657c0f6e4c7a..." (raw bits) 0x100-0x11f.7 (32) diff --git a/format/postgres/testdata/flavours/pgpro14/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgpro14/pg_control_1.fqtest index 770afe3de..8c439e8d7 100644 --- a/format/postgres/testdata/flavours/pgpro14/pg_control_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/pg_control_1.fqtest @@ -6,56 +6,56 @@ $ fq -d pg_control dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 7b ac ec 62 00 00 00 00| {..b....| time: "Fri, 05 Aug 2022 05:36:59 UTC" (1659677819) 0x18-0x1f.7 (8) -0x0020|58 b8 d5 02 00 00 00 00 |X....... | checkPoint: "0/2D5B858" (47560792) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020|58 b8 d5 02 00 00 00 00 |X....... | check_point: "0/2D5B858" (47560792) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x7f.7 (88) 0x0020| 20 b8 d5 02 00 00 00 00| .......| redo: "0/2D5B820" (47560736) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|24 45 00 00 00 00 00 00 |$E...... | nextXid: 17700 0x40-0x47.7 (8) -0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) -0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) -0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) -0x0050| dd 02 00 00 | .... | oldestXid: 733 0x54-0x57.7 (4) -0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) -0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) -0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0040|24 45 00 00 00 00 00 00 |$E...... | next_xid: 17700 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| next_multi: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | next_multi_offset: 0 0x50-0x53.7 (4) +0x0050| dd 02 00 00 | .... | oldest_xid: 733 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldest_xid_db: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldest_multi: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldest_multi_db: 1 0x60-0x63.7 (4) 0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) 0x0060| 7b ac ec 62 00 00 00 00| {..b....| time: "Fri, 05 Aug 2022 05:36:59 UTC" (1659677819) 0x68-0x6f.7 (8) -0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) -0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) -0x0070| 24 45 00 00 | $E.. | oldestActiveXid: 17700 0x78-0x7b.7 (4) +0x0070|00 00 00 00 |.... | oldest_commit_ts_xid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newest_commit_ts_xid: 0 0x74-0x77.7 (4) +0x0070| 24 45 00 00 | $E.. | oldest_active_xid: 17700 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) -0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) -0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | min_recovery_point_tli: 0 0x90-0x93.7 (4) 0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) -0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) -0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) -0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x0090| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backup_end_required: 0 0xa8-0xa8.7 (1) 0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) 0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) 0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) 0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) -0x00b0| c2 00 00 00 | .... | MaxConnections: 194 0xb4-0xb7.7 (4) +0x00b0| c2 00 00 00 | .... | max_connections: 194 0xb4-0xb7.7 (4) 0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) 0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) 0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) 0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) 0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) -0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) -0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00c0| 08 00 00 00| ....| max_align: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xd0-0xd7.7 (8) 0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) 0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) 0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) 0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) -0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) -0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00e0| 40 00 00 00 | @... | name_data_len: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| index_max_keys: 32 0xec-0xef.7 (4) 0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) 0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) -0x00f0| 01 | . | float8ByVal: 1 0xf8-0xf8.7 (1) +0x00f0| 01 | . | float8_by_val: 1 0xf8-0xf8.7 (1) 0x00f0| 00 00 00 | ... | hole7: 0 0xf9-0xfb.7 (3) 0x00f0| 01 00 00 00| ....| data_checksum_version: 1 0xfc-0xff.7 (4) 0x0100|fe e1 b1 f5 c4 52 ba e6 c9 ac dc ce 6c ed 4a cd|.....R......l.J.| mock_authentication_nonce: "fee1b1f5c452bae6c9acdcce6ced4acd5ee657c0f6e4c7a..." (raw bits) 0x100-0x11f.7 (32) diff --git a/format/postgres/testdata/flavours/pgproee10/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee10/pg_control.fqtest index 3bc41aeec..83a5b9e1d 100644 --- a/format/postgres/testdata/flavours/pgproee10/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/pg_control.fqtest @@ -6,59 +6,59 @@ $ fq -d pg_control -o flavour=pgproee10 dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 27 e8 ec 62 00 00 00 00| '..b....| time: "Fri, 05 Aug 2022 09:51:35 UTC" (1659693095) 0x18-0x1f.7 (8) -0x0020|58 27 fc 02 00 00 00 00 |X'...... | checkPoint: "0/2FC2758" (50079576) 0x20-0x27.7 (8) -0x0020| 68 26 fc 02 00 00 00 00| h&......| prevCheckPoint: "0/2FC2668" (50079336) 0x28-0x2f.7 (8) - | | | checkPointCopy{}: 0x30-0xa7.7 (120) +0x0020|58 27 fc 02 00 00 00 00 |X'...... | check_point: "0/2FC2758" (50079576) 0x20-0x27.7 (8) +0x0020| 68 26 fc 02 00 00 00 00| h&......| prev_check_point: "0/2FC2668" (50079336) 0x28-0x2f.7 (8) + | | | check_point_copy{}: 0x30-0xa7.7 (120) 0x0030|08 27 fc 02 00 00 00 00 |.'...... | redo: "0/2FC2708" (50079496) 0x30-0x37.7 (8) -0x0030| 01 00 00 00 | .... | ThisTimeLineID: 1 0x38-0x3b.7 (4) -0x0030| 01 00 00 00| ....| PrevTimeLineID: 1 0x3c-0x3f.7 (4) -0x0040|01 |. | fullPageWrites: 1 0x40-0x40.7 (1) +0x0030| 01 00 00 00 | .... | this_time_line_id: 1 0x38-0x3b.7 (4) +0x0030| 01 00 00 00| ....| prev_time_line_id: 1 0x3c-0x3f.7 (4) +0x0040|01 |. | full_page_writes: 1 0x40-0x40.7 (1) 0x0040| 00 00 00 00 00 00 00 | ....... | hole1: 0 0x41-0x47.7 (7) -0x0040| 56 34 0c 54 02 00 00 00| V4.T....| nextXid: 10000020566 0x48-0x4f.7 (8) -0x0050|00 60 00 00 |.`.. | nextOid: 24576 0x50-0x53.7 (4) +0x0040| 56 34 0c 54 02 00 00 00| V4.T....| next_xid: 10000020566 0x48-0x4f.7 (8) +0x0050|00 60 00 00 |.`.. | next_oid: 24576 0x50-0x53.7 (4) 0x0050| 00 00 00 00 | .... | hole2: 0 0x54-0x57.7 (4) -0x0050| 00 f2 05 2a 01 00 00 00| ...*....| nextMulti: 5000000000 0x58-0x5f.7 (8) -0x0060|00 00 00 00 00 00 00 00 |........ | nextMultiOffset: 0 0x60-0x67.7 (8) -0x0060| 23 e6 0b 54 02 00 00 00| #..T....| oldestXid: 10000000547 0x68-0x6f.7 (8) -0x0070|01 00 00 00 |.... | oldestXidDB: 1 0x70-0x73.7 (4) +0x0050| 00 f2 05 2a 01 00 00 00| ...*....| next_multi: 5000000000 0x58-0x5f.7 (8) +0x0060|00 00 00 00 00 00 00 00 |........ | next_multi_offset: 0 0x60-0x67.7 (8) +0x0060| 23 e6 0b 54 02 00 00 00| #..T....| oldest_xid: 10000000547 0x68-0x6f.7 (8) +0x0070|01 00 00 00 |.... | oldest_xid_db: 1 0x70-0x73.7 (4) 0x0070| 00 00 00 00 | .... | hole3: 0 0x74-0x77.7 (4) -0x0070| 00 f2 05 2a 01 00 00 00| ...*....| oldestMulti: 5000000000 0x78-0x7f.7 (8) -0x0080|01 00 00 00 |.... | oldestMultiDB: 1 0x80-0x83.7 (4) +0x0070| 00 f2 05 2a 01 00 00 00| ...*....| oldest_multi: 5000000000 0x78-0x7f.7 (8) +0x0080|01 00 00 00 |.... | oldest_multi_db: 1 0x80-0x83.7 (4) 0x0080| 00 00 00 00 | .... | hole4: 0 0x84-0x87.7 (4) 0x0080| 27 e8 ec 62 00 00 00 00| '..b....| time: "Fri, 05 Aug 2022 09:51:35 UTC" (1659693095) 0x88-0x8f.7 (8) -0x0090|00 00 00 00 00 00 00 00 |........ | oldestCommitTsXid: 0 0x90-0x97.7 (8) -0x0090| 00 00 00 00 00 00 00 00| ........| newestCommitTsXid: 0 0x98-0x9f.7 (8) -0x00a0|56 34 0c 54 02 00 00 00 |V4.T.... | oldestActiveXid: 10000020566 0xa0-0xa7.7 (8) -0x00a0| 01 00 00 00 00 00 00 00| ........| unloggedLSN: "0/1" (1) 0xa8-0xaf.7 (8) -0x00b0|00 00 00 00 00 00 00 00 |........ | minRecoveryPoint: "0/0" (0) 0xb0-0xb7.7 (8) -0x00b0| 00 00 00 00 | .... | minRecoveryPointTLI: 0 0xb8-0xbb.7 (4) +0x0090|00 00 00 00 00 00 00 00 |........ | oldest_commit_ts_xid: 0 0x90-0x97.7 (8) +0x0090| 00 00 00 00 00 00 00 00| ........| newest_commit_ts_xid: 0 0x98-0x9f.7 (8) +0x00a0|56 34 0c 54 02 00 00 00 |V4.T.... | oldest_active_xid: 10000020566 0xa0-0xa7.7 (8) +0x00a0| 01 00 00 00 00 00 00 00| ........| unlogged_lsn: "0/1" (1) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 00 00 00 00 |........ | min_recovery_point: "0/0" (0) 0xb0-0xb7.7 (8) +0x00b0| 00 00 00 00 | .... | min_recovery_point_tli: 0 0xb8-0xbb.7 (4) 0x00b0| 00 00 00 00| ....| hole5: 0 0xbc-0xbf.7 (4) -0x00c0|00 00 00 00 00 00 00 00 |........ | backupStartPoint: "0/0" (0) 0xc0-0xc7.7 (8) -0x00c0| 00 00 00 00 00 00 00 00| ........| backupEndPoint: "0/0" (0) 0xc8-0xcf.7 (8) -0x00d0|00 |. | backupEndRequired: 0 0xd0-0xd0.7 (1) +0x00c0|00 00 00 00 00 00 00 00 |........ | backup_start_point: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 00 00 00 00 00 00 00| ........| backup_end_point: "0/0" (0) 0xc8-0xcf.7 (8) +0x00d0|00 |. | backup_end_required: 0 0xd0-0xd0.7 (1) 0x00d0| 00 00 00 | ... | hole6: 0 0xd1-0xd3.7 (3) 0x00d0| 01 00 00 00 | .... | wal_level: "WAL_LEVEL_REPLICA" (1) 0xd4-0xd7.7 (4) 0x00d0| 00 | . | wal_log_hints: 0 0xd8-0xd8.7 (1) 0x00d0| 00 00 00 | ... | hole7: 0 0xd9-0xdb.7 (3) -0x00d0| 5d 00 00 00| ]...| MaxConnections: 93 0xdc-0xdf.7 (4) +0x00d0| 5d 00 00 00| ]...| max_connections: 93 0xdc-0xdf.7 (4) 0x00e0|08 00 00 00 |.... | max_worker_processes: 8 0xe0-0xe3.7 (4) 0x00e0| 00 00 00 00 | .... | max_prepared_xacts: 0 0xe4-0xe7.7 (4) 0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe8-0xeb.7 (4) 0x00e0| 00 | . | track_commit_timestamp: 0 0xec-0xec.7 (1) 0x00e0| 00 00 00| ...| hole8: 0 0xed-0xef.7 (3) -0x00f0|08 00 00 00 |.... | maxAlign: 8 0xf0-0xf3.7 (4) +0x00f0|08 00 00 00 |.... | max_align: 8 0xf0-0xf3.7 (4) 0x00f0| 00 00 00 00 | .... | hole9: 0 0xf4-0xf7.7 (4) -0x00f0| 00 00 00 00 87 d6 32 41| ......2A| floatFormat: 1.234567e+06 0xf8-0xff.7 (8) +0x00f0| 00 00 00 00 87 d6 32 41| ......2A| float_format: 1.234567e+06 0xf8-0xff.7 (8) 0x0100|00 20 00 00 |. .. | blcksz: 8192 0x100-0x103.7 (4) 0x0100| 00 00 02 00 | .... | relseg_size: 131072 0x104-0x107.7 (4) 0x0100| 00 20 00 00 | . .. | xlog_blcksz: 8192 0x108-0x10b.7 (4) 0x0100| 00 00 00 01| ....| xlog_seg_size: 16777216 0x10c-0x10f.7 (4) -0x0110|40 00 00 00 |@... | nameDataLen: 64 0x110-0x113.7 (4) -0x0110| 20 00 00 00 | ... | indexMaxKeys: 32 0x114-0x117.7 (4) +0x0110|40 00 00 00 |@... | name_data_len: 64 0x110-0x113.7 (4) +0x0110| 20 00 00 00 | ... | index_max_keys: 32 0x114-0x117.7 (4) 0x0110| cc 07 00 00 | .... | toast_max_chunk_size: 1996 0x118-0x11b.7 (4) 0x0110| 00 08 00 00| ....| loblksize: 2048 0x11c-0x11f.7 (4) -0x0120|01 |. | float4ByVal: 1 0x120-0x120.7 (1) -0x0120| 01 | . | float8ByVal: 1 0x121-0x121.7 (1) +0x0120|01 |. | float4_by_val: 1 0x120-0x120.7 (1) +0x0120| 01 | . | float8_by_val: 1 0x121-0x121.7 (1) 0x0120| 00 00 | .. | hole10: 0 0x122-0x123.7 (2) 0x0120| 01 00 00 00 | .... | data_checksum_version: 1 0x124-0x127.7 (4) 0x0120| 39 2f 4a cd c5 9d 4d 3b| 9/J...M;| mock_authentication_nonce: "392f4acdc59d4d3b2c9968b782191526dbfa9ba84acd37d..." (raw bits) 0x128-0x147.7 (32) diff --git a/format/postgres/testdata/flavours/pgproee10/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgproee10/pg_control_1.fqtest index d8893c2ed..c52b3b953 100644 --- a/format/postgres/testdata/flavours/pgproee10/pg_control_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/pg_control_1.fqtest @@ -6,59 +6,59 @@ $ fq -d pg_control dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 27 e8 ec 62 00 00 00 00| '..b....| time: "Fri, 05 Aug 2022 09:51:35 UTC" (1659693095) 0x18-0x1f.7 (8) -0x0020|58 27 fc 02 00 00 00 00 |X'...... | checkPoint: "0/2FC2758" (50079576) 0x20-0x27.7 (8) -0x0020| 68 26 fc 02 00 00 00 00| h&......| prevCheckPoint: "0/2FC2668" (50079336) 0x28-0x2f.7 (8) - | | | checkPointCopy{}: 0x30-0xa7.7 (120) +0x0020|58 27 fc 02 00 00 00 00 |X'...... | check_point: "0/2FC2758" (50079576) 0x20-0x27.7 (8) +0x0020| 68 26 fc 02 00 00 00 00| h&......| prev_check_point: "0/2FC2668" (50079336) 0x28-0x2f.7 (8) + | | | check_point_copy{}: 0x30-0xa7.7 (120) 0x0030|08 27 fc 02 00 00 00 00 |.'...... | redo: "0/2FC2708" (50079496) 0x30-0x37.7 (8) -0x0030| 01 00 00 00 | .... | ThisTimeLineID: 1 0x38-0x3b.7 (4) -0x0030| 01 00 00 00| ....| PrevTimeLineID: 1 0x3c-0x3f.7 (4) -0x0040|01 |. | fullPageWrites: 1 0x40-0x40.7 (1) +0x0030| 01 00 00 00 | .... | this_time_line_id: 1 0x38-0x3b.7 (4) +0x0030| 01 00 00 00| ....| prev_time_line_id: 1 0x3c-0x3f.7 (4) +0x0040|01 |. | full_page_writes: 1 0x40-0x40.7 (1) 0x0040| 00 00 00 00 00 00 00 | ....... | hole1: 0 0x41-0x47.7 (7) -0x0040| 56 34 0c 54 02 00 00 00| V4.T....| nextXid: 10000020566 0x48-0x4f.7 (8) -0x0050|00 60 00 00 |.`.. | nextOid: 24576 0x50-0x53.7 (4) +0x0040| 56 34 0c 54 02 00 00 00| V4.T....| next_xid: 10000020566 0x48-0x4f.7 (8) +0x0050|00 60 00 00 |.`.. | next_oid: 24576 0x50-0x53.7 (4) 0x0050| 00 00 00 00 | .... | hole2: 0 0x54-0x57.7 (4) -0x0050| 00 f2 05 2a 01 00 00 00| ...*....| nextMulti: 5000000000 0x58-0x5f.7 (8) -0x0060|00 00 00 00 00 00 00 00 |........ | nextMultiOffset: 0 0x60-0x67.7 (8) -0x0060| 23 e6 0b 54 02 00 00 00| #..T....| oldestXid: 10000000547 0x68-0x6f.7 (8) -0x0070|01 00 00 00 |.... | oldestXidDB: 1 0x70-0x73.7 (4) +0x0050| 00 f2 05 2a 01 00 00 00| ...*....| next_multi: 5000000000 0x58-0x5f.7 (8) +0x0060|00 00 00 00 00 00 00 00 |........ | next_multi_offset: 0 0x60-0x67.7 (8) +0x0060| 23 e6 0b 54 02 00 00 00| #..T....| oldest_xid: 10000000547 0x68-0x6f.7 (8) +0x0070|01 00 00 00 |.... | oldest_xid_db: 1 0x70-0x73.7 (4) 0x0070| 00 00 00 00 | .... | hole3: 0 0x74-0x77.7 (4) -0x0070| 00 f2 05 2a 01 00 00 00| ...*....| oldestMulti: 5000000000 0x78-0x7f.7 (8) -0x0080|01 00 00 00 |.... | oldestMultiDB: 1 0x80-0x83.7 (4) +0x0070| 00 f2 05 2a 01 00 00 00| ...*....| oldest_multi: 5000000000 0x78-0x7f.7 (8) +0x0080|01 00 00 00 |.... | oldest_multi_db: 1 0x80-0x83.7 (4) 0x0080| 00 00 00 00 | .... | hole4: 0 0x84-0x87.7 (4) 0x0080| 27 e8 ec 62 00 00 00 00| '..b....| time: "Fri, 05 Aug 2022 09:51:35 UTC" (1659693095) 0x88-0x8f.7 (8) -0x0090|00 00 00 00 00 00 00 00 |........ | oldestCommitTsXid: 0 0x90-0x97.7 (8) -0x0090| 00 00 00 00 00 00 00 00| ........| newestCommitTsXid: 0 0x98-0x9f.7 (8) -0x00a0|56 34 0c 54 02 00 00 00 |V4.T.... | oldestActiveXid: 10000020566 0xa0-0xa7.7 (8) -0x00a0| 01 00 00 00 00 00 00 00| ........| unloggedLSN: "0/1" (1) 0xa8-0xaf.7 (8) -0x00b0|00 00 00 00 00 00 00 00 |........ | minRecoveryPoint: "0/0" (0) 0xb0-0xb7.7 (8) -0x00b0| 00 00 00 00 | .... | minRecoveryPointTLI: 0 0xb8-0xbb.7 (4) +0x0090|00 00 00 00 00 00 00 00 |........ | oldest_commit_ts_xid: 0 0x90-0x97.7 (8) +0x0090| 00 00 00 00 00 00 00 00| ........| newest_commit_ts_xid: 0 0x98-0x9f.7 (8) +0x00a0|56 34 0c 54 02 00 00 00 |V4.T.... | oldest_active_xid: 10000020566 0xa0-0xa7.7 (8) +0x00a0| 01 00 00 00 00 00 00 00| ........| unlogged_lsn: "0/1" (1) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 00 00 00 00 |........ | min_recovery_point: "0/0" (0) 0xb0-0xb7.7 (8) +0x00b0| 00 00 00 00 | .... | min_recovery_point_tli: 0 0xb8-0xbb.7 (4) 0x00b0| 00 00 00 00| ....| hole5: 0 0xbc-0xbf.7 (4) -0x00c0|00 00 00 00 00 00 00 00 |........ | backupStartPoint: "0/0" (0) 0xc0-0xc7.7 (8) -0x00c0| 00 00 00 00 00 00 00 00| ........| backupEndPoint: "0/0" (0) 0xc8-0xcf.7 (8) -0x00d0|00 |. | backupEndRequired: 0 0xd0-0xd0.7 (1) +0x00c0|00 00 00 00 00 00 00 00 |........ | backup_start_point: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 00 00 00 00 00 00 00| ........| backup_end_point: "0/0" (0) 0xc8-0xcf.7 (8) +0x00d0|00 |. | backup_end_required: 0 0xd0-0xd0.7 (1) 0x00d0| 00 00 00 | ... | hole6: 0 0xd1-0xd3.7 (3) 0x00d0| 01 00 00 00 | .... | wal_level: "WAL_LEVEL_REPLICA" (1) 0xd4-0xd7.7 (4) 0x00d0| 00 | . | wal_log_hints: 0 0xd8-0xd8.7 (1) 0x00d0| 00 00 00 | ... | hole7: 0 0xd9-0xdb.7 (3) -0x00d0| 5d 00 00 00| ]...| MaxConnections: 93 0xdc-0xdf.7 (4) +0x00d0| 5d 00 00 00| ]...| max_connections: 93 0xdc-0xdf.7 (4) 0x00e0|08 00 00 00 |.... | max_worker_processes: 8 0xe0-0xe3.7 (4) 0x00e0| 00 00 00 00 | .... | max_prepared_xacts: 0 0xe4-0xe7.7 (4) 0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe8-0xeb.7 (4) 0x00e0| 00 | . | track_commit_timestamp: 0 0xec-0xec.7 (1) 0x00e0| 00 00 00| ...| hole8: 0 0xed-0xef.7 (3) -0x00f0|08 00 00 00 |.... | maxAlign: 8 0xf0-0xf3.7 (4) +0x00f0|08 00 00 00 |.... | max_align: 8 0xf0-0xf3.7 (4) 0x00f0| 00 00 00 00 | .... | hole9: 0 0xf4-0xf7.7 (4) -0x00f0| 00 00 00 00 87 d6 32 41| ......2A| floatFormat: 1.234567e+06 0xf8-0xff.7 (8) +0x00f0| 00 00 00 00 87 d6 32 41| ......2A| float_format: 1.234567e+06 0xf8-0xff.7 (8) 0x0100|00 20 00 00 |. .. | blcksz: 8192 0x100-0x103.7 (4) 0x0100| 00 00 02 00 | .... | relseg_size: 131072 0x104-0x107.7 (4) 0x0100| 00 20 00 00 | . .. | xlog_blcksz: 8192 0x108-0x10b.7 (4) 0x0100| 00 00 00 01| ....| xlog_seg_size: 16777216 0x10c-0x10f.7 (4) -0x0110|40 00 00 00 |@... | nameDataLen: 64 0x110-0x113.7 (4) -0x0110| 20 00 00 00 | ... | indexMaxKeys: 32 0x114-0x117.7 (4) +0x0110|40 00 00 00 |@... | name_data_len: 64 0x110-0x113.7 (4) +0x0110| 20 00 00 00 | ... | index_max_keys: 32 0x114-0x117.7 (4) 0x0110| cc 07 00 00 | .... | toast_max_chunk_size: 1996 0x118-0x11b.7 (4) 0x0110| 00 08 00 00| ....| loblksize: 2048 0x11c-0x11f.7 (4) -0x0120|01 |. | float4ByVal: 1 0x120-0x120.7 (1) -0x0120| 01 | . | float8ByVal: 1 0x121-0x121.7 (1) +0x0120|01 |. | float4_by_val: 1 0x120-0x120.7 (1) +0x0120| 01 | . | float8_by_val: 1 0x121-0x121.7 (1) 0x0120| 00 00 | .. | hole10: 0 0x122-0x123.7 (2) 0x0120| 01 00 00 00 | .... | data_checksum_version: 1 0x124-0x127.7 (4) 0x0120| 39 2f 4a cd c5 9d 4d 3b| 9/J...M;| mock_authentication_nonce: "392f4acdc59d4d3b2c9968b782191526dbfa9ba84acd37d..." (raw bits) 0x128-0x147.7 (32) diff --git a/format/postgres/testdata/flavours/pgproee11/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee11/pg_control.fqtest index f8ac6f2e2..efcd405ca 100644 --- a/format/postgres/testdata/flavours/pgproee11/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgproee11/pg_control.fqtest @@ -6,58 +6,58 @@ $ fq -d pg_control -o flavour=pgproee11 dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| d8 f9 e8 62 00 00 00 00| ...b....| time: "Tue, 02 Aug 2022 10:18:00 UTC" (1659435480) 0x18-0x1f.7 (8) -0x0020|88 3a 35 00 04 00 00 00 |.:5..... | checkPoint: "4/353A88" (17183357576) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x9f.7 (120) +0x0020|88 3a 35 00 04 00 00 00 |.:5..... | check_point: "4/353A88" (17183357576) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x9f.7 (120) 0x0020| 40 56 52 c8 03 00 00 00| @VR.....| redo: "3/C8525640" (16245741120) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|02 4f f2 54 02 00 00 00 |.O.T.... | nextXid: 10015100674 0x40-0x47.7 (8) -0x0040| 00 80 01 00 | .... | nextOid: 98304 0x48-0x4b.7 (4) +0x0040|02 4f f2 54 02 00 00 00 |.O.T.... | next_xid: 10015100674 0x40-0x47.7 (8) +0x0040| 00 80 01 00 | .... | next_oid: 98304 0x48-0x4b.7 (4) 0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) -0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) -0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) -0x0060|3b e6 0b 54 02 00 00 00 |;..T.... | oldestXid: 10000000571 0x60-0x67.7 (8) -0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | next_multi: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| next_multi_offset: 0 0x58-0x5f.7 (8) +0x0060|3b e6 0b 54 02 00 00 00 |;..T.... | oldest_xid: 10000000571 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldest_xid_db: 1 0x68-0x6b.7 (4) 0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) -0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) -0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldest_multi: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldest_multi_db: 1 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) 0x0080|ca f8 e8 62 00 00 00 00 |...b.... | time: "Tue, 02 Aug 2022 10:13:30 UTC" (1659435210) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) -0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) -0x0090| f8 4e f2 54 02 00 00 00| .N.T....| oldestActiveXid: 10015100664 0x98-0x9f.7 (8) -0x00a0|01 00 00 00 00 00 00 00 |........ | unloggedLSN: "0/1" (1) 0xa0-0xa7.7 (8) -0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) -0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x0080| 00 00 00 00 00 00 00 00| ........| oldest_commit_ts_xid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newest_commit_ts_xid: 0 0x90-0x97.7 (8) +0x0090| f8 4e f2 54 02 00 00 00| .N.T....| oldest_active_xid: 10015100664 0x98-0x9f.7 (8) +0x00a0|01 00 00 00 00 00 00 00 |........ | unlogged_lsn: "0/1" (1) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | min_recovery_point_tli: 0 0xb0-0xb3.7 (4) 0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) -0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) -0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) -0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00b0| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backup_end_required: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) 0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) 0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) 0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) -0x00d0| 8b 01 00 00 | .... | MaxConnections: 395 0xd4-0xd7.7 (4) +0x00d0| 8b 01 00 00 | .... | max_connections: 395 0xd4-0xd7.7 (4) 0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) 0x00d0| 00 00 00 00| ....| max_prepared_xacts: 0 0xdc-0xdf.7 (4) 0x00e0|40 00 00 00 |@... | max_locks_per_xact: 64 0xe0-0xe3.7 (4) 0x00e0| 00 | . | track_commit_timestamp: 0 0xe4-0xe4.7 (1) 0x00e0| 00 00 00 | ... | hole8: 0 0xe5-0xe7.7 (3) -0x00e0| 08 00 00 00 | .... | maxAlign: 8 0xe8-0xeb.7 (4) +0x00e0| 08 00 00 00 | .... | max_align: 8 0xe8-0xeb.7 (4) 0x00e0| 00 00 00 00| ....| hole9: 0 0xec-0xef.7 (4) -0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xf0-0xf7.7 (8) 0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) 0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) 0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) 0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) -0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) -0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0100| 40 00 00 00 | @... | name_data_len: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| index_max_keys: 32 0x10c-0x10f.7 (4) 0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) 0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) -0x0110| 01 | . | float4ByVal: 1 0x118-0x118.7 (1) -0x0110| 01 | . | float8ByVal: 1 0x119-0x119.7 (1) +0x0110| 01 | . | float4_by_val: 1 0x118-0x118.7 (1) +0x0110| 01 | . | float8_by_val: 1 0x119-0x119.7 (1) 0x0110| 00 00 | .. | hole10: 0 0x11a-0x11b.7 (2) 0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) 0x0120|4c 9a 5d 04 f1 83 24 46 3c 50 3e 7d 42 94 69 a7|L.]...$F

}B.i.| mock_authentication_nonce: "4c9a5d04f18324463c503e7d429469a70fe34aacd9f4cb2..." (raw bits) 0x120-0x13f.7 (32) diff --git a/format/postgres/testdata/flavours/pgproee11/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgproee11/pg_control_1.fqtest index 818efbc41..40aa062f5 100644 --- a/format/postgres/testdata/flavours/pgproee11/pg_control_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee11/pg_control_1.fqtest @@ -6,58 +6,58 @@ $ fq -d pg_control dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| d8 f9 e8 62 00 00 00 00| ...b....| time: "Tue, 02 Aug 2022 10:18:00 UTC" (1659435480) 0x18-0x1f.7 (8) -0x0020|88 3a 35 00 04 00 00 00 |.:5..... | checkPoint: "4/353A88" (17183357576) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x9f.7 (120) +0x0020|88 3a 35 00 04 00 00 00 |.:5..... | check_point: "4/353A88" (17183357576) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x9f.7 (120) 0x0020| 40 56 52 c8 03 00 00 00| @VR.....| redo: "3/C8525640" (16245741120) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|02 4f f2 54 02 00 00 00 |.O.T.... | nextXid: 10015100674 0x40-0x47.7 (8) -0x0040| 00 80 01 00 | .... | nextOid: 98304 0x48-0x4b.7 (4) +0x0040|02 4f f2 54 02 00 00 00 |.O.T.... | next_xid: 10015100674 0x40-0x47.7 (8) +0x0040| 00 80 01 00 | .... | next_oid: 98304 0x48-0x4b.7 (4) 0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) -0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) -0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) -0x0060|3b e6 0b 54 02 00 00 00 |;..T.... | oldestXid: 10000000571 0x60-0x67.7 (8) -0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | next_multi: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| next_multi_offset: 0 0x58-0x5f.7 (8) +0x0060|3b e6 0b 54 02 00 00 00 |;..T.... | oldest_xid: 10000000571 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldest_xid_db: 1 0x68-0x6b.7 (4) 0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) -0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) -0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldest_multi: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldest_multi_db: 1 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) 0x0080|ca f8 e8 62 00 00 00 00 |...b.... | time: "Tue, 02 Aug 2022 10:13:30 UTC" (1659435210) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) -0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) -0x0090| f8 4e f2 54 02 00 00 00| .N.T....| oldestActiveXid: 10015100664 0x98-0x9f.7 (8) -0x00a0|01 00 00 00 00 00 00 00 |........ | unloggedLSN: "0/1" (1) 0xa0-0xa7.7 (8) -0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) -0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x0080| 00 00 00 00 00 00 00 00| ........| oldest_commit_ts_xid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newest_commit_ts_xid: 0 0x90-0x97.7 (8) +0x0090| f8 4e f2 54 02 00 00 00| .N.T....| oldest_active_xid: 10015100664 0x98-0x9f.7 (8) +0x00a0|01 00 00 00 00 00 00 00 |........ | unlogged_lsn: "0/1" (1) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | min_recovery_point_tli: 0 0xb0-0xb3.7 (4) 0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) -0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) -0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) -0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00b0| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backup_end_required: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) 0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) 0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) 0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) -0x00d0| 8b 01 00 00 | .... | MaxConnections: 395 0xd4-0xd7.7 (4) +0x00d0| 8b 01 00 00 | .... | max_connections: 395 0xd4-0xd7.7 (4) 0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) 0x00d0| 00 00 00 00| ....| max_prepared_xacts: 0 0xdc-0xdf.7 (4) 0x00e0|40 00 00 00 |@... | max_locks_per_xact: 64 0xe0-0xe3.7 (4) 0x00e0| 00 | . | track_commit_timestamp: 0 0xe4-0xe4.7 (1) 0x00e0| 00 00 00 | ... | hole8: 0 0xe5-0xe7.7 (3) -0x00e0| 08 00 00 00 | .... | maxAlign: 8 0xe8-0xeb.7 (4) +0x00e0| 08 00 00 00 | .... | max_align: 8 0xe8-0xeb.7 (4) 0x00e0| 00 00 00 00| ....| hole9: 0 0xec-0xef.7 (4) -0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xf0-0xf7.7 (8) 0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) 0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) 0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) 0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) -0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) -0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0100| 40 00 00 00 | @... | name_data_len: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| index_max_keys: 32 0x10c-0x10f.7 (4) 0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) 0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) -0x0110| 01 | . | float4ByVal: 1 0x118-0x118.7 (1) -0x0110| 01 | . | float8ByVal: 1 0x119-0x119.7 (1) +0x0110| 01 | . | float4_by_val: 1 0x118-0x118.7 (1) +0x0110| 01 | . | float8_by_val: 1 0x119-0x119.7 (1) 0x0110| 00 00 | .. | hole10: 0 0x11a-0x11b.7 (2) 0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) 0x0120|4c 9a 5d 04 f1 83 24 46 3c 50 3e 7d 42 94 69 a7|L.]...$F

}B.i.| mock_authentication_nonce: "4c9a5d04f18324463c503e7d429469a70fe34aacd9f4cb2..." (raw bits) 0x120-0x13f.7 (32) diff --git a/format/postgres/testdata/flavours/pgproee12/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee12/pg_control.fqtest index c9183b46a..6f4bfd839 100644 --- a/format/postgres/testdata/flavours/pgproee12/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/pg_control.fqtest @@ -6,58 +6,58 @@ $ fq -d pg_control -o flavour=pgproee12 dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| db 6a eb 62 00 00 00 00| .j.b....| time: "Thu, 04 Aug 2022 06:44:43 UTC" (1659595483) 0x18-0x1f.7 (8) -0x0020|b8 77 07 03 00 00 00 00 |.w...... | checkPoint: "0/30777B8" (50821048) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x9f.7 (120) +0x0020|b8 77 07 03 00 00 00 00 |.w...... | check_point: "0/30777B8" (50821048) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x9f.7 (120) 0x0020| 68 77 07 03 00 00 00 00| hw......| redo: "0/3077768" (50820968) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|db 34 0c 54 02 00 00 00 |.4.T.... | nextXid: 10000020699 0x40-0x47.7 (8) -0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) +0x0040|db 34 0c 54 02 00 00 00 |.4.T.... | next_xid: 10000020699 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x48-0x4b.7 (4) 0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) -0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) -0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) -0x0060|e9 e5 0b 54 02 00 00 00 |...T.... | oldestXid: 10000000489 0x60-0x67.7 (8) -0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | next_multi: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| next_multi_offset: 0 0x58-0x5f.7 (8) +0x0060|e9 e5 0b 54 02 00 00 00 |...T.... | oldest_xid: 10000000489 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldest_xid_db: 1 0x68-0x6b.7 (4) 0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) -0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) -0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldest_multi: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldest_multi_db: 1 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) 0x0080|db 6a eb 62 00 00 00 00 |.j.b.... | time: "Thu, 04 Aug 2022 06:44:43 UTC" (1659595483) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) -0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) -0x0090| db 34 0c 54 02 00 00 00| .4.T....| oldestActiveXid: 10000020699 0x98-0x9f.7 (8) -0x00a0|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0xa0-0xa7.7 (8) -0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) -0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x0080| 00 00 00 00 00 00 00 00| ........| oldest_commit_ts_xid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newest_commit_ts_xid: 0 0x90-0x97.7 (8) +0x0090| db 34 0c 54 02 00 00 00| .4.T....| oldest_active_xid: 10000020699 0x98-0x9f.7 (8) +0x00a0|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | min_recovery_point_tli: 0 0xb0-0xb3.7 (4) 0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) -0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) -0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) -0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00b0| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backup_end_required: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) 0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) 0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) 0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) -0x00d0| 8a 01 00 00 | .... | MaxConnections: 394 0xd4-0xd7.7 (4) +0x00d0| 8a 01 00 00 | .... | max_connections: 394 0xd4-0xd7.7 (4) 0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) 0x00d0| 0a 00 00 00| ....| max_wal_senders: 10 0xdc-0xdf.7 (4) 0x00e0|00 00 00 00 |.... | max_prepared_xacts: 0 0xe0-0xe3.7 (4) 0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe4-0xe7.7 (4) 0x00e0| 00 | . | track_commit_timestamp: 0 0xe8-0xe8.7 (1) 0x00e0| 00 00 00 | ... | hole8: 0 0xe9-0xeb.7 (3) -0x00e0| 08 00 00 00| ....| maxAlign: 8 0xec-0xef.7 (4) -0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00e0| 08 00 00 00| ....| max_align: 8 0xec-0xef.7 (4) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xf0-0xf7.7 (8) 0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) 0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) 0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) 0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) -0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) -0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0100| 40 00 00 00 | @... | name_data_len: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| index_max_keys: 32 0x10c-0x10f.7 (4) 0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) 0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) -0x0110| 01 | . | float4ByVal: 1 0x118-0x118.7 (1) -0x0110| 01 | . | float8ByVal: 1 0x119-0x119.7 (1) +0x0110| 01 | . | float4_by_val: 1 0x118-0x118.7 (1) +0x0110| 01 | . | float8_by_val: 1 0x119-0x119.7 (1) 0x0110| 00 00 | .. | hole9: 0 0x11a-0x11b.7 (2) 0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) 0x0120|0b db 53 d2 42 ff 02 95 74 e6 aa 87 ff 98 4b 67|..S.B...t.....Kg| mock_authentication_nonce: "0bdb53d242ff029574e6aa87ff984b67e4a76678383559a..." (raw bits) 0x120-0x13f.7 (32) diff --git a/format/postgres/testdata/flavours/pgproee12/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgproee12/pg_control_1.fqtest index c09af7b37..ba494ba16 100644 --- a/format/postgres/testdata/flavours/pgproee12/pg_control_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/pg_control_1.fqtest @@ -6,58 +6,58 @@ $ fq -d pg_control dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| db 6a eb 62 00 00 00 00| .j.b....| time: "Thu, 04 Aug 2022 06:44:43 UTC" (1659595483) 0x18-0x1f.7 (8) -0x0020|b8 77 07 03 00 00 00 00 |.w...... | checkPoint: "0/30777B8" (50821048) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x9f.7 (120) +0x0020|b8 77 07 03 00 00 00 00 |.w...... | check_point: "0/30777B8" (50821048) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x9f.7 (120) 0x0020| 68 77 07 03 00 00 00 00| hw......| redo: "0/3077768" (50820968) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|db 34 0c 54 02 00 00 00 |.4.T.... | nextXid: 10000020699 0x40-0x47.7 (8) -0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) +0x0040|db 34 0c 54 02 00 00 00 |.4.T.... | next_xid: 10000020699 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x48-0x4b.7 (4) 0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) -0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) -0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) -0x0060|e9 e5 0b 54 02 00 00 00 |...T.... | oldestXid: 10000000489 0x60-0x67.7 (8) -0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | next_multi: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| next_multi_offset: 0 0x58-0x5f.7 (8) +0x0060|e9 e5 0b 54 02 00 00 00 |...T.... | oldest_xid: 10000000489 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldest_xid_db: 1 0x68-0x6b.7 (4) 0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) -0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) -0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldest_multi: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldest_multi_db: 1 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) 0x0080|db 6a eb 62 00 00 00 00 |.j.b.... | time: "Thu, 04 Aug 2022 06:44:43 UTC" (1659595483) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) -0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) -0x0090| db 34 0c 54 02 00 00 00| .4.T....| oldestActiveXid: 10000020699 0x98-0x9f.7 (8) -0x00a0|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0xa0-0xa7.7 (8) -0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) -0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x0080| 00 00 00 00 00 00 00 00| ........| oldest_commit_ts_xid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newest_commit_ts_xid: 0 0x90-0x97.7 (8) +0x0090| db 34 0c 54 02 00 00 00| .4.T....| oldest_active_xid: 10000020699 0x98-0x9f.7 (8) +0x00a0|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | min_recovery_point_tli: 0 0xb0-0xb3.7 (4) 0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) -0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) -0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) -0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00b0| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backup_end_required: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) 0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) 0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) 0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) -0x00d0| 8a 01 00 00 | .... | MaxConnections: 394 0xd4-0xd7.7 (4) +0x00d0| 8a 01 00 00 | .... | max_connections: 394 0xd4-0xd7.7 (4) 0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) 0x00d0| 0a 00 00 00| ....| max_wal_senders: 10 0xdc-0xdf.7 (4) 0x00e0|00 00 00 00 |.... | max_prepared_xacts: 0 0xe0-0xe3.7 (4) 0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe4-0xe7.7 (4) 0x00e0| 00 | . | track_commit_timestamp: 0 0xe8-0xe8.7 (1) 0x00e0| 00 00 00 | ... | hole8: 0 0xe9-0xeb.7 (3) -0x00e0| 08 00 00 00| ....| maxAlign: 8 0xec-0xef.7 (4) -0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00e0| 08 00 00 00| ....| max_align: 8 0xec-0xef.7 (4) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xf0-0xf7.7 (8) 0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) 0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) 0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) 0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) -0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) -0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0100| 40 00 00 00 | @... | name_data_len: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| index_max_keys: 32 0x10c-0x10f.7 (4) 0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) 0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) -0x0110| 01 | . | float4ByVal: 1 0x118-0x118.7 (1) -0x0110| 01 | . | float8ByVal: 1 0x119-0x119.7 (1) +0x0110| 01 | . | float4_by_val: 1 0x118-0x118.7 (1) +0x0110| 01 | . | float8_by_val: 1 0x119-0x119.7 (1) 0x0110| 00 00 | .. | hole9: 0 0x11a-0x11b.7 (2) 0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) 0x0120|0b db 53 d2 42 ff 02 95 74 e6 aa 87 ff 98 4b 67|..S.B...t.....Kg| mock_authentication_nonce: "0bdb53d242ff029574e6aa87ff984b67e4a76678383559a..." (raw bits) 0x120-0x13f.7 (32) diff --git a/format/postgres/testdata/flavours/pgproee13/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee13/pg_control.fqtest index 08dbe2fca..3c053a7a0 100644 --- a/format/postgres/testdata/flavours/pgproee13/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgproee13/pg_control.fqtest @@ -6,57 +6,57 @@ $ fq -d pg_control -o flavour=pgproee13 dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 66 c2 ec 62 00 00 00 00| f..b....| time: "Fri, 05 Aug 2022 07:10:30 UTC" (1659683430) 0x18-0x1f.7 (8) -0x0020|78 0a e9 02 00 00 00 00 |x....... | checkPoint: "0/2E90A78" (48827000) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x9f.7 (120) +0x0020|78 0a e9 02 00 00 00 00 |x....... | check_point: "0/2E90A78" (48827000) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x9f.7 (120) 0x0020| 28 0a e9 02 00 00 00 00| (.......| redo: "0/2E90A28" (48826920) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|92 29 0c 54 02 00 00 00 |.).T.... | nextXid: 10000017810 0x40-0x47.7 (8) -0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) +0x0040|92 29 0c 54 02 00 00 00 |.).T.... | next_xid: 10000017810 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x48-0x4b.7 (4) 0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) -0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) -0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) -0x0060|eb e5 0b 54 02 00 00 00 |...T.... | oldestXid: 10000000491 0x60-0x67.7 (8) -0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | next_multi: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| next_multi_offset: 0 0x58-0x5f.7 (8) +0x0060|eb e5 0b 54 02 00 00 00 |...T.... | oldest_xid: 10000000491 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldest_xid_db: 1 0x68-0x6b.7 (4) 0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) -0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) -0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldest_multi: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldest_multi_db: 1 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) 0x0080|65 c2 ec 62 00 00 00 00 |e..b.... | time: "Fri, 05 Aug 2022 07:10:29 UTC" (1659683429) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) -0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) -0x0090| 92 29 0c 54 02 00 00 00| .).T....| oldestActiveXid: 10000017810 0x98-0x9f.7 (8) -0x00a0|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0xa0-0xa7.7 (8) -0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) -0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x0080| 00 00 00 00 00 00 00 00| ........| oldest_commit_ts_xid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newest_commit_ts_xid: 0 0x90-0x97.7 (8) +0x0090| 92 29 0c 54 02 00 00 00| .).T....| oldest_active_xid: 10000017810 0x98-0x9f.7 (8) +0x00a0|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | min_recovery_point_tli: 0 0xb0-0xb3.7 (4) 0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) -0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) -0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) -0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00b0| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backup_end_required: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) 0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) 0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) 0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) -0x00d0| 5d 00 00 00 | ]... | MaxConnections: 93 0xd4-0xd7.7 (4) +0x00d0| 5d 00 00 00 | ]... | max_connections: 93 0xd4-0xd7.7 (4) 0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) 0x00d0| 0a 00 00 00| ....| max_wal_senders: 10 0xdc-0xdf.7 (4) 0x00e0|00 00 00 00 |.... | max_prepared_xacts: 0 0xe0-0xe3.7 (4) 0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe4-0xe7.7 (4) 0x00e0| 00 | . | track_commit_timestamp: 0 0xe8-0xe8.7 (1) 0x00e0| 00 00 00 | ... | hole8: 0 0xe9-0xeb.7 (3) -0x00e0| 08 00 00 00| ....| maxAlign: 8 0xec-0xef.7 (4) -0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00e0| 08 00 00 00| ....| max_align: 8 0xec-0xef.7 (4) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xf0-0xf7.7 (8) 0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) 0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) 0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) 0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) -0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) -0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0100| 40 00 00 00 | @... | name_data_len: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| index_max_keys: 32 0x10c-0x10f.7 (4) 0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) 0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) -0x0110| 01 | . | float8ByVal: 1 0x118-0x118.7 (1) +0x0110| 01 | . | float8_by_val: 1 0x118-0x118.7 (1) 0x0110| 00 00 00 | ... | hole9: 0 0x119-0x11b.7 (3) 0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) 0x0120|9e 64 59 21 b6 ed 30 38 f8 be c1 a7 82 40 df cd|.dY!..08.....@..| mock_authentication_nonce: "9e645921b6ed3038f8bec1a78240dfcd0cbfdafcba223be..." (raw bits) 0x120-0x13f.7 (32) diff --git a/format/postgres/testdata/flavours/pgproee14/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee14/pg_control.fqtest index 3007b7a5b..2ea711c9a 100644 --- a/format/postgres/testdata/flavours/pgproee14/pg_control.fqtest +++ b/format/postgres/testdata/flavours/pgproee14/pg_control.fqtest @@ -6,57 +6,57 @@ $ fq -d pg_control -o flavour=pgproee14 dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 90 74 c2 62 00 00 00 00| .t.b....| time: "Mon, 04 Jul 2022 05:03:12 UTC" (1656910992) 0x18-0x1f.7 (8) -0x0020|f8 01 a0 01 00 00 00 00 |........ | checkPoint: "0/1A001F8" (27263480) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x9f.7 (120) +0x0020|f8 01 a0 01 00 00 00 00 |........ | check_point: "0/1A001F8" (27263480) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x9f.7 (120) 0x0020| a8 01 a0 01 00 00 00 00| ........| redo: "0/1A001A8" (27263400) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|f1 e6 0b 54 02 00 00 00 |...T.... | nextXid: 10000000753 0x40-0x47.7 (8) -0x0040| d3 35 00 00 | .5.. | nextOid: 13779 0x48-0x4b.7 (4) +0x0040|f1 e6 0b 54 02 00 00 00 |...T.... | next_xid: 10000000753 0x40-0x47.7 (8) +0x0040| d3 35 00 00 | .5.. | next_oid: 13779 0x48-0x4b.7 (4) 0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) -0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) -0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) -0x0060|e8 e6 0b 54 02 00 00 00 |...T.... | oldestXid: 10000000744 0x60-0x67.7 (8) -0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | next_multi: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| next_multi_offset: 0 0x58-0x5f.7 (8) +0x0060|e8 e6 0b 54 02 00 00 00 |...T.... | oldest_xid: 10000000744 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldest_xid_db: 1 0x68-0x6b.7 (4) 0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) -0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) -0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldest_multi: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldest_multi_db: 1 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) 0x0080|90 74 c2 62 00 00 00 00 |.t.b.... | time: "Mon, 04 Jul 2022 05:03:12 UTC" (1656910992) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) -0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) -0x0090| f1 e6 0b 54 02 00 00 00| ...T....| oldestActiveXid: 10000000753 0x98-0x9f.7 (8) -0x00a0|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0xa0-0xa7.7 (8) -0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) -0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x0080| 00 00 00 00 00 00 00 00| ........| oldest_commit_ts_xid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newest_commit_ts_xid: 0 0x90-0x97.7 (8) +0x0090| f1 e6 0b 54 02 00 00 00| ...T....| oldest_active_xid: 10000000753 0x98-0x9f.7 (8) +0x00a0|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | min_recovery_point_tli: 0 0xb0-0xb3.7 (4) 0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) -0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) -0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) -0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00b0| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backup_end_required: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) 0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) 0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) 0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) -0x00d0| c6 00 00 00 | .... | MaxConnections: 198 0xd4-0xd7.7 (4) +0x00d0| c6 00 00 00 | .... | max_connections: 198 0xd4-0xd7.7 (4) 0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) 0x00d0| 0a 00 00 00| ....| max_wal_senders: 10 0xdc-0xdf.7 (4) 0x00e0|00 00 00 00 |.... | max_prepared_xacts: 0 0xe0-0xe3.7 (4) 0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe4-0xe7.7 (4) 0x00e0| 00 | . | track_commit_timestamp: 0 0xe8-0xe8.7 (1) 0x00e0| 00 00 00 | ... | hole8: 0 0xe9-0xeb.7 (3) -0x00e0| 08 00 00 00| ....| maxAlign: 8 0xec-0xef.7 (4) -0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00e0| 08 00 00 00| ....| max_align: 8 0xec-0xef.7 (4) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xf0-0xf7.7 (8) 0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) 0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) 0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) 0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) -0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) -0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0100| 40 00 00 00 | @... | name_data_len: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| index_max_keys: 32 0x10c-0x10f.7 (4) 0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) 0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) -0x0110| 01 | . | float8ByVal: 1 0x118-0x118.7 (1) +0x0110| 01 | . | float8_by_val: 1 0x118-0x118.7 (1) 0x0110| 00 00 00 | ... | hole9: 0 0x119-0x11b.7 (3) 0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) 0x0120|dd f2 b7 da 2f 4a 5c ac 5d ce e9 34 21 d6 a8 03|..../J\.]..4!...| mock_authentication_nonce: "ddf2b7da2f4a5cac5dcee93421d6a803d6a08dabff41769..." (raw bits) 0x120-0x13f.7 (32) diff --git a/format/postgres/testdata/flavours/pgproee14/pg_control_1.fqtest b/format/postgres/testdata/flavours/pgproee14/pg_control_1.fqtest index 3189f4933..22160cad5 100644 --- a/format/postgres/testdata/flavours/pgproee14/pg_control_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee14/pg_control_1.fqtest @@ -6,57 +6,57 @@ $ fq -d pg_control dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 90 74 c2 62 00 00 00 00| .t.b....| time: "Mon, 04 Jul 2022 05:03:12 UTC" (1656910992) 0x18-0x1f.7 (8) -0x0020|f8 01 a0 01 00 00 00 00 |........ | checkPoint: "0/1A001F8" (27263480) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x9f.7 (120) +0x0020|f8 01 a0 01 00 00 00 00 |........ | check_point: "0/1A001F8" (27263480) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x9f.7 (120) 0x0020| a8 01 a0 01 00 00 00 00| ........| redo: "0/1A001A8" (27263400) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|f1 e6 0b 54 02 00 00 00 |...T.... | nextXid: 10000000753 0x40-0x47.7 (8) -0x0040| d3 35 00 00 | .5.. | nextOid: 13779 0x48-0x4b.7 (4) +0x0040|f1 e6 0b 54 02 00 00 00 |...T.... | next_xid: 10000000753 0x40-0x47.7 (8) +0x0040| d3 35 00 00 | .5.. | next_oid: 13779 0x48-0x4b.7 (4) 0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) -0x0050|00 f2 05 2a 01 00 00 00 |...*.... | nextMulti: 5000000000 0x50-0x57.7 (8) -0x0050| 00 00 00 00 00 00 00 00| ........| nextMultiOffset: 0 0x58-0x5f.7 (8) -0x0060|e8 e6 0b 54 02 00 00 00 |...T.... | oldestXid: 10000000744 0x60-0x67.7 (8) -0x0060| 01 00 00 00 | .... | oldestXidDB: 1 0x68-0x6b.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | next_multi: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| next_multi_offset: 0 0x58-0x5f.7 (8) +0x0060|e8 e6 0b 54 02 00 00 00 |...T.... | oldest_xid: 10000000744 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldest_xid_db: 1 0x68-0x6b.7 (4) 0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) -0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldestMulti: 5000000000 0x70-0x77.7 (8) -0x0070| 01 00 00 00 | .... | oldestMultiDB: 1 0x78-0x7b.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldest_multi: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldest_multi_db: 1 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) 0x0080|90 74 c2 62 00 00 00 00 |.t.b.... | time: "Mon, 04 Jul 2022 05:03:12 UTC" (1656910992) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| oldestCommitTsXid: 0 0x88-0x8f.7 (8) -0x0090|00 00 00 00 00 00 00 00 |........ | newestCommitTsXid: 0 0x90-0x97.7 (8) -0x0090| f1 e6 0b 54 02 00 00 00| ...T....| oldestActiveXid: 10000000753 0x98-0x9f.7 (8) -0x00a0|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0xa0-0xa7.7 (8) -0x00a0| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0xa8-0xaf.7 (8) -0x00b0|00 00 00 00 |.... | minRecoveryPointTLI: 0 0xb0-0xb3.7 (4) +0x0080| 00 00 00 00 00 00 00 00| ........| oldest_commit_ts_xid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newest_commit_ts_xid: 0 0x90-0x97.7 (8) +0x0090| f1 e6 0b 54 02 00 00 00| ...T....| oldest_active_xid: 10000000753 0x98-0x9f.7 (8) +0x00a0|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | min_recovery_point_tli: 0 0xb0-0xb3.7 (4) 0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) -0x00b0| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0xb8-0xbf.7 (8) -0x00c0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xc0-0xc7.7 (8) -0x00c0| 00 | . | backupEndRequired: 0 0xc8-0xc8.7 (1) +0x00b0| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backup_end_required: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) 0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) 0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) 0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) -0x00d0| c6 00 00 00 | .... | MaxConnections: 198 0xd4-0xd7.7 (4) +0x00d0| c6 00 00 00 | .... | max_connections: 198 0xd4-0xd7.7 (4) 0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) 0x00d0| 0a 00 00 00| ....| max_wal_senders: 10 0xdc-0xdf.7 (4) 0x00e0|00 00 00 00 |.... | max_prepared_xacts: 0 0xe0-0xe3.7 (4) 0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe4-0xe7.7 (4) 0x00e0| 00 | . | track_commit_timestamp: 0 0xe8-0xe8.7 (1) 0x00e0| 00 00 00 | ... | hole8: 0 0xe9-0xeb.7 (3) -0x00e0| 08 00 00 00| ....| maxAlign: 8 0xec-0xef.7 (4) -0x00f0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xf0-0xf7.7 (8) +0x00e0| 08 00 00 00| ....| max_align: 8 0xec-0xef.7 (4) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xf0-0xf7.7 (8) 0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) 0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) 0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) 0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) -0x0100| 40 00 00 00 | @... | nameDataLen: 64 0x108-0x10b.7 (4) -0x0100| 20 00 00 00| ...| indexMaxKeys: 32 0x10c-0x10f.7 (4) +0x0100| 40 00 00 00 | @... | name_data_len: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| index_max_keys: 32 0x10c-0x10f.7 (4) 0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) 0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) -0x0110| 01 | . | float8ByVal: 1 0x118-0x118.7 (1) +0x0110| 01 | . | float8_by_val: 1 0x118-0x118.7 (1) 0x0110| 00 00 00 | ... | hole9: 0 0x119-0x11b.7 (3) 0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) 0x0120|dd f2 b7 da 2f 4a 5c ac 5d ce e9 34 21 d6 a8 03|..../J\.]..4!...| mock_authentication_nonce: "ddf2b7da2f4a5cac5dcee93421d6a803d6a08dabff41769..." (raw bits) 0x120-0x13f.7 (32) diff --git a/format/postgres/testdata/flavours/postgres11/pg_control.fqtest b/format/postgres/testdata/flavours/postgres11/pg_control.fqtest index 0d68d5df2..8adbdc1bf 100644 --- a/format/postgres/testdata/flavours/postgres11/pg_control.fqtest +++ b/format/postgres/testdata/flavours/postgres11/pg_control.fqtest @@ -6,57 +6,57 @@ $ fq -d pg_control -o flavour=postgres11 dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 21 67 ea 62 00 00 00 00| !g.b....| time: "Wed, 03 Aug 2022 12:16:33 UTC" (1659528993) 0x18-0x1f.7 (8) -0x0020|b8 2d 6a 03 00 00 00 00 |.-j..... | checkPoint: "0/36A2DB8" (57290168) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x77.7 (80) +0x0020|b8 2d 6a 03 00 00 00 00 |.-j..... | check_point: "0/36A2DB8" (57290168) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x77.7 (80) 0x0020| 80 2d 6a 03 00 00 00 00| .-j.....| redo: "0/36A2D80" (57290112) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 | ... | hole1: 0 0x39-0x3b.7 (3) -0x0030| 00 00 00 00| ....| nextXidEpoch: 0 0x3c-0x3f.7 (4) -0x0040|82 a0 00 00 |.... | nextXid: 41090 0x40-0x43.7 (4) -0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x44-0x47.7 (4) -0x0040| 01 00 00 00 | .... | nextMulti: 1 0x48-0x4b.7 (4) -0x0040| 00 00 00 00| ....| nextMultiOffset: 0 0x4c-0x4f.7 (4) -0x0050|31 02 00 00 |1... | oldestXid: 561 0x50-0x53.7 (4) -0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x54-0x57.7 (4) -0x0050| 01 00 00 00 | .... | oldestMulti: 1 0x58-0x5b.7 (4) -0x0050| 01 00 00 00| ....| oldestMultiDB: 1 0x5c-0x5f.7 (4) +0x0030| 00 00 00 00| ....| next_xid_epoch: 0 0x3c-0x3f.7 (4) +0x0040|82 a0 00 00 |.... | next_xid: 41090 0x40-0x43.7 (4) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x44-0x47.7 (4) +0x0040| 01 00 00 00 | .... | next_multi: 1 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| next_multi_offset: 0 0x4c-0x4f.7 (4) +0x0050|31 02 00 00 |1... | oldest_xid: 561 0x50-0x53.7 (4) +0x0050| 01 00 00 00 | .... | oldest_xid_db: 1 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldest_multi: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldest_multi_db: 1 0x5c-0x5f.7 (4) 0x0060|21 67 ea 62 00 00 00 00 |!g.b.... | time: "Wed, 03 Aug 2022 12:16:33 UTC" (1659528993) 0x60-0x67.7 (8) -0x0060| 00 00 00 00 | .... | oldestCommitTsXid: 0 0x68-0x6b.7 (4) -0x0060| 00 00 00 00| ....| newestCommitTsXid: 0 0x6c-0x6f.7 (4) -0x0070|82 a0 00 00 |.... | oldestActiveXid: 41090 0x70-0x73.7 (4) +0x0060| 00 00 00 00 | .... | oldest_commit_ts_xid: 0 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| newest_commit_ts_xid: 0 0x6c-0x6f.7 (4) +0x0070|82 a0 00 00 |.... | oldest_active_xid: 41090 0x70-0x73.7 (4) 0x0070| 00 00 00 00 | .... | padding0: 0 0x74-0x77.7 (4) -0x0070| 01 00 00 00 00 00 00 00| ........| unloggedLSN: "0/1" (1) 0x78-0x7f.7 (8) -0x0080|00 00 00 00 00 00 00 00 |........ | minRecoveryPoint: "0/0" (0) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 | .... | minRecoveryPointTLI: 0 0x88-0x8b.7 (4) +0x0070| 01 00 00 00 00 00 00 00| ........| unlogged_lsn: "0/1" (1) 0x78-0x7f.7 (8) +0x0080|00 00 00 00 00 00 00 00 |........ | min_recovery_point: "0/0" (0) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 | .... | min_recovery_point_tli: 0 0x88-0x8b.7 (4) 0x0080| 00 00 00 00| ....| hole2: 0 0x8c-0x8f.7 (4) -0x0090|00 00 00 00 00 00 00 00 |........ | backupStartPoint: "0/0" (0) 0x90-0x97.7 (8) -0x0090| 00 00 00 00 00 00 00 00| ........| backupEndPoint: "0/0" (0) 0x98-0x9f.7 (8) -0x00a0|00 |. | backupEndRequired: 0 0xa0-0xa0.7 (1) +0x0090|00 00 00 00 00 00 00 00 |........ | backup_start_point: "0/0" (0) 0x90-0x97.7 (8) +0x0090| 00 00 00 00 00 00 00 00| ........| backup_end_point: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 |. | backup_end_required: 0 0xa0-0xa0.7 (1) 0x00a0| 00 00 00 | ... | hole3: 0 0xa1-0xa3.7 (3) 0x00a0| 01 00 00 00 | .... | wal_level: "WAL_LEVEL_REPLICA" (1) 0xa4-0xa7.7 (4) 0x00a0| 00 | . | wal_log_hints: 0 0xa8-0xa8.7 (1) 0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) -0x00a0| e8 03 00 00| ....| MaxConnections: 1000 0xac-0xaf.7 (4) +0x00a0| e8 03 00 00| ....| max_connections: 1000 0xac-0xaf.7 (4) 0x00b0|08 00 00 00 |.... | max_worker_processes: 8 0xb0-0xb3.7 (4) 0x00b0| 00 00 00 00 | .... | max_prepared_xacts: 0 0xb4-0xb7.7 (4) 0x00b0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xb8-0xbb.7 (4) 0x00b0| 00 | . | track_commit_timestamp: 0 0xbc-0xbc.7 (1) 0x00b0| 00 00 00| ...| hole5: 0 0xbd-0xbf.7 (3) -0x00c0|08 00 00 00 |.... | maxAlign: 8 0xc0-0xc3.7 (4) +0x00c0|08 00 00 00 |.... | max_align: 8 0xc0-0xc3.7 (4) 0x00c0| 00 00 00 00 | .... | hole6: 0 0xc4-0xc7.7 (4) -0x00c0| 00 00 00 00 87 d6 32 41| ......2A| floatFormat: 1.234567e+06 0xc8-0xcf.7 (8) +0x00c0| 00 00 00 00 87 d6 32 41| ......2A| float_format: 1.234567e+06 0xc8-0xcf.7 (8) 0x00d0|00 20 00 00 |. .. | blcksz: 8192 0xd0-0xd3.7 (4) 0x00d0| 00 00 02 00 | .... | relseg_size: 131072 0xd4-0xd7.7 (4) 0x00d0| 00 20 00 00 | . .. | xlog_blcksz: 8192 0xd8-0xdb.7 (4) 0x00d0| 00 00 00 01| ....| xlog_seg_size: 16777216 0xdc-0xdf.7 (4) -0x00e0|40 00 00 00 |@... | nameDataLen: 64 0xe0-0xe3.7 (4) -0x00e0| 20 00 00 00 | ... | indexMaxKeys: 32 0xe4-0xe7.7 (4) +0x00e0|40 00 00 00 |@... | name_data_len: 64 0xe0-0xe3.7 (4) +0x00e0| 20 00 00 00 | ... | index_max_keys: 32 0xe4-0xe7.7 (4) 0x00e0| cc 07 00 00 | .... | toast_max_chunk_size: 1996 0xe8-0xeb.7 (4) 0x00e0| 00 08 00 00| ....| loblksize: 2048 0xec-0xef.7 (4) -0x00f0|01 |. | float4ByVal: 1 0xf0-0xf0.7 (1) -0x00f0| 01 | . | float8ByVal: 1 0xf1-0xf1.7 (1) +0x00f0|01 |. | float4_by_val: 1 0xf0-0xf0.7 (1) +0x00f0| 01 | . | float8_by_val: 1 0xf1-0xf1.7 (1) 0x00f0| 00 00 | .. | hole7: 0 0xf2-0xf3.7 (2) 0x00f0| 00 00 00 00 | .... | data_checksum_version: 0 0xf4-0xf7.7 (4) 0x00f0| 8f d4 c0 21 b8 8d e7 55| ...!...U| mock_authentication_nonce: "8fd4c021b88de7556e475cdd35b16790492bd588c0e7919..." (raw bits) 0xf8-0x117.7 (32) diff --git a/format/postgres/testdata/flavours/postgres12/pg_control.fqtest b/format/postgres/testdata/flavours/postgres12/pg_control.fqtest index f483e4e9b..c4fb99374 100644 --- a/format/postgres/testdata/flavours/postgres12/pg_control.fqtest +++ b/format/postgres/testdata/flavours/postgres12/pg_control.fqtest @@ -6,57 +6,57 @@ $ fq -d pg_control -o flavour=postgres12 dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 75 27 ea 62 00 00 00 00| u'.b....| time: "Wed, 03 Aug 2022 07:44:53 UTC" (1659512693) 0x18-0x1f.7 (8) -0x0020|b8 a1 a5 03 00 00 00 00 |........ | checkPoint: "0/3A5A1B8" (61186488) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020|b8 a1 a5 03 00 00 00 00 |........ | check_point: "0/3A5A1B8" (61186488) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x7f.7 (88) 0x0020| 80 a1 a5 03 00 00 00 00| ........| redo: "0/3A5A180" (61186432) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|3d bf 00 00 00 00 00 00 |=....... | nextFullXid: "0:48957" (48957) 0x40-0x47.7 (8) -0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) -0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) -0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) -0x0050| df 01 00 00 | .... | oldestXid: 479 0x54-0x57.7 (4) -0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) -0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) -0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0040|3d bf 00 00 00 00 00 00 |=....... | next_full_xid: "0:48957" (48957) 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| next_multi: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | next_multi_offset: 0 0x50-0x53.7 (4) +0x0050| df 01 00 00 | .... | oldest_xid: 479 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldest_xid_db: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldest_multi: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldest_multi_db: 1 0x60-0x63.7 (4) 0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) 0x0060| 85 26 ea 62 00 00 00 00| .&.b....| time: "Wed, 03 Aug 2022 07:40:53 UTC" (1659512453) 0x68-0x6f.7 (8) -0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) -0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) -0x0070| 3d bf 00 00 | =... | oldestActiveXid: 48957 0x78-0x7b.7 (4) +0x0070|00 00 00 00 |.... | oldest_commit_ts_xid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newest_commit_ts_xid: 0 0x74-0x77.7 (4) +0x0070| 3d bf 00 00 | =... | oldest_active_xid: 48957 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) -0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) -0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | min_recovery_point_tli: 0 0x90-0x93.7 (4) 0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) -0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) -0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) -0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x0090| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backup_end_required: 0 0xa8-0xa8.7 (1) 0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) 0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) 0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) 0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) -0x00b0| e8 03 00 00 | .... | MaxConnections: 1000 0xb4-0xb7.7 (4) +0x00b0| e8 03 00 00 | .... | max_connections: 1000 0xb4-0xb7.7 (4) 0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) 0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) 0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) 0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) 0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) -0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) -0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00c0| 08 00 00 00| ....| max_align: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xd0-0xd7.7 (8) 0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) 0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) 0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) 0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) -0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) -0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00e0| 40 00 00 00 | @... | name_data_len: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| index_max_keys: 32 0xec-0xef.7 (4) 0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) 0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) -0x00f0| 01 | . | float4ByVal: 1 0xf8-0xf8.7 (1) -0x00f0| 01 | . | float8ByVal: 1 0xf9-0xf9.7 (1) +0x00f0| 01 | . | float4_by_val: 1 0xf8-0xf8.7 (1) +0x00f0| 01 | . | float8_by_val: 1 0xf9-0xf9.7 (1) 0x00f0| 00 00 | .. | hole7: 0 0xfa-0xfb.7 (2) 0x00f0| 00 00 00 00| ....| data_checksum_version: 0 0xfc-0xff.7 (4) 0x0100|63 40 15 28 f0 e7 44 aa c9 a9 f5 6c 7a 4d 43 59|c@.(..D....lzMCY| mock_authentication_nonce: "63401528f0e744aac9a9f56c7a4d435929f511dce0812c2..." (raw bits) 0x100-0x11f.7 (32) diff --git a/format/postgres/testdata/flavours/postgres13/pg_control.fqtest b/format/postgres/testdata/flavours/postgres13/pg_control.fqtest index 22741183f..8cf6db535 100644 --- a/format/postgres/testdata/flavours/postgres13/pg_control.fqtest +++ b/format/postgres/testdata/flavours/postgres13/pg_control.fqtest @@ -6,56 +6,56 @@ $ fq -d pg_control -o flavour=postgres13 dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 3f c4 eb 62 00 00 00 00| ?..b....| time: "Thu, 04 Aug 2022 13:06:07 UTC" (1659618367) 0x18-0x1f.7 (8) -0x0020|58 7c 77 02 00 00 00 00 |X|w..... | checkPoint: "0/2777C58" (41385048) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020|58 7c 77 02 00 00 00 00 |X|w..... | check_point: "0/2777C58" (41385048) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x7f.7 (88) 0x0020| 20 7c 77 02 00 00 00 00| |w.....| redo: "0/2777C20" (41384992) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|db 30 00 00 00 00 00 00 |.0...... | nextFullXid: 12507 0x40-0x47.7 (8) -0x0040| 00 60 00 00 | .`.. | nextOid: 24576 0x48-0x4b.7 (4) -0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) -0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) -0x0050| de 01 00 00 | .... | oldestXid: 478 0x54-0x57.7 (4) -0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) -0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) -0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0040|db 30 00 00 00 00 00 00 |.0...... | next_full_xid: 12507 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| next_multi: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | next_multi_offset: 0 0x50-0x53.7 (4) +0x0050| de 01 00 00 | .... | oldest_xid: 478 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldest_xid_db: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldest_multi: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldest_multi_db: 1 0x60-0x63.7 (4) 0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) 0x0060| 3f c4 eb 62 00 00 00 00| ?..b....| time: "Thu, 04 Aug 2022 13:06:07 UTC" (1659618367) 0x68-0x6f.7 (8) -0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) -0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) -0x0070| db 30 00 00 | .0.. | oldestActiveXid: 12507 0x78-0x7b.7 (4) +0x0070|00 00 00 00 |.... | oldest_commit_ts_xid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newest_commit_ts_xid: 0 0x74-0x77.7 (4) +0x0070| db 30 00 00 | .0.. | oldest_active_xid: 12507 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) -0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) -0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | min_recovery_point_tli: 0 0x90-0x93.7 (4) 0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) -0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) -0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) -0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x0090| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backup_end_required: 0 0xa8-0xa8.7 (1) 0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) 0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) 0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) 0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) -0x00b0| e8 03 00 00 | .... | MaxConnections: 1000 0xb4-0xb7.7 (4) +0x00b0| e8 03 00 00 | .... | max_connections: 1000 0xb4-0xb7.7 (4) 0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) 0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) 0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) 0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) 0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) -0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) -0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00c0| 08 00 00 00| ....| max_align: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xd0-0xd7.7 (8) 0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) 0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) 0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) 0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) -0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) -0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00e0| 40 00 00 00 | @... | name_data_len: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| index_max_keys: 32 0xec-0xef.7 (4) 0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) 0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) -0x00f0| 01 | . | float8ByVal: 1 0xf8-0xf8.7 (1) +0x00f0| 01 | . | float8_by_val: 1 0xf8-0xf8.7 (1) 0x00f0| 00 00 00 | ... | hole7: 0 0xf9-0xfb.7 (3) 0x00f0| 00 00 00 00| ....| data_checksum_version: 0 0xfc-0xff.7 (4) 0x0100|40 30 6a 6b 3a 01 12 b3 9c 0d aa 29 b2 39 3b e3|@0jk:......).9;.| mock_authentication_nonce: "40306a6b3a0112b39c0daa29b2393be3a10e6a9823b4df2..." (raw bits) 0x100-0x11f.7 (32) diff --git a/format/postgres/testdata/flavours/postgres14/pg_control.fqtest b/format/postgres/testdata/flavours/postgres14/pg_control.fqtest index 36c3aa80a..b941f4df1 100644 --- a/format/postgres/testdata/flavours/postgres14/pg_control.fqtest +++ b/format/postgres/testdata/flavours/postgres14/pg_control.fqtest @@ -6,56 +6,56 @@ $ fq -d pg_control -o flavour=postgres14 dv pg_control 0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) 0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) 0x0010| 46 a1 c2 62 00 00 00 00| F..b....| time: "Mon, 04 Jul 2022 08:13:58 UTC" (1656922438) 0x18-0x1f.7 (8) -0x0020|c0 88 d6 9a 00 00 00 00 |........ | checkPoint: "0/9AD688C0" (2597750976) 0x20-0x27.7 (8) - | | | checkPointCopy{}: 0x28-0x7f.7 (88) +0x0020|c0 88 d6 9a 00 00 00 00 |........ | check_point: "0/9AD688C0" (2597750976) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x7f.7 (88) 0x0020| c0 88 d6 9a 00 00 00 00| ........| redo: "0/9AD688C0" (2597750976) 0x28-0x2f.7 (8) -0x0030|01 00 00 00 |.... | ThisTimeLineID: 1 0x30-0x33.7 (4) -0x0030| 01 00 00 00 | .... | PrevTimeLineID: 1 0x34-0x37.7 (4) -0x0030| 01 | . | fullPageWrites: 1 0x38-0x38.7 (1) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) 0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) -0x0040|4b ab 1c 00 00 00 00 00 |K....... | nextXid: 1878859 0x40-0x47.7 (8) -0x0040| dd 81 00 00 | .... | nextOid: 33245 0x48-0x4b.7 (4) -0x0040| 01 00 00 00| ....| nextMulti: 1 0x4c-0x4f.7 (4) -0x0050|00 00 00 00 |.... | nextMultiOffset: 0 0x50-0x53.7 (4) -0x0050| d6 02 00 00 | .... | oldestXid: 726 0x54-0x57.7 (4) -0x0050| 01 00 00 00 | .... | oldestXidDB: 1 0x58-0x5b.7 (4) -0x0050| 01 00 00 00| ....| oldestMulti: 1 0x5c-0x5f.7 (4) -0x0060|01 00 00 00 |.... | oldestMultiDB: 1 0x60-0x63.7 (4) +0x0040|4b ab 1c 00 00 00 00 00 |K....... | next_xid: 1878859 0x40-0x47.7 (8) +0x0040| dd 81 00 00 | .... | next_oid: 33245 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| next_multi: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | next_multi_offset: 0 0x50-0x53.7 (4) +0x0050| d6 02 00 00 | .... | oldest_xid: 726 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldest_xid_db: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldest_multi: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldest_multi_db: 1 0x60-0x63.7 (4) 0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) 0x0060| 46 a1 c2 62 00 00 00 00| F..b....| time: "Mon, 04 Jul 2022 08:13:58 UTC" (1656922438) 0x68-0x6f.7 (8) -0x0070|00 00 00 00 |.... | oldestCommitTsXid: 0 0x70-0x73.7 (4) -0x0070| 00 00 00 00 | .... | newestCommitTsXid: 0 0x74-0x77.7 (4) -0x0070| 00 00 00 00 | .... | oldestActiveXid: 0 0x78-0x7b.7 (4) +0x0070|00 00 00 00 |.... | oldest_commit_ts_xid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newest_commit_ts_xid: 0 0x74-0x77.7 (4) +0x0070| 00 00 00 00 | .... | oldest_active_xid: 0 0x78-0x7b.7 (4) 0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) -0x0080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) 0x80-0x87.7 (8) -0x0080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) 0x88-0x8f.7 (8) -0x0090|00 00 00 00 |.... | minRecoveryPointTLI: 0 0x90-0x93.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | min_recovery_point_tli: 0 0x90-0x93.7 (4) 0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) -0x0090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) 0x98-0x9f.7 (8) -0x00a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) 0xa0-0xa7.7 (8) -0x00a0| 00 | . | backupEndRequired: 0 0xa8-0xa8.7 (1) +0x0090| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backup_end_required: 0 0xa8-0xa8.7 (1) 0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) 0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) 0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) 0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) -0x00b0| 64 00 00 00 | d... | MaxConnections: 100 0xb4-0xb7.7 (4) +0x00b0| 64 00 00 00 | d... | max_connections: 100 0xb4-0xb7.7 (4) 0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) 0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) 0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) 0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) 0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) 0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) -0x00c0| 08 00 00 00| ....| maxAlign: 8 0xcc-0xcf.7 (4) -0x00d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 0xd0-0xd7.7 (8) +0x00c0| 08 00 00 00| ....| max_align: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xd0-0xd7.7 (8) 0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) 0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) 0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) 0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) -0x00e0| 40 00 00 00 | @... | nameDataLen: 64 0xe8-0xeb.7 (4) -0x00e0| 20 00 00 00| ...| indexMaxKeys: 32 0xec-0xef.7 (4) +0x00e0| 40 00 00 00 | @... | name_data_len: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| index_max_keys: 32 0xec-0xef.7 (4) 0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) 0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) -0x00f0| 01 | . | float8ByVal: 1 0xf8-0xf8.7 (1) +0x00f0| 01 | . | float8_by_val: 1 0xf8-0xf8.7 (1) 0x00f0| 00 00 00 | ... | hole7: 0 0xf9-0xfb.7 (3) 0x00f0| 00 00 00 00| ....| data_checksum_version: 0 0xfc-0xff.7 (4) 0x0100|00 45 fd 64 7e d4 d3 53 82 75 0a b7 d6 be c1 9a|.E.d~..S.u......| mock_authentication_nonce: "0045fd647ed4d35382750ab7d6bec19a77af72bae00f728..." (raw bits) 0x100-0x11f.7 (32) From 9f1adb2d813b56defc3ab26095b9b124969e1a92 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 21 Sep 2022 13:36:15 +0300 Subject: [PATCH 076/141] postgres: change AssertPosBytes to AssertPos (bits) --- format/postgres/flavours/pgpro11/pg_control.go | 2 +- format/postgres/flavours/pgpro12/pg_control.go | 2 +- format/postgres/flavours/pgpro13/pg_control.go | 2 +- format/postgres/flavours/pgpro14/pg_control.go | 2 +- format/postgres/flavours/pgproee10/pg_control.go | 2 +- format/postgres/flavours/pgproee11/pg_control.go | 2 +- format/postgres/flavours/pgproee12/pg_control.go | 2 +- format/postgres/flavours/pgproee13/pg_control.go | 2 +- format/postgres/flavours/pgproee14/pg_control.go | 2 +- format/postgres/flavours/postgres11/pg_control.go | 2 +- format/postgres/flavours/postgres12/pg_control.go | 2 +- format/postgres/flavours/postgres13/pg_control.go | 2 +- format/postgres/flavours/postgres14/pg_control.go | 2 +- pkg/decode/decode.go | 8 +++----- 14 files changed, 16 insertions(+), 18 deletions(-) diff --git a/format/postgres/flavours/pgpro11/pg_control.go b/format/postgres/flavours/pgpro11/pg_control.go index cc3929839..e3301101d 100644 --- a/format/postgres/flavours/pgpro11/pg_control.go +++ b/format/postgres/flavours/pgpro11/pg_control.go @@ -213,7 +213,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("crc") /* total size (bytes): 288 */ - d.AssertPosBytes(288) + d.AssertPos(288 * 8) d.FieldRawLen("unused", d.BitsLeft()) return nil diff --git a/format/postgres/flavours/pgpro12/pg_control.go b/format/postgres/flavours/pgpro12/pg_control.go index 36481ef97..f8d287176 100644 --- a/format/postgres/flavours/pgpro12/pg_control.go +++ b/format/postgres/flavours/pgpro12/pg_control.go @@ -213,7 +213,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("crc") /* total size (bytes): 296 */ - d.AssertPosBytes(296) + d.AssertPos(296 * 8) d.FieldRawLen("unused", d.BitsLeft()) return nil diff --git a/format/postgres/flavours/pgpro13/pg_control.go b/format/postgres/flavours/pgpro13/pg_control.go index dcbe4245c..afe827b93 100644 --- a/format/postgres/flavours/pgpro13/pg_control.go +++ b/format/postgres/flavours/pgpro13/pg_control.go @@ -209,7 +209,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("crc") /* total size (bytes): 296 */ - d.AssertPosBytes(296) + d.AssertPos(296 * 8) d.FieldRawLen("unused", d.BitsLeft()) return nil diff --git a/format/postgres/flavours/pgpro14/pg_control.go b/format/postgres/flavours/pgpro14/pg_control.go index 50a228519..76186ca6a 100644 --- a/format/postgres/flavours/pgpro14/pg_control.go +++ b/format/postgres/flavours/pgpro14/pg_control.go @@ -209,7 +209,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("crc") /* total size (bytes): 296 */ - d.AssertPosBytes(296) + d.AssertPos(296 * 8) d.FieldRawLen("unused", d.BitsLeft()) return nil diff --git a/format/postgres/flavours/pgproee10/pg_control.go b/format/postgres/flavours/pgproee10/pg_control.go index 25e7d2383..af5f0a532 100644 --- a/format/postgres/flavours/pgproee10/pg_control.go +++ b/format/postgres/flavours/pgproee10/pg_control.go @@ -229,7 +229,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("hole11") /* total size (bytes): 344 */ - d.AssertPosBytes(344) + d.AssertPos(344 * 8) d.FieldRawLen("unused", d.BitsLeft()) return nil diff --git a/format/postgres/flavours/pgproee11/pg_control.go b/format/postgres/flavours/pgproee11/pg_control.go index 2160f1fb3..290e0ce54 100644 --- a/format/postgres/flavours/pgproee11/pg_control.go +++ b/format/postgres/flavours/pgproee11/pg_control.go @@ -231,7 +231,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("crc") /* total size (bytes): 344 */ - d.AssertPosBytes(344) + d.AssertPos(344 * 8) d.FieldRawLen("unused", d.BitsLeft()) return nil diff --git a/format/postgres/flavours/pgproee12/pg_control.go b/format/postgres/flavours/pgproee12/pg_control.go index 791f9a8ca..117dde36f 100644 --- a/format/postgres/flavours/pgproee12/pg_control.go +++ b/format/postgres/flavours/pgproee12/pg_control.go @@ -230,7 +230,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("crc") /* total size (bytes): 344 */ - d.AssertPosBytes(344) + d.AssertPos(344 * 8) d.FieldRawLen("unused", d.BitsLeft()) return nil diff --git a/format/postgres/flavours/pgproee13/pg_control.go b/format/postgres/flavours/pgproee13/pg_control.go index db8440f07..21a383f84 100644 --- a/format/postgres/flavours/pgproee13/pg_control.go +++ b/format/postgres/flavours/pgproee13/pg_control.go @@ -222,7 +222,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("padding0") /* total size (bytes): 336 */ - d.AssertPosBytes(336) + d.AssertPos(336 * 8) d.FieldRawLen("unused", d.BitsLeft()) return nil diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go index a3da6ebc4..4b08e5ef8 100644 --- a/format/postgres/flavours/pgproee14/pg_control.go +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -221,7 +221,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("padding0") /* total size (bytes): 336 */ - d.AssertPosBytes(336) + d.AssertPos(336 * 8) d.FieldRawLen("unused", d.BitsLeft()) return nil diff --git a/format/postgres/flavours/postgres11/pg_control.go b/format/postgres/flavours/postgres11/pg_control.go index f29083552..a98f79a14 100644 --- a/format/postgres/flavours/postgres11/pg_control.go +++ b/format/postgres/flavours/postgres11/pg_control.go @@ -213,7 +213,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("padding1") /* total size (bytes): 288 */ - d.AssertPosBytes(288) + d.AssertPos(288 * 8) d.FieldRawLen("unused", d.BitsLeft()) return nil diff --git a/format/postgres/flavours/postgres12/pg_control.go b/format/postgres/flavours/postgres12/pg_control.go index 13286a754..b77bec396 100644 --- a/format/postgres/flavours/postgres12/pg_control.go +++ b/format/postgres/flavours/postgres12/pg_control.go @@ -212,7 +212,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("padding1") /* total size (bytes): 296 */ - d.AssertPosBytes(296) + d.AssertPos(296 * 8) d.FieldRawLen("unused", d.BitsLeft()) return nil diff --git a/format/postgres/flavours/postgres13/pg_control.go b/format/postgres/flavours/postgres13/pg_control.go index b2e617ba1..3a86ebc51 100644 --- a/format/postgres/flavours/postgres13/pg_control.go +++ b/format/postgres/flavours/postgres13/pg_control.go @@ -209,7 +209,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("padding1") /* total size (bytes): 296 */ - d.AssertPosBytes(296) + d.AssertPos(296 * 8) d.FieldRawLen("unused", d.BitsLeft()) return nil diff --git a/format/postgres/flavours/postgres14/pg_control.go b/format/postgres/flavours/postgres14/pg_control.go index cb3d32635..6ffbb5088 100644 --- a/format/postgres/flavours/postgres14/pg_control.go +++ b/format/postgres/flavours/postgres14/pg_control.go @@ -209,7 +209,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU32("padding1") /* total size (bytes): 296 */ - d.AssertPosBytes(296) + d.AssertPos(296 * 8) d.FieldRawLen("unused", d.BitsLeft()) return nil diff --git a/pkg/decode/decode.go b/pkg/decode/decode.go index e13e5a2a4..d92cb124d 100644 --- a/pkg/decode/decode.go +++ b/pkg/decode/decode.go @@ -816,11 +816,9 @@ func (d *D) FieldRangeFn(name string, firstBit int64, nBits int64, fn func() *Va return v } -func (d *D) AssertPosBytes(nBytes int64) { - nBits := nBytes * 8 - if d.Pos() != nBits { - // TODO: - panic(DecoderError{Reason: fmt.Sprintf("expected position bytes %d, bits %d", nBytes, nBits), Pos: d.Pos()}) +func (d *D) AssertPos(pos int64) { + if d.Pos() != pos { + panic(DecoderError{Reason: fmt.Sprintf("expected bits position %d", pos), Pos: d.Pos()}) } } From 7dd7dbee51ea196d29628e4a340f38b5e8608ff1 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 21 Sep 2022 13:40:35 +0300 Subject: [PATCH 077/141] postgres: pg_heap reafactoring --- format/postgres/flavours/pgpro13/{pgheap.go => pg_heap.go} | 0 format/postgres/flavours/pgpro14/{pgheap.go => pg_heap.go} | 0 format/postgres/flavours/pgproee10/{pgheap.go => pg_heap.go} | 0 format/postgres/flavours/pgproee11/{pgheap.go => pg_heap.go} | 0 format/postgres/flavours/pgproee12/{pgheap.go => pg_heap.go} | 0 format/postgres/flavours/pgproee13/{pgheap.go => pg_heap.go} | 0 format/postgres/flavours/pgproee14/{pgheap.go => pg_heap.go} | 0 format/postgres/flavours/postgres11/{pgheap.go => pg_heap.go} | 0 format/postgres/flavours/postgres12/{pgheap.go => pg_heap.go} | 0 format/postgres/flavours/postgres13/{pgheap.go => pg_heap.go} | 0 .../flavours/postgres14/common14/{pgheap.go => pg_heap.go} | 0 format/postgres/flavours/postgres14/{pgheap.go => pg_heap.go} | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename format/postgres/flavours/pgpro13/{pgheap.go => pg_heap.go} (100%) rename format/postgres/flavours/pgpro14/{pgheap.go => pg_heap.go} (100%) rename format/postgres/flavours/pgproee10/{pgheap.go => pg_heap.go} (100%) rename format/postgres/flavours/pgproee11/{pgheap.go => pg_heap.go} (100%) rename format/postgres/flavours/pgproee12/{pgheap.go => pg_heap.go} (100%) rename format/postgres/flavours/pgproee13/{pgheap.go => pg_heap.go} (100%) rename format/postgres/flavours/pgproee14/{pgheap.go => pg_heap.go} (100%) rename format/postgres/flavours/postgres11/{pgheap.go => pg_heap.go} (100%) rename format/postgres/flavours/postgres12/{pgheap.go => pg_heap.go} (100%) rename format/postgres/flavours/postgres13/{pgheap.go => pg_heap.go} (100%) rename format/postgres/flavours/postgres14/common14/{pgheap.go => pg_heap.go} (100%) rename format/postgres/flavours/postgres14/{pgheap.go => pg_heap.go} (100%) diff --git a/format/postgres/flavours/pgpro13/pgheap.go b/format/postgres/flavours/pgpro13/pg_heap.go similarity index 100% rename from format/postgres/flavours/pgpro13/pgheap.go rename to format/postgres/flavours/pgpro13/pg_heap.go diff --git a/format/postgres/flavours/pgpro14/pgheap.go b/format/postgres/flavours/pgpro14/pg_heap.go similarity index 100% rename from format/postgres/flavours/pgpro14/pgheap.go rename to format/postgres/flavours/pgpro14/pg_heap.go diff --git a/format/postgres/flavours/pgproee10/pgheap.go b/format/postgres/flavours/pgproee10/pg_heap.go similarity index 100% rename from format/postgres/flavours/pgproee10/pgheap.go rename to format/postgres/flavours/pgproee10/pg_heap.go diff --git a/format/postgres/flavours/pgproee11/pgheap.go b/format/postgres/flavours/pgproee11/pg_heap.go similarity index 100% rename from format/postgres/flavours/pgproee11/pgheap.go rename to format/postgres/flavours/pgproee11/pg_heap.go diff --git a/format/postgres/flavours/pgproee12/pgheap.go b/format/postgres/flavours/pgproee12/pg_heap.go similarity index 100% rename from format/postgres/flavours/pgproee12/pgheap.go rename to format/postgres/flavours/pgproee12/pg_heap.go diff --git a/format/postgres/flavours/pgproee13/pgheap.go b/format/postgres/flavours/pgproee13/pg_heap.go similarity index 100% rename from format/postgres/flavours/pgproee13/pgheap.go rename to format/postgres/flavours/pgproee13/pg_heap.go diff --git a/format/postgres/flavours/pgproee14/pgheap.go b/format/postgres/flavours/pgproee14/pg_heap.go similarity index 100% rename from format/postgres/flavours/pgproee14/pgheap.go rename to format/postgres/flavours/pgproee14/pg_heap.go diff --git a/format/postgres/flavours/postgres11/pgheap.go b/format/postgres/flavours/postgres11/pg_heap.go similarity index 100% rename from format/postgres/flavours/postgres11/pgheap.go rename to format/postgres/flavours/postgres11/pg_heap.go diff --git a/format/postgres/flavours/postgres12/pgheap.go b/format/postgres/flavours/postgres12/pg_heap.go similarity index 100% rename from format/postgres/flavours/postgres12/pgheap.go rename to format/postgres/flavours/postgres12/pg_heap.go diff --git a/format/postgres/flavours/postgres13/pgheap.go b/format/postgres/flavours/postgres13/pg_heap.go similarity index 100% rename from format/postgres/flavours/postgres13/pgheap.go rename to format/postgres/flavours/postgres13/pg_heap.go diff --git a/format/postgres/flavours/postgres14/common14/pgheap.go b/format/postgres/flavours/postgres14/common14/pg_heap.go similarity index 100% rename from format/postgres/flavours/postgres14/common14/pgheap.go rename to format/postgres/flavours/postgres14/common14/pg_heap.go diff --git a/format/postgres/flavours/postgres14/pgheap.go b/format/postgres/flavours/postgres14/pg_heap.go similarity index 100% rename from format/postgres/flavours/postgres14/pgheap.go rename to format/postgres/flavours/postgres14/pg_heap.go From c3ef341106b68529778a6219a47d4c831800b21d Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 21 Sep 2022 15:21:29 +0300 Subject: [PATCH 078/141] postgresql: general logic for pg_heap, pg_btree --- format/postgres/flavours/pgpro11/pg_heap.go | 2 +- format/postgres/flavours/pgpro12/pg_heap.go | 2 +- format/postgres/flavours/pgpro13/pg_heap.go | 2 +- format/postgres/flavours/pgpro14/pg_heap.go | 2 +- .../flavours/pgproee14/ee14/pgheap.go | 14 +-- .../postgres/flavours/postgres11/pg_heap.go | 2 +- .../postgres/flavours/postgres12/pg_heap.go | 2 +- .../postgres/flavours/postgres13/pg_heap.go | 2 +- .../flavours/postgres14/common14/heap_page.go | 83 ++++++++++++++ .../flavours/postgres14/common14/pg_heap.go | 89 +-------------- .../postgres/flavours/postgres14/pg_btree.go | 104 +++--------------- .../postgres/flavours/postgres14/pg_heap.go | 2 +- .../testdata/flavours/pgpro11/16396_1.fqtest | 6 +- .../testdata/flavours/pgpro11/16406_1.fqtest | 6 +- .../testdata/flavours/pgpro12/16396_1.fqtest | 6 +- .../testdata/flavours/pgpro12/16406_1.fqtest | 6 +- .../testdata/flavours/pgpro13/16396_1.fqtest | 6 +- .../testdata/flavours/pgpro13/16406_1.fqtest | 6 +- .../testdata/flavours/pgpro14/16396_1.fqtest | 6 +- .../testdata/flavours/pgpro14/16406_1.fqtest | 6 +- .../flavours/pgproee10/16396_1.fqtest | 6 +- .../flavours/pgproee10/16403_1.fqtest | 6 +- .../flavours/pgproee11/90150_1.fqtest | 6 +- .../flavours/pgproee12/16396_1.fqtest | 6 +- .../flavours/pgproee12/16406_1.fqtest | 6 +- .../flavours/pgproee13/16396_1.fqtest | 6 +- .../flavours/pgproee13/16406_1.fqtest | 6 +- .../flavours/pgproee14/16396_1.fqtest | 6 +- .../flavours/postgres11/16396_1.fqtest | 6 +- .../flavours/postgres11/16406_1.fqtest | 6 +- .../flavours/postgres12/16396_1.fqtest | 6 +- .../flavours/postgres12/16406_1.fqtest | 6 +- .../flavours/postgres13/16407_1.fqtest | 8 +- .../flavours/postgres14/16994_1.fqtest | 10 +- .../flavours/postgres14/33233_1.fqtest | 8 +- 35 files changed, 188 insertions(+), 264 deletions(-) diff --git a/format/postgres/flavours/pgpro11/pg_heap.go b/format/postgres/flavours/pgpro11/pg_heap.go index 9332ecfdd..b336c4095 100644 --- a/format/postgres/flavours/pgpro11/pg_heap.go +++ b/format/postgres/flavours/pgpro11/pg_heap.go @@ -55,7 +55,7 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.HeapD{ PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeaderData, + DecodePageHeaderDataFn: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgpro12/pg_heap.go b/format/postgres/flavours/pgpro12/pg_heap.go index 9730da0b3..2fe9c1a65 100644 --- a/format/postgres/flavours/pgpro12/pg_heap.go +++ b/format/postgres/flavours/pgpro12/pg_heap.go @@ -56,7 +56,7 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.HeapD{ PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeaderData, + DecodePageHeaderDataFn: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgpro13/pg_heap.go b/format/postgres/flavours/pgpro13/pg_heap.go index 32b9976e9..d6a72dc18 100644 --- a/format/postgres/flavours/pgpro13/pg_heap.go +++ b/format/postgres/flavours/pgpro13/pg_heap.go @@ -56,7 +56,7 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.HeapD{ PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeaderData, + DecodePageHeaderDataFn: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgpro14/pg_heap.go b/format/postgres/flavours/pgpro14/pg_heap.go index f93189c3b..b580c64c3 100644 --- a/format/postgres/flavours/pgpro14/pg_heap.go +++ b/format/postgres/flavours/pgpro14/pg_heap.go @@ -56,7 +56,7 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.HeapD{ PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeaderData, + DecodePageHeaderDataFn: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee14/ee14/pgheap.go b/format/postgres/flavours/pgproee14/ee14/pgheap.go index eeacb57e5..be18258fa 100644 --- a/format/postgres/flavours/pgproee14/ee14/pgheap.go +++ b/format/postgres/flavours/pgproee14/ee14/pgheap.go @@ -15,9 +15,7 @@ import ( /* 16 | 2 */ // LocationIndex pd_special; /* 18 | 2 */ // uint16 pd_pagesize_version; /* 20 | 0 */ // ItemIdData pd_linp[]; -func DecodePageHeaderData(heap *common14.HeapD, d *decode.D) { - page := heap.Page - +func DecodePageHeaderData(page *common14.HeapPage, d *decode.D) { d.FieldStruct("pd_lsn", func(d *decode.D) { /* 0 | 4 */ // uint32 xlogid; /* 4 | 4 */ // uint32 xrecoff; @@ -31,11 +29,9 @@ func DecodePageHeaderData(heap *common14.HeapD, d *decode.D) { page.PdSpecial = uint16(d.FieldU16("pd_special")) page.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) - // ItemIdData pd_linp[]; - page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) - d.FieldArray("pd_linp", func(d *decode.D) { - common14.DecodeItemIds(heap, d) - }) + page.BytesPosSpecial = page.BytesPosBegin + int64(page.PdSpecial) + page.PosItemsEnd = (page.BytesPosBegin * 8) + int64(page.PdLower*8) + page.PosFreeSpaceEnd = (page.BytesPosBegin * 8) + int64(page.PdUpper*8) } // type = struct HeapPageSpecialData { @@ -48,7 +44,7 @@ func DecodePageHeaderData(heap *common14.HeapD, d *decode.D) { func DecodePageSpecial(heap *common14.HeapD, d *decode.D) { page := heap.Page - specialPos := int64(page.PagePosBegin*8) + int64(page.PdSpecial*8) + specialPos := page.BytesPosSpecial * 8 d.SeekAbs(specialPos) d.FieldStruct("special_data", func(d *decode.D) { diff --git a/format/postgres/flavours/postgres11/pg_heap.go b/format/postgres/flavours/postgres11/pg_heap.go index 3ff7d4de2..949496f37 100644 --- a/format/postgres/flavours/postgres11/pg_heap.go +++ b/format/postgres/flavours/postgres11/pg_heap.go @@ -68,7 +68,7 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.HeapD{ PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeaderData, + DecodePageHeaderDataFn: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres12/pg_heap.go b/format/postgres/flavours/postgres12/pg_heap.go index 8764b7a03..5f1dd6744 100644 --- a/format/postgres/flavours/postgres12/pg_heap.go +++ b/format/postgres/flavours/postgres12/pg_heap.go @@ -68,7 +68,7 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.HeapD{ PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeaderData, + DecodePageHeaderDataFn: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres13/pg_heap.go b/format/postgres/flavours/postgres13/pg_heap.go index b4f5d742d..93a1048b6 100644 --- a/format/postgres/flavours/postgres13/pg_heap.go +++ b/format/postgres/flavours/postgres13/pg_heap.go @@ -49,7 +49,7 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.HeapD{ PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeaderData, + DecodePageHeaderDataFn: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres14/common14/heap_page.go b/format/postgres/flavours/postgres14/common14/heap_page.go index 0cc551962..77c9a9b14 100644 --- a/format/postgres/flavours/postgres14/common14/heap_page.go +++ b/format/postgres/flavours/postgres14/common14/heap_page.go @@ -1,5 +1,11 @@ package common14 +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + // HeapPage used in tables, indexes... // type = struct ItemIdData { @@ -14,3 +20,80 @@ type ItemIdData struct { Flags uint32 // unsigned int lp_flags: 2 Len uint32 // unsigned int lp_len: 15 } + +type HeapPage struct { + // PageHeaderData fields + PdLower uint16 + PdUpper uint16 + PdSpecial uint16 + PdPagesizeVersion uint16 + + // calculated bytes positions + BytesPosBegin int64 // bytes pos of page's beginning + BytesPosEnd int64 // bytes pos of page's ending + BytesPosSpecial int64 // bytes pos of page's special + + // calculated bits positions + PosItemsEnd int64 // bits pos of items end + PosFreeSpaceEnd int64 // bits pos free space end + + // parsed items positions + ItemIds []ItemIdData +} + +func DecodePageHeader(page *HeapPage, d *decode.D) { + d.FieldStruct("pd_lsn", func(d *decode.D) { + /* 0 | 4 */ // uint32 xlogid; + /* 4 | 4 */ // uint32 xrecoff; + d.FieldU32("xlogid", common.HexMapper) + d.FieldU32("xrecoff", common.HexMapper) + }) + d.FieldU16("pd_checksum") + d.FieldU16("pd_flags") + page.PdLower = uint16(d.FieldU16("pd_lower")) + page.PdUpper = uint16(d.FieldU16("pd_upper")) + page.PdSpecial = uint16(d.FieldU16("pd_special")) + page.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) + d.FieldU32("pd_prune_xid") + + page.BytesPosSpecial = page.BytesPosBegin + int64(page.PdSpecial) + page.PosItemsEnd = (page.BytesPosBegin * 8) + int64(page.PdLower*8) + page.PosFreeSpaceEnd = (page.BytesPosBegin * 8) + int64(page.PdUpper*8) +} + +func DecodeItemIds(page *HeapPage, d *decode.D) { + d.FieldArray("pd_linp", func(d *decode.D) { + decodeItemIdsInternal(page, d) + }) + + pos0 := d.Pos() + if pos0 > page.PosFreeSpaceEnd { + d.Fatalf("items overflows free space") + } + freeSpaceLen := page.PosFreeSpaceEnd - pos0 + d.FieldRawLen("free_space", freeSpaceLen, scalar.RawHex) +} + +func decodeItemIdsInternal(page *HeapPage, d *decode.D) { + for { + checkPos := d.Pos() + if checkPos >= page.PosItemsEnd { + break + } + /* 0: 0 | 4 */ // unsigned int lp_off: 15 + /* 1: 7 | 4 */ // unsigned int lp_flags: 2 + /* 2: 1 | 4 */ // unsigned int lp_len: 15 + d.FieldStruct("item_id", func(d *decode.D) { + itemID := ItemIdData{} + + itemPos := d.Pos() + itemID.Off = uint32(d.FieldU32("lp_off", common.LpOffMapper)) + d.SeekAbs(itemPos) + itemID.Flags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) + d.SeekAbs(itemPos) + itemID.Len = uint32(d.FieldU32("lp_len", common.LpLenMapper)) + + page.ItemIds = append(page.ItemIds, itemID) + }) + } // for pd_linp +} diff --git a/format/postgres/flavours/postgres14/common14/pg_heap.go b/format/postgres/flavours/postgres14/common14/pg_heap.go index 1d18bf67e..772feeb36 100644 --- a/format/postgres/flavours/postgres14/common14/pg_heap.go +++ b/format/postgres/flavours/postgres14/common14/pg_heap.go @@ -76,7 +76,7 @@ const ( // /* total size (bytes): 12 */ /* } t_choice; // -/* 12 | 6 */ // ItemPointerData t_ctid; +/* 12 | 6 */// ItemPointerData t_ctid; /* 18 | 2 */ // uint16 t_infomask2; /* 20 | 2 */ // uint16 t_infomask; /* 22 | 1 */ // uint8 t_hoff; @@ -118,19 +118,12 @@ type HeapD struct { // current tuple Tuple *TupleD - DecodePageHeaderDataFn func(heap *HeapD, d *decode.D) + DecodePageHeaderDataFn func(page *HeapPage, d *decode.D) DecodePageSpecialFn func(heap *HeapD, d *decode.D) } type HeapPageD struct { - PdLower uint16 - PdUpper uint16 - PdSpecial uint16 - PdPagesizeVersion uint16 - - ItemIds []ItemIdData - PagePosBegin uint64 - ItemsEnd int64 + HeapPage // pgproee PdXidBase uint64 // 8 TransactionId pd_xid_base; @@ -174,20 +167,11 @@ func decodeHeapPage(heap *HeapD, d *decode.D) { page := &HeapPageD{} heap.Page = page - pagePosBegin := common.RoundDown(heap.PageSize, uint64(d.Pos()/8)) - page.PagePosBegin = pagePosBegin - - // PageHeader d.FieldStruct("page_header", func(d *decode.D) { - heap.DecodePageHeaderDataFn(heap, d) + heap.DecodePageHeaderDataFn(&heap.Page.HeapPage, d) }) - // free space - freeSpaceEnd := int64(pagePosBegin*8) + int64(page.PdUpper*8) - freeSpaceNBits := freeSpaceEnd - d.Pos() - if freeSpaceNBits != 0 { - d.FieldRawLen("free_space", freeSpaceNBits, scalar.RawHex) - } + DecodeItemIds(&heap.Page.HeapPage, d) if uint64(page.PdSpecial) != heap.PageSize && heap.DecodePageSpecialFn != nil { heap.DecodePageSpecialFn(heap, d) @@ -199,65 +183,6 @@ func decodeHeapPage(heap *HeapD, d *decode.D) { }) } -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 PdPagesizeVersion; -/* 20 | 4 */ // TransactionId pd_prune_xid; -/* 24 | 0 */ // ItemIdData pd_linp[]; -func DecodePageHeaderData(heap *HeapD, d *decode.D) { - page := heap.Page - - d.FieldStruct("pd_lsn", func(d *decode.D) { - /* 0 | 4 */ // uint32 xlogid; - /* 4 | 4 */ // uint32 xrecoff; - d.FieldU32("xlogid", common.HexMapper) - d.FieldU32("xrecoff", common.HexMapper) - }) - d.FieldU16("pd_checksum") - d.FieldU16("pd_flags") - page.PdLower = uint16(d.FieldU16("pd_lower")) - page.PdUpper = uint16(d.FieldU16("pd_upper")) - page.PdSpecial = uint16(d.FieldU16("pd_special")) - page.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) - d.FieldU32("pd_prune_xid") - - // ItemIdData pd_linp[]; - page.ItemsEnd = int64(page.PagePosBegin*8) + int64(page.PdLower*8) - d.FieldArray("pd_linp", func(d *decode.D) { - DecodeItemIds(heap, d) - }) -} - -func DecodeItemIds(heap *HeapD, d *decode.D) { - page := heap.Page - - for { - checkPos := d.Pos() - if checkPos >= page.ItemsEnd { - break - } - /* 0: 0 | 4 */ // unsigned int lp_off: 15 - /* 1: 7 | 4 */ // unsigned int lp_flags: 2 - /* 2: 1 | 4 */ // unsigned int lp_len: 15 - d.FieldStruct("item_id", func(d *decode.D) { - itemID := ItemIdData{} - - itemPos := d.Pos() - itemID.Off = uint32(d.FieldU32("lp_off", common.LpOffMapper)) - d.SeekAbs(itemPos) - itemID.Flags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) - d.SeekAbs(itemPos) - itemID.Len = uint32(d.FieldU32("lp_len", common.LpLenMapper)) - - page.ItemIds = append(page.ItemIds, itemID) - }) - } // for pd_linp -} - func decodeTuples(heap *HeapD, d *decode.D) { page := heap.Page for i := 0; i < len(page.ItemIds); i++ { @@ -269,7 +194,7 @@ func decodeTuples(heap *HeapD, d *decode.D) { continue } - pos := int64(page.PagePosBegin)*8 + int64(id.Off)*8 + pos := int64(page.BytesPosBegin)*8 + int64(id.Off)*8 tupleDataLen := id.Len - SizeOfHeapTupleHeaderData // seek to tuple with ItemId offset @@ -333,8 +258,6 @@ func decodeTuples(heap *HeapD, d *decode.D) { d.FieldU8("t_hoff") d.FieldU8("padding0") - - //d.FieldRawLen("t_bits", int64(tupleDataLen*8), scalar.RawHex) }) // HeapTupleHeaderData d.FieldRawLen("data", int64(tupleDataLen*8), scalar.RawHex) diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/flavours/postgres14/pg_btree.go index bff4bdf81..da76b671a 100644 --- a/format/postgres/flavours/postgres14/pg_btree.go +++ b/format/postgres/flavours/postgres14/pg_btree.go @@ -4,7 +4,6 @@ import ( "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" - "github.com/wader/fq/pkg/scalar" ) const ( @@ -78,41 +77,21 @@ func DecodePgBTree(d *decode.D) any { type BTreeD struct { PageSize uint64 - page *HeapPage -} - -type HeapPage struct { - // PageHeaderData fields - PdLower uint16 - PdUpper uint16 - PdSpecial uint16 - PdPagesizeVersion uint16 - - // calculated bytes positions - bytesPosBegin int64 // bytes pos of page's beginning - bytesPosEnd int64 // bytes pos of page's ending - bytesPosSpecial int64 // bytes pos of page's special - - // calculated bits positions - posItemsEnd int64 // bits pos of items end - posFreeSpaceEnd int64 // bits pos free space end - - // parsed items positions - ItemIds []common14.ItemIdData + page *common14.HeapPage } func decodeBTreePages(btree *BTreeD, d *decode.D) { for i := 0; ; i++ { - page := &HeapPage{} + page := &common14.HeapPage{} if btree.page != nil { // use prev page - page.bytesPosBegin = btree.page.bytesPosEnd + page.BytesPosBegin = btree.page.BytesPosEnd } - page.bytesPosEnd = int64(common.TypeAlign(btree.PageSize, uint64(page.bytesPosBegin)+1)) + page.BytesPosEnd = int64(common.TypeAlign(btree.PageSize, uint64(page.BytesPosBegin)+1)) btree.page = page - pos0 := page.bytesPosBegin * 8 + pos0 := page.BytesPosBegin * 8 d.SeekAbs(pos0) if end, _ := d.TryEnd(); end { @@ -137,47 +116,25 @@ func decodeBTreeMetaPage(btree *BTreeD, d *decode.D) { page := btree.page d.FieldStruct("page_header", func(d *decode.D) { - decodePageHeader(btree, d) + common14.DecodePageHeader(page, d) }) d.FieldStruct("meta_page_data", func(d *decode.D) { decodeBTMetaPageData(btree, d) }) pos0 := d.Pos() - pos1 := int64(btree.page.bytesPosSpecial) * 8 + pos1 := int64(btree.page.BytesPosSpecial) * 8 d.FieldRawLen("unused0", pos1-pos0) d.FieldStruct("page_opaque_data", func(d *decode.D) { decodeBTPageOpaqueData(btree, d) }) pos2 := d.Pos() bytesPos2 := pos2 / 8 - if bytesPos2 != page.bytesPosEnd { + if bytesPos2 != page.BytesPosEnd { d.Fatalf("invalid pos after read page_opaque_data on meta page\n") } } -func decodePageHeader(btree *BTreeD, d *decode.D) { - page := btree.page - - d.FieldStruct("pd_lsn", func(d *decode.D) { - /* 0 | 4 */ // uint32 xlogid; - /* 4 | 4 */ // uint32 xrecoff; - d.FieldU32("xlogid", common.HexMapper) - d.FieldU32("xrecoff", common.HexMapper) - }) - d.FieldU16("pd_checksum") - d.FieldU16("pd_flags") - page.PdLower = uint16(d.FieldU16("pd_lower")) - page.PdUpper = uint16(d.FieldU16("pd_upper")) - page.PdSpecial = uint16(d.FieldU16("pd_special")) - page.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) - d.FieldU32("pd_prune_xid") - - page.bytesPosSpecial = page.bytesPosBegin + int64(page.PdSpecial) - page.posItemsEnd = (page.bytesPosBegin * 8) + int64(page.PdLower*8) - page.posFreeSpaceEnd = (page.bytesPosBegin * 8) + int64(page.PdUpper*8) -} - func decodeBTMetaPageData(btree *BTreeD, d *decode.D) { /* 0 | 4 */ // uint32 btm_magic /* 4 | 4 */ // uint32 btm_version @@ -252,64 +209,29 @@ func decodeBTreePage(btree *BTreeD, d *decode.D) { page := btree.page d.FieldStruct("page_header", func(d *decode.D) { - decodePageHeader(btree, d) + common14.DecodePageHeader(page, d) }) pos0 := d.Pos() - pos1 := int64(btree.page.bytesPosSpecial) * 8 + pos1 := int64(btree.page.BytesPosSpecial) * 8 d.SeekAbs(pos1) d.FieldStruct("page_opaque_data", func(d *decode.D) { decodeBTPageOpaqueData(btree, d) }) pos2 := d.Pos() bytesPos2 := pos2 / 8 - if bytesPos2 != page.bytesPosEnd { + if bytesPos2 != page.BytesPosEnd { d.Fatalf("invalid pos after read page_opaque_data on btree page\n") } d.SeekAbs(pos0) - d.FieldArray("pd_linp", func(d *decode.D) { - decodeItemIds(btree, d) - }) + common14.DecodeItemIds(page, d) d.FieldArray("tuples", func(d *decode.D) { decodeIndexTuples(btree, d) }) } -func decodeItemIds(btree *BTreeD, d *decode.D) { - page := btree.page - - for { - checkPos := d.Pos() - if checkPos >= page.posItemsEnd { - break - } - /* 0: 0 | 4 */ // unsigned int lp_off: 15 - /* 1: 7 | 4 */ // unsigned int lp_flags: 2 - /* 2: 1 | 4 */ // unsigned int lp_len: 15 - d.FieldStruct("item_id", func(d *decode.D) { - itemID := common14.ItemIdData{} - - itemPos := d.Pos() - itemID.Off = uint32(d.FieldU32("lp_off", common.LpOffMapper)) - d.SeekAbs(itemPos) - itemID.Flags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) - d.SeekAbs(itemPos) - itemID.Len = uint32(d.FieldU32("lp_len", common.LpLenMapper)) - - page.ItemIds = append(page.ItemIds, itemID) - }) - } // for pd_linp - - pos0 := d.Pos() - if pos0 > page.posFreeSpaceEnd { - d.Fatalf("items overflows free space") - } - freeSpaceLen := page.posFreeSpaceEnd - pos0 - d.FieldRawLen("free_space", freeSpaceLen, scalar.RawHex) -} - func decodeIndexTuples(btree *BTreeD, d *decode.D) { page := btree.page @@ -322,7 +244,7 @@ func decodeIndexTuples(btree *BTreeD, d *decode.D) { continue } - pos := int64(page.bytesPosBegin)*8 + int64(id.Off)*8 + pos := int64(page.BytesPosBegin)*8 + int64(id.Off)*8 // seek to tuple with ItemId offset d.SeekAbs(pos) diff --git a/format/postgres/flavours/postgres14/pg_heap.go b/format/postgres/flavours/postgres14/pg_heap.go index ce2758ebb..87ca4acd8 100644 --- a/format/postgres/flavours/postgres14/pg_heap.go +++ b/format/postgres/flavours/postgres14/pg_heap.go @@ -22,7 +22,7 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.HeapD{ PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeaderData, + DecodePageHeaderDataFn: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest index 06b88e4d4..940b06065 100644 --- a/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro11 ".[0].page_header.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro11 ".[0].pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[60]{}: item_id 0x108-0x10b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[60]{}: item_id 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_off: 384 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_len: 121 0x108-0x10b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest index 605f820db..6c856551c 100644 --- a/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro11 ".[0].page_header.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro11 ".[0].pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest index 517e59333..a63ea7c53 100644 --- a/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro12 ".[0].page_header.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro12 ".[0].pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[60]{}: item_id 0x108-0x10b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[60]{}: item_id 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_off: 384 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_len: 121 0x108-0x10b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest index cad6d1add..e58cdc6dd 100644 --- a/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro12 ".[0].page_header.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro12 ".[0].pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest index f4b59129c..52e2af2dc 100644 --- a/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro13 ".[0].page_header.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro13 ".[0].pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[60]{}: item_id 0x108-0x10b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[60]{}: item_id 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_off: 384 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x108-0x10b.7 (4) 0x100| 80 81 f2 00 | .... | lp_len: 121 0x108-0x10b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest index e380abe8d..ff58dd2c3 100644 --- a/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro13 ".[0].page_header.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro13 ".[0].pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest index dbb600123..c541fbba1 100644 --- a/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro14 ".[0].page_header.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro14 ".[0].pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[71]{}: item_id 0x134-0x137.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[71]{}: item_id 0x134-0x137.7 (4) 0x130| 80 81 f2 00 | .... | lp_off: 384 0x134-0x137.7 (4) 0x130| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x134-0x137.7 (4) 0x130| 80 81 f2 00 | .... | lp_len: 121 0x134-0x137.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest index a48f1de82..5e3a3a03a 100644 --- a/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgpro14 ".[0].page_header.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=pgpro14 ".[0].pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest index 1c9fbea24..beae53925 100644 --- a/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee10 ".[0].page_header.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee10 ".[0].pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[67]{}: item_id 0x120-0x123.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[67]{}: item_id 0x120-0x123.7 (4) 0x120|68 81 f2 00 |h... | lp_off: 360 0x120-0x123.7 (4) 0x120|68 81 f2 00 |h... | lp_flags: "LP_NORMAL" (1) 0x120-0x123.7 (4) 0x120|68 81 f2 00 |h... | lp_len: 121 0x120-0x123.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest b/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest index 635c2d2cf..58addd66f 100644 --- a/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee10 ".[0].page_header.pd_linp[0,-1] | dv" 16403 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee10 ".[0].pd_linp[0,-1] | dv" 16403 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_off: 8120 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_len: 48 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[155]{}: item_id 0x280-0x283.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[155]{}: item_id 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_off: 680 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_flags: "LP_NORMAL" (1) 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_len: 48 0x280-0x283.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest b/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest index 0acab8372..c5e844623 100644 --- a/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee11 ".[0].page_header.pd_linp[0,-1] | dv" 90150 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee11 ".[0].pd_linp[0,-1] | dv" 90150 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[60]{}: item_id 0x104-0x107.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[60]{}: item_id 0x104-0x107.7 (4) 0x100| 68 81 f2 00 | h... | lp_off: 360 0x104-0x107.7 (4) 0x100| 68 81 f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x104-0x107.7 (4) 0x100| 68 81 f2 00 | h... | lp_len: 121 0x104-0x107.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest index 12553ab78..dab0d1ccb 100644 --- a/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee12 ".[0].page_header.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee12 ".[0].pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[65]{}: item_id 0x118-0x11b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[65]{}: item_id 0x118-0x11b.7 (4) 0x110| 68 81 f2 00 | h... | lp_off: 360 0x118-0x11b.7 (4) 0x110| 68 81 f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x118-0x11b.7 (4) 0x110| 68 81 f2 00 | h... | lp_len: 121 0x118-0x11b.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest b/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest index bb905ea76..805ea8744 100644 --- a/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee12 ".[0].page_header.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee12 ".[0].pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_off: 8120 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_len: 48 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[155]{}: item_id 0x280-0x283.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[155]{}: item_id 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_off: 680 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_flags: "LP_NORMAL" (1) 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_len: 48 0x280-0x283.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest index cd5d39c47..52be1562a 100644 --- a/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee13 ".[0].page_header.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee13 ".[0].pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[68]{}: item_id 0x124-0x127.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[68]{}: item_id 0x124-0x127.7 (4) 0x120| 68 81 f2 00 | h... | lp_off: 360 0x124-0x127.7 (4) 0x120| 68 81 f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x124-0x127.7 (4) 0x120| 68 81 f2 00 | h... | lp_len: 121 0x124-0x127.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest b/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest index 307c95577..8193fb36b 100644 --- a/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee13 ".[0].page_header.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee13 ".[0].pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_off: 8120 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) 0x10| b8 9f 60 00 | ..`. | lp_len: 48 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[155]{}: item_id 0x280-0x283.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[155]{}: item_id 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_off: 680 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_flags: "LP_NORMAL" (1) 0x280-0x283.7 (4) 0x280|a8 82 60 00 |..`. | lp_len: 48 0x280-0x283.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest index 85a3ba7ae..e84d4dbf0 100644 --- a/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=pgproee14 ".[0].page_header.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x14-0x17.7 (4) +$ fq -d pg_heap -o flavour=pgproee14 ".[0].pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) 0x10| 53 00 01 00 | S... | lp_off: 83 0x14-0x17.7 (4) 0x10| 53 00 01 00 | S... | lp_flags: "LP_REDIRECT" (2) 0x14-0x17.7 (4) 0x10| 53 00 01 00 | S... | lp_len: 0 0x14-0x17.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[85]{}: item_id 0x168-0x16b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[85]{}: item_id 0x168-0x16b.7 (4) 0x160| e8 81 f2 00 | .... | lp_off: 488 0x168-0x16b.7 (4) 0x160| e8 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x168-0x16b.7 (4) 0x160| e8 81 f2 00 | .... | lp_len: 121 0x168-0x16b.7 (4) diff --git a/format/postgres/testdata/flavours/postgres11/16396_1.fqtest b/format/postgres/testdata/flavours/postgres11/16396_1.fqtest index 0c2eaa74e..511eca935 100644 --- a/format/postgres/testdata/flavours/postgres11/16396_1.fqtest +++ b/format/postgres/testdata/flavours/postgres11/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=postgres11 ".[0].page_header.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres11 ".[0].pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[82]{}: item_id 0x160-0x163.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[82]{}: item_id 0x160-0x163.7 (4) 0x160|00 82 f2 00 |.... | lp_off: 512 0x160-0x163.7 (4) 0x160|00 82 f2 00 |.... | lp_flags: "LP_NORMAL" (1) 0x160-0x163.7 (4) 0x160|00 82 f2 00 |.... | lp_len: 121 0x160-0x163.7 (4) diff --git a/format/postgres/testdata/flavours/postgres11/16406_1.fqtest b/format/postgres/testdata/flavours/postgres11/16406_1.fqtest index 261ec909c..cdf9acd24 100644 --- a/format/postgres/testdata/flavours/postgres11/16406_1.fqtest +++ b/format/postgres/testdata/flavours/postgres11/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=postgres11 ".[0].page_header.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres11 ".[0].pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/postgres12/16396_1.fqtest b/format/postgres/testdata/flavours/postgres12/16396_1.fqtest index 5926a2d26..f3f5683e5 100644 --- a/format/postgres/testdata/flavours/postgres12/16396_1.fqtest +++ b/format/postgres/testdata/flavours/postgres12/16396_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=postgres12 ".[0].page_header.pd_linp[0,-1] | dv" 16396 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres12 ".[0].pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[81]{}: item_id 0x15c-0x15f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[81]{}: item_id 0x15c-0x15f.7 (4) 0x150| 00 82 f2 00| ....| lp_off: 512 0x15c-0x15f.7 (4) 0x150| 00 82 f2 00| ....| lp_flags: "LP_NORMAL" (1) 0x15c-0x15f.7 (4) 0x150| 00 82 f2 00| ....| lp_len: 121 0x15c-0x15f.7 (4) diff --git a/format/postgres/testdata/flavours/postgres12/16406_1.fqtest b/format/postgres/testdata/flavours/postgres12/16406_1.fqtest index 6ea97d77a..63dc3ae6e 100644 --- a/format/postgres/testdata/flavours/postgres12/16406_1.fqtest +++ b/format/postgres/testdata/flavours/postgres12/16406_1.fqtest @@ -1,9 +1,9 @@ -$ fq -d pg_heap -o flavour=postgres12 ".[0].page_header.pd_linp[0,-1] | dv" 16406 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres12 ".[0].pd_linp[0,-1] | dv" 16406 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/postgres13/16407_1.fqtest b/format/postgres/testdata/flavours/postgres13/16407_1.fqtest index 87941bd67..bc7bd0526 100644 --- a/format/postgres/testdata/flavours/postgres13/16407_1.fqtest +++ b/format/postgres/testdata/flavours/postgres13/16407_1.fqtest @@ -1,13 +1,13 @@ -$ fq -d pg_heap -o flavour=postgres13 ".[0].page_header.pd_linp[0, 1, -1] | dv" 16407 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres13 ".[0].pd_linp[0, 1, -1] | dv" 16407 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) 0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) 0x10| a0 9f 60 00| ..`.| lp_off: 8096 0x1c-0x1f.7 (4) 0x10| a0 9f 60 00| ..`.| lp_flags: "LP_NORMAL" (1) 0x1c-0x1f.7 (4) 0x10| a0 9f 60 00| ..`.| lp_len: 48 0x1c-0x1f.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[156]{}: item_id 0x288-0x28b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) 0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/postgres14/16994_1.fqtest b/format/postgres/testdata/flavours/postgres14/16994_1.fqtest index 62b4ffcd4..9e4e6d68b 100644 --- a/format/postgres/testdata/flavours/postgres14/16994_1.fqtest +++ b/format/postgres/testdata/flavours/postgres14/16994_1.fqtest @@ -1,17 +1,17 @@ -$ fq -d pg_heap -o flavour=postgres14 ".[0].page_header.pd_linp[0, 1, 2, -1] | dv" 16994 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres14 ".[0].pd_linp[0, 1, 2, -1] | dv" 16994 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 00 80 01 00 | .... | lp_off: 0 0x18-0x1b.7 (4) 0x10| 00 80 01 00 | .... | lp_flags: "LP_DEAD" (3) 0x18-0x1b.7 (4) 0x10| 00 80 01 00 | .... | lp_len: 0 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) 0x10| e0 9f 38 00| ..8.| lp_off: 8160 0x1c-0x1f.7 (4) 0x10| e0 9f 38 00| ..8.| lp_flags: "LP_NORMAL" (1) 0x1c-0x1f.7 (4) 0x10| e0 9f 38 00| ..8.| lp_len: 28 0x1c-0x1f.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[2]{}: item_id 0x20-0x23.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[2]{}: item_id 0x20-0x23.7 (4) 0x20|c0 9f 38 00 |..8. | lp_off: 8128 0x20-0x23.7 (4) 0x20|c0 9f 38 00 |..8. | lp_flags: "LP_NORMAL" (1) 0x20-0x23.7 (4) 0x20|c0 9f 38 00 |..8. | lp_len: 28 0x20-0x23.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[225]{}: item_id 0x39c-0x39f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[225]{}: item_id 0x39c-0x39f.7 (4) 0x390| e0 83 38 00| ..8.| lp_off: 992 0x39c-0x39f.7 (4) 0x390| e0 83 38 00| ..8.| lp_flags: "LP_NORMAL" (1) 0x39c-0x39f.7 (4) 0x390| e0 83 38 00| ..8.| lp_len: 28 0x39c-0x39f.7 (4) diff --git a/format/postgres/testdata/flavours/postgres14/33233_1.fqtest b/format/postgres/testdata/flavours/postgres14/33233_1.fqtest index bc0f77aec..c85b0d98a 100644 --- a/format/postgres/testdata/flavours/postgres14/33233_1.fqtest +++ b/format/postgres/testdata/flavours/postgres14/33233_1.fqtest @@ -1,13 +1,13 @@ -$ fq -d pg_heap -o flavour=postgres14 ".[0].page_header.pd_linp[0, 1, -1] | dv" 33233 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +$ fq -d pg_heap -o flavour=postgres14 ".[0].pd_linp[0, 1, -1] | dv" 33233 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) 0x10| 4d 00 01 00 | M... | lp_off: 77 0x18-0x1b.7 (4) 0x10| 4d 00 01 00 | M... | lp_flags: "LP_REDIRECT" (2) 0x18-0x1b.7 (4) 0x10| 4d 00 01 00 | M... | lp_len: 0 0x18-0x1b.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) 0x10| 6a 00 01 00| j...| lp_off: 106 0x1c-0x1f.7 (4) 0x10| 6a 00 01 00| j...| lp_flags: "LP_REDIRECT" (2) 0x1c-0x1f.7 (4) 0x10| 6a 00 01 00| j...| lp_len: 0 0x1c-0x1f.7 (4) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].page_header.pd_linp[119]{}: item_id 0x1f4-0x1f7.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[119]{}: item_id 0x1f4-0x1f7.7 (4) 0x1f0| 80 82 f2 00 | .... | lp_off: 640 0x1f4-0x1f7.7 (4) 0x1f0| 80 82 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x1f4-0x1f7.7 (4) 0x1f0| 80 82 f2 00 | .... | lp_len: 121 0x1f4-0x1f7.7 (4) From 35124bf2ffb7d785a09835cab995eea58fbf4af9 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 21 Sep 2022 15:36:09 +0300 Subject: [PATCH 079/141] postgres: pg_heap refactoring --- .../flavours/pgproee14/ee14/pgheap.go | 9 ++-- .../flavours/postgres14/common14/pg_heap.go | 41 +++++++++---------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/format/postgres/flavours/pgproee14/ee14/pgheap.go b/format/postgres/flavours/pgproee14/ee14/pgheap.go index be18258fa..db3af0a94 100644 --- a/format/postgres/flavours/pgproee14/ee14/pgheap.go +++ b/format/postgres/flavours/pgproee14/ee14/pgheap.go @@ -43,14 +43,15 @@ func DecodePageHeaderData(page *common14.HeapPage, d *decode.D) { /* total size (bytes): 24 */ func DecodePageSpecial(heap *common14.HeapD, d *decode.D) { page := heap.Page + special := heap.Special specialPos := page.BytesPosSpecial * 8 d.SeekAbs(specialPos) d.FieldStruct("special_data", func(d *decode.D) { - page.PdXidBase = d.FieldU64("pd_xid_base") - page.PdMultiBase = d.FieldU64("pd_multi_base") - page.PdPruneXid = d.FieldU32("pd_prune_xid") - page.PdMagic = d.FieldU32("pd_magic") + special.PdXidBase = d.FieldU64("pd_xid_base") + special.PdMultiBase = d.FieldU64("pd_multi_base") + special.PdPruneXid = d.FieldU32("pd_prune_xid") + special.PdMagic = d.FieldU32("pd_magic") }) } diff --git a/format/postgres/flavours/postgres14/common14/pg_heap.go b/format/postgres/flavours/postgres14/common14/pg_heap.go index 772feeb36..9b537102e 100644 --- a/format/postgres/flavours/postgres14/common14/pg_heap.go +++ b/format/postgres/flavours/postgres14/common14/pg_heap.go @@ -76,7 +76,7 @@ const ( // /* total size (bytes): 12 */ /* } t_choice; // -/* 12 | 6 */// ItemPointerData t_ctid; +/* 12 | 6 */ // ItemPointerData t_ctid; /* 18 | 2 */ // uint16 t_infomask2; /* 20 | 2 */ // uint16 t_infomask; /* 22 | 1 */ // uint8 t_hoff; @@ -114,7 +114,10 @@ type HeapD struct { PageSize uint64 // current Page - Page *HeapPageD + Page *HeapPage + // Page special data + Special *PageSpecial + // current tuple Tuple *TupleD @@ -122,9 +125,7 @@ type HeapD struct { DecodePageSpecialFn func(heap *HeapD, d *decode.D) } -type HeapPageD struct { - HeapPage - +type PageSpecial struct { // pgproee PdXidBase uint64 // 8 TransactionId pd_xid_base; PdMultiBase uint64 // 8 TransactionId pd_multi_base; @@ -149,9 +150,6 @@ func decodeHeapPages(heap *HeapD, d *decode.D) { return } - page := &HeapPageD{} - heap.Page = page - d.FieldStruct("page", func(d *decode.D) { decodeHeapPage(heap, d) }) @@ -164,14 +162,15 @@ func decodeHeapPages(heap *HeapD, d *decode.D) { } func decodeHeapPage(heap *HeapD, d *decode.D) { - page := &HeapPageD{} + page := &HeapPage{} heap.Page = page + heap.Special = &PageSpecial{} d.FieldStruct("page_header", func(d *decode.D) { - heap.DecodePageHeaderDataFn(&heap.Page.HeapPage, d) + heap.DecodePageHeaderDataFn(page, d) }) - DecodeItemIds(&heap.Page.HeapPage, d) + DecodeItemIds(page, d) if uint64(page.PdSpecial) != heap.PageSize && heap.DecodePageSpecialFn != nil { heap.DecodePageSpecialFn(heap, d) @@ -319,7 +318,7 @@ func decodeInfomask(heap *HeapD, d *decode.D, infomask uint64) { /* 12 */ // DatumTupleFields t_datum; // } t_choice; func decodeTChoice(heap *HeapD, d *decode.D) { - page := heap.Page + special := heap.Special tuple := heap.Tuple pos1 := d.Pos() @@ -334,8 +333,8 @@ func decodeTChoice(heap *HeapD, d *decode.D) { // /* total size (bytes): 12 */ d.FieldStruct("t_heap", func(d *decode.D) { - d.FieldU32("t_xmin", TransactionMapper{Heap: heap, Page: page, Tuple: tuple}) - d.FieldU32("t_xmax", TransactionMapper{Heap: heap, Page: page, Tuple: tuple}) + d.FieldU32("t_xmin", TransactionMapper{Heap: heap, Special: special, Tuple: tuple}) + d.FieldU32("t_xmax", TransactionMapper{Heap: heap, Special: special, Tuple: tuple}) d.FieldStruct("t_field3", func(d *decode.D) { pos2 := d.Pos() d.FieldU32("t_cid") @@ -360,21 +359,21 @@ func decodeTChoice(heap *HeapD, d *decode.D) { } type TransactionMapper struct { - Heap *HeapD - Page *HeapPageD - Tuple *TupleD + Heap *HeapD + Special *PageSpecial + Tuple *TupleD } func (m TransactionMapper) MapScalar(s scalar.S) (scalar.S, error) { xid := s.ActualU() - if m.Page.PdXidBase != 0 && m.Tuple.IsMulti && common.TransactionIDIsNormal(xid) { - xid64 := xid + m.Page.PdXidBase + if m.Special.PdXidBase != 0 && m.Tuple.IsMulti && common.TransactionIDIsNormal(xid) { + xid64 := xid + m.Special.PdXidBase s.Sym = fmt.Sprintf("%d", xid64) } - if m.Page.PdMultiBase != 0 && !m.Tuple.IsMulti && common.TransactionIDIsNormal(xid) { - xid64 := xid + m.Page.PdMultiBase + if m.Special.PdMultiBase != 0 && !m.Tuple.IsMulti && common.TransactionIDIsNormal(xid) { + xid64 := xid + m.Special.PdMultiBase s.Sym = fmt.Sprintf("%d", xid64) } From 7b52149c6b443103ffae8e1305959fc4cb981a7b Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 21 Sep 2022 15:40:47 +0300 Subject: [PATCH 080/141] postgres: refactoring --- format/postgres/flavours/pgpro11/pg_heap.go | 6 ++--- format/postgres/flavours/pgpro12/pg_heap.go | 6 ++--- format/postgres/flavours/pgpro13/pg_heap.go | 6 ++--- format/postgres/flavours/pgpro14/pg_heap.go | 6 ++--- format/postgres/flavours/pgproee10/pg_heap.go | 8 +++--- format/postgres/flavours/pgproee11/pg_heap.go | 8 +++--- format/postgres/flavours/pgproee12/pg_heap.go | 8 +++--- format/postgres/flavours/pgproee13/pg_heap.go | 8 +++--- .../flavours/pgproee14/ee14/pgheap.go | 4 +-- format/postgres/flavours/pgproee14/pg_heap.go | 8 +++--- .../postgres/flavours/postgres11/pg_heap.go | 6 ++--- .../postgres/flavours/postgres12/pg_heap.go | 6 ++--- .../postgres/flavours/postgres13/pg_heap.go | 6 ++--- .../flavours/postgres14/common14/heap_page.go | 10 +++---- .../flavours/postgres14/common14/pg_heap.go | 26 +++++++++---------- .../postgres/flavours/postgres14/pg_btree.go | 16 ++++++------ .../postgres/flavours/postgres14/pg_heap.go | 6 ++--- 17 files changed, 72 insertions(+), 72 deletions(-) diff --git a/format/postgres/flavours/pgpro11/pg_heap.go b/format/postgres/flavours/pgpro11/pg_heap.go index b336c4095..65922fe66 100644 --- a/format/postgres/flavours/pgpro11/pg_heap.go +++ b/format/postgres/flavours/pgpro11/pg_heap.go @@ -53,9 +53,9 @@ import ( /* total size (bytes): 12 */ func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeader, + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgpro12/pg_heap.go b/format/postgres/flavours/pgpro12/pg_heap.go index 2fe9c1a65..08990c299 100644 --- a/format/postgres/flavours/pgpro12/pg_heap.go +++ b/format/postgres/flavours/pgpro12/pg_heap.go @@ -54,9 +54,9 @@ import ( /* total size (bytes): 12 */ func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeader, + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgpro13/pg_heap.go b/format/postgres/flavours/pgpro13/pg_heap.go index d6a72dc18..386b404ab 100644 --- a/format/postgres/flavours/pgpro13/pg_heap.go +++ b/format/postgres/flavours/pgpro13/pg_heap.go @@ -54,9 +54,9 @@ import ( /* total size (bytes): 12 */ func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeader, + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgpro14/pg_heap.go b/format/postgres/flavours/pgpro14/pg_heap.go index b580c64c3..a6179d479 100644 --- a/format/postgres/flavours/pgpro14/pg_heap.go +++ b/format/postgres/flavours/pgpro14/pg_heap.go @@ -54,9 +54,9 @@ import ( /* total size (bytes): 12 */ func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeader, + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee10/pg_heap.go b/format/postgres/flavours/pgproee10/pg_heap.go index b78126c2a..59ae83f3d 100644 --- a/format/postgres/flavours/pgproee10/pg_heap.go +++ b/format/postgres/flavours/pgproee10/pg_heap.go @@ -55,10 +55,10 @@ import ( /* total size (bytes): 24 */ func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: ee14.DecodePageHeaderData, - DecodePageSpecialFn: ee14.DecodePageSpecial, + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: ee14.DecodePageHeaderData, + DecodePageSpecial: ee14.DecodePageSpecial, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee11/pg_heap.go b/format/postgres/flavours/pgproee11/pg_heap.go index 7a0ad78d7..3850a8999 100644 --- a/format/postgres/flavours/pgproee11/pg_heap.go +++ b/format/postgres/flavours/pgproee11/pg_heap.go @@ -74,10 +74,10 @@ import ( /* total size (bytes): 24 */ func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: ee14.DecodePageHeaderData, - DecodePageSpecialFn: ee14.DecodePageSpecial, + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: ee14.DecodePageHeaderData, + DecodePageSpecial: ee14.DecodePageSpecial, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee12/pg_heap.go b/format/postgres/flavours/pgproee12/pg_heap.go index bb218b559..a4ec069c4 100644 --- a/format/postgres/flavours/pgproee12/pg_heap.go +++ b/format/postgres/flavours/pgproee12/pg_heap.go @@ -55,10 +55,10 @@ import ( /* total size (bytes): 24 */ func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: ee14.DecodePageHeaderData, - DecodePageSpecialFn: ee14.DecodePageSpecial, + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: ee14.DecodePageHeaderData, + DecodePageSpecial: ee14.DecodePageSpecial, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee13/pg_heap.go b/format/postgres/flavours/pgproee13/pg_heap.go index 8e8501679..b1a46bbd0 100644 --- a/format/postgres/flavours/pgproee13/pg_heap.go +++ b/format/postgres/flavours/pgproee13/pg_heap.go @@ -55,10 +55,10 @@ import ( /* total size (bytes): 24 */ func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: ee14.DecodePageHeaderData, - DecodePageSpecialFn: ee14.DecodePageSpecial, + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: ee14.DecodePageHeaderData, + DecodePageSpecial: ee14.DecodePageSpecial, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee14/ee14/pgheap.go b/format/postgres/flavours/pgproee14/ee14/pgheap.go index db3af0a94..a68f8fa3a 100644 --- a/format/postgres/flavours/pgproee14/ee14/pgheap.go +++ b/format/postgres/flavours/pgproee14/ee14/pgheap.go @@ -27,7 +27,7 @@ func DecodePageHeaderData(page *common14.HeapPage, d *decode.D) { page.PdLower = uint16(d.FieldU16("pd_lower")) page.PdUpper = uint16(d.FieldU16("pd_upper")) page.PdSpecial = uint16(d.FieldU16("pd_special")) - page.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) + page.PdPageSizeVersion = uint16(d.FieldU16("pd_pagesize_version")) page.BytesPosSpecial = page.BytesPosBegin + int64(page.PdSpecial) page.PosItemsEnd = (page.BytesPosBegin * 8) + int64(page.PdLower*8) @@ -41,7 +41,7 @@ func DecodePageHeaderData(page *common14.HeapPage, d *decode.D) { /* 20 | 4 */ // uint32 pd_magic; // /* total size (bytes): 24 */ -func DecodePageSpecial(heap *common14.HeapD, d *decode.D) { +func DecodePageSpecial(heap *common14.Heap, d *decode.D) { page := heap.Page special := heap.Special diff --git a/format/postgres/flavours/pgproee14/pg_heap.go b/format/postgres/flavours/pgproee14/pg_heap.go index 05799c3da..e8129a701 100644 --- a/format/postgres/flavours/pgproee14/pg_heap.go +++ b/format/postgres/flavours/pgproee14/pg_heap.go @@ -82,10 +82,10 @@ import ( /* total size (bytes): 24 */ func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: ee14.DecodePageHeaderData, - DecodePageSpecialFn: ee14.DecodePageSpecial, + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: ee14.DecodePageHeaderData, + DecodePageSpecial: ee14.DecodePageSpecial, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres11/pg_heap.go b/format/postgres/flavours/postgres11/pg_heap.go index 949496f37..79eee072a 100644 --- a/format/postgres/flavours/postgres11/pg_heap.go +++ b/format/postgres/flavours/postgres11/pg_heap.go @@ -66,9 +66,9 @@ import ( /* total size (bytes): 6 */ func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeader, + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres12/pg_heap.go b/format/postgres/flavours/postgres12/pg_heap.go index 5f1dd6744..9ad79e93d 100644 --- a/format/postgres/flavours/postgres12/pg_heap.go +++ b/format/postgres/flavours/postgres12/pg_heap.go @@ -66,9 +66,9 @@ import ( /* total size (bytes): 6 */ func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeader, + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres13/pg_heap.go b/format/postgres/flavours/postgres13/pg_heap.go index 93a1048b6..8732e7f73 100644 --- a/format/postgres/flavours/postgres13/pg_heap.go +++ b/format/postgres/flavours/postgres13/pg_heap.go @@ -47,9 +47,9 @@ import ( /* total size (bytes): 12 */ func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeader, + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres14/common14/heap_page.go b/format/postgres/flavours/postgres14/common14/heap_page.go index 77c9a9b14..da27198db 100644 --- a/format/postgres/flavours/postgres14/common14/heap_page.go +++ b/format/postgres/flavours/postgres14/common14/heap_page.go @@ -15,7 +15,7 @@ import ( // /* total size (bytes): 4 */ -type ItemIdData struct { +type ItemId struct { Off uint32 // unsigned int lp_off: 15 Flags uint32 // unsigned int lp_flags: 2 Len uint32 // unsigned int lp_len: 15 @@ -26,7 +26,7 @@ type HeapPage struct { PdLower uint16 PdUpper uint16 PdSpecial uint16 - PdPagesizeVersion uint16 + PdPageSizeVersion uint16 // calculated bytes positions BytesPosBegin int64 // bytes pos of page's beginning @@ -38,7 +38,7 @@ type HeapPage struct { PosFreeSpaceEnd int64 // bits pos free space end // parsed items positions - ItemIds []ItemIdData + ItemIds []ItemId } func DecodePageHeader(page *HeapPage, d *decode.D) { @@ -53,7 +53,7 @@ func DecodePageHeader(page *HeapPage, d *decode.D) { page.PdLower = uint16(d.FieldU16("pd_lower")) page.PdUpper = uint16(d.FieldU16("pd_upper")) page.PdSpecial = uint16(d.FieldU16("pd_special")) - page.PdPagesizeVersion = uint16(d.FieldU16("pd_pagesize_version")) + page.PdPageSizeVersion = uint16(d.FieldU16("pd_pagesize_version")) d.FieldU32("pd_prune_xid") page.BytesPosSpecial = page.BytesPosBegin + int64(page.PdSpecial) @@ -84,7 +84,7 @@ func decodeItemIdsInternal(page *HeapPage, d *decode.D) { /* 1: 7 | 4 */ // unsigned int lp_flags: 2 /* 2: 1 | 4 */ // unsigned int lp_len: 15 d.FieldStruct("item_id", func(d *decode.D) { - itemID := ItemIdData{} + itemID := ItemId{} itemPos := d.Pos() itemID.Off = uint32(d.FieldU32("lp_off", common.LpOffMapper)) diff --git a/format/postgres/flavours/postgres14/common14/pg_heap.go b/format/postgres/flavours/postgres14/common14/pg_heap.go index 9b537102e..2b6257f3e 100644 --- a/format/postgres/flavours/postgres14/common14/pg_heap.go +++ b/format/postgres/flavours/postgres14/common14/pg_heap.go @@ -110,7 +110,7 @@ const SizeOfHeapTupleHeaderData = 24 // /* total size (bytes): 6 */ -type HeapD struct { +type Heap struct { PageSize uint64 // current Page @@ -121,8 +121,8 @@ type HeapD struct { // current tuple Tuple *TupleD - DecodePageHeaderDataFn func(page *HeapPage, d *decode.D) - DecodePageSpecialFn func(heap *HeapD, d *decode.D) + DecodePageHeaderData func(page *HeapPage, d *decode.D) + DecodePageSpecial func(heap *Heap, d *decode.D) } type PageSpecial struct { @@ -137,14 +137,14 @@ type TupleD struct { IsMulti bool } -func DecodeHeap(heap *HeapD, d *decode.D) any { +func DecodeHeap(heap *Heap, d *decode.D) any { d.SeekAbs(0) decodeHeapPages(heap, d) return nil } -func decodeHeapPages(heap *HeapD, d *decode.D) { +func decodeHeapPages(heap *Heap, d *decode.D) { for { if end, _ := d.TryEnd(); end { return @@ -161,19 +161,19 @@ func decodeHeapPages(heap *HeapD, d *decode.D) { } } -func decodeHeapPage(heap *HeapD, d *decode.D) { +func decodeHeapPage(heap *Heap, d *decode.D) { page := &HeapPage{} heap.Page = page heap.Special = &PageSpecial{} d.FieldStruct("page_header", func(d *decode.D) { - heap.DecodePageHeaderDataFn(page, d) + heap.DecodePageHeaderData(page, d) }) DecodeItemIds(page, d) - if uint64(page.PdSpecial) != heap.PageSize && heap.DecodePageSpecialFn != nil { - heap.DecodePageSpecialFn(heap, d) + if uint64(page.PdSpecial) != heap.PageSize && heap.DecodePageSpecial != nil { + heap.DecodePageSpecial(heap, d) } // Tuples @@ -182,7 +182,7 @@ func decodeHeapPage(heap *HeapD, d *decode.D) { }) } -func decodeTuples(heap *HeapD, d *decode.D) { +func decodeTuples(heap *Heap, d *decode.D) { page := heap.Page for i := 0; i < len(page.ItemIds); i++ { id := page.ItemIds[i] @@ -285,7 +285,7 @@ func decodeInfomask2(d *decode.D, infomask2 uint64) { d.FieldValueBool("heap_only_tuple", common.IsMaskSet0(infomask2, HEAP_ONLY_TUPLE)) } -func decodeInfomask(heap *HeapD, d *decode.D, infomask uint64) { +func decodeInfomask(heap *Heap, d *decode.D, infomask uint64) { tuple := heap.Tuple isMulti := common.IsMaskSet0(infomask, HEAP_XMAX_IS_MULTI) @@ -317,7 +317,7 @@ func decodeInfomask(heap *HeapD, d *decode.D, infomask uint64) { /* 12 */ // HeapTupleFields t_heap; /* 12 */ // DatumTupleFields t_datum; // } t_choice; -func decodeTChoice(heap *HeapD, d *decode.D) { +func decodeTChoice(heap *Heap, d *decode.D) { special := heap.Special tuple := heap.Tuple @@ -359,7 +359,7 @@ func decodeTChoice(heap *HeapD, d *decode.D) { } type TransactionMapper struct { - Heap *HeapD + Heap *Heap Special *PageSpecial Tuple *TupleD } diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/flavours/postgres14/pg_btree.go index da76b671a..c7644130a 100644 --- a/format/postgres/flavours/postgres14/pg_btree.go +++ b/format/postgres/flavours/postgres14/pg_btree.go @@ -67,7 +67,7 @@ const ( func DecodePgBTree(d *decode.D) any { d.SeekAbs(0) - btree := &BTreeD{ + btree := &BTree{ PageSize: common.HeapPageSize, } decodeBTreePages(btree, d) @@ -75,12 +75,12 @@ func DecodePgBTree(d *decode.D) any { return nil } -type BTreeD struct { +type BTree struct { PageSize uint64 page *common14.HeapPage } -func decodeBTreePages(btree *BTreeD, d *decode.D) { +func decodeBTreePages(btree *BTree, d *decode.D) { for i := 0; ; i++ { page := &common14.HeapPage{} @@ -112,7 +112,7 @@ func decodeBTreePages(btree *BTreeD, d *decode.D) { } } -func decodeBTreeMetaPage(btree *BTreeD, d *decode.D) { +func decodeBTreeMetaPage(btree *BTree, d *decode.D) { page := btree.page d.FieldStruct("page_header", func(d *decode.D) { @@ -135,7 +135,7 @@ func decodeBTreeMetaPage(btree *BTreeD, d *decode.D) { } } -func decodeBTMetaPageData(btree *BTreeD, d *decode.D) { +func decodeBTMetaPageData(btree *BTree, d *decode.D) { /* 0 | 4 */ // uint32 btm_magic /* 4 | 4 */ // uint32 btm_version /* 8 | 4 */ // BlockNumber btm_root @@ -171,7 +171,7 @@ func decodeBTMetaPageData(btree *BTreeD, d *decode.D) { /* 8 | 4 */ // uint32 btpo_level; /* 12 | 2 */ // uint16 btpo_flags; /* 14 | 2 */ // BTCycleId btpo_cycleid; -func decodeBTPageOpaqueData(btree *BTreeD, d *decode.D) { +func decodeBTPageOpaqueData(btree *BTree, d *decode.D) { prev := d.FieldU32("btpo_prev") next := d.FieldU32("btpo_next") d.FieldU32("btpo_level") @@ -205,7 +205,7 @@ func decodeBTPageOpaqueData(btree *BTreeD, d *decode.D) { }) } -func decodeBTreePage(btree *BTreeD, d *decode.D) { +func decodeBTreePage(btree *BTree, d *decode.D) { page := btree.page d.FieldStruct("page_header", func(d *decode.D) { @@ -232,7 +232,7 @@ func decodeBTreePage(btree *BTreeD, d *decode.D) { }) } -func decodeIndexTuples(btree *BTreeD, d *decode.D) { +func decodeIndexTuples(btree *BTree, d *decode.D) { page := btree.page for i := 0; i < len(page.ItemIds); i++ { diff --git a/format/postgres/flavours/postgres14/pg_heap.go b/format/postgres/flavours/postgres14/pg_heap.go index 87ca4acd8..56e923af1 100644 --- a/format/postgres/flavours/postgres14/pg_heap.go +++ b/format/postgres/flavours/postgres14/pg_heap.go @@ -20,9 +20,9 @@ import ( /* total size (bytes): 24 */ func DecodeHeap(d *decode.D) any { - heap := &common14.HeapD{ - PageSize: common.HeapPageSize, - DecodePageHeaderDataFn: common14.DecodePageHeader, + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) } From ae838b921be0045962e1233f8359d367180391b8 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 22 Sep 2022 13:25:57 +0300 Subject: [PATCH 081/141] postgres: move postgres.md to formats.md, add btree tests --- doc/formats.md | 54 ++ doc/postgres.md | 283 ------ .../testdata/flavours/postgres14/16404 | Bin 0 -> 16384 bytes .../flavours/postgres14/16404_1.fqtest | 46 + .../flavours/postgres14/16404_2.fqtest | 833 ++++++++++++++++++ 5 files changed, 933 insertions(+), 283 deletions(-) delete mode 100644 doc/postgres.md create mode 100644 format/postgres/testdata/flavours/postgres14/16404 create mode 100644 format/postgres/testdata/flavours/postgres14/16404_1.fqtest create mode 100644 format/postgres/testdata/flavours/postgres14/16404_2.fqtest diff --git a/doc/formats.md b/doc/formats.md index 1d9e6c395..c76543a8a 100644 --- a/doc/formats.md +++ b/doc/formats.md @@ -79,6 +79,7 @@ |`mpeg_spu` |Sub Picture Unit (DVD subtitle) || |`mpeg_ts` |MPEG Transport Stream || |[`msgpack`](#msgpack) |MessagePack || +|[`postgres`](#postgres) |PostgreSQL |`ogg` |OGG file |`ogg_page` `vorbis_packet` `opus_packet` `flac_metadatablock` `flac_frame`| |`ogg_page` |OGG page || |`opus_packet` |Opus packet |`vorbis_comment`| @@ -564,6 +565,59 @@ $ fq -d msgpack torepr file.msgpack ### References - https://github.com/msgpack/msgpack/blob/master/spec.md +## postgres + +### Decode content of pg_control file + +```sh +$ fq -d pg_control -o flavour=postgres14 d pg_control +``` + +### Specific fields can be got by request + +```sh +$ fq -d pg_control -o flavour=postgres14 ".state, .check_point_copy.redo, .wal_level" pg_control +``` + +### To see heap page's content +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0]" 16994 +``` + +### To see page's header + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].page_header" 16994 +``` + +### First and last item pointers on first page + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].pd_linp[0, -1]" 16994 +``` + +### First and last tuple on first page + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].tuples[0, -1]" 16994 +``` + +### Btree index meta page + +```sh +$ fq -d pg_btree -o flavour=postgres14 ".[0] | d" 16404 +``` + +### Btree index page + +```sh +$ fq -d pg_btree -o flavour=postgres14 ".[1]" 16404 +``` + +### References +- https://github.com/postgres/postgres/blob/REL_14_2/src/include/catalog/pg_control.h +- https://www.postgresql.org/docs/current/storage-page-layout.html + ## protobuf ### Can decode sub messages diff --git a/doc/postgres.md b/doc/postgres.md deleted file mode 100644 index a5e2cd29b..000000000 --- a/doc/postgres.md +++ /dev/null @@ -1,283 +0,0 @@ -## PostgreSQL formats - -### Supported PostgreSQL data types (`fq -d pg_heap`): - - `pg_heap` - heap, table, relation - - `pg_control` - control file data - - `pg_wal` - wal, write ahead log (not implemented yet) - - `pg_btree` - btree index (not implemented yet) - -### Supported PostgreSQL flavours (`fq -o flavour=postgres14`): -1. Standart (vanilla) PostgreSQL - - `postgres11` - - `postgres12` - - `postgres13` - - `postgres14` -2. Postgres Pro Enterprise - - `pgproee10` - - `pgproee11` - - `pgproee12` - - `pgproee13` - - `pgproee14` -3. Postgres Professional Standard - - `pgpro11` - - `pgpro12` - - `pgpro13` - - `pgpro14` - -### Supported OS -Postgres for x64 Linux deb, rpm based OS. - -### How to run? -Need to specify format, flavour for file and expression: -``` -fq -d pg_control -o flavour=postgres14 d pg_control -fq -d pg_heap -o flavour=postgres14 ".[]" 16397 -``` - -### pg_control file format - -Source code: - - [pg_control.h](https://github.com/postgres/postgres/blob/master/src/include/catalog/pg_control.h) - -To see content of pg_control run: -``` -$ fq -d pg_control -o flavour=postgres14 d pg_control - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) -0x000|68 e7 dd 05 b3 88 b3 61 |h......a | system_identifier: 7040120944989169512 -0x000| 14 05 00 00 | .... | pg_control_version: 1300 -0x000| 2d e9 0b 0c| -...| catalog_version_no: 202107181 -0x010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) -0x010| 46 a1 c2 62 00 00 00 00| F..b....| time: "Mon, 04 Jul 2022 08:13:58 UTC" (1656922438) -0x020|c0 88 d6 9a 00 00 00 00 |........ | checkPoint: "0/9AD688C0" (2597750976) - | | | checkPointCopy{}: -0x020| c0 88 d6 9a 00 00 00 00| ........| redo: "0/9AD688C0" (2597750976) -0x030|01 00 00 00 |.... | ThisTimeLineID: 1 -0x030| 01 00 00 00 | .... | PrevTimeLineID: 1 -0x030| 01 | . | fullPageWrites: 1 -0x040|4b ab 1c 00 00 00 00 00 |K....... | nextXid: 1878859 -0x040| dd 81 00 00 | .... | nextOid: 33245 -0x040| 01 00 00 00| ....| nextMulti: 1 -0x050|00 00 00 00 |.... | nextMultiOffset: 0 -0x050| d6 02 00 00 | .... | oldestXid: 726 -0x050| 01 00 00 00 | .... | oldestXidDB: 1 -0x050| 01 00 00 00| ....| oldestMulti: 1 -0x060|01 00 00 00 |.... | oldestMultiDB: 1 -0x060| 46 a1 c2 62 00 00 00 00| F..b....| time: "Mon, 04 Jul 2022 08:13:58 UTC" (1656922438) -0x070|00 00 00 00 |.... | oldestCommitTsXid: 0 -0x070| 00 00 00 00 | .... | newestCommitTsXid: 0 -0x070| 00 00 00 00 | .... | oldestActiveXid: 0 -0x080|e8 03 00 00 00 00 00 00 |........ | unloggedLSN: "0/3E8" (1000) -0x080| 00 00 00 00 00 00 00 00| ........| minRecoveryPoint: "0/0" (0) -0x090|00 00 00 00 |.... | minRecoveryPointTLI: 0 -0x090| 00 00 00 00 00 00 00 00| ........| backupStartPoint: "0/0" (0) -0x0a0|00 00 00 00 00 00 00 00 |........ | backupEndPoint: "0/0" (0) -0x0a0| 00 | . | backupEndRequired: 0 -0x0a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) -0x0b0|00 |. | wal_log_hints: 0 -0x0b0| 64 00 00 00 | d... | MaxConnections: 100 -0x0b0| 08 00 00 00 | .... | max_worker_processes: 8 -0x0b0| 0a 00 00 00| ....| max_wal_senders: 10 -0x0c0|00 00 00 00 |.... | max_prepared_xacts: 0 -0x0c0| 40 00 00 00 | @... | max_locks_per_xact: 64 -0x0c0| 00 | . | track_commit_timestamp: 0 -0x0c0| 08 00 00 00| ....| maxAlign: 8 -0x0d0|00 00 00 00 87 d6 32 41 |......2A | floatFormat: 1.234567e+06 -0x0d0| 00 20 00 00 | . .. | blcksz: 8192 -0x0d0| 00 00 02 00| ....| relseg_size: 131072 -0x0e0|00 20 00 00 |. .. | xlog_blcksz: 8192 -0x0e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 -0x0e0| 40 00 00 00 | @... | nameDataLen: 64 -0x0e0| 20 00 00 00| ...| indexMaxKeys: 32 -0x0f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 -0x0f0| 00 08 00 00 | .... | loblksize: 2048 -0x0f0| 01 | . | float8ByVal: 1 -0x0f0| 00 00 00 00| ....| data_checksum_version: 0 -0x100|00 45 fd 64 7e d4 d3 53 82 75 0a b7 d6 be c1 9a|.E.d~..S.u......| mock_authentication_nonce: "0045fd647ed4d35382750ab7d6bec19a77af72bae00f728..." (raw bits) -0x110|77 af 72 ba e0 0f 72 80 4a 57 43 fb 76 c8 98 8c|w.r...r.JWC.v...| -0x120|4b 76 27 eb |Kv'. | crc: 3945231947 -``` - -Specific fields can be got by request: -``` -$ fq -d pg_control -o flavour=postgres14 ".state, .checkPointCopy.redo, .wal_level" pg_control - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef| -0x10|06 00 00 00 |.... |.state: "DB_IN_PRODUCTION" (6) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef| -0x20| c0 88 d6 9a 00 00 00 00| ........|.checkPointCopy.redo: "0/9AD688C0" (2597750976) - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef| -0xa0| 01 00 00 00| ....|.wal_level: "WAL_LEVEL_REPLICA" (1) -``` - -### Heap data format - -Heap page structure: - - [https://www.postgresql.org/docs/current/storage-page-layout.html](https://www.postgresql.org/docs/current/storage-page-layout.html) - - [https://postgrespro.ru/docs/postgresql/14/storage-page-layout?lang=en](https://postgrespro.ru/docs/postgresql/14/storage-page-layout?lang=en) - -Heap consists of pages. You can see page content: -``` -$ fq -d pg_heap -o flavour=postgres14 ".[0]" 16397 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0]{}: HeapPage -0x0000|00 00 00 00 f0 aa 72 01 00 00 04 00 0c 01 80 01 00 20 04 20|......r.......... . | PageHeaderData{}: -* |until 0x10b.7 (268) | | -0x0104| 00 00 00 00 00 00 00 00 00 00 00 00| ............| FreeSpace: "00000000000000000000000000000000000000000000000..." (raw bits) -0x0118|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|....................| -* |until 0x17f.7 (116) | | -0x017c| e2 02 00 00 00 00 00 00 50 04 00 00 00 00 00 00| ........P.......| Tuples[0:61]: -0x0190|3d 00 04 00 02 09 18 00 3d 00 00 00 01 00 00 00 00 00 00 00|=.......=...........| -* |until 0x1ff8.7 (7801) -``` - -To get PageHeaderData you can use this request: -``` -$ fq -d pg_heap -o flavour=postgres14 ".[0].PageHeaderData" 16397 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].PageHeaderData{}: -0x000|00 00 00 00 f0 aa 72 01 |......r. | pd_lsn{}: -0x000| 00 00 | .. | pd_checksum: 0 -0x000| 04 00 | .. | pd_flags: 4 -0x000| 0c 01 | .. | pd_lower: 268 -0x000| 80 01 | .. | pd_upper: 384 -0x000| 00 20 | . | pd_special: 8192 -0x000| 04 20| . | pd_pagesize_version: 8196 -0x014|00 00 00 00 |.... | pd_prune_xid: 0 -0x014| 80 9f f2 00 00 9f f2 00 80 9e f2 00 00 9e f2 00| ................| pd_linp[0:61]: -0x028|80 9d f2 00 00 9d f2 00 80 9c f2 00 00 9c f2 00 80 9b f2 00|....................| -* |until 0x10b.7 (244) -``` - -To get first and last item pointers on first page: -``` -$ fq -d pg_heap -o flavour=postgres14 ".[0].PageHeaderData.pd_linp[0, -1]" 16397 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].PageHeaderData.pd_linp[0]{}: ItemIdData -0x14| 80 9f f2 00 | .... | lp_off: 8064 -0x14| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) -0x14| 80 9f f2 00 | .... | lp_len: 121 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].PageHeaderData.pd_linp[60]{}: ItemIdData -0x104| 80 81 f2 00 | .... | lp_off: 384 -0x104| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) -0x104| 80 81 f2 00 | .... | lp_len: 121 -``` - -First and last tuple on first page: -``` -$ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0, -1]" 16397 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].Tuples[0]{}: HeapTupleHeaderData -0x1f7c| e2 02 00 00 00 00 00 00 50 04 00 00 | ........P... | t_choice{}: -0x1f7c| 00 00 00 00| ....| t_ctid{}: -0x1f90|01 00 |.. | -0x1f90| 04 00 | .. | t_infomask2: 4 -0x1f90| 04 00 | .. | Infomask2{}: -0x1f90| 02 09 | .. | t_infomask: 2306 -0x1f90| 02 09 | .. | Infomask{}: -0x1f90| 18 | . | t_hoff: 24 -0x1f90| 01 00 00 00 01 00 00 00 00 00 00 00| ............| t_bits: "010000000100000000000000ab202020202020202020202..." (raw bits) -0x1fa4|ab 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20|. | -* |until 0x1ff8.7 (97) | | - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].Tuples[60]{}: HeapTupleHeaderData -0x17c| e2 02 00 00 00 00 00 00 50 04 00 00 | ........P... | t_choice{}: -0x17c| 00 00 00 00| ....| t_ctid{}: -0x190|3d 00 |=. | -0x190| 04 00 | .. | t_infomask2: 4 -0x190| 04 00 | .. | Infomask2{}: -0x190| 02 09 | .. | t_infomask: 2306 -0x190| 02 09 | .. | Infomask{}: -0x190| 18 | . | t_hoff: 24 -0x190| 3d 00 00 00 01 00 00 00 00 00 00 00| =...........| t_bits: "3d0000000100000000000000ab202020202020202020202..." (raw bits) -0x1a4|ab 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20|. | -* |until 0x1f8.7 (97) -``` - -Tuple contains a lot of field: -``` -$ fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0] | d" 16397 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].Tuples[0]{}: HeapTupleHeaderData - | | | t_choice{}: - | | | t_heap{}: -0x1f7c| e2 02 00 00 | .... | t_xmin: 738 -0x1f7c| 00 00 00 00 | .... | t_xmax: 0 - | | | t_field3{}: -0x1f7c| 50 04 00 00 | P... | t_cid: 1104 -0x1f7c| 50 04 00 00 | P... | t_xvac: 1104 - | | | t_datum{}: -0x1f7c| e2 02 00 00 | .... | datum_len_: 738 -0x1f7c| 00 00 00 00 | .... | datum_typmod: 0 -0x1f7c| 50 04 00 00 | P... | datum_typeid: 1104 - | | | t_ctid{}: -0x1f7c| 00 00 00 00| ....| ip_blkid: 0 -0x1f90|01 00 |.. | ip_posid: 1 -0x1f90| 04 00 | .. | t_infomask2: 4 - | | | Infomask2{}: -0x1f90| 04 00 | .. | HEAP_KEYS_UPDATED: 0 -0x1f90| 04 00 | .. | HEAP_HOT_UPDATED: 0 -0x1f90| 04 00 | .. | HEAP_ONLY_TUPLE: 0 -0x1f90| 02 09 | .. | t_infomask: 2306 - | | | Infomask{}: -0x1f90| 02 09 | .. | HEAP_HASNULL: 0 -0x1f90| 02 09 | .. | HEAP_HASVARWIDTH: 1 -0x1f90| 02 09 | .. | HEAP_HASEXTERNAL: 0 -0x1f90| 02 09 | .. | HEAP_HASOID_OLD: 0 -0x1f90| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 -0x1f90| 02 09 | .. | HEAP_COMBOCID: 0 -0x1f90| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 -0x1f90| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 -0x1f90| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 -0x1f90| 02 09 | .. | HEAP_LOCK_MASK: 0 -0x1f90| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 -0x1f90| 02 09 | .. | HEAP_XMIN_INVALID: 0 -0x1f90| 02 09 | .. | HEAP_XMIN_FROZEN: 0 -0x1f90| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 -0x1f90| 02 09 | .. | HEAP_XMAX_INVALID: 1 -0x1f90| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 -0x1f90| 02 09 | .. | HEAP_UPDATED: 0 -0x1f90| 02 09 | .. | HEAP_MOVED_OFF: 0 -0x1f90| 02 09 | .. | HEAP_MOVED_IN: 0 -0x1f90| 02 09 | .. | HEAP_MOVED: 0 -0x1f90| 18 | . | t_hoff: 24 -0x1f90| 01 00 00 00 01 00 00 00 00 00 00 00| ............| t_bits: "010000000100000000000000ab202020202020202020202..." (raw bits) -0x1fa4|ab 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20|. | -* |until 0x1ff8.7 (97) -``` - -Some of tuple fields are C unions: -``` -$ time fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0].t_choice | d" 16397 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].Tuples[0].t_choice{}: - | | | t_heap{}: -0x1f7c| e2 02 00 00 | .... | t_xmin: 738 -0x1f7c| 00 00 00 00 | .... | t_xmax: 0 - | | | t_field3{}: -0x1f7c| 50 04 00 00 | P... | t_cid: 1104 -0x1f7c| 50 04 00 00 | P... | t_xvac: 1104 - | | | t_datum{}: -0x1f7c| e2 02 00 00 | .... | datum_len_: 738 -0x1f7c| 00 00 00 00 | .... | datum_typmod: 0 -0x1f7c| 50 04 00 00 | P... | datum_typeid: 1104 -``` - -Some tuple fields are flags: -``` -$ time fq -d pg_heap -o flavour=postgres14 ".[0].Tuples[0] | .t_infomask, .Infomask" 16397 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123| -0x1f90| 02 09 | .. |.[0].Tuples[0].t_infomask: 2306 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13|0123456789abcdef0123|.[0].Tuples[0].Infomask{}: -0x1f90| 02 09 | .. | HEAP_HASNULL: 0 -0x1f90| 02 09 | .. | HEAP_HASVARWIDTH: 1 -0x1f90| 02 09 | .. | HEAP_HASEXTERNAL: 0 -0x1f90| 02 09 | .. | HEAP_HASOID_OLD: 0 -0x1f90| 02 09 | .. | HEAP_XMAX_KEYSHR_LOCK: 0 -0x1f90| 02 09 | .. | HEAP_COMBOCID: 0 -0x1f90| 02 09 | .. | HEAP_XMAX_EXCL_LOCK: 0 -0x1f90| 02 09 | .. | HEAP_XMAX_LOCK_ONLY: 0 -0x1f90| 02 09 | .. | HEAP_XMAX_SHR_LOCK: 0 -0x1f90| 02 09 | .. | HEAP_LOCK_MASK: 0 -0x1f90| 02 09 | .. | HEAP_XMIN_COMMITTED: 1 -0x1f90| 02 09 | .. | HEAP_XMIN_INVALID: 0 -0x1f90| 02 09 | .. | HEAP_XMIN_FROZEN: 0 -0x1f90| 02 09 | .. | HEAP_XMAX_COMMITTED: 0 -0x1f90| 02 09 | .. | HEAP_XMAX_INVALID: 1 -0x1f90| 02 09 | .. | HEAP_XMAX_IS_MULTI: 0 -0x1f90| 02 09 | .. | HEAP_UPDATED: 0 -0x1f90| 02 09 | .. | HEAP_MOVED_OFF: 0 -0x1f90| 02 09 | .. | HEAP_MOVED_IN: 0 -0x1f90| 02 09 | .. | HEAP_MOVED: 0 -``` \ No newline at end of file diff --git a/format/postgres/testdata/flavours/postgres14/16404 b/format/postgres/testdata/flavours/postgres14/16404 new file mode 100644 index 0000000000000000000000000000000000000000..b77a6190be64098775badd45d8189718f112c0e4 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres14/16404_1.fqtest b/format/postgres/testdata/flavours/postgres14/16404_1.fqtest new file mode 100644 index 000000000..050ffc123 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres14/16404_1.fqtest @@ -0,0 +1,46 @@ +$ fq -d pg_btree -o flavour=postgres14 ".[0] | d" 16404 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0]{}: page + | | | page_header{}: + | | | pd_lsn{}: +0x0000|00 00 00 00 |.... | xlogid: "0" (0) +0x0000| f0 42 20 09 | .B . | xrecoff: "92042F0" (153109232) +0x0000| 00 00 | .. | pd_checksum: 0 +0x0000| 00 00 | .. | pd_flags: 0 +0x0000| 48 00 | H. | pd_lower: 72 +0x0000| f0 1f| ..| pd_upper: 8176 +0x0010|f0 1f |.. | pd_special: 8176 +0x0010| 04 20 | . | pd_pagesize_version: 8196 +0x0010| 00 00 00 00 | .... | pd_prune_xid: 0 + | | | meta_page_data{}: +0x0010| 62 31 05 00 | b1.. | btm_magic: 340322 +0x0010| 04 00 00 00| ....| btm_version: 4 +0x0020|22 01 00 00 |"... | btm_root: 290 +0x0020| 02 00 00 00 | .... | btm_level: 2 +0x0020| 22 01 00 00 | "... | btm_fastroot: 290 +0x0020| 02 00 00 00| ....| btm_fastlevel: 2 +0x0030|00 00 00 00 |.... | btm_last_cleanup_num_delpages: 0 +0x0030| 00 00 00 00 | .... | hole0: 0 +0x0030| 00 00 00 00 00 00 f0 bf| ........| btm_last_cleanup_num_heap_tuples: -1 +0x0040|01 |. | btm_allequalimage: 1 +0x0040| 00 00 00 00 00 00 00 | ....... | padding0: 0 +0x0040| 00 00 00 00 00 00 00 00| ........| unused0: raw bits +0x0050|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fef.7 (8104) | | + | | | page_opaque_data{}: +0x1ff0|00 00 00 00 |.... | btpo_prev: 0 +0x1ff0| 00 00 00 00 | .... | btpo_next: 0 +0x1ff0| 00 00 00 00 | .... | btpo_level: 0 +0x1ff0| 08 00 | .. | btpo_flags: 8 +0x1ff0| 00 00| ..| btpo_cycleid: 0 + | | | flags{}: + | | | is_leftmost: true + | | | is_rightmost: true + | | | is_leaf: false + | | | is_root: false + | | | is_deleted: false + | | | is_meta: true + | | | is_half_dead: false + | | | is_ignore: false + | | | has_garbage: false + | | | is_incomplete_split: false + | | | has_full_xid: false diff --git a/format/postgres/testdata/flavours/postgres14/16404_2.fqtest b/format/postgres/testdata/flavours/postgres14/16404_2.fqtest new file mode 100644 index 000000000..94079e749 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres14/16404_2.fqtest @@ -0,0 +1,833 @@ +$ fq -d pg_btree -o flavour=postgres14 ".[] | d" 16404 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0]{}: page + | | | page_header{}: + | | | pd_lsn{}: +0x0000|00 00 00 00 |.... | xlogid: "0" (0) +0x0000| f0 42 20 09 | .B . | xrecoff: "92042F0" (153109232) +0x0000| 00 00 | .. | pd_checksum: 0 +0x0000| 00 00 | .. | pd_flags: 0 +0x0000| 48 00 | H. | pd_lower: 72 +0x0000| f0 1f| ..| pd_upper: 8176 +0x0010|f0 1f |.. | pd_special: 8176 +0x0010| 04 20 | . | pd_pagesize_version: 8196 +0x0010| 00 00 00 00 | .... | pd_prune_xid: 0 + | | | meta_page_data{}: +0x0010| 62 31 05 00 | b1.. | btm_magic: 340322 +0x0010| 04 00 00 00| ....| btm_version: 4 +0x0020|22 01 00 00 |"... | btm_root: 290 +0x0020| 02 00 00 00 | .... | btm_level: 2 +0x0020| 22 01 00 00 | "... | btm_fastroot: 290 +0x0020| 02 00 00 00| ....| btm_fastlevel: 2 +0x0030|00 00 00 00 |.... | btm_last_cleanup_num_delpages: 0 +0x0030| 00 00 00 00 | .... | hole0: 0 +0x0030| 00 00 00 00 00 00 f0 bf| ........| btm_last_cleanup_num_heap_tuples: -1 +0x0040|01 |. | btm_allequalimage: 1 +0x0040| 00 00 00 00 00 00 00 | ....... | padding0: 0 +0x0040| 00 00 00 00 00 00 00 00| ........| unused0: raw bits +0x0050|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fef.7 (8104) | | + | | | page_opaque_data{}: +0x1ff0|00 00 00 00 |.... | btpo_prev: 0 +0x1ff0| 00 00 00 00 | .... | btpo_next: 0 +0x1ff0| 00 00 00 00 | .... | btpo_level: 0 +0x1ff0| 08 00 | .. | btpo_flags: 8 +0x1ff0| 00 00| ..| btpo_cycleid: 0 + | | | flags{}: + | | | is_leftmost: true + | | | is_rightmost: true + | | | is_leaf: false + | | | is_root: false + | | | is_deleted: false + | | | is_meta: true + | | | is_half_dead: false + | | | is_ignore: false + | | | has_garbage: false + | | | is_incomplete_split: false + | | | has_full_xid: false + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1]{}: page + | | | page_header{}: + | | | pd_lsn{}: +0x2000|00 00 00 00 |.... | xlogid: "0" (0) +0x2000| 68 c2 e8 07 | h... | xrecoff: "7E8C268" (132694632) +0x2000| 00 00 | .. | pd_checksum: 0 +0x2000| 00 00 | .. | pd_flags: 0 +0x2000| d4 05 | .. | pd_lower: 1492 +0x2000| 00 09| ..| pd_upper: 2304 +0x2010|f0 1f |.. | pd_special: 8176 +0x2010| 04 20 | . | pd_pagesize_version: 8196 +0x2010| 00 00 00 00 | .... | pd_prune_xid: 0 + | | | pd_linp[0:367]: + | | | [0]{}: item_id +0x2010| 00 89 20 00 | .. . | lp_off: 2304 +0x2010| 00 89 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x2010| 00 89 20 00 | .. . | lp_len: 16 + | | | [1]{}: item_id +0x2010| e0 9f 20 00| .. .| lp_off: 8160 +0x2010| e0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) +0x2010| e0 9f 20 00| .. .| lp_len: 16 + | | | [2]{}: item_id +0x2020|d0 9f 20 00 |.. . | lp_off: 8144 +0x2020|d0 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) +0x2020|d0 9f 20 00 |.. . | lp_len: 16 + | | | [3]{}: item_id +0x2020| c0 9f 20 00 | .. . | lp_off: 8128 +0x2020| c0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x2020| c0 9f 20 00 | .. . | lp_len: 16 + | | | [4]{}: item_id +0x2020| b0 9f 20 00 | .. . | lp_off: 8112 +0x2020| b0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x2020| b0 9f 20 00 | .. . | lp_len: 16 + | | | [5]{}: item_id +0x2020| a0 9f 20 00| .. .| lp_off: 8096 +0x2020| a0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) +0x2020| a0 9f 20 00| .. .| lp_len: 16 + | | | [6]{}: item_id +0x2030|90 9f 20 00 |.. . | lp_off: 8080 +0x2030|90 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) +0x2030|90 9f 20 00 |.. . | lp_len: 16 + | | | [7]{}: item_id +0x2030| 80 9f 20 00 | .. . | lp_off: 8064 +0x2030| 80 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x2030| 80 9f 20 00 | .. . | lp_len: 16 + | | | [8]{}: item_id +0x2030| 70 9f 20 00 | p. . | lp_off: 8048 +0x2030| 70 9f 20 00 | p. . | lp_flags: "LP_NORMAL" (1) +0x2030| 70 9f 20 00 | p. . | lp_len: 16 + | | | [9]{}: item_id +0x2030| 60 9f 20 00| `. .| lp_off: 8032 +0x2030| 60 9f 20 00| `. .| lp_flags: "LP_NORMAL" (1) +0x2030| 60 9f 20 00| `. .| lp_len: 16 + | | | [10]{}: item_id +0x2040|50 9f 20 00 |P. . | lp_off: 8016 +0x2040|50 9f 20 00 |P. . | lp_flags: "LP_NORMAL" (1) +0x2040|50 9f 20 00 |P. . | lp_len: 16 + | | | [11]{}: item_id +0x2040| 40 9f 20 00 | @. . | lp_off: 8000 +0x2040| 40 9f 20 00 | @. . | lp_flags: "LP_NORMAL" (1) +0x2040| 40 9f 20 00 | @. . | lp_len: 16 + | | | [12]{}: item_id +0x2040| 30 9f 20 00 | 0. . | lp_off: 7984 +0x2040| 30 9f 20 00 | 0. . | lp_flags: "LP_NORMAL" (1) +0x2040| 30 9f 20 00 | 0. . | lp_len: 16 + | | | [13]{}: item_id +0x2040| 20 9f 20 00| . .| lp_off: 7968 +0x2040| 20 9f 20 00| . .| lp_flags: "LP_NORMAL" (1) +0x2040| 20 9f 20 00| . .| lp_len: 16 + | | | [14]{}: item_id +0x2050|10 9f 20 00 |.. . | lp_off: 7952 +0x2050|10 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) +0x2050|10 9f 20 00 |.. . | lp_len: 16 + | | | [15]{}: item_id +0x2050| 00 9f 20 00 | .. . | lp_off: 7936 +0x2050| 00 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x2050| 00 9f 20 00 | .. . | lp_len: 16 + | | | [16]{}: item_id +0x2050| f0 9e 20 00 | .. . | lp_off: 7920 +0x2050| f0 9e 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x2050| f0 9e 20 00 | .. . | lp_len: 16 + | | | [17]{}: item_id +0x2050| e0 9e 20 00| .. .| lp_off: 7904 +0x2050| e0 9e 20 00| .. .| lp_flags: "LP_NORMAL" (1) +0x2050| e0 9e 20 00| .. .| lp_len: 16 + | | | [18]{}: item_id +0x2060|d0 9e 20 00 |.. . | lp_off: 7888 +0x2060|d0 9e 20 00 |.. . | lp_flags: "LP_NORMAL" (1) +0x2060|d0 9e 20 00 |.. . | lp_len: 16 + | | | [19]{}: item_id +0x2060| c0 9e 20 00 | .. . | lp_off: 7872 +0x2060| c0 9e 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x2060| c0 9e 20 00 | .. . | lp_len: 16 + | | | [20]{}: item_id +0x2060| b0 9e 20 00 | .. . | lp_off: 7856 +0x2060| b0 9e 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x2060| b0 9e 20 00 | .. . | lp_len: 16 + | | | [21]{}: item_id +0x2060| a0 9e 20 00| .. .| lp_off: 7840 +0x2060| a0 9e 20 00| .. .| lp_flags: "LP_NORMAL" (1) +0x2060| a0 9e 20 00| .. .| lp_len: 16 + | | | [22]{}: item_id +0x2070|90 9e 20 00 |.. . | lp_off: 7824 +0x2070|90 9e 20 00 |.. . | lp_flags: "LP_NORMAL" (1) +0x2070|90 9e 20 00 |.. . | lp_len: 16 + | | | [23]{}: item_id +0x2070| 80 9e 20 00 | .. . | lp_off: 7808 +0x2070| 80 9e 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x2070| 80 9e 20 00 | .. . | lp_len: 16 + | | | [24]{}: item_id +0x2070| 70 9e 20 00 | p. . | lp_off: 7792 +0x2070| 70 9e 20 00 | p. . | lp_flags: "LP_NORMAL" (1) +0x2070| 70 9e 20 00 | p. . | lp_len: 16 + | | | [25]{}: item_id +0x2070| 60 9e 20 00| `. .| lp_off: 7776 +0x2070| 60 9e 20 00| `. .| lp_flags: "LP_NORMAL" (1) +0x2070| 60 9e 20 00| `. .| lp_len: 16 + | | | [26]{}: item_id +0x2080|50 9e 20 00 |P. . | lp_off: 7760 +0x2080|50 9e 20 00 |P. . | lp_flags: "LP_NORMAL" (1) +0x2080|50 9e 20 00 |P. . | lp_len: 16 + | | | [27]{}: item_id +0x2080| 40 9e 20 00 | @. . | lp_off: 7744 +0x2080| 40 9e 20 00 | @. . | lp_flags: "LP_NORMAL" (1) +0x2080| 40 9e 20 00 | @. . | lp_len: 16 + | | | [28]{}: item_id +0x2080| 30 9e 20 00 | 0. . | lp_off: 7728 +0x2080| 30 9e 20 00 | 0. . | lp_flags: "LP_NORMAL" (1) +0x2080| 30 9e 20 00 | 0. . | lp_len: 16 + | | | [29]{}: item_id +0x2080| 20 9e 20 00| . .| lp_off: 7712 +0x2080| 20 9e 20 00| . .| lp_flags: "LP_NORMAL" (1) +0x2080| 20 9e 20 00| . .| lp_len: 16 + | | | [30]{}: item_id +0x2090|10 9e 20 00 |.. . | lp_off: 7696 +0x2090|10 9e 20 00 |.. . | lp_flags: "LP_NORMAL" (1) +0x2090|10 9e 20 00 |.. . | lp_len: 16 + | | | [31]{}: item_id +0x2090| 00 9e 20 00 | .. . | lp_off: 7680 +0x2090| 00 9e 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x2090| 00 9e 20 00 | .. . | lp_len: 16 + | | | [32]{}: item_id +0x2090| f0 9d 20 00 | .. . | lp_off: 7664 +0x2090| f0 9d 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x2090| f0 9d 20 00 | .. . | lp_len: 16 + | | | [33]{}: item_id +0x2090| e0 9d 20 00| .. .| lp_off: 7648 +0x2090| e0 9d 20 00| .. .| lp_flags: "LP_NORMAL" (1) +0x2090| e0 9d 20 00| .. .| lp_len: 16 + | | | [34]{}: item_id +0x20a0|d0 9d 20 00 |.. . | lp_off: 7632 +0x20a0|d0 9d 20 00 |.. . | lp_flags: "LP_NORMAL" (1) +0x20a0|d0 9d 20 00 |.. . | lp_len: 16 + | | | [35]{}: item_id +0x20a0| c0 9d 20 00 | .. . | lp_off: 7616 +0x20a0| c0 9d 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x20a0| c0 9d 20 00 | .. . | lp_len: 16 + | | | [36]{}: item_id +0x20a0| b0 9d 20 00 | .. . | lp_off: 7600 +0x20a0| b0 9d 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x20a0| b0 9d 20 00 | .. . | lp_len: 16 + | | | [37]{}: item_id +0x20a0| a0 9d 20 00| .. .| lp_off: 7584 +0x20a0| a0 9d 20 00| .. .| lp_flags: "LP_NORMAL" (1) +0x20a0| a0 9d 20 00| .. .| lp_len: 16 + | | | [38]{}: item_id +0x20b0|90 9d 20 00 |.. . | lp_off: 7568 +0x20b0|90 9d 20 00 |.. . | lp_flags: "LP_NORMAL" (1) +0x20b0|90 9d 20 00 |.. . | lp_len: 16 + | | | [39]{}: item_id +0x20b0| 80 9d 20 00 | .. . | lp_off: 7552 +0x20b0| 80 9d 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x20b0| 80 9d 20 00 | .. . | lp_len: 16 + | | | [40]{}: item_id +0x20b0| 70 9d 20 00 | p. . | lp_off: 7536 +0x20b0| 70 9d 20 00 | p. . | lp_flags: "LP_NORMAL" (1) +0x20b0| 70 9d 20 00 | p. . | lp_len: 16 + | | | [41]{}: item_id +0x20b0| 60 9d 20 00| `. .| lp_off: 7520 +0x20b0| 60 9d 20 00| `. .| lp_flags: "LP_NORMAL" (1) +0x20b0| 60 9d 20 00| `. .| lp_len: 16 + | | | [42]{}: item_id +0x20c0|50 9d 20 00 |P. . | lp_off: 7504 +0x20c0|50 9d 20 00 |P. . | lp_flags: "LP_NORMAL" (1) +0x20c0|50 9d 20 00 |P. . | lp_len: 16 + | | | [43]{}: item_id +0x20c0| 40 9d 20 00 | @. . | lp_off: 7488 +0x20c0| 40 9d 20 00 | @. . | lp_flags: "LP_NORMAL" (1) +0x20c0| 40 9d 20 00 | @. . | lp_len: 16 + | | | [44]{}: item_id +0x20c0| 30 9d 20 00 | 0. . | lp_off: 7472 +0x20c0| 30 9d 20 00 | 0. . | lp_flags: "LP_NORMAL" (1) +0x20c0| 30 9d 20 00 | 0. . | lp_len: 16 + | | | [45]{}: item_id +0x20c0| 20 9d 20 00| . .| lp_off: 7456 +0x20c0| 20 9d 20 00| . .| lp_flags: "LP_NORMAL" (1) +0x20c0| 20 9d 20 00| . .| lp_len: 16 + | | | [46]{}: item_id +0x20d0|10 9d 20 00 |.. . | lp_off: 7440 +0x20d0|10 9d 20 00 |.. . | lp_flags: "LP_NORMAL" (1) +0x20d0|10 9d 20 00 |.. . | lp_len: 16 + | | | [47]{}: item_id +0x20d0| 00 9d 20 00 | .. . | lp_off: 7424 +0x20d0| 00 9d 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x20d0| 00 9d 20 00 | .. . | lp_len: 16 + | | | [48]{}: item_id +0x20d0| f0 9c 20 00 | .. . | lp_off: 7408 +0x20d0| f0 9c 20 00 | .. . | lp_flags: "LP_NORMAL" (1) +0x20d0| f0 9c 20 00 | .. . | lp_len: 16 + | | | [49]{}: item_id +0x20d0| e0 9c 20 00| .. .| lp_off: 7392 +0x20d0| e0 9c 20 00| .. .| lp_flags: "LP_NORMAL" (1) +0x20d0| e0 9c 20 00| .. .| lp_len: 16 + | | | [50:367]: ... +0x25d0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| free_space: "00000000000000000000000000000000000000000000000..." (raw bits) +0x25e0|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x28ff.7 (812) | | + | | | tuples[0:367]: + | | | [0]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x2900|00 00 06 00 |.... | ip_blkid: 393216 +0x2900| 01 00 | .. | ip_posid: 1 +0x2900| 10 20 | . | t_info: 8208 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x2900| 6f 01 00 00 00 00 00 00| o.......| data: raw bits + | | | [1]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3fe0|00 00 00 00 |.... | ip_blkid: 0 +0x3fe0| 01 00 | .. | ip_posid: 1 +0x3fe0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3fe0| 01 00 00 00 00 00 00 00| ........| data: raw bits + | | | [2]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3fd0|00 00 00 00 |.... | ip_blkid: 0 +0x3fd0| 02 00 | .. | ip_posid: 2 +0x3fd0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3fd0| 02 00 00 00 00 00 00 00| ........| data: raw bits + | | | [3]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3fc0|00 00 00 00 |.... | ip_blkid: 0 +0x3fc0| 03 00 | .. | ip_posid: 3 +0x3fc0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3fc0| 03 00 00 00 00 00 00 00| ........| data: raw bits + | | | [4]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3fb0|00 00 00 00 |.... | ip_blkid: 0 +0x3fb0| 04 00 | .. | ip_posid: 4 +0x3fb0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3fb0| 04 00 00 00 00 00 00 00| ........| data: raw bits + | | | [5]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3fa0|00 00 00 00 |.... | ip_blkid: 0 +0x3fa0| 05 00 | .. | ip_posid: 5 +0x3fa0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3fa0| 05 00 00 00 00 00 00 00| ........| data: raw bits + | | | [6]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3f90|00 00 00 00 |.... | ip_blkid: 0 +0x3f90| 06 00 | .. | ip_posid: 6 +0x3f90| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3f90| 06 00 00 00 00 00 00 00| ........| data: raw bits + | | | [7]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3f80|00 00 00 00 |.... | ip_blkid: 0 +0x3f80| 07 00 | .. | ip_posid: 7 +0x3f80| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3f80| 07 00 00 00 00 00 00 00| ........| data: raw bits + | | | [8]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3f70|00 00 00 00 |.... | ip_blkid: 0 +0x3f70| 08 00 | .. | ip_posid: 8 +0x3f70| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3f70| 08 00 00 00 00 00 00 00| ........| data: raw bits + | | | [9]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3f60|00 00 00 00 |.... | ip_blkid: 0 +0x3f60| 09 00 | .. | ip_posid: 9 +0x3f60| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3f60| 09 00 00 00 00 00 00 00| ........| data: raw bits + | | | [10]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3f50|00 00 00 00 |.... | ip_blkid: 0 +0x3f50| 0a 00 | .. | ip_posid: 10 +0x3f50| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3f50| 0a 00 00 00 00 00 00 00| ........| data: raw bits + | | | [11]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3f40|00 00 00 00 |.... | ip_blkid: 0 +0x3f40| 0b 00 | .. | ip_posid: 11 +0x3f40| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3f40| 0b 00 00 00 00 00 00 00| ........| data: raw bits + | | | [12]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3f30|00 00 00 00 |.... | ip_blkid: 0 +0x3f30| 0c 00 | .. | ip_posid: 12 +0x3f30| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3f30| 0c 00 00 00 00 00 00 00| ........| data: raw bits + | | | [13]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3f20|00 00 00 00 |.... | ip_blkid: 0 +0x3f20| 0d 00 | .. | ip_posid: 13 +0x3f20| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3f20| 0d 00 00 00 00 00 00 00| ........| data: raw bits + | | | [14]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3f10|00 00 00 00 |.... | ip_blkid: 0 +0x3f10| 0e 00 | .. | ip_posid: 14 +0x3f10| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3f10| 0e 00 00 00 00 00 00 00| ........| data: raw bits + | | | [15]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3f00|00 00 00 00 |.... | ip_blkid: 0 +0x3f00| 0f 00 | .. | ip_posid: 15 +0x3f00| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3f00| 0f 00 00 00 00 00 00 00| ........| data: raw bits + | | | [16]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3ef0|00 00 00 00 |.... | ip_blkid: 0 +0x3ef0| 10 00 | .. | ip_posid: 16 +0x3ef0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3ef0| 10 00 00 00 00 00 00 00| ........| data: raw bits + | | | [17]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3ee0|00 00 00 00 |.... | ip_blkid: 0 +0x3ee0| 11 00 | .. | ip_posid: 17 +0x3ee0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3ee0| 11 00 00 00 00 00 00 00| ........| data: raw bits + | | | [18]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3ed0|00 00 00 00 |.... | ip_blkid: 0 +0x3ed0| 12 00 | .. | ip_posid: 18 +0x3ed0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3ed0| 12 00 00 00 00 00 00 00| ........| data: raw bits + | | | [19]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3ec0|00 00 00 00 |.... | ip_blkid: 0 +0x3ec0| 13 00 | .. | ip_posid: 19 +0x3ec0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3ec0| 13 00 00 00 00 00 00 00| ........| data: raw bits + | | | [20]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3eb0|00 00 00 00 |.... | ip_blkid: 0 +0x3eb0| 14 00 | .. | ip_posid: 20 +0x3eb0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3eb0| 14 00 00 00 00 00 00 00| ........| data: raw bits + | | | [21]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3ea0|00 00 00 00 |.... | ip_blkid: 0 +0x3ea0| 15 00 | .. | ip_posid: 21 +0x3ea0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3ea0| 15 00 00 00 00 00 00 00| ........| data: raw bits + | | | [22]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3e90|00 00 00 00 |.... | ip_blkid: 0 +0x3e90| 16 00 | .. | ip_posid: 22 +0x3e90| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3e90| 16 00 00 00 00 00 00 00| ........| data: raw bits + | | | [23]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3e80|00 00 00 00 |.... | ip_blkid: 0 +0x3e80| 17 00 | .. | ip_posid: 23 +0x3e80| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3e80| 17 00 00 00 00 00 00 00| ........| data: raw bits + | | | [24]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3e70|00 00 00 00 |.... | ip_blkid: 0 +0x3e70| 18 00 | .. | ip_posid: 24 +0x3e70| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3e70| 18 00 00 00 00 00 00 00| ........| data: raw bits + | | | [25]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3e60|00 00 00 00 |.... | ip_blkid: 0 +0x3e60| 19 00 | .. | ip_posid: 25 +0x3e60| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3e60| 19 00 00 00 00 00 00 00| ........| data: raw bits + | | | [26]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3e50|00 00 00 00 |.... | ip_blkid: 0 +0x3e50| 1a 00 | .. | ip_posid: 26 +0x3e50| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3e50| 1a 00 00 00 00 00 00 00| ........| data: raw bits + | | | [27]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3e40|00 00 00 00 |.... | ip_blkid: 0 +0x3e40| 1b 00 | .. | ip_posid: 27 +0x3e40| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3e40| 1b 00 00 00 00 00 00 00| ........| data: raw bits + | | | [28]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3e30|00 00 00 00 |.... | ip_blkid: 0 +0x3e30| 1c 00 | .. | ip_posid: 28 +0x3e30| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3e30| 1c 00 00 00 00 00 00 00| ........| data: raw bits + | | | [29]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3e20|00 00 00 00 |.... | ip_blkid: 0 +0x3e20| 1d 00 | .. | ip_posid: 29 +0x3e20| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3e20| 1d 00 00 00 00 00 00 00| ........| data: raw bits + | | | [30]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3e10|00 00 00 00 |.... | ip_blkid: 0 +0x3e10| 1e 00 | .. | ip_posid: 30 +0x3e10| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3e10| 1e 00 00 00 00 00 00 00| ........| data: raw bits + | | | [31]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3e00|00 00 00 00 |.... | ip_blkid: 0 +0x3e00| 1f 00 | .. | ip_posid: 31 +0x3e00| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3e00| 1f 00 00 00 00 00 00 00| ........| data: raw bits + | | | [32]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3df0|00 00 00 00 |.... | ip_blkid: 0 +0x3df0| 20 00 | . | ip_posid: 32 +0x3df0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3df0| 20 00 00 00 00 00 00 00| .......| data: raw bits + | | | [33]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3de0|00 00 00 00 |.... | ip_blkid: 0 +0x3de0| 21 00 | !. | ip_posid: 33 +0x3de0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3de0| 21 00 00 00 00 00 00 00| !.......| data: raw bits + | | | [34]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3dd0|00 00 00 00 |.... | ip_blkid: 0 +0x3dd0| 22 00 | ". | ip_posid: 34 +0x3dd0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3dd0| 22 00 00 00 00 00 00 00| ".......| data: raw bits + | | | [35]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3dc0|00 00 00 00 |.... | ip_blkid: 0 +0x3dc0| 23 00 | #. | ip_posid: 35 +0x3dc0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3dc0| 23 00 00 00 00 00 00 00| #.......| data: raw bits + | | | [36]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3db0|00 00 00 00 |.... | ip_blkid: 0 +0x3db0| 24 00 | $. | ip_posid: 36 +0x3db0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3db0| 24 00 00 00 00 00 00 00| $.......| data: raw bits + | | | [37]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3da0|00 00 00 00 |.... | ip_blkid: 0 +0x3da0| 25 00 | %. | ip_posid: 37 +0x3da0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3da0| 25 00 00 00 00 00 00 00| %.......| data: raw bits + | | | [38]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3d90|00 00 00 00 |.... | ip_blkid: 0 +0x3d90| 26 00 | &. | ip_posid: 38 +0x3d90| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3d90| 26 00 00 00 00 00 00 00| &.......| data: raw bits + | | | [39]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3d80|00 00 00 00 |.... | ip_blkid: 0 +0x3d80| 27 00 | '. | ip_posid: 39 +0x3d80| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3d80| 27 00 00 00 00 00 00 00| '.......| data: raw bits + | | | [40]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3d70|00 00 00 00 |.... | ip_blkid: 0 +0x3d70| 28 00 | (. | ip_posid: 40 +0x3d70| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3d70| 28 00 00 00 00 00 00 00| (.......| data: raw bits + | | | [41]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3d60|00 00 00 00 |.... | ip_blkid: 0 +0x3d60| 29 00 | ). | ip_posid: 41 +0x3d60| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3d60| 29 00 00 00 00 00 00 00| ).......| data: raw bits + | | | [42]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3d50|00 00 00 00 |.... | ip_blkid: 0 +0x3d50| 2a 00 | *. | ip_posid: 42 +0x3d50| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3d50| 2a 00 00 00 00 00 00 00| *.......| data: raw bits + | | | [43]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3d40|00 00 00 00 |.... | ip_blkid: 0 +0x3d40| 2b 00 | +. | ip_posid: 43 +0x3d40| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3d40| 2b 00 00 00 00 00 00 00| +.......| data: raw bits + | | | [44]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3d30|00 00 00 00 |.... | ip_blkid: 0 +0x3d30| 2c 00 | ,. | ip_posid: 44 +0x3d30| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3d30| 2c 00 00 00 00 00 00 00| ,.......| data: raw bits + | | | [45]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3d20|00 00 00 00 |.... | ip_blkid: 0 +0x3d20| 2d 00 | -. | ip_posid: 45 +0x3d20| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3d20| 2d 00 00 00 00 00 00 00| -.......| data: raw bits + | | | [46]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3d10|00 00 00 00 |.... | ip_blkid: 0 +0x3d10| 2e 00 | .. | ip_posid: 46 +0x3d10| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3d10| 2e 00 00 00 00 00 00 00| ........| data: raw bits + | | | [47]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3d00|00 00 00 00 |.... | ip_blkid: 0 +0x3d00| 2f 00 | /. | ip_posid: 47 +0x3d00| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3d00| 2f 00 00 00 00 00 00 00| /.......| data: raw bits + | | | [48]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3cf0|00 00 00 00 |.... | ip_blkid: 0 +0x3cf0| 30 00 | 0. | ip_posid: 48 +0x3cf0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3cf0| 30 00 00 00 00 00 00 00| 0.......| data: raw bits + | | | [49]{}: tuple + | | | index_tuple_data{}: + | | | t_tid{}: +0x3ce0|00 00 00 00 |.... | ip_blkid: 0 +0x3ce0| 31 00 | 1. | ip_posid: 49 +0x3ce0| 10 00 | .. | t_info: 16 + | | | flags{}: + | | | has_nulls: false + | | | has_var_widths: false + | | | size: 16 +0x3ce0| 31 00 00 00 00 00 00 00| 1.......| data: raw bits + | | | [50:367]: ... + | | | page_opaque_data{}: +0x3ff0|00 00 00 00 |.... | btpo_prev: 0 +0x3ff0| 02 00 00 00 | .... | btpo_next: 2 +0x3ff0| 00 00 00 00 | .... | btpo_level: 0 +0x3ff0| 01 00 | .. | btpo_flags: 1 +0x3ff0| 00 00| ..| btpo_cycleid: 0 + | | | flags{}: + | | | is_leftmost: true + | | | is_rightmost: false + | | | is_leaf: true + | | | is_root: false + | | | is_deleted: false + | | | is_meta: false + | | | is_half_dead: false + | | | is_ignore: false + | | | has_garbage: false + | | | is_incomplete_split: false + | | | has_full_xid: false From 296ce68e80d8d9347358d42cc9631970b308b6d0 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 22 Sep 2022 13:32:03 +0300 Subject: [PATCH 082/141] postgres: refactoring --- .../flavours/postgres14/common14/heap_page.go | 6 +++--- .../flavours/postgres14/common14/pg_heap.go | 4 ++-- .../postgres/flavours/postgres14/pg_btree.go | 20 ++++++++++--------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/format/postgres/flavours/postgres14/common14/heap_page.go b/format/postgres/flavours/postgres14/common14/heap_page.go index da27198db..e1a4d489e 100644 --- a/format/postgres/flavours/postgres14/common14/heap_page.go +++ b/format/postgres/flavours/postgres14/common14/heap_page.go @@ -15,7 +15,7 @@ import ( // /* total size (bytes): 4 */ -type ItemId struct { +type ItemID struct { Off uint32 // unsigned int lp_off: 15 Flags uint32 // unsigned int lp_flags: 2 Len uint32 // unsigned int lp_len: 15 @@ -38,7 +38,7 @@ type HeapPage struct { PosFreeSpaceEnd int64 // bits pos free space end // parsed items positions - ItemIds []ItemId + ItemIds []ItemID } func DecodePageHeader(page *HeapPage, d *decode.D) { @@ -84,7 +84,7 @@ func decodeItemIdsInternal(page *HeapPage, d *decode.D) { /* 1: 7 | 4 */ // unsigned int lp_flags: 2 /* 2: 1 | 4 */ // unsigned int lp_len: 15 d.FieldStruct("item_id", func(d *decode.D) { - itemID := ItemId{} + itemID := ItemID{} itemPos := d.Pos() itemID.Off = uint32(d.FieldU32("lp_off", common.LpOffMapper)) diff --git a/format/postgres/flavours/postgres14/common14/pg_heap.go b/format/postgres/flavours/postgres14/common14/pg_heap.go index 2b6257f3e..f362da36d 100644 --- a/format/postgres/flavours/postgres14/common14/pg_heap.go +++ b/format/postgres/flavours/postgres14/common14/pg_heap.go @@ -193,10 +193,10 @@ func decodeTuples(heap *Heap, d *decode.D) { continue } - pos := int64(page.BytesPosBegin)*8 + int64(id.Off)*8 + pos := (page.BytesPosBegin * 8) + int64(id.Off)*8 tupleDataLen := id.Len - SizeOfHeapTupleHeaderData - // seek to tuple with ItemId offset + // seek to tuple with ItemID offset d.SeekAbs(pos) // type = struct HeapTupleHeaderData { diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/flavours/postgres14/pg_btree.go index c7644130a..89e69a88d 100644 --- a/format/postgres/flavours/postgres14/pg_btree.go +++ b/format/postgres/flavours/postgres14/pg_btree.go @@ -6,6 +6,7 @@ import ( "github.com/wader/fq/pkg/decode" ) +//nolint:revive const ( BTREE_MAGIC = 0x053162 P_NONE = 0 @@ -22,6 +23,7 @@ const ( BTP_HAS_FULLXID = 1 << 8 /* contains BTDeletedPageData */ ) +//nolint:revive const ( INDEX_SIZE_MASK = 0x1FFF INDEX_AM_RESERVED_BIT = 0x2000 /* reserved for index-AM specific usage */ @@ -119,14 +121,14 @@ func decodeBTreeMetaPage(btree *BTree, d *decode.D) { common14.DecodePageHeader(page, d) }) d.FieldStruct("meta_page_data", func(d *decode.D) { - decodeBTMetaPageData(btree, d) + decodeBTMetaPageData(d) }) pos0 := d.Pos() - pos1 := int64(btree.page.BytesPosSpecial) * 8 + pos1 := btree.page.BytesPosSpecial * 8 d.FieldRawLen("unused0", pos1-pos0) d.FieldStruct("page_opaque_data", func(d *decode.D) { - decodeBTPageOpaqueData(btree, d) + decodeBTPageOpaqueData(d) }) pos2 := d.Pos() bytesPos2 := pos2 / 8 @@ -135,7 +137,7 @@ func decodeBTreeMetaPage(btree *BTree, d *decode.D) { } } -func decodeBTMetaPageData(btree *BTree, d *decode.D) { +func decodeBTMetaPageData(d *decode.D) { /* 0 | 4 */ // uint32 btm_magic /* 4 | 4 */ // uint32 btm_version /* 8 | 4 */ // BlockNumber btm_root @@ -171,7 +173,7 @@ func decodeBTMetaPageData(btree *BTree, d *decode.D) { /* 8 | 4 */ // uint32 btpo_level; /* 12 | 2 */ // uint16 btpo_flags; /* 14 | 2 */ // BTCycleId btpo_cycleid; -func decodeBTPageOpaqueData(btree *BTree, d *decode.D) { +func decodeBTPageOpaqueData(d *decode.D) { prev := d.FieldU32("btpo_prev") next := d.FieldU32("btpo_next") d.FieldU32("btpo_level") @@ -213,10 +215,10 @@ func decodeBTreePage(btree *BTree, d *decode.D) { }) pos0 := d.Pos() - pos1 := int64(btree.page.BytesPosSpecial) * 8 + pos1 := btree.page.BytesPosSpecial * 8 d.SeekAbs(pos1) d.FieldStruct("page_opaque_data", func(d *decode.D) { - decodeBTPageOpaqueData(btree, d) + decodeBTPageOpaqueData(d) }) pos2 := d.Pos() bytesPos2 := pos2 / 8 @@ -244,9 +246,9 @@ func decodeIndexTuples(btree *BTree, d *decode.D) { continue } - pos := int64(page.BytesPosBegin)*8 + int64(id.Off)*8 + pos := (page.BytesPosBegin * 8) + int64(id.Off)*8 - // seek to tuple with ItemId offset + // seek to tuple with ItemID offset d.SeekAbs(pos) d.FieldStruct("tuple", func(d *decode.D) { From 90386a651ae3f3cfc5d0d8c92b3a22ad301d8eab Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 23 Sep 2022 12:50:04 +0300 Subject: [PATCH 083/141] postgres: add postgres.md to format --- README.md | 4 + doc/formats.md | 98 ++- doc/formats.svg | 1634 ++++++++++++++++++----------------- format/postgres/postgres.md | 52 ++ 4 files changed, 951 insertions(+), 837 deletions(-) create mode 100644 format/postgres/postgres.md diff --git a/README.md b/README.md index a4a9b7eaa..c2c92dd76 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,10 @@ ogg_page, opus_packet, pcap, pcapng, +[pg_btree](doc/formats.md#pg_btree), +[pg_control](doc/formats.md#pg_control), +[pg_heap](doc/formats.md#pg_heap), +[pg_wal](doc/formats.md#pg_wal), png, prores_frame, [protobuf](doc/formats.md#protobuf), diff --git a/doc/formats.md b/doc/formats.md index 6910ee8fd..0553b119f 100644 --- a/doc/formats.md +++ b/doc/formats.md @@ -79,12 +79,15 @@ |`mpeg_spu` |Sub Picture Unit (DVD subtitle) || |`mpeg_ts` |MPEG Transport Stream || |[`msgpack`](#msgpack) |MessagePack || -|[`postgres`](#postgres) |PostgreSQL |`ogg` |OGG file |`ogg_page` `vorbis_packet` `opus_packet` `flac_metadatablock` `flac_frame`| |`ogg_page` |OGG page || |`opus_packet` |Opus packet |`vorbis_comment`| |`pcap` |PCAP packet capture |`link_frame` `tcp_stream` `ipv4_packet`| |`pcapng` |PCAPNG packet capture |`link_frame` `tcp_stream` `ipv4_packet`| +|[`pg_btree`](#pg_btree) |PostgreSQL btree index file || +|[`pg_control`](#pg_control) |PostgreSQL control file || +|[`pg_heap`](#pg_heap) |PostgreSQL heap file || +|[`pg_wal`](#pg_wal) |PostgreSQL write-ahead log file || |`png` |Portable Network Graphics file |`icc_profile` `exif`| |`prores_frame` |Apple ProRes frame || |[`protobuf`](#protobuf) |Protobuf || @@ -572,58 +575,89 @@ $ fq -d msgpack torepr file.msgpack ### References - https://github.com/msgpack/msgpack/blob/master/spec.md -## postgres +## pg_btree -### Decode content of pg_control file +### Options -```sh -$ fq -d pg_control -o flavour=postgres14 d pg_control -``` +|Name |Default|Description| +|- |- |-| +|`flavour`|default|PostgreSQL flavour: postgres, postgres13, pgpro...| +|`lsn` | |Current LSN for WAL, use "select pg_current_wal_lsn()"| -### Specific fields can be got by request +### Examples -```sh -$ fq -d pg_control -o flavour=postgres14 ".state, .check_point_copy.redo, .wal_level" pg_control +Decode file using pg_btree options +``` +$ fq -d pg_btree -o flavour="default" -o lsn="" . file ``` -### To see heap page's content -```sh -$ fq -d pg_heap -o flavour=postgres14 ".[0]" 16994 +Decode value as pg_btree +``` +... | pg_btree({flavour:"default",lsn:""}) ``` -### To see page's header +## pg_control -```sh -$ fq -d pg_heap -o flavour=postgres14 ".[0].page_header" 16994 -``` +### Options -### First and last item pointers on first page +|Name |Default|Description| +|- |- |-| +|`flavour`|default|PostgreSQL flavour: postgres, postgres13, pgpro...| +|`lsn` | |Current LSN for WAL, use "select pg_current_wal_lsn()"| -```sh -$ fq -d pg_heap -o flavour=postgres14 ".[0].pd_linp[0, -1]" 16994 -``` +### Examples -### First and last tuple on first page +Decode file using pg_control options +``` +$ fq -d pg_control -o flavour="default" -o lsn="" . file +``` -```sh -$ fq -d pg_heap -o flavour=postgres14 ".[0].tuples[0, -1]" 16994 +Decode value as pg_control +``` +... | pg_control({flavour:"default",lsn:""}) ``` -### Btree index meta page +## pg_heap -```sh -$ fq -d pg_btree -o flavour=postgres14 ".[0] | d" 16404 +### Options + +|Name |Default|Description| +|- |- |-| +|`flavour`|default|PostgreSQL flavour: postgres, postgres13, pgpro...| +|`lsn` | |Current LSN for WAL, use "select pg_current_wal_lsn()"| + +### Examples + +Decode file using pg_heap options +``` +$ fq -d pg_heap -o flavour="default" -o lsn="" . file +``` + +Decode value as pg_heap +``` +... | pg_heap({flavour:"default",lsn:""}) ``` -### Btree index page +## pg_wal -```sh -$ fq -d pg_btree -o flavour=postgres14 ".[1]" 16404 +### Options + +|Name |Default|Description| +|- |- |-| +|`flavour`|default|PostgreSQL flavour: postgres, postgres13, pgpro...| +|`lsn` | |Current LSN for WAL, use "select pg_current_wal_lsn()"| + +### Examples + +Decode file using pg_wal options +``` +$ fq -d pg_wal -o flavour="default" -o lsn="" . file ``` -### References -- https://github.com/postgres/postgres/blob/REL_14_2/src/include/catalog/pg_control.h -- https://www.postgresql.org/docs/current/storage-page-layout.html +Decode value as pg_wal +``` +... | pg_wal({flavour:"default",lsn:""}) +``` ## protobuf diff --git a/doc/formats.svg b/doc/formats.svg index 34af8ca07..874d65810 100644 --- a/doc/formats.svg +++ b/doc/formats.svg @@ -4,1938 +4,1962 @@ - - + + formats - + adts - -adts - -adts_frame + +adts + +adts_frame adts_frame - -adts_frame - -aac_frame + +adts_frame + +aac_frame adts:e->adts_frame:n - - + + aac_frame - -aac_frame + +aac_frame adts_frame:e->aac_frame:n - - + + apev2 - -apev2 - -image + +apev2 + +image image - -image + +image apev2:e->image:n - - + + jpeg - -jpeg - -exif - -icc_profile + +jpeg + +exif + +icc_profile image->jpeg:n - - + + mp4 - -mp4 - -aac_frame - -av1_ccr - -av1_frame - -avc_au - -avc_dcr - -flac_frame - -flac_metadatablocks - -hevc_au - -hevc_dcr - -icc_profile - -id3v2 - -image - -jpeg - -mp3_frame - -mpeg_es - -mpeg_pes_packet - -opus_packet - -prores_frame - -protobuf_widevine - -pssh_playready - -vorbis_packet - -vp9_frame - -vpx_ccr + +mp4 + +aac_frame + +av1_ccr + +av1_frame + +avc_au + +avc_dcr + +flac_frame + +flac_metadatablocks + +hevc_au + +hevc_dcr + +icc_profile + +id3v2 + +image + +jpeg + +mp3_frame + +mpeg_es + +mpeg_pes_packet + +opus_packet + +prores_frame + +protobuf_widevine + +pssh_playready + +vorbis_packet + +vp9_frame + +vpx_ccr image->mp4:n - - + + png - -png - -icc_profile - -exif + +png + +icc_profile + +exif image->png:n - - + + tiff - -tiff - -icc_profile + +tiff + +icc_profile image->tiff:n - - + + webp - -webp - -vp8_frame + +webp + +vp8_frame image->webp:n - - + + gif - -gif + +gif image->gif:n - - + + ar - -ar - -probe + +ar + +probe probe - -probe + +probe ar:e->probe:n - - + + probe->adts:n - - + + probe->ar:n - - + + bitcoin_blkdat - -bitcoin_blkdat - -bitcoin_block + +bitcoin_blkdat + +bitcoin_block probe->bitcoin_blkdat:n - - + + bzip2 - -bzip2 - -probe + +bzip2 + +probe probe->bzip2:n - - + + flac - -flac - -flac_metadatablocks - -flac_frame + +flac + +flac_metadatablocks + +flac_frame probe->flac:n - - + + gzip - -gzip - -probe + +gzip + +probe probe->gzip:n - - + + probe->jpeg:n - - + + macho_fat - -macho_fat - -macho + +macho_fat + +macho probe->macho_fat:n - - + + macho - -macho + +macho probe->macho:n - - + + matroska - -matroska - -aac_frame - -av1_ccr - -av1_frame - -avc_au - -avc_dcr - -flac_frame - -flac_metadatablocks - -hevc_au - -hevc_dcr - -image - -mp3_frame - -mpeg_asc - -mpeg_pes_packet - -mpeg_spu - -opus_packet - -vorbis_packet - -vp8_frame - -vp9_cfm - -vp9_frame + +matroska + +aac_frame + +av1_ccr + +av1_frame + +avc_au + +avc_dcr + +flac_frame + +flac_metadatablocks + +hevc_au + +hevc_dcr + +image + +mp3_frame + +mpeg_asc + +mpeg_pes_packet + +mpeg_spu + +opus_packet + +vorbis_packet + +vp8_frame + +vp9_cfm + +vp9_frame probe->matroska:n - - + + mp3 - -mp3 - -id3v2 - -id3v1 - -id3v11 - -apev2 - -mp3_frame + +mp3 + +id3v2 + +id3v1 + +id3v11 + +apev2 + +mp3_frame probe->mp3:n - - + + probe->mp4:n - - + + ogg - -ogg - -ogg_page - -vorbis_packet - -opus_packet - -flac_metadatablock - -flac_frame + +ogg + +ogg_page + +vorbis_packet + +opus_packet + +flac_metadatablock + +flac_frame probe->ogg:n - - + + pcap - -pcap - -link_frame - -tcp_stream - -ipv4_packet + +pcap + +link_frame + +tcp_stream + +ipv4_packet probe->pcap:n - - + + pcapng - -pcapng - -link_frame - -tcp_stream - -ipv4_packet + +pcapng + +link_frame + +tcp_stream + +ipv4_packet probe->pcapng:n - - + + probe->png:n - - + + tar - -tar - -probe + +tar + +probe probe->tar:n - - + + probe->tiff:n - - + + wav - -wav - -id3v2 - -id3v1 - -id3v11 + +wav + +id3v2 + +id3v1 + +id3v11 probe->wav:n - - + + probe->webp:n - - + + zip - -zip - -probe + +zip + +probe probe->zip:n - - + + avro_ocf - -avro_ocf + +avro_ocf probe->avro_ocf:n - - + + elf - -elf + +elf probe->elf:n - - + + probe->gif:n - - + + json - -json + +json probe->json:n - - + + jsonl - -jsonl + +jsonl probe->jsonl:n - - + + mpeg_ts - -mpeg_ts + +mpeg_ts probe->mpeg_ts:n - - + + toml - -toml + +toml probe->toml:n - - + + wasm - -wasm + +wasm probe->wasm:n - - + + xml - -xml + +xml probe->xml:n - - + + yaml - -yaml + +yaml probe->yaml:n - - + + av1_frame - -av1_frame - -av1_obu + +av1_frame + +av1_obu av1_obu - -av1_obu + +av1_obu av1_frame:e->av1_obu:n - - + + avc_annexb - -avc_annexb - -avc_nalu + +avc_annexb + +avc_nalu avc_nalu - -avc_nalu - -avc_sps - -avc_pps - -avc_sei + +avc_nalu + +avc_sps + +avc_pps + +avc_sei avc_annexb:e->avc_nalu:n - - + + avc_sps - -avc_sps + +avc_sps avc_nalu:e->avc_sps:n - - + + avc_pps - -avc_pps + +avc_pps avc_nalu:e->avc_pps:n - - + + avc_sei - -avc_sei + +avc_sei avc_nalu:e->avc_sei:n - - + + avc_au - -avc_au - -avc_nalu + +avc_au + +avc_nalu avc_au:e->avc_nalu:n - - + + avc_dcr - -avc_dcr - -avc_nalu + +avc_dcr + +avc_nalu avc_dcr:e->avc_nalu:n - - + + bitcoin_block - -bitcoin_block - -bitcoin_transaction + +bitcoin_block + +bitcoin_transaction bitcoin_blkdat:e->bitcoin_block:n - - + + bitcoin_transaction - -bitcoin_transaction - -bitcoin_script + +bitcoin_transaction + +bitcoin_script bitcoin_block:e->bitcoin_transaction:n - - + + bitcoin_script - -bitcoin_script + +bitcoin_script bitcoin_transaction:e->bitcoin_script:n - - + + bsd_loopback_frame - -bsd_loopback_frame - -inet_packet + +bsd_loopback_frame + +inet_packet inet_packet - -inet_packet + +inet_packet bsd_loopback_frame:e->inet_packet:n - - + + ipv4_packet - -ipv4_packet - -ip_packet + +ipv4_packet + +ip_packet inet_packet->ipv4_packet:n - - + + ipv6_packet - -ipv6_packet - -ip_packet + +ipv6_packet + +ip_packet inet_packet->ipv6_packet:n - - + + bzip2:e->probe:n - - + + ether8023_frame - -ether8023_frame - -inet_packet + +ether8023_frame + +inet_packet ether8023_frame:e->inet_packet:n - - + + flac_metadatablocks - -flac_metadatablocks - -flac_metadatablock + +flac_metadatablocks + +flac_metadatablock flac:e->flac_metadatablocks:n - - + + flac_frame - -flac_frame + +flac_frame flac:e->flac_frame:n - - + + flac_metadatablock - -flac_metadatablock - -flac_streaminfo - -flac_picture - -vorbis_comment + +flac_metadatablock + +flac_streaminfo + +flac_picture + +vorbis_comment flac_metadatablocks:e->flac_metadatablock:n - - + + flac_streaminfo - -flac_streaminfo + +flac_streaminfo flac_metadatablock:e->flac_streaminfo:n - - + + flac_picture - -flac_picture - -image + +flac_picture + +image flac_metadatablock:e->flac_picture:n - - + + vorbis_comment - -vorbis_comment - -flac_picture + +vorbis_comment + +flac_picture flac_metadatablock:e->vorbis_comment:n - - + + flac_picture:e->image:n - - + + vorbis_comment:e->flac_picture:n - - + + gzip:e->probe:n - - + + hevc_annexb - -hevc_annexb - -hevc_nalu + +hevc_annexb + +hevc_nalu hevc_nalu - -hevc_nalu - -hevc_vps - -hevc_pps - -hevc_sps + +hevc_nalu + +hevc_vps + +hevc_pps + +hevc_sps hevc_annexb:e->hevc_nalu:n - - + + hevc_vps - -hevc_vps + +hevc_vps hevc_nalu:e->hevc_vps:n - - + + hevc_pps - -hevc_pps + +hevc_pps hevc_nalu:e->hevc_pps:n - - + + hevc_sps - -hevc_sps + +hevc_sps hevc_nalu:e->hevc_sps:n - - + + hevc_au - -hevc_au - -hevc_nalu + +hevc_au + +hevc_nalu hevc_au:e->hevc_nalu:n - - + + hevc_dcr - -hevc_dcr - -hevc_nalu + +hevc_dcr + +hevc_nalu hevc_dcr:e->hevc_nalu:n - - + + id3v2 - -id3v2 - -image + +id3v2 + +image id3v2:e->image:n - - + + ip_packet - -ip_packet + +ip_packet ipv4_packet:e->ip_packet:n - - + + udp_datagram - -udp_datagram - -udp_payload + +udp_datagram + +udp_payload ip_packet->udp_datagram:n - - + + icmp - -icmp + +icmp ip_packet->icmp:n - - + + icmpv6 - -icmpv6 + +icmpv6 ip_packet->icmpv6:n - - + + tcp_segment - -tcp_segment + +tcp_segment ip_packet->tcp_segment:n - - + + ipv6_packet:e->ip_packet:n - - + + exif - -exif + +exif jpeg:e->exif:n - - + + icc_profile - -icc_profile + +icc_profile jpeg:e->icc_profile:n - - + + macho_fat:e->macho:n - - + + matroska:e->aac_frame:n - - + + matroska:e->image:n - - + + matroska:e->av1_frame:n - - + + matroska:e->avc_au:n - - + + matroska:e->avc_dcr:n - - + + matroska:e->flac_metadatablocks:n - - + + matroska:e->flac_frame:n - - + + matroska:e->hevc_au:n - - + + matroska:e->hevc_dcr:n - - + + av1_ccr - -av1_ccr + +av1_ccr matroska:e->av1_ccr:n - - + + mp3_frame - -mp3_frame - -xing + +mp3_frame + +xing matroska:e->mp3_frame:n - - + + mpeg_asc - -mpeg_asc + +mpeg_asc matroska:e->mpeg_asc:n - - + + mpeg_pes_packet - -mpeg_pes_packet + +mpeg_pes_packet matroska:e->mpeg_pes_packet:n - - + + mpeg_spu - -mpeg_spu + +mpeg_spu matroska:e->mpeg_spu:n - - + + opus_packet - -opus_packet - -vorbis_comment + +opus_packet + +vorbis_comment matroska:e->opus_packet:n - - + + vorbis_packet - -vorbis_packet - -vorbis_comment + +vorbis_packet + +vorbis_comment matroska:e->vorbis_packet:n - - + + vp8_frame - -vp8_frame + +vp8_frame matroska:e->vp8_frame:n - - + + vp9_cfm - -vp9_cfm + +vp9_cfm matroska:e->vp9_cfm:n - - + + vp9_frame - -vp9_frame + +vp9_frame matroska:e->vp9_frame:n - - + + xing - -xing + +xing mp3_frame:e->xing:n - - + + opus_packet:e->vorbis_comment:n - - + + vorbis_packet:e->vorbis_comment:n - - + + mp3:e->apev2:n - - + + mp3:e->id3v2:n - - + + mp3:e->mp3_frame:n - - + + id3v1 - -id3v1 + +id3v1 mp3:e->id3v1:n - - + + id3v11 - -id3v11 + +id3v11 mp3:e->id3v11:n - - + + mp4:e->aac_frame:n - - + + mp4:e->image:n - - + + mp4:e->av1_frame:n - - + + mp4:e->avc_au:n - - + + mp4:e->avc_dcr:n - - + + mp4:e->flac_metadatablocks:n - - + + mp4:e->flac_frame:n - - + + mp4:e->hevc_au:n - - + + mp4:e->hevc_dcr:n - - + + mp4:e->id3v2:n - - + + mp4:e->jpeg:n - - + + mp4:e->icc_profile:n - - + + mp4:e->av1_ccr:n - - + + mp4:e->mp3_frame:n - - + + mp4:e->mpeg_pes_packet:n - - + + mp4:e->opus_packet:n - - + + mp4:e->vorbis_packet:n - - + + mp4:e->vp9_frame:n - - + + mpeg_es - -mpeg_es - -mpeg_asc - -vorbis_packet + +mpeg_es + +mpeg_asc + +vorbis_packet mp4:e->mpeg_es:n - - + + prores_frame - -prores_frame + +prores_frame mp4:e->prores_frame:n - - + + protobuf_widevine - -protobuf_widevine - -protobuf + +protobuf_widevine + +protobuf mp4:e->protobuf_widevine:n - - + + pssh_playready - -pssh_playready + +pssh_playready mp4:e->pssh_playready:n - - + + vpx_ccr - -vpx_ccr + +vpx_ccr mp4:e->vpx_ccr:n - - + + mpeg_es:e->mpeg_asc:n - - + + mpeg_es:e->vorbis_packet:n - - + + protobuf - -protobuf + +protobuf protobuf_widevine:e->protobuf:n - - + + mpeg_pes - -mpeg_pes - -mpeg_pes_packet - -mpeg_spu + +mpeg_pes + +mpeg_pes_packet + +mpeg_spu mpeg_pes:e->mpeg_pes_packet:n - - + + mpeg_pes:e->mpeg_spu:n - - + + ogg:e->flac_frame:n - - + + ogg:e->flac_metadatablock:n - - + + ogg:e->opus_packet:n - - + + ogg:e->vorbis_packet:n - - + + ogg_page - -ogg_page + +ogg_page ogg:e->ogg_page:n - - + + pcap:e->ipv4_packet:n - - + + link_frame - -link_frame + +link_frame pcap:e->link_frame:n - - + + tcp_stream - -tcp_stream + +tcp_stream pcap:e->tcp_stream:n - - + + link_frame->bsd_loopback_frame:n - - + + link_frame->ether8023_frame:n - - + + sll2_packet - -sll2_packet - -inet_packet + +sll2_packet + +inet_packet link_frame->sll2_packet:n - - + + sll_packet - -sll_packet - -inet_packet + +sll_packet + +inet_packet link_frame->sll_packet:n - - + + rtmp - -rtmp - -amf0 - -mpeg_asc + +rtmp + +amf0 + +mpeg_asc tcp_stream->rtmp:n - - + + dns_tcp - -dns_tcp + +dns_tcp tcp_stream->dns_tcp:n - - + + pcapng:e->ipv4_packet:n - - + + pcapng:e->link_frame:n - - + + pcapng:e->tcp_stream:n - - + + png:e->exif:n - - + + png:e->icc_profile:n - - + + rtmp:e->mpeg_asc:n - - + + amf0 - -amf0 + +amf0 rtmp:e->amf0:n - - + + sll2_packet:e->inet_packet:n - - + + sll_packet:e->inet_packet:n - - + + tar:e->probe:n - - + + tiff:e->icc_profile:n - - + + udp_payload - -udp_payload + +udp_payload udp_datagram:e->udp_payload:n - - + + dns - -dns + +dns udp_payload->dns:n - - + + wav:e->id3v2:n - - + + wav:e->id3v1:n - - + + wav:e->id3v11:n - - + + webp:e->vp8_frame:n - - + + zip:e->probe:n - - + + asn1_ber - -asn1_ber + +asn1_ber bencode - -bencode + +bencode bson - -bson + +bson cbor - -cbor + +cbor csv - -csv + +csv fairplay_spc - -fairplay_spc + +fairplay_spc html - -html + +html markdown - -markdown + +markdown msgpack - -msgpack + +msgpack - + +pg_btree + +pg_btree + + + +pg_control + +pg_control + + + +pg_heap + +pg_heap + + + +pg_wal + +pg_wal + + + raw - -raw + +raw diff --git a/format/postgres/postgres.md b/format/postgres/postgres.md new file mode 100644 index 000000000..153ae019c --- /dev/null +++ b/format/postgres/postgres.md @@ -0,0 +1,52 @@ +PostgreSQL + +### Decode content of pg_control file + +```sh +$ fq -d pg_control -o flavour=postgres14 d pg_control +``` + +### Specific fields can be got by request + +```sh +$ fq -d pg_control -o flavour=postgres14 ".state, .check_point_copy.redo, .wal_level" pg_control +``` + +### To see heap page's content +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0]" 16994 +``` + +### To see page's header + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].page_header" 16994 +``` + +### First and last item pointers on first page + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].pd_linp[0, -1]" 16994 +``` + +### First and last tuple on first page + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].tuples[0, -1]" 16994 +``` + +### Btree index meta page + +```sh +$ fq -d pg_btree -o flavour=postgres14 ".[0] | d" 16404 +``` + +### Btree index page + +```sh +$ fq -d pg_btree -o flavour=postgres14 ".[1]" 16404 +``` + +### References +- https://github.com/postgres/postgres/blob/REL_14_2/src/include/catalog/pg_control.h +- https://www.postgresql.org/docs/current/storage-page-layout.html From de3ecf163629ba092dd5c0cb5fe7a81654d7e9af Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 23 Sep 2022 13:50:54 +0300 Subject: [PATCH 084/141] postgres: generate docs by embedded md --- doc/formats.md | 98 ++++++++++++++++++++++++++--------- format/format.go | 6 ++- format/postgres/pg_btree.go | 9 +++- format/postgres/pg_btree.md | 14 +++++ format/postgres/pg_control.go | 10 ++-- format/postgres/pg_control.md | 14 +++++ format/postgres/pg_heap.go | 9 +++- format/postgres/pg_heap.md | 25 +++++++++ format/postgres/pg_wal.go | 8 +-- format/postgres/postgres.md | 52 ------------------- 10 files changed, 157 insertions(+), 88 deletions(-) create mode 100644 format/postgres/pg_btree.md create mode 100644 format/postgres/pg_control.md create mode 100644 format/postgres/pg_heap.md delete mode 100644 format/postgres/postgres.md diff --git a/doc/formats.md b/doc/formats.md index 0553b119f..f272787c2 100644 --- a/doc/formats.md +++ b/doc/formats.md @@ -579,84 +579,134 @@ $ fq -d msgpack torepr file.msgpack ### Options -|Name |Default|Description| -|- |- |-| -|`flavour`|default|PostgreSQL flavour: postgres, postgres13, pgpro...| -|`lsn` | |Current LSN for WAL, use "select pg_current_wal_lsn()"| +|Name |Default |Description| +|- |- |-| +|`flavour`|postgres14|PostgreSQL flavour: postgres14, pgproee14.., postgres10| ### Examples Decode file using pg_btree options ``` -$ fq -d pg_btree -o flavour="default" -o lsn="" . file +$ fq -d pg_btree -o flavour="postgres14" . file ``` Decode value as pg_btree ``` -... | pg_btree({flavour:"default",lsn:""}) +... | pg_btree({flavour:"postgres14"}) +``` + +### Btree index meta page + +```sh +$ fq -d pg_btree -o flavour=postgres14 ".[0] | d" 16404 ``` +### Btree index page + +```sh +$ fq -d pg_btree -o flavour=postgres14 ".[1]" 16404 +``` + +### References +- https://www.postgresql.org/docs/current/storage-page-layout.html ## pg_control ### Options -|Name |Default|Description| -|- |- |-| -|`flavour`|default|PostgreSQL flavour: postgres, postgres13, pgpro...| -|`lsn` | |Current LSN for WAL, use "select pg_current_wal_lsn()"| +|Name |Default |Description| +|- |- |-| +|`flavour`|postgres14|PostgreSQL flavour: postgres14, pgproee14.., postgres10| ### Examples Decode file using pg_control options ``` -$ fq -d pg_control -o flavour="default" -o lsn="" . file +$ fq -d pg_control -o flavour="postgres14" . file ``` Decode value as pg_control ``` -... | pg_control({flavour:"default",lsn:""}) +... | pg_control({flavour:"postgres14"}) +``` + +### Decode content of pg_control file + +```sh +$ fq -d pg_control -o flavour=postgres14 d pg_control +``` + +### Specific fields can be got by request + +```sh +$ fq -d pg_control -o flavour=postgres14 ".state, .check_point_copy.redo, .wal_level" pg_control ``` +### References +- https://github.com/postgres/postgres/blob/REL_14_2/src/include/catalog/pg_control.h ## pg_heap ### Options -|Name |Default|Description| -|- |- |-| -|`flavour`|default|PostgreSQL flavour: postgres, postgres13, pgpro...| -|`lsn` | |Current LSN for WAL, use "select pg_current_wal_lsn()"| +|Name |Default |Description| +|- |- |-| +|`flavour`|postgres14|PostgreSQL flavour: postgres14, pgproee14.., postgres10| ### Examples Decode file using pg_heap options ``` -$ fq -d pg_heap -o flavour="default" -o lsn="" . file +$ fq -d pg_heap -o flavour="postgres14" . file ``` Decode value as pg_heap ``` -... | pg_heap({flavour:"default",lsn:""}) +... | pg_heap({flavour:"postgres14"}) +``` + +### To see heap page's content +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0]" 16994 ``` +### To see page's header + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].page_header" 16994 +``` + +### First and last item pointers on first page + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].pd_linp[0, -1]" 16994 +``` + +### First and last tuple on first page + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].tuples[0, -1]" 16994 +``` + +### References +- https://www.postgresql.org/docs/current/storage-page-layout.html ## pg_wal ### Options -|Name |Default|Description| -|- |- |-| -|`flavour`|default|PostgreSQL flavour: postgres, postgres13, pgpro...| -|`lsn` | |Current LSN for WAL, use "select pg_current_wal_lsn()"| +|Name |Default |Description| +|- |- |-| +|`flavour`|postgres14|PostgreSQL flavour: postgres14, pgproee14.., postgres10| +|`lsn` | |Current LSN for WAL, use "select pg_current_wal_lsn()"| ### Examples Decode file using pg_wal options ``` -$ fq -d pg_wal -o flavour="default" -o lsn="" . file +$ fq -d pg_wal -o flavour="postgres14" -o lsn="" . file ``` Decode value as pg_wal ``` -... | pg_wal({flavour:"default",lsn:""}) +... | pg_wal({flavour:"postgres14",lsn:""}) ``` ## protobuf diff --git a/format/format.go b/format/format.go index ddb8aaedc..218c3b74e 100644 --- a/format/format.go +++ b/format/format.go @@ -324,6 +324,10 @@ type BitCoinBlockIn struct { } type PostgresIn struct { - Flavour string `doc:"PostgreSQL flavour: postgres, postgres13, pgpro..."` + Flavour string `doc:"PostgreSQL flavour: postgres14, pgproee14.., postgres10"` +} + +type PostgresWalIn struct { + Flavour string `doc:"PostgreSQL flavour: postgres14, pgproee14.., postgres10"` Lsn string `doc:"Current LSN for WAL, use \"select pg_current_wal_lsn()\""` } diff --git a/format/postgres/pg_btree.go b/format/postgres/pg_btree.go index ac62406b3..829d4a2c2 100644 --- a/format/postgres/pg_btree.go +++ b/format/postgres/pg_btree.go @@ -1,23 +1,28 @@ package postgres import ( + "embed" "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" ) +//go:embed pg_btree.md +var pgBTreeFS embed.FS + func init() { interp.RegisterFormat(decode.Format{ Name: format.PG_BTREE, Description: "PostgreSQL btree index file", DecodeFn: decodePgBTree, DecodeInArg: format.PostgresIn{ - Flavour: "default", + Flavour: PG_FLAVOUR_POSTGRES14, }, RootArray: true, RootName: "pages", }) + interp.RegisterFS(pgBTreeFS) } func decodePgBTree(d *decode.D, in any) any { @@ -29,7 +34,7 @@ func decodePgBTree(d *decode.D, in any) any { } switch pgIn.Flavour { - case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: + case PG_FLAVOUR_POSTGRES14: return postgres14.DecodePgBTree(d) } diff --git a/format/postgres/pg_btree.md b/format/postgres/pg_btree.md new file mode 100644 index 000000000..ae803e1ba --- /dev/null +++ b/format/postgres/pg_btree.md @@ -0,0 +1,14 @@ +### Btree index meta page + +```sh +$ fq -d pg_btree -o flavour=postgres14 ".[0] | d" 16404 +``` + +### Btree index page + +```sh +$ fq -d pg_btree -o flavour=postgres14 ".[1]" 16404 +``` + +### References +- https://www.postgresql.org/docs/current/storage-page-layout.html \ No newline at end of file diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 7ea4c6ccd..c959c18ee 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -1,6 +1,7 @@ package postgres import ( + "embed" "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/pgpro11" @@ -20,15 +21,19 @@ import ( "github.com/wader/fq/pkg/interp" ) +//go:embed pg_control.md +var pgControlFS embed.FS + func init() { interp.RegisterFormat(decode.Format{ Name: format.PG_CONTROL, Description: "PostgreSQL control file", DecodeFn: decodePgControl, DecodeInArg: format.PostgresIn{ - Flavour: "default", + Flavour: PG_FLAVOUR_POSTGRES14, }, }) + interp.RegisterFS(pgControlFS) } //nolint:revive @@ -43,7 +48,6 @@ const ( //nolint:revive const ( - PG_FLAVOUR_POSTGRES = "postgres" PG_FLAVOUR_POSTGRES11 = "postgres11" PG_FLAVOUR_POSTGRES12 = "postgres12" PG_FLAVOUR_POSTGRES13 = "postgres13" @@ -74,7 +78,7 @@ func decodePgControl(d *decode.D, in any) any { return postgres12.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES13: return postgres13.DecodePgControl(d, in) - case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: + case PG_FLAVOUR_POSTGRES14: return postgres14.DecodePgControl(d, in) case PG_FLAVOUR_PGPRO11: return pgpro11.DecodePgControl(d, in) diff --git a/format/postgres/pg_control.md b/format/postgres/pg_control.md new file mode 100644 index 000000000..7c3194360 --- /dev/null +++ b/format/postgres/pg_control.md @@ -0,0 +1,14 @@ +### Decode content of pg_control file + +```sh +$ fq -d pg_control -o flavour=postgres14 d pg_control +``` + +### Specific fields can be got by request + +```sh +$ fq -d pg_control -o flavour=postgres14 ".state, .check_point_copy.redo, .wal_level" pg_control +``` + +### References +- https://github.com/postgres/postgres/blob/REL_14_2/src/include/catalog/pg_control.h \ No newline at end of file diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index c8a810cdc..04d8fb909 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -1,6 +1,7 @@ package postgres import ( + "embed" "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/pgpro11" "github.com/wader/fq/format/postgres/flavours/pgpro12" @@ -22,17 +23,21 @@ import ( // TO DO // oom kill on 1 GB file +//go:embed pg_heap.md +var pgHeapFS embed.FS + func init() { interp.RegisterFormat(decode.Format{ Name: format.PG_HEAP, Description: "PostgreSQL heap file", DecodeFn: decodePgheap, DecodeInArg: format.PostgresIn{ - Flavour: "default", + Flavour: PG_FLAVOUR_POSTGRES14, }, RootArray: true, RootName: "Pages", }) + interp.RegisterFS(pgHeapFS) } func decodePgheap(d *decode.D, in any) any { @@ -50,7 +55,7 @@ func decodePgheap(d *decode.D, in any) any { return postgres12.DecodeHeap(d) case PG_FLAVOUR_POSTGRES13: return postgres13.DecodeHeap(d) - case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: + case PG_FLAVOUR_POSTGRES14: return postgres14.DecodeHeap(d) case PG_FLAVOUR_PGPROEE10: return pgproee10.DecodeHeap(d) diff --git a/format/postgres/pg_heap.md b/format/postgres/pg_heap.md new file mode 100644 index 000000000..1efe639c1 --- /dev/null +++ b/format/postgres/pg_heap.md @@ -0,0 +1,25 @@ +### To see heap page's content +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0]" 16994 +``` + +### To see page's header + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].page_header" 16994 +``` + +### First and last item pointers on first page + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].pd_linp[0, -1]" 16994 +``` + +### First and last tuple on first page + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].tuples[0, -1]" 16994 +``` + +### References +- https://www.postgresql.org/docs/current/storage-page-layout.html \ No newline at end of file diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index fcc0d4590..3e6a2250d 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -20,8 +20,8 @@ func init() { Name: format.PG_WAL, Description: "PostgreSQL write-ahead log file", DecodeFn: decodePgwal, - DecodeInArg: format.PostgresIn{ - Flavour: "default", + DecodeInArg: format.PostgresWalIn{ + Flavour: PG_FLAVOUR_POSTGRES14, Lsn: "", }, }) @@ -65,7 +65,7 @@ func XLogSegmentOffset(xLogPtr uint32) uint32 { func decodePgwal(d *decode.D, in any) any { d.Endian = decode.LittleEndian - pgIn, ok := in.(format.PostgresIn) + pgIn, ok := in.(format.PostgresWalIn) if !ok { d.Fatalf("DecodeInArg must be PostgresIn!\n") } @@ -82,7 +82,7 @@ func decodePgwal(d *decode.D, in any) any { switch pgIn.Flavour { //case PG_FLAVOUR_POSTGRES11: // return postgres11.DecodePgControl(d, in) - case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES: + case PG_FLAVOUR_POSTGRES14: return postgres14.DecodePgwal(d, maxOffset) //case PG_FLAVOUR_PGPROEE14: // return pgproee14.DecodePgControl(d, in) diff --git a/format/postgres/postgres.md b/format/postgres/postgres.md deleted file mode 100644 index 153ae019c..000000000 --- a/format/postgres/postgres.md +++ /dev/null @@ -1,52 +0,0 @@ -PostgreSQL - -### Decode content of pg_control file - -```sh -$ fq -d pg_control -o flavour=postgres14 d pg_control -``` - -### Specific fields can be got by request - -```sh -$ fq -d pg_control -o flavour=postgres14 ".state, .check_point_copy.redo, .wal_level" pg_control -``` - -### To see heap page's content -```sh -$ fq -d pg_heap -o flavour=postgres14 ".[0]" 16994 -``` - -### To see page's header - -```sh -$ fq -d pg_heap -o flavour=postgres14 ".[0].page_header" 16994 -``` - -### First and last item pointers on first page - -```sh -$ fq -d pg_heap -o flavour=postgres14 ".[0].pd_linp[0, -1]" 16994 -``` - -### First and last tuple on first page - -```sh -$ fq -d pg_heap -o flavour=postgres14 ".[0].tuples[0, -1]" 16994 -``` - -### Btree index meta page - -```sh -$ fq -d pg_btree -o flavour=postgres14 ".[0] | d" 16404 -``` - -### Btree index page - -```sh -$ fq -d pg_btree -o flavour=postgres14 ".[1]" 16404 -``` - -### References -- https://github.com/postgres/postgres/blob/REL_14_2/src/include/catalog/pg_control.h -- https://www.postgresql.org/docs/current/storage-page-layout.html From b06c9bc28c3bd5cbd148104800f069d216334bac Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 23 Sep 2022 14:05:19 +0300 Subject: [PATCH 085/141] postgres: pg_control change default flavour to empty string - it uses versions prober. Fix root name in pg_heap. --- format/postgres/pg_control.go | 2 +- format/postgres/pg_heap.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index c959c18ee..0eb8e70f1 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -30,7 +30,7 @@ func init() { Description: "PostgreSQL control file", DecodeFn: decodePgControl, DecodeInArg: format.PostgresIn{ - Flavour: PG_FLAVOUR_POSTGRES14, + Flavour: "", }, }) interp.RegisterFS(pgControlFS) diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index 04d8fb909..a680f2e95 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -35,7 +35,7 @@ func init() { Flavour: PG_FLAVOUR_POSTGRES14, }, RootArray: true, - RootName: "Pages", + RootName: "pages", }) interp.RegisterFS(pgHeapFS) } From 9deab2ea1ba7df9bec16ac350e41edb810446e77 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 26 Sep 2022 09:10:03 +0300 Subject: [PATCH 086/141] postgres: pg_heap fix page_begin, page_end --- format/postgres/flavours/postgres14/common14/pg_heap.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/format/postgres/flavours/postgres14/common14/pg_heap.go b/format/postgres/flavours/postgres14/common14/pg_heap.go index f362da36d..d79ddf133 100644 --- a/format/postgres/flavours/postgres14/common14/pg_heap.go +++ b/format/postgres/flavours/postgres14/common14/pg_heap.go @@ -163,6 +163,11 @@ func decodeHeapPages(heap *Heap, d *decode.D) { func decodeHeapPage(heap *Heap, d *decode.D) { page := &HeapPage{} + if heap.Page != nil { + // use prev page + page.BytesPosBegin = heap.Page.BytesPosEnd + } + page.BytesPosEnd = int64(common.TypeAlign(heap.PageSize, uint64(page.BytesPosBegin)+1)) heap.Page = page heap.Special = &PageSpecial{} From 78583731dcb1b16ce84ce39fb6f41c4d75f2b319 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 5 Oct 2022 13:16:39 +0300 Subject: [PATCH 087/141] postgres: postgres 10 support --- .../postgres/flavours/pgpro10/pg_control.go | 89 +++++++ format/postgres/flavours/pgpro10/pg_heap.go | 15 ++ .../flavours/postgres10/pg_control.go | 224 ++++++++++++++++++ .../postgres/flavours/postgres10/pg_heap.go | 15 ++ format/postgres/pg_control.go | 12 + format/postgres/pg_heap.go | 6 + .../postgres/testdata/flavours/pgpro10/16396 | Bin 0 -> 16384 bytes .../testdata/flavours/pgpro10/16396_1.fqtest | 9 + .../postgres/testdata/flavours/pgpro10/16404 | Bin 0 -> 8192 bytes .../testdata/flavours/pgpro10/16404_1.fqtest | 9 + .../testdata/flavours/pgpro10/16404_2.fqtest | 95 ++++++++ .../testdata/flavours/pgpro10/pg_control | Bin 0 -> 8192 bytes .../flavours/pgpro10/pg_control.fqtest | 69 ++++++ .../flavours/pgpro10/pg_control_1.fqtest | 69 ++++++ .../testdata/flavours/postgres10/16396 | Bin 0 -> 16384 bytes .../flavours/postgres10/16396_1.fqtest | 9 + .../testdata/flavours/postgres10/16407 | Bin 0 -> 16384 bytes .../flavours/postgres10/16407_1.fqtest | 9 + .../flavours/postgres10/16407_2.fqtest | 95 ++++++++ .../testdata/flavours/postgres10/pg_control | Bin 0 -> 8192 bytes .../flavours/postgres10/pg_control.fqtest | 69 ++++++ 21 files changed, 794 insertions(+) create mode 100644 format/postgres/flavours/pgpro10/pg_control.go create mode 100644 format/postgres/flavours/pgpro10/pg_heap.go create mode 100644 format/postgres/flavours/postgres10/pg_control.go create mode 100644 format/postgres/flavours/postgres10/pg_heap.go create mode 100644 format/postgres/testdata/flavours/pgpro10/16396 create mode 100644 format/postgres/testdata/flavours/pgpro10/16396_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro10/16404 create mode 100644 format/postgres/testdata/flavours/pgpro10/16404_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro10/16404_2.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro10/pg_control create mode 100644 format/postgres/testdata/flavours/pgpro10/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro10/pg_control_1.fqtest create mode 100644 format/postgres/testdata/flavours/postgres10/16396 create mode 100644 format/postgres/testdata/flavours/postgres10/16396_1.fqtest create mode 100644 format/postgres/testdata/flavours/postgres10/16407 create mode 100644 format/postgres/testdata/flavours/postgres10/16407_1.fqtest create mode 100644 format/postgres/testdata/flavours/postgres10/16407_2.fqtest create mode 100644 format/postgres/testdata/flavours/postgres10/pg_control create mode 100644 format/postgres/testdata/flavours/postgres10/pg_control.fqtest diff --git a/format/postgres/flavours/pgpro10/pg_control.go b/format/postgres/flavours/pgpro10/pg_control.go new file mode 100644 index 000000000..4d5bc9fcc --- /dev/null +++ b/format/postgres/flavours/pgpro10/pg_control.go @@ -0,0 +1,89 @@ +package pgpro10 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +func DecodePgControl(d *decode.D, in any) any { + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version", common.VersionMapper) + d.FieldU32("catalog_version_no") + d.FieldU32("state", common.DBState) + d.FieldU32("hole0") + + d.FieldS64("time", common.TimeMapper) + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldU64("prev_check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { + + d.FieldU64("redo", common.XLogRecPtrMapper) + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") + d.FieldU24("hole1") + + d.FieldU32("next_xid_epoch") + d.FieldU32("next_xid") + d.FieldU32("next_oid") + d.FieldU32("next_multi") + d.FieldU32("next_multi_offset") + d.FieldU32("oldest_xid") + d.FieldU32("oldest_xid_db") + d.FieldU32("oldest_multi") + d.FieldU32("oldest_multi_db") + d.FieldS64("time", common.TimeMapper) + d.FieldU32("oldest_commit_ts_xid") + d.FieldU32("newest_commit_ts_xid") + d.FieldU32("oldest_active_xid") + d.FieldU32("padding1") + }) + + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") + d.FieldU32("hole2") + + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") + d.FieldU24("hole3") + + d.FieldS32("wal_level", common.WalLevel) + d.FieldU8("wal_log_hints") + d.FieldU24("hole4") + + d.FieldS32("max_connections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.FieldU24("hole5") + + d.FieldU32("max_align") + d.FieldU32("hole6") + + d.FieldF64("float_format") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float4_by_val") + d.FieldU8("float8_by_val") + d.FieldU16("hole7") + + d.FieldU32("data_checksum_version") + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) + d.FieldU32("icu_version", common.IcuVersionMapper) + d.FieldU32("crc") + + d.AssertPos(296 * 8) + d.FieldRawLen("unused", d.BitsLeft()) + + return nil +} diff --git a/format/postgres/flavours/pgpro10/pg_heap.go b/format/postgres/flavours/pgpro10/pg_heap.go new file mode 100644 index 000000000..6433801a7 --- /dev/null +++ b/format/postgres/flavours/pgpro10/pg_heap.go @@ -0,0 +1,15 @@ +package pgpro10 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +func DecodeHeap(d *decode.D) any { + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: common14.DecodePageHeader, + } + return common14.DecodeHeap(heap, d) +} diff --git a/format/postgres/flavours/postgres10/pg_control.go b/format/postgres/flavours/postgres10/pg_control.go new file mode 100644 index 000000000..dd7aadd67 --- /dev/null +++ b/format/postgres/flavours/postgres10/pg_control.go @@ -0,0 +1,224 @@ +package postgres10 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +//type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 8 */ // XLogRecPtr prevCheckPoint; +/* 48 | 80 */ // CheckPoint checkPointCopy; +/* 128 | 8 */ // XLogRecPtr unloggedLSN; +/* 136 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 144 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 152 | 8 */ // XLogRecPtr backupStartPoint; +/* 160 | 8 */ // XLogRecPtr backupEndPoint; +/* 168 | 1 */ // bool backupEndRequired; +/* XXX 3-byte hole */ +/* 172 | 4 */ // int wal_level; +/* 176 | 1 */ // bool wal_log_hints; +/* XXX 3-byte hole */ +/* 180 | 4 */ // int MaxConnections; +/* 184 | 4 */ // int max_worker_processes; +/* 188 | 4 */ // int max_prepared_xacts; +/* 192 | 4 */ // int max_locks_per_xact; +/* 196 | 1 */ // bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 200 | 4 */ // uint32 maxAlign; +/* XXX 4-byte hole */ +/* 208 | 8 */ // double floatFormat; +/* 216 | 4 */ // uint32 blcksz; +/* 220 | 4 */ // uint32 relseg_size; +/* 224 | 4 */ // uint32 xlog_blcksz; +/* 228 | 4 */ // uint32 xlog_seg_size; +/* 232 | 4 */ // uint32 nameDataLen; +/* 236 | 4 */ // uint32 indexMaxKeys; +/* 240 | 4 */ // uint32 toast_max_chunk_size; +/* 244 | 4 */ // uint32 loblksize; +/* 248 | 1 */ // bool float4ByVal; +/* 249 | 1 */ // bool float8ByVal; +/* XXX 2-byte hole */ +/* 252 | 4 */ // uint32 data_checksum_version; +/* 256 | 32 */ // char mock_authentication_nonce[32]; +/* 288 | 4 */ // pg_crc32c crc; +/* XXX 4-byte padding */ + +/* total size (bytes): 296 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // bool fullPageWrites; +/* XXX 3-byte hole */ +/* 20 | 4 */ // uint32 nextXidEpoch; +/* 24 | 4 */ // TransactionId nextXid; +/* 28 | 4 */ // Oid nextOid; +/* 32 | 4 */ // MultiXactId nextMulti; +/* 36 | 4 */ // MultiXactOffset nextMultiOffset; +/* 40 | 4 */ // TransactionId oldestXid; +/* 44 | 4 */ // Oid oldestXidDB; +/* 48 | 4 */ // MultiXactId oldestMulti; +/* 52 | 4 */ // Oid oldestMultiDB; +/* 56 | 8 */ // pg_time_t time; +/* 64 | 4 */ // TransactionId oldestCommitTsXid; +/* 68 | 4 */ // TransactionId newestCommitTsXid; +/* 72 | 4 */ // TransactionId oldestActiveXid; +/* XXX 4-byte padding */ + +/* total size (bytes): 80 */ +// + +func DecodePgControl(d *decode.D, in any) any { + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version") + d.FieldU32("catalog_version_no") + d.FieldU32("state", common.DBState) + d.FieldU32("hole0") + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 8 */ // XLogRecPtr prevCheckPoint; + /* 48 | 80 */ // CheckPoint checkPointCopy; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldU64("prev_check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 3-byte hole */ + d.FieldU64("redo", common.XLogRecPtrMapper) + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") + d.FieldU24("hole1") + + /* 20 | 4 */ // uint32 nextXidEpoch; + /* 24 | 4 */ // TransactionId nextXid; + /* 28 | 4 */ // Oid nextOid; + /* 32 | 4 */ // MultiXactId nextMulti; + /* 36 | 4 */ // MultiXactOffset nextMultiOffset; + /* 40 | 4 */ // TransactionId oldestXid; + /* 44 | 4 */ // Oid oldestXidDB; + /* 48 | 4 */ // MultiXactId oldestMulti; + /* 52 | 4 */ // Oid oldestMultiDB; + /* 56 | 8 */ // pg_time_t time; + /* 64 | 4 */ // TransactionId oldestCommitTsXid; + /* 68 | 4 */ // TransactionId newestCommitTsXid; + /* 72 | 4 */ // TransactionId oldestActiveXid; + /* XXX 4-byte padding */ + d.FieldU32("next_xid_epoch") + d.FieldU32("next_xid") + d.FieldU32("next_oid") + d.FieldU32("next_multi") + d.FieldU32("next_multi_offset") + d.FieldU32("oldest_xid") + d.FieldU32("oldest_xid_db") + d.FieldU32("oldest_multi") + d.FieldU32("oldest_multi_db") + d.FieldS64("time", common.TimeMapper) + d.FieldU32("oldest_commit_ts_xid") + d.FieldU32("newest_commit_ts_xid") + d.FieldU32("oldest_active_xid") + d.FieldU32("padding0") + }) + + /* 128 | 8 */ // XLogRecPtr unloggedLSN; + /* 136 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 144 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") + d.FieldU32("hole2") + + /* 152 | 8 */ // XLogRecPtr backupStartPoint; + /* 160 | 8 */ // XLogRecPtr backupEndPoint; + /* 168 | 1 */ // bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") + d.FieldU24("hole3") + + /* 172 | 4 */ // int wal_level; + /* 176 | 1 */ // bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level", common.WalLevel) + d.FieldU8("wal_log_hints") + d.FieldU24("hole4") + + /* 180 | 4 */ // int MaxConnections; + /* 184 | 4 */ // int max_worker_processes; + /* 188 | 4 */ // int max_prepared_xacts; + /* 192 | 4 */ // int max_locks_per_xact; + /* 196 | 1 */ // bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("max_connections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.FieldU24("hole5") + + /* 200 | 4 */ // uint32 maxAlign; + /* XXX 4-byte hole */ + d.FieldU32("max_align") + d.FieldU32("hole6") + + /* 208 | 8 */ // double floatFormat; + /* 216 | 4 */ // uint32 blcksz; + /* 220 | 4 */ // uint32 relseg_size; + /* 224 | 4 */ // uint32 xlog_blcksz; + /* 228 | 4 */ // uint32 xlog_seg_size; + /* 232 | 4 */ // uint32 nameDataLen; + /* 236 | 4 */ // uint32 indexMaxKeys; + /* 240 | 4 */ // uint32 toast_max_chunk_size; + /* 244 | 4 */ // uint32 loblksize; + /* 248 | 1 */ // bool float4ByVal; + /* 249 | 1 */ // bool float8ByVal; + /* XXX 2-byte hole */ + d.FieldF64("float_format") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float4_by_val") + d.FieldU8("float8_by_val") + d.FieldU16("hole7") + + /* 252 | 4 */ // uint32 data_checksum_version; + /* 256 | 32 */ // char mock_authentication_nonce[32]; + /* 288 | 4 */ // pg_crc32c crc; + /* XXX 4-byte padding */ + d.FieldU32("data_checksum_version") + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) + d.FieldU32("crc") + d.FieldU32("padding1") + /* total size (bytes): 296 */ + + d.AssertPos(296 * 8) + d.FieldRawLen("unused", d.BitsLeft()) + + return nil +} diff --git a/format/postgres/flavours/postgres10/pg_heap.go b/format/postgres/flavours/postgres10/pg_heap.go new file mode 100644 index 000000000..a9a228026 --- /dev/null +++ b/format/postgres/flavours/postgres10/pg_heap.go @@ -0,0 +1,15 @@ +package postgres10 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/pkg/decode" +) + +func DecodeHeap(d *decode.D) any { + heap := &common14.Heap{ + PageSize: common.HeapPageSize, + DecodePageHeaderData: common14.DecodePageHeader, + } + return common14.DecodeHeap(heap, d) +} diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 0eb8e70f1..5678e95ce 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -4,6 +4,7 @@ import ( "embed" "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/format/postgres/flavours/pgpro10" "github.com/wader/fq/format/postgres/flavours/pgpro11" "github.com/wader/fq/format/postgres/flavours/pgpro12" "github.com/wader/fq/format/postgres/flavours/pgpro13" @@ -13,6 +14,7 @@ import ( "github.com/wader/fq/format/postgres/flavours/pgproee12" "github.com/wader/fq/format/postgres/flavours/pgproee13" "github.com/wader/fq/format/postgres/flavours/pgproee14" + "github.com/wader/fq/format/postgres/flavours/postgres10" "github.com/wader/fq/format/postgres/flavours/postgres11" "github.com/wader/fq/format/postgres/flavours/postgres12" "github.com/wader/fq/format/postgres/flavours/postgres13" @@ -48,10 +50,12 @@ const ( //nolint:revive const ( + PG_FLAVOUR_POSTGRES10 = "postgres10" PG_FLAVOUR_POSTGRES11 = "postgres11" PG_FLAVOUR_POSTGRES12 = "postgres12" PG_FLAVOUR_POSTGRES13 = "postgres13" PG_FLAVOUR_POSTGRES14 = "postgres14" + PG_FLAVOUR_PGPRO10 = "pgpro10" PG_FLAVOUR_PGPRO11 = "pgpro11" PG_FLAVOUR_PGPRO12 = "pgpro12" PG_FLAVOUR_PGPRO13 = "pgpro13" @@ -72,6 +76,8 @@ func decodePgControl(d *decode.D, in any) any { } switch pgIn.Flavour { + case PG_FLAVOUR_POSTGRES10: + return postgres10.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES11: return postgres11.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES12: @@ -80,6 +86,8 @@ func decodePgControl(d *decode.D, in any) any { return postgres13.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES14: return postgres14.DecodePgControl(d, in) + case PG_FLAVOUR_PGPRO10: + return pgpro10.DecodePgControl(d, in) case PG_FLAVOUR_PGPRO11: return pgpro11.DecodePgControl(d, in) case PG_FLAVOUR_PGPRO12: @@ -116,6 +124,8 @@ func probeForDecode(d *decode.D, in any) any { if pgProVersion == common.PG_ORIGINAL { switch oriVersion { + case PG_CONTROL_VERSION_10: + return postgres10.DecodePgControl(d, in) case PG_CONTROL_VERSION_11: return postgres11.DecodePgControl(d, in) case PG_CONTROL_VERSION_12: @@ -127,6 +137,8 @@ func probeForDecode(d *decode.D, in any) any { if pgProVersion == common.PGPRO_STANDARD { switch oriVersion { + case PG_CONTROL_VERSION_10: + return pgpro10.DecodePgControl(d, in) case PG_CONTROL_VERSION_11: return pgpro11.DecodePgControl(d, in) case PG_CONTROL_VERSION_12: diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index a680f2e95..99a995e7f 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -3,6 +3,7 @@ package postgres import ( "embed" "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/flavours/pgpro10" "github.com/wader/fq/format/postgres/flavours/pgpro11" "github.com/wader/fq/format/postgres/flavours/pgpro12" "github.com/wader/fq/format/postgres/flavours/pgpro13" @@ -12,6 +13,7 @@ import ( "github.com/wader/fq/format/postgres/flavours/pgproee12" "github.com/wader/fq/format/postgres/flavours/pgproee13" "github.com/wader/fq/format/postgres/flavours/pgproee14" + "github.com/wader/fq/format/postgres/flavours/postgres10" "github.com/wader/fq/format/postgres/flavours/postgres11" "github.com/wader/fq/format/postgres/flavours/postgres12" "github.com/wader/fq/format/postgres/flavours/postgres13" @@ -49,6 +51,8 @@ func decodePgheap(d *decode.D, in any) any { } switch pgIn.Flavour { + case PG_FLAVOUR_POSTGRES10: + return postgres10.DecodeHeap(d) case PG_FLAVOUR_POSTGRES11: return postgres11.DecodeHeap(d) case PG_FLAVOUR_POSTGRES12: @@ -67,6 +71,8 @@ func decodePgheap(d *decode.D, in any) any { return pgproee13.DecodeHeap(d) case PG_FLAVOUR_PGPROEE14: return pgproee14.DecodeHeap(d) + case PG_FLAVOUR_PGPRO10: + return pgpro10.DecodeHeap(d) case PG_FLAVOUR_PGPRO11: return pgpro11.DecodeHeap(d) case PG_FLAVOUR_PGPRO12: diff --git a/format/postgres/testdata/flavours/pgpro10/16396 b/format/postgres/testdata/flavours/pgpro10/16396 new file mode 100644 index 0000000000000000000000000000000000000000..313a45cde2ade148f557c0f5c01de32dcc7c6265 GIT binary patch literal 16384 zcmeI%#d4DY6vgo`Y3lCYrmm^GP>OqTcXyY<>f%muia!9ud$HyTIGvumpnGyQd^2b6 z#l`FiE@qE$ zF?)oI*+X2+9^hhj9~ZNGxR~9=#q16)X18$#PfvIr4bdJCB0)H{BpAnMfA=H$4<338 z{W1DuB7cF105Jo8$`bM|Meo@`~NzT@BM$R$oKxgM&x_{UoG;z|F07H-v3vMeDD7& uM85a`hAy6bA6q2?BwDqi8^789*emXjp}SVIlz}Kr$hb2xJ)pC@M%)41xlK0Yo7% z1`>7kHvv`4~75b-1R8_*t!AR#0LAtbsU?U7O>fcTKwO0-A9ND%QO z^^c%E53dAb#|5spd9FHMhhBA{{l4;$kn|IkDb;pQ~oV9kFe`C$) zia4rKeunr2@rR0u79|puC$Zn7e2Mt;#G96eKKa|)L5BSk%HJfuwfLU~5}iQf-c8lb zV*VM6pT=`=0t;DY?B$|)@PyN9DG3ATIw-BG)jp*1pYcsxP zzf1W-@h!z)TSSy8h1Lxey8%&#e3`L&39*S)aJCcZ@%6Zx#Ek%IAys zE_^CW&C*G}B zU>0hF&7D%hexvfa;$1zTNivj${hv0KeYNtF#k>78-~iENAJI!$?5mW|5%22%{2W8c zDDJ0Y*l$oisK!714x%0n)@~iie!cS9;@x`n=xXRdTcUXb*;gu`CEndHzor>FS!eAl zz1TmZ{3PWY-XU7}m$lzr#y+C_MDgBbZ_eG*4OLf9*Zk+s!|}@Z#i-K%wKlV!{Tk)37w`7NpP%D?N00eG zvR|$IIPq?Mf8I{?IqKi%DEo(%A1mIw?6t{#oTw-KiTBw*r2H5)p1K^O3IABz_!|3F z%4djo^(hG$`uTTjuYQjGgUXLq{TGHYDr}B(HSAX^f1P-Deyfs7(=M!yR%>Du8)08iJfoLlB zXXp9smnna(8qdz%L}yM~`|fP^VdY1Pcjr~pIy_%6`Adu0FI9eocz2#;93~2PAnKLJ zeu?s_s{bmS&q-M9f=u>{l^-tN?dOCVqBZa@r?J0Z`C;O{%ijJBk0$Esorgo%->3XF z;@$dATR`*)Cf}hS`$ftR74P=v)5(Uu#|JfbXTMPSA>!Tp$!F(?(($~0FNyuV$`2Or z=6iYs(Kk3hQxn-QP=1hjx1XQOAi@&Rmxg_r@&ncQSFXicq5qyu8=B9bdz2p_-tC9{ ze4;loxcF1-=PREg-n;D8Kc^$nE<8^wj+^ z;=Q%ga`v|=e}#B=zodRhw7=fk@9$-QtMa|XyZM&vC)(T&?~`-c&sP3& z@vffcAknXl*#9N$Z&ALdc<-_|{*fQxzfaKrntb**E8jzn|GJ)dKgaXhm(6~b^4-O| z{U7W{^bS6#PX_y$%KOE;dd|x>v={IH`-ifhp?o*-?)*$#VJHvl8|cTrMES1bU41sS zGV~MX+s)7ZCgr<`_bz*5S~8xf5cOP`#6F~aXYp>otxh#miNVcn!@gMg%as2+!O%dQ zZ?7BnMao~Q#$PlOdk&j*dE@%#^QTbxOT@eVd}le)LEOKEC)pP$-$}fy=f6i#OBCzH zD!bto-chM7N_pb%)sBsQg9Z z-Tn1MFGF467rw+kU-=H=z02PE?kOX(n0(pO?58Myp?J4H&tm^fJY}uf!~O>4FHrr5 zjiDy=AKk*<`|jrbdH09+=Tknj1m7=k{(l=`pR4@&;@y5eyn`qM?@Jw4v7fAbd+}~R zypQiAgV2A%QuaB@w-fK``Sm6E?uEvi=d%wgpQ!xtCcK;A_kp`_W1p>jTk-CGdFC+D z8#qs*A@*6yw-N8o!*=`d-46Ay$z?xD`2_LaWpB+678t6-eyhl2KT-MCs{a%C{UNJ8 zzGJ7cpP+mz@$P;}!|wxFVxpn!GnH>C-qqi~z|eBMe-7!-e!TMMss7XZ;|xNvR{Ggr zuY3#f?z}zr9nlWF4(dN>OYj9FkJuu literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgpro10/16404_1.fqtest b/format/postgres/testdata/flavours/pgpro10/16404_1.fqtest new file mode 100644 index 000000000..3f0d5918e --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro10/16404_1.fqtest @@ -0,0 +1,9 @@ +$ fq -d pg_heap -o flavour=pgpro10 ".[0].pd_linp[0,-1] | dv" 16404 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[99]{}: item_id 0x1a4-0x1a7.7 (4) +0x1a0| 40 8d 60 00 | @.`. | lp_off: 3392 0x1a4-0x1a7.7 (4) +0x1a0| 40 8d 60 00 | @.`. | lp_flags: "LP_NORMAL" (1) 0x1a4-0x1a7.7 (4) +0x1a0| 40 8d 60 00 | @.`. | lp_len: 48 0x1a4-0x1a7.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro10/16404_2.fqtest b/format/postgres/testdata/flavours/pgpro10/16404_2.fqtest new file mode 100644 index 000000000..d1a400d0e --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro10/16404_2.fqtest @@ -0,0 +1,95 @@ +$ fq -d pg_heap -o flavour=pgpro10 ".[0].tuples[0,-1] | dv" 16404 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fd0-0x1fff.7 (48) + | | | header{}: 0x1fd0-0x1fe7.7 (24) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|45 02 00 00 |E... | t_xmin: 581 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|45 02 00 00 |E... | datum_len_: 581 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | infomask2{}: 0x1fe4-NA (0) + | | | heap_keys_updated: false 0x1fe4-NA (0) + | | | heap_hot_updated: false 0x1fe4-NA (0) + | | | heap_only_tuple: false 0x1fe4-NA (0) +0x1fe0| 01 08 | .. | t_infomask: 2049 0x1fe4-0x1fe5.7 (2) + | | | infomask{}: 0x1fe6-NA (0) + | | | heap_hasnull: true 0x1fe6-NA (0) + | | | heap_hasvarwidth: false 0x1fe6-NA (0) + | | | heap_hasexternal: false 0x1fe6-NA (0) + | | | heap_hasoid_old: false 0x1fe6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fe6-NA (0) + | | | heap_combocid: false 0x1fe6-NA (0) + | | | heap_xmax_excl_lock: false 0x1fe6-NA (0) + | | | heap_xmax_lock_only: false 0x1fe6-NA (0) + | | | heap_xmax_shr_lock: false 0x1fe6-NA (0) + | | | heap_lock_mask: false 0x1fe6-NA (0) + | | | heap_xmin_committed: false 0x1fe6-NA (0) + | | | heap_xmin_invalid: false 0x1fe6-NA (0) + | | | heap_xmin_frozen: false 0x1fe6-NA (0) + | | | heap_xmax_committed: false 0x1fe6-NA (0) + | | | heap_xmax_invalid: true 0x1fe6-NA (0) + | | | heap_xmax_is_multi: false 0x1fe6-NA (0) + | | | heap_updated: false 0x1fe6-NA (0) + | | | heap_moved_off: false 0x1fe6-NA (0) + | | | heap_moved_in: false 0x1fe6-NA (0) + | | | heap_moved: false 0x1fe6-NA (0) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 05 00 00 00 01 00 00 00| ........| data: "0500000001000000033f01005bf5ffff96f592a7438d020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1ff0|03 3f 01 00 5b f5 ff ff 96 f5 92 a7 43 8d 02 00|.?..[.......C...| + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[99]{}: tuple 0xd40-0xd6f.7 (48) + | | | header{}: 0xd40-0xd57.7 (24) + | | | t_choice{}: 0xd40-0xd4b.7 (12) + | | | t_heap{}: 0xd40-0xd4b.7 (12) +0xd40|a8 02 00 00 |.... | t_xmin: 680 0xd40-0xd43.7 (4) +0xd40| 00 00 00 00 | .... | t_xmax: 0 0xd44-0xd47.7 (4) + | | | t_field3{}: 0xd48-0xd4b.7 (4) +0xd40| 03 00 00 00 | .... | t_cid: 3 0xd48-0xd4b.7 (4) +0xd40| 03 00 00 00 | .... | t_xvac: 3 0xd48-0xd4b.7 (4) + | | | t_datum{}: 0xd40-0xd4b.7 (12) +0xd40|a8 02 00 00 |.... | datum_len_: 680 0xd40-0xd43.7 (4) +0xd40| 00 00 00 00 | .... | datum_typmod: 0 0xd44-0xd47.7 (4) +0xd40| 03 00 00 00 | .... | datum_typeid: 3 0xd48-0xd4b.7 (4) + | | | t_ctid{}: 0xd4c-0xd51.7 (6) +0xd40| 00 00 00 00| ....| ip_blkid: 0 0xd4c-0xd4f.7 (4) +0xd50|64 00 |d. | ip_posid: 100 0xd50-0xd51.7 (2) +0xd50| 06 00 | .. | t_infomask2: 6 0xd52-0xd53.7 (2) + | | | infomask2{}: 0xd54-NA (0) + | | | heap_keys_updated: false 0xd54-NA (0) + | | | heap_hot_updated: false 0xd54-NA (0) + | | | heap_only_tuple: false 0xd54-NA (0) +0xd50| 01 08 | .. | t_infomask: 2049 0xd54-0xd55.7 (2) + | | | infomask{}: 0xd56-NA (0) + | | | heap_hasnull: true 0xd56-NA (0) + | | | heap_hasvarwidth: false 0xd56-NA (0) + | | | heap_hasexternal: false 0xd56-NA (0) + | | | heap_hasoid_old: false 0xd56-NA (0) + | | | heap_xmax_keyshr_lock: false 0xd56-NA (0) + | | | heap_combocid: false 0xd56-NA (0) + | | | heap_xmax_excl_lock: false 0xd56-NA (0) + | | | heap_xmax_lock_only: false 0xd56-NA (0) + | | | heap_xmax_shr_lock: false 0xd56-NA (0) + | | | heap_lock_mask: false 0xd56-NA (0) + | | | heap_xmin_committed: false 0xd56-NA (0) + | | | heap_xmin_invalid: false 0xd56-NA (0) + | | | heap_xmin_frozen: false 0xd56-NA (0) + | | | heap_xmax_committed: false 0xd56-NA (0) + | | | heap_xmax_invalid: true 0xd56-NA (0) + | | | heap_xmax_is_multi: false 0xd56-NA (0) + | | | heap_updated: false 0xd56-NA (0) + | | | heap_moved_off: false 0xd56-NA (0) + | | | heap_moved_in: false 0xd56-NA (0) + | | | heap_moved: false 0xd56-NA (0) +0xd50| 18 | . | t_hoff: 24 0xd56-0xd56.7 (1) +0xd50| 1f | . | padding0: 31 0xd57-0xd57.7 (1) +0xd50| 02 00 00 00 01 00 00 00| ........| data: "0200000001000000eeda0000ccf7ffff9c2097a7438d020..." (raw bits) 0xd58-0xd6f.7 (24) +0xd60|ee da 00 00 cc f7 ff ff 9c 20 97 a7 43 8d 02 00|......... ..C...| diff --git a/format/postgres/testdata/flavours/pgpro10/pg_control b/format/postgres/testdata/flavours/pgpro10/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..402d6ac36729e931e25b4e0e3d761cf8fd2e9e11 GIT binary patch literal 8192 zcma#<%t(D_YMcCuIUwNmHC7%r1_xk$B)<}*Dghz} z;;RAqFnJISGY=#O0$}w(8YD+7fT@iIYT$rsa)8n>K8V|X&B&2K0mK420!%Y7Iskbf z<{5S%0aVNgGz^Fs?rzLzxS-KtZI4mX@J(o+;3R6G22!DuWcOR(;xvIN*q&;()|N zV~imoF~0bOJ{TW)^-1G{CJql=NH7|L|9{Tfr}y4yVoY||PFB{wD{a5K_TFcobN2cx zBGUiWPX!{8v_~$Ivcj_RM@8JZjC3I;@a}_*bh8id&Spel?tOTedk-Gw-i3#`cQUex zKMU{9AO>@9!^7NL@G$o#Jj|Vjhq+VmuulA*djox#I|&c#VC?mbwDNDlyVo+(j(!V2 zqhAl-2y?GyqyfH;arE6Q8EIx8UR)$i=)0HEhq;&FVeSMx%)JN?b1%Td-1G1-_Z&RT z9fyaxXJJpHPk#*l85q2y|DTOxo!#1`&=pjc$}$A;?WJ$F$Y*5%nnG(2Ye!wDB>egK zO#ZdMZrljTKd@iH>bfQ2--OTPpZ+;4|LX@8tgcHEJ}!uue|ciq@o(Ri%kNPBV&%7u z56jA9DSDpT}=eex>pUriSI8Zv`l; zHA}MoZbgjie_&Kt{?4i_IJ!-e@NY+-{G)${z5Yt__>IcHS@~b!ON5;Nj|s|Z4U*)4 z3u4TF&-JkRA6to1?bLHQeu`0JIw-iW_W`Rk1MwaTwG;@2p@#)!XG z`D=~%)yl6n;;&Ku8YBK{<*zp4S1F&jWxpqmr(`74e1%ay;}h`&_%OO5zTl)uD? zU#|ReBmN@gFEZjURQ^IEewp&ijQ9(bzrct;Pxk{tP4jbmdPs;!jilG$a00<>T1PWd5fpe~J-*vhpVz z@h2)D$Id3>U!wdHBmM;Cobqw(Wx^k;{IN#-V&xYb@y95Cj1j*` z`9((j(aIlf#4l8Sp%H(S@=+gB>f7aWn0iZU(>i}4rrxt*<{5DuzkH_cDj6)O92fqcj4dyihTiN$I0f&B;R)979 zf71(4XF$C`FMK^L)+=Ob2dELCc7VEpSVsW80JQ?t4Nx!8!@g<-s1r!_0j&A|M~y(f zJ|NWwcwGRr0kLL)1N{$;V?Ep=*)B=_V>^QQc5?Pg*!t7K$3=#}L(Grszn-7@EiAv~ zvEl5Qaj)k8kmmn81|j76^1nR-P}+EH zChKnpVqAZx@E{P9fAUZYkBL2!@OfE~ev^P}(Bw zr3t?SG3I|Fu>Rusy(v5m+)i~ zGXGr-xqPobYE=HlYhl-4XCB|{kGL&!{CDF)JY@ctHs$8;^+)$9{|pWyLh>6}XiFP) zn#ua(urU8~f%zX%Xqh%@NfSP0neq4sp8q2(^rbC=hBe{0Ax8ebDPhO|OBUMF7D2n4 z@b@D|{^x=3|J8iaPaEGC68=`i$p19({-3MAiBkQ~Q_6=6y8iR|UjOr?5#Q^7o-pEj z{S97A;`xUg(ed~C8@`rs{jr7I|MKVG>t6=Jwcy{T=MP7X_+EcAV8r+On}?0~UVn4g zh`&nbpRZ*W>u-hf`;GXO%I9mLMgGf_|9}zS>yP#s@xA_tuf-PQU!miFzY*W-pY|B> zz5Z#p5#Q^dcr0Nt|6c#Zf6KAp&)4<0(}?f&Pxlz{z5WRQmSi&iUVn6_5#Q@ycr0eI z{=EKVn-PDKuK&$Oe6N4#GU9vvL#Gkn>krzE_`d$nV^NFs@9Y0O7Pa8}`hT+#-`D?n cENhX!ufNwD@e6eS;jySi{=WWSH$wcs0Z&{AN&o-= literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres10/16396_1.fqtest b/format/postgres/testdata/flavours/postgres10/16396_1.fqtest new file mode 100644 index 000000000..7c0114fb3 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres10/16396_1.fqtest @@ -0,0 +1,9 @@ +$ fq -d pg_heap -o flavour=postgres10 ".[0].pd_linp[0,-1] | dv" 16396 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[75]{}: item_id 0x144-0x147.7 (4) +0x140| 80 82 f2 00 | .... | lp_off: 640 0x144-0x147.7 (4) +0x140| 80 82 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x144-0x147.7 (4) +0x140| 80 82 f2 00 | .... | lp_len: 121 0x144-0x147.7 (4) diff --git a/format/postgres/testdata/flavours/postgres10/16407 b/format/postgres/testdata/flavours/postgres10/16407 new file mode 100644 index 0000000000000000000000000000000000000000..631e77ea70d6180e1b0adbd59a280134db10133f GIT binary patch literal 16384 zcmeI(`J0br`v>sz9?Qr&wuWqjOtNHd{IjQCeuEh0y1D&z$G^9LM+l4}5=l9LIU+bM(5e&vjqdc`f&SeTay}G`bpwzhr(` zYM4Z2kIMY-w2cY!0wM_!hloI=Z%B}Rh-5@OA_|eQK0)3=q#_a!F$h7Vt;6+*Bt#q{ z0+GHJ*CUb<@rWoy#u{9YNJS(dVi1BzTaD`xNr*T^1R{MEu16#z;t^4ZjFq?^k%~w_ z#2^HbwgT59k`Qr-2t@jFT#rab#3P~*8Ov}zA{CKA_))KrA_)=eF5@o$UjgtkTdwQ(iPR`C%@W! z<^apAf5JeK7Wg}(l=^(+SDDYe|4iTe0g=Wizj6`vdC9Ldf1mk0H$@iR426p1R-cFb z3iILS52IlZ{~ijB3e@K&zudgH|HvwVB%nR(-+C*n{qG~c%zS3uGh=ux0$(=wy82w? zmzvLQzSHj_3-IBi%j(0)FENiQWR-uaW*}St427zGr9LP5#pbenov4`32@Z zpBJ6Q^oGh6-KstyKi|B!=T}_=8D3E2i#6(n{5hnz- z^|#2+Fz@{}@>h}E`0#EM^?#9{ZrD zNx}F%g5)TlNBs@*lgxYjNNcFig9v#4$CH8Fix3&HNBxiFM^X71GXg1%WIDH5 z{Z;ZK$(MOHkdwcJLUmWG|AG7n^WHvPDj?qqh%`x6|2_HP<~<+AmOyUa3x#&iP=AGd zl6jvW{%MT41m!Q9sQxnfVN{8$ zMfG2kA7I||VL;_T3gBjbh*JL*`Tpj8e(UuU<_F|wSfu(d$vf$$dyqfcQ)D#! zt)1#WBH!J-xBt4f$WM%yMw`_Ci+nfpo)2Zuhe`j+&yep*zA^S!S26$BSg8Iq z`7Y*tJa$APO+kP4ov!{v@}13l{%^p3ax<Z1(uP>GG|108tw?(QyO8yD+oAn`kYP_ z83g}DnEE5+TblRza~8(?U95Srx8KN`-wu;+VczG%IpstyA>YC?)E^@MxOuH#6_^VM-~H1DN0To>2cL`KIQ5{`t08Ak8q? zZtPP32KgrDz5Qc~iQGnit=gpi0QtsL|LNFY<-&SYXr=ns$;X-Z{M>}+sYPh4X$#cv zC*R1t-|xc2KoXJ9v7^<$M*cDLKA-%I=f{4?hdhJTze>KLdB5L+lSMk>ey_Aq{|fmA z=DmMgQlF=`hDcR%!sOXcV65y(D)CFOaWn-p6le-0v0aPm&VVZzNxd>aztG4nlI@>!N-G`G?K>ex^a)K(3+l zuD4OYo_s~BPuvrM)JFN&nyOz%{vq=|e-3C9$T|2Q>Zo5!KAP(P!)qcnaK8~T>erC3 zVBYijB=&m|n12pDsD3s12hDr_zS!TQ{#{;D zzkqx(^FDq@pAzYS_doK2`uXG|ss4AS1rmn&@XB)a^T^+C-rHvu{(m9N52^FiKTp1> zdC%wl)kIpOvu{sVpF+NfdB5MYmGQifn<+d&{ao^e&HMd6j{QtHDtBU-`Z?qanfLKt zw64gP81J79P(Pb|LG#{U6^~&-{~F-^@P|=KX#@eM#gP`gdVl^)tyA zFpna$&LfUL63BAAKffHOeg^sc=6yVdUlNJLezjsP_0!4cGw=6XIR^VrjF)Ux)K4Ry z*ZhC`w;}dRxcQ~!)F+eAW8TMa#_&J};^sF-s-H?eHB zAhXe5UEWhafqV}0o)5p)#(aYP>Xbd|$CJ-a<;P*a{W+dzZ){ONj(j#Mf8o0#pJ%?$ zU#osB`7kQ~j}n0#!2MR8qkatez`T#gx9W)G!20s)VD*_fpHc6}%;x^z`9IG6|9AeM z@c(-L|MLGipA7zc{_peUCsPAyfe(q#9?P0P_L5&m`Q9}*=7VcEKTK4=hx}R^PlZxN zCSg2n?XG?|`8DM8?ZLZs)Ms40`j^PBruuw<`ENb;k2jmC-$j0vc~l{5{)-=j-!EXk zIay!*PVy_w`+PZhav;%Iua?HB-$8zbd0$ULIG^l{=d(%C>bH|$PUU}%^NKr|lTVdY zzm5Dd^FH5P#`&ILf6+2R{Z{fz&HMTgi}#D?(4KX2sNX_<36=lm4-NQsNY0>5!I(Wo~LVIeQtVA{R`w5 zn)mhjJkDDh6~g(|8TA{Iex7;H zx4{!cnxXUl+NXXU`RA!V5jb1wiG28LyZW`{Q_Oq+Ub|o9Z@j;pxL*Al@^i^w!6;~s z^|NQH`qkv;nD_QQ|AUZQk?q0O}JS3WeHDRlkz_Eb~Z#tnt_~8t3Qm zcSoyVL4GFHzus=VA4UC-4_3dN{0yppR3!Ebcpg2`R{b*a)6M(%eXMmLV=%wvj8(ss z{512PKbNbB{DyqXUPAp6^2z4?e#1tHl*Ro<-9DN%z7~`B^M7yu324|@JgKBlo zXx{Vl{X-&i@V;=~N9yO3pFr)|0l&}cgZE*Nom4-M{CM-ezaBO$kXKQ;21nFCPktPg zA5lr-JjCpUL%9zim;lr-Y>gSLjZQk3bP8&Q6 zAwP4jQ9qmfDDys_jKX}i2lIc-V)e7gk2LT7+qW6^vREJQ%uzp+{0Q?tKNmtiw}8(* zRs9U|!_9lXWg8Mm2=DW1j8Q+Ge3E%@pUBtsedOyy)K4Qn%)GbHD7=3MmXdW4w=VuYL;oA?E#l;|m8eANz-6E!9sZ|EziM zudz2o#^7dB8mXT|ez19OpBFLr-^F~=DpvhO@`KEKf0a+f`7QD%dnNS~$PYB{?ej`_ zAfs_JPnT6cp8PZBz5R>h_Z@Fzy(>~&{W$Ui%zM7|!}-iF__9S2>c^7rZ{FMU{Cczv z)`EiJ>c^0OntVPM3AYu@MQZ%X1k7Wy!EWloae|YQC?27_UU{c3-?$W7FzU1{}Ck#9}D+FqRHAfGQ4 zRo{#J6XZ+%B@%`G#=rBa?@7LudGD_zocH#^{P02!^*zY9H1GL23bq6GZ{zPB$(ldA zlW$?(+voGrIFH5pQs@u$-N-*~-t)N_^7(yy$Npc`cO~E4ypPAPh6a*`_UwOIeHZf0 z%=>)U2RA+m^U3M2)ORM|l**sB81I9TpWQ!J--&z^^WL8O8)2`94~eJLcO>7~ytmH{ z%n!@3ziob0eFyS!RG(~TLf4fUVDrs2=!hT>R_G7~)t8Y!du6ggTGb=@YMRLD5O8pb$>rj2FSH^xDjeB8``c~v? zoA>!@b_Cx4VE(V!SA9$Ju~dGCwWvSxe@Zv?Ey&lR^7q~m*@XJ6XsiBl@{dyaH#Xw; zr`Vr_nyYV4z9yAF2z#q*=!}vL)i)zw!@SQA=WpWQ2VgutR6~7J^3~0I{=7d0>jlpD zW>!?+gnW#7&*!1I@G0c~>{99*ldopp^X)`Yv?s>b*~04M$UkD<=Z8IbA6OF4BfIWX z--vuw^PZm%;(gs1KT=yYi6w+T<&k_x=h^2;>Cv?d^T)W63{A^ASiY7SE$NnK~jQSYze*W+6dGI#Q^N|mghN!Pb z-p~I%{|Enw^LaE@T%!6%$d|PGd-+9o^DAaroJ-y;^w`7r{Ul06v1HFQBQp(^2N-1|3=~c|D$+5T2oE^!{j5)`}i7( z^<@Cs|4aq-70KUE^~ro+(F6H#xTN}r$QL#5>(`_0k#E?a)GeewntTze{{`I0Nc8WV zTnifOIo5!@|LDI*e2{!0^PX=*AH?s2FhBqCyZZ9v3sU*d;P>q9Fn=EY zMSVH)5$3(W&SSo6T3F=hck0WMFJRu+i@DKw9>@3%eWgB%e17xZzuUgS`!Rgja#npA z^7+hr|7O2}cN?hxiucu*CZCsl`-RAVtVc_ZsxL)8k9l7oqrbzyZ@_$Y{eb$CC zQDg{y|8j4M`eNjBn)m+t2LJe@7H+;*iuy?MIm~Og=F0?Z3I4zOPu- HM*V*P9-fmP literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres10/16407_1.fqtest b/format/postgres/testdata/flavours/postgres10/16407_1.fqtest new file mode 100644 index 000000000..8f254bb62 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres10/16407_1.fqtest @@ -0,0 +1,9 @@ +$ fq -d pg_heap -o flavour=postgres10 ".[0].pd_linp[0,-1] | dv" 16407 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) diff --git a/format/postgres/testdata/flavours/postgres10/16407_2.fqtest b/format/postgres/testdata/flavours/postgres10/16407_2.fqtest new file mode 100644 index 000000000..ef6d2cba9 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres10/16407_2.fqtest @@ -0,0 +1,95 @@ +$ fq -d pg_heap -o flavour=postgres10 ".[0].tuples[0,-1] | dv" 16407 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fd0-0x1fff.7 (48) + | | | header{}: 0x1fd0-0x1fe7.7 (24) + | | | t_choice{}: 0x1fd0-0x1fdb.7 (12) + | | | t_heap{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|76 74 00 00 |vt.. | t_xmin: 29814 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | t_xmax: 0 0x1fd4-0x1fd7.7 (4) + | | | t_field3{}: 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_cid: 3 0x1fd8-0x1fdb.7 (4) +0x1fd0| 03 00 00 00 | .... | t_xvac: 3 0x1fd8-0x1fdb.7 (4) + | | | t_datum{}: 0x1fd0-0x1fdb.7 (12) +0x1fd0|76 74 00 00 |vt.. | datum_len_: 29814 0x1fd0-0x1fd3.7 (4) +0x1fd0| 00 00 00 00 | .... | datum_typmod: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 03 00 00 00 | .... | datum_typeid: 3 0x1fd8-0x1fdb.7 (4) + | | | t_ctid{}: 0x1fdc-0x1fe1.7 (6) +0x1fd0| 00 00 00 00| ....| ip_blkid: 0 0x1fdc-0x1fdf.7 (4) +0x1fe0|01 00 |.. | ip_posid: 1 0x1fe0-0x1fe1.7 (2) +0x1fe0| 06 00 | .. | t_infomask2: 6 0x1fe2-0x1fe3.7 (2) + | | | infomask2{}: 0x1fe4-NA (0) + | | | heap_keys_updated: false 0x1fe4-NA (0) + | | | heap_hot_updated: false 0x1fe4-NA (0) + | | | heap_only_tuple: false 0x1fe4-NA (0) +0x1fe0| 01 09 | .. | t_infomask: 2305 0x1fe4-0x1fe5.7 (2) + | | | infomask{}: 0x1fe6-NA (0) + | | | heap_hasnull: true 0x1fe6-NA (0) + | | | heap_hasvarwidth: false 0x1fe6-NA (0) + | | | heap_hasexternal: false 0x1fe6-NA (0) + | | | heap_hasoid_old: false 0x1fe6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fe6-NA (0) + | | | heap_combocid: false 0x1fe6-NA (0) + | | | heap_xmax_excl_lock: false 0x1fe6-NA (0) + | | | heap_xmax_lock_only: false 0x1fe6-NA (0) + | | | heap_xmax_shr_lock: false 0x1fe6-NA (0) + | | | heap_lock_mask: false 0x1fe6-NA (0) + | | | heap_xmin_committed: true 0x1fe6-NA (0) + | | | heap_xmin_invalid: false 0x1fe6-NA (0) + | | | heap_xmin_frozen: true 0x1fe6-NA (0) + | | | heap_xmax_committed: false 0x1fe6-NA (0) + | | | heap_xmax_invalid: true 0x1fe6-NA (0) + | | | heap_xmax_is_multi: false 0x1fe6-NA (0) + | | | heap_updated: false 0x1fe6-NA (0) + | | | heap_moved_off: false 0x1fe6-NA (0) + | | | heap_moved_in: false 0x1fe6-NA (0) + | | | heap_moved: false 0x1fe6-NA (0) +0x1fe0| 18 | . | t_hoff: 24 0x1fe6-0x1fe6.7 (1) +0x1fe0| 1f | . | padding0: 31 0x1fe7-0x1fe7.7 (1) +0x1fe0| 03 00 00 00 01 00 00 00| ........| data: "0300000001000000ba38000005100000b26ab433368d020..." (raw bits) 0x1fe8-0x1fff.7 (24) +0x1ff0|ba 38 00 00 05 10 00 00 b2 6a b4 33 36 8d 02 00|.8.......j.36...| + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[156]{}: tuple 0x290-0x2bf.7 (48) + | | | header{}: 0x290-0x2a7.7 (24) + | | | t_choice{}: 0x290-0x29b.7 (12) + | | | t_heap{}: 0x290-0x29b.7 (12) +0x290|12 75 00 00 |.u.. | t_xmin: 29970 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | t_xmax: 0 0x294-0x297.7 (4) + | | | t_field3{}: 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_cid: 3 0x298-0x29b.7 (4) +0x290| 03 00 00 00 | .... | t_xvac: 3 0x298-0x29b.7 (4) + | | | t_datum{}: 0x290-0x29b.7 (12) +0x290|12 75 00 00 |.u.. | datum_len_: 29970 0x290-0x293.7 (4) +0x290| 00 00 00 00 | .... | datum_typmod: 0 0x294-0x297.7 (4) +0x290| 03 00 00 00 | .... | datum_typeid: 3 0x298-0x29b.7 (4) + | | | t_ctid{}: 0x29c-0x2a1.7 (6) +0x290| 00 00 00 00| ....| ip_blkid: 0 0x29c-0x29f.7 (4) +0x2a0|9d 00 |.. | ip_posid: 157 0x2a0-0x2a1.7 (2) +0x2a0| 06 00 | .. | t_infomask2: 6 0x2a2-0x2a3.7 (2) + | | | infomask2{}: 0x2a4-NA (0) + | | | heap_keys_updated: false 0x2a4-NA (0) + | | | heap_hot_updated: false 0x2a4-NA (0) + | | | heap_only_tuple: false 0x2a4-NA (0) +0x2a0| 01 09 | .. | t_infomask: 2305 0x2a4-0x2a5.7 (2) + | | | infomask{}: 0x2a6-NA (0) + | | | heap_hasnull: true 0x2a6-NA (0) + | | | heap_hasvarwidth: false 0x2a6-NA (0) + | | | heap_hasexternal: false 0x2a6-NA (0) + | | | heap_hasoid_old: false 0x2a6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x2a6-NA (0) + | | | heap_combocid: false 0x2a6-NA (0) + | | | heap_xmax_excl_lock: false 0x2a6-NA (0) + | | | heap_xmax_lock_only: false 0x2a6-NA (0) + | | | heap_xmax_shr_lock: false 0x2a6-NA (0) + | | | heap_lock_mask: false 0x2a6-NA (0) + | | | heap_xmin_committed: true 0x2a6-NA (0) + | | | heap_xmin_invalid: false 0x2a6-NA (0) + | | | heap_xmin_frozen: true 0x2a6-NA (0) + | | | heap_xmax_committed: false 0x2a6-NA (0) + | | | heap_xmax_invalid: true 0x2a6-NA (0) + | | | heap_xmax_is_multi: false 0x2a6-NA (0) + | | | heap_updated: false 0x2a6-NA (0) + | | | heap_moved_off: false 0x2a6-NA (0) + | | | heap_moved_in: false 0x2a6-NA (0) + | | | heap_moved: false 0x2a6-NA (0) +0x2a0| 18 | . | t_hoff: 24 0x2a6-0x2a6.7 (1) +0x2a0| 1f | . | padding0: 31 0x2a7-0x2a7.7 (1) +0x2a0| 06 00 00 00 01 00 00 00| ........| data: "06000000010000001d950000a6fbffff6d42bb33368d020..." (raw bits) 0x2a8-0x2bf.7 (24) +0x2b0|1d 95 00 00 a6 fb ff ff 6d 42 bb 33 36 8d 02 00|........mB.36...| diff --git a/format/postgres/testdata/flavours/postgres10/pg_control b/format/postgres/testdata/flavours/postgres10/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..f0df88c1b1e9d8cf11618ad18aa797ea36b46742 GIT binary patch literal 8192 zcmeaN+z@%x+a~!HGXulvbF4gU3=l9k%qAJc5_t5M2}BnhgwQu0LTE;y7z~5tlPZ8j z0z?eNR{`pR$%AN^c_29u0ILVmAUR?IOzjJxTREVb9H2Ce58}38Gje250I`6M0MiVN z4nQ7=d4?TG02MPr4J(hm#;yB0aocW##fxUfv2HrUV%fB0iQWzSWeYFly?doKFG5%o zsACk2hQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By f2#kinXb6mkz-S1JhQMeDjE2By2#kinpbh~50d6Qs literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres10/pg_control.fqtest b/format/postgres/testdata/flavours/postgres10/pg_control.fqtest new file mode 100644 index 000000000..88f44fabb --- /dev/null +++ b/format/postgres/testdata/flavours/postgres10/pg_control.fqtest @@ -0,0 +1,69 @@ +$ fq -d pg_control -o flavour=postgres10 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|4c 79 b0 59 c5 4b 3c 63 |Ly.Y.K Date: Wed, 5 Oct 2022 19:37:42 +0300 Subject: [PATCH 088/141] postgres: refactoring --- format/postgres/flavours/pgpro10/pg_control.go | 2 +- format/postgres/pg_btree.go | 1 + format/postgres/pg_control.go | 1 + format/postgres/pg_heap.go | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/format/postgres/flavours/pgpro10/pg_control.go b/format/postgres/flavours/pgpro10/pg_control.go index 4d5bc9fcc..f8c54eb06 100644 --- a/format/postgres/flavours/pgpro10/pg_control.go +++ b/format/postgres/flavours/pgpro10/pg_control.go @@ -49,7 +49,7 @@ func DecodePgControl(d *decode.D, in any) any { d.FieldU64("backup_end_point", common.LocPtrMapper) d.FieldU8("backup_end_required") d.FieldU24("hole3") - + d.FieldS32("wal_level", common.WalLevel) d.FieldU8("wal_log_hints") d.FieldU24("hole4") diff --git a/format/postgres/pg_btree.go b/format/postgres/pg_btree.go index 829d4a2c2..35367cc7a 100644 --- a/format/postgres/pg_btree.go +++ b/format/postgres/pg_btree.go @@ -2,6 +2,7 @@ package postgres import ( "embed" + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 5678e95ce..bed5f6a10 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -2,6 +2,7 @@ package postgres import ( "embed" + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/pgpro10" diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index 99a995e7f..b395a64ef 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -2,6 +2,7 @@ package postgres import ( "embed" + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/pgpro10" "github.com/wader/fq/format/postgres/flavours/pgpro11" From 12b869732f548d4ab2df9cc640a4cbb3cf20fe5d Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 5 Oct 2022 19:41:54 +0300 Subject: [PATCH 089/141] postgres: regenerate docs --- doc/formats.md | 12 +- doc/formats.svg | 1642 ++++++++++++++++++++++++----------------------- 2 files changed, 839 insertions(+), 815 deletions(-) diff --git a/doc/formats.md b/doc/formats.md index f1ea74e40..e5f559003 100644 --- a/doc/formats.md +++ b/doc/formats.md @@ -265,7 +265,7 @@ Decode value as bitcoin_block ### Show full decoding ```sh -$ fq -d bplist dv Info.plist +$ fq d Info.plist ``` ### Timestamps @@ -654,20 +654,20 @@ $ fq -d pg_btree -o flavour=postgres14 ".[1]" 16404 ### Options -|Name |Default |Description| -|- |- |-| -|`flavour`|postgres14|PostgreSQL flavour: postgres14, pgproee14.., postgres10| +|Name |Default|Description| +|- |- |-| +|`flavour`| |PostgreSQL flavour: postgres14, pgproee14.., postgres10| ### Examples Decode file using pg_control options ``` -$ fq -d pg_control -o flavour="postgres14" . file +$ fq -d pg_control -o flavour="" . file ``` Decode value as pg_control ``` -... | pg_control({flavour:"postgres14"}) +... | pg_control({flavour:""}) ``` ### Decode content of pg_control file diff --git a/doc/formats.svg b/doc/formats.svg index 5684341c3..141f95291 100644 --- a/doc/formats.svg +++ b/doc/formats.svg @@ -4,1950 +4,1974 @@ - - + + formats - + adts - -adts - -adts_frame + +adts + +adts_frame adts_frame - -adts_frame - -aac_frame + +adts_frame + +aac_frame adts:e->adts_frame:n - - + + aac_frame - -aac_frame + +aac_frame adts_frame:e->aac_frame:n - - + + apev2 - -apev2 - -image + +apev2 + +image image - -image + +image apev2:e->image:n - - + + jpeg - -jpeg - -exif - -icc_profile + +jpeg + +exif + +icc_profile image->jpeg:n - - + + mp4 - -mp4 - -aac_frame - -av1_ccr - -av1_frame - -avc_au - -avc_dcr - -flac_frame - -flac_metadatablocks - -hevc_au - -hevc_dcr - -icc_profile - -id3v2 - -image - -jpeg - -mp3_frame - -mpeg_es - -mpeg_pes_packet - -opus_packet - -prores_frame - -protobuf_widevine - -pssh_playready - -vorbis_packet - -vp9_frame - -vpx_ccr + +mp4 + +aac_frame + +av1_ccr + +av1_frame + +avc_au + +avc_dcr + +flac_frame + +flac_metadatablocks + +hevc_au + +hevc_dcr + +icc_profile + +id3v2 + +image + +jpeg + +mp3_frame + +mpeg_es + +mpeg_pes_packet + +opus_packet + +prores_frame + +protobuf_widevine + +pssh_playready + +vorbis_packet + +vp9_frame + +vpx_ccr image->mp4:n - - + + png - -png - -icc_profile - -exif + +png + +icc_profile + +exif image->png:n - - + + tiff - -tiff - -icc_profile + +tiff + +icc_profile image->tiff:n - - + + webp - -webp - -vp8_frame + +webp + +vp8_frame image->webp:n - - + + gif - -gif + +gif image->gif:n - - + + ar - -ar - -probe + +ar + +probe probe - -probe + +probe ar:e->probe:n - - + + probe->adts:n - - + + probe->ar:n - - + + bitcoin_blkdat - -bitcoin_blkdat - -bitcoin_block + +bitcoin_blkdat + +bitcoin_block probe->bitcoin_blkdat:n - - + + bzip2 - -bzip2 - -probe + +bzip2 + +probe probe->bzip2:n - - + + flac - -flac - -flac_metadatablocks - -flac_frame + +flac + +flac_metadatablocks + +flac_frame probe->flac:n - - + + gzip - -gzip - -probe + +gzip + +probe probe->gzip:n - - + + probe->jpeg:n - - + + macho_fat - -macho_fat - -macho + +macho_fat + +macho probe->macho_fat:n - - + + macho - -macho + +macho probe->macho:n - - + + matroska - -matroska - -aac_frame - -av1_ccr - -av1_frame - -avc_au - -avc_dcr - -flac_frame - -flac_metadatablocks - -hevc_au - -hevc_dcr - -image - -mp3_frame - -mpeg_asc - -mpeg_pes_packet - -mpeg_spu - -opus_packet - -vorbis_packet - -vp8_frame - -vp9_cfm - -vp9_frame + +matroska + +aac_frame + +av1_ccr + +av1_frame + +avc_au + +avc_dcr + +flac_frame + +flac_metadatablocks + +hevc_au + +hevc_dcr + +image + +mp3_frame + +mpeg_asc + +mpeg_pes_packet + +mpeg_spu + +opus_packet + +vorbis_packet + +vp8_frame + +vp9_cfm + +vp9_frame probe->matroska:n - - + + mp3 - -mp3 - -id3v2 - -id3v1 - -id3v11 - -apev2 - -mp3_frame + +mp3 + +id3v2 + +id3v1 + +id3v11 + +apev2 + +mp3_frame probe->mp3:n - - + + probe->mp4:n - - + + ogg - -ogg - -ogg_page - -vorbis_packet - -opus_packet - -flac_metadatablock - -flac_frame + +ogg + +ogg_page + +vorbis_packet + +opus_packet + +flac_metadatablock + +flac_frame probe->ogg:n - - + + pcap - -pcap - -link_frame - -tcp_stream - -ipv4_packet + +pcap + +link_frame + +tcp_stream + +ipv4_packet probe->pcap:n - - + + pcapng - -pcapng - -link_frame - -tcp_stream - -ipv4_packet + +pcapng + +link_frame + +tcp_stream + +ipv4_packet probe->pcapng:n - - + + probe->png:n - - + + tar - -tar - -probe + +tar + +probe probe->tar:n - - + + probe->tiff:n - - + + wav - -wav - -id3v2 - -id3v1 - -id3v11 + +wav + +id3v2 + +id3v1 + +id3v11 probe->wav:n - - + + probe->webp:n - - + + zip - -zip - -probe + +zip + +probe probe->zip:n - - + + avro_ocf - -avro_ocf + +avro_ocf probe->avro_ocf:n - - + + bplist - -bplist + +bplist probe->bplist:n - - + + elf - -elf + +elf probe->elf:n - - + + probe->gif:n - - + + json - -json + +json probe->json:n - - + + jsonl - -jsonl + +jsonl probe->jsonl:n - - + + mpeg_ts - -mpeg_ts + +mpeg_ts probe->mpeg_ts:n - - + + toml - -toml + +toml probe->toml:n - - + + wasm - -wasm + +wasm probe->wasm:n - - + + xml - -xml + +xml probe->xml:n - - + + yaml - -yaml + +yaml probe->yaml:n - - + + av1_frame - -av1_frame - -av1_obu + +av1_frame + +av1_obu av1_obu - -av1_obu + +av1_obu av1_frame:e->av1_obu:n - - + + avc_annexb - -avc_annexb - -avc_nalu + +avc_annexb + +avc_nalu avc_nalu - -avc_nalu - -avc_sps - -avc_pps - -avc_sei + +avc_nalu + +avc_sps + +avc_pps + +avc_sei avc_annexb:e->avc_nalu:n - - + + avc_sps - -avc_sps + +avc_sps avc_nalu:e->avc_sps:n - - + + avc_pps - -avc_pps + +avc_pps avc_nalu:e->avc_pps:n - - + + avc_sei - -avc_sei + +avc_sei avc_nalu:e->avc_sei:n - - + + avc_au - -avc_au - -avc_nalu + +avc_au + +avc_nalu avc_au:e->avc_nalu:n - - + + avc_dcr - -avc_dcr - -avc_nalu + +avc_dcr + +avc_nalu avc_dcr:e->avc_nalu:n - - + + bitcoin_block - -bitcoin_block - -bitcoin_transaction + +bitcoin_block + +bitcoin_transaction bitcoin_blkdat:e->bitcoin_block:n - - + + bitcoin_transaction - -bitcoin_transaction - -bitcoin_script + +bitcoin_transaction + +bitcoin_script bitcoin_block:e->bitcoin_transaction:n - - + + bitcoin_script - -bitcoin_script + +bitcoin_script bitcoin_transaction:e->bitcoin_script:n - - + + bsd_loopback_frame - -bsd_loopback_frame - -inet_packet + +bsd_loopback_frame + +inet_packet inet_packet - -inet_packet + +inet_packet bsd_loopback_frame:e->inet_packet:n - - + + ipv4_packet - -ipv4_packet - -ip_packet + +ipv4_packet + +ip_packet inet_packet->ipv4_packet:n - - + + ipv6_packet - -ipv6_packet - -ip_packet + +ipv6_packet + +ip_packet inet_packet->ipv6_packet:n - - + + bzip2:e->probe:n - - + + ether8023_frame - -ether8023_frame - -inet_packet + +ether8023_frame + +inet_packet ether8023_frame:e->inet_packet:n - - + + flac_metadatablocks - -flac_metadatablocks - -flac_metadatablock + +flac_metadatablocks + +flac_metadatablock flac:e->flac_metadatablocks:n - - + + flac_frame - -flac_frame + +flac_frame flac:e->flac_frame:n - - + + flac_metadatablock - -flac_metadatablock - -flac_streaminfo - -flac_picture - -vorbis_comment + +flac_metadatablock + +flac_streaminfo + +flac_picture + +vorbis_comment flac_metadatablocks:e->flac_metadatablock:n - - + + flac_streaminfo - -flac_streaminfo + +flac_streaminfo flac_metadatablock:e->flac_streaminfo:n - - + + flac_picture - -flac_picture - -image + +flac_picture + +image flac_metadatablock:e->flac_picture:n - - + + vorbis_comment - -vorbis_comment - -flac_picture + +vorbis_comment + +flac_picture flac_metadatablock:e->vorbis_comment:n - - + + flac_picture:e->image:n - - + + vorbis_comment:e->flac_picture:n - - + + gzip:e->probe:n - - + + hevc_annexb - -hevc_annexb - -hevc_nalu + +hevc_annexb + +hevc_nalu hevc_nalu - -hevc_nalu - -hevc_vps - -hevc_pps - -hevc_sps + +hevc_nalu + +hevc_vps + +hevc_pps + +hevc_sps hevc_annexb:e->hevc_nalu:n - - + + hevc_vps - -hevc_vps + +hevc_vps hevc_nalu:e->hevc_vps:n - - + + hevc_pps - -hevc_pps + +hevc_pps hevc_nalu:e->hevc_pps:n - - + + hevc_sps - -hevc_sps + +hevc_sps hevc_nalu:e->hevc_sps:n - - + + hevc_au - -hevc_au - -hevc_nalu + +hevc_au + +hevc_nalu hevc_au:e->hevc_nalu:n - - + + hevc_dcr - -hevc_dcr - -hevc_nalu + +hevc_dcr + +hevc_nalu hevc_dcr:e->hevc_nalu:n - - + + id3v2 - -id3v2 - -image + +id3v2 + +image id3v2:e->image:n - - + + ip_packet - -ip_packet + +ip_packet ipv4_packet:e->ip_packet:n - - + + udp_datagram - -udp_datagram - -udp_payload + +udp_datagram + +udp_payload ip_packet->udp_datagram:n - - + + icmp - -icmp + +icmp ip_packet->icmp:n - - + + icmpv6 - -icmpv6 + +icmpv6 ip_packet->icmpv6:n - - + + tcp_segment - -tcp_segment + +tcp_segment ip_packet->tcp_segment:n - - + + ipv6_packet:e->ip_packet:n - - + + exif - -exif + +exif jpeg:e->exif:n - - + + icc_profile - -icc_profile + +icc_profile jpeg:e->icc_profile:n - - + + macho_fat:e->macho:n - - + + matroska:e->aac_frame:n - - + + matroska:e->image:n - - + + matroska:e->av1_frame:n - - + + matroska:e->avc_au:n - - + + matroska:e->avc_dcr:n - - + + matroska:e->flac_metadatablocks:n - - + + matroska:e->flac_frame:n - - + + matroska:e->hevc_au:n - - + + matroska:e->hevc_dcr:n - - + + av1_ccr - -av1_ccr + +av1_ccr matroska:e->av1_ccr:n - - + + mp3_frame - -mp3_frame - -xing + +mp3_frame + +xing matroska:e->mp3_frame:n - - + + mpeg_asc - -mpeg_asc + +mpeg_asc matroska:e->mpeg_asc:n - - + + mpeg_pes_packet - -mpeg_pes_packet + +mpeg_pes_packet matroska:e->mpeg_pes_packet:n - - + + mpeg_spu - -mpeg_spu + +mpeg_spu matroska:e->mpeg_spu:n - - + + opus_packet - -opus_packet - -vorbis_comment + +opus_packet + +vorbis_comment matroska:e->opus_packet:n - - + + vorbis_packet - -vorbis_packet - -vorbis_comment + +vorbis_packet + +vorbis_comment matroska:e->vorbis_packet:n - - + + vp8_frame - -vp8_frame + +vp8_frame matroska:e->vp8_frame:n - - + + vp9_cfm - -vp9_cfm + +vp9_cfm matroska:e->vp9_cfm:n - - + + vp9_frame - -vp9_frame + +vp9_frame matroska:e->vp9_frame:n - - + + xing - -xing + +xing mp3_frame:e->xing:n - - + + opus_packet:e->vorbis_comment:n - - + + vorbis_packet:e->vorbis_comment:n - - + + mp3:e->apev2:n - - + + mp3:e->id3v2:n - - + + mp3:e->mp3_frame:n - - + + id3v1 - -id3v1 + +id3v1 mp3:e->id3v1:n - - + + id3v11 - -id3v11 + +id3v11 mp3:e->id3v11:n - - + + mp4:e->aac_frame:n - - + + mp4:e->image:n - - + + mp4:e->av1_frame:n - - + + mp4:e->avc_au:n - - + + mp4:e->avc_dcr:n - - + + mp4:e->flac_metadatablocks:n - - + + mp4:e->flac_frame:n - - + + mp4:e->hevc_au:n - - + + mp4:e->hevc_dcr:n - - + + mp4:e->id3v2:n - - + + mp4:e->jpeg:n - - + + mp4:e->icc_profile:n - - + + mp4:e->av1_ccr:n - - + + mp4:e->mp3_frame:n - - + + mp4:e->mpeg_pes_packet:n - - + + mp4:e->opus_packet:n - - + + mp4:e->vorbis_packet:n - - + + mp4:e->vp9_frame:n - - + + mpeg_es - -mpeg_es - -mpeg_asc - -vorbis_packet + +mpeg_es + +mpeg_asc + +vorbis_packet mp4:e->mpeg_es:n - - + + prores_frame - -prores_frame + +prores_frame mp4:e->prores_frame:n - - + + protobuf_widevine - -protobuf_widevine - -protobuf + +protobuf_widevine + +protobuf mp4:e->protobuf_widevine:n - - + + pssh_playready - -pssh_playready + +pssh_playready mp4:e->pssh_playready:n - - + + vpx_ccr - -vpx_ccr + +vpx_ccr mp4:e->vpx_ccr:n - - + + mpeg_es:e->mpeg_asc:n - - + + mpeg_es:e->vorbis_packet:n - - + + protobuf - -protobuf + +protobuf protobuf_widevine:e->protobuf:n - - + + mpeg_pes - -mpeg_pes - -mpeg_pes_packet - -mpeg_spu + +mpeg_pes + +mpeg_pes_packet + +mpeg_spu mpeg_pes:e->mpeg_pes_packet:n - - + + mpeg_pes:e->mpeg_spu:n - - + + ogg:e->flac_frame:n - - + + ogg:e->flac_metadatablock:n - - + + ogg:e->opus_packet:n - - + + ogg:e->vorbis_packet:n - - + + ogg_page - -ogg_page + +ogg_page ogg:e->ogg_page:n - - + + pcap:e->ipv4_packet:n - - + + link_frame - -link_frame + +link_frame pcap:e->link_frame:n - - + + tcp_stream - -tcp_stream + +tcp_stream pcap:e->tcp_stream:n - - + + link_frame->bsd_loopback_frame:n - - + + link_frame->ether8023_frame:n - - + + sll2_packet - -sll2_packet - -inet_packet + +sll2_packet + +inet_packet link_frame->sll2_packet:n - - + + sll_packet - -sll_packet - -inet_packet + +sll_packet + +inet_packet link_frame->sll_packet:n - - + + rtmp - -rtmp - -amf0 - -mpeg_asc + +rtmp + +amf0 + +mpeg_asc tcp_stream->rtmp:n - - + + dns_tcp - -dns_tcp + +dns_tcp tcp_stream->dns_tcp:n - - + + pcapng:e->ipv4_packet:n - - + + pcapng:e->link_frame:n - - + + pcapng:e->tcp_stream:n - - + + png:e->exif:n - - + + png:e->icc_profile:n - - + + rtmp:e->mpeg_asc:n - - + + amf0 - -amf0 + +amf0 rtmp:e->amf0:n - - + + sll2_packet:e->inet_packet:n - - + + sll_packet:e->inet_packet:n - - + + tar:e->probe:n - - + + tiff:e->icc_profile:n - - + + udp_payload - -udp_payload + +udp_payload udp_datagram:e->udp_payload:n - - + + dns - -dns + +dns udp_payload->dns:n - - + + wav:e->id3v2:n - - + + wav:e->id3v1:n - - + + wav:e->id3v11:n - - + + webp:e->vp8_frame:n - - + + zip:e->probe:n - - + + asn1_ber - -asn1_ber + +asn1_ber bencode - -bencode + +bencode bson - -bson + +bson cbor - -cbor + +cbor csv - -csv + +csv fairplay_spc - -fairplay_spc + +fairplay_spc html - -html + +html markdown - -markdown + +markdown msgpack - -msgpack + +msgpack - + +pg_btree + +pg_btree + + + +pg_control + +pg_control + + + +pg_heap + +pg_heap + + + +pg_wal + +pg_wal + + + raw - -raw + +raw From 03d8fe1c614dc374f12b7456204bacb56ca56b0e Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 7 Oct 2022 11:58:03 +0300 Subject: [PATCH 090/141] postgres: page sum impl --- format/postgres/common/checksum.go | 67 +++++++++++++++++++ .../flavours/pgproee14/ee14/pgheap.go | 2 +- .../flavours/postgres14/common14/heap_page.go | 3 +- .../flavours/postgres14/common14/pg_heap.go | 26 ++++++- 4 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 format/postgres/common/checksum.go diff --git a/format/postgres/common/checksum.go b/format/postgres/common/checksum.go new file mode 100644 index 000000000..de84b6a81 --- /dev/null +++ b/format/postgres/common/checksum.go @@ -0,0 +1,67 @@ +package common + +import "encoding/binary" + +const ( + nSums = 32 + fnvPrime = 16777619 + nSumsSize = 4 * nSums + mainBlockLen = 8192 / nSumsSize +) + +var ( + checksumBaseOffsets = [nSums]uint32{ + 0x5B1F36E9, 0xB8525960, 0x02AB50AA, 0x1DE66D2A, + 0x79FF467A, 0x9BB9F8A3, 0x217E7CD2, 0x83E13D2C, + 0xF8D4474F, 0xE39EB970, 0x42C6AE16, 0x993216FA, + 0x7B093B5D, 0x98DAFF3C, 0xF718902A, 0x0B1C9CDB, + 0xE58F764B, 0x187636BC, 0x5D7B3BB1, 0xE73DE7DE, + 0x92BEC979, 0xCCA6C0B2, 0x304A0979, 0x85AA43D4, + 0x783125BB, 0x6CA8EAA2, 0xE407EAC6, 0x4B5CFC3E, + 0x9FBF8C76, 0x15CA20BE, 0xF2CA9FD3, 0x959BD756, + } +) + +func checksumComp(checksum uint32, value uint32) uint32 { + __tmp := checksum ^ value + checksum = __tmp*fnvPrime ^ (__tmp >> 17) + return checksum +} + +func pgChecksumBlock(page []byte) uint32 { + sums := [nSums]uint32{0} + for i := 0; i < nSums; i++ { + sums[i] = checksumBaseOffsets[i] + } + result := uint32(0) + + for i := 0; i < mainBlockLen; i++ { + for j := 0; j < nSums; j++ { + v2 := binary.LittleEndian.Uint32(page[i*nSumsSize+j*4:]) + sums[j] = checksumComp(sums[j], v2) + } + } + + for i := 0; i < 2; i++ { + for j := 0; j < nSums; j++ { + sums[j] = checksumComp(sums[j], 0) + } + } + + for i := 0; i < nSums; i++ { + result = result ^ sums[i] + } + + return result +} + +func CheckSumBlock(page []byte, blockNumber uint32) uint16 { + // set pd_checksum to zero + page[8] = 0 + page[9] = 0 + + sum := pgChecksumBlock(page) + sum1 := sum ^ blockNumber + sum2 := uint16((sum1 % 65535) + 1) + return sum2 +} diff --git a/format/postgres/flavours/pgproee14/ee14/pgheap.go b/format/postgres/flavours/pgproee14/ee14/pgheap.go index a68f8fa3a..cc3a3f6a7 100644 --- a/format/postgres/flavours/pgproee14/ee14/pgheap.go +++ b/format/postgres/flavours/pgproee14/ee14/pgheap.go @@ -22,7 +22,7 @@ func DecodePageHeaderData(page *common14.HeapPage, d *decode.D) { d.FieldU32("xlogid", common.HexMapper) d.FieldU32("xrecoff", common.HexMapper) }) - d.FieldU16("pd_checksum") + page.PdChecksum = uint16(d.FieldU16("pd_checksum")) d.FieldU16("pd_flags") page.PdLower = uint16(d.FieldU16("pd_lower")) page.PdUpper = uint16(d.FieldU16("pd_upper")) diff --git a/format/postgres/flavours/postgres14/common14/heap_page.go b/format/postgres/flavours/postgres14/common14/heap_page.go index e1a4d489e..6d31b9dd9 100644 --- a/format/postgres/flavours/postgres14/common14/heap_page.go +++ b/format/postgres/flavours/postgres14/common14/heap_page.go @@ -23,6 +23,7 @@ type ItemID struct { type HeapPage struct { // PageHeaderData fields + PdChecksum uint16 PdLower uint16 PdUpper uint16 PdSpecial uint16 @@ -48,7 +49,7 @@ func DecodePageHeader(page *HeapPage, d *decode.D) { d.FieldU32("xlogid", common.HexMapper) d.FieldU32("xrecoff", common.HexMapper) }) - d.FieldU16("pd_checksum") + page.PdChecksum = uint16(d.FieldU16("pd_checksum")) d.FieldU16("pd_flags") page.PdLower = uint16(d.FieldU16("pd_lower")) page.PdUpper = uint16(d.FieldU16("pd_upper")) diff --git a/format/postgres/flavours/postgres14/common14/pg_heap.go b/format/postgres/flavours/postgres14/common14/pg_heap.go index d79ddf133..085a9fa79 100644 --- a/format/postgres/flavours/postgres14/common14/pg_heap.go +++ b/format/postgres/flavours/postgres14/common14/pg_heap.go @@ -2,7 +2,6 @@ package common14 import ( "fmt" - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" @@ -145,14 +144,16 @@ func DecodeHeap(heap *Heap, d *decode.D) any { } func decodeHeapPages(heap *Heap, d *decode.D) { + blockNumber := uint32(0) for { if end, _ := d.TryEnd(); end { return } d.FieldStruct("page", func(d *decode.D) { - decodeHeapPage(heap, d) + decodeHeapPage(heap, d, blockNumber) }) + blockNumber++ // end of Page endLen := uint64(d.Pos() / 8) @@ -161,7 +162,7 @@ func decodeHeapPages(heap *Heap, d *decode.D) { } } -func decodeHeapPage(heap *Heap, d *decode.D) { +func decodeHeapPage(heap *Heap, d *decode.D, blockNumber uint32) { page := &HeapPage{} if heap.Page != nil { // use prev page @@ -171,8 +172,14 @@ func decodeHeapPage(heap *Heap, d *decode.D) { heap.Page = page heap.Special = &PageSpecial{} + checkSum := calcCheckSum(d, heap.PageSize, blockNumber) + d.FieldStruct("page_header", func(d *decode.D) { heap.DecodePageHeaderData(page, d) + + d.FieldValueU("pd_checksum_check", uint64(checkSum)) + sumEqual := page.PdChecksum == checkSum + d.FieldValueBool("pd_checksum_check_equal", sumEqual) }) DecodeItemIds(page, d) @@ -187,6 +194,19 @@ func decodeHeapPage(heap *Heap, d *decode.D) { }) } +func calcCheckSum(d *decode.D, pageSize uint64, blockNumber uint32) uint16 { + pos0 := d.Pos() + pageBuffer := make([]byte, pageSize) + rdrPage := d.RawLen(int64(pageSize * 8)) + _, err := rdrPage.ReadBits(pageBuffer, int64(pageSize*8)) + if err != nil { + d.Fatalf("can't read page, err = %v\n", err) + } + sum2 := common.CheckSumBlock(pageBuffer, blockNumber) + d.SeekAbs(pos0) + return sum2 +} + func decodeTuples(heap *Heap, d *decode.D) { page := heap.Page for i := 0; i < len(page.ItemIds); i++ { From 46e1e337ffcc64a1ea0d8e1f1b20f653c5c0bd7e Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 7 Oct 2022 12:04:49 +0300 Subject: [PATCH 091/141] postgres: make page size const --- format/postgres/common/checksum.go | 2 +- format/postgres/common/pgheap.go | 2 +- format/postgres/flavours/pgpro10/pg_heap.go | 2 -- format/postgres/flavours/pgpro11/pg_heap.go | 2 -- format/postgres/flavours/pgpro12/pg_heap.go | 2 -- format/postgres/flavours/pgpro13/pg_heap.go | 2 -- format/postgres/flavours/pgpro14/pg_heap.go | 2 -- format/postgres/flavours/pgproee10/pg_heap.go | 2 -- format/postgres/flavours/pgproee11/pg_heap.go | 2 -- format/postgres/flavours/pgproee12/pg_heap.go | 2 -- format/postgres/flavours/pgproee13/pg_heap.go | 2 -- format/postgres/flavours/pgproee14/pg_heap.go | 2 -- format/postgres/flavours/postgres10/pg_heap.go | 2 -- format/postgres/flavours/postgres11/pg_heap.go | 2 -- format/postgres/flavours/postgres12/pg_heap.go | 2 -- format/postgres/flavours/postgres13/pg_heap.go | 2 -- .../flavours/postgres14/common14/pg_heap.go | 18 ++++++++---------- .../postgres/flavours/postgres14/pg_btree.go | 2 +- format/postgres/flavours/postgres14/pg_heap.go | 2 -- 19 files changed, 11 insertions(+), 43 deletions(-) diff --git a/format/postgres/common/checksum.go b/format/postgres/common/checksum.go index de84b6a81..014c5a4b6 100644 --- a/format/postgres/common/checksum.go +++ b/format/postgres/common/checksum.go @@ -6,7 +6,7 @@ const ( nSums = 32 fnvPrime = 16777619 nSumsSize = 4 * nSums - mainBlockLen = 8192 / nSumsSize + mainBlockLen = PageSize / nSumsSize ) var ( diff --git a/format/postgres/common/pgheap.go b/format/postgres/common/pgheap.go index 45b84fe70..9c4c7da17 100644 --- a/format/postgres/common/pgheap.go +++ b/format/postgres/common/pgheap.go @@ -6,7 +6,7 @@ import ( //nolint:revive const ( - HeapPageSize = 8192 + PageSize = 8192 FirstNormalTransactionID = 3 LP_UNUSED = 0 /* unused (should always have lp_len=0) */ diff --git a/format/postgres/flavours/pgpro10/pg_heap.go b/format/postgres/flavours/pgpro10/pg_heap.go index 6433801a7..81537134c 100644 --- a/format/postgres/flavours/pgpro10/pg_heap.go +++ b/format/postgres/flavours/pgpro10/pg_heap.go @@ -1,14 +1,12 @@ package pgpro10 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/pgpro11/pg_heap.go b/format/postgres/flavours/pgpro11/pg_heap.go index 65922fe66..4f45d6ca1 100644 --- a/format/postgres/flavours/pgpro11/pg_heap.go +++ b/format/postgres/flavours/pgpro11/pg_heap.go @@ -1,7 +1,6 @@ package pgpro11 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -54,7 +53,6 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/pgpro12/pg_heap.go b/format/postgres/flavours/pgpro12/pg_heap.go index 08990c299..fe56e960c 100644 --- a/format/postgres/flavours/pgpro12/pg_heap.go +++ b/format/postgres/flavours/pgpro12/pg_heap.go @@ -1,7 +1,6 @@ package pgpro12 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -55,7 +54,6 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/pgpro13/pg_heap.go b/format/postgres/flavours/pgpro13/pg_heap.go index 386b404ab..71f1b45f8 100644 --- a/format/postgres/flavours/pgpro13/pg_heap.go +++ b/format/postgres/flavours/pgpro13/pg_heap.go @@ -1,7 +1,6 @@ package pgpro13 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -55,7 +54,6 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/pgpro14/pg_heap.go b/format/postgres/flavours/pgpro14/pg_heap.go index a6179d479..4d3185523 100644 --- a/format/postgres/flavours/pgpro14/pg_heap.go +++ b/format/postgres/flavours/pgpro14/pg_heap.go @@ -1,7 +1,6 @@ package pgpro14 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -55,7 +54,6 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/pgproee10/pg_heap.go b/format/postgres/flavours/pgproee10/pg_heap.go index 59ae83f3d..9a2ae5e1e 100644 --- a/format/postgres/flavours/pgproee10/pg_heap.go +++ b/format/postgres/flavours/pgproee10/pg_heap.go @@ -1,7 +1,6 @@ package pgproee10 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" @@ -56,7 +55,6 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: ee14.DecodePageHeaderData, DecodePageSpecial: ee14.DecodePageSpecial, } diff --git a/format/postgres/flavours/pgproee11/pg_heap.go b/format/postgres/flavours/pgproee11/pg_heap.go index 3850a8999..3ee47cb56 100644 --- a/format/postgres/flavours/pgproee11/pg_heap.go +++ b/format/postgres/flavours/pgproee11/pg_heap.go @@ -1,7 +1,6 @@ package pgproee11 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" @@ -75,7 +74,6 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: ee14.DecodePageHeaderData, DecodePageSpecial: ee14.DecodePageSpecial, } diff --git a/format/postgres/flavours/pgproee12/pg_heap.go b/format/postgres/flavours/pgproee12/pg_heap.go index a4ec069c4..ff3e8800c 100644 --- a/format/postgres/flavours/pgproee12/pg_heap.go +++ b/format/postgres/flavours/pgproee12/pg_heap.go @@ -1,7 +1,6 @@ package pgproee12 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" @@ -56,7 +55,6 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: ee14.DecodePageHeaderData, DecodePageSpecial: ee14.DecodePageSpecial, } diff --git a/format/postgres/flavours/pgproee13/pg_heap.go b/format/postgres/flavours/pgproee13/pg_heap.go index b1a46bbd0..072ba0041 100644 --- a/format/postgres/flavours/pgproee13/pg_heap.go +++ b/format/postgres/flavours/pgproee13/pg_heap.go @@ -1,7 +1,6 @@ package pgproee13 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" @@ -56,7 +55,6 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: ee14.DecodePageHeaderData, DecodePageSpecial: ee14.DecodePageSpecial, } diff --git a/format/postgres/flavours/pgproee14/pg_heap.go b/format/postgres/flavours/pgproee14/pg_heap.go index e8129a701..fee5c422d 100644 --- a/format/postgres/flavours/pgproee14/pg_heap.go +++ b/format/postgres/flavours/pgproee14/pg_heap.go @@ -1,7 +1,6 @@ package pgproee14 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" @@ -83,7 +82,6 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: ee14.DecodePageHeaderData, DecodePageSpecial: ee14.DecodePageSpecial, } diff --git a/format/postgres/flavours/postgres10/pg_heap.go b/format/postgres/flavours/postgres10/pg_heap.go index a9a228026..d2feb536b 100644 --- a/format/postgres/flavours/postgres10/pg_heap.go +++ b/format/postgres/flavours/postgres10/pg_heap.go @@ -1,14 +1,12 @@ package postgres10 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/postgres11/pg_heap.go b/format/postgres/flavours/postgres11/pg_heap.go index 79eee072a..cb099837a 100644 --- a/format/postgres/flavours/postgres11/pg_heap.go +++ b/format/postgres/flavours/postgres11/pg_heap.go @@ -1,7 +1,6 @@ package postgres11 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -67,7 +66,6 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/postgres12/pg_heap.go b/format/postgres/flavours/postgres12/pg_heap.go index 9ad79e93d..0b4ec93e6 100644 --- a/format/postgres/flavours/postgres12/pg_heap.go +++ b/format/postgres/flavours/postgres12/pg_heap.go @@ -1,7 +1,6 @@ package postgres12 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -67,7 +66,6 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/postgres13/pg_heap.go b/format/postgres/flavours/postgres13/pg_heap.go index 8732e7f73..6a4fee3ed 100644 --- a/format/postgres/flavours/postgres13/pg_heap.go +++ b/format/postgres/flavours/postgres13/pg_heap.go @@ -1,7 +1,6 @@ package postgres13 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -48,7 +47,6 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/postgres14/common14/pg_heap.go b/format/postgres/flavours/postgres14/common14/pg_heap.go index 085a9fa79..2a9d942c9 100644 --- a/format/postgres/flavours/postgres14/common14/pg_heap.go +++ b/format/postgres/flavours/postgres14/common14/pg_heap.go @@ -110,8 +110,6 @@ const SizeOfHeapTupleHeaderData = 24 /* total size (bytes): 6 */ type Heap struct { - PageSize uint64 - // current Page Page *HeapPage // Page special data @@ -157,7 +155,7 @@ func decodeHeapPages(heap *Heap, d *decode.D) { // end of Page endLen := uint64(d.Pos() / 8) - pageEnd := common.TypeAlign(heap.PageSize, endLen) + pageEnd := common.TypeAlign(common.PageSize, endLen) d.SeekAbs(int64(pageEnd) * 8) } } @@ -168,11 +166,11 @@ func decodeHeapPage(heap *Heap, d *decode.D, blockNumber uint32) { // use prev page page.BytesPosBegin = heap.Page.BytesPosEnd } - page.BytesPosEnd = int64(common.TypeAlign(heap.PageSize, uint64(page.BytesPosBegin)+1)) + page.BytesPosEnd = int64(common.TypeAlign(common.PageSize, uint64(page.BytesPosBegin)+1)) heap.Page = page heap.Special = &PageSpecial{} - checkSum := calcCheckSum(d, heap.PageSize, blockNumber) + checkSum := calcCheckSum(d, blockNumber) d.FieldStruct("page_header", func(d *decode.D) { heap.DecodePageHeaderData(page, d) @@ -184,7 +182,7 @@ func decodeHeapPage(heap *Heap, d *decode.D, blockNumber uint32) { DecodeItemIds(page, d) - if uint64(page.PdSpecial) != heap.PageSize && heap.DecodePageSpecial != nil { + if uint64(page.PdSpecial) != common.PageSize && heap.DecodePageSpecial != nil { heap.DecodePageSpecial(heap, d) } @@ -194,11 +192,11 @@ func decodeHeapPage(heap *Heap, d *decode.D, blockNumber uint32) { }) } -func calcCheckSum(d *decode.D, pageSize uint64, blockNumber uint32) uint16 { +func calcCheckSum(d *decode.D, blockNumber uint32) uint16 { pos0 := d.Pos() - pageBuffer := make([]byte, pageSize) - rdrPage := d.RawLen(int64(pageSize * 8)) - _, err := rdrPage.ReadBits(pageBuffer, int64(pageSize*8)) + pageBuffer := make([]byte, common.PageSize) + rdrPage := d.RawLen(int64(common.PageSize * 8)) + _, err := rdrPage.ReadBits(pageBuffer, int64(common.PageSize*8)) if err != nil { d.Fatalf("can't read page, err = %v\n", err) } diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/flavours/postgres14/pg_btree.go index 89e69a88d..f795f389d 100644 --- a/format/postgres/flavours/postgres14/pg_btree.go +++ b/format/postgres/flavours/postgres14/pg_btree.go @@ -70,7 +70,7 @@ func DecodePgBTree(d *decode.D) any { d.SeekAbs(0) btree := &BTree{ - PageSize: common.HeapPageSize, + PageSize: common.PageSize, } decodeBTreePages(btree, d) diff --git a/format/postgres/flavours/postgres14/pg_heap.go b/format/postgres/flavours/postgres14/pg_heap.go index 56e923af1..58495455e 100644 --- a/format/postgres/flavours/postgres14/pg_heap.go +++ b/format/postgres/flavours/postgres14/pg_heap.go @@ -1,7 +1,6 @@ package postgres14 import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -21,7 +20,6 @@ import ( func DecodeHeap(d *decode.D) any { heap := &common14.Heap{ - PageSize: common.HeapPageSize, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) From 4676590624c6e625aee07b51830a640b82355fab Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 7 Oct 2022 12:58:36 +0300 Subject: [PATCH 092/141] postgres: add argument to calc page's check sum correctly --- format/format.go | 6 +++ format/postgres/common/checksum.go | 1 + format/postgres/flavours/pgpro10/pg_heap.go | 4 +- format/postgres/flavours/pgpro11/pg_heap.go | 4 +- format/postgres/flavours/pgpro12/pg_heap.go | 4 +- format/postgres/flavours/pgpro13/pg_heap.go | 4 +- format/postgres/flavours/pgpro14/pg_heap.go | 4 +- format/postgres/flavours/pgproee10/pg_heap.go | 4 +- format/postgres/flavours/pgproee11/pg_heap.go | 4 +- format/postgres/flavours/pgproee12/pg_heap.go | 4 +- format/postgres/flavours/pgproee13/pg_heap.go | 4 +- format/postgres/flavours/pgproee14/pg_heap.go | 4 +- .../postgres/flavours/postgres10/pg_heap.go | 4 +- .../postgres/flavours/postgres11/pg_heap.go | 4 +- .../postgres/flavours/postgres12/pg_heap.go | 4 +- .../postgres/flavours/postgres13/pg_heap.go | 4 +- .../flavours/postgres14/common14/pg_heap.go | 5 ++- .../postgres/flavours/postgres14/pg_heap.go | 4 +- format/postgres/pg_heap.go | 40 ++++++++++--------- 19 files changed, 77 insertions(+), 35 deletions(-) diff --git a/format/format.go b/format/format.go index ee8d8191e..79b9502ef 100644 --- a/format/format.go +++ b/format/format.go @@ -328,6 +328,12 @@ type PostgresIn struct { Flavour string `doc:"PostgreSQL flavour: postgres14, pgproee14.., postgres10"` } +type PostgresHeapIn struct { + Flavour string `doc:"PostgreSQL flavour: postgres14, pgproee14.., postgres10"` + PageNumber int `doc:"First page number in file, default is 0"` + SegmentNumber int `doc:"Segment file number (16790.1 is 1), default is 0"` +} + type PostgresWalIn struct { Flavour string `doc:"PostgreSQL flavour: postgres14, pgproee14.., postgres10"` Lsn string `doc:"Current LSN for WAL, use \"select pg_current_wal_lsn()\""` diff --git a/format/postgres/common/checksum.go b/format/postgres/common/checksum.go index 014c5a4b6..69061dae2 100644 --- a/format/postgres/common/checksum.go +++ b/format/postgres/common/checksum.go @@ -7,6 +7,7 @@ const ( fnvPrime = 16777619 nSumsSize = 4 * nSums mainBlockLen = PageSize / nSumsSize + RelSegSize = 131072 ) var ( diff --git a/format/postgres/flavours/pgpro10/pg_heap.go b/format/postgres/flavours/pgpro10/pg_heap.go index 81537134c..644b7038a 100644 --- a/format/postgres/flavours/pgpro10/pg_heap.go +++ b/format/postgres/flavours/pgpro10/pg_heap.go @@ -1,12 +1,14 @@ package pgpro10 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/pgpro11/pg_heap.go b/format/postgres/flavours/pgpro11/pg_heap.go index 4f45d6ca1..b5cc90030 100644 --- a/format/postgres/flavours/pgpro11/pg_heap.go +++ b/format/postgres/flavours/pgpro11/pg_heap.go @@ -1,6 +1,7 @@ package pgpro11 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -51,8 +52,9 @@ import ( // /* total size (bytes): 12 */ -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/pgpro12/pg_heap.go b/format/postgres/flavours/pgpro12/pg_heap.go index fe56e960c..ac053076f 100644 --- a/format/postgres/flavours/pgpro12/pg_heap.go +++ b/format/postgres/flavours/pgpro12/pg_heap.go @@ -1,6 +1,7 @@ package pgpro12 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -52,8 +53,9 @@ import ( // /* total size (bytes): 12 */ -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/pgpro13/pg_heap.go b/format/postgres/flavours/pgpro13/pg_heap.go index 71f1b45f8..5e3533424 100644 --- a/format/postgres/flavours/pgpro13/pg_heap.go +++ b/format/postgres/flavours/pgpro13/pg_heap.go @@ -1,6 +1,7 @@ package pgpro13 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -52,8 +53,9 @@ import ( // /* total size (bytes): 12 */ -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/pgpro14/pg_heap.go b/format/postgres/flavours/pgpro14/pg_heap.go index 4d3185523..af6e299d2 100644 --- a/format/postgres/flavours/pgpro14/pg_heap.go +++ b/format/postgres/flavours/pgpro14/pg_heap.go @@ -1,6 +1,7 @@ package pgpro14 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -52,8 +53,9 @@ import ( // /* total size (bytes): 12 */ -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/pgproee10/pg_heap.go b/format/postgres/flavours/pgproee10/pg_heap.go index 9a2ae5e1e..0c20e6b51 100644 --- a/format/postgres/flavours/pgproee10/pg_heap.go +++ b/format/postgres/flavours/pgproee10/pg_heap.go @@ -1,6 +1,7 @@ package pgproee10 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" @@ -53,8 +54,9 @@ import ( // /* total size (bytes): 24 */ -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: ee14.DecodePageHeaderData, DecodePageSpecial: ee14.DecodePageSpecial, } diff --git a/format/postgres/flavours/pgproee11/pg_heap.go b/format/postgres/flavours/pgproee11/pg_heap.go index 3ee47cb56..c0b62ba45 100644 --- a/format/postgres/flavours/pgproee11/pg_heap.go +++ b/format/postgres/flavours/pgproee11/pg_heap.go @@ -1,6 +1,7 @@ package pgproee11 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" @@ -72,8 +73,9 @@ import ( // /* total size (bytes): 24 */ -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: ee14.DecodePageHeaderData, DecodePageSpecial: ee14.DecodePageSpecial, } diff --git a/format/postgres/flavours/pgproee12/pg_heap.go b/format/postgres/flavours/pgproee12/pg_heap.go index ff3e8800c..74b63d928 100644 --- a/format/postgres/flavours/pgproee12/pg_heap.go +++ b/format/postgres/flavours/pgproee12/pg_heap.go @@ -1,6 +1,7 @@ package pgproee12 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" @@ -53,8 +54,9 @@ import ( // /* total size (bytes): 24 */ -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: ee14.DecodePageHeaderData, DecodePageSpecial: ee14.DecodePageSpecial, } diff --git a/format/postgres/flavours/pgproee13/pg_heap.go b/format/postgres/flavours/pgproee13/pg_heap.go index 072ba0041..6b1ded543 100644 --- a/format/postgres/flavours/pgproee13/pg_heap.go +++ b/format/postgres/flavours/pgproee13/pg_heap.go @@ -1,6 +1,7 @@ package pgproee13 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" @@ -53,8 +54,9 @@ import ( // /* total size (bytes): 24 */ -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: ee14.DecodePageHeaderData, DecodePageSpecial: ee14.DecodePageSpecial, } diff --git a/format/postgres/flavours/pgproee14/pg_heap.go b/format/postgres/flavours/pgproee14/pg_heap.go index fee5c422d..ffc5c91b4 100644 --- a/format/postgres/flavours/pgproee14/pg_heap.go +++ b/format/postgres/flavours/pgproee14/pg_heap.go @@ -1,6 +1,7 @@ package pgproee14 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" @@ -80,8 +81,9 @@ import ( // /* total size (bytes): 24 */ -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: ee14.DecodePageHeaderData, DecodePageSpecial: ee14.DecodePageSpecial, } diff --git a/format/postgres/flavours/postgres10/pg_heap.go b/format/postgres/flavours/postgres10/pg_heap.go index d2feb536b..262d89eae 100644 --- a/format/postgres/flavours/postgres10/pg_heap.go +++ b/format/postgres/flavours/postgres10/pg_heap.go @@ -1,12 +1,14 @@ package postgres10 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/postgres11/pg_heap.go b/format/postgres/flavours/postgres11/pg_heap.go index cb099837a..2944c2be5 100644 --- a/format/postgres/flavours/postgres11/pg_heap.go +++ b/format/postgres/flavours/postgres11/pg_heap.go @@ -1,6 +1,7 @@ package postgres11 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -64,8 +65,9 @@ import ( // /* total size (bytes): 6 */ -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/postgres12/pg_heap.go b/format/postgres/flavours/postgres12/pg_heap.go index 0b4ec93e6..4012907ca 100644 --- a/format/postgres/flavours/postgres12/pg_heap.go +++ b/format/postgres/flavours/postgres12/pg_heap.go @@ -1,6 +1,7 @@ package postgres12 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -64,8 +65,9 @@ import ( // /* total size (bytes): 6 */ -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/postgres13/pg_heap.go b/format/postgres/flavours/postgres13/pg_heap.go index 6a4fee3ed..2a1536182 100644 --- a/format/postgres/flavours/postgres13/pg_heap.go +++ b/format/postgres/flavours/postgres13/pg_heap.go @@ -1,6 +1,7 @@ package postgres13 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -45,8 +46,9 @@ import ( // /* total size (bytes): 12 */ -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/flavours/postgres14/common14/pg_heap.go b/format/postgres/flavours/postgres14/common14/pg_heap.go index 2a9d942c9..cad9c4df6 100644 --- a/format/postgres/flavours/postgres14/common14/pg_heap.go +++ b/format/postgres/flavours/postgres14/common14/pg_heap.go @@ -2,6 +2,7 @@ package common14 import ( "fmt" + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" @@ -110,6 +111,8 @@ const SizeOfHeapTupleHeaderData = 24 /* total size (bytes): 6 */ type Heap struct { + Args format.PostgresHeapIn + // current Page Page *HeapPage // Page special data @@ -142,7 +145,7 @@ func DecodeHeap(heap *Heap, d *decode.D) any { } func decodeHeapPages(heap *Heap, d *decode.D) { - blockNumber := uint32(0) + blockNumber := uint32(heap.Args.PageNumber + heap.Args.SegmentNumber*common.RelSegSize) for { if end, _ := d.TryEnd(); end { return diff --git a/format/postgres/flavours/postgres14/pg_heap.go b/format/postgres/flavours/postgres14/pg_heap.go index 58495455e..d3d6a64f1 100644 --- a/format/postgres/flavours/postgres14/pg_heap.go +++ b/format/postgres/flavours/postgres14/pg_heap.go @@ -1,6 +1,7 @@ package postgres14 import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14/common14" "github.com/wader/fq/pkg/decode" ) @@ -18,8 +19,9 @@ import ( // /* total size (bytes): 24 */ -func DecodeHeap(d *decode.D) any { +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { heap := &common14.Heap{ + Args: args, DecodePageHeaderData: common14.DecodePageHeader, } return common14.DecodeHeap(heap, d) diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index b395a64ef..4e0599227 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -34,8 +34,10 @@ func init() { Name: format.PG_HEAP, Description: "PostgreSQL heap file", DecodeFn: decodePgheap, - DecodeInArg: format.PostgresIn{ - Flavour: PG_FLAVOUR_POSTGRES14, + DecodeInArg: format.PostgresHeapIn{ + Flavour: PG_FLAVOUR_POSTGRES14, + PageNumber: 0, + SegmentNumber: 0, }, RootArray: true, RootName: "pages", @@ -46,46 +48,46 @@ func init() { func decodePgheap(d *decode.D, in any) any { d.Endian = decode.LittleEndian - pgIn, ok := in.(format.PostgresIn) + pgIn, ok := in.(format.PostgresHeapIn) if !ok { d.Fatalf("DecodeInArg must be PostgresIn!\n") } switch pgIn.Flavour { case PG_FLAVOUR_POSTGRES10: - return postgres10.DecodeHeap(d) + return postgres10.DecodeHeap(d, pgIn) case PG_FLAVOUR_POSTGRES11: - return postgres11.DecodeHeap(d) + return postgres11.DecodeHeap(d, pgIn) case PG_FLAVOUR_POSTGRES12: - return postgres12.DecodeHeap(d) + return postgres12.DecodeHeap(d, pgIn) case PG_FLAVOUR_POSTGRES13: - return postgres13.DecodeHeap(d) + return postgres13.DecodeHeap(d, pgIn) case PG_FLAVOUR_POSTGRES14: - return postgres14.DecodeHeap(d) + return postgres14.DecodeHeap(d, pgIn) case PG_FLAVOUR_PGPROEE10: - return pgproee10.DecodeHeap(d) + return pgproee10.DecodeHeap(d, pgIn) case PG_FLAVOUR_PGPROEE11: - return pgproee11.DecodeHeap(d) + return pgproee11.DecodeHeap(d, pgIn) case PG_FLAVOUR_PGPROEE12: - return pgproee12.DecodeHeap(d) + return pgproee12.DecodeHeap(d, pgIn) case PG_FLAVOUR_PGPROEE13: - return pgproee13.DecodeHeap(d) + return pgproee13.DecodeHeap(d, pgIn) case PG_FLAVOUR_PGPROEE14: - return pgproee14.DecodeHeap(d) + return pgproee14.DecodeHeap(d, pgIn) case PG_FLAVOUR_PGPRO10: - return pgpro10.DecodeHeap(d) + return pgpro10.DecodeHeap(d, pgIn) case PG_FLAVOUR_PGPRO11: - return pgpro11.DecodeHeap(d) + return pgpro11.DecodeHeap(d, pgIn) case PG_FLAVOUR_PGPRO12: - return pgpro12.DecodeHeap(d) + return pgpro12.DecodeHeap(d, pgIn) case PG_FLAVOUR_PGPRO13: - return pgpro13.DecodeHeap(d) + return pgpro13.DecodeHeap(d, pgIn) case PG_FLAVOUR_PGPRO14: - return pgpro14.DecodeHeap(d) + return pgpro14.DecodeHeap(d, pgIn) default: break } - return postgres14.DecodeHeap(d) + return postgres14.DecodeHeap(d, pgIn) } From e06fa6e13993fa6454e0dab2ecac8a41e6d35858 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 7 Oct 2022 13:33:05 +0300 Subject: [PATCH 093/141] postgres: refactoring --- .../pgheap.go => common/pg_heap/pgproee/pg_heap.go} | 8 ++++---- .../pg_heap/postgres}/heap_page.go | 2 +- .../common14 => common/pg_heap/postgres}/pg_heap.go | 2 +- format/postgres/flavours/pgpro10/pg_heap.go | 8 ++++---- format/postgres/flavours/pgpro11/pg_heap.go | 8 ++++---- format/postgres/flavours/pgpro12/pg_heap.go | 8 ++++---- format/postgres/flavours/pgpro13/pg_heap.go | 8 ++++---- format/postgres/flavours/pgpro14/pg_heap.go | 8 ++++---- format/postgres/flavours/pgproee10/pg_heap.go | 12 ++++++------ format/postgres/flavours/pgproee11/pg_heap.go | 12 ++++++------ format/postgres/flavours/pgproee12/pg_heap.go | 12 ++++++------ format/postgres/flavours/pgproee13/pg_heap.go | 12 ++++++------ format/postgres/flavours/pgproee14/pg_heap.go | 12 ++++++------ format/postgres/flavours/postgres10/pg_heap.go | 8 ++++---- format/postgres/flavours/postgres11/pg_heap.go | 8 ++++---- format/postgres/flavours/postgres12/pg_heap.go | 8 ++++---- format/postgres/flavours/postgres13/pg_heap.go | 8 ++++---- format/postgres/flavours/postgres14/pg_btree.go | 12 ++++++------ format/postgres/flavours/postgres14/pg_heap.go | 8 ++++---- 19 files changed, 82 insertions(+), 82 deletions(-) rename format/postgres/{flavours/pgproee14/ee14/pgheap.go => common/pg_heap/pgproee/pg_heap.go} (90%) rename format/postgres/{flavours/postgres14/common14 => common/pg_heap/postgres}/heap_page.go (99%) rename format/postgres/{flavours/postgres14/common14 => common/pg_heap/postgres}/pg_heap.go (99%) diff --git a/format/postgres/flavours/pgproee14/ee14/pgheap.go b/format/postgres/common/pg_heap/pgproee/pg_heap.go similarity index 90% rename from format/postgres/flavours/pgproee14/ee14/pgheap.go rename to format/postgres/common/pg_heap/pgproee/pg_heap.go index cc3a3f6a7..0b4d54be1 100644 --- a/format/postgres/flavours/pgproee14/ee14/pgheap.go +++ b/format/postgres/common/pg_heap/pgproee/pg_heap.go @@ -1,8 +1,8 @@ -package ee14 +package pgproee import ( "github.com/wader/fq/format/postgres/common" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -15,7 +15,7 @@ import ( /* 16 | 2 */ // LocationIndex pd_special; /* 18 | 2 */ // uint16 pd_pagesize_version; /* 20 | 0 */ // ItemIdData pd_linp[]; -func DecodePageHeaderData(page *common14.HeapPage, d *decode.D) { +func DecodePageHeaderData(page *postgres.HeapPage, d *decode.D) { d.FieldStruct("pd_lsn", func(d *decode.D) { /* 0 | 4 */ // uint32 xlogid; /* 4 | 4 */ // uint32 xrecoff; @@ -41,7 +41,7 @@ func DecodePageHeaderData(page *common14.HeapPage, d *decode.D) { /* 20 | 4 */ // uint32 pd_magic; // /* total size (bytes): 24 */ -func DecodePageSpecial(heap *common14.Heap, d *decode.D) { +func DecodePageSpecial(heap *postgres.Heap, d *decode.D) { page := heap.Page special := heap.Special diff --git a/format/postgres/flavours/postgres14/common14/heap_page.go b/format/postgres/common/pg_heap/postgres/heap_page.go similarity index 99% rename from format/postgres/flavours/postgres14/common14/heap_page.go rename to format/postgres/common/pg_heap/postgres/heap_page.go index 6d31b9dd9..07bc5a175 100644 --- a/format/postgres/flavours/postgres14/common14/heap_page.go +++ b/format/postgres/common/pg_heap/postgres/heap_page.go @@ -1,4 +1,4 @@ -package common14 +package postgres import ( "github.com/wader/fq/format/postgres/common" diff --git a/format/postgres/flavours/postgres14/common14/pg_heap.go b/format/postgres/common/pg_heap/postgres/pg_heap.go similarity index 99% rename from format/postgres/flavours/postgres14/common14/pg_heap.go rename to format/postgres/common/pg_heap/postgres/pg_heap.go index cad9c4df6..424cea14b 100644 --- a/format/postgres/flavours/postgres14/common14/pg_heap.go +++ b/format/postgres/common/pg_heap/postgres/pg_heap.go @@ -1,4 +1,4 @@ -package common14 +package postgres import ( "fmt" diff --git a/format/postgres/flavours/pgpro10/pg_heap.go b/format/postgres/flavours/pgpro10/pg_heap.go index 644b7038a..8a5d99cb1 100644 --- a/format/postgres/flavours/pgpro10/pg_heap.go +++ b/format/postgres/flavours/pgpro10/pg_heap.go @@ -2,14 +2,14 @@ package pgpro10 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres2.Heap{ Args: args, - DecodePageHeaderData: common14.DecodePageHeader, + DecodePageHeaderData: postgres2.DecodePageHeader, } - return common14.DecodeHeap(heap, d) + return postgres2.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgpro11/pg_heap.go b/format/postgres/flavours/pgpro11/pg_heap.go index b5cc90030..629854fc5 100644 --- a/format/postgres/flavours/pgpro11/pg_heap.go +++ b/format/postgres/flavours/pgpro11/pg_heap.go @@ -2,7 +2,7 @@ package pgpro11 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -53,9 +53,9 @@ import ( /* total size (bytes): 12 */ func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres2.Heap{ Args: args, - DecodePageHeaderData: common14.DecodePageHeader, + DecodePageHeaderData: postgres2.DecodePageHeader, } - return common14.DecodeHeap(heap, d) + return postgres2.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgpro12/pg_heap.go b/format/postgres/flavours/pgpro12/pg_heap.go index ac053076f..32ba3fbd2 100644 --- a/format/postgres/flavours/pgpro12/pg_heap.go +++ b/format/postgres/flavours/pgpro12/pg_heap.go @@ -2,7 +2,7 @@ package pgpro12 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -54,9 +54,9 @@ import ( /* total size (bytes): 12 */ func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres2.Heap{ Args: args, - DecodePageHeaderData: common14.DecodePageHeader, + DecodePageHeaderData: postgres2.DecodePageHeader, } - return common14.DecodeHeap(heap, d) + return postgres2.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgpro13/pg_heap.go b/format/postgres/flavours/pgpro13/pg_heap.go index 5e3533424..edcefd024 100644 --- a/format/postgres/flavours/pgpro13/pg_heap.go +++ b/format/postgres/flavours/pgpro13/pg_heap.go @@ -2,7 +2,7 @@ package pgpro13 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -54,9 +54,9 @@ import ( /* total size (bytes): 12 */ func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres2.Heap{ Args: args, - DecodePageHeaderData: common14.DecodePageHeader, + DecodePageHeaderData: postgres2.DecodePageHeader, } - return common14.DecodeHeap(heap, d) + return postgres2.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgpro14/pg_heap.go b/format/postgres/flavours/pgpro14/pg_heap.go index af6e299d2..72862ef21 100644 --- a/format/postgres/flavours/pgpro14/pg_heap.go +++ b/format/postgres/flavours/pgpro14/pg_heap.go @@ -2,7 +2,7 @@ package pgpro14 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -54,9 +54,9 @@ import ( /* total size (bytes): 12 */ func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres2.Heap{ Args: args, - DecodePageHeaderData: common14.DecodePageHeader, + DecodePageHeaderData: postgres2.DecodePageHeader, } - return common14.DecodeHeap(heap, d) + return postgres2.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee10/pg_heap.go b/format/postgres/flavours/pgproee10/pg_heap.go index 0c20e6b51..8ed4d8d33 100644 --- a/format/postgres/flavours/pgproee10/pg_heap.go +++ b/format/postgres/flavours/pgproee10/pg_heap.go @@ -2,8 +2,8 @@ package pgproee10 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/format/postgres/common/pg_heap/pgproee" + "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -55,10 +55,10 @@ import ( /* total size (bytes): 24 */ func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres.Heap{ Args: args, - DecodePageHeaderData: ee14.DecodePageHeaderData, - DecodePageSpecial: ee14.DecodePageSpecial, + DecodePageHeaderData: pgproee.DecodePageHeaderData, + DecodePageSpecial: pgproee.DecodePageSpecial, } - return common14.DecodeHeap(heap, d) + return postgres.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee11/pg_heap.go b/format/postgres/flavours/pgproee11/pg_heap.go index c0b62ba45..4131ccb1e 100644 --- a/format/postgres/flavours/pgproee11/pg_heap.go +++ b/format/postgres/flavours/pgproee11/pg_heap.go @@ -2,8 +2,8 @@ package pgproee11 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/format/postgres/common/pg_heap/pgproee" + "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -74,10 +74,10 @@ import ( /* total size (bytes): 24 */ func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres.Heap{ Args: args, - DecodePageHeaderData: ee14.DecodePageHeaderData, - DecodePageSpecial: ee14.DecodePageSpecial, + DecodePageHeaderData: pgproee.DecodePageHeaderData, + DecodePageSpecial: pgproee.DecodePageSpecial, } - return common14.DecodeHeap(heap, d) + return postgres.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee12/pg_heap.go b/format/postgres/flavours/pgproee12/pg_heap.go index 74b63d928..aa284c60d 100644 --- a/format/postgres/flavours/pgproee12/pg_heap.go +++ b/format/postgres/flavours/pgproee12/pg_heap.go @@ -2,8 +2,8 @@ package pgproee12 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/format/postgres/common/pg_heap/pgproee" + "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -55,10 +55,10 @@ import ( /* total size (bytes): 24 */ func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres.Heap{ Args: args, - DecodePageHeaderData: ee14.DecodePageHeaderData, - DecodePageSpecial: ee14.DecodePageSpecial, + DecodePageHeaderData: pgproee.DecodePageHeaderData, + DecodePageSpecial: pgproee.DecodePageSpecial, } - return common14.DecodeHeap(heap, d) + return postgres.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee13/pg_heap.go b/format/postgres/flavours/pgproee13/pg_heap.go index 6b1ded543..b98220335 100644 --- a/format/postgres/flavours/pgproee13/pg_heap.go +++ b/format/postgres/flavours/pgproee13/pg_heap.go @@ -2,8 +2,8 @@ package pgproee13 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/format/postgres/common/pg_heap/pgproee" + "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -55,10 +55,10 @@ import ( /* total size (bytes): 24 */ func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres.Heap{ Args: args, - DecodePageHeaderData: ee14.DecodePageHeaderData, - DecodePageSpecial: ee14.DecodePageSpecial, + DecodePageHeaderData: pgproee.DecodePageHeaderData, + DecodePageSpecial: pgproee.DecodePageSpecial, } - return common14.DecodeHeap(heap, d) + return postgres.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/pgproee14/pg_heap.go b/format/postgres/flavours/pgproee14/pg_heap.go index ffc5c91b4..c096efab7 100644 --- a/format/postgres/flavours/pgproee14/pg_heap.go +++ b/format/postgres/flavours/pgproee14/pg_heap.go @@ -2,8 +2,8 @@ package pgproee14 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/pgproee14/ee14" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/format/postgres/common/pg_heap/pgproee" + "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -82,10 +82,10 @@ import ( /* total size (bytes): 24 */ func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres.Heap{ Args: args, - DecodePageHeaderData: ee14.DecodePageHeaderData, - DecodePageSpecial: ee14.DecodePageSpecial, + DecodePageHeaderData: pgproee.DecodePageHeaderData, + DecodePageSpecial: pgproee.DecodePageSpecial, } - return common14.DecodeHeap(heap, d) + return postgres.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres10/pg_heap.go b/format/postgres/flavours/postgres10/pg_heap.go index 262d89eae..6a3d808af 100644 --- a/format/postgres/flavours/postgres10/pg_heap.go +++ b/format/postgres/flavours/postgres10/pg_heap.go @@ -2,14 +2,14 @@ package postgres10 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres2.Heap{ Args: args, - DecodePageHeaderData: common14.DecodePageHeader, + DecodePageHeaderData: postgres2.DecodePageHeader, } - return common14.DecodeHeap(heap, d) + return postgres2.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres11/pg_heap.go b/format/postgres/flavours/postgres11/pg_heap.go index 2944c2be5..7ce1eb0a1 100644 --- a/format/postgres/flavours/postgres11/pg_heap.go +++ b/format/postgres/flavours/postgres11/pg_heap.go @@ -2,7 +2,7 @@ package postgres11 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -66,9 +66,9 @@ import ( /* total size (bytes): 6 */ func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres2.Heap{ Args: args, - DecodePageHeaderData: common14.DecodePageHeader, + DecodePageHeaderData: postgres2.DecodePageHeader, } - return common14.DecodeHeap(heap, d) + return postgres2.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres12/pg_heap.go b/format/postgres/flavours/postgres12/pg_heap.go index 4012907ca..c62f8a8c8 100644 --- a/format/postgres/flavours/postgres12/pg_heap.go +++ b/format/postgres/flavours/postgres12/pg_heap.go @@ -2,7 +2,7 @@ package postgres12 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -66,9 +66,9 @@ import ( /* total size (bytes): 6 */ func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres2.Heap{ Args: args, - DecodePageHeaderData: common14.DecodePageHeader, + DecodePageHeaderData: postgres2.DecodePageHeader, } - return common14.DecodeHeap(heap, d) + return postgres2.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres13/pg_heap.go b/format/postgres/flavours/postgres13/pg_heap.go index 2a1536182..b34ee67f8 100644 --- a/format/postgres/flavours/postgres13/pg_heap.go +++ b/format/postgres/flavours/postgres13/pg_heap.go @@ -2,7 +2,7 @@ package postgres13 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -47,9 +47,9 @@ import ( /* total size (bytes): 12 */ func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres2.Heap{ Args: args, - DecodePageHeaderData: common14.DecodePageHeader, + DecodePageHeaderData: postgres2.DecodePageHeader, } - return common14.DecodeHeap(heap, d) + return postgres2.DecodeHeap(heap, d) } diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/flavours/postgres14/pg_btree.go index f795f389d..c4b529cd6 100644 --- a/format/postgres/flavours/postgres14/pg_btree.go +++ b/format/postgres/flavours/postgres14/pg_btree.go @@ -2,7 +2,7 @@ package postgres14 import ( "github.com/wader/fq/format/postgres/common" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -79,13 +79,13 @@ func DecodePgBTree(d *decode.D) any { type BTree struct { PageSize uint64 - page *common14.HeapPage + page *postgres.HeapPage } func decodeBTreePages(btree *BTree, d *decode.D) { for i := 0; ; i++ { - page := &common14.HeapPage{} + page := &postgres.HeapPage{} if btree.page != nil { // use prev page page.BytesPosBegin = btree.page.BytesPosEnd @@ -118,7 +118,7 @@ func decodeBTreeMetaPage(btree *BTree, d *decode.D) { page := btree.page d.FieldStruct("page_header", func(d *decode.D) { - common14.DecodePageHeader(page, d) + postgres.DecodePageHeader(page, d) }) d.FieldStruct("meta_page_data", func(d *decode.D) { decodeBTMetaPageData(d) @@ -211,7 +211,7 @@ func decodeBTreePage(btree *BTree, d *decode.D) { page := btree.page d.FieldStruct("page_header", func(d *decode.D) { - common14.DecodePageHeader(page, d) + postgres.DecodePageHeader(page, d) }) pos0 := d.Pos() @@ -227,7 +227,7 @@ func decodeBTreePage(btree *BTree, d *decode.D) { } d.SeekAbs(pos0) - common14.DecodeItemIds(page, d) + postgres.DecodeItemIds(page, d) d.FieldArray("tuples", func(d *decode.D) { decodeIndexTuples(btree, d) diff --git a/format/postgres/flavours/postgres14/pg_heap.go b/format/postgres/flavours/postgres14/pg_heap.go index d3d6a64f1..47f329fca 100644 --- a/format/postgres/flavours/postgres14/pg_heap.go +++ b/format/postgres/flavours/postgres14/pg_heap.go @@ -2,7 +2,7 @@ package postgres14 import ( "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/postgres14/common14" + postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" ) @@ -20,9 +20,9 @@ import ( /* total size (bytes): 24 */ func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &common14.Heap{ + heap := &postgres2.Heap{ Args: args, - DecodePageHeaderData: common14.DecodePageHeader, + DecodePageHeaderData: postgres2.DecodePageHeader, } - return common14.DecodeHeap(heap, d) + return postgres2.DecodeHeap(heap, d) } From bedc480a515b26fedb190de4b8c77fcee0da98d5 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 7 Oct 2022 14:12:36 +0300 Subject: [PATCH 094/141] postgres: refactoring --- .../postgres/common/pg_heap/pgproee/decode.go | 16 ++++ .../common/pg_heap/postgres/decode.go | 14 +++ .../common/pg_heap/postgres/pg_heap.go | 2 +- format/postgres/flavours/pgpro10/pg_heap.go | 15 --- format/postgres/flavours/pgpro11/pg_heap.go | 61 ------------- format/postgres/flavours/pgpro12/pg_heap.go | 62 ------------- format/postgres/flavours/pgpro13/pg_heap.go | 62 ------------- format/postgres/flavours/pgpro14/pg_heap.go | 62 ------------- format/postgres/flavours/pgproee10/pg_heap.go | 64 ------------- format/postgres/flavours/pgproee11/pg_heap.go | 83 ----------------- format/postgres/flavours/pgproee12/pg_heap.go | 64 ------------- format/postgres/flavours/pgproee13/pg_heap.go | 64 ------------- format/postgres/flavours/pgproee14/pg_heap.go | 91 ------------------- .../postgres/flavours/postgres10/pg_heap.go | 15 --- .../postgres/flavours/postgres11/pg_heap.go | 74 --------------- .../postgres/flavours/postgres12/pg_heap.go | 74 --------------- .../postgres/flavours/postgres13/pg_heap.go | 55 ----------- .../postgres/flavours/postgres14/pg_heap.go | 28 ------ format/postgres/pg_heap.go | 67 +++++--------- 19 files changed, 52 insertions(+), 921 deletions(-) create mode 100644 format/postgres/common/pg_heap/pgproee/decode.go create mode 100644 format/postgres/common/pg_heap/postgres/decode.go delete mode 100644 format/postgres/flavours/pgpro10/pg_heap.go delete mode 100644 format/postgres/flavours/pgpro11/pg_heap.go delete mode 100644 format/postgres/flavours/pgpro12/pg_heap.go delete mode 100644 format/postgres/flavours/pgpro13/pg_heap.go delete mode 100644 format/postgres/flavours/pgpro14/pg_heap.go delete mode 100644 format/postgres/flavours/pgproee10/pg_heap.go delete mode 100644 format/postgres/flavours/pgproee11/pg_heap.go delete mode 100644 format/postgres/flavours/pgproee12/pg_heap.go delete mode 100644 format/postgres/flavours/pgproee13/pg_heap.go delete mode 100644 format/postgres/flavours/pgproee14/pg_heap.go delete mode 100644 format/postgres/flavours/postgres10/pg_heap.go delete mode 100644 format/postgres/flavours/postgres11/pg_heap.go delete mode 100644 format/postgres/flavours/postgres12/pg_heap.go delete mode 100644 format/postgres/flavours/postgres13/pg_heap.go delete mode 100644 format/postgres/flavours/postgres14/pg_heap.go diff --git a/format/postgres/common/pg_heap/pgproee/decode.go b/format/postgres/common/pg_heap/pgproee/decode.go new file mode 100644 index 000000000..051b590b8 --- /dev/null +++ b/format/postgres/common/pg_heap/pgproee/decode.go @@ -0,0 +1,16 @@ +package pgproee + +import ( + "github.com/wader/fq/format" + "github.com/wader/fq/format/postgres/common/pg_heap/postgres" + "github.com/wader/fq/pkg/decode" +) + +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { + heap := &postgres.Heap{ + Args: args, + DecodePageHeaderData: DecodePageHeaderData, + DecodePageSpecial: DecodePageSpecial, + } + return postgres.Decode(heap, d) +} diff --git a/format/postgres/common/pg_heap/postgres/decode.go b/format/postgres/common/pg_heap/postgres/decode.go new file mode 100644 index 000000000..b40c770b9 --- /dev/null +++ b/format/postgres/common/pg_heap/postgres/decode.go @@ -0,0 +1,14 @@ +package postgres + +import ( + "github.com/wader/fq/format" + "github.com/wader/fq/pkg/decode" +) + +func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { + heap := &Heap{ + Args: args, + DecodePageHeaderData: DecodePageHeader, + } + return Decode(heap, d) +} diff --git a/format/postgres/common/pg_heap/postgres/pg_heap.go b/format/postgres/common/pg_heap/postgres/pg_heap.go index 424cea14b..8b0159865 100644 --- a/format/postgres/common/pg_heap/postgres/pg_heap.go +++ b/format/postgres/common/pg_heap/postgres/pg_heap.go @@ -137,7 +137,7 @@ type TupleD struct { IsMulti bool } -func DecodeHeap(heap *Heap, d *decode.D) any { +func Decode(heap *Heap, d *decode.D) any { d.SeekAbs(0) decodeHeapPages(heap, d) diff --git a/format/postgres/flavours/pgpro10/pg_heap.go b/format/postgres/flavours/pgpro10/pg_heap.go deleted file mode 100644 index 8a5d99cb1..000000000 --- a/format/postgres/flavours/pgpro10/pg_heap.go +++ /dev/null @@ -1,15 +0,0 @@ -package pgpro10 - -import ( - "github.com/wader/fq/format" - postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres2.Heap{ - Args: args, - DecodePageHeaderData: postgres2.DecodePageHeader, - } - return postgres2.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/pgpro11/pg_heap.go b/format/postgres/flavours/pgpro11/pg_heap.go deleted file mode 100644 index 629854fc5..000000000 --- a/format/postgres/flavours/pgpro11/pg_heap.go +++ /dev/null @@ -1,61 +0,0 @@ -package pgpro11 - -import ( - "github.com/wader/fq/format" - postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -// type = struct PageHeaderData { -/* 0 | 8 */ // PageXLogRecPtr pd_lsn -/* 8 | 2 */ // uint16 pd_checksum -/* 10 | 2 */ // uint16 pd_flags -/* 12 | 2 */ // LocationIndex pd_lower -/* 14 | 2 */ // LocationIndex pd_upper -/* 16 | 2 */ // LocationIndex pd_special -/* 18 | 2 */ // uint16 pd_pagesize_version -/* 20 | 4 */ // TransactionId pd_prune_xid -/* 24 | 0 */ // ItemIdData pd_linp[] -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleHeaderData { -/* 0 | 12 */ // union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// } t_choice -/* total size (bytes): 12 */ -/* 12 | 6 */ // ItemPointerData t_ctid -/* 18 | 2 */ // uint16 t_infomask2 -/* 20 | 2 */ // uint16 t_infomask -/* 22 | 1 */ // uint8 t_hoff -/* 23 | 0 */ // bits8 t_bits[] -/* XXX 1-byte padding */ -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleFields { -/* 0 | 4 */ // TransactionId t_xmin -/* 4 | 4 */ // TransactionId t_xmax -/* 8 | 4 */ // union { -/* 4 */ // CommandId t_cid; -/* 4 */ // TransactionId t_xvac; -// } t_field3 -/* total size (bytes): 4 */ -// -/* total size (bytes): 12 */ - -// type = struct DatumTupleFields { -/* 0 | 4 */ // int32 datum_len_ -/* 4 | 4 */ // int32 datum_typmod -/* 8 | 4 */ // Oid datum_typeid -// -/* total size (bytes): 12 */ - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres2.Heap{ - Args: args, - DecodePageHeaderData: postgres2.DecodePageHeader, - } - return postgres2.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/pgpro12/pg_heap.go b/format/postgres/flavours/pgpro12/pg_heap.go deleted file mode 100644 index 32ba3fbd2..000000000 --- a/format/postgres/flavours/pgpro12/pg_heap.go +++ /dev/null @@ -1,62 +0,0 @@ -package pgpro12 - -import ( - "github.com/wader/fq/format" - postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -// type = struct PageHeaderData { -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version; -/* 20 | 4 */ // TransactionId pd_prune_xid; -/* 24 | 0 */ // ItemIdData pd_linp[]; -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleHeaderData { -/* 0 | 12 */ // union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// } t_choice; -// /* total size (bytes): 12 */ -// -/* 12 | 6 */ // ItemPointerData t_ctid; -/* 18 | 2 */ // uint16 t_infomask2; -/* 20 | 2 */ // uint16 t_infomask; -/* 22 | 1 */ // uint8 t_hoff; -/* 23 | 0 */ // bits8 t_bits[]; -/* XXX 1-byte padding */ -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleFields { -/* 0 | 4 */ // TransactionId t_xmin; -/* 4 | 4 */ // TransactionId t_xmax; -/* 8 | 4 */ // union { -/* 4 */ // CommandId t_cid; -/* 4 */ // TransactionId t_xvac; -// } t_field3; -/* total size (bytes): 4 */ -// -/* total size (bytes): 12 */ - -// type = struct DatumTupleFields { -/* 0 | 4 */ // int32 datum_len_; -/* 4 | 4 */ // int32 datum_typmod; -/* 8 | 4 */ // Oid datum_typeid; -// -/* total size (bytes): 12 */ - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres2.Heap{ - Args: args, - DecodePageHeaderData: postgres2.DecodePageHeader, - } - return postgres2.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/pgpro13/pg_heap.go b/format/postgres/flavours/pgpro13/pg_heap.go deleted file mode 100644 index edcefd024..000000000 --- a/format/postgres/flavours/pgpro13/pg_heap.go +++ /dev/null @@ -1,62 +0,0 @@ -package pgpro13 - -import ( - "github.com/wader/fq/format" - postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -// type = struct PageHeaderData { -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version -/* 20 | 4 */ // TransactionId pd_prune_xid -/* 24 | 0 */ // ItemIdData pd_linp[] -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleHeaderData { -/* 0 | 12 */ // union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// } t_choice; -/* total size (bytes): 12 */ - -/* 12 | 6 */ // ItemPointerData t_ctid; -/* 18 | 2 */ // uint16 t_infomask2; -/* 20 | 2 */ // uint16 t_infomask; -/* 22 | 1 */ // uint8 t_hoff; -/* 23 | 0 */ // bits8 t_bits[]; -/* XXX 1-byte padding */ -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleFields { -/* 0 | 4 */ // TransactionId t_xmin; -/* 4 | 4 */ // TransactionId t_xmax; -/* 8 | 4 */ // union { -/* 4 */ // CommandId t_cid; -/* 4 */ // TransactionId t_xvac; -// } t_field3; -/* total size (bytes): 4 */ -// -/* total size (bytes): 12 */ - -// type = struct DatumTupleFields { -/* 0 | 4 */ // int32 datum_len_; -/* 4 | 4 */ // int32 datum_typmod; -/* 8 | 4 */ // Oid datum_typeid; -// -/* total size (bytes): 12 */ - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres2.Heap{ - Args: args, - DecodePageHeaderData: postgres2.DecodePageHeader, - } - return postgres2.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/pgpro14/pg_heap.go b/format/postgres/flavours/pgpro14/pg_heap.go deleted file mode 100644 index 72862ef21..000000000 --- a/format/postgres/flavours/pgpro14/pg_heap.go +++ /dev/null @@ -1,62 +0,0 @@ -package pgpro14 - -import ( - "github.com/wader/fq/format" - postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -// type = struct PageHeaderData { -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version; -/* 20 | 4 */ // TransactionId pd_prune_xid; -/* 24 | 0 */ // ItemIdData pd_linp[]; -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleHeaderData { -/* 0 | 12 */ // union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// } t_choice -/* total size (bytes): 12 */ -// -/* 12 | 6 */ // ItemPointerData t_ctid -/* 18 | 2 */ // uint16 t_infomask2 -/* 20 | 2 */ // uint16 t_infomask -/* 22 | 1 */ // uint8 t_hoff -/* 23 | 0 */ // bits8 t_bits[] -/* XXX 1-byte padding */ -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleFields { -/* 0 | 4 */ // TransactionId t_xmin; -/* 4 | 4 */ // TransactionId t_xmax; -/* 8 | 4 */ // union { -/* 4 */ // CommandId t_cid; -/* 4 */ // TransactionId t_xvac; -// } t_field3; -/* total size (bytes): 4 */ -// -/* total size (bytes): 12 */ - -// type = struct DatumTupleFields { -/* 0 | 4 */ // int32 datum_len_; -/* 4 | 4 */ // int32 datum_typmod; -/* 8 | 4 */ // Oid datum_typeid; -// -/* total size (bytes): 12 */ - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres2.Heap{ - Args: args, - DecodePageHeaderData: postgres2.DecodePageHeader, - } - return postgres2.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/pgproee10/pg_heap.go b/format/postgres/flavours/pgproee10/pg_heap.go deleted file mode 100644 index 8ed4d8d33..000000000 --- a/format/postgres/flavours/pgproee10/pg_heap.go +++ /dev/null @@ -1,64 +0,0 @@ -package pgproee10 - -import ( - "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/common/pg_heap/pgproee" - "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -// type = struct PageHeaderData { -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version; -/* 20 | 0 */ // ItemIdData pd_linp[]; -// -/* total size (bytes): 20 */ - -// type = struct HeapTupleHeaderData { -/* 0 | 12 */ // union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// } t_choice -/* total size (bytes): 12 */ -// -/* 12 | 6 */ // ItemPointerData t_ctid -/* 18 | 2 */ // uint16 t_infomask2 -/* 20 | 2 */ // uint16 t_infomask -/* 22 | 1 */ // uint8 t_hoff -/* 23 | 0 */ // bits8 t_bits[] -/* XXX 1-byte padding */ -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleFields { -/* 0 | 4 */ // ShortTransactionId t_xmin; -/* 4 | 4 */ // ShortTransactionId t_xmax; -/* 8 | 4 */ // union { -/* 4 */ // CommandId t_cid; -/* 4 */ // ShortTransactionId t_xvac; -// } t_field3; -/* total size (bytes): 4 */ -// -/* total size (bytes): 12 */ - -// type = struct HeapPageSpecialData { -/* 0 | 8 */ // TransactionId pd_xid_base; -/* 8 | 8 */ // TransactionId pd_multi_base; -/* 16 | 4 */ // ShortTransactionId pd_prune_xid; -/* 20 | 4 */ // uint32 pd_magic; -// -/* total size (bytes): 24 */ - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres.Heap{ - Args: args, - DecodePageHeaderData: pgproee.DecodePageHeaderData, - DecodePageSpecial: pgproee.DecodePageSpecial, - } - return postgres.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/pgproee11/pg_heap.go b/format/postgres/flavours/pgproee11/pg_heap.go deleted file mode 100644 index 4131ccb1e..000000000 --- a/format/postgres/flavours/pgproee11/pg_heap.go +++ /dev/null @@ -1,83 +0,0 @@ -package pgproee11 - -import ( - "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/common/pg_heap/pgproee" - "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -// type = struct PageHeaderData { -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version; -/* 20 | 0 */ // ItemIdData pd_linp[]; -// -/* total size (bytes): 20 */ - -// type = struct PageXLogRecPtr { -/* 0 | 4 */ // uint32 xlogid; -/* 4 | 4 */ // uint32 xrecoff; -// -/* total size (bytes): 8 */ - -// type = struct HeapTupleHeaderData { -/* 0 | 12 */ // union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// } t_choice; -/* total size (bytes): 12 */ -// -/* 12 | 6 */ // ItemPointerData t_ctid; -/* 18 | 2 */ // uint16 t_infomask2; -/* 20 | 2 */ // uint16 t_infomask; -/* 22 | 1 */ // uint8 t_hoff; -/* 23 | 0 */ // bits8 t_bits[]; -/* XXX 1-byte padding */ -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleFields { -/* 0 | 4 */ // ShortTransactionId t_xmin; -/* 4 | 4 */ // ShortTransactionId t_xmax; -/* 8 | 4 */ // union { -/* 4 */ // CommandId t_cid; -/* 4 */ // ShortTransactionId t_xvac; -// } t_field3; -/* total size (bytes): 4 */ -// -/* total size (bytes): 12 */ - -// type = struct DatumTupleFields { -/* 0 | 4 */ // int32 datum_len_; -/* 4 | 4 */ // int32 datum_typmod; -/* 8 | 4 */ // Oid datum_typeid; -// -/* total size (bytes): 12 */ - -// type = struct ItemPointerData { -/* 0 | 4 */ // BlockIdData ip_blkid; -/* 4 | 2 */ // OffsetNumber ip_posid; -// -/* total size (bytes): 6 */ - -// type = struct HeapPageSpecialData { -/* 0 | 8 */ // TransactionId pd_xid_base; -/* 8 | 8 */ // TransactionId pd_multi_base; -/* 16 | 4 */ // ShortTransactionId pd_prune_xid; -/* 20 | 4 */ // uint32 pd_magic; -// -/* total size (bytes): 24 */ - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres.Heap{ - Args: args, - DecodePageHeaderData: pgproee.DecodePageHeaderData, - DecodePageSpecial: pgproee.DecodePageSpecial, - } - return postgres.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/pgproee12/pg_heap.go b/format/postgres/flavours/pgproee12/pg_heap.go deleted file mode 100644 index aa284c60d..000000000 --- a/format/postgres/flavours/pgproee12/pg_heap.go +++ /dev/null @@ -1,64 +0,0 @@ -package pgproee12 - -import ( - "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/common/pg_heap/pgproee" - "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -// type = struct PageHeaderData { -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version; -/* 20 | 0 */ // ItemIdData pd_linp[]; -// -/* total size (bytes): 20 */ - -// type = struct HeapTupleHeaderData { -/* 0 | 12 */ // union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// } t_choice; -/* total size (bytes): 12 */ -// -/* 12 | 6 */ // ItemPointerData t_ctid; -/* 18 | 2 */ // uint16 t_infomask2; -/* 20 | 2 */ // uint16 t_infomask; -/* 22 | 1 */ // uint8 t_hoff; -/* 23 | 0 */ // bits8 t_bits[]; -/* XXX 1-byte padding */ -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleFields { -/* 0 | 4 */ // ShortTransactionId t_xmin; -/* 4 | 4 */ // ShortTransactionId t_xmax; -/* 8 | 4 */ // union { -/* 4 */ // CommandId t_cid; -/* 4 */ // ShortTransactionId t_xvac; -// } t_field3; -/* total size (bytes): 4 */ -// -/* total size (bytes): 12 */ - -// type = struct HeapPageSpecialData { -/* 0 | 8 */ // TransactionId pd_xid_base; -/* 8 | 8 */ // TransactionId pd_multi_base; -/* 16 | 4 */ // ShortTransactionId pd_prune_xid; -/* 20 | 4 */ // uint32 pd_magic; -// -/* total size (bytes): 24 */ - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres.Heap{ - Args: args, - DecodePageHeaderData: pgproee.DecodePageHeaderData, - DecodePageSpecial: pgproee.DecodePageSpecial, - } - return postgres.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/pgproee13/pg_heap.go b/format/postgres/flavours/pgproee13/pg_heap.go deleted file mode 100644 index b98220335..000000000 --- a/format/postgres/flavours/pgproee13/pg_heap.go +++ /dev/null @@ -1,64 +0,0 @@ -package pgproee13 - -import ( - "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/common/pg_heap/pgproee" - "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -// type = struct PageHeaderData { -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version; -/* 20 | 0 */ // ItemIdData pd_linp[]; -// -/* total size (bytes): 20 */ - -// type = struct HeapTupleHeaderData { -/* 0 | 12 */ // union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// } t_choice -/* total size (bytes): 12 */ -// -/* 12 | 6 */ // ItemPointerData t_ctid; -/* 18 | 2 */ // uint16 t_infomask2; -/* 20 | 2 */ // uint16 t_infomask; -/* 22 | 1 */ // uint8 t_hoff; -/* 23 | 0 */ // bits8 t_bits[]; -/* XXX 1-byte padding */ -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleFields { -/* 0 | 4 */ // ShortTransactionId t_xmin; -/* 4 | 4 */ // ShortTransactionId t_xmax; -/* 8 | 4 */ // union { -/* 4 */ // CommandId t_cid; -/* 4 */ // ShortTransactionId t_xvac; -// } t_field3; -/* total size (bytes): 4 */ -// -/* total size (bytes): 12 */ - -// type = struct HeapPageSpecialData { -/* 0 | 8 */ // TransactionId pd_xid_base; -/* 8 | 8 */ // TransactionId pd_multi_base; -/* 16 | 4 */ // ShortTransactionId pd_prune_xid; -/* 20 | 4 */ // uint32 pd_magic; -// -/* total size (bytes): 24 */ - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres.Heap{ - Args: args, - DecodePageHeaderData: pgproee.DecodePageHeaderData, - DecodePageSpecial: pgproee.DecodePageSpecial, - } - return postgres.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/pgproee14/pg_heap.go b/format/postgres/flavours/pgproee14/pg_heap.go deleted file mode 100644 index c096efab7..000000000 --- a/format/postgres/flavours/pgproee14/pg_heap.go +++ /dev/null @@ -1,91 +0,0 @@ -package pgproee14 - -import ( - "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/common/pg_heap/pgproee" - "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -// type = struct PageHeaderData { -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version; -/* 20 | 0 */ // ItemIdData pd_linp[]; -// -/* total size (bytes): 20 */ - -// type = struct PageXLogRecPtr { -/* 0 | 4 */ // uint32 xlogid; -/* 4 | 4 */ // uint32 xrecoff; -// -/* total size (bytes): 8 */ - -// type = struct ItemIdData { -/* 0: 0 | 4 */ // unsigned int lp_off : 15; -/* 1: 7 | 4 */ // unsigned int lp_flags : 2; -/* 2: 1 | 4 */ // unsigned int lp_len : 15; -// -/* total size (bytes): 4 */ - -// type = struct HeapTupleHeaderData { -/* 0 | 12 */ // union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// } t_choice; -/* total size (bytes): 12 */ -// -/* 12 | 6 */ // ItemPointerData t_ctid -/* 18 | 2 */ // uint16 t_infomask2 -/* 20 | 2 */ // uint16 t_infomask -/* 22 | 1 */ // uint8 t_hoff -/* 23 | 0 */ // bits8 t_bits[] -/* XXX 1-byte padding */ -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleFields { -/* 0 | 4 */ // ShortTransactionId t_xmin; -/* 4 | 4 */ // ShortTransactionId t_xmax; -/* 8 | 4 */ // union { -/* 4 */ // CommandId t_cid; -/* 4 */ // ShortTransactionId t_xvac; -// -/* total size (bytes): 4 */ -// } t_field3; -// -/* total size (bytes): 12 */ - -// type = struct DatumTupleFields { -/* 0 | 4 */ // int32 datum_len_; -/* 4 | 4 */ // int32 datum_typmod; -/* 8 | 4 */ // Oid datum_typeid; -// -/* total size (bytes): 12 */ - -// type = struct ItemPointerData { -/* 0 | 4 */ // BlockIdData ip_blkid; -/* 4 | 2 */ // OffsetNumber ip_posid; -// -/* total size (bytes): 6 */ - -// type = struct HeapPageSpecialData { -/* 0 | 8 */ // TransactionId pd_xid_base; -/* 8 | 8 */ // TransactionId pd_multi_base; -/* 16 | 4 */ // ShortTransactionId pd_prune_xid; -/* 20 | 4 */ // uint32 pd_magic; -// -/* total size (bytes): 24 */ - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres.Heap{ - Args: args, - DecodePageHeaderData: pgproee.DecodePageHeaderData, - DecodePageSpecial: pgproee.DecodePageSpecial, - } - return postgres.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/postgres10/pg_heap.go b/format/postgres/flavours/postgres10/pg_heap.go deleted file mode 100644 index 6a3d808af..000000000 --- a/format/postgres/flavours/postgres10/pg_heap.go +++ /dev/null @@ -1,15 +0,0 @@ -package postgres10 - -import ( - "github.com/wader/fq/format" - postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres2.Heap{ - Args: args, - DecodePageHeaderData: postgres2.DecodePageHeader, - } - return postgres2.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/postgres11/pg_heap.go b/format/postgres/flavours/postgres11/pg_heap.go deleted file mode 100644 index 7ce1eb0a1..000000000 --- a/format/postgres/flavours/postgres11/pg_heap.go +++ /dev/null @@ -1,74 +0,0 @@ -package postgres11 - -import ( - "github.com/wader/fq/format" - postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -// type = struct PageHeaderData { -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version -/* 20 | 4 */ // TransactionId pd_prune_xid -/* 24 | 0 */ // ItemIdData pd_linp[] -// -/* total size (bytes): 24 */ - -// type = struct PageXLogRecPtr { -/* 0 | 4 */ // uint32 xlogid; -/* 4 | 4 */ // uint32 xrecoff; -// -/* total size (bytes): 8 */ - -// type = struct HeapTupleHeaderData { -/* 0 | 12 */ //union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// } t_choice; -/* total size (bytes): 12 */ -// -/* 12 | 6 */ // ItemPointerData t_ctid -/* 18 | 2 */ // uint16 t_infomask2 -/* 20 | 2 */ // uint16 t_infomask -/* 22 | 1 */ // uint8 t_hoff -/* 23 | 0 */ // bits8 t_bits[] -/* XXX 1-byte padding */ -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleFields { -/* 0 | 4 */ // TransactionId t_xmin; -/* 4 | 4 */ // TransactionId t_xmax; -/* 8 | 4 */ // union { -/* 4 */ // CommandId t_cid; -/* 4 */ // TransactionId t_xvac; -// } t_field3; -/* total size (bytes): 4 */ -// -/* total size (bytes): 12 */ - -// type = struct DatumTupleFields { -/* 0 | 4 */ // int32 datum_len_; -/* 4 | 4 */ // int32 datum_typmod; -/* 8 | 4 */ // Oid datum_typeid; -// -/* total size (bytes): 12 */ - -// type = struct ItemPointerData { -/* 0 | 4 */ // BlockIdData ip_blkid; -/* 4 | 2 */ // OffsetNumber ip_posid; -// -/* total size (bytes): 6 */ - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres2.Heap{ - Args: args, - DecodePageHeaderData: postgres2.DecodePageHeader, - } - return postgres2.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/postgres12/pg_heap.go b/format/postgres/flavours/postgres12/pg_heap.go deleted file mode 100644 index c62f8a8c8..000000000 --- a/format/postgres/flavours/postgres12/pg_heap.go +++ /dev/null @@ -1,74 +0,0 @@ -package postgres12 - -import ( - "github.com/wader/fq/format" - postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -// type = struct PageHeaderData { -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version; -/* 20 | 4 */ // TransactionId pd_prune_xid; -/* 24 | 0 */ // ItemIdData pd_linp[]; -// -/* total size (bytes): 24 */ - -// type = struct PageXLogRecPtr { -/* 0 | 4 */ // uint32 xlogid; -/* 4 | 4 */ // uint32 xrecoff; -// -/* total size (bytes): 8 */ - -// type = struct HeapTupleHeaderData { -/* 0 | 12 */ // union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// // } t_choice; -/* total size (bytes): 12 */ -// -/* 12 | 6 */ // ItemPointerData t_ctid; -/* 18 | 2 */ // uint16 t_infomask2; -/* 20 | 2 */ // uint16 t_infomask; -/* 22 | 1 */ // uint8 t_hoff; -/* 23 | 0 */ // bits8 t_bits[]; -/* XXX 1-byte padding */ -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleFields { -/* 0 | 4 */ // TransactionId t_xmin; -/* 4 | 4 */ // TransactionId t_xmax; -/* 8 | 4 */ // union { -/* 4 */ // CommandId t_cid; -/* 4 */ // TransactionId t_xvac; -// } t_field3; -/* total size (bytes): 4 */ -// -/* total size (bytes): 12 */ - -// type = struct DatumTupleFields { -/* 0 | 4 */ // int32 datum_len_; -/* 4 | 4 */ // int32 datum_typmod; -/* 8 | 4 */ // Oid datum_typeid; -// -/* total size (bytes): 12 */ - -// type = struct ItemPointerData { -/* 0 | 4 */ // BlockIdData ip_blkid; -/* 4 | 2 */ // OffsetNumber ip_posid; -// -/* total size (bytes): 6 */ - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres2.Heap{ - Args: args, - DecodePageHeaderData: postgres2.DecodePageHeader, - } - return postgres2.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/postgres13/pg_heap.go b/format/postgres/flavours/postgres13/pg_heap.go deleted file mode 100644 index b34ee67f8..000000000 --- a/format/postgres/flavours/postgres13/pg_heap.go +++ /dev/null @@ -1,55 +0,0 @@ -package postgres13 - -import ( - "github.com/wader/fq/format" - postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -// type = struct PageHeaderData { -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version; -/* 20 | 4 */ // TransactionId pd_prune_xid; -/* 24 | 0 */ // ItemIdData pd_linp[]; -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleHeaderData { -/* 0 | 12 */ // union { -/* 12 */ // HeapTupleFields t_heap; -/* 12 */ // DatumTupleFields t_datum; -// } t_choice; -/* total size (bytes): 12 */ -// -/* 12 | 6 */ // ItemPointerData t_ctid -/* 18 | 2 */ // uint16 t_infomask2 -/* 20 | 2 */ // uint16 t_infomask -/* 22 | 1 */ // uint8 t_hoff -/* 23 | 0 */ // bits8 t_bits[] -/* XXX 1-byte padding */ -// -/* total size (bytes): 24 */ - -// type = struct HeapTupleFields { -/* 0 | 4 */ // TransactionId t_xmin; -/* 4 | 4 */ // TransactionId t_xmax; -/* 8 | 4 */ // union { -/* 4 */ // CommandId t_cid; -/* 4 */ // TransactionId t_xvac; -// } t_field3;h -/* total size (bytes): 4 */ -// -/* total size (bytes): 12 */ - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres2.Heap{ - Args: args, - DecodePageHeaderData: postgres2.DecodePageHeader, - } - return postgres2.DecodeHeap(heap, d) -} diff --git a/format/postgres/flavours/postgres14/pg_heap.go b/format/postgres/flavours/postgres14/pg_heap.go deleted file mode 100644 index 47f329fca..000000000 --- a/format/postgres/flavours/postgres14/pg_heap.go +++ /dev/null @@ -1,28 +0,0 @@ -package postgres14 - -import ( - "github.com/wader/fq/format" - postgres2 "github.com/wader/fq/format/postgres/common/pg_heap/postgres" - "github.com/wader/fq/pkg/decode" -) - -// type = struct PageHeaderData -/* 0 | 8 */ // PageXLogRecPtr pd_lsn; -/* 8 | 2 */ // uint16 pd_checksum; -/* 10 | 2 */ // uint16 pd_flags; -/* 12 | 2 */ // LocationIndex pd_lower; -/* 14 | 2 */ // LocationIndex pd_upper; -/* 16 | 2 */ // LocationIndex pd_special; -/* 18 | 2 */ // uint16 pd_pagesize_version; -/* 20 | 4 */ // TransactionId pd_prune_xid; -/* 24 | 0 */ // ItemIdData pd_linp[]; -// -/* total size (bytes): 24 */ - -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { - heap := &postgres2.Heap{ - Args: args, - DecodePageHeaderData: postgres2.DecodePageHeader, - } - return postgres2.DecodeHeap(heap, d) -} diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index 4e0599227..d95c80fad 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -2,23 +2,10 @@ package postgres import ( "embed" + "github.com/wader/fq/format/postgres/common/pg_heap/pgproee" + "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/pgpro10" - "github.com/wader/fq/format/postgres/flavours/pgpro11" - "github.com/wader/fq/format/postgres/flavours/pgpro12" - "github.com/wader/fq/format/postgres/flavours/pgpro13" - "github.com/wader/fq/format/postgres/flavours/pgpro14" - "github.com/wader/fq/format/postgres/flavours/pgproee10" - "github.com/wader/fq/format/postgres/flavours/pgproee11" - "github.com/wader/fq/format/postgres/flavours/pgproee12" - "github.com/wader/fq/format/postgres/flavours/pgproee13" - "github.com/wader/fq/format/postgres/flavours/pgproee14" - "github.com/wader/fq/format/postgres/flavours/postgres10" - "github.com/wader/fq/format/postgres/flavours/postgres11" - "github.com/wader/fq/format/postgres/flavours/postgres12" - "github.com/wader/fq/format/postgres/flavours/postgres13" - "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" ) @@ -54,40 +41,28 @@ func decodePgheap(d *decode.D, in any) any { } switch pgIn.Flavour { - case PG_FLAVOUR_POSTGRES10: - return postgres10.DecodeHeap(d, pgIn) - case PG_FLAVOUR_POSTGRES11: - return postgres11.DecodeHeap(d, pgIn) - case PG_FLAVOUR_POSTGRES12: - return postgres12.DecodeHeap(d, pgIn) - case PG_FLAVOUR_POSTGRES13: - return postgres13.DecodeHeap(d, pgIn) - case PG_FLAVOUR_POSTGRES14: - return postgres14.DecodeHeap(d, pgIn) - case PG_FLAVOUR_PGPROEE10: - return pgproee10.DecodeHeap(d, pgIn) - case PG_FLAVOUR_PGPROEE11: - return pgproee11.DecodeHeap(d, pgIn) - case PG_FLAVOUR_PGPROEE12: - return pgproee12.DecodeHeap(d, pgIn) - case PG_FLAVOUR_PGPROEE13: - return pgproee13.DecodeHeap(d, pgIn) - case PG_FLAVOUR_PGPROEE14: - return pgproee14.DecodeHeap(d, pgIn) - case PG_FLAVOUR_PGPRO10: - return pgpro10.DecodeHeap(d, pgIn) - case PG_FLAVOUR_PGPRO11: - return pgpro11.DecodeHeap(d, pgIn) - case PG_FLAVOUR_PGPRO12: - return pgpro12.DecodeHeap(d, pgIn) - case PG_FLAVOUR_PGPRO13: - return pgpro13.DecodeHeap(d, pgIn) - case PG_FLAVOUR_PGPRO14: - return pgpro14.DecodeHeap(d, pgIn) + case PG_FLAVOUR_POSTGRES10, + PG_FLAVOUR_POSTGRES11, + PG_FLAVOUR_POSTGRES12, + PG_FLAVOUR_POSTGRES13, + PG_FLAVOUR_POSTGRES14, + PG_FLAVOUR_PGPRO10, + PG_FLAVOUR_PGPRO11, + PG_FLAVOUR_PGPRO12, + PG_FLAVOUR_PGPRO13, + PG_FLAVOUR_PGPRO14: + return postgres.DecodeHeap(d, pgIn) + + case PG_FLAVOUR_PGPROEE10, + PG_FLAVOUR_PGPROEE11, + PG_FLAVOUR_PGPROEE12, + PG_FLAVOUR_PGPROEE13, + PG_FLAVOUR_PGPROEE14: + return pgproee.DecodeHeap(d, pgIn) default: break } - return postgres14.DecodeHeap(d, pgIn) + return postgres.DecodeHeap(d, pgIn) } From 6fe5f05fafd66c292bb093ee4335b8f238ae2517 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 7 Oct 2022 14:17:04 +0300 Subject: [PATCH 095/141] postgres: lint, doc --- doc/formats.md | 12 +++++++----- format/postgres/common/checksum.go | 4 ++-- format/postgres/common/pg_heap/postgres/pg_heap.go | 1 + format/postgres/pg_heap.go | 1 + 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/doc/formats.md b/doc/formats.md index e5f559003..113e79fa6 100644 --- a/doc/formats.md +++ b/doc/formats.md @@ -688,20 +688,22 @@ $ fq -d pg_control -o flavour=postgres14 ".state, .check_point_copy.redo, .wal_l ### Options -|Name |Default |Description| -|- |- |-| -|`flavour`|postgres14|PostgreSQL flavour: postgres14, pgproee14.., postgres10| +|Name |Default |Description| +|- |- |-| +|`flavour` |postgres14|PostgreSQL flavour: postgres14, pgproee14.., postgres10| +|`page_number` |0 |First page number in file, default is 0| +|`segment_number`|0 |Segment file number (16790.1 is 1), default is 0| ### Examples Decode file using pg_heap options ``` -$ fq -d pg_heap -o flavour="postgres14" . file +$ fq -d pg_heap -o flavour="postgres14" -o page_number=0 -o segment_number=0 . file ``` Decode value as pg_heap ``` -... | pg_heap({flavour:"postgres14"}) +... | pg_heap({flavour:"postgres14",page_number:0,segment_number:0}) ``` ### To see heap page's content diff --git a/format/postgres/common/checksum.go b/format/postgres/common/checksum.go index 69061dae2..243263681 100644 --- a/format/postgres/common/checksum.go +++ b/format/postgres/common/checksum.go @@ -24,8 +24,8 @@ var ( ) func checksumComp(checksum uint32, value uint32) uint32 { - __tmp := checksum ^ value - checksum = __tmp*fnvPrime ^ (__tmp >> 17) + tmp := checksum ^ value + checksum = tmp*fnvPrime ^ (tmp >> 17) return checksum } diff --git a/format/postgres/common/pg_heap/postgres/pg_heap.go b/format/postgres/common/pg_heap/postgres/pg_heap.go index 8b0159865..d3fc5e8b0 100644 --- a/format/postgres/common/pg_heap/postgres/pg_heap.go +++ b/format/postgres/common/pg_heap/postgres/pg_heap.go @@ -2,6 +2,7 @@ package postgres import ( "fmt" + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/common" diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index d95c80fad..885bfe545 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -2,6 +2,7 @@ package postgres import ( "embed" + "github.com/wader/fq/format/postgres/common/pg_heap/pgproee" "github.com/wader/fq/format/postgres/common/pg_heap/postgres" From 2423f86b3a401c9586b4edd02418bb4220c16dd7 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 10 Oct 2022 13:08:03 +0300 Subject: [PATCH 096/141] postgres: add how_to.md - how to generate test files for postgres --- format/postgres/testdata/how_to.md | 107 +++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 format/postgres/testdata/how_to.md diff --git a/format/postgres/testdata/how_to.md b/format/postgres/testdata/how_to.md new file mode 100644 index 000000000..b0b49637b --- /dev/null +++ b/format/postgres/testdata/how_to.md @@ -0,0 +1,107 @@ +## How to generate PostgreSQL test data + +### 1) install postgres +Use this links to add repository and install PostgreSQL: +- https://www.postgresql.org/download/linux/ +- https://www.postgresql.org/download/linux/redhat/ +- https://www.postgresql.org/download/linux/debian/ + +You may install PostgreSQL with OS repository. But it may contains not all versions of PostgreSQL. + +### 2) use default intallation location of postgres. +If you don't want default location. +You may remove cluster and init it again. + +\# Detect PGDATA location: +```shell +ps aux | grep postgre + +postgres 887 0.0 0.0 4334456 13608 ? Ss 07:48 0:00 /usr/pgsql-14/bin/postmaster -D /u02/data +``` +Result is: +- /u02/data - is PGDATA location +- /usr/pgsql-14/bin - location of PostgreSQL bin + +### 3) init tables + +\# use postgres user +```shell +sudo su postgres +``` + +\# then init pgbench tables +```shell +/usr/pgsql-14/bin/pgbench -i +``` + +\# run simple test +```shell +/usr/pgsql-14/bin/pgbench -T 60 -j 100 +``` + +### 4) run commands in psql + +\# start psql +```shell +/usr/pgsql-14/bin/psql +``` + +\# display tables +```psql +\dt+ + +Schema | Name | Type | Owner | Persistence | Access method | Size | Description +--------+------------------+-------+----------+-------------+---------------+--------+------------- +public | pgbench_accounts | table | postgres | permanent | heap | 13 MB | +public | pgbench_branches | table | postgres | permanent | heap | 40 kB | +public | pgbench_history | table | postgres | permanent | heap | 968 kB | +public | pgbench_tellers | table | postgres | permanent | heap | 40 kB | +``` + +\# run CHECKPOINT to avoid partially written data +```psql +CHECKPOINT; +``` + +\# detect location of tables +```psql +SELECT pg_relation_filepath('pgbench_history'); +pg_relation_filepath +---------------------- +base/13746/24599 +``` + +base/13746/24599 - location of table in PGDATA + +### 5) use root account to copy table file + +\# login in root +```shell +sudo su +``` + +\# go to PGDATA +```shell +cd /u02/data +``` + +\# copy table file +```shell +cp base/13746/24599 /home/user +``` + +\# change persmissions +```shell +chwon user:user /home/user/24599 +chmod 644 /home/user/24599 +``` + +### 6) Copy tables files to local with scp +```shell +scp user@192.168.0.100:~/24599 . +``` + +### 7) You may want to cut 2 pages (8192 * 2) from table +```shell +head -c 16384 ./245991 > ./24599_2pages +``` From 1aa08e336c965007d0280c9511120bb88a62f3dd Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 10 Oct 2022 13:24:04 +0300 Subject: [PATCH 097/141] postgres: add btree, pg_control to how_to.md --- format/postgres/testdata/how_to.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/format/postgres/testdata/how_to.md b/format/postgres/testdata/how_to.md index b0b49637b..b10427aa8 100644 --- a/format/postgres/testdata/how_to.md +++ b/format/postgres/testdata/how_to.md @@ -105,3 +105,29 @@ scp user@192.168.0.100:~/24599 . ```shell head -c 16384 ./245991 > ./24599_2pages ``` + +### 8) Locate pg_control file +`global/pg_control` inside PGDATA + +### 9) Locate btree index +Get info about index: +```psql +\d pgbench_accounts + Table "public.pgbench_accounts" + Column | Type | Collation | Nullable | Default +----------+---------------+-----------+----------+--------- + aid | integer | | not null | + bid | integer | | | + abalance | integer | | | + filler | character(84) | | | +Indexes: + "pgbench_accounts_pkey" PRIMARY KEY, btree (aid) +``` +Then get path of pgbench_accounts_pkey: +```psql +select pg_relation_filepath('pgbench_accounts_pkey'); + pg_relation_filepath +---------------------- + base/13746/24596 +``` +`base/13746/24596` - is a path inside PGDATA of btree index pgbench_accounts_pkey. \ No newline at end of file From 939c7c17ad22cf74bdbdc7d8cc6aca2c16268d14 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 10 Oct 2022 13:25:43 +0300 Subject: [PATCH 098/141] postgres: how_to.md --- format/postgres/testdata/how_to.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/format/postgres/testdata/how_to.md b/format/postgres/testdata/how_to.md index b10427aa8..0cfb0646b 100644 --- a/format/postgres/testdata/how_to.md +++ b/format/postgres/testdata/how_to.md @@ -19,8 +19,8 @@ ps aux | grep postgre postgres 887 0.0 0.0 4334456 13608 ? Ss 07:48 0:00 /usr/pgsql-14/bin/postmaster -D /u02/data ``` Result is: -- /u02/data - is PGDATA location -- /usr/pgsql-14/bin - location of PostgreSQL bin +- `/u02/data` - is PGDATA location +- `/usr/pgsql-14/bin` - location of PostgreSQL bin ### 3) init tables @@ -71,7 +71,7 @@ pg_relation_filepath base/13746/24599 ``` -base/13746/24599 - location of table in PGDATA +`base/13746/24599` - location of table in PGDATA ### 5) use root account to copy table file From 8f55e177f6f903dc775c7447d384932656c573de Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 12 Oct 2022 10:50:00 +0300 Subject: [PATCH 099/141] postgres: remove SeekAbs(0) where it's not used. --- format/postgres/common/pg_heap/postgres/pg_heap.go | 2 -- format/postgres/flavours/postgres14/pg_btree.go | 3 --- 2 files changed, 5 deletions(-) diff --git a/format/postgres/common/pg_heap/postgres/pg_heap.go b/format/postgres/common/pg_heap/postgres/pg_heap.go index d3fc5e8b0..7f18c800a 100644 --- a/format/postgres/common/pg_heap/postgres/pg_heap.go +++ b/format/postgres/common/pg_heap/postgres/pg_heap.go @@ -139,9 +139,7 @@ type TupleD struct { } func Decode(heap *Heap, d *decode.D) any { - d.SeekAbs(0) decodeHeapPages(heap, d) - return nil } diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/flavours/postgres14/pg_btree.go index c4b529cd6..871b4e427 100644 --- a/format/postgres/flavours/postgres14/pg_btree.go +++ b/format/postgres/flavours/postgres14/pg_btree.go @@ -67,13 +67,10 @@ const ( /* total size (bytes): 8 */ func DecodePgBTree(d *decode.D) any { - d.SeekAbs(0) - btree := &BTree{ PageSize: common.PageSize, } decodeBTreePages(btree, d) - return nil } From 5ff6273505ca7ef80dc537c21a862524e1fb196f Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 24 Oct 2022 09:44:42 +0300 Subject: [PATCH 100/141] postgres: add additional checks in pg_heap --- format/postgres/common/pg_heap/postgres/pg_heap.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/format/postgres/common/pg_heap/postgres/pg_heap.go b/format/postgres/common/pg_heap/postgres/pg_heap.go index 7f18c800a..406d20d43 100644 --- a/format/postgres/common/pg_heap/postgres/pg_heap.go +++ b/format/postgres/common/pg_heap/postgres/pg_heap.go @@ -145,6 +145,7 @@ func Decode(heap *Heap, d *decode.D) any { func decodeHeapPages(heap *Heap, d *decode.D) { blockNumber := uint32(heap.Args.PageNumber + heap.Args.SegmentNumber*common.RelSegSize) + count := int64(0) for { if end, _ := d.TryEnd(); end { return @@ -154,11 +155,16 @@ func decodeHeapPages(heap *Heap, d *decode.D) { decodeHeapPage(heap, d, blockNumber) }) blockNumber++ + count++ // end of Page endLen := uint64(d.Pos() / 8) - pageEnd := common.TypeAlign(common.PageSize, endLen) - d.SeekAbs(int64(pageEnd) * 8) + pageEnd := int64(common.TypeAlign(common.PageSize, endLen)) + pageEnd0 := count * common.PageSize + if pageEnd0 != pageEnd { + fmt.Printf("invalid page %d end expected %d, actual %d, endLen %d\n", count-1, pageEnd0, pageEnd, endLen) + } + d.SeekAbs(pageEnd0 * 8) } } @@ -219,6 +225,9 @@ func decodeTuples(heap *Heap, d *decode.D) { } pos := (page.BytesPosBegin * 8) + int64(id.Off)*8 + if id.Len < SizeOfHeapTupleHeaderData { + d.Fatalf("item len = %d, is less than %d HeapTupleHeaderData\n", id.Len, SizeOfHeapTupleHeaderData) + } tupleDataLen := id.Len - SizeOfHeapTupleHeaderData // seek to tuple with ItemID offset From 9f61e637028ea8f56752066986e6d303b5d6b593 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 24 Oct 2022 09:47:27 +0300 Subject: [PATCH 101/141] postgres: allow all flovours to decode btree index --- format/postgres/pg_btree.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/format/postgres/pg_btree.go b/format/postgres/pg_btree.go index 35367cc7a..e830b1b52 100644 --- a/format/postgres/pg_btree.go +++ b/format/postgres/pg_btree.go @@ -29,15 +29,14 @@ func init() { func decodePgBTree(d *decode.D, in any) any { d.Endian = decode.LittleEndian - pgIn, ok := in.(format.PostgresIn) + _, ok := in.(format.PostgresIn) if !ok { d.Fatalf("DecodeInArg must be PostgresIn!\n") } - switch pgIn.Flavour { - case PG_FLAVOUR_POSTGRES14: - return postgres14.DecodePgBTree(d) - } - - return nil + //switch pgIn.Flavour { + //case PG_FLAVOUR_POSTGRES14: + // return postgres14.DecodePgBTree(d) + //} + return postgres14.DecodePgBTree(d) } From 6aed2387b81822398094525fb2ee7767914340ba Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 24 Oct 2022 13:04:54 +0300 Subject: [PATCH 102/141] postgres: add pg_wal for pgproee11 as copy of postgres14 --- format/postgres/flavours/pgproee11/pg_wal.go | 725 +++++++++++++++++++ format/postgres/pg_wal.go | 4 + 2 files changed, 729 insertions(+) create mode 100644 format/postgres/flavours/pgproee11/pg_wal.go diff --git a/format/postgres/flavours/pgproee11/pg_wal.go b/format/postgres/flavours/pgproee11/pg_wal.go new file mode 100644 index 000000000..0ab68d4a2 --- /dev/null +++ b/format/postgres/flavours/pgproee11/pg_wal.go @@ -0,0 +1,725 @@ +package pgproee11 + +import ( + "fmt" + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +//nolint:revive +const ( + XLOG_BLCKSZ = 8192 + XLP_LONG_HEADER = 2 +) + +//nolint:revive +const ( + BKPBLOCK_FORK_MASK = 0x0F + BKPBLOCK_FLAG_MASK = 0xF0 + BKPBLOCK_HAS_IMAGE = 0x10 /* block data is an XLogRecordBlockImage */ + BKPBLOCK_HAS_DATA = 0x20 + BKPBLOCK_WILL_INIT = 0x40 /* redo will re-init the page */ + BKPBLOCK_SAME_REL = 0x80 /* RelFileNode omitted, same as previous */ +) + +/* Information stored in bimg_info */ +//nolint:revive +const ( + BKPIMAGE_HAS_HOLE = 0x01 /* page image has "hole" */ + BKPIMAGE_IS_COMPRESSED = 0x02 /* page image is compressed */ + BKPIMAGE_APPLY = 0x04 /* page image should be restored during replay */ +) + +var rmgrIds = scalar.UToScalar{ + 0: {Sym: "XLOG", Description: "RM_XLOG_ID"}, + 1: {Sym: "Transaction", Description: "RM_XACT_ID"}, + 2: {Sym: "Storage", Description: "RM_SMGR_ID"}, + 3: {Sym: "CLOG", Description: "RM_CLOG_ID"}, + 4: {Sym: "Database", Description: "RM_DBASE_ID"}, + 5: {Sym: "Tablespace", Description: "RM_TBLSPC_ID"}, + 6: {Sym: "MultiXact", Description: "RM_MULTIXACT_ID"}, + 7: {Sym: "RelMap", Description: "RM_RELMAP_ID"}, + 8: {Sym: "Standby", Description: "RM_STANDBY_ID"}, + 9: {Sym: "Heap2", Description: "RM_HEAP2_ID"}, + 10: {Sym: "Heap", Description: "RM_HEAP_ID"}, + 11: {Sym: "Btree", Description: "RM_BTREE_ID"}, + 12: {Sym: "Hash", Description: "RM_HASH_ID"}, + 13: {Sym: "Gin", Description: "RM_GIN_ID"}, + 14: {Sym: "Gist", Description: "RM_GIST_ID"}, + 15: {Sym: "Sequence", Description: "RM_SEQ_ID"}, + 16: {Sym: "SPGist", Description: "RM_SPGIST_ID"}, + 17: {Sym: "BRIN", Description: "RM_BRIN_ID"}, + 18: {Sym: "CommitTs", Description: "RM_COMMIT_TS_ID"}, + 19: {Sym: "ReplicationOrigin", Description: "RM_REPLORIGIN_ID"}, + 20: {Sym: "Generic", Description: "RM_GENERIC_ID"}, + 21: {Sym: "LogicalMessage", Description: "RM_LOGICALMSG_ID"}, +} + +const ( + XLOG_PAGE_MAGIC_MASK = 0xD000 + XLOG_PAGE_MAGIC_POSTGRES14 = 0xD10D +) + +const ( + XLR_MAX_BLOCK_ID = 32 + XLR_BLOCK_ID_DATA_SHORT = 255 + XLR_BLOCK_ID_DATA_LONG = 254 + XLR_BLOCK_ID_ORIGIN = 253 + XLR_BLOCK_ID_TOPLEVEL_XID = 252 +) + +// struct XLogLongPageHeaderData { +// /* 0 | 24 */ XLogPageHeaderData std; +// /* 24 | 8 */ uint64 xlp_sysid; +// /* 32 | 4 */ uint32 xlp_seg_size; +// /* 36 | 4 */ uint32 xlp_xlog_blcksz; +// +// /* total size (bytes): 40 */ +//} + +// struct XLogPageHeaderData { +/* 0 | 2 */ // uint16 xlp_magic; +/* 2 | 2 */ // uint16 xlp_info; +/* 4 | 4 */ // TimeLineID xlp_tli; +/* 8 | 8 */ // XLogRecPtr xlp_pageaddr; +/* 16 | 4 */ // uint32 xlp_rem_len; +/* XXX 4-byte padding */ +// +/* total size (bytes): 24 */ + +// struct XLogRecord { +/* 0 | 4 */ // uint32 xl_tot_len +/* 4 | 4 */ // TransactionId xl_xid +/* 8 | 8 */ // XLogRecPtr xl_prev +/* 16 | 1 */ // uint8 xl_info +/* 17 | 1 */ // RmgrId xl_rmid +/* XXX 2-byte hole */ +/* 20 | 4 */ // pg_crc32c xl_crc +// +/* total size (bytes): 24 */ + +// struct RelFileNode { +/* 0 | 4 */ // Oid spcNode +/* 4 | 4 */ // Oid dbNode +/* 8 | 4 */ // Oid relNode +// +/* total size (bytes): 12 */ + +func decodeXLogPageHeaderData(d *decode.D) { + /* 0 | 2 */ // uint16 xlp_magic; + /* 2 | 2 */ // uint16 xlp_info; + /* 4 | 4 */ // TimeLineID xlp_tli; + /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; + /* 16 | 4 */ // uint32 xlp_rem_len; + /* XXX 4-byte padding */ + xlpMagic := d.FieldU16("xlp_magic") + xlpInfo := d.FieldU16("xlp_info") + d.FieldU32("xlp_timeline") + d.FieldU64("xlp_pageaddr") + d.FieldU32("xlp_rem_len") + d.FieldU32("padding0") + + if (xlpMagic & XLOG_PAGE_MAGIC_MASK) == 0 { + d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) + } + + if (xlpInfo & XLP_LONG_HEADER) != 0 { + // Long header + d.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { + d.FieldU64("xlp_sysid") + d.FieldU32("xlp_seg_size") + d.FieldU32("xlp_xlog_blcksz") + }) + } +} + +type walD struct { + maxOffset int64 + + pages *decode.D + records *decode.D + + pageRecords *decode.D + + state *walState +} + +type walState struct { + record *decode.D + recordRemLenBytes int64 +} + +func DecodePgwal(d *decode.D, maxOffset uint32) any { + pages := d.FieldArrayValue("Pages") + wal := &walD{ + maxOffset: int64(maxOffset), + pages: pages, + records: d.FieldArrayValue("Records"), + } + + for { + decodeXLogPage(wal, pages) + + if pages.End() { + break + } + + posBytes := pages.Pos() / 8 + if posBytes >= wal.maxOffset { + d.FieldRawLen("unused", d.BitsLeft()) + break + } + + remBytes := posBytes % XLOG_BLCKSZ + if remBytes != 0 { + d.Fatalf("invalid page remBytes = %d\n", remBytes) + } + } + + return nil +} + +func decodeXLogPage(wal *walD, d *decode.D) { + + xLogPage := d.FieldStructValue("Page") + + // type = struct XLogPageHeaderData { + /* 0 | 2 */ // uint16 xlp_magic; + /* 2 | 2 */ // uint16 xlp_info; + /* 4 | 4 */ // TimeLineID xlp_tli; + /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; + /* 16 | 4 */ // uint32 xlp_rem_len; + /* XXX 4-byte padding */ + header := xLogPage.FieldStructValue("XLogPageHeaderData") + + xlpMagic := header.FieldU16("xlp_magic") + xlpInfo := header.FieldU16("xlp_info") + header.FieldU32("xlp_tli") + header.FieldU64("xlp_pageaddr") + remLenBytes := header.FieldU32("xlp_rem_len") + header.FieldU32("padding0") + + if (xlpMagic & XLOG_PAGE_MAGIC_MASK) == 0 { + d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) + } + + if (xlpInfo & XLP_LONG_HEADER) != 0 { + // Long header + header.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { + d.FieldU64("xlp_sysid") + d.FieldU32("xlp_seg_size") + d.FieldU32("xlp_xlog_blcksz") + }) + } + + if wal.state != nil { // check recordRemLenBytes is initialized + if wal.state.recordRemLenBytes != int64(remLenBytes) { + d.Fatalf("recordRemLenBytes = %d != remLenBytes = %d", wal.state.recordRemLenBytes, remLenBytes) + } + } + + remLenBytesAligned := int64(common.TypeAlign8(remLenBytes)) + remLen := remLenBytesAligned * 8 + + pos1 := header.Pos() + xLogPage.SeekAbs(pos1) + + // parted XLogRecord + if remLen > 0 { + if wal.state == nil { + // record of previous file + checkPosBytes := xLogPage.Pos() / 8 + if checkPosBytes >= XLOG_BLCKSZ { + d.Fatalf("invalid pos for RawBytesOfPreviousWalFile, it must be on first page only, pos = %d\n", checkPosBytes) + } + xLogPage.FieldRawLen("RawBytesOfPreviousWalFile", remLen) + } else { + // record of previous page + decodeXLogRecord(wal, remLenBytesAligned) + } + } + + pos2 := xLogPage.Pos() + + if wal.state != nil && wal.state.record != nil { + wal.state.record.SeekAbs(pos1) + } + + xLogPage.SeekAbs(pos2) + pageRecords := xLogPage.FieldArrayValue("Records") + + wal.pageRecords = pageRecords + + decodeXLogRecords(wal, d) +} + +func decodeXLogRecords(wal *walD, d *decode.D) { + pageRecords := wal.pageRecords + + posBytes := d.Pos() / 8 + posMaxOfPageBytes := int64(common.TypeAlign(XLOG_BLCKSZ, uint64(posBytes))) + fmt.Printf("posMaxOfPageBytes = %d\n", posMaxOfPageBytes) + + for { + /* 0 | 4 */ // uint32 xl_tot_len + /* 4 | 4 */ // TransactionId xl_xid + /* 8 | 8 */ // XLogRecPtr xl_prev + /* 16 | 1 */ // uint8 xl_info + /* 17 | 1 */ // RmgrId xl_rmid + /* XXX 2-byte hole */ + /* 20 | 4 */ // pg_crc32c xl_crc + posBytes1 := d.Pos() / 8 + posBytes1Aligned := int64(common.TypeAlign8(uint64(posBytes1))) + // check aligned - this is correct + // record header is 8 byte aligned + if posBytes1Aligned >= wal.maxOffset { + d.FieldRawLen("unused", d.BitsLeft()) + break + } + + // check what we cat read xl_tot_len on this page + if posMaxOfPageBytes < posBytes1Aligned+4 { + remOnPage := posMaxOfPageBytes - posBytes1 + d.FieldRawLen("page_padding0", remOnPage*8) + // can't read xl_tot_len on this page + // can't create row in this page + // continue on next page + wal.state = nil + return + } + + d.SeekAbs(posBytes1Aligned * 8) + + record := pageRecords.FieldStructValue("XLogRecord") + wal.state = &walState{ + record: record, + } + wal.records.AddChild(record.Value) + + xlTotLen := record.FieldU32("xl_tot_len") + xlTotLen1Bytes := xlTotLen - 4 + pos2Bytes := d.Pos() / 8 + + remOnPage := posMaxOfPageBytes - pos2Bytes + if remOnPage <= 0 { + d.Fatalf("remOnPage is negative\n") + } + + if remOnPage < int64(xlTotLen1Bytes) { + //record.FieldRawLen("xLogBody", remOnPage*8) + decodeXLogRecord(wal, remOnPage) + wal.state.recordRemLenBytes = int64(xlTotLen1Bytes) - remOnPage + break + } + + xLogBodyLen := int64(xlTotLen1Bytes) * 8 + if xLogBodyLen <= 0 { + d.Fatalf("xlTotLen1Bytes is negative, xLogBodyLen = %d\n", xLogBodyLen) + } + + //record.FieldRawLen("xLogBody", xLogBodyLen) + decodeXLogRecord(wal, int64(xlTotLen1Bytes)) + wal.state = nil + } +} + +// check that we can read bitsCount on page (with posMax?) +func isEnd(d *decode.D, posMax int64, bitsCount int64) bool { + pos := d.Pos() + posRead := pos + bitsCount + result := posRead > posMax + if result { + // set reader at and position to continue reading + d.SeekAbs(posMax) + } + return result +} + +func fieldTryGetScalarActualU(d *decode.D, name string, posMax int64, bitsCount int64) (value uint64, end bool) { + if ok, val := d.FieldTryGetScalarActualU("block_id"); ok { + value = val + } else { + if isEnd(d, posMax, bitsCount) { + return 0, true + } + switch bitsCount { + case 8: + value = d.FieldU8(name) + case 16: + value = d.FieldU16(name) + case 24: + value = d.FieldU24(name) + case 32: + value = d.FieldU32(name) + case 64: + value = d.FieldU64(name) + default: + d.Fatalf("not implemented bitsCount = %d\n", bitsCount) + } + } + return value, false +} + +func decodeXLogRecord(wal *walD, maxBytes int64) { + record := wal.state.record + + pos0 := record.Pos() + maxLen := maxBytes * 8 + if record.FieldGet("xLogBody0") == nil { + // body on first page + record.FieldRawLen("xLogBody0", maxLen) + } else { + // body on second page + record.FieldRawLen("xLogBody1", maxLen) + } + pos1 := record.Pos() + posMax := pos1 + record.SeekAbs(pos0) + + // struct XLogRecord { + /* 0 | 4 */ // uint32 xl_tot_len + /* 4 | 4 */ // TransactionId xl_xid + /* 8 | 8 */ // XLogRecPtr xl_prev + /* 16 | 1 */ // uint8 xl_info + /* 17 | 1 */ // RmgrId xl_rmid + /* XXX 2-byte hole */ + /* 20 | 4 */ // pg_crc32c xl_crc + + // xl_tot_len already read + + if record.FieldGet("xl_xid") == nil { + if isEnd(record, posMax, 32) { + return + } + record.FieldU32("xl_xid") + } + + if record.FieldGet("xl_prev") == nil { + if isEnd(record, posMax, 64) { + return + } + record.FieldU64("xl_prev") + } + + if record.FieldGet("xl_info") == nil { + if isEnd(record, posMax, 8) { + return + } + record.FieldU8("xl_info") + } + + if record.FieldGet("xl_rmid") == nil { + if isEnd(record, posMax, 8) { + return + } + record.FieldU8("xl_rmid") + } + + if record.FieldGet("hole1") == nil { + if isEnd(record, posMax, 16) { + return + } + record.FieldU16("hole1") + } + + if record.FieldGet("xl_crc") == nil { + if isEnd(record, posMax, 32) { + return + } + record.FieldU32("xl_crc") + } + + //blockId := uint64(0) + //if ok, val := record.FieldTryGetScalarActualU("block_id"); ok { + // blockId = val + //} else { + // if isEnd(record, posMax, 8) { + // return + // } + // blockId = record.FieldU8("block_id") + //} + blockId, end := fieldTryGetScalarActualU(record, "block_id", posMax, 8) + if end { + return + } + + //XLR_BLOCK_ID_DATA_SHORT = 255 + //XLR_BLOCK_ID_DATA_LONG = 254 + //XLR_BLOCK_ID_ORIGIN = 253 + //XLR_BLOCK_ID_TOPLEVEL_XID = 252 + + mainDataLen := uint64(0) + recordOrigin := uint64(0) + toplevelXid := uint64(0) + if blockId == XLR_BLOCK_ID_DATA_SHORT { + //typedef struct XLogRecordDataHeaderShort + //{ + // uint8 id; /* XLR_BLOCK_ID_DATA_SHORT */ + // uint8 data_length; /* number of payload bytes */ + //} + // + // COPY_HEADER_FIELD(&main_data_len, sizeof(uint8)); + mainDataLen, end = fieldTryGetScalarActualU(record, "main_data_len", posMax, 8) + if end { + return + } + } else if blockId == XLR_BLOCK_ID_DATA_LONG { + // COPY_HEADER_FIELD(&main_data_len, sizeof(uint32)); + mainDataLen, end = fieldTryGetScalarActualU(record, "main_data_len", posMax, 32) + if end { + return + } + } else if blockId == XLR_BLOCK_ID_ORIGIN { + // COPY_HEADER_FIELD(&state->record_origin, sizeof(RepOriginId)); + // unsigned short - 2 bytes + recordOrigin, end = fieldTryGetScalarActualU(record, "record_origin", posMax, 16) + if end { + return + } + } else if blockId == XLR_BLOCK_ID_TOPLEVEL_XID { + // COPY_HEADER_FIELD(&state->toplevel_xid, sizeof(TransactionId)); + // 4 bytes + toplevelXid, end = fieldTryGetScalarActualU(record, "record_origin", posMax, 32) + if end { + return + } + } else if blockId >= XLR_MAX_BLOCK_ID { + record.Fatalf("catched blockId = %d\n", blockId) + } else if blockId < XLR_MAX_BLOCK_ID { + // COPY_HEADER_FIELD(&fork_flags, sizeof(uint8)); + //forkFlags := uint64(0) + //if ok, val := record.FieldTryGetScalarActualU("fork_flags"); ok { + // forkFlags = val + //} else { + // if isEnd(record, posMax, 8) { + // return + // } + // forkFlags = record.FieldU8("fork_flags") + //} + forkFlags, end := fieldTryGetScalarActualU(record, "fork_flags", posMax, 8) + if end { + return + } + + // blk->forknum = fork_flags & BKPBLOCK_FORK_MASK; + // blk->flags = fork_flags; + // blk->has_image = ((fork_flags & BKPBLOCK_HAS_IMAGE) != 0); + // blk->has_data = ((fork_flags & BKPBLOCK_HAS_DATA) != 0); + hasImage := uint64(0) + hasData := uint64(0) + forkNum := forkFlags & BKPBLOCK_FORK_MASK + if (forkFlags & BKPBLOCK_HAS_IMAGE) != 0 { + hasImage = 1 + } + if (forkFlags & BKPBLOCK_HAS_DATA) != 0 { + hasData = 1 + } + if record.FieldGet("forknum") == nil { + record.FieldValueU("forknum", forkNum) + } + if record.FieldGet("has_image") == nil { + record.FieldValueU("has_image", hasImage) + } + if record.FieldGet("has_data") == nil { + record.FieldValueU("has_data", hasData) + } + + // COPY_HEADER_FIELD(&blk->data_len, sizeof(uint16)); + //dataLen := uint64(0) + //if ok, val := record.FieldTryGetScalarActualU("data_len"); ok { + // dataLen = val + //} else { + // if isEnd(record, posMax, 8) { + // return + // } + // dataLen = record.FieldU8("data_len") + //} + dataLen, end := fieldTryGetScalarActualU(record, "data_len", posMax, 8) + if end { + return + } + + // if (blk->has_data && blk->data_len == 0) + if hasData != 0 && dataLen == 0 { + record.Fatalf("invalid record with hasData = %d, dataLen = %d\n", hasData, dataLen) + } + // if (!blk->has_data && blk->data_len != 0) + if hasData == 0 && dataLen != 0 { + record.Fatalf("invalid record with hasData = %d, dataLen = %d\n", hasData, dataLen) + } + + // if (blk->has_image) + if hasImage != 0 { + // COPY_HEADER_FIELD(&blk->bimg_len, sizeof(uint16)); + bimgLen, end := fieldTryGetScalarActualU(record, "bimg_len", posMax, 16) + if end { + return + } + + // COPY_HEADER_FIELD(&blk->hole_offset, sizeof(uint16)); + holeOffset, end := fieldTryGetScalarActualU(record, "hole_offset", posMax, 16) + if end { + return + } + + // COPY_HEADER_FIELD(&blk->bimg_info, sizeof(uint8)); + bimgInfo, end := fieldTryGetScalarActualU(record, "bimg_info", posMax, 8) + if end { + return + } + + // if (blk->bimg_info & BKPIMAGE_IS_COMPRESSED) + bimgIsCompressed := uint64(0) + if (bimgInfo & BKPIMAGE_IS_COMPRESSED) != 0 { + bimgIsCompressed = 1 + } + if record.FieldGet("bimg_is_compressed") == nil { + record.FieldValueU("bimg_is_compressed", bimgIsCompressed) + } + + holeLength := uint64(0) + bimgHasHole := uint64(0) + if bimgIsCompressed != 0 { + if (bimgInfo & BKPIMAGE_HAS_HOLE) != 0 { + bimgHasHole = 1 + } + if record.FieldGet("bimg_has_hole") == nil { + record.FieldValueU("bimg_has_hole", bimgHasHole) + } + if bimgHasHole != 0 { + // COPY_HEADER_FIELD(&blk->hole_length, sizeof(uint16)); + holeLength, end = fieldTryGetScalarActualU(record, "hole_length", posMax, 16) + if end { + return + } + } + } else { // bimgIsCompressed is false + holeLength = XLOG_BLCKSZ - bimgLen + } + if record.FieldGet("hole_length") == nil { + record.FieldValueU("hole_length", holeLength) + } + + if bimgHasHole != 0 && (holeOffset != 0 || holeLength != 0 || bimgLen == XLOG_BLCKSZ) { + record.Fatalf("check failed 1") + } + if (bimgInfo&BKPIMAGE_HAS_HOLE) == 0 && (holeOffset != 0 || holeLength != 0) { + record.Fatalf("check failed 2") + } + if (bimgInfo&BKPIMAGE_IS_COMPRESSED) != 0 && bimgLen == XLOG_BLCKSZ { + record.Fatalf("check failed 3") + } + if (bimgInfo&BKPIMAGE_HAS_HOLE) == 0 && (bimgInfo&BKPIMAGE_IS_COMPRESSED) == 0 && bimgLen != XLOG_BLCKSZ { + record.Fatalf("check failed 4") + } + + if (forkFlags & BKPBLOCK_SAME_REL) == 0 { + // COPY_HEADER_FIELD(&blk->rnode, sizeof(RelFileNode)); + + } + + } + } + + fmt.Printf("mainDataLen = %d, recordOrigin = %d, toplevelXid = %d\n", mainDataLen, recordOrigin, toplevelXid) + + record.SeekAbs(posMax) +} + +func DecodePgwalOri(d *decode.D, in any) any { + d.SeekAbs(0) + + pageHeaders := d.FieldArrayValue("XLogPageHeaders") + header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) + + xlpRemLen, ok := header.FieldGet("xlp_rem_len").V.(uint32) + if !ok { + d.Fatalf("can't get xlp_rem_len\n") + } + + d.FieldRawLen("prev_file_rec", int64(xlpRemLen*8)) + d.FieldRawLen("prev_file_rec_padding", int64(d.AlignBits(64))) + + d.FieldArray("XLogRecords", func(d *decode.D) { + for { + d.FieldStruct("XLogRecord", func(d *decode.D) { + recordPos := uint64(d.Pos()) >> 3 + recordLen := d.FieldU32("xl_tot_len") + recordEnd := recordPos + recordLen + headerPos := recordEnd - recordEnd%XLOG_BLCKSZ + d.FieldU32("xl_xid") + d.FieldU64("xl_prev", scalar.ActualHex) + d.FieldU8("xl_info") + d.FieldU8("xl_rmid", rmgrIds) + d.FieldRawLen("padding", int64(d.AlignBits(32))) + d.FieldU32("xl_crc", scalar.ActualHex) + + var lengths []uint64 + + d.FieldArray("XLogRecordBlockHeader", func(d *decode.D) { + for blkheaderid := uint64(0); d.PeekBits(8) == blkheaderid; blkheaderid++ { + d.FieldStruct("XlogRecordBlockHeader", func(d *decode.D) { + /* block reference ID */ + d.FieldU8("id", d.AssertU(blkheaderid)) + /* fork within the relation, and flags */ + forkFlags := d.FieldU8("fork_flags") + /* number of payload bytes (not including page image) */ + lengths = append(lengths, d.FieldU16("data_length")) + if forkFlags&BKPBLOCK_HAS_IMAGE != 0 { + d.FieldStruct("XLogRecordBlockImageHeader", func(d *decode.D) { + /* number of page image bytes */ + d.FieldU16("length") + /* number of bytes before "hole" */ + d.FieldU16("hole_offset") + /* flag bits, see below */ + bimgInfo := d.FieldU8("bimg_info") + d.FieldRawLen("padding", int64(d.AlignBits(16))) + if bimgInfo&BKPIMAGE_HAS_HOLE != 0 && + bimgInfo&BKPIMAGE_IS_COMPRESSED != 0 { + d.FieldU16("hole_length") + } + }) + } + if forkFlags&BKPBLOCK_SAME_REL == 0 { + d.FieldStruct("RelFileNode", func(d *decode.D) { + /* tablespace */ + d.FieldU32("spcNode") + /* database */ + d.FieldU32("dbNode") + /* relation */ + d.FieldU32("relNode") + }) + d.FieldU32("BlockNum") + } + }) + } + }) + if d.PeekBits(8) == 0xff { + d.FieldStruct("XLogRecordDataHeaderShort", func(d *decode.D) { + d.FieldU8("id", d.AssertU(0xff)) + lengths = append(lengths, d.FieldU8("data_length")) + }) + } + + d.FieldArray("data", func(d *decode.D) { + for _, x := range lengths { + pos := uint64(d.Pos()) >> 3 + if pos < headerPos && (headerPos < pos+x) { + d.FieldRawLen("data", int64((headerPos-pos)*8)) + header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) + _ = header.FieldGet("xlp_rem_len").TryScalarFn(d.ValidateU(recordEnd - headerPos)) + d.FieldRawLen("data", int64((x+pos-headerPos)*8)) + } else { + d.FieldRawLen("data", int64(x*8)) + } + } + }) + + d.FieldRawLen("ending_padding", int64(d.AlignBits(64))) + }) + } + }) + + return nil +} diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index 3e6a2250d..6a1c7e12a 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -2,6 +2,7 @@ package postgres import ( "fmt" + "github.com/wader/fq/format/postgres/flavours/pgproee11" "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/flavours/postgres14" @@ -82,6 +83,9 @@ func decodePgwal(d *decode.D, in any) any { switch pgIn.Flavour { //case PG_FLAVOUR_POSTGRES11: // return postgres11.DecodePgControl(d, in) + case PG_FLAVOUR_PGPROEE11: + return pgproee11.DecodePgwal(d, maxOffset) + case PG_FLAVOUR_POSTGRES14: return postgres14.DecodePgwal(d, maxOffset) //case PG_FLAVOUR_PGPROEE14: From a4c1c5b811a75c74ce206a275ea5c9dfbe3d2718 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 24 Oct 2022 13:23:28 +0300 Subject: [PATCH 103/141] postgres: wal const --- format/postgres/flavours/pgproee11/pg_wal.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/format/postgres/flavours/pgproee11/pg_wal.go b/format/postgres/flavours/pgproee11/pg_wal.go index 0ab68d4a2..a1690082e 100644 --- a/format/postgres/flavours/pgproee11/pg_wal.go +++ b/format/postgres/flavours/pgproee11/pg_wal.go @@ -57,8 +57,8 @@ var rmgrIds = scalar.UToScalar{ } const ( - XLOG_PAGE_MAGIC_MASK = 0xD000 - XLOG_PAGE_MAGIC_POSTGRES14 = 0xD10D + XLOG_PAGE_MAGIC_MASK = 0xD000 + XLOG_PAGE_MAGIC_PGPROEE11 = 0xD098 ) const ( From c105fcdd909c4ab75166dd6e060c5e4f699cd6ca Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 26 Oct 2022 09:56:00 +0300 Subject: [PATCH 104/141] postgres: wal impl --- format/postgres/flavours/postgres14/pg_wal.go | 82 +++++++++++++------ 1 file changed, 55 insertions(+), 27 deletions(-) diff --git a/format/postgres/flavours/postgres14/pg_wal.go b/format/postgres/flavours/postgres14/pg_wal.go index 5b3f7f4e4..8583afaac 100644 --- a/format/postgres/flavours/postgres14/pg_wal.go +++ b/format/postgres/flavours/postgres14/pg_wal.go @@ -1,7 +1,6 @@ package postgres14 import ( - "fmt" "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/scalar" @@ -136,6 +135,7 @@ func decodeXLogPageHeaderData(d *decode.D) { type walD struct { maxOffset int64 + page *walPage pages *decode.D records *decode.D @@ -150,6 +150,10 @@ type walState struct { recordRemLenBytes int64 } +type walPage struct { + xlpPageAddr uint64 +} + func DecodePgwal(d *decode.D, maxOffset uint32) any { pages := d.FieldArrayValue("Pages") wal := &walD{ @@ -181,8 +185,17 @@ func DecodePgwal(d *decode.D, maxOffset uint32) any { } func decodeXLogPage(wal *walD, d *decode.D) { - - xLogPage := d.FieldStructValue("Page") + pos0 := d.Pos() + d.SeekRel(8 * 8) + xlpPageAddr0 := d.U64() + d.SeekAbs(pos0) + if wal.page != nil { + xlpPageAddr1 := wal.page.xlpPageAddr + XLOG_BLCKSZ + if xlpPageAddr0 != xlpPageAddr1 { + d.Fatalf("invalid xlp_pageaddr expected = %d, actual = %d\n", xlpPageAddr1, xlpPageAddr0) + } + } + wal.page = &walPage{} // type = struct XLogPageHeaderData { /* 0 | 2 */ // uint16 xlp_magic; @@ -191,12 +204,13 @@ func decodeXLogPage(wal *walD, d *decode.D) { /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; /* 16 | 4 */ // uint32 xlp_rem_len; /* XXX 4-byte padding */ + xLogPage := d.FieldStructValue("Page") header := xLogPage.FieldStructValue("XLogPageHeaderData") xlpMagic := header.FieldU16("xlp_magic") xlpInfo := header.FieldU16("xlp_info") header.FieldU32("xlp_tli") - header.FieldU64("xlp_pageaddr") + wal.page.xlpPageAddr = header.FieldU64("xlp_pageaddr") remLenBytes := header.FieldU32("xlp_rem_len") header.FieldU32("padding0") @@ -259,7 +273,6 @@ func decodeXLogRecords(wal *walD, d *decode.D) { posBytes := d.Pos() / 8 posMaxOfPageBytes := int64(common.TypeAlign(XLOG_BLCKSZ, uint64(posBytes))) - fmt.Printf("posMaxOfPageBytes = %d\n", posMaxOfPageBytes) for { /* 0 | 4 */ // uint32 xl_tot_len @@ -297,7 +310,15 @@ func decodeXLogRecords(wal *walD, d *decode.D) { } wal.records.AddChild(record.Value) + lsn0 := uint64(d.Pos() / 8) + lsn1 := lsn0 % XLOG_BLCKSZ + lsn := lsn1 + wal.page.xlpPageAddr + record.FieldValueU("lsn", lsn, common.XLogRecPtrMapper) + xlTotLen := record.FieldU32("xl_tot_len") + if xlTotLen < 4 { + d.Fatalf("xl_tot_len is less than 4\n") + } xlTotLen1Bytes := xlTotLen - 4 pos2Bytes := d.Pos() / 8 @@ -315,7 +336,8 @@ func decodeXLogRecords(wal *walD, d *decode.D) { xLogBodyLen := int64(xlTotLen1Bytes) * 8 if xLogBodyLen <= 0 { - d.Fatalf("xlTotLen1Bytes is negative, xLogBodyLen = %d\n", xLogBodyLen) + errPos := record.Pos() / 8 + d.Fatalf("xlTotLen1Bytes is negative, xLogBodyLen = %d, pos = %X\n", xLogBodyLen, errPos) } //record.FieldRawLen("xLogBody", xLogBodyLen) @@ -399,7 +421,7 @@ func decodeXLogRecord(wal *walD, maxBytes int64) { if isEnd(record, posMax, 64) { return } - record.FieldU64("xl_prev") + record.FieldU64("xl_prev", common.XLogRecPtrMapper) } if record.FieldGet("xl_info") == nil { @@ -449,9 +471,9 @@ func decodeXLogRecord(wal *walD, maxBytes int64) { //XLR_BLOCK_ID_ORIGIN = 253 //XLR_BLOCK_ID_TOPLEVEL_XID = 252 - mainDataLen := uint64(0) - recordOrigin := uint64(0) - toplevelXid := uint64(0) + //mainDataLen := uint64(0) + //recordOrigin := uint64(0) + //toplevelXid := uint64(0) if blockId == XLR_BLOCK_ID_DATA_SHORT { //typedef struct XLogRecordDataHeaderShort //{ @@ -460,30 +482,34 @@ func decodeXLogRecord(wal *walD, maxBytes int64) { //} // // COPY_HEADER_FIELD(&main_data_len, sizeof(uint8)); - mainDataLen, end = fieldTryGetScalarActualU(record, "main_data_len", posMax, 8) - if end { - return - } + // + //mainDataLen, end = fieldTryGetScalarActualU(record, "main_data_len", posMax, 8) + //if end { + // return + //} } else if blockId == XLR_BLOCK_ID_DATA_LONG { // COPY_HEADER_FIELD(&main_data_len, sizeof(uint32)); - mainDataLen, end = fieldTryGetScalarActualU(record, "main_data_len", posMax, 32) - if end { - return - } + // + //mainDataLen, end = fieldTryGetScalarActualU(record, "main_data_len", posMax, 32) + //if end { + // return + //} } else if blockId == XLR_BLOCK_ID_ORIGIN { // COPY_HEADER_FIELD(&state->record_origin, sizeof(RepOriginId)); // unsigned short - 2 bytes - recordOrigin, end = fieldTryGetScalarActualU(record, "record_origin", posMax, 16) - if end { - return - } + // + //recordOrigin, end = fieldTryGetScalarActualU(record, "record_origin", posMax, 16) + //if end { + // return + //} } else if blockId == XLR_BLOCK_ID_TOPLEVEL_XID { // COPY_HEADER_FIELD(&state->toplevel_xid, sizeof(TransactionId)); // 4 bytes - toplevelXid, end = fieldTryGetScalarActualU(record, "record_origin", posMax, 32) - if end { - return - } + // + //toplevelXid, end = fieldTryGetScalarActualU(record, "record_origin", posMax, 32) + //if end { + // return + //} } else if blockId >= XLR_MAX_BLOCK_ID { record.Fatalf("catched blockId = %d\n", blockId) } else if blockId < XLR_MAX_BLOCK_ID { @@ -622,7 +648,9 @@ func decodeXLogRecord(wal *walD, maxBytes int64) { } } - fmt.Printf("mainDataLen = %d, recordOrigin = %d, toplevelXid = %d\n", mainDataLen, recordOrigin, toplevelXid) + //if mainDataLen == 77 && recordOrigin == 88 && toplevelXid == 99 { + // fmt.Printf("mainDataLen = %d, recordOrigin = %d, toplevelXid = %d\n", mainDataLen, recordOrigin, toplevelXid) + //} record.SeekAbs(posMax) } From b09ec2fc941cd3a2fc8f6e5d031ebb86e88db9e7 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 26 Oct 2022 10:01:21 +0300 Subject: [PATCH 105/141] postgres: wal refactoing --- format/postgres/flavours/postgres14/pg_wal.go | 233 +----------------- 1 file changed, 4 insertions(+), 229 deletions(-) diff --git a/format/postgres/flavours/postgres14/pg_wal.go b/format/postgres/flavours/postgres14/pg_wal.go index 8583afaac..d9bcf9b71 100644 --- a/format/postgres/flavours/postgres14/pg_wal.go +++ b/format/postgres/flavours/postgres14/pg_wal.go @@ -207,16 +207,16 @@ func decodeXLogPage(wal *walD, d *decode.D) { xLogPage := d.FieldStructValue("Page") header := xLogPage.FieldStructValue("XLogPageHeaderData") - xlpMagic := header.FieldU16("xlp_magic") + header.FieldU16("xlp_magic") xlpInfo := header.FieldU16("xlp_info") header.FieldU32("xlp_tli") wal.page.xlpPageAddr = header.FieldU64("xlp_pageaddr") remLenBytes := header.FieldU32("xlp_rem_len") header.FieldU32("padding0") - if (xlpMagic & XLOG_PAGE_MAGIC_MASK) == 0 { - d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) - } + //if (xlpMagic & XLOG_PAGE_MAGIC_MASK) == 0 { + // d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) + //} if (xlpInfo & XLP_LONG_HEADER) != 0 { // Long header @@ -358,31 +358,6 @@ func isEnd(d *decode.D, posMax int64, bitsCount int64) bool { return result } -func fieldTryGetScalarActualU(d *decode.D, name string, posMax int64, bitsCount int64) (value uint64, end bool) { - if ok, val := d.FieldTryGetScalarActualU("block_id"); ok { - value = val - } else { - if isEnd(d, posMax, bitsCount) { - return 0, true - } - switch bitsCount { - case 8: - value = d.FieldU8(name) - case 16: - value = d.FieldU16(name) - case 24: - value = d.FieldU24(name) - case 32: - value = d.FieldU32(name) - case 64: - value = d.FieldU64(name) - default: - d.Fatalf("not implemented bitsCount = %d\n", bitsCount) - } - } - return value, false -} - func decodeXLogRecord(wal *walD, maxBytes int64) { record := wal.state.record @@ -452,206 +427,6 @@ func decodeXLogRecord(wal *walD, maxBytes int64) { record.FieldU32("xl_crc") } - //blockId := uint64(0) - //if ok, val := record.FieldTryGetScalarActualU("block_id"); ok { - // blockId = val - //} else { - // if isEnd(record, posMax, 8) { - // return - // } - // blockId = record.FieldU8("block_id") - //} - blockId, end := fieldTryGetScalarActualU(record, "block_id", posMax, 8) - if end { - return - } - - //XLR_BLOCK_ID_DATA_SHORT = 255 - //XLR_BLOCK_ID_DATA_LONG = 254 - //XLR_BLOCK_ID_ORIGIN = 253 - //XLR_BLOCK_ID_TOPLEVEL_XID = 252 - - //mainDataLen := uint64(0) - //recordOrigin := uint64(0) - //toplevelXid := uint64(0) - if blockId == XLR_BLOCK_ID_DATA_SHORT { - //typedef struct XLogRecordDataHeaderShort - //{ - // uint8 id; /* XLR_BLOCK_ID_DATA_SHORT */ - // uint8 data_length; /* number of payload bytes */ - //} - // - // COPY_HEADER_FIELD(&main_data_len, sizeof(uint8)); - // - //mainDataLen, end = fieldTryGetScalarActualU(record, "main_data_len", posMax, 8) - //if end { - // return - //} - } else if blockId == XLR_BLOCK_ID_DATA_LONG { - // COPY_HEADER_FIELD(&main_data_len, sizeof(uint32)); - // - //mainDataLen, end = fieldTryGetScalarActualU(record, "main_data_len", posMax, 32) - //if end { - // return - //} - } else if blockId == XLR_BLOCK_ID_ORIGIN { - // COPY_HEADER_FIELD(&state->record_origin, sizeof(RepOriginId)); - // unsigned short - 2 bytes - // - //recordOrigin, end = fieldTryGetScalarActualU(record, "record_origin", posMax, 16) - //if end { - // return - //} - } else if blockId == XLR_BLOCK_ID_TOPLEVEL_XID { - // COPY_HEADER_FIELD(&state->toplevel_xid, sizeof(TransactionId)); - // 4 bytes - // - //toplevelXid, end = fieldTryGetScalarActualU(record, "record_origin", posMax, 32) - //if end { - // return - //} - } else if blockId >= XLR_MAX_BLOCK_ID { - record.Fatalf("catched blockId = %d\n", blockId) - } else if blockId < XLR_MAX_BLOCK_ID { - // COPY_HEADER_FIELD(&fork_flags, sizeof(uint8)); - //forkFlags := uint64(0) - //if ok, val := record.FieldTryGetScalarActualU("fork_flags"); ok { - // forkFlags = val - //} else { - // if isEnd(record, posMax, 8) { - // return - // } - // forkFlags = record.FieldU8("fork_flags") - //} - forkFlags, end := fieldTryGetScalarActualU(record, "fork_flags", posMax, 8) - if end { - return - } - - // blk->forknum = fork_flags & BKPBLOCK_FORK_MASK; - // blk->flags = fork_flags; - // blk->has_image = ((fork_flags & BKPBLOCK_HAS_IMAGE) != 0); - // blk->has_data = ((fork_flags & BKPBLOCK_HAS_DATA) != 0); - hasImage := uint64(0) - hasData := uint64(0) - forkNum := forkFlags & BKPBLOCK_FORK_MASK - if (forkFlags & BKPBLOCK_HAS_IMAGE) != 0 { - hasImage = 1 - } - if (forkFlags & BKPBLOCK_HAS_DATA) != 0 { - hasData = 1 - } - if record.FieldGet("forknum") == nil { - record.FieldValueU("forknum", forkNum) - } - if record.FieldGet("has_image") == nil { - record.FieldValueU("has_image", hasImage) - } - if record.FieldGet("has_data") == nil { - record.FieldValueU("has_data", hasData) - } - - // COPY_HEADER_FIELD(&blk->data_len, sizeof(uint16)); - //dataLen := uint64(0) - //if ok, val := record.FieldTryGetScalarActualU("data_len"); ok { - // dataLen = val - //} else { - // if isEnd(record, posMax, 8) { - // return - // } - // dataLen = record.FieldU8("data_len") - //} - dataLen, end := fieldTryGetScalarActualU(record, "data_len", posMax, 8) - if end { - return - } - - // if (blk->has_data && blk->data_len == 0) - if hasData != 0 && dataLen == 0 { - record.Fatalf("invalid record with hasData = %d, dataLen = %d\n", hasData, dataLen) - } - // if (!blk->has_data && blk->data_len != 0) - if hasData == 0 && dataLen != 0 { - record.Fatalf("invalid record with hasData = %d, dataLen = %d\n", hasData, dataLen) - } - - // if (blk->has_image) - if hasImage != 0 { - // COPY_HEADER_FIELD(&blk->bimg_len, sizeof(uint16)); - bimgLen, end := fieldTryGetScalarActualU(record, "bimg_len", posMax, 16) - if end { - return - } - - // COPY_HEADER_FIELD(&blk->hole_offset, sizeof(uint16)); - holeOffset, end := fieldTryGetScalarActualU(record, "hole_offset", posMax, 16) - if end { - return - } - - // COPY_HEADER_FIELD(&blk->bimg_info, sizeof(uint8)); - bimgInfo, end := fieldTryGetScalarActualU(record, "bimg_info", posMax, 8) - if end { - return - } - - // if (blk->bimg_info & BKPIMAGE_IS_COMPRESSED) - bimgIsCompressed := uint64(0) - if (bimgInfo & BKPIMAGE_IS_COMPRESSED) != 0 { - bimgIsCompressed = 1 - } - if record.FieldGet("bimg_is_compressed") == nil { - record.FieldValueU("bimg_is_compressed", bimgIsCompressed) - } - - holeLength := uint64(0) - bimgHasHole := uint64(0) - if bimgIsCompressed != 0 { - if (bimgInfo & BKPIMAGE_HAS_HOLE) != 0 { - bimgHasHole = 1 - } - if record.FieldGet("bimg_has_hole") == nil { - record.FieldValueU("bimg_has_hole", bimgHasHole) - } - if bimgHasHole != 0 { - // COPY_HEADER_FIELD(&blk->hole_length, sizeof(uint16)); - holeLength, end = fieldTryGetScalarActualU(record, "hole_length", posMax, 16) - if end { - return - } - } - } else { // bimgIsCompressed is false - holeLength = XLOG_BLCKSZ - bimgLen - } - if record.FieldGet("hole_length") == nil { - record.FieldValueU("hole_length", holeLength) - } - - if bimgHasHole != 0 && (holeOffset != 0 || holeLength != 0 || bimgLen == XLOG_BLCKSZ) { - record.Fatalf("check failed 1") - } - if (bimgInfo&BKPIMAGE_HAS_HOLE) == 0 && (holeOffset != 0 || holeLength != 0) { - record.Fatalf("check failed 2") - } - if (bimgInfo&BKPIMAGE_IS_COMPRESSED) != 0 && bimgLen == XLOG_BLCKSZ { - record.Fatalf("check failed 3") - } - if (bimgInfo&BKPIMAGE_HAS_HOLE) == 0 && (bimgInfo&BKPIMAGE_IS_COMPRESSED) == 0 && bimgLen != XLOG_BLCKSZ { - record.Fatalf("check failed 4") - } - - if (forkFlags & BKPBLOCK_SAME_REL) == 0 { - // COPY_HEADER_FIELD(&blk->rnode, sizeof(RelFileNode)); - - } - - } - } - - //if mainDataLen == 77 && recordOrigin == 88 && toplevelXid == 99 { - // fmt.Printf("mainDataLen = %d, recordOrigin = %d, toplevelXid = %d\n", mainDataLen, recordOrigin, toplevelXid) - //} - record.SeekAbs(posMax) } From 26bff1442f4a321a3e9e7e37d170efc8b13a6cfb Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 26 Oct 2022 10:02:38 +0300 Subject: [PATCH 106/141] postgres: wal refactoing --- format/postgres/flavours/postgres14/pg_wal.go | 97 ------------------- 1 file changed, 97 deletions(-) diff --git a/format/postgres/flavours/postgres14/pg_wal.go b/format/postgres/flavours/postgres14/pg_wal.go index d9bcf9b71..8c3f9c216 100644 --- a/format/postgres/flavours/postgres14/pg_wal.go +++ b/format/postgres/flavours/postgres14/pg_wal.go @@ -429,100 +429,3 @@ func decodeXLogRecord(wal *walD, maxBytes int64) { record.SeekAbs(posMax) } - -func DecodePgwalOri(d *decode.D, in any) any { - d.SeekAbs(0) - - pageHeaders := d.FieldArrayValue("XLogPageHeaders") - header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) - - xlpRemLen, ok := header.FieldGet("xlp_rem_len").V.(uint32) - if !ok { - d.Fatalf("can't get xlp_rem_len\n") - } - - d.FieldRawLen("prev_file_rec", int64(xlpRemLen*8)) - d.FieldRawLen("prev_file_rec_padding", int64(d.AlignBits(64))) - - d.FieldArray("XLogRecords", func(d *decode.D) { - for { - d.FieldStruct("XLogRecord", func(d *decode.D) { - recordPos := uint64(d.Pos()) >> 3 - recordLen := d.FieldU32("xl_tot_len") - recordEnd := recordPos + recordLen - headerPos := recordEnd - recordEnd%XLOG_BLCKSZ - d.FieldU32("xl_xid") - d.FieldU64("xl_prev", scalar.ActualHex) - d.FieldU8("xl_info") - d.FieldU8("xl_rmid", rmgrIds) - d.FieldRawLen("padding", int64(d.AlignBits(32))) - d.FieldU32("xl_crc", scalar.ActualHex) - - var lengths []uint64 - - d.FieldArray("XLogRecordBlockHeader", func(d *decode.D) { - for blkheaderid := uint64(0); d.PeekBits(8) == blkheaderid; blkheaderid++ { - d.FieldStruct("XlogRecordBlockHeader", func(d *decode.D) { - /* block reference ID */ - d.FieldU8("id", d.AssertU(blkheaderid)) - /* fork within the relation, and flags */ - forkFlags := d.FieldU8("fork_flags") - /* number of payload bytes (not including page image) */ - lengths = append(lengths, d.FieldU16("data_length")) - if forkFlags&BKPBLOCK_HAS_IMAGE != 0 { - d.FieldStruct("XLogRecordBlockImageHeader", func(d *decode.D) { - /* number of page image bytes */ - d.FieldU16("length") - /* number of bytes before "hole" */ - d.FieldU16("hole_offset") - /* flag bits, see below */ - bimgInfo := d.FieldU8("bimg_info") - d.FieldRawLen("padding", int64(d.AlignBits(16))) - if bimgInfo&BKPIMAGE_HAS_HOLE != 0 && - bimgInfo&BKPIMAGE_IS_COMPRESSED != 0 { - d.FieldU16("hole_length") - } - }) - } - if forkFlags&BKPBLOCK_SAME_REL == 0 { - d.FieldStruct("RelFileNode", func(d *decode.D) { - /* tablespace */ - d.FieldU32("spcNode") - /* database */ - d.FieldU32("dbNode") - /* relation */ - d.FieldU32("relNode") - }) - d.FieldU32("BlockNum") - } - }) - } - }) - if d.PeekBits(8) == 0xff { - d.FieldStruct("XLogRecordDataHeaderShort", func(d *decode.D) { - d.FieldU8("id", d.AssertU(0xff)) - lengths = append(lengths, d.FieldU8("data_length")) - }) - } - - d.FieldArray("data", func(d *decode.D) { - for _, x := range lengths { - pos := uint64(d.Pos()) >> 3 - if pos < headerPos && (headerPos < pos+x) { - d.FieldRawLen("data", int64((headerPos-pos)*8)) - header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) - _ = header.FieldGet("xlp_rem_len").TryScalarFn(d.ValidateU(recordEnd - headerPos)) - d.FieldRawLen("data", int64((x+pos-headerPos)*8)) - } else { - d.FieldRawLen("data", int64(x*8)) - } - } - }) - - d.FieldRawLen("ending_padding", int64(d.AlignBits(64))) - }) - } - }) - - return nil -} From 7c1dfbd090235d9bfc0a0fb0f1739b026dc5270a Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 26 Oct 2022 10:10:47 +0300 Subject: [PATCH 107/141] postgres: wal implementation --- .../{flavours/postgres14 => common}/pg_wal.go | 15 +- format/postgres/flavours/pgproee11/pg_wal.go | 725 ------------------ format/postgres/pg_wal.go | 38 +- 3 files changed, 11 insertions(+), 767 deletions(-) rename format/postgres/{flavours/postgres14 => common}/pg_wal.go (96%) delete mode 100644 format/postgres/flavours/pgproee11/pg_wal.go diff --git a/format/postgres/flavours/postgres14/pg_wal.go b/format/postgres/common/pg_wal.go similarity index 96% rename from format/postgres/flavours/postgres14/pg_wal.go rename to format/postgres/common/pg_wal.go index 8c3f9c216..2db8d92fe 100644 --- a/format/postgres/flavours/postgres14/pg_wal.go +++ b/format/postgres/common/pg_wal.go @@ -1,7 +1,6 @@ -package postgres14 +package common import ( - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/scalar" ) @@ -154,7 +153,7 @@ type walPage struct { xlpPageAddr uint64 } -func DecodePgwal(d *decode.D, maxOffset uint32) any { +func DecodePGWAL(d *decode.D, maxOffset uint32) any { pages := d.FieldArrayValue("Pages") wal := &walD{ maxOffset: int64(maxOffset), @@ -233,7 +232,7 @@ func decodeXLogPage(wal *walD, d *decode.D) { } } - remLenBytesAligned := int64(common.TypeAlign8(remLenBytes)) + remLenBytesAligned := int64(TypeAlign8(remLenBytes)) remLen := remLenBytesAligned * 8 pos1 := header.Pos() @@ -272,7 +271,7 @@ func decodeXLogRecords(wal *walD, d *decode.D) { pageRecords := wal.pageRecords posBytes := d.Pos() / 8 - posMaxOfPageBytes := int64(common.TypeAlign(XLOG_BLCKSZ, uint64(posBytes))) + posMaxOfPageBytes := int64(TypeAlign(XLOG_BLCKSZ, uint64(posBytes))) for { /* 0 | 4 */ // uint32 xl_tot_len @@ -283,7 +282,7 @@ func decodeXLogRecords(wal *walD, d *decode.D) { /* XXX 2-byte hole */ /* 20 | 4 */ // pg_crc32c xl_crc posBytes1 := d.Pos() / 8 - posBytes1Aligned := int64(common.TypeAlign8(uint64(posBytes1))) + posBytes1Aligned := int64(TypeAlign8(uint64(posBytes1))) // check aligned - this is correct // record header is 8 byte aligned if posBytes1Aligned >= wal.maxOffset { @@ -313,7 +312,7 @@ func decodeXLogRecords(wal *walD, d *decode.D) { lsn0 := uint64(d.Pos() / 8) lsn1 := lsn0 % XLOG_BLCKSZ lsn := lsn1 + wal.page.xlpPageAddr - record.FieldValueU("lsn", lsn, common.XLogRecPtrMapper) + record.FieldValueU("lsn", lsn, XLogRecPtrMapper) xlTotLen := record.FieldU32("xl_tot_len") if xlTotLen < 4 { @@ -396,7 +395,7 @@ func decodeXLogRecord(wal *walD, maxBytes int64) { if isEnd(record, posMax, 64) { return } - record.FieldU64("xl_prev", common.XLogRecPtrMapper) + record.FieldU64("xl_prev", XLogRecPtrMapper) } if record.FieldGet("xl_info") == nil { diff --git a/format/postgres/flavours/pgproee11/pg_wal.go b/format/postgres/flavours/pgproee11/pg_wal.go deleted file mode 100644 index a1690082e..000000000 --- a/format/postgres/flavours/pgproee11/pg_wal.go +++ /dev/null @@ -1,725 +0,0 @@ -package pgproee11 - -import ( - "fmt" - "github.com/wader/fq/format/postgres/common" - "github.com/wader/fq/pkg/decode" - "github.com/wader/fq/pkg/scalar" -) - -//nolint:revive -const ( - XLOG_BLCKSZ = 8192 - XLP_LONG_HEADER = 2 -) - -//nolint:revive -const ( - BKPBLOCK_FORK_MASK = 0x0F - BKPBLOCK_FLAG_MASK = 0xF0 - BKPBLOCK_HAS_IMAGE = 0x10 /* block data is an XLogRecordBlockImage */ - BKPBLOCK_HAS_DATA = 0x20 - BKPBLOCK_WILL_INIT = 0x40 /* redo will re-init the page */ - BKPBLOCK_SAME_REL = 0x80 /* RelFileNode omitted, same as previous */ -) - -/* Information stored in bimg_info */ -//nolint:revive -const ( - BKPIMAGE_HAS_HOLE = 0x01 /* page image has "hole" */ - BKPIMAGE_IS_COMPRESSED = 0x02 /* page image is compressed */ - BKPIMAGE_APPLY = 0x04 /* page image should be restored during replay */ -) - -var rmgrIds = scalar.UToScalar{ - 0: {Sym: "XLOG", Description: "RM_XLOG_ID"}, - 1: {Sym: "Transaction", Description: "RM_XACT_ID"}, - 2: {Sym: "Storage", Description: "RM_SMGR_ID"}, - 3: {Sym: "CLOG", Description: "RM_CLOG_ID"}, - 4: {Sym: "Database", Description: "RM_DBASE_ID"}, - 5: {Sym: "Tablespace", Description: "RM_TBLSPC_ID"}, - 6: {Sym: "MultiXact", Description: "RM_MULTIXACT_ID"}, - 7: {Sym: "RelMap", Description: "RM_RELMAP_ID"}, - 8: {Sym: "Standby", Description: "RM_STANDBY_ID"}, - 9: {Sym: "Heap2", Description: "RM_HEAP2_ID"}, - 10: {Sym: "Heap", Description: "RM_HEAP_ID"}, - 11: {Sym: "Btree", Description: "RM_BTREE_ID"}, - 12: {Sym: "Hash", Description: "RM_HASH_ID"}, - 13: {Sym: "Gin", Description: "RM_GIN_ID"}, - 14: {Sym: "Gist", Description: "RM_GIST_ID"}, - 15: {Sym: "Sequence", Description: "RM_SEQ_ID"}, - 16: {Sym: "SPGist", Description: "RM_SPGIST_ID"}, - 17: {Sym: "BRIN", Description: "RM_BRIN_ID"}, - 18: {Sym: "CommitTs", Description: "RM_COMMIT_TS_ID"}, - 19: {Sym: "ReplicationOrigin", Description: "RM_REPLORIGIN_ID"}, - 20: {Sym: "Generic", Description: "RM_GENERIC_ID"}, - 21: {Sym: "LogicalMessage", Description: "RM_LOGICALMSG_ID"}, -} - -const ( - XLOG_PAGE_MAGIC_MASK = 0xD000 - XLOG_PAGE_MAGIC_PGPROEE11 = 0xD098 -) - -const ( - XLR_MAX_BLOCK_ID = 32 - XLR_BLOCK_ID_DATA_SHORT = 255 - XLR_BLOCK_ID_DATA_LONG = 254 - XLR_BLOCK_ID_ORIGIN = 253 - XLR_BLOCK_ID_TOPLEVEL_XID = 252 -) - -// struct XLogLongPageHeaderData { -// /* 0 | 24 */ XLogPageHeaderData std; -// /* 24 | 8 */ uint64 xlp_sysid; -// /* 32 | 4 */ uint32 xlp_seg_size; -// /* 36 | 4 */ uint32 xlp_xlog_blcksz; -// -// /* total size (bytes): 40 */ -//} - -// struct XLogPageHeaderData { -/* 0 | 2 */ // uint16 xlp_magic; -/* 2 | 2 */ // uint16 xlp_info; -/* 4 | 4 */ // TimeLineID xlp_tli; -/* 8 | 8 */ // XLogRecPtr xlp_pageaddr; -/* 16 | 4 */ // uint32 xlp_rem_len; -/* XXX 4-byte padding */ -// -/* total size (bytes): 24 */ - -// struct XLogRecord { -/* 0 | 4 */ // uint32 xl_tot_len -/* 4 | 4 */ // TransactionId xl_xid -/* 8 | 8 */ // XLogRecPtr xl_prev -/* 16 | 1 */ // uint8 xl_info -/* 17 | 1 */ // RmgrId xl_rmid -/* XXX 2-byte hole */ -/* 20 | 4 */ // pg_crc32c xl_crc -// -/* total size (bytes): 24 */ - -// struct RelFileNode { -/* 0 | 4 */ // Oid spcNode -/* 4 | 4 */ // Oid dbNode -/* 8 | 4 */ // Oid relNode -// -/* total size (bytes): 12 */ - -func decodeXLogPageHeaderData(d *decode.D) { - /* 0 | 2 */ // uint16 xlp_magic; - /* 2 | 2 */ // uint16 xlp_info; - /* 4 | 4 */ // TimeLineID xlp_tli; - /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; - /* 16 | 4 */ // uint32 xlp_rem_len; - /* XXX 4-byte padding */ - xlpMagic := d.FieldU16("xlp_magic") - xlpInfo := d.FieldU16("xlp_info") - d.FieldU32("xlp_timeline") - d.FieldU64("xlp_pageaddr") - d.FieldU32("xlp_rem_len") - d.FieldU32("padding0") - - if (xlpMagic & XLOG_PAGE_MAGIC_MASK) == 0 { - d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) - } - - if (xlpInfo & XLP_LONG_HEADER) != 0 { - // Long header - d.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { - d.FieldU64("xlp_sysid") - d.FieldU32("xlp_seg_size") - d.FieldU32("xlp_xlog_blcksz") - }) - } -} - -type walD struct { - maxOffset int64 - - pages *decode.D - records *decode.D - - pageRecords *decode.D - - state *walState -} - -type walState struct { - record *decode.D - recordRemLenBytes int64 -} - -func DecodePgwal(d *decode.D, maxOffset uint32) any { - pages := d.FieldArrayValue("Pages") - wal := &walD{ - maxOffset: int64(maxOffset), - pages: pages, - records: d.FieldArrayValue("Records"), - } - - for { - decodeXLogPage(wal, pages) - - if pages.End() { - break - } - - posBytes := pages.Pos() / 8 - if posBytes >= wal.maxOffset { - d.FieldRawLen("unused", d.BitsLeft()) - break - } - - remBytes := posBytes % XLOG_BLCKSZ - if remBytes != 0 { - d.Fatalf("invalid page remBytes = %d\n", remBytes) - } - } - - return nil -} - -func decodeXLogPage(wal *walD, d *decode.D) { - - xLogPage := d.FieldStructValue("Page") - - // type = struct XLogPageHeaderData { - /* 0 | 2 */ // uint16 xlp_magic; - /* 2 | 2 */ // uint16 xlp_info; - /* 4 | 4 */ // TimeLineID xlp_tli; - /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; - /* 16 | 4 */ // uint32 xlp_rem_len; - /* XXX 4-byte padding */ - header := xLogPage.FieldStructValue("XLogPageHeaderData") - - xlpMagic := header.FieldU16("xlp_magic") - xlpInfo := header.FieldU16("xlp_info") - header.FieldU32("xlp_tli") - header.FieldU64("xlp_pageaddr") - remLenBytes := header.FieldU32("xlp_rem_len") - header.FieldU32("padding0") - - if (xlpMagic & XLOG_PAGE_MAGIC_MASK) == 0 { - d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) - } - - if (xlpInfo & XLP_LONG_HEADER) != 0 { - // Long header - header.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { - d.FieldU64("xlp_sysid") - d.FieldU32("xlp_seg_size") - d.FieldU32("xlp_xlog_blcksz") - }) - } - - if wal.state != nil { // check recordRemLenBytes is initialized - if wal.state.recordRemLenBytes != int64(remLenBytes) { - d.Fatalf("recordRemLenBytes = %d != remLenBytes = %d", wal.state.recordRemLenBytes, remLenBytes) - } - } - - remLenBytesAligned := int64(common.TypeAlign8(remLenBytes)) - remLen := remLenBytesAligned * 8 - - pos1 := header.Pos() - xLogPage.SeekAbs(pos1) - - // parted XLogRecord - if remLen > 0 { - if wal.state == nil { - // record of previous file - checkPosBytes := xLogPage.Pos() / 8 - if checkPosBytes >= XLOG_BLCKSZ { - d.Fatalf("invalid pos for RawBytesOfPreviousWalFile, it must be on first page only, pos = %d\n", checkPosBytes) - } - xLogPage.FieldRawLen("RawBytesOfPreviousWalFile", remLen) - } else { - // record of previous page - decodeXLogRecord(wal, remLenBytesAligned) - } - } - - pos2 := xLogPage.Pos() - - if wal.state != nil && wal.state.record != nil { - wal.state.record.SeekAbs(pos1) - } - - xLogPage.SeekAbs(pos2) - pageRecords := xLogPage.FieldArrayValue("Records") - - wal.pageRecords = pageRecords - - decodeXLogRecords(wal, d) -} - -func decodeXLogRecords(wal *walD, d *decode.D) { - pageRecords := wal.pageRecords - - posBytes := d.Pos() / 8 - posMaxOfPageBytes := int64(common.TypeAlign(XLOG_BLCKSZ, uint64(posBytes))) - fmt.Printf("posMaxOfPageBytes = %d\n", posMaxOfPageBytes) - - for { - /* 0 | 4 */ // uint32 xl_tot_len - /* 4 | 4 */ // TransactionId xl_xid - /* 8 | 8 */ // XLogRecPtr xl_prev - /* 16 | 1 */ // uint8 xl_info - /* 17 | 1 */ // RmgrId xl_rmid - /* XXX 2-byte hole */ - /* 20 | 4 */ // pg_crc32c xl_crc - posBytes1 := d.Pos() / 8 - posBytes1Aligned := int64(common.TypeAlign8(uint64(posBytes1))) - // check aligned - this is correct - // record header is 8 byte aligned - if posBytes1Aligned >= wal.maxOffset { - d.FieldRawLen("unused", d.BitsLeft()) - break - } - - // check what we cat read xl_tot_len on this page - if posMaxOfPageBytes < posBytes1Aligned+4 { - remOnPage := posMaxOfPageBytes - posBytes1 - d.FieldRawLen("page_padding0", remOnPage*8) - // can't read xl_tot_len on this page - // can't create row in this page - // continue on next page - wal.state = nil - return - } - - d.SeekAbs(posBytes1Aligned * 8) - - record := pageRecords.FieldStructValue("XLogRecord") - wal.state = &walState{ - record: record, - } - wal.records.AddChild(record.Value) - - xlTotLen := record.FieldU32("xl_tot_len") - xlTotLen1Bytes := xlTotLen - 4 - pos2Bytes := d.Pos() / 8 - - remOnPage := posMaxOfPageBytes - pos2Bytes - if remOnPage <= 0 { - d.Fatalf("remOnPage is negative\n") - } - - if remOnPage < int64(xlTotLen1Bytes) { - //record.FieldRawLen("xLogBody", remOnPage*8) - decodeXLogRecord(wal, remOnPage) - wal.state.recordRemLenBytes = int64(xlTotLen1Bytes) - remOnPage - break - } - - xLogBodyLen := int64(xlTotLen1Bytes) * 8 - if xLogBodyLen <= 0 { - d.Fatalf("xlTotLen1Bytes is negative, xLogBodyLen = %d\n", xLogBodyLen) - } - - //record.FieldRawLen("xLogBody", xLogBodyLen) - decodeXLogRecord(wal, int64(xlTotLen1Bytes)) - wal.state = nil - } -} - -// check that we can read bitsCount on page (with posMax?) -func isEnd(d *decode.D, posMax int64, bitsCount int64) bool { - pos := d.Pos() - posRead := pos + bitsCount - result := posRead > posMax - if result { - // set reader at and position to continue reading - d.SeekAbs(posMax) - } - return result -} - -func fieldTryGetScalarActualU(d *decode.D, name string, posMax int64, bitsCount int64) (value uint64, end bool) { - if ok, val := d.FieldTryGetScalarActualU("block_id"); ok { - value = val - } else { - if isEnd(d, posMax, bitsCount) { - return 0, true - } - switch bitsCount { - case 8: - value = d.FieldU8(name) - case 16: - value = d.FieldU16(name) - case 24: - value = d.FieldU24(name) - case 32: - value = d.FieldU32(name) - case 64: - value = d.FieldU64(name) - default: - d.Fatalf("not implemented bitsCount = %d\n", bitsCount) - } - } - return value, false -} - -func decodeXLogRecord(wal *walD, maxBytes int64) { - record := wal.state.record - - pos0 := record.Pos() - maxLen := maxBytes * 8 - if record.FieldGet("xLogBody0") == nil { - // body on first page - record.FieldRawLen("xLogBody0", maxLen) - } else { - // body on second page - record.FieldRawLen("xLogBody1", maxLen) - } - pos1 := record.Pos() - posMax := pos1 - record.SeekAbs(pos0) - - // struct XLogRecord { - /* 0 | 4 */ // uint32 xl_tot_len - /* 4 | 4 */ // TransactionId xl_xid - /* 8 | 8 */ // XLogRecPtr xl_prev - /* 16 | 1 */ // uint8 xl_info - /* 17 | 1 */ // RmgrId xl_rmid - /* XXX 2-byte hole */ - /* 20 | 4 */ // pg_crc32c xl_crc - - // xl_tot_len already read - - if record.FieldGet("xl_xid") == nil { - if isEnd(record, posMax, 32) { - return - } - record.FieldU32("xl_xid") - } - - if record.FieldGet("xl_prev") == nil { - if isEnd(record, posMax, 64) { - return - } - record.FieldU64("xl_prev") - } - - if record.FieldGet("xl_info") == nil { - if isEnd(record, posMax, 8) { - return - } - record.FieldU8("xl_info") - } - - if record.FieldGet("xl_rmid") == nil { - if isEnd(record, posMax, 8) { - return - } - record.FieldU8("xl_rmid") - } - - if record.FieldGet("hole1") == nil { - if isEnd(record, posMax, 16) { - return - } - record.FieldU16("hole1") - } - - if record.FieldGet("xl_crc") == nil { - if isEnd(record, posMax, 32) { - return - } - record.FieldU32("xl_crc") - } - - //blockId := uint64(0) - //if ok, val := record.FieldTryGetScalarActualU("block_id"); ok { - // blockId = val - //} else { - // if isEnd(record, posMax, 8) { - // return - // } - // blockId = record.FieldU8("block_id") - //} - blockId, end := fieldTryGetScalarActualU(record, "block_id", posMax, 8) - if end { - return - } - - //XLR_BLOCK_ID_DATA_SHORT = 255 - //XLR_BLOCK_ID_DATA_LONG = 254 - //XLR_BLOCK_ID_ORIGIN = 253 - //XLR_BLOCK_ID_TOPLEVEL_XID = 252 - - mainDataLen := uint64(0) - recordOrigin := uint64(0) - toplevelXid := uint64(0) - if blockId == XLR_BLOCK_ID_DATA_SHORT { - //typedef struct XLogRecordDataHeaderShort - //{ - // uint8 id; /* XLR_BLOCK_ID_DATA_SHORT */ - // uint8 data_length; /* number of payload bytes */ - //} - // - // COPY_HEADER_FIELD(&main_data_len, sizeof(uint8)); - mainDataLen, end = fieldTryGetScalarActualU(record, "main_data_len", posMax, 8) - if end { - return - } - } else if blockId == XLR_BLOCK_ID_DATA_LONG { - // COPY_HEADER_FIELD(&main_data_len, sizeof(uint32)); - mainDataLen, end = fieldTryGetScalarActualU(record, "main_data_len", posMax, 32) - if end { - return - } - } else if blockId == XLR_BLOCK_ID_ORIGIN { - // COPY_HEADER_FIELD(&state->record_origin, sizeof(RepOriginId)); - // unsigned short - 2 bytes - recordOrigin, end = fieldTryGetScalarActualU(record, "record_origin", posMax, 16) - if end { - return - } - } else if blockId == XLR_BLOCK_ID_TOPLEVEL_XID { - // COPY_HEADER_FIELD(&state->toplevel_xid, sizeof(TransactionId)); - // 4 bytes - toplevelXid, end = fieldTryGetScalarActualU(record, "record_origin", posMax, 32) - if end { - return - } - } else if blockId >= XLR_MAX_BLOCK_ID { - record.Fatalf("catched blockId = %d\n", blockId) - } else if blockId < XLR_MAX_BLOCK_ID { - // COPY_HEADER_FIELD(&fork_flags, sizeof(uint8)); - //forkFlags := uint64(0) - //if ok, val := record.FieldTryGetScalarActualU("fork_flags"); ok { - // forkFlags = val - //} else { - // if isEnd(record, posMax, 8) { - // return - // } - // forkFlags = record.FieldU8("fork_flags") - //} - forkFlags, end := fieldTryGetScalarActualU(record, "fork_flags", posMax, 8) - if end { - return - } - - // blk->forknum = fork_flags & BKPBLOCK_FORK_MASK; - // blk->flags = fork_flags; - // blk->has_image = ((fork_flags & BKPBLOCK_HAS_IMAGE) != 0); - // blk->has_data = ((fork_flags & BKPBLOCK_HAS_DATA) != 0); - hasImage := uint64(0) - hasData := uint64(0) - forkNum := forkFlags & BKPBLOCK_FORK_MASK - if (forkFlags & BKPBLOCK_HAS_IMAGE) != 0 { - hasImage = 1 - } - if (forkFlags & BKPBLOCK_HAS_DATA) != 0 { - hasData = 1 - } - if record.FieldGet("forknum") == nil { - record.FieldValueU("forknum", forkNum) - } - if record.FieldGet("has_image") == nil { - record.FieldValueU("has_image", hasImage) - } - if record.FieldGet("has_data") == nil { - record.FieldValueU("has_data", hasData) - } - - // COPY_HEADER_FIELD(&blk->data_len, sizeof(uint16)); - //dataLen := uint64(0) - //if ok, val := record.FieldTryGetScalarActualU("data_len"); ok { - // dataLen = val - //} else { - // if isEnd(record, posMax, 8) { - // return - // } - // dataLen = record.FieldU8("data_len") - //} - dataLen, end := fieldTryGetScalarActualU(record, "data_len", posMax, 8) - if end { - return - } - - // if (blk->has_data && blk->data_len == 0) - if hasData != 0 && dataLen == 0 { - record.Fatalf("invalid record with hasData = %d, dataLen = %d\n", hasData, dataLen) - } - // if (!blk->has_data && blk->data_len != 0) - if hasData == 0 && dataLen != 0 { - record.Fatalf("invalid record with hasData = %d, dataLen = %d\n", hasData, dataLen) - } - - // if (blk->has_image) - if hasImage != 0 { - // COPY_HEADER_FIELD(&blk->bimg_len, sizeof(uint16)); - bimgLen, end := fieldTryGetScalarActualU(record, "bimg_len", posMax, 16) - if end { - return - } - - // COPY_HEADER_FIELD(&blk->hole_offset, sizeof(uint16)); - holeOffset, end := fieldTryGetScalarActualU(record, "hole_offset", posMax, 16) - if end { - return - } - - // COPY_HEADER_FIELD(&blk->bimg_info, sizeof(uint8)); - bimgInfo, end := fieldTryGetScalarActualU(record, "bimg_info", posMax, 8) - if end { - return - } - - // if (blk->bimg_info & BKPIMAGE_IS_COMPRESSED) - bimgIsCompressed := uint64(0) - if (bimgInfo & BKPIMAGE_IS_COMPRESSED) != 0 { - bimgIsCompressed = 1 - } - if record.FieldGet("bimg_is_compressed") == nil { - record.FieldValueU("bimg_is_compressed", bimgIsCompressed) - } - - holeLength := uint64(0) - bimgHasHole := uint64(0) - if bimgIsCompressed != 0 { - if (bimgInfo & BKPIMAGE_HAS_HOLE) != 0 { - bimgHasHole = 1 - } - if record.FieldGet("bimg_has_hole") == nil { - record.FieldValueU("bimg_has_hole", bimgHasHole) - } - if bimgHasHole != 0 { - // COPY_HEADER_FIELD(&blk->hole_length, sizeof(uint16)); - holeLength, end = fieldTryGetScalarActualU(record, "hole_length", posMax, 16) - if end { - return - } - } - } else { // bimgIsCompressed is false - holeLength = XLOG_BLCKSZ - bimgLen - } - if record.FieldGet("hole_length") == nil { - record.FieldValueU("hole_length", holeLength) - } - - if bimgHasHole != 0 && (holeOffset != 0 || holeLength != 0 || bimgLen == XLOG_BLCKSZ) { - record.Fatalf("check failed 1") - } - if (bimgInfo&BKPIMAGE_HAS_HOLE) == 0 && (holeOffset != 0 || holeLength != 0) { - record.Fatalf("check failed 2") - } - if (bimgInfo&BKPIMAGE_IS_COMPRESSED) != 0 && bimgLen == XLOG_BLCKSZ { - record.Fatalf("check failed 3") - } - if (bimgInfo&BKPIMAGE_HAS_HOLE) == 0 && (bimgInfo&BKPIMAGE_IS_COMPRESSED) == 0 && bimgLen != XLOG_BLCKSZ { - record.Fatalf("check failed 4") - } - - if (forkFlags & BKPBLOCK_SAME_REL) == 0 { - // COPY_HEADER_FIELD(&blk->rnode, sizeof(RelFileNode)); - - } - - } - } - - fmt.Printf("mainDataLen = %d, recordOrigin = %d, toplevelXid = %d\n", mainDataLen, recordOrigin, toplevelXid) - - record.SeekAbs(posMax) -} - -func DecodePgwalOri(d *decode.D, in any) any { - d.SeekAbs(0) - - pageHeaders := d.FieldArrayValue("XLogPageHeaders") - header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) - - xlpRemLen, ok := header.FieldGet("xlp_rem_len").V.(uint32) - if !ok { - d.Fatalf("can't get xlp_rem_len\n") - } - - d.FieldRawLen("prev_file_rec", int64(xlpRemLen*8)) - d.FieldRawLen("prev_file_rec_padding", int64(d.AlignBits(64))) - - d.FieldArray("XLogRecords", func(d *decode.D) { - for { - d.FieldStruct("XLogRecord", func(d *decode.D) { - recordPos := uint64(d.Pos()) >> 3 - recordLen := d.FieldU32("xl_tot_len") - recordEnd := recordPos + recordLen - headerPos := recordEnd - recordEnd%XLOG_BLCKSZ - d.FieldU32("xl_xid") - d.FieldU64("xl_prev", scalar.ActualHex) - d.FieldU8("xl_info") - d.FieldU8("xl_rmid", rmgrIds) - d.FieldRawLen("padding", int64(d.AlignBits(32))) - d.FieldU32("xl_crc", scalar.ActualHex) - - var lengths []uint64 - - d.FieldArray("XLogRecordBlockHeader", func(d *decode.D) { - for blkheaderid := uint64(0); d.PeekBits(8) == blkheaderid; blkheaderid++ { - d.FieldStruct("XlogRecordBlockHeader", func(d *decode.D) { - /* block reference ID */ - d.FieldU8("id", d.AssertU(blkheaderid)) - /* fork within the relation, and flags */ - forkFlags := d.FieldU8("fork_flags") - /* number of payload bytes (not including page image) */ - lengths = append(lengths, d.FieldU16("data_length")) - if forkFlags&BKPBLOCK_HAS_IMAGE != 0 { - d.FieldStruct("XLogRecordBlockImageHeader", func(d *decode.D) { - /* number of page image bytes */ - d.FieldU16("length") - /* number of bytes before "hole" */ - d.FieldU16("hole_offset") - /* flag bits, see below */ - bimgInfo := d.FieldU8("bimg_info") - d.FieldRawLen("padding", int64(d.AlignBits(16))) - if bimgInfo&BKPIMAGE_HAS_HOLE != 0 && - bimgInfo&BKPIMAGE_IS_COMPRESSED != 0 { - d.FieldU16("hole_length") - } - }) - } - if forkFlags&BKPBLOCK_SAME_REL == 0 { - d.FieldStruct("RelFileNode", func(d *decode.D) { - /* tablespace */ - d.FieldU32("spcNode") - /* database */ - d.FieldU32("dbNode") - /* relation */ - d.FieldU32("relNode") - }) - d.FieldU32("BlockNum") - } - }) - } - }) - if d.PeekBits(8) == 0xff { - d.FieldStruct("XLogRecordDataHeaderShort", func(d *decode.D) { - d.FieldU8("id", d.AssertU(0xff)) - lengths = append(lengths, d.FieldU8("data_length")) - }) - } - - d.FieldArray("data", func(d *decode.D) { - for _, x := range lengths { - pos := uint64(d.Pos()) >> 3 - if pos < headerPos && (headerPos < pos+x) { - d.FieldRawLen("data", int64((headerPos-pos)*8)) - header := pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) - _ = header.FieldGet("xlp_rem_len").TryScalarFn(d.ValidateU(recordEnd - headerPos)) - d.FieldRawLen("data", int64((x+pos-headerPos)*8)) - } else { - d.FieldRawLen("data", int64(x*8)) - } - } - }) - - d.FieldRawLen("ending_padding", int64(d.AlignBits(64))) - }) - } - }) - - return nil -} diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index 6a1c7e12a..34628042a 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -2,10 +2,8 @@ package postgres import ( "fmt" - "github.com/wader/fq/format/postgres/flavours/pgproee11" - "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/postgres14" + "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" @@ -20,7 +18,7 @@ func init() { interp.RegisterFormat(decode.Format{ Name: format.PG_WAL, Description: "PostgreSQL write-ahead log file", - DecodeFn: decodePgwal, + DecodeFn: decodePGWAL, DecodeInArg: format.PostgresWalIn{ Flavour: PG_FLAVOUR_POSTGRES14, Lsn: "", @@ -63,7 +61,7 @@ func XLogSegmentOffset(xLogPtr uint32) uint32 { return xLogPtr & (walSegSizeBytes - 1) } -func decodePgwal(d *decode.D, in any) any { +func decodePGWAL(d *decode.D, in any) any { d.Endian = decode.LittleEndian pgIn, ok := in.(format.PostgresWalIn) @@ -80,33 +78,5 @@ func decodePgwal(d *decode.D, in any) any { maxOffset = XLogSegmentOffset(lsn) } - switch pgIn.Flavour { - //case PG_FLAVOUR_POSTGRES11: - // return postgres11.DecodePgControl(d, in) - case PG_FLAVOUR_PGPROEE11: - return pgproee11.DecodePgwal(d, maxOffset) - - case PG_FLAVOUR_POSTGRES14: - return postgres14.DecodePgwal(d, maxOffset) - //case PG_FLAVOUR_PGPROEE14: - // return pgproee14.DecodePgControl(d, in) - } - - return probePgwal(d, maxOffset) -} - -func probePgwal(d *decode.D, maxOffset uint32) any { - // read version - xlpMagic := uint16(d.U16()) - - // restore position - d.SeekAbs(0) - - switch xlpMagic { - case XLOG_PAGE_MAGIC_14: - return postgres14.DecodePgwal(d, maxOffset) - } - - d.Fatalf("unsupported xlp_magic = %X\n", xlpMagic) - return nil + return common.DecodePGWAL(d, maxOffset) } From 7c92715f2a6243ee2edd9eb3105b8890cb89ed04 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 26 Oct 2022 10:11:23 +0300 Subject: [PATCH 108/141] postgres: refactoring --- format/postgres/common/{pgheap.go => pg_heap.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename format/postgres/common/{pgheap.go => pg_heap.go} (100%) diff --git a/format/postgres/common/pgheap.go b/format/postgres/common/pg_heap.go similarity index 100% rename from format/postgres/common/pgheap.go rename to format/postgres/common/pg_heap.go From bd2bdd649a52428f1e4e39cbc55e6dd97eeffafd Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 26 Oct 2022 10:13:50 +0300 Subject: [PATCH 109/141] postgres: wal refactoring --- format/postgres/common/pg_wal.go | 85 -------------------------------- format/postgres/pg_wal.go | 15 +----- 2 files changed, 1 insertion(+), 99 deletions(-) diff --git a/format/postgres/common/pg_wal.go b/format/postgres/common/pg_wal.go index 2db8d92fe..464e011f6 100644 --- a/format/postgres/common/pg_wal.go +++ b/format/postgres/common/pg_wal.go @@ -2,7 +2,6 @@ package common import ( "github.com/wader/fq/pkg/decode" - "github.com/wader/fq/pkg/scalar" ) //nolint:revive @@ -11,62 +10,6 @@ const ( XLP_LONG_HEADER = 2 ) -//nolint:revive -const ( - BKPBLOCK_FORK_MASK = 0x0F - BKPBLOCK_FLAG_MASK = 0xF0 - BKPBLOCK_HAS_IMAGE = 0x10 /* block data is an XLogRecordBlockImage */ - BKPBLOCK_HAS_DATA = 0x20 - BKPBLOCK_WILL_INIT = 0x40 /* redo will re-init the page */ - BKPBLOCK_SAME_REL = 0x80 /* RelFileNode omitted, same as previous */ -) - -/* Information stored in bimg_info */ -//nolint:revive -const ( - BKPIMAGE_HAS_HOLE = 0x01 /* page image has "hole" */ - BKPIMAGE_IS_COMPRESSED = 0x02 /* page image is compressed */ - BKPIMAGE_APPLY = 0x04 /* page image should be restored during replay */ -) - -var rmgrIds = scalar.UToScalar{ - 0: {Sym: "XLOG", Description: "RM_XLOG_ID"}, - 1: {Sym: "Transaction", Description: "RM_XACT_ID"}, - 2: {Sym: "Storage", Description: "RM_SMGR_ID"}, - 3: {Sym: "CLOG", Description: "RM_CLOG_ID"}, - 4: {Sym: "Database", Description: "RM_DBASE_ID"}, - 5: {Sym: "Tablespace", Description: "RM_TBLSPC_ID"}, - 6: {Sym: "MultiXact", Description: "RM_MULTIXACT_ID"}, - 7: {Sym: "RelMap", Description: "RM_RELMAP_ID"}, - 8: {Sym: "Standby", Description: "RM_STANDBY_ID"}, - 9: {Sym: "Heap2", Description: "RM_HEAP2_ID"}, - 10: {Sym: "Heap", Description: "RM_HEAP_ID"}, - 11: {Sym: "Btree", Description: "RM_BTREE_ID"}, - 12: {Sym: "Hash", Description: "RM_HASH_ID"}, - 13: {Sym: "Gin", Description: "RM_GIN_ID"}, - 14: {Sym: "Gist", Description: "RM_GIST_ID"}, - 15: {Sym: "Sequence", Description: "RM_SEQ_ID"}, - 16: {Sym: "SPGist", Description: "RM_SPGIST_ID"}, - 17: {Sym: "BRIN", Description: "RM_BRIN_ID"}, - 18: {Sym: "CommitTs", Description: "RM_COMMIT_TS_ID"}, - 19: {Sym: "ReplicationOrigin", Description: "RM_REPLORIGIN_ID"}, - 20: {Sym: "Generic", Description: "RM_GENERIC_ID"}, - 21: {Sym: "LogicalMessage", Description: "RM_LOGICALMSG_ID"}, -} - -const ( - XLOG_PAGE_MAGIC_MASK = 0xD000 - XLOG_PAGE_MAGIC_POSTGRES14 = 0xD10D -) - -const ( - XLR_MAX_BLOCK_ID = 32 - XLR_BLOCK_ID_DATA_SHORT = 255 - XLR_BLOCK_ID_DATA_LONG = 254 - XLR_BLOCK_ID_ORIGIN = 253 - XLR_BLOCK_ID_TOPLEVEL_XID = 252 -) - // struct XLogLongPageHeaderData { // /* 0 | 24 */ XLogPageHeaderData std; // /* 24 | 8 */ uint64 xlp_sysid; @@ -104,34 +47,6 @@ const ( // /* total size (bytes): 12 */ -func decodeXLogPageHeaderData(d *decode.D) { - /* 0 | 2 */ // uint16 xlp_magic; - /* 2 | 2 */ // uint16 xlp_info; - /* 4 | 4 */ // TimeLineID xlp_tli; - /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; - /* 16 | 4 */ // uint32 xlp_rem_len; - /* XXX 4-byte padding */ - xlpMagic := d.FieldU16("xlp_magic") - xlpInfo := d.FieldU16("xlp_info") - d.FieldU32("xlp_timeline") - d.FieldU64("xlp_pageaddr") - d.FieldU32("xlp_rem_len") - d.FieldU32("padding0") - - if (xlpMagic & XLOG_PAGE_MAGIC_MASK) == 0 { - d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) - } - - if (xlpInfo & XLP_LONG_HEADER) != 0 { - // Long header - d.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { - d.FieldU64("xlp_sysid") - d.FieldU32("xlp_seg_size") - d.FieldU32("xlp_xlog_blcksz") - }) - } -} - type walD struct { maxOffset int64 page *walPage diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index 34628042a..ec006b882 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -11,8 +11,7 @@ import ( "strings" ) -// TO DO -// not ready yet +// partial parsing of WAL func init() { interp.RegisterFormat(decode.Format{ @@ -26,18 +25,6 @@ func init() { }) } -// https://pgpedia.info/x/XLOG_PAGE_MAGIC.html -//nolint:revive -const ( - XLOG_PAGE_MAGIC_15 = uint16(0xD10F) - XLOG_PAGE_MAGIC_14 = uint16(0xD10D) - XLOG_PAGE_MAGIC_13 = uint16(0xD106) - XLOG_PAGE_MAGIC_12 = uint16(0xD101) - XLOG_PAGE_MAGIC_11 = uint16(0xD098) - XLOG_PAGE_MAGIC_10 = uint16(0xD097) - XLOG_PAGE_MAGIC_96 = uint16(0xD093) -) - func ParseLsn(lsn string) (uint32, error) { // check for 0/4E394440 str1 := lsn From 7dedcbabae3674afde2d451775b2dea390312aa3 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Wed, 26 Oct 2022 16:37:50 +0300 Subject: [PATCH 110/141] postgres: refactoring --- format/postgres/common/pg_wal.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/format/postgres/common/pg_wal.go b/format/postgres/common/pg_wal.go index 464e011f6..8597b9431 100644 --- a/format/postgres/common/pg_wal.go +++ b/format/postgres/common/pg_wal.go @@ -51,9 +51,6 @@ type walD struct { maxOffset int64 page *walPage - pages *decode.D - records *decode.D - pageRecords *decode.D state *walState @@ -72,8 +69,6 @@ func DecodePGWAL(d *decode.D, maxOffset uint32) any { pages := d.FieldArrayValue("Pages") wal := &walD{ maxOffset: int64(maxOffset), - pages: pages, - records: d.FieldArrayValue("Records"), } for { @@ -222,7 +217,6 @@ func decodeXLogRecords(wal *walD, d *decode.D) { wal.state = &walState{ record: record, } - wal.records.AddChild(record.Value) lsn0 := uint64(d.Pos() / 8) lsn1 := lsn0 % XLOG_BLCKSZ From fb7778a5b09625bf7dfd9be378e402c232899795 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Thu, 27 Oct 2022 12:08:40 +0300 Subject: [PATCH 111/141] postgres: add wal tests --- format/postgres/common/pg_wal.go | 29 +- format/postgres/pg_wal.go | 1 + .../testdata/flavours/postgres14/.gitignore | 2 - .../postgres14/00000001000000000000004E | Bin 0 -> 16384 bytes .../00000001000000000000004E_2.fqtest | 55 +++ .../postgres14/00000001000001AE000000CD | Bin 0 -> 16384 bytes .../00000001000001AE000000CD_1.fqtest | 406 ++++++++++++++++++ 7 files changed, 482 insertions(+), 11 deletions(-) create mode 100644 format/postgres/testdata/flavours/postgres14/00000001000000000000004E create mode 100644 format/postgres/testdata/flavours/postgres14/00000001000000000000004E_2.fqtest create mode 100644 format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD create mode 100644 format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD_1.fqtest diff --git a/format/postgres/common/pg_wal.go b/format/postgres/common/pg_wal.go index 8597b9431..387b763ef 100644 --- a/format/postgres/common/pg_wal.go +++ b/format/postgres/common/pg_wal.go @@ -47,7 +47,7 @@ const ( // /* total size (bytes): 12 */ -type walD struct { +type Wal struct { maxOffset int64 page *walPage @@ -67,7 +67,7 @@ type walPage struct { func DecodePGWAL(d *decode.D, maxOffset uint32) any { pages := d.FieldArrayValue("Pages") - wal := &walD{ + wal := &Wal{ maxOffset: int64(maxOffset), } @@ -93,7 +93,7 @@ func DecodePGWAL(d *decode.D, maxOffset uint32) any { return nil } -func decodeXLogPage(wal *walD, d *decode.D) { +func decodeXLogPage(wal *Wal, d *decode.D) { pos0 := d.Pos() d.SeekRel(8 * 8) xlpPageAddr0 := d.U64() @@ -154,9 +154,9 @@ func decodeXLogPage(wal *walD, d *decode.D) { // record of previous file checkPosBytes := xLogPage.Pos() / 8 if checkPosBytes >= XLOG_BLCKSZ { - d.Fatalf("invalid pos for RawBytesOfPreviousWalFile, it must be on first page only, pos = %d\n", checkPosBytes) + d.Fatalf("invalid pos of raw_bytes_of_prev_wal_file, pos = %d\n", checkPosBytes) } - xLogPage.FieldRawLen("RawBytesOfPreviousWalFile", remLen) + xLogPage.FieldRawLen("raw_bytes_of_prev_wal_file", remLen) } else { // record of previous page decodeXLogRecord(wal, remLenBytesAligned) @@ -177,7 +177,7 @@ func decodeXLogPage(wal *walD, d *decode.D) { decodeXLogRecords(wal, d) } -func decodeXLogRecords(wal *walD, d *decode.D) { +func decodeXLogRecords(wal *Wal, d *decode.D) { pageRecords := wal.pageRecords posBytes := d.Pos() / 8 @@ -211,7 +211,10 @@ func decodeXLogRecords(wal *walD, d *decode.D) { return } - d.SeekAbs(posBytes1Aligned * 8) + if posBytes1 != posBytes1Aligned { + // ensure align + d.SeekAbs(posBytes1Aligned * 8) + } record := pageRecords.FieldStructValue("XLogRecord") wal.state = &walState{ @@ -248,8 +251,16 @@ func decodeXLogRecords(wal *walD, d *decode.D) { d.Fatalf("xlTotLen1Bytes is negative, xLogBodyLen = %d, pos = %X\n", xLogBodyLen, errPos) } - //record.FieldRawLen("xLogBody", xLogBodyLen) decodeXLogRecord(wal, int64(xlTotLen1Bytes)) + + // align record + posBytes2 := d.Pos() / 8 + posBytes2Aligned := int64(TypeAlign8(uint64(posBytes2))) + if posBytes2 < posBytes2Aligned { + alignLen := (posBytes2Aligned - posBytes2) * 8 + wal.state.record.FieldRawLen("align0", alignLen) + } + wal.state = nil } } @@ -266,7 +277,7 @@ func isEnd(d *decode.D, posMax int64, bitsCount int64) bool { return result } -func decodeXLogRecord(wal *walD, maxBytes int64) { +func decodeXLogRecord(wal *Wal, maxBytes int64) { record := wal.state.record pos0 := record.Pos() diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index ec006b882..8ef7213e4 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -2,6 +2,7 @@ package postgres import ( "fmt" + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" diff --git a/format/postgres/testdata/flavours/postgres14/.gitignore b/format/postgres/testdata/flavours/postgres14/.gitignore index 3fe3a1511..e69de29bb 100644 --- a/format/postgres/testdata/flavours/postgres14/.gitignore +++ b/format/postgres/testdata/flavours/postgres14/.gitignore @@ -1,2 +0,0 @@ -0000* -wal* \ No newline at end of file diff --git a/format/postgres/testdata/flavours/postgres14/00000001000000000000004E b/format/postgres/testdata/flavours/postgres14/00000001000000000000004E new file mode 100644 index 0000000000000000000000000000000000000000..d3912119b5a1b8159d69c545ac884545189c957a GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres14/00000001000000000000004E_2.fqtest b/format/postgres/testdata/flavours/postgres14/00000001000000000000004E_2.fqtest new file mode 100644 index 000000000..1d50b0b42 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres14/00000001000000000000004E_2.fqtest @@ -0,0 +1,55 @@ +$ fq -d pg_wal "dv" 00000001000000000000004E + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: 00000001000000000000004E (pg_wal) 0x0-0x3fff.7 (16384) + | | | Pages[0:2]: 0x0-0x3fff.7 (16384) + | | | [0]{}: Page 0x0-0x2d17.7 (11544) + | | | XLogPageHeaderData{}: 0x0-0x27.7 (40) +0x0000|0d d1 |.. | xlp_magic: 53517 0x0-0x1.7 (2) +0x0000| 07 00 | .. | xlp_info: 7 0x2-0x3.7 (2) +0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) +0x0000| 00 00 00 4e 00 00 00 00| ...N....| xlp_pageaddr: 1308622848 0x8-0xf.7 (8) +0x0010|cd 0f 00 00 |.... | xlp_rem_len: 4045 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) + | | | XLogLongPageHeaderData{}: 0x18-0x27.7 (16) +0x0010| bb f9 25 51 64 7c d5 62| ..%Qd|.b| xlp_sysid: 7121735156056324539 0x18-0x1f.7 (8) +0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) +0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) +0x0020| 74 08 00 10 00 a2 ca 95| t.......| raw_bytes_of_prev_wal_file: raw bits 0x28-0xff7.7 (4048) +0x0030|00 00 00 00 00 02 00 a2 74 07 00 10 00 a1 ca 95|........t.......| +* |until 0xff7.7 (4048) | | + | | | Records[0:1]: 0xff8-0x2d17.7 (7456) + | | | [0]{}: XLogRecord 0xff8-0x2d17.7 (7456) + | | | lsn: "0/4E000FF8" (1308626936) 0xff8-NA (0) +0x0ff0| 05 1d 00 00 | .... | xl_tot_len: 7429 0xff8-0xffb.7 (4) +0x0ff0| e8 02 00 00| ....| xLogBody0: raw bits 0xffc-0x1fff.7 (4100) +0x1000|c8 f2 ff 4d 00 00 00 00 b0 00 00 00 28 0e 9d 77|...M........(..w| +* |until 0x1fff.7 (4100) | | +0x0ff0| e8 02 00 00| ....| xl_xid: 744 0xffc-0xfff.7 (4) +0x1000|c8 f2 ff 4d 00 00 00 00 |...M.... | xl_prev: "0/4DFFF2C8" (1308619464) 0x1000-0x1007.7 (8) +0x1000| b0 | . | xl_info: 176 0x1008-0x1008.7 (1) +0x1000| 00 | . | xl_rmid: 0 0x1009-0x1009.7 (1) +0x1000| 00 00 | .. | hole1: 0 0x100a-0x100b.7 (2) +0x1000| 28 0e 9d 77| (..w| xl_crc: 2006781480 0x100c-0x100f.7 (4) +0x2010| 74 18 00 10 00 e3 cb 95| t.......| xLogBody1: raw bits 0x2018-0x2d17.7 (3328) +0x2020|00 00 00 00 00 02 00 a7 74 17 00 10 00 e2 cb 95|........t.......| +* |until 0x2d17.7 (3328) | | + | | | [1]{}: Page 0x2000-0x3fff.7 (8192) + | | | XLogPageHeaderData{}: 0x2000-0x2017.7 (24) +0x2000|0d d1 |.. | xlp_magic: 53517 0x2000-0x2001.7 (2) +0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) +0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) +0x2000| 00 20 00 4e 00 00 00 00| . .N....| xlp_pageaddr: 1308631040 0x2008-0x200f.7 (8) +0x2010|fd 0c 00 00 |.... | xlp_rem_len: 3325 0x2010-0x2013.7 (4) +0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) + | | | Records[0:1]: 0x2d18-0x3fff.7 (4840) + | | | [0]{}: XLogRecord 0x2d18-0x3fff.7 (4840) + | | | lsn: "0/4E002D18" (1308634392) 0x2d18-NA (0) +0x2d10| 05 1d 00 00 | .... | xl_tot_len: 7429 0x2d18-0x2d1b.7 (4) +0x2d10| e8 02 00 00| ....| xLogBody0: raw bits 0x2d1c-0x3fff.7 (4836) +0x2d20|f8 0f 00 4e 00 00 00 00 b0 00 00 00 14 38 ce 9e|...N.........8..| +* |until 0x3fff.7 (end) (4836) | | +0x2d10| e8 02 00 00| ....| xl_xid: 744 0x2d1c-0x2d1f.7 (4) +0x2d20|f8 0f 00 4e 00 00 00 00 |...N.... | xl_prev: "0/4E000FF8" (1308626936) 0x2d20-0x2d27.7 (8) +0x2d20| b0 | . | xl_info: 176 0x2d28-0x2d28.7 (1) +0x2d20| 00 | . | xl_rmid: 0 0x2d29-0x2d29.7 (1) +0x2d20| 00 00 | .. | hole1: 0 0x2d2a-0x2d2b.7 (2) +0x2d20| 14 38 ce 9e| .8..| xl_crc: 2664314900 0x2d2c-0x2d2f.7 (4) diff --git a/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD b/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD new file mode 100644 index 0000000000000000000000000000000000000000..157065e0cd4e6647b2efa58bc13b9c4b941f5011 GIT binary patch literal 16384 zcmeI%Pe{{Y7zglY;&LK`Rrb%64Uw`)DrGpzgGia3vQq^S78*Nr5DU~G8Wy2>i6D_c z^S`V7Gu^6Lirwl^kO##>mK9le$WaNSK-(rf?+)Ltd*SCZ7<+&3`0>1dKJW94{j5_d zWTM#X?NFp~d96+EZ*yjUqyK#5(nJm-PvpAY0hWRGfrrfkuEzCeSPuNX)lDN^acRFK2Hx-+dn;!#BAEBE7yD97MmO3SMil{YR zxiMu;ABArG>}K|oxY2p`b;O4G=G|81X1exw8+0?uZru6eM#tXij0xRXb|^O|F5b<7 zZbsORe7`A=*Gux9H+#M&ay()yk83INm^}8J^h@kQo|PLoH$hK6yYe*r>UJ~qG{l}xf9{m}Wnd#H&p|hot=zPq zZODXf2HB10inu{*YvexY#+9So6giJCKsN*I#OS!2}UR;8199#n3sMwVRA zO&_}{o@&|Ggw1y6I&%p2OnC$hig04d$D$Q@J@dvE?3g)5C6ZP2vWv zt&#hnn*%Q8Cf)0thilw^%?;+8jw0n| R`BqCUbkoUhJoa_w<{#XWuP6Wj literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD_1.fqtest b/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD_1.fqtest new file mode 100644 index 000000000..984d03076 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD_1.fqtest @@ -0,0 +1,406 @@ +$ fq -d pg_wal -o flavour=postgres14 "dv" 00000001000001AE000000CD + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: 00000001000001AE000000CD (pg_wal) 0x0-0x3fff.7 (16384) + | | | Pages[0:2]: 0x0-0x3fff.7 (16384) + | | | [0]{}: Page 0x0-0x21ff.7 (8704) + | | | XLogPageHeaderData{}: 0x0-0x27.7 (40) +0x0000|0d d1 |.. | xlp_magic: 53517 0x0-0x1.7 (2) +0x0000| 07 00 | .. | xlp_info: 7 0x2-0x3.7 (2) +0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) +0x0000| 00 00 00 cd ae 01 00 00| ........| xlp_pageaddr: 1850275266560 0x8-0xf.7 (8) +0x0010|73 00 00 00 |s... | xlp_rem_len: 115 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) + | | | XLogLongPageHeaderData{}: 0x18-0x27.7 (16) +0x0010| 68 e7 dd 05 b3 88 b3 61| h......a| xlp_sysid: 7040120944989169512 0x18-0x1f.7 (8) +0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) +0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) +0x0020| 80 01 00 00 80 01 00 00| ........| raw_bytes_of_prev_wal_file: raw bits 0x28-0x9f.7 (120) +0x0030|80 01 00 00 80 01 00 00 80 01 00 00 80 01 00 00|................| +* |until 0x9f.7 (120) | | + | | | Records[0:15]: 0xa0-0x21ff.7 (8544) + | | | [0]{}: XLogRecord 0xa0-0x2d7.7 (568) + | | | lsn: "1AE/CD0000A0" (1850275266720) 0xa0-NA (0) +0x00a0|33 02 00 00 |3... | xl_tot_len: 563 0xa0-0xa3.7 (4) +0x00a0| 00 00 00 00 40 fe ff cc ae 01 00 00| ....@.......| xLogBody0: raw bits 0xa4-0x2d2.7 (559) +0x00b0|10 09 00 00 b2 1a 64 de 00 10 00 00 f8 01 f8 01|......d.........| +* |until 0x2d2.7 (559) | | +0x00a0| 00 00 00 00 | .... | xl_xid: 0 0xa4-0xa7.7 (4) +0x00a0| 40 fe ff cc ae 01 00 00| @.......| xl_prev: "1AE/CCFFFE40" (1850275266112) 0xa8-0xaf.7 (8) +0x00b0|10 |. | xl_info: 16 0xb0-0xb0.7 (1) +0x00b0| 09 | . | xl_rmid: 9 0xb1-0xb1.7 (1) +0x00b0| 00 00 | .. | hole1: 0 0xb2-0xb3.7 (2) +0x00b0| b2 1a 64 de | ..d. | xl_crc: 3731102386 0xb4-0xb7.7 (4) +0x02d0| 00 00 00 00 00 | ..... | align0: raw bits 0x2d3-0x2d7.7 (5) + | | | [1]{}: XLogRecord 0x2d8-0x50f.7 (568) + | | | lsn: "1AE/CD0002D8" (1850275267288) 0x2d8-NA (0) +0x02d0| 33 02 00 00 | 3... | xl_tot_len: 563 0x2d8-0x2db.7 (4) +0x02d0| 00 00 00 00| ....| xLogBody0: raw bits 0x2dc-0x50a.7 (559) +0x02e0|a0 00 00 cd ae 01 00 00 10 09 00 00 1d bf 48 90|..............H.| +* |until 0x50a.7 (559) | | +0x02d0| 00 00 00 00| ....| xl_xid: 0 0x2dc-0x2df.7 (4) +0x02e0|a0 00 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD0000A0" (1850275266720) 0x2e0-0x2e7.7 (8) +0x02e0| 10 | . | xl_info: 16 0x2e8-0x2e8.7 (1) +0x02e0| 09 | . | xl_rmid: 9 0x2e9-0x2e9.7 (1) +0x02e0| 00 00 | .. | hole1: 0 0x2ea-0x2eb.7 (2) +0x02e0| 1d bf 48 90| ..H.| xl_crc: 2420686621 0x2ec-0x2ef.7 (4) +0x0500| 00 00 00 00 00| .....| align0: raw bits 0x50b-0x50f.7 (5) + | | | [2]{}: XLogRecord 0x510-0x747.7 (568) + | | | lsn: "1AE/CD000510" (1850275267856) 0x510-NA (0) +0x0510|33 02 00 00 |3... | xl_tot_len: 563 0x510-0x513.7 (4) +0x0510| 00 00 00 00 d8 02 00 cd ae 01 00 00| ............| xLogBody0: raw bits 0x514-0x742.7 (559) +0x0520|10 09 00 00 b4 1a 59 98 00 10 00 00 f8 01 f8 01|......Y.........| +* |until 0x742.7 (559) | | +0x0510| 00 00 00 00 | .... | xl_xid: 0 0x514-0x517.7 (4) +0x0510| d8 02 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD0002D8" (1850275267288) 0x518-0x51f.7 (8) +0x0520|10 |. | xl_info: 16 0x520-0x520.7 (1) +0x0520| 09 | . | xl_rmid: 9 0x521-0x521.7 (1) +0x0520| 00 00 | .. | hole1: 0 0x522-0x523.7 (2) +0x0520| b4 1a 59 98 | ..Y. | xl_crc: 2555976372 0x524-0x527.7 (4) +0x0740| 00 00 00 00 00 | ..... | align0: raw bits 0x743-0x747.7 (5) + | | | [3]{}: XLogRecord 0x748-0x97f.7 (568) + | | | lsn: "1AE/CD000748" (1850275268424) 0x748-NA (0) +0x0740| 33 02 00 00 | 3... | xl_tot_len: 563 0x748-0x74b.7 (4) +0x0740| 00 00 00 00| ....| xLogBody0: raw bits 0x74c-0x97a.7 (559) +0x0750|10 05 00 cd ae 01 00 00 10 09 00 00 89 b9 51 e1|..............Q.| +* |until 0x97a.7 (559) | | +0x0740| 00 00 00 00| ....| xl_xid: 0 0x74c-0x74f.7 (4) +0x0750|10 05 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD000510" (1850275267856) 0x750-0x757.7 (8) +0x0750| 10 | . | xl_info: 16 0x758-0x758.7 (1) +0x0750| 09 | . | xl_rmid: 9 0x759-0x759.7 (1) +0x0750| 00 00 | .. | hole1: 0 0x75a-0x75b.7 (2) +0x0750| 89 b9 51 e1| ..Q.| xl_crc: 3780229513 0x75c-0x75f.7 (4) +0x0970| 00 00 00 00 00| .....| align0: raw bits 0x97b-0x97f.7 (5) + | | | [4]{}: XLogRecord 0x980-0xbb7.7 (568) + | | | lsn: "1AE/CD000980" (1850275268992) 0x980-NA (0) +0x0980|33 02 00 00 |3... | xl_tot_len: 563 0x980-0x983.7 (4) +0x0980| 00 00 00 00 48 07 00 cd ae 01 00 00| ....H.......| xLogBody0: raw bits 0x984-0xbb2.7 (559) +0x0990|10 09 00 00 68 d6 37 44 00 10 00 00 f8 01 f8 01|....h.7D........| +* |until 0xbb2.7 (559) | | +0x0980| 00 00 00 00 | .... | xl_xid: 0 0x984-0x987.7 (4) +0x0980| 48 07 00 cd ae 01 00 00| H.......| xl_prev: "1AE/CD000748" (1850275268424) 0x988-0x98f.7 (8) +0x0990|10 |. | xl_info: 16 0x990-0x990.7 (1) +0x0990| 09 | . | xl_rmid: 9 0x991-0x991.7 (1) +0x0990| 00 00 | .. | hole1: 0 0x992-0x993.7 (2) +0x0990| 68 d6 37 44 | h.7D | xl_crc: 1144510056 0x994-0x997.7 (4) +0x0bb0| 00 00 00 00 00 | ..... | align0: raw bits 0xbb3-0xbb7.7 (5) + | | | [5]{}: XLogRecord 0xbb8-0xdef.7 (568) + | | | lsn: "1AE/CD000BB8" (1850275269560) 0xbb8-NA (0) +0x0bb0| 33 02 00 00 | 3... | xl_tot_len: 563 0xbb8-0xbbb.7 (4) +0x0bb0| 00 00 00 00| ....| xLogBody0: raw bits 0xbbc-0xdea.7 (559) +0x0bc0|80 09 00 cd ae 01 00 00 10 09 00 00 b9 7a 82 2d|.............z.-| +* |until 0xdea.7 (559) | | +0x0bb0| 00 00 00 00| ....| xl_xid: 0 0xbbc-0xbbf.7 (4) +0x0bc0|80 09 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD000980" (1850275268992) 0xbc0-0xbc7.7 (8) +0x0bc0| 10 | . | xl_info: 16 0xbc8-0xbc8.7 (1) +0x0bc0| 09 | . | xl_rmid: 9 0xbc9-0xbc9.7 (1) +0x0bc0| 00 00 | .. | hole1: 0 0xbca-0xbcb.7 (2) +0x0bc0| b9 7a 82 2d| .z.-| xl_crc: 763525817 0xbcc-0xbcf.7 (4) +0x0de0| 00 00 00 00 00| .....| align0: raw bits 0xdeb-0xdef.7 (5) + | | | [6]{}: XLogRecord 0xdf0-0x1027.7 (568) + | | | lsn: "1AE/CD000DF0" (1850275270128) 0xdf0-NA (0) +0x0df0|33 02 00 00 |3... | xl_tot_len: 563 0xdf0-0xdf3.7 (4) +0x0df0| 00 00 00 00 b8 0b 00 cd ae 01 00 00| ............| xLogBody0: raw bits 0xdf4-0x1022.7 (559) +0x0e00|10 09 00 00 79 1f 0d ff 00 10 00 00 f8 01 f8 01|....y...........| +* |until 0x1022.7 (559) | | +0x0df0| 00 00 00 00 | .... | xl_xid: 0 0xdf4-0xdf7.7 (4) +0x0df0| b8 0b 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD000BB8" (1850275269560) 0xdf8-0xdff.7 (8) +0x0e00|10 |. | xl_info: 16 0xe00-0xe00.7 (1) +0x0e00| 09 | . | xl_rmid: 9 0xe01-0xe01.7 (1) +0x0e00| 00 00 | .. | hole1: 0 0xe02-0xe03.7 (2) +0x0e00| 79 1f 0d ff | y... | xl_crc: 4279050105 0xe04-0xe07.7 (4) +0x1020| 00 00 00 00 00 | ..... | align0: raw bits 0x1023-0x1027.7 (5) + | | | [7]{}: XLogRecord 0x1028-0x125f.7 (568) + | | | lsn: "1AE/CD001028" (1850275270696) 0x1028-NA (0) +0x1020| 33 02 00 00 | 3... | xl_tot_len: 563 0x1028-0x102b.7 (4) +0x1020| 00 00 00 00| ....| xLogBody0: raw bits 0x102c-0x125a.7 (559) +0x1030|f0 0d 00 cd ae 01 00 00 10 09 00 00 46 d5 42 a8|............F.B.| +* |until 0x125a.7 (559) | | +0x1020| 00 00 00 00| ....| xl_xid: 0 0x102c-0x102f.7 (4) +0x1030|f0 0d 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD000DF0" (1850275270128) 0x1030-0x1037.7 (8) +0x1030| 10 | . | xl_info: 16 0x1038-0x1038.7 (1) +0x1030| 09 | . | xl_rmid: 9 0x1039-0x1039.7 (1) +0x1030| 00 00 | .. | hole1: 0 0x103a-0x103b.7 (2) +0x1030| 46 d5 42 a8| F.B.| xl_crc: 2822952262 0x103c-0x103f.7 (4) +0x1250| 00 00 00 00 00| .....| align0: raw bits 0x125b-0x125f.7 (5) + | | | [8]{}: XLogRecord 0x1260-0x1497.7 (568) + | | | lsn: "1AE/CD001260" (1850275271264) 0x1260-NA (0) +0x1260|33 02 00 00 |3... | xl_tot_len: 563 0x1260-0x1263.7 (4) +0x1260| 00 00 00 00 28 10 00 cd ae 01 00 00| ....(.......| xLogBody0: raw bits 0x1264-0x1492.7 (559) +0x1270|10 09 00 00 9d 65 e6 d6 00 10 00 00 f8 01 f8 01|.....e..........| +* |until 0x1492.7 (559) | | +0x1260| 00 00 00 00 | .... | xl_xid: 0 0x1264-0x1267.7 (4) +0x1260| 28 10 00 cd ae 01 00 00| (.......| xl_prev: "1AE/CD001028" (1850275270696) 0x1268-0x126f.7 (8) +0x1270|10 |. | xl_info: 16 0x1270-0x1270.7 (1) +0x1270| 09 | . | xl_rmid: 9 0x1271-0x1271.7 (1) +0x1270| 00 00 | .. | hole1: 0 0x1272-0x1273.7 (2) +0x1270| 9d 65 e6 d6 | .e.. | xl_crc: 3605423517 0x1274-0x1277.7 (4) +0x1490| 00 00 00 00 00 | ..... | align0: raw bits 0x1493-0x1497.7 (5) + | | | [9]{}: XLogRecord 0x1498-0x16cf.7 (568) + | | | lsn: "1AE/CD001498" (1850275271832) 0x1498-NA (0) +0x1490| 33 02 00 00 | 3... | xl_tot_len: 563 0x1498-0x149b.7 (4) +0x1490| 00 00 00 00| ....| xLogBody0: raw bits 0x149c-0x16ca.7 (559) +0x14a0|60 12 00 cd ae 01 00 00 10 09 00 00 ee ac 89 df|`...............| +* |until 0x16ca.7 (559) | | +0x1490| 00 00 00 00| ....| xl_xid: 0 0x149c-0x149f.7 (4) +0x14a0|60 12 00 cd ae 01 00 00 |`....... | xl_prev: "1AE/CD001260" (1850275271264) 0x14a0-0x14a7.7 (8) +0x14a0| 10 | . | xl_info: 16 0x14a8-0x14a8.7 (1) +0x14a0| 09 | . | xl_rmid: 9 0x14a9-0x14a9.7 (1) +0x14a0| 00 00 | .. | hole1: 0 0x14aa-0x14ab.7 (2) +0x14a0| ee ac 89 df| ....| xl_crc: 3750341870 0x14ac-0x14af.7 (4) +0x16c0| 00 00 00 00 00| .....| align0: raw bits 0x16cb-0x16cf.7 (5) + | | | [10]{}: XLogRecord 0x16d0-0x1907.7 (568) + | | | lsn: "1AE/CD0016D0" (1850275272400) 0x16d0-NA (0) +0x16d0|33 02 00 00 |3... | xl_tot_len: 563 0x16d0-0x16d3.7 (4) +0x16d0| 00 00 00 00 98 14 00 cd ae 01 00 00| ............| xLogBody0: raw bits 0x16d4-0x1902.7 (559) +0x16e0|10 09 00 00 01 1d d5 45 00 10 00 00 f8 01 f8 01|.......E........| +* |until 0x1902.7 (559) | | +0x16d0| 00 00 00 00 | .... | xl_xid: 0 0x16d4-0x16d7.7 (4) +0x16d0| 98 14 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD001498" (1850275271832) 0x16d8-0x16df.7 (8) +0x16e0|10 |. | xl_info: 16 0x16e0-0x16e0.7 (1) +0x16e0| 09 | . | xl_rmid: 9 0x16e1-0x16e1.7 (1) +0x16e0| 00 00 | .. | hole1: 0 0x16e2-0x16e3.7 (2) +0x16e0| 01 1d d5 45 | ...E | xl_crc: 1171594497 0x16e4-0x16e7.7 (4) +0x1900| 00 00 00 00 00 | ..... | align0: raw bits 0x1903-0x1907.7 (5) + | | | [11]{}: XLogRecord 0x1908-0x1b3f.7 (568) + | | | lsn: "1AE/CD001908" (1850275272968) 0x1908-NA (0) +0x1900| 33 02 00 00 | 3... | xl_tot_len: 563 0x1908-0x190b.7 (4) +0x1900| 00 00 00 00| ....| xLogBody0: raw bits 0x190c-0x1b3a.7 (559) +0x1910|d0 16 00 cd ae 01 00 00 10 09 00 00 d5 77 f4 9d|.............w..| +* |until 0x1b3a.7 (559) | | +0x1900| 00 00 00 00| ....| xl_xid: 0 0x190c-0x190f.7 (4) +0x1910|d0 16 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD0016D0" (1850275272400) 0x1910-0x1917.7 (8) +0x1910| 10 | . | xl_info: 16 0x1918-0x1918.7 (1) +0x1910| 09 | . | xl_rmid: 9 0x1919-0x1919.7 (1) +0x1910| 00 00 | .. | hole1: 0 0x191a-0x191b.7 (2) +0x1910| d5 77 f4 9d| .w..| xl_crc: 2650044373 0x191c-0x191f.7 (4) +0x1b30| 00 00 00 00 00| .....| align0: raw bits 0x1b3b-0x1b3f.7 (5) + | | | [12]{}: XLogRecord 0x1b40-0x1d77.7 (568) + | | | lsn: "1AE/CD001B40" (1850275273536) 0x1b40-NA (0) +0x1b40|33 02 00 00 |3... | xl_tot_len: 563 0x1b40-0x1b43.7 (4) +0x1b40| 00 00 00 00 08 19 00 cd ae 01 00 00| ............| xLogBody0: raw bits 0x1b44-0x1d72.7 (559) +0x1b50|10 09 00 00 4f 66 92 24 00 10 00 00 f8 01 f8 01|....Of.$........| +* |until 0x1d72.7 (559) | | +0x1b40| 00 00 00 00 | .... | xl_xid: 0 0x1b44-0x1b47.7 (4) +0x1b40| 08 19 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD001908" (1850275272968) 0x1b48-0x1b4f.7 (8) +0x1b50|10 |. | xl_info: 16 0x1b50-0x1b50.7 (1) +0x1b50| 09 | . | xl_rmid: 9 0x1b51-0x1b51.7 (1) +0x1b50| 00 00 | .. | hole1: 0 0x1b52-0x1b53.7 (2) +0x1b50| 4f 66 92 24 | Of.$ | xl_crc: 613574223 0x1b54-0x1b57.7 (4) +0x1d70| 00 00 00 00 00 | ..... | align0: raw bits 0x1d73-0x1d77.7 (5) + | | | [13]{}: XLogRecord 0x1d78-0x1faf.7 (568) + | | | lsn: "1AE/CD001D78" (1850275274104) 0x1d78-NA (0) +0x1d70| 33 02 00 00 | 3... | xl_tot_len: 563 0x1d78-0x1d7b.7 (4) +0x1d70| 00 00 00 00| ....| xLogBody0: raw bits 0x1d7c-0x1faa.7 (559) +0x1d80|40 1b 00 cd ae 01 00 00 10 09 00 00 70 46 fe 1a|@...........pF..| +* |until 0x1faa.7 (559) | | +0x1d70| 00 00 00 00| ....| xl_xid: 0 0x1d7c-0x1d7f.7 (4) +0x1d80|40 1b 00 cd ae 01 00 00 |@....... | xl_prev: "1AE/CD001B40" (1850275273536) 0x1d80-0x1d87.7 (8) +0x1d80| 10 | . | xl_info: 16 0x1d88-0x1d88.7 (1) +0x1d80| 09 | . | xl_rmid: 9 0x1d89-0x1d89.7 (1) +0x1d80| 00 00 | .. | hole1: 0 0x1d8a-0x1d8b.7 (2) +0x1d80| 70 46 fe 1a| pF..| xl_crc: 452871792 0x1d8c-0x1d8f.7 (4) +0x1fa0| 00 00 00 00 00| .....| align0: raw bits 0x1fab-0x1faf.7 (5) + | | | [14]{}: XLogRecord 0x1fb0-0x21ff.7 (592) + | | | lsn: "1AE/CD001FB0" (1850275274672) 0x1fb0-NA (0) +0x1fb0|33 02 00 00 |3... | xl_tot_len: 563 0x1fb0-0x1fb3.7 (4) +0x1fb0| 00 00 00 00 78 1d 00 cd ae 01 00 00| ....x.......| xLogBody0: raw bits 0x1fb4-0x1fff.7 (76) +0x1fc0|10 09 00 00 8b 13 fa fb 00 10 00 00 f8 01 f8 01|................| +* |until 0x1fff.7 (76) | | +0x1fb0| 00 00 00 00 | .... | xl_xid: 0 0x1fb4-0x1fb7.7 (4) +0x1fb0| 78 1d 00 cd ae 01 00 00| x.......| xl_prev: "1AE/CD001D78" (1850275274104) 0x1fb8-0x1fbf.7 (8) +0x1fc0|10 |. | xl_info: 16 0x1fc0-0x1fc0.7 (1) +0x1fc0| 09 | . | xl_rmid: 9 0x1fc1-0x1fc1.7 (1) +0x1fc0| 00 00 | .. | hole1: 0 0x1fc2-0x1fc3.7 (2) +0x1fc0| 8b 13 fa fb | .... | xl_crc: 4227470219 0x1fc4-0x1fc7.7 (4) +0x2010| 80 01 00 00 80 01 00 00| ........| xLogBody1: raw bits 0x2018-0x21ff.7 (488) +0x2020|80 01 00 00 80 01 00 00 80 01 00 00 80 01 00 00|................| +* |until 0x21ff.7 (488) | | + | | | [1]{}: Page 0x2000-0x3fff.7 (8192) + | | | XLogPageHeaderData{}: 0x2000-0x2017.7 (24) +0x2000|0d d1 |.. | xlp_magic: 53517 0x2000-0x2001.7 (2) +0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) +0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) +0x2000| 00 20 00 cd ae 01 00 00| . ......| xlp_pageaddr: 1850275274752 0x2008-0x200f.7 (8) +0x2010|e3 01 00 00 |.... | xlp_rem_len: 483 0x2010-0x2013.7 (4) +0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) + | | | Records[0:14]: 0x2200-0x3fff.7 (7680) + | | | [0]{}: XLogRecord 0x2200-0x2437.7 (568) + | | | lsn: "1AE/CD002200" (1850275275264) 0x2200-NA (0) +0x2200|33 02 00 00 |3... | xl_tot_len: 563 0x2200-0x2203.7 (4) +0x2200| 00 00 00 00 b0 1f 00 cd ae 01 00 00| ............| xLogBody0: raw bits 0x2204-0x2432.7 (559) +0x2210|10 09 00 00 af c7 8a 8b 00 10 00 00 f8 01 f8 01|................| +* |until 0x2432.7 (559) | | +0x2200| 00 00 00 00 | .... | xl_xid: 0 0x2204-0x2207.7 (4) +0x2200| b0 1f 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD001FB0" (1850275274672) 0x2208-0x220f.7 (8) +0x2210|10 |. | xl_info: 16 0x2210-0x2210.7 (1) +0x2210| 09 | . | xl_rmid: 9 0x2211-0x2211.7 (1) +0x2210| 00 00 | .. | hole1: 0 0x2212-0x2213.7 (2) +0x2210| af c7 8a 8b | .... | xl_crc: 2341128111 0x2214-0x2217.7 (4) +0x2430| 00 00 00 00 00 | ..... | align0: raw bits 0x2433-0x2437.7 (5) + | | | [1]{}: XLogRecord 0x2438-0x266f.7 (568) + | | | lsn: "1AE/CD002438" (1850275275832) 0x2438-NA (0) +0x2430| 33 02 00 00 | 3... | xl_tot_len: 563 0x2438-0x243b.7 (4) +0x2430| 00 00 00 00| ....| xLogBody0: raw bits 0x243c-0x266a.7 (559) +0x2440|00 22 00 cd ae 01 00 00 10 09 00 00 9e 5c 82 1c|."...........\..| +* |until 0x266a.7 (559) | | +0x2430| 00 00 00 00| ....| xl_xid: 0 0x243c-0x243f.7 (4) +0x2440|00 22 00 cd ae 01 00 00 |."...... | xl_prev: "1AE/CD002200" (1850275275264) 0x2440-0x2447.7 (8) +0x2440| 10 | . | xl_info: 16 0x2448-0x2448.7 (1) +0x2440| 09 | . | xl_rmid: 9 0x2449-0x2449.7 (1) +0x2440| 00 00 | .. | hole1: 0 0x244a-0x244b.7 (2) +0x2440| 9e 5c 82 1c| .\..| xl_crc: 478305438 0x244c-0x244f.7 (4) +0x2660| 00 00 00 00 00| .....| align0: raw bits 0x266b-0x266f.7 (5) + | | | [2]{}: XLogRecord 0x2670-0x28a7.7 (568) + | | | lsn: "1AE/CD002670" (1850275276400) 0x2670-NA (0) +0x2670|33 02 00 00 |3... | xl_tot_len: 563 0x2670-0x2673.7 (4) +0x2670| 00 00 00 00 38 24 00 cd ae 01 00 00| ....8$......| xLogBody0: raw bits 0x2674-0x28a2.7 (559) +0x2680|10 09 00 00 3c 35 49 e6 00 10 00 00 f8 01 f8 01|....<5I.........| +* |until 0x28a2.7 (559) | | +0x2670| 00 00 00 00 | .... | xl_xid: 0 0x2674-0x2677.7 (4) +0x2670| 38 24 00 cd ae 01 00 00| 8$......| xl_prev: "1AE/CD002438" (1850275275832) 0x2678-0x267f.7 (8) +0x2680|10 |. | xl_info: 16 0x2680-0x2680.7 (1) +0x2680| 09 | . | xl_rmid: 9 0x2681-0x2681.7 (1) +0x2680| 00 00 | .. | hole1: 0 0x2682-0x2683.7 (2) +0x2680| 3c 35 49 e6 | <5I. | xl_crc: 3863557436 0x2684-0x2687.7 (4) +0x28a0| 00 00 00 00 00 | ..... | align0: raw bits 0x28a3-0x28a7.7 (5) + | | | [3]{}: XLogRecord 0x28a8-0x2adf.7 (568) + | | | lsn: "1AE/CD0028A8" (1850275276968) 0x28a8-NA (0) +0x28a0| 33 02 00 00 | 3... | xl_tot_len: 563 0x28a8-0x28ab.7 (4) +0x28a0| 00 00 00 00| ....| xLogBody0: raw bits 0x28ac-0x2ada.7 (559) +0x28b0|70 26 00 cd ae 01 00 00 10 09 00 00 79 04 ea ef|p&..........y...| +* |until 0x2ada.7 (559) | | +0x28a0| 00 00 00 00| ....| xl_xid: 0 0x28ac-0x28af.7 (4) +0x28b0|70 26 00 cd ae 01 00 00 |p&...... | xl_prev: "1AE/CD002670" (1850275276400) 0x28b0-0x28b7.7 (8) +0x28b0| 10 | . | xl_info: 16 0x28b8-0x28b8.7 (1) +0x28b0| 09 | . | xl_rmid: 9 0x28b9-0x28b9.7 (1) +0x28b0| 00 00 | .. | hole1: 0 0x28ba-0x28bb.7 (2) +0x28b0| 79 04 ea ef| y...| xl_crc: 4025091193 0x28bc-0x28bf.7 (4) +0x2ad0| 00 00 00 00 00| .....| align0: raw bits 0x2adb-0x2adf.7 (5) + | | | [4]{}: XLogRecord 0x2ae0-0x2d17.7 (568) + | | | lsn: "1AE/CD002AE0" (1850275277536) 0x2ae0-NA (0) +0x2ae0|33 02 00 00 |3... | xl_tot_len: 563 0x2ae0-0x2ae3.7 (4) +0x2ae0| 00 00 00 00 a8 28 00 cd ae 01 00 00| .....(......| xLogBody0: raw bits 0x2ae4-0x2d12.7 (559) +0x2af0|10 09 00 00 b2 37 ea f5 00 10 00 00 f8 01 f8 01|.....7..........| +* |until 0x2d12.7 (559) | | +0x2ae0| 00 00 00 00 | .... | xl_xid: 0 0x2ae4-0x2ae7.7 (4) +0x2ae0| a8 28 00 cd ae 01 00 00| .(......| xl_prev: "1AE/CD0028A8" (1850275276968) 0x2ae8-0x2aef.7 (8) +0x2af0|10 |. | xl_info: 16 0x2af0-0x2af0.7 (1) +0x2af0| 09 | . | xl_rmid: 9 0x2af1-0x2af1.7 (1) +0x2af0| 00 00 | .. | hole1: 0 0x2af2-0x2af3.7 (2) +0x2af0| b2 37 ea f5 | .7.. | xl_crc: 4125767602 0x2af4-0x2af7.7 (4) +0x2d10| 00 00 00 00 00 | ..... | align0: raw bits 0x2d13-0x2d17.7 (5) + | | | [5]{}: XLogRecord 0x2d18-0x2f4f.7 (568) + | | | lsn: "1AE/CD002D18" (1850275278104) 0x2d18-NA (0) +0x2d10| 33 02 00 00 | 3... | xl_tot_len: 563 0x2d18-0x2d1b.7 (4) +0x2d10| 00 00 00 00| ....| xLogBody0: raw bits 0x2d1c-0x2f4a.7 (559) +0x2d20|e0 2a 00 cd ae 01 00 00 10 09 00 00 b2 22 7d b8|.*..........."}.| +* |until 0x2f4a.7 (559) | | +0x2d10| 00 00 00 00| ....| xl_xid: 0 0x2d1c-0x2d1f.7 (4) +0x2d20|e0 2a 00 cd ae 01 00 00 |.*...... | xl_prev: "1AE/CD002AE0" (1850275277536) 0x2d20-0x2d27.7 (8) +0x2d20| 10 | . | xl_info: 16 0x2d28-0x2d28.7 (1) +0x2d20| 09 | . | xl_rmid: 9 0x2d29-0x2d29.7 (1) +0x2d20| 00 00 | .. | hole1: 0 0x2d2a-0x2d2b.7 (2) +0x2d20| b2 22 7d b8| ."}.| xl_crc: 3095208626 0x2d2c-0x2d2f.7 (4) +0x2f40| 00 00 00 00 00| .....| align0: raw bits 0x2f4b-0x2f4f.7 (5) + | | | [6]{}: XLogRecord 0x2f50-0x3187.7 (568) + | | | lsn: "1AE/CD002F50" (1850275278672) 0x2f50-NA (0) +0x2f50|33 02 00 00 |3... | xl_tot_len: 563 0x2f50-0x2f53.7 (4) +0x2f50| 00 00 00 00 18 2d 00 cd ae 01 00 00| .....-......| xLogBody0: raw bits 0x2f54-0x3182.7 (559) +0x2f60|10 09 00 00 80 96 72 1a 00 10 00 00 f8 01 f8 01|......r.........| +* |until 0x3182.7 (559) | | +0x2f50| 00 00 00 00 | .... | xl_xid: 0 0x2f54-0x2f57.7 (4) +0x2f50| 18 2d 00 cd ae 01 00 00| .-......| xl_prev: "1AE/CD002D18" (1850275278104) 0x2f58-0x2f5f.7 (8) +0x2f60|10 |. | xl_info: 16 0x2f60-0x2f60.7 (1) +0x2f60| 09 | . | xl_rmid: 9 0x2f61-0x2f61.7 (1) +0x2f60| 00 00 | .. | hole1: 0 0x2f62-0x2f63.7 (2) +0x2f60| 80 96 72 1a | ..r. | xl_crc: 443717248 0x2f64-0x2f67.7 (4) +0x3180| 00 00 00 00 00 | ..... | align0: raw bits 0x3183-0x3187.7 (5) + | | | [7]{}: XLogRecord 0x3188-0x33bf.7 (568) + | | | lsn: "1AE/CD003188" (1850275279240) 0x3188-NA (0) +0x3180| 33 02 00 00 | 3... | xl_tot_len: 563 0x3188-0x318b.7 (4) +0x3180| 00 00 00 00| ....| xLogBody0: raw bits 0x318c-0x33ba.7 (559) +0x3190|50 2f 00 cd ae 01 00 00 10 09 00 00 1f 08 37 dc|P/............7.| +* |until 0x33ba.7 (559) | | +0x3180| 00 00 00 00| ....| xl_xid: 0 0x318c-0x318f.7 (4) +0x3190|50 2f 00 cd ae 01 00 00 |P/...... | xl_prev: "1AE/CD002F50" (1850275278672) 0x3190-0x3197.7 (8) +0x3190| 10 | . | xl_info: 16 0x3198-0x3198.7 (1) +0x3190| 09 | . | xl_rmid: 9 0x3199-0x3199.7 (1) +0x3190| 00 00 | .. | hole1: 0 0x319a-0x319b.7 (2) +0x3190| 1f 08 37 dc| ..7.| xl_crc: 3694594079 0x319c-0x319f.7 (4) +0x33b0| 00 00 00 00 00| .....| align0: raw bits 0x33bb-0x33bf.7 (5) + | | | [8]{}: XLogRecord 0x33c0-0x35f7.7 (568) + | | | lsn: "1AE/CD0033C0" (1850275279808) 0x33c0-NA (0) +0x33c0|33 02 00 00 |3... | xl_tot_len: 563 0x33c0-0x33c3.7 (4) +0x33c0| 00 00 00 00 88 31 00 cd ae 01 00 00| .....1......| xLogBody0: raw bits 0x33c4-0x35f2.7 (559) +0x33d0|10 09 00 00 65 b1 ef 38 00 10 00 00 f8 01 f8 01|....e..8........| +* |until 0x35f2.7 (559) | | +0x33c0| 00 00 00 00 | .... | xl_xid: 0 0x33c4-0x33c7.7 (4) +0x33c0| 88 31 00 cd ae 01 00 00| .1......| xl_prev: "1AE/CD003188" (1850275279240) 0x33c8-0x33cf.7 (8) +0x33d0|10 |. | xl_info: 16 0x33d0-0x33d0.7 (1) +0x33d0| 09 | . | xl_rmid: 9 0x33d1-0x33d1.7 (1) +0x33d0| 00 00 | .. | hole1: 0 0x33d2-0x33d3.7 (2) +0x33d0| 65 b1 ef 38 | e..8 | xl_crc: 955232613 0x33d4-0x33d7.7 (4) +0x35f0| 00 00 00 00 00 | ..... | align0: raw bits 0x35f3-0x35f7.7 (5) + | | | [9]{}: XLogRecord 0x35f8-0x382f.7 (568) + | | | lsn: "1AE/CD0035F8" (1850275280376) 0x35f8-NA (0) +0x35f0| 33 02 00 00 | 3... | xl_tot_len: 563 0x35f8-0x35fb.7 (4) +0x35f0| 00 00 00 00| ....| xLogBody0: raw bits 0x35fc-0x382a.7 (559) +0x3600|c0 33 00 cd ae 01 00 00 10 09 00 00 32 e8 42 32|.3..........2.B2| +* |until 0x382a.7 (559) | | +0x35f0| 00 00 00 00| ....| xl_xid: 0 0x35fc-0x35ff.7 (4) +0x3600|c0 33 00 cd ae 01 00 00 |.3...... | xl_prev: "1AE/CD0033C0" (1850275279808) 0x3600-0x3607.7 (8) +0x3600| 10 | . | xl_info: 16 0x3608-0x3608.7 (1) +0x3600| 09 | . | xl_rmid: 9 0x3609-0x3609.7 (1) +0x3600| 00 00 | .. | hole1: 0 0x360a-0x360b.7 (2) +0x3600| 32 e8 42 32| 2.B2| xl_crc: 843245618 0x360c-0x360f.7 (4) +0x3820| 00 00 00 00 00| .....| align0: raw bits 0x382b-0x382f.7 (5) + | | | [10]{}: XLogRecord 0x3830-0x3a67.7 (568) + | | | lsn: "1AE/CD003830" (1850275280944) 0x3830-NA (0) +0x3830|33 02 00 00 |3... | xl_tot_len: 563 0x3830-0x3833.7 (4) +0x3830| 00 00 00 00 f8 35 00 cd ae 01 00 00| .....5......| xLogBody0: raw bits 0x3834-0x3a62.7 (559) +0x3840|10 09 00 00 47 bd 15 95 00 10 00 00 f8 01 f8 01|....G...........| +* |until 0x3a62.7 (559) | | +0x3830| 00 00 00 00 | .... | xl_xid: 0 0x3834-0x3837.7 (4) +0x3830| f8 35 00 cd ae 01 00 00| .5......| xl_prev: "1AE/CD0035F8" (1850275280376) 0x3838-0x383f.7 (8) +0x3840|10 |. | xl_info: 16 0x3840-0x3840.7 (1) +0x3840| 09 | . | xl_rmid: 9 0x3841-0x3841.7 (1) +0x3840| 00 00 | .. | hole1: 0 0x3842-0x3843.7 (2) +0x3840| 47 bd 15 95 | G... | xl_crc: 2501229895 0x3844-0x3847.7 (4) +0x3a60| 00 00 00 00 00 | ..... | align0: raw bits 0x3a63-0x3a67.7 (5) + | | | [11]{}: XLogRecord 0x3a68-0x3c9f.7 (568) + | | | lsn: "1AE/CD003A68" (1850275281512) 0x3a68-NA (0) +0x3a60| 33 02 00 00 | 3... | xl_tot_len: 563 0x3a68-0x3a6b.7 (4) +0x3a60| 00 00 00 00| ....| xLogBody0: raw bits 0x3a6c-0x3c9a.7 (559) +0x3a70|30 38 00 cd ae 01 00 00 10 09 00 00 14 a8 35 e0|08............5.| +* |until 0x3c9a.7 (559) | | +0x3a60| 00 00 00 00| ....| xl_xid: 0 0x3a6c-0x3a6f.7 (4) +0x3a70|30 38 00 cd ae 01 00 00 |08...... | xl_prev: "1AE/CD003830" (1850275280944) 0x3a70-0x3a77.7 (8) +0x3a70| 10 | . | xl_info: 16 0x3a78-0x3a78.7 (1) +0x3a70| 09 | . | xl_rmid: 9 0x3a79-0x3a79.7 (1) +0x3a70| 00 00 | .. | hole1: 0 0x3a7a-0x3a7b.7 (2) +0x3a70| 14 a8 35 e0| ..5.| xl_crc: 3761612820 0x3a7c-0x3a7f.7 (4) +0x3c90| 00 00 00 00 00| .....| align0: raw bits 0x3c9b-0x3c9f.7 (5) + | | | [12]{}: XLogRecord 0x3ca0-0x3ed7.7 (568) + | | | lsn: "1AE/CD003CA0" (1850275282080) 0x3ca0-NA (0) +0x3ca0|33 02 00 00 |3... | xl_tot_len: 563 0x3ca0-0x3ca3.7 (4) +0x3ca0| 00 00 00 00 68 3a 00 cd ae 01 00 00| ....h:......| xLogBody0: raw bits 0x3ca4-0x3ed2.7 (559) +0x3cb0|10 09 00 00 84 11 b3 9e 00 10 00 00 f8 01 f8 01|................| +* |until 0x3ed2.7 (559) | | +0x3ca0| 00 00 00 00 | .... | xl_xid: 0 0x3ca4-0x3ca7.7 (4) +0x3ca0| 68 3a 00 cd ae 01 00 00| h:......| xl_prev: "1AE/CD003A68" (1850275281512) 0x3ca8-0x3caf.7 (8) +0x3cb0|10 |. | xl_info: 16 0x3cb0-0x3cb0.7 (1) +0x3cb0| 09 | . | xl_rmid: 9 0x3cb1-0x3cb1.7 (1) +0x3cb0| 00 00 | .. | hole1: 0 0x3cb2-0x3cb3.7 (2) +0x3cb0| 84 11 b3 9e | .... | xl_crc: 2662535556 0x3cb4-0x3cb7.7 (4) +0x3ed0| 00 00 00 00 00 | ..... | align0: raw bits 0x3ed3-0x3ed7.7 (5) + | | | [13]{}: XLogRecord 0x3ed8-0x3fff.7 (296) + | | | lsn: "1AE/CD003ED8" (1850275282648) 0x3ed8-NA (0) +0x3ed0| 33 02 00 00 | 3... | xl_tot_len: 563 0x3ed8-0x3edb.7 (4) +0x3ed0| 00 00 00 00| ....| xLogBody0: raw bits 0x3edc-0x3fff.7 (292) +0x3ee0|a0 3c 00 cd ae 01 00 00 10 09 00 00 f5 86 96 77|.<.............w| +* |until 0x3fff.7 (end) (292) | | +0x3ed0| 00 00 00 00| ....| xl_xid: 0 0x3edc-0x3edf.7 (4) +0x3ee0|a0 3c 00 cd ae 01 00 00 |.<...... | xl_prev: "1AE/CD003CA0" (1850275282080) 0x3ee0-0x3ee7.7 (8) +0x3ee0| 10 | . | xl_info: 16 0x3ee8-0x3ee8.7 (1) +0x3ee0| 09 | . | xl_rmid: 9 0x3ee9-0x3ee9.7 (1) +0x3ee0| 00 00 | .. | hole1: 0 0x3eea-0x3eeb.7 (2) +0x3ee0| f5 86 96 77| ...w| xl_crc: 2006353653 0x3eec-0x3eef.7 (4) From e8d8caca410634304ee70e4320c5178ee556ff6a Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 28 Oct 2022 13:09:09 +0300 Subject: [PATCH 112/141] postgres: pgpro wal implementation --- .../postgres/common/pg_wal/pgproee/pg_wal.go | 312 ++++++++++++++++++ format/postgres/pg_wal.go | 25 ++ 2 files changed, 337 insertions(+) create mode 100644 format/postgres/common/pg_wal/pgproee/pg_wal.go diff --git a/format/postgres/common/pg_wal/pgproee/pg_wal.go b/format/postgres/common/pg_wal/pgproee/pg_wal.go new file mode 100644 index 000000000..8adfa7bef --- /dev/null +++ b/format/postgres/common/pg_wal/pgproee/pg_wal.go @@ -0,0 +1,312 @@ +package pgproee + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" +) + +//nolint:revive +const ( + XLOG_BLCKSZ = 8192 + XLP_LONG_HEADER = 2 +) + +type Wal struct { + maxOffset int64 + page *walPage + + pageRecords *decode.D + + state *walState +} + +type walState struct { + record *decode.D + recordRemLenBytes int64 +} + +type walPage struct { + xlpPageAddr uint64 +} + +func DecodePGWAL(d *decode.D, maxOffset uint32) any { + pages := d.FieldArrayValue("Pages") + wal := &Wal{ + maxOffset: int64(maxOffset), + } + + for { + decodeXLogPage(wal, pages) + + if pages.End() { + break + } + + posBytes := pages.Pos() / 8 + if posBytes >= wal.maxOffset { + d.FieldRawLen("unused", d.BitsLeft()) + break + } + + remBytes := posBytes % XLOG_BLCKSZ + if remBytes != 0 { + d.Fatalf("invalid page remBytes = %d\n", remBytes) + } + } + + return nil +} + +func decodeXLogPage(wal *Wal, d *decode.D) { + pos0 := d.Pos() + d.SeekRel(8 * 8) + xlpPageAddr0 := d.U64() + d.SeekAbs(pos0) + if wal.page != nil { + xlpPageAddr1 := wal.page.xlpPageAddr + XLOG_BLCKSZ + if xlpPageAddr0 != xlpPageAddr1 { + d.Fatalf("invalid xlp_pageaddr expected = %d, actual = %d\n", xlpPageAddr1, xlpPageAddr0) + } + } + wal.page = &walPage{} + + // type = struct XLogPageHeaderData { + /* 0 | 2 */ // uint16 xlp_magic; + /* 2 | 2 */ // uint16 xlp_info; + /* 4 | 4 */ // TimeLineID xlp_tli; + /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; + /* 16 | 4 */ // uint32 xlp_rem_len; + /* XXX 4-byte padding */ + xLogPage := d.FieldStructValue("Page") + header := xLogPage.FieldStructValue("XLogPageHeaderData") + + header.FieldU16("xlp_magic") + xlpInfo := header.FieldU16("xlp_info") + header.FieldU32("xlp_tli") + wal.page.xlpPageAddr = header.FieldU64("xlp_pageaddr") + remLenBytes := header.FieldU32("xlp_rem_len") + header.FieldU32("padding0") + + //if (xlpMagic & XLOG_PAGE_MAGIC_MASK) == 0 { + // d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) + //} + + if (xlpInfo & XLP_LONG_HEADER) != 0 { + // Long header + header.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { + d.FieldU64("xlp_sysid") + d.FieldU32("xlp_seg_size") + d.FieldU32("xlp_xlog_blcksz") + }) + } + + if wal.state != nil { // check recordRemLenBytes is initialized + if wal.state.recordRemLenBytes != int64(remLenBytes) { + d.Fatalf("recordRemLenBytes = %d != remLenBytes = %d", wal.state.recordRemLenBytes, remLenBytes) + } + } + + remLenBytesAligned := int64(common.TypeAlign8(remLenBytes)) + remLen := remLenBytesAligned * 8 + + pos1 := header.Pos() + xLogPage.SeekAbs(pos1) + + // parted XLogRecord + if remLen > 0 { + if wal.state == nil { + // record of previous file + checkPosBytes := xLogPage.Pos() / 8 + if checkPosBytes >= XLOG_BLCKSZ { + d.Fatalf("invalid pos of raw_bytes_of_prev_wal_file, pos = %d\n", checkPosBytes) + } + xLogPage.FieldRawLen("raw_bytes_of_prev_wal_file", remLen) + } else { + // record of previous page + decodeXLogRecord(wal, remLenBytesAligned) + } + } + + pos2 := xLogPage.Pos() + + if wal.state != nil && wal.state.record != nil { + wal.state.record.SeekAbs(pos1) + } + + xLogPage.SeekAbs(pos2) + pageRecords := xLogPage.FieldArrayValue("Records") + + wal.pageRecords = pageRecords + + decodeXLogRecords(wal, d) +} + +func decodeXLogRecords(wal *Wal, d *decode.D) { + pageRecords := wal.pageRecords + + posBytes := d.Pos() / 8 + posMaxOfPageBytes := int64(common.TypeAlign(XLOG_BLCKSZ, uint64(posBytes))) + + for { + /* 0 | 4 */ // uint32 xl_tot_len + /* 4 | 4 */ // TransactionId xl_xid + /* 8 | 8 */ // XLogRecPtr xl_prev + /* 16 | 1 */ // uint8 xl_info + /* 17 | 1 */ // RmgrId xl_rmid + /* XXX 2-byte hole */ + /* 20 | 4 */ // pg_crc32c xl_crc + posBytes1 := d.Pos() / 8 + posBytes1Aligned := int64(common.TypeAlign8(uint64(posBytes1))) + // check aligned - this is correct + // record header is 8 byte aligned + if posBytes1Aligned >= wal.maxOffset { + d.FieldRawLen("unused", d.BitsLeft()) + break + } + + // check what we cat read xl_tot_len on this page + if posMaxOfPageBytes < posBytes1Aligned+4 { + remOnPage := posMaxOfPageBytes - posBytes1 + d.FieldRawLen("page_padding0", remOnPage*8) + // can't read xl_tot_len on this page + // can't create row in this page + // continue on next page + wal.state = nil + return + } + + if posBytes1 != posBytes1Aligned { + // ensure align + d.SeekAbs(posBytes1Aligned * 8) + } + + record := pageRecords.FieldStructValue("XLogRecord") + wal.state = &walState{ + record: record, + } + + lsn0 := uint64(d.Pos() / 8) + lsn1 := lsn0 % XLOG_BLCKSZ + lsn := lsn1 + wal.page.xlpPageAddr + record.FieldValueU("lsn", lsn, common.XLogRecPtrMapper) + + xlTotLen := record.FieldU32("xl_tot_len") + if xlTotLen < 4 { + d.Fatalf("xl_tot_len is less than 4\n") + } + xlTotLen1Bytes := xlTotLen - 4 + pos2Bytes := d.Pos() / 8 + + remOnPage := posMaxOfPageBytes - pos2Bytes + if remOnPage <= 0 { + d.Fatalf("remOnPage is negative\n") + } + + if remOnPage < int64(xlTotLen1Bytes) { + //record.FieldRawLen("xLogBody", remOnPage*8) + decodeXLogRecord(wal, remOnPage) + wal.state.recordRemLenBytes = int64(xlTotLen1Bytes) - remOnPage + break + } + + xLogBodyLen := int64(xlTotLen1Bytes) * 8 + if xLogBodyLen <= 0 { + errPos := record.Pos() / 8 + d.Fatalf("xlTotLen1Bytes is negative, xLogBodyLen = %d, pos = %X\n", xLogBodyLen, errPos) + } + + decodeXLogRecord(wal, int64(xlTotLen1Bytes)) + + // align record + posBytes2 := d.Pos() / 8 + posBytes2Aligned := int64(common.TypeAlign8(uint64(posBytes2))) + if posBytes2 < posBytes2Aligned { + alignLen := (posBytes2Aligned - posBytes2) * 8 + wal.state.record.FieldRawLen("align0", alignLen) + } + + wal.state = nil + } +} + +// check that we can read bitsCount on page (with posMax?) +func isEnd(d *decode.D, posMax int64, bitsCount int64) bool { + pos := d.Pos() + posRead := pos + bitsCount + result := posRead > posMax + if result { + // set reader at and position to continue reading + d.SeekAbs(posMax) + } + return result +} + +func decodeXLogRecord(wal *Wal, maxBytes int64) { + record := wal.state.record + + pos0 := record.Pos() + maxLen := maxBytes * 8 + if record.FieldGet("xLogBody0") == nil { + // body on first page + record.FieldRawLen("xLogBody0", maxLen) + } else { + // body on second page + record.FieldRawLen("xLogBody1", maxLen) + } + pos1 := record.Pos() + posMax := pos1 + record.SeekAbs(pos0) + + // xl_tot_len already read + + if record.FieldGet("hole0") == nil { + if isEnd(record, posMax, 32) { + return + } + record.FieldU32("hole0") + } + + if record.FieldGet("xl_xid") == nil { + if isEnd(record, posMax, 64) { + return + } + record.FieldU64("xl_xid") + } + + if record.FieldGet("xl_prev") == nil { + if isEnd(record, posMax, 64) { + return + } + record.FieldU64("xl_prev", common.XLogRecPtrMapper) + } + + if record.FieldGet("xl_info") == nil { + if isEnd(record, posMax, 8) { + return + } + record.FieldU8("xl_info") + } + + if record.FieldGet("xl_rmid") == nil { + if isEnd(record, posMax, 8) { + return + } + record.FieldU8("xl_rmid") + } + + if record.FieldGet("hole1") == nil { + if isEnd(record, posMax, 16) { + return + } + record.FieldU16("hole1") + } + + if record.FieldGet("xl_crc") == nil { + if isEnd(record, posMax, 32) { + return + } + record.FieldU32("xl_crc") + } + + record.SeekAbs(posMax) +} diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index 8ef7213e4..7d2233976 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -2,6 +2,7 @@ package postgres import ( "fmt" + "github.com/wader/fq/format/postgres/common/pg_wal/pgproee" "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/common" @@ -66,5 +67,29 @@ func decodePGWAL(d *decode.D, in any) any { maxOffset = XLogSegmentOffset(lsn) } + switch pgIn.Flavour { + case PG_FLAVOUR_POSTGRES10, + PG_FLAVOUR_POSTGRES11, + PG_FLAVOUR_POSTGRES12, + PG_FLAVOUR_POSTGRES13, + PG_FLAVOUR_POSTGRES14, + PG_FLAVOUR_PGPRO10, + PG_FLAVOUR_PGPRO11, + PG_FLAVOUR_PGPRO12, + PG_FLAVOUR_PGPRO13, + PG_FLAVOUR_PGPRO14: + return common.DecodePGWAL(d, maxOffset) + + case PG_FLAVOUR_PGPROEE10, + PG_FLAVOUR_PGPROEE11, + PG_FLAVOUR_PGPROEE12, + PG_FLAVOUR_PGPROEE13, + PG_FLAVOUR_PGPROEE14: + return pgproee.DecodePGWAL(d, maxOffset) + + default: + break + } + return common.DecodePGWAL(d, maxOffset) } From d7a0f930df371f7be14c3830d6ef932f65abfc3a Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 28 Oct 2022 13:13:33 +0300 Subject: [PATCH 113/141] postgres: pgpro wal refactoring --- .../common/{ => pg_wal/postgres}/pg_wal.go | 15 ++++++++------- format/postgres/pg_wal.go | 6 +++--- 2 files changed, 11 insertions(+), 10 deletions(-) rename format/postgres/common/{ => pg_wal/postgres}/pg_wal.go (94%) diff --git a/format/postgres/common/pg_wal.go b/format/postgres/common/pg_wal/postgres/pg_wal.go similarity index 94% rename from format/postgres/common/pg_wal.go rename to format/postgres/common/pg_wal/postgres/pg_wal.go index 387b763ef..88880be2f 100644 --- a/format/postgres/common/pg_wal.go +++ b/format/postgres/common/pg_wal/postgres/pg_wal.go @@ -1,6 +1,7 @@ -package common +package postgres import ( + "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" ) @@ -142,7 +143,7 @@ func decodeXLogPage(wal *Wal, d *decode.D) { } } - remLenBytesAligned := int64(TypeAlign8(remLenBytes)) + remLenBytesAligned := int64(common.TypeAlign8(remLenBytes)) remLen := remLenBytesAligned * 8 pos1 := header.Pos() @@ -181,7 +182,7 @@ func decodeXLogRecords(wal *Wal, d *decode.D) { pageRecords := wal.pageRecords posBytes := d.Pos() / 8 - posMaxOfPageBytes := int64(TypeAlign(XLOG_BLCKSZ, uint64(posBytes))) + posMaxOfPageBytes := int64(common.TypeAlign(XLOG_BLCKSZ, uint64(posBytes))) for { /* 0 | 4 */ // uint32 xl_tot_len @@ -192,7 +193,7 @@ func decodeXLogRecords(wal *Wal, d *decode.D) { /* XXX 2-byte hole */ /* 20 | 4 */ // pg_crc32c xl_crc posBytes1 := d.Pos() / 8 - posBytes1Aligned := int64(TypeAlign8(uint64(posBytes1))) + posBytes1Aligned := int64(common.TypeAlign8(uint64(posBytes1))) // check aligned - this is correct // record header is 8 byte aligned if posBytes1Aligned >= wal.maxOffset { @@ -224,7 +225,7 @@ func decodeXLogRecords(wal *Wal, d *decode.D) { lsn0 := uint64(d.Pos() / 8) lsn1 := lsn0 % XLOG_BLCKSZ lsn := lsn1 + wal.page.xlpPageAddr - record.FieldValueU("lsn", lsn, XLogRecPtrMapper) + record.FieldValueU("lsn", lsn, common.XLogRecPtrMapper) xlTotLen := record.FieldU32("xl_tot_len") if xlTotLen < 4 { @@ -255,7 +256,7 @@ func decodeXLogRecords(wal *Wal, d *decode.D) { // align record posBytes2 := d.Pos() / 8 - posBytes2Aligned := int64(TypeAlign8(uint64(posBytes2))) + posBytes2Aligned := int64(common.TypeAlign8(uint64(posBytes2))) if posBytes2 < posBytes2Aligned { alignLen := (posBytes2Aligned - posBytes2) * 8 wal.state.record.FieldRawLen("align0", alignLen) @@ -315,7 +316,7 @@ func decodeXLogRecord(wal *Wal, maxBytes int64) { if isEnd(record, posMax, 64) { return } - record.FieldU64("xl_prev", XLogRecPtrMapper) + record.FieldU64("xl_prev", common.XLogRecPtrMapper) } if record.FieldGet("xl_info") == nil { diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index 7d2233976..faefce316 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -3,9 +3,9 @@ package postgres import ( "fmt" "github.com/wader/fq/format/postgres/common/pg_wal/pgproee" + "github.com/wader/fq/format/postgres/common/pg_wal/postgres" "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" @@ -78,7 +78,7 @@ func decodePGWAL(d *decode.D, in any) any { PG_FLAVOUR_PGPRO12, PG_FLAVOUR_PGPRO13, PG_FLAVOUR_PGPRO14: - return common.DecodePGWAL(d, maxOffset) + return postgres.DecodePGWAL(d, maxOffset) case PG_FLAVOUR_PGPROEE10, PG_FLAVOUR_PGPROEE11, @@ -91,5 +91,5 @@ func decodePGWAL(d *decode.D, in any) any { break } - return common.DecodePGWAL(d, maxOffset) + return postgres.DecodePGWAL(d, maxOffset) } From 069babbc0d15fbcdfeb9bdcffc4f52be6451a7e3 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 28 Oct 2022 13:42:42 +0300 Subject: [PATCH 114/141] postgres: wal refactoring --- .../postgres/common/pg_wal/pgproee/decode.go | 14 + .../postgres/common/pg_wal/pgproee/pg_wal.go | 256 +----------------- .../postgres/common/pg_wal/postgres/decode.go | 11 + .../postgres/common/pg_wal/postgres/pg_wal.go | 65 +++-- 4 files changed, 67 insertions(+), 279 deletions(-) create mode 100644 format/postgres/common/pg_wal/pgproee/decode.go create mode 100644 format/postgres/common/pg_wal/postgres/decode.go diff --git a/format/postgres/common/pg_wal/pgproee/decode.go b/format/postgres/common/pg_wal/pgproee/decode.go new file mode 100644 index 000000000..98a46cb4c --- /dev/null +++ b/format/postgres/common/pg_wal/pgproee/decode.go @@ -0,0 +1,14 @@ +package pgproee + +import ( + "github.com/wader/fq/format/postgres/common/pg_wal/postgres" + "github.com/wader/fq/pkg/decode" +) + +func DecodePGWAL(d *decode.D, maxOffset uint32) any { + wal := &postgres.Wal{ + MaxOffset: int64(maxOffset), + DecodeXLogRecord: decodeXLogRecord, + } + return postgres.Decode(d, wal) +} diff --git a/format/postgres/common/pg_wal/pgproee/pg_wal.go b/format/postgres/common/pg_wal/pgproee/pg_wal.go index 8adfa7bef..5686abf12 100644 --- a/format/postgres/common/pg_wal/pgproee/pg_wal.go +++ b/format/postgres/common/pg_wal/pgproee/pg_wal.go @@ -2,247 +2,11 @@ package pgproee import ( "github.com/wader/fq/format/postgres/common" - "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/format/postgres/common/pg_wal/postgres" ) -//nolint:revive -const ( - XLOG_BLCKSZ = 8192 - XLP_LONG_HEADER = 2 -) - -type Wal struct { - maxOffset int64 - page *walPage - - pageRecords *decode.D - - state *walState -} - -type walState struct { - record *decode.D - recordRemLenBytes int64 -} - -type walPage struct { - xlpPageAddr uint64 -} - -func DecodePGWAL(d *decode.D, maxOffset uint32) any { - pages := d.FieldArrayValue("Pages") - wal := &Wal{ - maxOffset: int64(maxOffset), - } - - for { - decodeXLogPage(wal, pages) - - if pages.End() { - break - } - - posBytes := pages.Pos() / 8 - if posBytes >= wal.maxOffset { - d.FieldRawLen("unused", d.BitsLeft()) - break - } - - remBytes := posBytes % XLOG_BLCKSZ - if remBytes != 0 { - d.Fatalf("invalid page remBytes = %d\n", remBytes) - } - } - - return nil -} - -func decodeXLogPage(wal *Wal, d *decode.D) { - pos0 := d.Pos() - d.SeekRel(8 * 8) - xlpPageAddr0 := d.U64() - d.SeekAbs(pos0) - if wal.page != nil { - xlpPageAddr1 := wal.page.xlpPageAddr + XLOG_BLCKSZ - if xlpPageAddr0 != xlpPageAddr1 { - d.Fatalf("invalid xlp_pageaddr expected = %d, actual = %d\n", xlpPageAddr1, xlpPageAddr0) - } - } - wal.page = &walPage{} - - // type = struct XLogPageHeaderData { - /* 0 | 2 */ // uint16 xlp_magic; - /* 2 | 2 */ // uint16 xlp_info; - /* 4 | 4 */ // TimeLineID xlp_tli; - /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; - /* 16 | 4 */ // uint32 xlp_rem_len; - /* XXX 4-byte padding */ - xLogPage := d.FieldStructValue("Page") - header := xLogPage.FieldStructValue("XLogPageHeaderData") - - header.FieldU16("xlp_magic") - xlpInfo := header.FieldU16("xlp_info") - header.FieldU32("xlp_tli") - wal.page.xlpPageAddr = header.FieldU64("xlp_pageaddr") - remLenBytes := header.FieldU32("xlp_rem_len") - header.FieldU32("padding0") - - //if (xlpMagic & XLOG_PAGE_MAGIC_MASK) == 0 { - // d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) - //} - - if (xlpInfo & XLP_LONG_HEADER) != 0 { - // Long header - header.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { - d.FieldU64("xlp_sysid") - d.FieldU32("xlp_seg_size") - d.FieldU32("xlp_xlog_blcksz") - }) - } - - if wal.state != nil { // check recordRemLenBytes is initialized - if wal.state.recordRemLenBytes != int64(remLenBytes) { - d.Fatalf("recordRemLenBytes = %d != remLenBytes = %d", wal.state.recordRemLenBytes, remLenBytes) - } - } - - remLenBytesAligned := int64(common.TypeAlign8(remLenBytes)) - remLen := remLenBytesAligned * 8 - - pos1 := header.Pos() - xLogPage.SeekAbs(pos1) - - // parted XLogRecord - if remLen > 0 { - if wal.state == nil { - // record of previous file - checkPosBytes := xLogPage.Pos() / 8 - if checkPosBytes >= XLOG_BLCKSZ { - d.Fatalf("invalid pos of raw_bytes_of_prev_wal_file, pos = %d\n", checkPosBytes) - } - xLogPage.FieldRawLen("raw_bytes_of_prev_wal_file", remLen) - } else { - // record of previous page - decodeXLogRecord(wal, remLenBytesAligned) - } - } - - pos2 := xLogPage.Pos() - - if wal.state != nil && wal.state.record != nil { - wal.state.record.SeekAbs(pos1) - } - - xLogPage.SeekAbs(pos2) - pageRecords := xLogPage.FieldArrayValue("Records") - - wal.pageRecords = pageRecords - - decodeXLogRecords(wal, d) -} - -func decodeXLogRecords(wal *Wal, d *decode.D) { - pageRecords := wal.pageRecords - - posBytes := d.Pos() / 8 - posMaxOfPageBytes := int64(common.TypeAlign(XLOG_BLCKSZ, uint64(posBytes))) - - for { - /* 0 | 4 */ // uint32 xl_tot_len - /* 4 | 4 */ // TransactionId xl_xid - /* 8 | 8 */ // XLogRecPtr xl_prev - /* 16 | 1 */ // uint8 xl_info - /* 17 | 1 */ // RmgrId xl_rmid - /* XXX 2-byte hole */ - /* 20 | 4 */ // pg_crc32c xl_crc - posBytes1 := d.Pos() / 8 - posBytes1Aligned := int64(common.TypeAlign8(uint64(posBytes1))) - // check aligned - this is correct - // record header is 8 byte aligned - if posBytes1Aligned >= wal.maxOffset { - d.FieldRawLen("unused", d.BitsLeft()) - break - } - - // check what we cat read xl_tot_len on this page - if posMaxOfPageBytes < posBytes1Aligned+4 { - remOnPage := posMaxOfPageBytes - posBytes1 - d.FieldRawLen("page_padding0", remOnPage*8) - // can't read xl_tot_len on this page - // can't create row in this page - // continue on next page - wal.state = nil - return - } - - if posBytes1 != posBytes1Aligned { - // ensure align - d.SeekAbs(posBytes1Aligned * 8) - } - - record := pageRecords.FieldStructValue("XLogRecord") - wal.state = &walState{ - record: record, - } - - lsn0 := uint64(d.Pos() / 8) - lsn1 := lsn0 % XLOG_BLCKSZ - lsn := lsn1 + wal.page.xlpPageAddr - record.FieldValueU("lsn", lsn, common.XLogRecPtrMapper) - - xlTotLen := record.FieldU32("xl_tot_len") - if xlTotLen < 4 { - d.Fatalf("xl_tot_len is less than 4\n") - } - xlTotLen1Bytes := xlTotLen - 4 - pos2Bytes := d.Pos() / 8 - - remOnPage := posMaxOfPageBytes - pos2Bytes - if remOnPage <= 0 { - d.Fatalf("remOnPage is negative\n") - } - - if remOnPage < int64(xlTotLen1Bytes) { - //record.FieldRawLen("xLogBody", remOnPage*8) - decodeXLogRecord(wal, remOnPage) - wal.state.recordRemLenBytes = int64(xlTotLen1Bytes) - remOnPage - break - } - - xLogBodyLen := int64(xlTotLen1Bytes) * 8 - if xLogBodyLen <= 0 { - errPos := record.Pos() / 8 - d.Fatalf("xlTotLen1Bytes is negative, xLogBodyLen = %d, pos = %X\n", xLogBodyLen, errPos) - } - - decodeXLogRecord(wal, int64(xlTotLen1Bytes)) - - // align record - posBytes2 := d.Pos() / 8 - posBytes2Aligned := int64(common.TypeAlign8(uint64(posBytes2))) - if posBytes2 < posBytes2Aligned { - alignLen := (posBytes2Aligned - posBytes2) * 8 - wal.state.record.FieldRawLen("align0", alignLen) - } - - wal.state = nil - } -} - -// check that we can read bitsCount on page (with posMax?) -func isEnd(d *decode.D, posMax int64, bitsCount int64) bool { - pos := d.Pos() - posRead := pos + bitsCount - result := posRead > posMax - if result { - // set reader at and position to continue reading - d.SeekAbs(posMax) - } - return result -} - -func decodeXLogRecord(wal *Wal, maxBytes int64) { - record := wal.state.record +func decodeXLogRecord(wal *postgres.Wal, maxBytes int64) { + record := wal.State.Record pos0 := record.Pos() maxLen := maxBytes * 8 @@ -260,49 +24,49 @@ func decodeXLogRecord(wal *Wal, maxBytes int64) { // xl_tot_len already read if record.FieldGet("hole0") == nil { - if isEnd(record, posMax, 32) { + if postgres.IsEnd(record, posMax, 32) { return } record.FieldU32("hole0") } if record.FieldGet("xl_xid") == nil { - if isEnd(record, posMax, 64) { + if postgres.IsEnd(record, posMax, 64) { return } record.FieldU64("xl_xid") } if record.FieldGet("xl_prev") == nil { - if isEnd(record, posMax, 64) { + if postgres.IsEnd(record, posMax, 64) { return } record.FieldU64("xl_prev", common.XLogRecPtrMapper) } if record.FieldGet("xl_info") == nil { - if isEnd(record, posMax, 8) { + if postgres.IsEnd(record, posMax, 8) { return } record.FieldU8("xl_info") } if record.FieldGet("xl_rmid") == nil { - if isEnd(record, posMax, 8) { + if postgres.IsEnd(record, posMax, 8) { return } record.FieldU8("xl_rmid") } if record.FieldGet("hole1") == nil { - if isEnd(record, posMax, 16) { + if postgres.IsEnd(record, posMax, 16) { return } record.FieldU16("hole1") } if record.FieldGet("xl_crc") == nil { - if isEnd(record, posMax, 32) { + if postgres.IsEnd(record, posMax, 32) { return } record.FieldU32("xl_crc") diff --git a/format/postgres/common/pg_wal/postgres/decode.go b/format/postgres/common/pg_wal/postgres/decode.go new file mode 100644 index 000000000..2fe9b96f3 --- /dev/null +++ b/format/postgres/common/pg_wal/postgres/decode.go @@ -0,0 +1,11 @@ +package postgres + +import "github.com/wader/fq/pkg/decode" + +func DecodePGWAL(d *decode.D, maxOffset uint32) any { + wal := &Wal{ + MaxOffset: int64(maxOffset), + DecodeXLogRecord: decodeXLogRecord, + } + return Decode(d, wal) +} diff --git a/format/postgres/common/pg_wal/postgres/pg_wal.go b/format/postgres/common/pg_wal/postgres/pg_wal.go index 88880be2f..5052152d1 100644 --- a/format/postgres/common/pg_wal/postgres/pg_wal.go +++ b/format/postgres/common/pg_wal/postgres/pg_wal.go @@ -49,16 +49,18 @@ const ( /* total size (bytes): 12 */ type Wal struct { - maxOffset int64 + MaxOffset int64 page *walPage pageRecords *decode.D - state *walState + State *walState + + DecodeXLogRecord func(wal *Wal, maxBytes int64) } type walState struct { - record *decode.D + Record *decode.D recordRemLenBytes int64 } @@ -66,11 +68,8 @@ type walPage struct { xlpPageAddr uint64 } -func DecodePGWAL(d *decode.D, maxOffset uint32) any { +func Decode(d *decode.D, wal *Wal) any { pages := d.FieldArrayValue("Pages") - wal := &Wal{ - maxOffset: int64(maxOffset), - } for { decodeXLogPage(wal, pages) @@ -80,7 +79,7 @@ func DecodePGWAL(d *decode.D, maxOffset uint32) any { } posBytes := pages.Pos() / 8 - if posBytes >= wal.maxOffset { + if posBytes >= wal.MaxOffset { d.FieldRawLen("unused", d.BitsLeft()) break } @@ -137,9 +136,9 @@ func decodeXLogPage(wal *Wal, d *decode.D) { }) } - if wal.state != nil { // check recordRemLenBytes is initialized - if wal.state.recordRemLenBytes != int64(remLenBytes) { - d.Fatalf("recordRemLenBytes = %d != remLenBytes = %d", wal.state.recordRemLenBytes, remLenBytes) + if wal.State != nil { // check recordRemLenBytes is initialized + if wal.State.recordRemLenBytes != int64(remLenBytes) { + d.Fatalf("recordRemLenBytes = %d != remLenBytes = %d", wal.State.recordRemLenBytes, remLenBytes) } } @@ -151,7 +150,7 @@ func decodeXLogPage(wal *Wal, d *decode.D) { // parted XLogRecord if remLen > 0 { - if wal.state == nil { + if wal.State == nil { // record of previous file checkPosBytes := xLogPage.Pos() / 8 if checkPosBytes >= XLOG_BLCKSZ { @@ -160,14 +159,14 @@ func decodeXLogPage(wal *Wal, d *decode.D) { xLogPage.FieldRawLen("raw_bytes_of_prev_wal_file", remLen) } else { // record of previous page - decodeXLogRecord(wal, remLenBytesAligned) + wal.DecodeXLogRecord(wal, remLenBytesAligned) } } pos2 := xLogPage.Pos() - if wal.state != nil && wal.state.record != nil { - wal.state.record.SeekAbs(pos1) + if wal.State != nil && wal.State.Record != nil { + wal.State.Record.SeekAbs(pos1) } xLogPage.SeekAbs(pos2) @@ -196,7 +195,7 @@ func decodeXLogRecords(wal *Wal, d *decode.D) { posBytes1Aligned := int64(common.TypeAlign8(uint64(posBytes1))) // check aligned - this is correct // record header is 8 byte aligned - if posBytes1Aligned >= wal.maxOffset { + if posBytes1Aligned >= wal.MaxOffset { d.FieldRawLen("unused", d.BitsLeft()) break } @@ -208,7 +207,7 @@ func decodeXLogRecords(wal *Wal, d *decode.D) { // can't read xl_tot_len on this page // can't create row in this page // continue on next page - wal.state = nil + wal.State = nil return } @@ -218,8 +217,8 @@ func decodeXLogRecords(wal *Wal, d *decode.D) { } record := pageRecords.FieldStructValue("XLogRecord") - wal.state = &walState{ - record: record, + wal.State = &walState{ + Record: record, } lsn0 := uint64(d.Pos() / 8) @@ -241,8 +240,8 @@ func decodeXLogRecords(wal *Wal, d *decode.D) { if remOnPage < int64(xlTotLen1Bytes) { //record.FieldRawLen("xLogBody", remOnPage*8) - decodeXLogRecord(wal, remOnPage) - wal.state.recordRemLenBytes = int64(xlTotLen1Bytes) - remOnPage + wal.DecodeXLogRecord(wal, remOnPage) + wal.State.recordRemLenBytes = int64(xlTotLen1Bytes) - remOnPage break } @@ -252,22 +251,22 @@ func decodeXLogRecords(wal *Wal, d *decode.D) { d.Fatalf("xlTotLen1Bytes is negative, xLogBodyLen = %d, pos = %X\n", xLogBodyLen, errPos) } - decodeXLogRecord(wal, int64(xlTotLen1Bytes)) + wal.DecodeXLogRecord(wal, int64(xlTotLen1Bytes)) // align record posBytes2 := d.Pos() / 8 posBytes2Aligned := int64(common.TypeAlign8(uint64(posBytes2))) if posBytes2 < posBytes2Aligned { alignLen := (posBytes2Aligned - posBytes2) * 8 - wal.state.record.FieldRawLen("align0", alignLen) + wal.State.Record.FieldRawLen("align0", alignLen) } - wal.state = nil + wal.State = nil } } -// check that we can read bitsCount on page (with posMax?) -func isEnd(d *decode.D, posMax int64, bitsCount int64) bool { +// IsEnd - check that we can read bitsCount on page (with posMax?) +func IsEnd(d *decode.D, posMax int64, bitsCount int64) bool { pos := d.Pos() posRead := pos + bitsCount result := posRead > posMax @@ -279,7 +278,7 @@ func isEnd(d *decode.D, posMax int64, bitsCount int64) bool { } func decodeXLogRecord(wal *Wal, maxBytes int64) { - record := wal.state.record + record := wal.State.Record pos0 := record.Pos() maxLen := maxBytes * 8 @@ -306,42 +305,42 @@ func decodeXLogRecord(wal *Wal, maxBytes int64) { // xl_tot_len already read if record.FieldGet("xl_xid") == nil { - if isEnd(record, posMax, 32) { + if IsEnd(record, posMax, 32) { return } record.FieldU32("xl_xid") } if record.FieldGet("xl_prev") == nil { - if isEnd(record, posMax, 64) { + if IsEnd(record, posMax, 64) { return } record.FieldU64("xl_prev", common.XLogRecPtrMapper) } if record.FieldGet("xl_info") == nil { - if isEnd(record, posMax, 8) { + if IsEnd(record, posMax, 8) { return } record.FieldU8("xl_info") } if record.FieldGet("xl_rmid") == nil { - if isEnd(record, posMax, 8) { + if IsEnd(record, posMax, 8) { return } record.FieldU8("xl_rmid") } if record.FieldGet("hole1") == nil { - if isEnd(record, posMax, 16) { + if IsEnd(record, posMax, 16) { return } record.FieldU16("hole1") } if record.FieldGet("xl_crc") == nil { - if isEnd(record, posMax, 32) { + if IsEnd(record, posMax, 32) { return } record.FieldU32("xl_crc") From 7f7f729c90cea1213b592f17ddec091a25ef85bb Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Fri, 28 Oct 2022 13:55:38 +0300 Subject: [PATCH 115/141] postgres: refactoring, tests --- .../postgres/common/pg_wal/pgproee/pg_wal.go | 6 +- .../postgres/common/pg_wal/postgres/pg_wal.go | 18 +- format/postgres/pg_wal.go | 2 + .../pgproee13/000000010000017A0000005B | Bin 0 -> 16384 bytes .../000000010000017A0000005B_1.fqtest | 808 ++++++++++++++++++ .../testdata/flavours/pgproee14/.gitignore | 1 - .../pgproee14/000000010000000600000028 | Bin 0 -> 16384 bytes .../000000010000000600000028_1.fqtest | 53 ++ ...test => 00000001000000000000004E_1.fqtest} | 91 +- .../00000001000001AE000000CD_1.fqtest | 685 ++++++++------- 10 files changed, 1262 insertions(+), 402 deletions(-) create mode 100644 format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B create mode 100644 format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee14/000000010000000600000028 create mode 100644 format/postgres/testdata/flavours/pgproee14/000000010000000600000028_1.fqtest rename format/postgres/testdata/flavours/postgres14/{00000001000000000000004E_2.fqtest => 00000001000000000000004E_1.fqtest} (57%) diff --git a/format/postgres/common/pg_wal/pgproee/pg_wal.go b/format/postgres/common/pg_wal/pgproee/pg_wal.go index 5686abf12..ec212f316 100644 --- a/format/postgres/common/pg_wal/pgproee/pg_wal.go +++ b/format/postgres/common/pg_wal/pgproee/pg_wal.go @@ -10,12 +10,12 @@ func decodeXLogRecord(wal *postgres.Wal, maxBytes int64) { pos0 := record.Pos() maxLen := maxBytes * 8 - if record.FieldGet("xLogBody0") == nil { + if record.FieldGet("xlog_body0") == nil { // body on first page - record.FieldRawLen("xLogBody0", maxLen) + record.FieldRawLen("xlog_body0", maxLen) } else { // body on second page - record.FieldRawLen("xLogBody1", maxLen) + record.FieldRawLen("xlog_body1", maxLen) } pos1 := record.Pos() posMax := pos1 diff --git a/format/postgres/common/pg_wal/postgres/pg_wal.go b/format/postgres/common/pg_wal/postgres/pg_wal.go index 5052152d1..662f0b1c8 100644 --- a/format/postgres/common/pg_wal/postgres/pg_wal.go +++ b/format/postgres/common/pg_wal/postgres/pg_wal.go @@ -69,7 +69,7 @@ type walPage struct { } func Decode(d *decode.D, wal *Wal) any { - pages := d.FieldArrayValue("Pages") + pages := d for { decodeXLogPage(wal, pages) @@ -113,8 +113,8 @@ func decodeXLogPage(wal *Wal, d *decode.D) { /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; /* 16 | 4 */ // uint32 xlp_rem_len; /* XXX 4-byte padding */ - xLogPage := d.FieldStructValue("Page") - header := xLogPage.FieldStructValue("XLogPageHeaderData") + xLogPage := d.FieldStructValue("page") + header := xLogPage.FieldStructValue("xloog_page_header_data") header.FieldU16("xlp_magic") xlpInfo := header.FieldU16("xlp_info") @@ -129,7 +129,7 @@ func decodeXLogPage(wal *Wal, d *decode.D) { if (xlpInfo & XLP_LONG_HEADER) != 0 { // Long header - header.FieldStruct("XLogLongPageHeaderData", func(d *decode.D) { + header.FieldStruct("xlog_long_page_header_data", func(d *decode.D) { d.FieldU64("xlp_sysid") d.FieldU32("xlp_seg_size") d.FieldU32("xlp_xlog_blcksz") @@ -170,7 +170,7 @@ func decodeXLogPage(wal *Wal, d *decode.D) { } xLogPage.SeekAbs(pos2) - pageRecords := xLogPage.FieldArrayValue("Records") + pageRecords := xLogPage.FieldArrayValue("records") wal.pageRecords = pageRecords @@ -216,7 +216,7 @@ func decodeXLogRecords(wal *Wal, d *decode.D) { d.SeekAbs(posBytes1Aligned * 8) } - record := pageRecords.FieldStructValue("XLogRecord") + record := pageRecords.FieldStructValue("xlog_record") wal.State = &walState{ Record: record, } @@ -282,12 +282,12 @@ func decodeXLogRecord(wal *Wal, maxBytes int64) { pos0 := record.Pos() maxLen := maxBytes * 8 - if record.FieldGet("xLogBody0") == nil { + if record.FieldGet("xlog_body0") == nil { // body on first page - record.FieldRawLen("xLogBody0", maxLen) + record.FieldRawLen("xlog_body0", maxLen) } else { // body on second page - record.FieldRawLen("xLogBody1", maxLen) + record.FieldRawLen("xlog_body1", maxLen) } pos1 := record.Pos() posMax := pos1 diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index faefce316..54f354f2d 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -24,6 +24,8 @@ func init() { Flavour: PG_FLAVOUR_POSTGRES14, Lsn: "", }, + RootArray: true, + RootName: "pages", }) } diff --git a/format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B b/format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B new file mode 100644 index 0000000000000000000000000000000000000000..81143e4928af8a3dbc42bef51b1e251d83a6cb65 GIT binary patch literal 16384 zcmeI(e@xV69KiACNDmT=BLXrQUP1^W@k0m%vb$k+?0!IMYMOydiefIFWj|zVUa=Yt zOj`ZHDh;umtMq;K-+}pw z|2POf#sBirVss@wa&P^*oack475JzLV?M@qv`m0L?qoh{-S|SW_Mu(^yiwXmkI|L* zn28%a!}CGY3Vbv!VLpyWb&Y^NQcWK}HoNirziJG_Al# zhn4wg+dgv<^s(CXG1cY9?djTwdI|7GX&+NYSK{Mvb=nU+A2hAN$3O)0FI-AhfirA z>LtJ%rF~>aG9Rz{Wr?$$J8IwKkM|r8C{8w+Kywb zJRdZzz{kJ}=Hqnj@_#@d*`^Qw?;d=uUHgD*s-H^xu-zW&N_?F7s56@9gQgYu2qZ8c z_3r*e&_@pQ5$DC5w`(8jCBPe{ePkyxAFm%hagOJMrWN>zNMb%daVF$~K5|VTtp#3u zbA$E)*Hk~9w+=52UH`X-Iwc#=A$wi7!st!TmBG=nFrFKlT;RrGd_Cm4|L$EA@bBH% znQnS^c(Gf%Q4fT(QTkkIG`bQWQ59K7cs^)afsd+H>|7a-je)Q0<}n`!y|`chT?nV9 z`mwZ+4x=ma@mcoSXLvqnT7eIL3iHvhZ%I4&b0^>QG1lhA)A9P}j(Q33Mrj`dMpxov zsOkXsbqP%?@X?maeEfE0Z4v0>ZqvtKeO~(x)L8H&bKmoK4@BjkFhn(N6c&veBHm$ z^kG}(!yoIv3xQ)U!c^KvS_bpc*Ph_u`Jib9K2Rp}vFGJ*CwP9WH+|SMeE7-F_4%;~ z6u_0zK3qmua(;Bryf@49LDLF+*t3|Ah`Ch{f9ocn)MG_AmgKcD${dquSs^l=aK zamt5tE^8m^CBPe{eGC{~iI2RlsRrKpLDLF+v=uNP+a_}^fj%~vK58!da8r-=0oPPN zmG%)Zx)LABuXUyKe9*K4AHD0DkJ{4iGSJ7prVsyhA5N;$KGaKqH%j}6C<=8YK00F) z%XmI$T7i$TV&>z_1H1nQeK<@XttsWW`62BCuBm=1?IW#(`RM*IyOQUFrWN==8<>yk aOM6m4A5POp&wb@MPM;s@A#gUDKK=!~c5CJU literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B_1.fqtest b/format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B_1.fqtest new file mode 100644 index 000000000..f8f6a610b --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B_1.fqtest @@ -0,0 +1,808 @@ +$ fq -d pg_wal "dv" 000000010000017A0000005B + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0:2]: 000000010000017A0000005B (pg_wal) 0x0-0x3fff.7 (16384) + | | | [0]{}: page 0x0-0x203f.7 (8256) + | | | xloog_page_header_data{}: 0x0-0x27.7 (40) +0x0000|06 d1 |.. | xlp_magic: 53510 0x0-0x1.7 (2) +0x0000| 07 00 | .. | xlp_info: 7 0x2-0x3.7 (2) +0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) +0x0000| 00 00 00 5b 7a 01 00 00| ...[z...| xlp_pageaddr: 1625024364544 0x8-0xf.7 (8) +0x0010|1b 00 00 00 |.... | xlp_rem_len: 27 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) + | | | xlog_long_page_header_data{}: 0x18-0x27.7 (16) +0x0010| dd 9c 64 db 3b 20 34 63| ..d.; 4c| xlp_sysid: 7148373949999783133 0x18-0x1f.7 (8) +0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) +0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) +0x0020| 00 00 00 00 00 00 00 00| ........| raw_bytes_of_prev_wal_file: raw bits 0x28-0x47.7 (32) +0x0030|00 00 00 10 10 00 00 06 e6 0b 54 02 00 00 00 00|..........T.....| +0x0040|00 00 00 00 00 00 00 00 |........ | + | | | records[0:30]: 0x48-0x203f.7 (8184) + | | | [0]{}: xlog_record 0x48-0x8f.7 (72) + | | | lsn: "17A/5B000048" (1625024364616) 0x48-NA (0) +0x0040| 47 00 00 00 | G... | xl_tot_len: 71 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| xlog_body0: raw bits 0x4c-0x8e.7 (67) +0x0050|00 00 00 00 00 00 00 00 48 fe ff 5a 7a 01 00 00|........H..Zz...| +* |until 0x8e.7 (67) | | +0x0040| 00 00 00 00| ....| xl_xid: 0 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x50-0x57.7 (8) +0x0050| 48 | H | xl_info: 72 0x58-0x58.7 (1) +0x0050| fe | . | xl_rmid: 254 0x59-0x59.7 (1) +0x0050| ff 5a | .Z | hole1: 23295 0x5a-0x5b.7 (2) +0x0050| 7a 01 00 00| z...| xl_crc: 378 0x5c-0x5f.7 (4) +0x0080| 00| .| align0: raw bits 0x8f-0x8f.7 (1) + | | | [1]{}: xlog_record 0x90-0x267.7 (472) + | | | lsn: "17A/5B000090" (1625024364688) 0x90-NA (0) +0x0090|d3 01 00 00 |.... | xl_tot_len: 467 0x90-0x93.7 (4) +0x0090| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x94-0x262.7 (463) +0x00a0|48 00 00 5b 7a 01 00 00 10 09 00 00 ab dd 07 1e|H..[z...........| +* |until 0x262.7 (463) | | +0x0090| 00 00 00 00 | .... | xl_xid: 0 0x94-0x97.7 (4) +0x0090| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|48 |H | xl_info: 72 0xa0-0xa0.7 (1) +0x00a0| 00 | . | xl_rmid: 0 0xa1-0xa1.7 (1) +0x00a0| 00 5b | .[ | hole1: 23296 0xa2-0xa3.7 (2) +0x00a0| 7a 01 00 00 | z... | xl_crc: 378 0xa4-0xa7.7 (4) +0x0260| 00 00 00 00 00 | ..... | align0: raw bits 0x263-0x267.7 (5) + | | | [2]{}: xlog_record 0x268-0x2af.7 (72) + | | | lsn: "17A/5B000268" (1625024365160) 0x268-NA (0) +0x0260| 47 00 00 00 | G... | xl_tot_len: 71 0x268-0x26b.7 (4) +0x0260| 00 00 00 00| ....| xlog_body0: raw bits 0x26c-0x2ae.7 (67) +0x0270|00 00 00 00 00 00 00 00 90 00 00 5b 7a 01 00 00|...........[z...| +* |until 0x2ae.7 (67) | | +0x0260| 00 00 00 00| ....| xl_xid: 0 0x26c-0x26f.7 (4) +0x0270|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x270-0x277.7 (8) +0x0270| 90 | . | xl_info: 144 0x278-0x278.7 (1) +0x0270| 00 | . | xl_rmid: 0 0x279-0x279.7 (1) +0x0270| 00 5b | .[ | hole1: 23296 0x27a-0x27b.7 (2) +0x0270| 7a 01 00 00| z...| xl_crc: 378 0x27c-0x27f.7 (4) +0x02a0| 00| .| align0: raw bits 0x2af-0x2af.7 (1) + | | | [3]{}: xlog_record 0x2b0-0x487.7 (472) + | | | lsn: "17A/5B0002B0" (1625024365232) 0x2b0-NA (0) +0x02b0|d3 01 00 00 |.... | xl_tot_len: 467 0x2b0-0x2b3.7 (4) +0x02b0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2b4-0x482.7 (463) +0x02c0|68 02 00 5b 7a 01 00 00 10 09 00 00 e0 58 90 e5|h..[z........X..| +* |until 0x482.7 (463) | | +0x02b0| 00 00 00 00 | .... | xl_xid: 0 0x2b4-0x2b7.7 (4) +0x02b0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x2b8-0x2bf.7 (8) +0x02c0|68 |h | xl_info: 104 0x2c0-0x2c0.7 (1) +0x02c0| 02 | . | xl_rmid: 2 0x2c1-0x2c1.7 (1) +0x02c0| 00 5b | .[ | hole1: 23296 0x2c2-0x2c3.7 (2) +0x02c0| 7a 01 00 00 | z... | xl_crc: 378 0x2c4-0x2c7.7 (4) +0x0480| 00 00 00 00 00 | ..... | align0: raw bits 0x483-0x487.7 (5) + | | | [4]{}: xlog_record 0x488-0x4cf.7 (72) + | | | lsn: "17A/5B000488" (1625024365704) 0x488-NA (0) +0x0480| 47 00 00 00 | G... | xl_tot_len: 71 0x488-0x48b.7 (4) +0x0480| 00 00 00 00| ....| xlog_body0: raw bits 0x48c-0x4ce.7 (67) +0x0490|00 00 00 00 00 00 00 00 b0 02 00 5b 7a 01 00 00|...........[z...| +* |until 0x4ce.7 (67) | | +0x0480| 00 00 00 00| ....| xl_xid: 0 0x48c-0x48f.7 (4) +0x0490|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x490-0x497.7 (8) +0x0490| b0 | . | xl_info: 176 0x498-0x498.7 (1) +0x0490| 02 | . | xl_rmid: 2 0x499-0x499.7 (1) +0x0490| 00 5b | .[ | hole1: 23296 0x49a-0x49b.7 (2) +0x0490| 7a 01 00 00| z...| xl_crc: 378 0x49c-0x49f.7 (4) +0x04c0| 00| .| align0: raw bits 0x4cf-0x4cf.7 (1) + | | | [5]{}: xlog_record 0x4d0-0x6a7.7 (472) + | | | lsn: "17A/5B0004D0" (1625024365776) 0x4d0-NA (0) +0x04d0|d3 01 00 00 |.... | xl_tot_len: 467 0x4d0-0x4d3.7 (4) +0x04d0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x4d4-0x6a2.7 (463) +0x04e0|88 04 00 5b 7a 01 00 00 10 09 00 00 aa 0f ad db|...[z...........| +* |until 0x6a2.7 (463) | | +0x04d0| 00 00 00 00 | .... | xl_xid: 0 0x4d4-0x4d7.7 (4) +0x04d0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x4d8-0x4df.7 (8) +0x04e0|88 |. | xl_info: 136 0x4e0-0x4e0.7 (1) +0x04e0| 04 | . | xl_rmid: 4 0x4e1-0x4e1.7 (1) +0x04e0| 00 5b | .[ | hole1: 23296 0x4e2-0x4e3.7 (2) +0x04e0| 7a 01 00 00 | z... | xl_crc: 378 0x4e4-0x4e7.7 (4) +0x06a0| 00 00 00 00 00 | ..... | align0: raw bits 0x6a3-0x6a7.7 (5) + | | | [6]{}: xlog_record 0x6a8-0x6ef.7 (72) + | | | lsn: "17A/5B0006A8" (1625024366248) 0x6a8-NA (0) +0x06a0| 47 00 00 00 | G... | xl_tot_len: 71 0x6a8-0x6ab.7 (4) +0x06a0| 00 00 00 00| ....| xlog_body0: raw bits 0x6ac-0x6ee.7 (67) +0x06b0|00 00 00 00 00 00 00 00 d0 04 00 5b 7a 01 00 00|...........[z...| +* |until 0x6ee.7 (67) | | +0x06a0| 00 00 00 00| ....| xl_xid: 0 0x6ac-0x6af.7 (4) +0x06b0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x6b0-0x6b7.7 (8) +0x06b0| d0 | . | xl_info: 208 0x6b8-0x6b8.7 (1) +0x06b0| 04 | . | xl_rmid: 4 0x6b9-0x6b9.7 (1) +0x06b0| 00 5b | .[ | hole1: 23296 0x6ba-0x6bb.7 (2) +0x06b0| 7a 01 00 00| z...| xl_crc: 378 0x6bc-0x6bf.7 (4) +0x06e0| 00| .| align0: raw bits 0x6ef-0x6ef.7 (1) + | | | [7]{}: xlog_record 0x6f0-0x8c7.7 (472) + | | | lsn: "17A/5B0006F0" (1625024366320) 0x6f0-NA (0) +0x06f0|d3 01 00 00 |.... | xl_tot_len: 467 0x6f0-0x6f3.7 (4) +0x06f0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x6f4-0x8c2.7 (463) +0x0700|a8 06 00 5b 7a 01 00 00 10 09 00 00 a0 57 f6 dc|...[z........W..| +* |until 0x8c2.7 (463) | | +0x06f0| 00 00 00 00 | .... | xl_xid: 0 0x6f4-0x6f7.7 (4) +0x06f0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x6f8-0x6ff.7 (8) +0x0700|a8 |. | xl_info: 168 0x700-0x700.7 (1) +0x0700| 06 | . | xl_rmid: 6 0x701-0x701.7 (1) +0x0700| 00 5b | .[ | hole1: 23296 0x702-0x703.7 (2) +0x0700| 7a 01 00 00 | z... | xl_crc: 378 0x704-0x707.7 (4) +0x08c0| 00 00 00 00 00 | ..... | align0: raw bits 0x8c3-0x8c7.7 (5) + | | | [8]{}: xlog_record 0x8c8-0x90f.7 (72) + | | | lsn: "17A/5B0008C8" (1625024366792) 0x8c8-NA (0) +0x08c0| 47 00 00 00 | G... | xl_tot_len: 71 0x8c8-0x8cb.7 (4) +0x08c0| 00 00 00 00| ....| xlog_body0: raw bits 0x8cc-0x90e.7 (67) +0x08d0|00 00 00 00 00 00 00 00 f0 06 00 5b 7a 01 00 00|...........[z...| +* |until 0x90e.7 (67) | | +0x08c0| 00 00 00 00| ....| xl_xid: 0 0x8cc-0x8cf.7 (4) +0x08d0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x8d0-0x8d7.7 (8) +0x08d0| f0 | . | xl_info: 240 0x8d8-0x8d8.7 (1) +0x08d0| 06 | . | xl_rmid: 6 0x8d9-0x8d9.7 (1) +0x08d0| 00 5b | .[ | hole1: 23296 0x8da-0x8db.7 (2) +0x08d0| 7a 01 00 00| z...| xl_crc: 378 0x8dc-0x8df.7 (4) +0x0900| 00| .| align0: raw bits 0x90f-0x90f.7 (1) + | | | [9]{}: xlog_record 0x910-0xae7.7 (472) + | | | lsn: "17A/5B000910" (1625024366864) 0x910-NA (0) +0x0910|d3 01 00 00 |.... | xl_tot_len: 467 0x910-0x913.7 (4) +0x0910| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x914-0xae2.7 (463) +0x0920|c8 08 00 5b 7a 01 00 00 10 09 00 00 e7 43 d5 13|...[z........C..| +* |until 0xae2.7 (463) | | +0x0910| 00 00 00 00 | .... | xl_xid: 0 0x914-0x917.7 (4) +0x0910| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x918-0x91f.7 (8) +0x0920|c8 |. | xl_info: 200 0x920-0x920.7 (1) +0x0920| 08 | . | xl_rmid: 8 0x921-0x921.7 (1) +0x0920| 00 5b | .[ | hole1: 23296 0x922-0x923.7 (2) +0x0920| 7a 01 00 00 | z... | xl_crc: 378 0x924-0x927.7 (4) +0x0ae0| 00 00 00 00 00 | ..... | align0: raw bits 0xae3-0xae7.7 (5) + | | | [10]{}: xlog_record 0xae8-0xb2f.7 (72) + | | | lsn: "17A/5B000AE8" (1625024367336) 0xae8-NA (0) +0x0ae0| 47 00 00 00 | G... | xl_tot_len: 71 0xae8-0xaeb.7 (4) +0x0ae0| 00 00 00 00| ....| xlog_body0: raw bits 0xaec-0xb2e.7 (67) +0x0af0|00 00 00 00 00 00 00 00 10 09 00 5b 7a 01 00 00|...........[z...| +* |until 0xb2e.7 (67) | | +0x0ae0| 00 00 00 00| ....| xl_xid: 0 0xaec-0xaef.7 (4) +0x0af0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0xaf0-0xaf7.7 (8) +0x0af0| 10 | . | xl_info: 16 0xaf8-0xaf8.7 (1) +0x0af0| 09 | . | xl_rmid: 9 0xaf9-0xaf9.7 (1) +0x0af0| 00 5b | .[ | hole1: 23296 0xafa-0xafb.7 (2) +0x0af0| 7a 01 00 00| z...| xl_crc: 378 0xafc-0xaff.7 (4) +0x0b20| 00| .| align0: raw bits 0xb2f-0xb2f.7 (1) + | | | [11]{}: xlog_record 0xb30-0xd07.7 (472) + | | | lsn: "17A/5B000B30" (1625024367408) 0xb30-NA (0) +0x0b30|d3 01 00 00 |.... | xl_tot_len: 467 0xb30-0xb33.7 (4) +0x0b30| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0xb34-0xd02.7 (463) +0x0b40|e8 0a 00 5b 7a 01 00 00 10 09 00 00 bd 81 7a f5|...[z.........z.| +* |until 0xd02.7 (463) | | +0x0b30| 00 00 00 00 | .... | xl_xid: 0 0xb34-0xb37.7 (4) +0x0b30| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0xb38-0xb3f.7 (8) +0x0b40|e8 |. | xl_info: 232 0xb40-0xb40.7 (1) +0x0b40| 0a | . | xl_rmid: 10 0xb41-0xb41.7 (1) +0x0b40| 00 5b | .[ | hole1: 23296 0xb42-0xb43.7 (2) +0x0b40| 7a 01 00 00 | z... | xl_crc: 378 0xb44-0xb47.7 (4) +0x0d00| 00 00 00 00 00 | ..... | align0: raw bits 0xd03-0xd07.7 (5) + | | | [12]{}: xlog_record 0xd08-0xd4f.7 (72) + | | | lsn: "17A/5B000D08" (1625024367880) 0xd08-NA (0) +0x0d00| 47 00 00 00 | G... | xl_tot_len: 71 0xd08-0xd0b.7 (4) +0x0d00| 00 00 00 00| ....| xlog_body0: raw bits 0xd0c-0xd4e.7 (67) +0x0d10|00 00 00 00 00 00 00 00 30 0b 00 5b 7a 01 00 00|........0..[z...| +* |until 0xd4e.7 (67) | | +0x0d00| 00 00 00 00| ....| xl_xid: 0 0xd0c-0xd0f.7 (4) +0x0d10|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0xd10-0xd17.7 (8) +0x0d10| 30 | 0 | xl_info: 48 0xd18-0xd18.7 (1) +0x0d10| 0b | . | xl_rmid: 11 0xd19-0xd19.7 (1) +0x0d10| 00 5b | .[ | hole1: 23296 0xd1a-0xd1b.7 (2) +0x0d10| 7a 01 00 00| z...| xl_crc: 378 0xd1c-0xd1f.7 (4) +0x0d40| 00| .| align0: raw bits 0xd4f-0xd4f.7 (1) + | | | [13]{}: xlog_record 0xd50-0xf27.7 (472) + | | | lsn: "17A/5B000D50" (1625024367952) 0xd50-NA (0) +0x0d50|d3 01 00 00 |.... | xl_tot_len: 467 0xd50-0xd53.7 (4) +0x0d50| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0xd54-0xf22.7 (463) +0x0d60|08 0d 00 5b 7a 01 00 00 10 09 00 00 70 ee 41 ca|...[z.......p.A.| +* |until 0xf22.7 (463) | | +0x0d50| 00 00 00 00 | .... | xl_xid: 0 0xd54-0xd57.7 (4) +0x0d50| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0xd58-0xd5f.7 (8) +0x0d60|08 |. | xl_info: 8 0xd60-0xd60.7 (1) +0x0d60| 0d | . | xl_rmid: 13 0xd61-0xd61.7 (1) +0x0d60| 00 5b | .[ | hole1: 23296 0xd62-0xd63.7 (2) +0x0d60| 7a 01 00 00 | z... | xl_crc: 378 0xd64-0xd67.7 (4) +0x0f20| 00 00 00 00 00 | ..... | align0: raw bits 0xf23-0xf27.7 (5) + | | | [14]{}: xlog_record 0xf28-0xf6f.7 (72) + | | | lsn: "17A/5B000F28" (1625024368424) 0xf28-NA (0) +0x0f20| 47 00 00 00 | G... | xl_tot_len: 71 0xf28-0xf2b.7 (4) +0x0f20| 00 00 00 00| ....| xlog_body0: raw bits 0xf2c-0xf6e.7 (67) +0x0f30|00 00 00 00 00 00 00 00 50 0d 00 5b 7a 01 00 00|........P..[z...| +* |until 0xf6e.7 (67) | | +0x0f20| 00 00 00 00| ....| xl_xid: 0 0xf2c-0xf2f.7 (4) +0x0f30|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0xf30-0xf37.7 (8) +0x0f30| 50 | P | xl_info: 80 0xf38-0xf38.7 (1) +0x0f30| 0d | . | xl_rmid: 13 0xf39-0xf39.7 (1) +0x0f30| 00 5b | .[ | hole1: 23296 0xf3a-0xf3b.7 (2) +0x0f30| 7a 01 00 00| z...| xl_crc: 378 0xf3c-0xf3f.7 (4) +0x0f60| 00| .| align0: raw bits 0xf6f-0xf6f.7 (1) + | | | [15]{}: xlog_record 0xf70-0x1147.7 (472) + | | | lsn: "17A/5B000F70" (1625024368496) 0xf70-NA (0) +0x0f70|d3 01 00 00 |.... | xl_tot_len: 467 0xf70-0xf73.7 (4) +0x0f70| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0xf74-0x1142.7 (463) +0x0f80|28 0f 00 5b 7a 01 00 00 10 09 00 00 54 35 cb 17|(..[z.......T5..| +* |until 0x1142.7 (463) | | +0x0f70| 00 00 00 00 | .... | xl_xid: 0 0xf74-0xf77.7 (4) +0x0f70| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0xf78-0xf7f.7 (8) +0x0f80|28 |( | xl_info: 40 0xf80-0xf80.7 (1) +0x0f80| 0f | . | xl_rmid: 15 0xf81-0xf81.7 (1) +0x0f80| 00 5b | .[ | hole1: 23296 0xf82-0xf83.7 (2) +0x0f80| 7a 01 00 00 | z... | xl_crc: 378 0xf84-0xf87.7 (4) +0x1140| 00 00 00 00 00 | ..... | align0: raw bits 0x1143-0x1147.7 (5) + | | | [16]{}: xlog_record 0x1148-0x118f.7 (72) + | | | lsn: "17A/5B001148" (1625024368968) 0x1148-NA (0) +0x1140| 47 00 00 00 | G... | xl_tot_len: 71 0x1148-0x114b.7 (4) +0x1140| 00 00 00 00| ....| xlog_body0: raw bits 0x114c-0x118e.7 (67) +0x1150|00 00 00 00 00 00 00 00 70 0f 00 5b 7a 01 00 00|........p..[z...| +* |until 0x118e.7 (67) | | +0x1140| 00 00 00 00| ....| xl_xid: 0 0x114c-0x114f.7 (4) +0x1150|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x1150-0x1157.7 (8) +0x1150| 70 | p | xl_info: 112 0x1158-0x1158.7 (1) +0x1150| 0f | . | xl_rmid: 15 0x1159-0x1159.7 (1) +0x1150| 00 5b | .[ | hole1: 23296 0x115a-0x115b.7 (2) +0x1150| 7a 01 00 00| z...| xl_crc: 378 0x115c-0x115f.7 (4) +0x1180| 00| .| align0: raw bits 0x118f-0x118f.7 (1) + | | | [17]{}: xlog_record 0x1190-0x1367.7 (472) + | | | lsn: "17A/5B001190" (1625024369040) 0x1190-NA (0) +0x1190|d3 01 00 00 |.... | xl_tot_len: 467 0x1190-0x1193.7 (4) +0x1190| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x1194-0x1362.7 (463) +0x11a0|48 11 00 5b 7a 01 00 00 10 09 00 00 23 8b f5 f9|H..[z.......#...| +* |until 0x1362.7 (463) | | +0x1190| 00 00 00 00 | .... | xl_xid: 0 0x1194-0x1197.7 (4) +0x1190| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x1198-0x119f.7 (8) +0x11a0|48 |H | xl_info: 72 0x11a0-0x11a0.7 (1) +0x11a0| 11 | . | xl_rmid: 17 0x11a1-0x11a1.7 (1) +0x11a0| 00 5b | .[ | hole1: 23296 0x11a2-0x11a3.7 (2) +0x11a0| 7a 01 00 00 | z... | xl_crc: 378 0x11a4-0x11a7.7 (4) +0x1360| 00 00 00 00 00 | ..... | align0: raw bits 0x1363-0x1367.7 (5) + | | | [18]{}: xlog_record 0x1368-0x13af.7 (72) + | | | lsn: "17A/5B001368" (1625024369512) 0x1368-NA (0) +0x1360| 47 00 00 00 | G... | xl_tot_len: 71 0x1368-0x136b.7 (4) +0x1360| 00 00 00 00| ....| xlog_body0: raw bits 0x136c-0x13ae.7 (67) +0x1370|00 00 00 00 00 00 00 00 90 11 00 5b 7a 01 00 00|...........[z...| +* |until 0x13ae.7 (67) | | +0x1360| 00 00 00 00| ....| xl_xid: 0 0x136c-0x136f.7 (4) +0x1370|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x1370-0x1377.7 (8) +0x1370| 90 | . | xl_info: 144 0x1378-0x1378.7 (1) +0x1370| 11 | . | xl_rmid: 17 0x1379-0x1379.7 (1) +0x1370| 00 5b | .[ | hole1: 23296 0x137a-0x137b.7 (2) +0x1370| 7a 01 00 00| z...| xl_crc: 378 0x137c-0x137f.7 (4) +0x13a0| 00| .| align0: raw bits 0x13af-0x13af.7 (1) + | | | [19]{}: xlog_record 0x13b0-0x1587.7 (472) + | | | lsn: "17A/5B0013B0" (1625024369584) 0x13b0-NA (0) +0x13b0|d3 01 00 00 |.... | xl_tot_len: 467 0x13b0-0x13b3.7 (4) +0x13b0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x13b4-0x1582.7 (463) +0x13c0|68 13 00 5b 7a 01 00 00 10 09 00 00 00 48 46 5e|h..[z........HF^| +* |until 0x1582.7 (463) | | +0x13b0| 00 00 00 00 | .... | xl_xid: 0 0x13b4-0x13b7.7 (4) +0x13b0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x13b8-0x13bf.7 (8) +0x13c0|68 |h | xl_info: 104 0x13c0-0x13c0.7 (1) +0x13c0| 13 | . | xl_rmid: 19 0x13c1-0x13c1.7 (1) +0x13c0| 00 5b | .[ | hole1: 23296 0x13c2-0x13c3.7 (2) +0x13c0| 7a 01 00 00 | z... | xl_crc: 378 0x13c4-0x13c7.7 (4) +0x1580| 00 00 00 00 00 | ..... | align0: raw bits 0x1583-0x1587.7 (5) + | | | [20]{}: xlog_record 0x1588-0x15cf.7 (72) + | | | lsn: "17A/5B001588" (1625024370056) 0x1588-NA (0) +0x1580| 47 00 00 00 | G... | xl_tot_len: 71 0x1588-0x158b.7 (4) +0x1580| 00 00 00 00| ....| xlog_body0: raw bits 0x158c-0x15ce.7 (67) +0x1590|00 00 00 00 00 00 00 00 b0 13 00 5b 7a 01 00 00|...........[z...| +* |until 0x15ce.7 (67) | | +0x1580| 00 00 00 00| ....| xl_xid: 0 0x158c-0x158f.7 (4) +0x1590|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x1590-0x1597.7 (8) +0x1590| b0 | . | xl_info: 176 0x1598-0x1598.7 (1) +0x1590| 13 | . | xl_rmid: 19 0x1599-0x1599.7 (1) +0x1590| 00 5b | .[ | hole1: 23296 0x159a-0x159b.7 (2) +0x1590| 7a 01 00 00| z...| xl_crc: 378 0x159c-0x159f.7 (4) +0x15c0| 00| .| align0: raw bits 0x15cf-0x15cf.7 (1) + | | | [21]{}: xlog_record 0x15d0-0x17a7.7 (472) + | | | lsn: "17A/5B0015D0" (1625024370128) 0x15d0-NA (0) +0x15d0|d3 01 00 00 |.... | xl_tot_len: 467 0x15d0-0x15d3.7 (4) +0x15d0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x15d4-0x17a2.7 (463) +0x15e0|88 15 00 5b 7a 01 00 00 10 09 00 00 56 c6 0f b8|...[z.......V...| +* |until 0x17a2.7 (463) | | +0x15d0| 00 00 00 00 | .... | xl_xid: 0 0x15d4-0x15d7.7 (4) +0x15d0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x15d8-0x15df.7 (8) +0x15e0|88 |. | xl_info: 136 0x15e0-0x15e0.7 (1) +0x15e0| 15 | . | xl_rmid: 21 0x15e1-0x15e1.7 (1) +0x15e0| 00 5b | .[ | hole1: 23296 0x15e2-0x15e3.7 (2) +0x15e0| 7a 01 00 00 | z... | xl_crc: 378 0x15e4-0x15e7.7 (4) +0x17a0| 00 00 00 00 00 | ..... | align0: raw bits 0x17a3-0x17a7.7 (5) + | | | [22]{}: xlog_record 0x17a8-0x17ef.7 (72) + | | | lsn: "17A/5B0017A8" (1625024370600) 0x17a8-NA (0) +0x17a0| 47 00 00 00 | G... | xl_tot_len: 71 0x17a8-0x17ab.7 (4) +0x17a0| 00 00 00 00| ....| xlog_body0: raw bits 0x17ac-0x17ee.7 (67) +0x17b0|00 00 00 00 00 00 00 00 d0 15 00 5b 7a 01 00 00|...........[z...| +* |until 0x17ee.7 (67) | | +0x17a0| 00 00 00 00| ....| xl_xid: 0 0x17ac-0x17af.7 (4) +0x17b0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x17b0-0x17b7.7 (8) +0x17b0| d0 | . | xl_info: 208 0x17b8-0x17b8.7 (1) +0x17b0| 15 | . | xl_rmid: 21 0x17b9-0x17b9.7 (1) +0x17b0| 00 5b | .[ | hole1: 23296 0x17ba-0x17bb.7 (2) +0x17b0| 7a 01 00 00| z...| xl_crc: 378 0x17bc-0x17bf.7 (4) +0x17e0| 00| .| align0: raw bits 0x17ef-0x17ef.7 (1) + | | | [23]{}: xlog_record 0x17f0-0x19c7.7 (472) + | | | lsn: "17A/5B0017F0" (1625024370672) 0x17f0-NA (0) +0x17f0|d3 01 00 00 |.... | xl_tot_len: 467 0x17f0-0x17f3.7 (4) +0x17f0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x17f4-0x19c2.7 (463) +0x1800|a8 17 00 5b 7a 01 00 00 10 09 00 00 c2 64 46 9e|...[z........dF.| +* |until 0x19c2.7 (463) | | +0x17f0| 00 00 00 00 | .... | xl_xid: 0 0x17f4-0x17f7.7 (4) +0x17f0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x17f8-0x17ff.7 (8) +0x1800|a8 |. | xl_info: 168 0x1800-0x1800.7 (1) +0x1800| 17 | . | xl_rmid: 23 0x1801-0x1801.7 (1) +0x1800| 00 5b | .[ | hole1: 23296 0x1802-0x1803.7 (2) +0x1800| 7a 01 00 00 | z... | xl_crc: 378 0x1804-0x1807.7 (4) +0x19c0| 00 00 00 00 00 | ..... | align0: raw bits 0x19c3-0x19c7.7 (5) + | | | [24]{}: xlog_record 0x19c8-0x1a0f.7 (72) + | | | lsn: "17A/5B0019C8" (1625024371144) 0x19c8-NA (0) +0x19c0| 47 00 00 00 | G... | xl_tot_len: 71 0x19c8-0x19cb.7 (4) +0x19c0| 00 00 00 00| ....| xlog_body0: raw bits 0x19cc-0x1a0e.7 (67) +0x19d0|00 00 00 00 00 00 00 00 f0 17 00 5b 7a 01 00 00|...........[z...| +* |until 0x1a0e.7 (67) | | +0x19c0| 00 00 00 00| ....| xl_xid: 0 0x19cc-0x19cf.7 (4) +0x19d0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x19d0-0x19d7.7 (8) +0x19d0| f0 | . | xl_info: 240 0x19d8-0x19d8.7 (1) +0x19d0| 17 | . | xl_rmid: 23 0x19d9-0x19d9.7 (1) +0x19d0| 00 5b | .[ | hole1: 23296 0x19da-0x19db.7 (2) +0x19d0| 7a 01 00 00| z...| xl_crc: 378 0x19dc-0x19df.7 (4) +0x1a00| 00| .| align0: raw bits 0x1a0f-0x1a0f.7 (1) + | | | [25]{}: xlog_record 0x1a10-0x1be7.7 (472) + | | | lsn: "17A/5B001A10" (1625024371216) 0x1a10-NA (0) +0x1a10|d3 01 00 00 |.... | xl_tot_len: 467 0x1a10-0x1a13.7 (4) +0x1a10| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x1a14-0x1be2.7 (463) +0x1a20|c8 19 00 5b 7a 01 00 00 10 09 00 00 bd 6b 0c fc|...[z........k..| +* |until 0x1be2.7 (463) | | +0x1a10| 00 00 00 00 | .... | xl_xid: 0 0x1a14-0x1a17.7 (4) +0x1a10| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x1a18-0x1a1f.7 (8) +0x1a20|c8 |. | xl_info: 200 0x1a20-0x1a20.7 (1) +0x1a20| 19 | . | xl_rmid: 25 0x1a21-0x1a21.7 (1) +0x1a20| 00 5b | .[ | hole1: 23296 0x1a22-0x1a23.7 (2) +0x1a20| 7a 01 00 00 | z... | xl_crc: 378 0x1a24-0x1a27.7 (4) +0x1be0| 00 00 00 00 00 | ..... | align0: raw bits 0x1be3-0x1be7.7 (5) + | | | [26]{}: xlog_record 0x1be8-0x1c2f.7 (72) + | | | lsn: "17A/5B001BE8" (1625024371688) 0x1be8-NA (0) +0x1be0| 47 00 00 00 | G... | xl_tot_len: 71 0x1be8-0x1beb.7 (4) +0x1be0| 00 00 00 00| ....| xlog_body0: raw bits 0x1bec-0x1c2e.7 (67) +0x1bf0|00 00 00 00 00 00 00 00 10 1a 00 5b 7a 01 00 00|...........[z...| +* |until 0x1c2e.7 (67) | | +0x1be0| 00 00 00 00| ....| xl_xid: 0 0x1bec-0x1bef.7 (4) +0x1bf0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x1bf0-0x1bf7.7 (8) +0x1bf0| 10 | . | xl_info: 16 0x1bf8-0x1bf8.7 (1) +0x1bf0| 1a | . | xl_rmid: 26 0x1bf9-0x1bf9.7 (1) +0x1bf0| 00 5b | .[ | hole1: 23296 0x1bfa-0x1bfb.7 (2) +0x1bf0| 7a 01 00 00| z...| xl_crc: 378 0x1bfc-0x1bff.7 (4) +0x1c20| 00| .| align0: raw bits 0x1c2f-0x1c2f.7 (1) + | | | [27]{}: xlog_record 0x1c30-0x1e07.7 (472) + | | | lsn: "17A/5B001C30" (1625024371760) 0x1c30-NA (0) +0x1c30|d3 01 00 00 |.... | xl_tot_len: 467 0x1c30-0x1c33.7 (4) +0x1c30| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x1c34-0x1e02.7 (463) +0x1c40|e8 1b 00 5b 7a 01 00 00 10 09 00 00 7a 4b c5 1c|...[z.......zK..| +* |until 0x1e02.7 (463) | | +0x1c30| 00 00 00 00 | .... | xl_xid: 0 0x1c34-0x1c37.7 (4) +0x1c30| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x1c38-0x1c3f.7 (8) +0x1c40|e8 |. | xl_info: 232 0x1c40-0x1c40.7 (1) +0x1c40| 1b | . | xl_rmid: 27 0x1c41-0x1c41.7 (1) +0x1c40| 00 5b | .[ | hole1: 23296 0x1c42-0x1c43.7 (2) +0x1c40| 7a 01 00 00 | z... | xl_crc: 378 0x1c44-0x1c47.7 (4) +0x1e00| 00 00 00 00 00 | ..... | align0: raw bits 0x1e03-0x1e07.7 (5) + | | | [28]{}: xlog_record 0x1e08-0x1e4f.7 (72) + | | | lsn: "17A/5B001E08" (1625024372232) 0x1e08-NA (0) +0x1e00| 47 00 00 00 | G... | xl_tot_len: 71 0x1e08-0x1e0b.7 (4) +0x1e00| 00 00 00 00| ....| xlog_body0: raw bits 0x1e0c-0x1e4e.7 (67) +0x1e10|00 00 00 00 00 00 00 00 30 1c 00 5b 7a 01 00 00|........0..[z...| +* |until 0x1e4e.7 (67) | | +0x1e00| 00 00 00 00| ....| xl_xid: 0 0x1e0c-0x1e0f.7 (4) +0x1e10|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x1e10-0x1e17.7 (8) +0x1e10| 30 | 0 | xl_info: 48 0x1e18-0x1e18.7 (1) +0x1e10| 1c | . | xl_rmid: 28 0x1e19-0x1e19.7 (1) +0x1e10| 00 5b | .[ | hole1: 23296 0x1e1a-0x1e1b.7 (2) +0x1e10| 7a 01 00 00| z...| xl_crc: 378 0x1e1c-0x1e1f.7 (4) +0x1e40| 00| .| align0: raw bits 0x1e4f-0x1e4f.7 (1) + | | | [29]{}: xlog_record 0x1e50-0x203f.7 (496) + | | | lsn: "17A/5B001E50" (1625024372304) 0x1e50-NA (0) +0x1e50|d3 01 00 00 |.... | xl_tot_len: 467 0x1e50-0x1e53.7 (4) +0x1e50| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x1e54-0x1fff.7 (428) +0x1e60|08 1e 00 5b 7a 01 00 00 10 09 00 00 b7 41 1b 32|...[z........A.2| +* |until 0x1fff.7 (428) | | +0x1e50| 00 00 00 00 | .... | xl_xid: 0 0x1e54-0x1e57.7 (4) +0x1e50| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x1e58-0x1e5f.7 (8) +0x1e60|08 |. | xl_info: 8 0x1e60-0x1e60.7 (1) +0x1e60| 1e | . | xl_rmid: 30 0x1e61-0x1e61.7 (1) +0x1e60| 00 5b | .[ | hole1: 23296 0x1e62-0x1e63.7 (2) +0x1e60| 7a 01 00 00 | z... | xl_crc: 378 0x1e64-0x1e67.7 (4) +0x2010| e5 0b 54 02 00 00 00 00| ..T.....| xlog_body1: raw bits 0x2018-0x203f.7 (40) +0x2020|00 00 00 00 00 00 00 00 00 00 00 10 10 00 00 06|................| +0x2030|e6 0b 54 02 00 00 00 00 00 00 00 00 00 00 00 00|..T.............| + | | | [1]{}: page 0x2000-0x3fff.7 (8192) + | | | xloog_page_header_data{}: 0x2000-0x2017.7 (24) +0x2000|06 d1 |.. | xlp_magic: 53510 0x2000-0x2001.7 (2) +0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) +0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) +0x2000| 00 20 00 5b 7a 01 00 00| . .[z...| xlp_pageaddr: 1625024372736 0x2008-0x200f.7 (8) +0x2010|23 00 00 00 |#... | xlp_rem_len: 35 0x2010-0x2013.7 (4) +0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) + | | | records[0:30]: 0x2040-0x3fff.7 (8128) + | | | [0]{}: xlog_record 0x2040-0x2087.7 (72) + | | | lsn: "17A/5B002040" (1625024372800) 0x2040-NA (0) +0x2040|47 00 00 00 |G... | xl_tot_len: 71 0x2040-0x2043.7 (4) +0x2040| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2044-0x2086.7 (67) +0x2050|50 1e 00 5b 7a 01 00 00 40 09 00 00 ca dd 49 02|P..[z...@.....I.| +* |until 0x2086.7 (67) | | +0x2040| 00 00 00 00 | .... | xl_xid: 0 0x2044-0x2047.7 (4) +0x2040| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x2048-0x204f.7 (8) +0x2050|50 |P | xl_info: 80 0x2050-0x2050.7 (1) +0x2050| 1e | . | xl_rmid: 30 0x2051-0x2051.7 (1) +0x2050| 00 5b | .[ | hole1: 23296 0x2052-0x2053.7 (2) +0x2050| 7a 01 00 00 | z... | xl_crc: 378 0x2054-0x2057.7 (4) +0x2080| 00 | . | align0: raw bits 0x2087-0x2087.7 (1) + | | | [1]{}: xlog_record 0x2088-0x225f.7 (472) + | | | lsn: "17A/5B002088" (1625024372872) 0x2088-NA (0) +0x2080| d3 01 00 00 | .... | xl_tot_len: 467 0x2088-0x208b.7 (4) +0x2080| 00 00 00 00| ....| xlog_body0: raw bits 0x208c-0x225a.7 (463) +0x2090|00 00 00 00 00 00 00 00 40 20 00 5b 7a 01 00 00|........@ .[z...| +* |until 0x225a.7 (463) | | +0x2080| 00 00 00 00| ....| xl_xid: 0 0x208c-0x208f.7 (4) +0x2090|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x2090-0x2097.7 (8) +0x2090| 40 | @ | xl_info: 64 0x2098-0x2098.7 (1) +0x2090| 20 | | xl_rmid: 32 0x2099-0x2099.7 (1) +0x2090| 00 5b | .[ | hole1: 23296 0x209a-0x209b.7 (2) +0x2090| 7a 01 00 00| z...| xl_crc: 378 0x209c-0x209f.7 (4) +0x2250| 00 00 00 00 00| .....| align0: raw bits 0x225b-0x225f.7 (5) + | | | [2]{}: xlog_record 0x2260-0x22a7.7 (72) + | | | lsn: "17A/5B002260" (1625024373344) 0x2260-NA (0) +0x2260|47 00 00 00 |G... | xl_tot_len: 71 0x2260-0x2263.7 (4) +0x2260| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2264-0x22a6.7 (67) +0x2270|88 20 00 5b 7a 01 00 00 40 09 00 00 0f 50 2f 9d|. .[z...@....P/.| +* |until 0x22a6.7 (67) | | +0x2260| 00 00 00 00 | .... | xl_xid: 0 0x2264-0x2267.7 (4) +0x2260| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x2268-0x226f.7 (8) +0x2270|88 |. | xl_info: 136 0x2270-0x2270.7 (1) +0x2270| 20 | | xl_rmid: 32 0x2271-0x2271.7 (1) +0x2270| 00 5b | .[ | hole1: 23296 0x2272-0x2273.7 (2) +0x2270| 7a 01 00 00 | z... | xl_crc: 378 0x2274-0x2277.7 (4) +0x22a0| 00 | . | align0: raw bits 0x22a7-0x22a7.7 (1) + | | | [3]{}: xlog_record 0x22a8-0x247f.7 (472) + | | | lsn: "17A/5B0022A8" (1625024373416) 0x22a8-NA (0) +0x22a0| d3 01 00 00 | .... | xl_tot_len: 467 0x22a8-0x22ab.7 (4) +0x22a0| 00 00 00 00| ....| xlog_body0: raw bits 0x22ac-0x247a.7 (463) +0x22b0|00 00 00 00 00 00 00 00 60 22 00 5b 7a 01 00 00|........`".[z...| +* |until 0x247a.7 (463) | | +0x22a0| 00 00 00 00| ....| xl_xid: 0 0x22ac-0x22af.7 (4) +0x22b0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x22b0-0x22b7.7 (8) +0x22b0| 60 | ` | xl_info: 96 0x22b8-0x22b8.7 (1) +0x22b0| 22 | " | xl_rmid: 34 0x22b9-0x22b9.7 (1) +0x22b0| 00 5b | .[ | hole1: 23296 0x22ba-0x22bb.7 (2) +0x22b0| 7a 01 00 00| z...| xl_crc: 378 0x22bc-0x22bf.7 (4) +0x2470| 00 00 00 00 00| .....| align0: raw bits 0x247b-0x247f.7 (5) + | | | [4]{}: xlog_record 0x2480-0x24c7.7 (72) + | | | lsn: "17A/5B002480" (1625024373888) 0x2480-NA (0) +0x2480|47 00 00 00 |G... | xl_tot_len: 71 0x2480-0x2483.7 (4) +0x2480| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2484-0x24c6.7 (67) +0x2490|a8 22 00 5b 7a 01 00 00 40 09 00 00 be 30 c6 75|.".[z...@....0.u| +* |until 0x24c6.7 (67) | | +0x2480| 00 00 00 00 | .... | xl_xid: 0 0x2484-0x2487.7 (4) +0x2480| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x2488-0x248f.7 (8) +0x2490|a8 |. | xl_info: 168 0x2490-0x2490.7 (1) +0x2490| 22 | " | xl_rmid: 34 0x2491-0x2491.7 (1) +0x2490| 00 5b | .[ | hole1: 23296 0x2492-0x2493.7 (2) +0x2490| 7a 01 00 00 | z... | xl_crc: 378 0x2494-0x2497.7 (4) +0x24c0| 00 | . | align0: raw bits 0x24c7-0x24c7.7 (1) + | | | [5]{}: xlog_record 0x24c8-0x269f.7 (472) + | | | lsn: "17A/5B0024C8" (1625024373960) 0x24c8-NA (0) +0x24c0| d3 01 00 00 | .... | xl_tot_len: 467 0x24c8-0x24cb.7 (4) +0x24c0| 00 00 00 00| ....| xlog_body0: raw bits 0x24cc-0x269a.7 (463) +0x24d0|00 00 00 00 00 00 00 00 80 24 00 5b 7a 01 00 00|.........$.[z...| +* |until 0x269a.7 (463) | | +0x24c0| 00 00 00 00| ....| xl_xid: 0 0x24cc-0x24cf.7 (4) +0x24d0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x24d0-0x24d7.7 (8) +0x24d0| 80 | . | xl_info: 128 0x24d8-0x24d8.7 (1) +0x24d0| 24 | $ | xl_rmid: 36 0x24d9-0x24d9.7 (1) +0x24d0| 00 5b | .[ | hole1: 23296 0x24da-0x24db.7 (2) +0x24d0| 7a 01 00 00| z...| xl_crc: 378 0x24dc-0x24df.7 (4) +0x2690| 00 00 00 00 00| .....| align0: raw bits 0x269b-0x269f.7 (5) + | | | [6]{}: xlog_record 0x26a0-0x26e7.7 (72) + | | | lsn: "17A/5B0026A0" (1625024374432) 0x26a0-NA (0) +0x26a0|47 00 00 00 |G... | xl_tot_len: 71 0x26a0-0x26a3.7 (4) +0x26a0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x26a4-0x26e6.7 (67) +0x26b0|c8 24 00 5b 7a 01 00 00 40 09 00 00 d0 60 79 cc|.$.[z...@....`y.| +* |until 0x26e6.7 (67) | | +0x26a0| 00 00 00 00 | .... | xl_xid: 0 0x26a4-0x26a7.7 (4) +0x26a0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x26a8-0x26af.7 (8) +0x26b0|c8 |. | xl_info: 200 0x26b0-0x26b0.7 (1) +0x26b0| 24 | $ | xl_rmid: 36 0x26b1-0x26b1.7 (1) +0x26b0| 00 5b | .[ | hole1: 23296 0x26b2-0x26b3.7 (2) +0x26b0| 7a 01 00 00 | z... | xl_crc: 378 0x26b4-0x26b7.7 (4) +0x26e0| 00 | . | align0: raw bits 0x26e7-0x26e7.7 (1) + | | | [7]{}: xlog_record 0x26e8-0x28bf.7 (472) + | | | lsn: "17A/5B0026E8" (1625024374504) 0x26e8-NA (0) +0x26e0| d3 01 00 00 | .... | xl_tot_len: 467 0x26e8-0x26eb.7 (4) +0x26e0| 00 00 00 00| ....| xlog_body0: raw bits 0x26ec-0x28ba.7 (463) +0x26f0|00 00 00 00 00 00 00 00 a0 26 00 5b 7a 01 00 00|.........&.[z...| +* |until 0x28ba.7 (463) | | +0x26e0| 00 00 00 00| ....| xl_xid: 0 0x26ec-0x26ef.7 (4) +0x26f0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x26f0-0x26f7.7 (8) +0x26f0| a0 | . | xl_info: 160 0x26f8-0x26f8.7 (1) +0x26f0| 26 | & | xl_rmid: 38 0x26f9-0x26f9.7 (1) +0x26f0| 00 5b | .[ | hole1: 23296 0x26fa-0x26fb.7 (2) +0x26f0| 7a 01 00 00| z...| xl_crc: 378 0x26fc-0x26ff.7 (4) +0x28b0| 00 00 00 00 00| .....| align0: raw bits 0x28bb-0x28bf.7 (5) + | | | [8]{}: xlog_record 0x28c0-0x2907.7 (72) + | | | lsn: "17A/5B0028C0" (1625024374976) 0x28c0-NA (0) +0x28c0|47 00 00 00 |G... | xl_tot_len: 71 0x28c0-0x28c3.7 (4) +0x28c0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x28c4-0x2906.7 (67) +0x28d0|e8 26 00 5b 7a 01 00 00 40 09 00 00 c7 43 24 66|.&.[z...@....C$f| +* |until 0x2906.7 (67) | | +0x28c0| 00 00 00 00 | .... | xl_xid: 0 0x28c4-0x28c7.7 (4) +0x28c0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x28c8-0x28cf.7 (8) +0x28d0|e8 |. | xl_info: 232 0x28d0-0x28d0.7 (1) +0x28d0| 26 | & | xl_rmid: 38 0x28d1-0x28d1.7 (1) +0x28d0| 00 5b | .[ | hole1: 23296 0x28d2-0x28d3.7 (2) +0x28d0| 7a 01 00 00 | z... | xl_crc: 378 0x28d4-0x28d7.7 (4) +0x2900| 00 | . | align0: raw bits 0x2907-0x2907.7 (1) + | | | [9]{}: xlog_record 0x2908-0x2adf.7 (472) + | | | lsn: "17A/5B002908" (1625024375048) 0x2908-NA (0) +0x2900| d3 01 00 00 | .... | xl_tot_len: 467 0x2908-0x290b.7 (4) +0x2900| 00 00 00 00| ....| xlog_body0: raw bits 0x290c-0x2ada.7 (463) +0x2910|00 00 00 00 00 00 00 00 c0 28 00 5b 7a 01 00 00|.........(.[z...| +* |until 0x2ada.7 (463) | | +0x2900| 00 00 00 00| ....| xl_xid: 0 0x290c-0x290f.7 (4) +0x2910|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x2910-0x2917.7 (8) +0x2910| c0 | . | xl_info: 192 0x2918-0x2918.7 (1) +0x2910| 28 | ( | xl_rmid: 40 0x2919-0x2919.7 (1) +0x2910| 00 5b | .[ | hole1: 23296 0x291a-0x291b.7 (2) +0x2910| 7a 01 00 00| z...| xl_crc: 378 0x291c-0x291f.7 (4) +0x2ad0| 00 00 00 00 00| .....| align0: raw bits 0x2adb-0x2adf.7 (5) + | | | [10]{}: xlog_record 0x2ae0-0x2b27.7 (72) + | | | lsn: "17A/5B002AE0" (1625024375520) 0x2ae0-NA (0) +0x2ae0|47 00 00 00 |G... | xl_tot_len: 71 0x2ae0-0x2ae3.7 (4) +0x2ae0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2ae4-0x2b26.7 (67) +0x2af0|08 29 00 5b 7a 01 00 00 40 09 00 00 3c 41 9a 2d|.).[z...@....[z...| +* |until 0x3fff.7 (end) (436) | | +0x3e40| 00 00 00 00| ....| xl_xid: 0 0x3e4c-0x3e4f.7 (4) +0x3e50|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x3e50-0x3e57.7 (8) +0x3e50| 00 | . | xl_info: 0 0x3e58-0x3e58.7 (1) +0x3e50| 3e | > | xl_rmid: 62 0x3e59-0x3e59.7 (1) +0x3e50| 00 5b | .[ | hole1: 23296 0x3e5a-0x3e5b.7 (2) +0x3e50| 7a 01 00 00| z...| xl_crc: 378 0x3e5c-0x3e5f.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee14/.gitignore b/format/postgres/testdata/flavours/pgproee14/.gitignore index 6ba21b1cd..e69de29bb 100644 --- a/format/postgres/testdata/flavours/pgproee14/.gitignore +++ b/format/postgres/testdata/flavours/pgproee14/.gitignore @@ -1 +0,0 @@ -0000* \ No newline at end of file diff --git a/format/postgres/testdata/flavours/pgproee14/000000010000000600000028 b/format/postgres/testdata/flavours/pgproee14/000000010000000600000028 new file mode 100644 index 0000000000000000000000000000000000000000..ed111cd10986bb5090706b8c7af63ce76462da0d GIT binary patch literal 16384 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 Kc03EU_WTDRWH=81 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee14/000000010000000600000028_1.fqtest b/format/postgres/testdata/flavours/pgproee14/000000010000000600000028_1.fqtest new file mode 100644 index 000000000..63791871e --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee14/000000010000000600000028_1.fqtest @@ -0,0 +1,53 @@ +$ fq -d pg_wal -o flavour=pgproee14 ".[0].records[:4] | dv" 000000010000000600000028 +[ + { + "hole0": 0, + "hole1": 0, + "lsn": "6/28000030", + "xl_crc": 4106022103, + "xl_info": 0, + "xl_prev": "6/27FFFFA8", + "xl_rmid": 11, + "xl_tot_len": 72, + "xl_xid": 10000040108, + "xlog_body0": "<68>AAAAAKyADFQCAAAAqP//JwYAAAAACwAA1+y89AAgEAB/BgAA0jUAAEdAAAAEAQAA/wIAALwCCQAQAC1xAQAAAAAAUQA=" + }, + { + "align0": "<1>AA==", + "hole0": 0, + "hole1": 0, + "lsn": "6/28000078", + "xl_crc": 3143580000, + "xl_info": 0, + "xl_prev": "6/28000030", + "xl_rmid": 10, + "xl_tot_len": 95, + "xl_xid": 10000040108, + "xlog_body0": "<91>AAAAAKyADFQCAAAAMAAAKAYAAAAACgAAYDlfuwAgJgB/BgAA0jUAAENAAAC8AgAA/wMDAAIIGAAucQEAI3BwcHBwcHBwcHBwcHBwcHAAAAALcQEAAAAAAAoAAA==" + }, + { + "hole0": 0, + "hole1": 0, + "lsn": "6/280000D8", + "xl_crc": 154712975, + "xl_info": 0, + "xl_prev": "6/28000078", + "xl_rmid": 11, + "xl_tot_len": 72, + "xl_xid": 10000040108, + "xlog_body0": "<68>AAAAAKyADFQCAAAAeAAAKAYAAAAACwAAj7s4CQAgEAB/BgAA0jUAAEdAAAAEAQAA/wIAALwCCgAQAC5xAQAAAAAAUgA=" + }, + { + "align0": "<5>AAAAAAA=", + "hole0": 0, + "hole1": 0, + "lsn": "6/28000120", + "xl_crc": 4138595501, + "xl_info": 0, + "xl_prev": "6/280000D8", + "xl_rmid": 15, + "xl_tot_len": 107, + "xl_xid": 10000040108, + "xlog_body0": "<103>AAAAAKyADFQCAAAA2AAAKAYAAAAADwAArfSt9gBAAAB/BgAA0jUAAEJAAAAAAAAA/zV/BgAA0jUAAEJAAAACAAAAAAAAAAAAAAAAAAAAAQADAAALGABPcQEAAAAAAAAAAAAAAAAAAQ==" + } +] diff --git a/format/postgres/testdata/flavours/postgres14/00000001000000000000004E_2.fqtest b/format/postgres/testdata/flavours/postgres14/00000001000000000000004E_1.fqtest similarity index 57% rename from format/postgres/testdata/flavours/postgres14/00000001000000000000004E_2.fqtest rename to format/postgres/testdata/flavours/postgres14/00000001000000000000004E_1.fqtest index 1d50b0b42..1fa7fe557 100644 --- a/format/postgres/testdata/flavours/postgres14/00000001000000000000004E_2.fqtest +++ b/format/postgres/testdata/flavours/postgres14/00000001000000000000004E_1.fqtest @@ -1,55 +1,54 @@ $ fq -d pg_wal "dv" 00000001000000000000004E - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: 00000001000000000000004E (pg_wal) 0x0-0x3fff.7 (16384) - | | | Pages[0:2]: 0x0-0x3fff.7 (16384) - | | | [0]{}: Page 0x0-0x2d17.7 (11544) - | | | XLogPageHeaderData{}: 0x0-0x27.7 (40) -0x0000|0d d1 |.. | xlp_magic: 53517 0x0-0x1.7 (2) -0x0000| 07 00 | .. | xlp_info: 7 0x2-0x3.7 (2) -0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) -0x0000| 00 00 00 4e 00 00 00 00| ...N....| xlp_pageaddr: 1308622848 0x8-0xf.7 (8) -0x0010|cd 0f 00 00 |.... | xlp_rem_len: 4045 0x10-0x13.7 (4) -0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) - | | | XLogLongPageHeaderData{}: 0x18-0x27.7 (16) -0x0010| bb f9 25 51 64 7c d5 62| ..%Qd|.b| xlp_sysid: 7121735156056324539 0x18-0x1f.7 (8) -0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) -0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) -0x0020| 74 08 00 10 00 a2 ca 95| t.......| raw_bytes_of_prev_wal_file: raw bits 0x28-0xff7.7 (4048) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0:2]: 00000001000000000000004E (pg_wal) 0x0-0x3fff.7 (16384) + | | | [0]{}: page 0x0-0x2d17.7 (11544) + | | | xloog_page_header_data{}: 0x0-0x27.7 (40) +0x0000|0d d1 |.. | xlp_magic: 53517 0x0-0x1.7 (2) +0x0000| 07 00 | .. | xlp_info: 7 0x2-0x3.7 (2) +0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) +0x0000| 00 00 00 4e 00 00 00 00| ...N....| xlp_pageaddr: 1308622848 0x8-0xf.7 (8) +0x0010|cd 0f 00 00 |.... | xlp_rem_len: 4045 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) + | | | xlog_long_page_header_data{}: 0x18-0x27.7 (16) +0x0010| bb f9 25 51 64 7c d5 62| ..%Qd|.b| xlp_sysid: 7121735156056324539 0x18-0x1f.7 (8) +0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) +0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) +0x0020| 74 08 00 10 00 a2 ca 95| t.......| raw_bytes_of_prev_wal_file: raw bits 0x28-0xff7.7 (4048) 0x0030|00 00 00 00 00 02 00 a2 74 07 00 10 00 a1 ca 95|........t.......| * |until 0xff7.7 (4048) | | - | | | Records[0:1]: 0xff8-0x2d17.7 (7456) - | | | [0]{}: XLogRecord 0xff8-0x2d17.7 (7456) - | | | lsn: "0/4E000FF8" (1308626936) 0xff8-NA (0) -0x0ff0| 05 1d 00 00 | .... | xl_tot_len: 7429 0xff8-0xffb.7 (4) -0x0ff0| e8 02 00 00| ....| xLogBody0: raw bits 0xffc-0x1fff.7 (4100) + | | | records[0:1]: 0xff8-0x2d17.7 (7456) + | | | [0]{}: xlog_record 0xff8-0x2d17.7 (7456) + | | | lsn: "0/4E000FF8" (1308626936) 0xff8-NA (0) +0x0ff0| 05 1d 00 00 | .... | xl_tot_len: 7429 0xff8-0xffb.7 (4) +0x0ff0| e8 02 00 00| ....| xlog_body0: raw bits 0xffc-0x1fff.7 (4100) 0x1000|c8 f2 ff 4d 00 00 00 00 b0 00 00 00 28 0e 9d 77|...M........(..w| * |until 0x1fff.7 (4100) | | -0x0ff0| e8 02 00 00| ....| xl_xid: 744 0xffc-0xfff.7 (4) -0x1000|c8 f2 ff 4d 00 00 00 00 |...M.... | xl_prev: "0/4DFFF2C8" (1308619464) 0x1000-0x1007.7 (8) -0x1000| b0 | . | xl_info: 176 0x1008-0x1008.7 (1) -0x1000| 00 | . | xl_rmid: 0 0x1009-0x1009.7 (1) -0x1000| 00 00 | .. | hole1: 0 0x100a-0x100b.7 (2) -0x1000| 28 0e 9d 77| (..w| xl_crc: 2006781480 0x100c-0x100f.7 (4) -0x2010| 74 18 00 10 00 e3 cb 95| t.......| xLogBody1: raw bits 0x2018-0x2d17.7 (3328) +0x0ff0| e8 02 00 00| ....| xl_xid: 744 0xffc-0xfff.7 (4) +0x1000|c8 f2 ff 4d 00 00 00 00 |...M.... | xl_prev: "0/4DFFF2C8" (1308619464) 0x1000-0x1007.7 (8) +0x1000| b0 | . | xl_info: 176 0x1008-0x1008.7 (1) +0x1000| 00 | . | xl_rmid: 0 0x1009-0x1009.7 (1) +0x1000| 00 00 | .. | hole1: 0 0x100a-0x100b.7 (2) +0x1000| 28 0e 9d 77| (..w| xl_crc: 2006781480 0x100c-0x100f.7 (4) +0x2010| 74 18 00 10 00 e3 cb 95| t.......| xlog_body1: raw bits 0x2018-0x2d17.7 (3328) 0x2020|00 00 00 00 00 02 00 a7 74 17 00 10 00 e2 cb 95|........t.......| * |until 0x2d17.7 (3328) | | - | | | [1]{}: Page 0x2000-0x3fff.7 (8192) - | | | XLogPageHeaderData{}: 0x2000-0x2017.7 (24) -0x2000|0d d1 |.. | xlp_magic: 53517 0x2000-0x2001.7 (2) -0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) -0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) -0x2000| 00 20 00 4e 00 00 00 00| . .N....| xlp_pageaddr: 1308631040 0x2008-0x200f.7 (8) -0x2010|fd 0c 00 00 |.... | xlp_rem_len: 3325 0x2010-0x2013.7 (4) -0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) - | | | Records[0:1]: 0x2d18-0x3fff.7 (4840) - | | | [0]{}: XLogRecord 0x2d18-0x3fff.7 (4840) - | | | lsn: "0/4E002D18" (1308634392) 0x2d18-NA (0) -0x2d10| 05 1d 00 00 | .... | xl_tot_len: 7429 0x2d18-0x2d1b.7 (4) -0x2d10| e8 02 00 00| ....| xLogBody0: raw bits 0x2d1c-0x3fff.7 (4836) + | | | [1]{}: page 0x2000-0x3fff.7 (8192) + | | | xloog_page_header_data{}: 0x2000-0x2017.7 (24) +0x2000|0d d1 |.. | xlp_magic: 53517 0x2000-0x2001.7 (2) +0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) +0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) +0x2000| 00 20 00 4e 00 00 00 00| . .N....| xlp_pageaddr: 1308631040 0x2008-0x200f.7 (8) +0x2010|fd 0c 00 00 |.... | xlp_rem_len: 3325 0x2010-0x2013.7 (4) +0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) + | | | records[0:1]: 0x2d18-0x3fff.7 (4840) + | | | [0]{}: xlog_record 0x2d18-0x3fff.7 (4840) + | | | lsn: "0/4E002D18" (1308634392) 0x2d18-NA (0) +0x2d10| 05 1d 00 00 | .... | xl_tot_len: 7429 0x2d18-0x2d1b.7 (4) +0x2d10| e8 02 00 00| ....| xlog_body0: raw bits 0x2d1c-0x3fff.7 (4836) 0x2d20|f8 0f 00 4e 00 00 00 00 b0 00 00 00 14 38 ce 9e|...N.........8..| * |until 0x3fff.7 (end) (4836) | | -0x2d10| e8 02 00 00| ....| xl_xid: 744 0x2d1c-0x2d1f.7 (4) -0x2d20|f8 0f 00 4e 00 00 00 00 |...N.... | xl_prev: "0/4E000FF8" (1308626936) 0x2d20-0x2d27.7 (8) -0x2d20| b0 | . | xl_info: 176 0x2d28-0x2d28.7 (1) -0x2d20| 00 | . | xl_rmid: 0 0x2d29-0x2d29.7 (1) -0x2d20| 00 00 | .. | hole1: 0 0x2d2a-0x2d2b.7 (2) -0x2d20| 14 38 ce 9e| .8..| xl_crc: 2664314900 0x2d2c-0x2d2f.7 (4) +0x2d10| e8 02 00 00| ....| xl_xid: 744 0x2d1c-0x2d1f.7 (4) +0x2d20|f8 0f 00 4e 00 00 00 00 |...N.... | xl_prev: "0/4E000FF8" (1308626936) 0x2d20-0x2d27.7 (8) +0x2d20| b0 | . | xl_info: 176 0x2d28-0x2d28.7 (1) +0x2d20| 00 | . | xl_rmid: 0 0x2d29-0x2d29.7 (1) +0x2d20| 00 00 | .. | hole1: 0 0x2d2a-0x2d2b.7 (2) +0x2d20| 14 38 ce 9e| .8..| xl_crc: 2664314900 0x2d2c-0x2d2f.7 (4) diff --git a/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD_1.fqtest b/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD_1.fqtest index 984d03076..2d7a88663 100644 --- a/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD_1.fqtest +++ b/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD_1.fqtest @@ -1,406 +1,405 @@ $ fq -d pg_wal -o flavour=postgres14 "dv" 00000001000001AE000000CD - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: 00000001000001AE000000CD (pg_wal) 0x0-0x3fff.7 (16384) - | | | Pages[0:2]: 0x0-0x3fff.7 (16384) - | | | [0]{}: Page 0x0-0x21ff.7 (8704) - | | | XLogPageHeaderData{}: 0x0-0x27.7 (40) -0x0000|0d d1 |.. | xlp_magic: 53517 0x0-0x1.7 (2) -0x0000| 07 00 | .. | xlp_info: 7 0x2-0x3.7 (2) -0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) -0x0000| 00 00 00 cd ae 01 00 00| ........| xlp_pageaddr: 1850275266560 0x8-0xf.7 (8) -0x0010|73 00 00 00 |s... | xlp_rem_len: 115 0x10-0x13.7 (4) -0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) - | | | XLogLongPageHeaderData{}: 0x18-0x27.7 (16) -0x0010| 68 e7 dd 05 b3 88 b3 61| h......a| xlp_sysid: 7040120944989169512 0x18-0x1f.7 (8) -0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) -0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) -0x0020| 80 01 00 00 80 01 00 00| ........| raw_bytes_of_prev_wal_file: raw bits 0x28-0x9f.7 (120) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0:2]: 00000001000001AE000000CD (pg_wal) 0x0-0x3fff.7 (16384) + | | | [0]{}: page 0x0-0x21ff.7 (8704) + | | | xloog_page_header_data{}: 0x0-0x27.7 (40) +0x0000|0d d1 |.. | xlp_magic: 53517 0x0-0x1.7 (2) +0x0000| 07 00 | .. | xlp_info: 7 0x2-0x3.7 (2) +0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) +0x0000| 00 00 00 cd ae 01 00 00| ........| xlp_pageaddr: 1850275266560 0x8-0xf.7 (8) +0x0010|73 00 00 00 |s... | xlp_rem_len: 115 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) + | | | xlog_long_page_header_data{}: 0x18-0x27.7 (16) +0x0010| 68 e7 dd 05 b3 88 b3 61| h......a| xlp_sysid: 7040120944989169512 0x18-0x1f.7 (8) +0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) +0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) +0x0020| 80 01 00 00 80 01 00 00| ........| raw_bytes_of_prev_wal_file: raw bits 0x28-0x9f.7 (120) 0x0030|80 01 00 00 80 01 00 00 80 01 00 00 80 01 00 00|................| * |until 0x9f.7 (120) | | - | | | Records[0:15]: 0xa0-0x21ff.7 (8544) - | | | [0]{}: XLogRecord 0xa0-0x2d7.7 (568) - | | | lsn: "1AE/CD0000A0" (1850275266720) 0xa0-NA (0) -0x00a0|33 02 00 00 |3... | xl_tot_len: 563 0xa0-0xa3.7 (4) -0x00a0| 00 00 00 00 40 fe ff cc ae 01 00 00| ....@.......| xLogBody0: raw bits 0xa4-0x2d2.7 (559) + | | | records[0:15]: 0xa0-0x21ff.7 (8544) + | | | [0]{}: xlog_record 0xa0-0x2d7.7 (568) + | | | lsn: "1AE/CD0000A0" (1850275266720) 0xa0-NA (0) +0x00a0|33 02 00 00 |3... | xl_tot_len: 563 0xa0-0xa3.7 (4) +0x00a0| 00 00 00 00 40 fe ff cc ae 01 00 00| ....@.......| xlog_body0: raw bits 0xa4-0x2d2.7 (559) 0x00b0|10 09 00 00 b2 1a 64 de 00 10 00 00 f8 01 f8 01|......d.........| * |until 0x2d2.7 (559) | | -0x00a0| 00 00 00 00 | .... | xl_xid: 0 0xa4-0xa7.7 (4) -0x00a0| 40 fe ff cc ae 01 00 00| @.......| xl_prev: "1AE/CCFFFE40" (1850275266112) 0xa8-0xaf.7 (8) -0x00b0|10 |. | xl_info: 16 0xb0-0xb0.7 (1) -0x00b0| 09 | . | xl_rmid: 9 0xb1-0xb1.7 (1) -0x00b0| 00 00 | .. | hole1: 0 0xb2-0xb3.7 (2) -0x00b0| b2 1a 64 de | ..d. | xl_crc: 3731102386 0xb4-0xb7.7 (4) -0x02d0| 00 00 00 00 00 | ..... | align0: raw bits 0x2d3-0x2d7.7 (5) - | | | [1]{}: XLogRecord 0x2d8-0x50f.7 (568) - | | | lsn: "1AE/CD0002D8" (1850275267288) 0x2d8-NA (0) -0x02d0| 33 02 00 00 | 3... | xl_tot_len: 563 0x2d8-0x2db.7 (4) -0x02d0| 00 00 00 00| ....| xLogBody0: raw bits 0x2dc-0x50a.7 (559) +0x00a0| 00 00 00 00 | .... | xl_xid: 0 0xa4-0xa7.7 (4) +0x00a0| 40 fe ff cc ae 01 00 00| @.......| xl_prev: "1AE/CCFFFE40" (1850275266112) 0xa8-0xaf.7 (8) +0x00b0|10 |. | xl_info: 16 0xb0-0xb0.7 (1) +0x00b0| 09 | . | xl_rmid: 9 0xb1-0xb1.7 (1) +0x00b0| 00 00 | .. | hole1: 0 0xb2-0xb3.7 (2) +0x00b0| b2 1a 64 de | ..d. | xl_crc: 3731102386 0xb4-0xb7.7 (4) +0x02d0| 00 00 00 00 00 | ..... | align0: raw bits 0x2d3-0x2d7.7 (5) + | | | [1]{}: xlog_record 0x2d8-0x50f.7 (568) + | | | lsn: "1AE/CD0002D8" (1850275267288) 0x2d8-NA (0) +0x02d0| 33 02 00 00 | 3... | xl_tot_len: 563 0x2d8-0x2db.7 (4) +0x02d0| 00 00 00 00| ....| xlog_body0: raw bits 0x2dc-0x50a.7 (559) 0x02e0|a0 00 00 cd ae 01 00 00 10 09 00 00 1d bf 48 90|..............H.| * |until 0x50a.7 (559) | | -0x02d0| 00 00 00 00| ....| xl_xid: 0 0x2dc-0x2df.7 (4) -0x02e0|a0 00 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD0000A0" (1850275266720) 0x2e0-0x2e7.7 (8) -0x02e0| 10 | . | xl_info: 16 0x2e8-0x2e8.7 (1) -0x02e0| 09 | . | xl_rmid: 9 0x2e9-0x2e9.7 (1) -0x02e0| 00 00 | .. | hole1: 0 0x2ea-0x2eb.7 (2) -0x02e0| 1d bf 48 90| ..H.| xl_crc: 2420686621 0x2ec-0x2ef.7 (4) -0x0500| 00 00 00 00 00| .....| align0: raw bits 0x50b-0x50f.7 (5) - | | | [2]{}: XLogRecord 0x510-0x747.7 (568) - | | | lsn: "1AE/CD000510" (1850275267856) 0x510-NA (0) -0x0510|33 02 00 00 |3... | xl_tot_len: 563 0x510-0x513.7 (4) -0x0510| 00 00 00 00 d8 02 00 cd ae 01 00 00| ............| xLogBody0: raw bits 0x514-0x742.7 (559) +0x02d0| 00 00 00 00| ....| xl_xid: 0 0x2dc-0x2df.7 (4) +0x02e0|a0 00 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD0000A0" (1850275266720) 0x2e0-0x2e7.7 (8) +0x02e0| 10 | . | xl_info: 16 0x2e8-0x2e8.7 (1) +0x02e0| 09 | . | xl_rmid: 9 0x2e9-0x2e9.7 (1) +0x02e0| 00 00 | .. | hole1: 0 0x2ea-0x2eb.7 (2) +0x02e0| 1d bf 48 90| ..H.| xl_crc: 2420686621 0x2ec-0x2ef.7 (4) +0x0500| 00 00 00 00 00| .....| align0: raw bits 0x50b-0x50f.7 (5) + | | | [2]{}: xlog_record 0x510-0x747.7 (568) + | | | lsn: "1AE/CD000510" (1850275267856) 0x510-NA (0) +0x0510|33 02 00 00 |3... | xl_tot_len: 563 0x510-0x513.7 (4) +0x0510| 00 00 00 00 d8 02 00 cd ae 01 00 00| ............| xlog_body0: raw bits 0x514-0x742.7 (559) 0x0520|10 09 00 00 b4 1a 59 98 00 10 00 00 f8 01 f8 01|......Y.........| * |until 0x742.7 (559) | | -0x0510| 00 00 00 00 | .... | xl_xid: 0 0x514-0x517.7 (4) -0x0510| d8 02 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD0002D8" (1850275267288) 0x518-0x51f.7 (8) -0x0520|10 |. | xl_info: 16 0x520-0x520.7 (1) -0x0520| 09 | . | xl_rmid: 9 0x521-0x521.7 (1) -0x0520| 00 00 | .. | hole1: 0 0x522-0x523.7 (2) -0x0520| b4 1a 59 98 | ..Y. | xl_crc: 2555976372 0x524-0x527.7 (4) -0x0740| 00 00 00 00 00 | ..... | align0: raw bits 0x743-0x747.7 (5) - | | | [3]{}: XLogRecord 0x748-0x97f.7 (568) - | | | lsn: "1AE/CD000748" (1850275268424) 0x748-NA (0) -0x0740| 33 02 00 00 | 3... | xl_tot_len: 563 0x748-0x74b.7 (4) -0x0740| 00 00 00 00| ....| xLogBody0: raw bits 0x74c-0x97a.7 (559) +0x0510| 00 00 00 00 | .... | xl_xid: 0 0x514-0x517.7 (4) +0x0510| d8 02 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD0002D8" (1850275267288) 0x518-0x51f.7 (8) +0x0520|10 |. | xl_info: 16 0x520-0x520.7 (1) +0x0520| 09 | . | xl_rmid: 9 0x521-0x521.7 (1) +0x0520| 00 00 | .. | hole1: 0 0x522-0x523.7 (2) +0x0520| b4 1a 59 98 | ..Y. | xl_crc: 2555976372 0x524-0x527.7 (4) +0x0740| 00 00 00 00 00 | ..... | align0: raw bits 0x743-0x747.7 (5) + | | | [3]{}: xlog_record 0x748-0x97f.7 (568) + | | | lsn: "1AE/CD000748" (1850275268424) 0x748-NA (0) +0x0740| 33 02 00 00 | 3... | xl_tot_len: 563 0x748-0x74b.7 (4) +0x0740| 00 00 00 00| ....| xlog_body0: raw bits 0x74c-0x97a.7 (559) 0x0750|10 05 00 cd ae 01 00 00 10 09 00 00 89 b9 51 e1|..............Q.| * |until 0x97a.7 (559) | | -0x0740| 00 00 00 00| ....| xl_xid: 0 0x74c-0x74f.7 (4) -0x0750|10 05 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD000510" (1850275267856) 0x750-0x757.7 (8) -0x0750| 10 | . | xl_info: 16 0x758-0x758.7 (1) -0x0750| 09 | . | xl_rmid: 9 0x759-0x759.7 (1) -0x0750| 00 00 | .. | hole1: 0 0x75a-0x75b.7 (2) -0x0750| 89 b9 51 e1| ..Q.| xl_crc: 3780229513 0x75c-0x75f.7 (4) -0x0970| 00 00 00 00 00| .....| align0: raw bits 0x97b-0x97f.7 (5) - | | | [4]{}: XLogRecord 0x980-0xbb7.7 (568) - | | | lsn: "1AE/CD000980" (1850275268992) 0x980-NA (0) -0x0980|33 02 00 00 |3... | xl_tot_len: 563 0x980-0x983.7 (4) -0x0980| 00 00 00 00 48 07 00 cd ae 01 00 00| ....H.......| xLogBody0: raw bits 0x984-0xbb2.7 (559) +0x0740| 00 00 00 00| ....| xl_xid: 0 0x74c-0x74f.7 (4) +0x0750|10 05 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD000510" (1850275267856) 0x750-0x757.7 (8) +0x0750| 10 | . | xl_info: 16 0x758-0x758.7 (1) +0x0750| 09 | . | xl_rmid: 9 0x759-0x759.7 (1) +0x0750| 00 00 | .. | hole1: 0 0x75a-0x75b.7 (2) +0x0750| 89 b9 51 e1| ..Q.| xl_crc: 3780229513 0x75c-0x75f.7 (4) +0x0970| 00 00 00 00 00| .....| align0: raw bits 0x97b-0x97f.7 (5) + | | | [4]{}: xlog_record 0x980-0xbb7.7 (568) + | | | lsn: "1AE/CD000980" (1850275268992) 0x980-NA (0) +0x0980|33 02 00 00 |3... | xl_tot_len: 563 0x980-0x983.7 (4) +0x0980| 00 00 00 00 48 07 00 cd ae 01 00 00| ....H.......| xlog_body0: raw bits 0x984-0xbb2.7 (559) 0x0990|10 09 00 00 68 d6 37 44 00 10 00 00 f8 01 f8 01|....h.7D........| * |until 0xbb2.7 (559) | | -0x0980| 00 00 00 00 | .... | xl_xid: 0 0x984-0x987.7 (4) -0x0980| 48 07 00 cd ae 01 00 00| H.......| xl_prev: "1AE/CD000748" (1850275268424) 0x988-0x98f.7 (8) -0x0990|10 |. | xl_info: 16 0x990-0x990.7 (1) -0x0990| 09 | . | xl_rmid: 9 0x991-0x991.7 (1) -0x0990| 00 00 | .. | hole1: 0 0x992-0x993.7 (2) -0x0990| 68 d6 37 44 | h.7D | xl_crc: 1144510056 0x994-0x997.7 (4) -0x0bb0| 00 00 00 00 00 | ..... | align0: raw bits 0xbb3-0xbb7.7 (5) - | | | [5]{}: XLogRecord 0xbb8-0xdef.7 (568) - | | | lsn: "1AE/CD000BB8" (1850275269560) 0xbb8-NA (0) -0x0bb0| 33 02 00 00 | 3... | xl_tot_len: 563 0xbb8-0xbbb.7 (4) -0x0bb0| 00 00 00 00| ....| xLogBody0: raw bits 0xbbc-0xdea.7 (559) +0x0980| 00 00 00 00 | .... | xl_xid: 0 0x984-0x987.7 (4) +0x0980| 48 07 00 cd ae 01 00 00| H.......| xl_prev: "1AE/CD000748" (1850275268424) 0x988-0x98f.7 (8) +0x0990|10 |. | xl_info: 16 0x990-0x990.7 (1) +0x0990| 09 | . | xl_rmid: 9 0x991-0x991.7 (1) +0x0990| 00 00 | .. | hole1: 0 0x992-0x993.7 (2) +0x0990| 68 d6 37 44 | h.7D | xl_crc: 1144510056 0x994-0x997.7 (4) +0x0bb0| 00 00 00 00 00 | ..... | align0: raw bits 0xbb3-0xbb7.7 (5) + | | | [5]{}: xlog_record 0xbb8-0xdef.7 (568) + | | | lsn: "1AE/CD000BB8" (1850275269560) 0xbb8-NA (0) +0x0bb0| 33 02 00 00 | 3... | xl_tot_len: 563 0xbb8-0xbbb.7 (4) +0x0bb0| 00 00 00 00| ....| xlog_body0: raw bits 0xbbc-0xdea.7 (559) 0x0bc0|80 09 00 cd ae 01 00 00 10 09 00 00 b9 7a 82 2d|.............z.-| * |until 0xdea.7 (559) | | -0x0bb0| 00 00 00 00| ....| xl_xid: 0 0xbbc-0xbbf.7 (4) -0x0bc0|80 09 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD000980" (1850275268992) 0xbc0-0xbc7.7 (8) -0x0bc0| 10 | . | xl_info: 16 0xbc8-0xbc8.7 (1) -0x0bc0| 09 | . | xl_rmid: 9 0xbc9-0xbc9.7 (1) -0x0bc0| 00 00 | .. | hole1: 0 0xbca-0xbcb.7 (2) -0x0bc0| b9 7a 82 2d| .z.-| xl_crc: 763525817 0xbcc-0xbcf.7 (4) -0x0de0| 00 00 00 00 00| .....| align0: raw bits 0xdeb-0xdef.7 (5) - | | | [6]{}: XLogRecord 0xdf0-0x1027.7 (568) - | | | lsn: "1AE/CD000DF0" (1850275270128) 0xdf0-NA (0) -0x0df0|33 02 00 00 |3... | xl_tot_len: 563 0xdf0-0xdf3.7 (4) -0x0df0| 00 00 00 00 b8 0b 00 cd ae 01 00 00| ............| xLogBody0: raw bits 0xdf4-0x1022.7 (559) +0x0bb0| 00 00 00 00| ....| xl_xid: 0 0xbbc-0xbbf.7 (4) +0x0bc0|80 09 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD000980" (1850275268992) 0xbc0-0xbc7.7 (8) +0x0bc0| 10 | . | xl_info: 16 0xbc8-0xbc8.7 (1) +0x0bc0| 09 | . | xl_rmid: 9 0xbc9-0xbc9.7 (1) +0x0bc0| 00 00 | .. | hole1: 0 0xbca-0xbcb.7 (2) +0x0bc0| b9 7a 82 2d| .z.-| xl_crc: 763525817 0xbcc-0xbcf.7 (4) +0x0de0| 00 00 00 00 00| .....| align0: raw bits 0xdeb-0xdef.7 (5) + | | | [6]{}: xlog_record 0xdf0-0x1027.7 (568) + | | | lsn: "1AE/CD000DF0" (1850275270128) 0xdf0-NA (0) +0x0df0|33 02 00 00 |3... | xl_tot_len: 563 0xdf0-0xdf3.7 (4) +0x0df0| 00 00 00 00 b8 0b 00 cd ae 01 00 00| ............| xlog_body0: raw bits 0xdf4-0x1022.7 (559) 0x0e00|10 09 00 00 79 1f 0d ff 00 10 00 00 f8 01 f8 01|....y...........| * |until 0x1022.7 (559) | | -0x0df0| 00 00 00 00 | .... | xl_xid: 0 0xdf4-0xdf7.7 (4) -0x0df0| b8 0b 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD000BB8" (1850275269560) 0xdf8-0xdff.7 (8) -0x0e00|10 |. | xl_info: 16 0xe00-0xe00.7 (1) -0x0e00| 09 | . | xl_rmid: 9 0xe01-0xe01.7 (1) -0x0e00| 00 00 | .. | hole1: 0 0xe02-0xe03.7 (2) -0x0e00| 79 1f 0d ff | y... | xl_crc: 4279050105 0xe04-0xe07.7 (4) -0x1020| 00 00 00 00 00 | ..... | align0: raw bits 0x1023-0x1027.7 (5) - | | | [7]{}: XLogRecord 0x1028-0x125f.7 (568) - | | | lsn: "1AE/CD001028" (1850275270696) 0x1028-NA (0) -0x1020| 33 02 00 00 | 3... | xl_tot_len: 563 0x1028-0x102b.7 (4) -0x1020| 00 00 00 00| ....| xLogBody0: raw bits 0x102c-0x125a.7 (559) +0x0df0| 00 00 00 00 | .... | xl_xid: 0 0xdf4-0xdf7.7 (4) +0x0df0| b8 0b 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD000BB8" (1850275269560) 0xdf8-0xdff.7 (8) +0x0e00|10 |. | xl_info: 16 0xe00-0xe00.7 (1) +0x0e00| 09 | . | xl_rmid: 9 0xe01-0xe01.7 (1) +0x0e00| 00 00 | .. | hole1: 0 0xe02-0xe03.7 (2) +0x0e00| 79 1f 0d ff | y... | xl_crc: 4279050105 0xe04-0xe07.7 (4) +0x1020| 00 00 00 00 00 | ..... | align0: raw bits 0x1023-0x1027.7 (5) + | | | [7]{}: xlog_record 0x1028-0x125f.7 (568) + | | | lsn: "1AE/CD001028" (1850275270696) 0x1028-NA (0) +0x1020| 33 02 00 00 | 3... | xl_tot_len: 563 0x1028-0x102b.7 (4) +0x1020| 00 00 00 00| ....| xlog_body0: raw bits 0x102c-0x125a.7 (559) 0x1030|f0 0d 00 cd ae 01 00 00 10 09 00 00 46 d5 42 a8|............F.B.| * |until 0x125a.7 (559) | | -0x1020| 00 00 00 00| ....| xl_xid: 0 0x102c-0x102f.7 (4) -0x1030|f0 0d 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD000DF0" (1850275270128) 0x1030-0x1037.7 (8) -0x1030| 10 | . | xl_info: 16 0x1038-0x1038.7 (1) -0x1030| 09 | . | xl_rmid: 9 0x1039-0x1039.7 (1) -0x1030| 00 00 | .. | hole1: 0 0x103a-0x103b.7 (2) -0x1030| 46 d5 42 a8| F.B.| xl_crc: 2822952262 0x103c-0x103f.7 (4) -0x1250| 00 00 00 00 00| .....| align0: raw bits 0x125b-0x125f.7 (5) - | | | [8]{}: XLogRecord 0x1260-0x1497.7 (568) - | | | lsn: "1AE/CD001260" (1850275271264) 0x1260-NA (0) -0x1260|33 02 00 00 |3... | xl_tot_len: 563 0x1260-0x1263.7 (4) -0x1260| 00 00 00 00 28 10 00 cd ae 01 00 00| ....(.......| xLogBody0: raw bits 0x1264-0x1492.7 (559) +0x1020| 00 00 00 00| ....| xl_xid: 0 0x102c-0x102f.7 (4) +0x1030|f0 0d 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD000DF0" (1850275270128) 0x1030-0x1037.7 (8) +0x1030| 10 | . | xl_info: 16 0x1038-0x1038.7 (1) +0x1030| 09 | . | xl_rmid: 9 0x1039-0x1039.7 (1) +0x1030| 00 00 | .. | hole1: 0 0x103a-0x103b.7 (2) +0x1030| 46 d5 42 a8| F.B.| xl_crc: 2822952262 0x103c-0x103f.7 (4) +0x1250| 00 00 00 00 00| .....| align0: raw bits 0x125b-0x125f.7 (5) + | | | [8]{}: xlog_record 0x1260-0x1497.7 (568) + | | | lsn: "1AE/CD001260" (1850275271264) 0x1260-NA (0) +0x1260|33 02 00 00 |3... | xl_tot_len: 563 0x1260-0x1263.7 (4) +0x1260| 00 00 00 00 28 10 00 cd ae 01 00 00| ....(.......| xlog_body0: raw bits 0x1264-0x1492.7 (559) 0x1270|10 09 00 00 9d 65 e6 d6 00 10 00 00 f8 01 f8 01|.....e..........| * |until 0x1492.7 (559) | | -0x1260| 00 00 00 00 | .... | xl_xid: 0 0x1264-0x1267.7 (4) -0x1260| 28 10 00 cd ae 01 00 00| (.......| xl_prev: "1AE/CD001028" (1850275270696) 0x1268-0x126f.7 (8) -0x1270|10 |. | xl_info: 16 0x1270-0x1270.7 (1) -0x1270| 09 | . | xl_rmid: 9 0x1271-0x1271.7 (1) -0x1270| 00 00 | .. | hole1: 0 0x1272-0x1273.7 (2) -0x1270| 9d 65 e6 d6 | .e.. | xl_crc: 3605423517 0x1274-0x1277.7 (4) -0x1490| 00 00 00 00 00 | ..... | align0: raw bits 0x1493-0x1497.7 (5) - | | | [9]{}: XLogRecord 0x1498-0x16cf.7 (568) - | | | lsn: "1AE/CD001498" (1850275271832) 0x1498-NA (0) -0x1490| 33 02 00 00 | 3... | xl_tot_len: 563 0x1498-0x149b.7 (4) -0x1490| 00 00 00 00| ....| xLogBody0: raw bits 0x149c-0x16ca.7 (559) +0x1260| 00 00 00 00 | .... | xl_xid: 0 0x1264-0x1267.7 (4) +0x1260| 28 10 00 cd ae 01 00 00| (.......| xl_prev: "1AE/CD001028" (1850275270696) 0x1268-0x126f.7 (8) +0x1270|10 |. | xl_info: 16 0x1270-0x1270.7 (1) +0x1270| 09 | . | xl_rmid: 9 0x1271-0x1271.7 (1) +0x1270| 00 00 | .. | hole1: 0 0x1272-0x1273.7 (2) +0x1270| 9d 65 e6 d6 | .e.. | xl_crc: 3605423517 0x1274-0x1277.7 (4) +0x1490| 00 00 00 00 00 | ..... | align0: raw bits 0x1493-0x1497.7 (5) + | | | [9]{}: xlog_record 0x1498-0x16cf.7 (568) + | | | lsn: "1AE/CD001498" (1850275271832) 0x1498-NA (0) +0x1490| 33 02 00 00 | 3... | xl_tot_len: 563 0x1498-0x149b.7 (4) +0x1490| 00 00 00 00| ....| xlog_body0: raw bits 0x149c-0x16ca.7 (559) 0x14a0|60 12 00 cd ae 01 00 00 10 09 00 00 ee ac 89 df|`...............| * |until 0x16ca.7 (559) | | -0x1490| 00 00 00 00| ....| xl_xid: 0 0x149c-0x149f.7 (4) -0x14a0|60 12 00 cd ae 01 00 00 |`....... | xl_prev: "1AE/CD001260" (1850275271264) 0x14a0-0x14a7.7 (8) -0x14a0| 10 | . | xl_info: 16 0x14a8-0x14a8.7 (1) -0x14a0| 09 | . | xl_rmid: 9 0x14a9-0x14a9.7 (1) -0x14a0| 00 00 | .. | hole1: 0 0x14aa-0x14ab.7 (2) -0x14a0| ee ac 89 df| ....| xl_crc: 3750341870 0x14ac-0x14af.7 (4) -0x16c0| 00 00 00 00 00| .....| align0: raw bits 0x16cb-0x16cf.7 (5) - | | | [10]{}: XLogRecord 0x16d0-0x1907.7 (568) - | | | lsn: "1AE/CD0016D0" (1850275272400) 0x16d0-NA (0) -0x16d0|33 02 00 00 |3... | xl_tot_len: 563 0x16d0-0x16d3.7 (4) -0x16d0| 00 00 00 00 98 14 00 cd ae 01 00 00| ............| xLogBody0: raw bits 0x16d4-0x1902.7 (559) +0x1490| 00 00 00 00| ....| xl_xid: 0 0x149c-0x149f.7 (4) +0x14a0|60 12 00 cd ae 01 00 00 |`....... | xl_prev: "1AE/CD001260" (1850275271264) 0x14a0-0x14a7.7 (8) +0x14a0| 10 | . | xl_info: 16 0x14a8-0x14a8.7 (1) +0x14a0| 09 | . | xl_rmid: 9 0x14a9-0x14a9.7 (1) +0x14a0| 00 00 | .. | hole1: 0 0x14aa-0x14ab.7 (2) +0x14a0| ee ac 89 df| ....| xl_crc: 3750341870 0x14ac-0x14af.7 (4) +0x16c0| 00 00 00 00 00| .....| align0: raw bits 0x16cb-0x16cf.7 (5) + | | | [10]{}: xlog_record 0x16d0-0x1907.7 (568) + | | | lsn: "1AE/CD0016D0" (1850275272400) 0x16d0-NA (0) +0x16d0|33 02 00 00 |3... | xl_tot_len: 563 0x16d0-0x16d3.7 (4) +0x16d0| 00 00 00 00 98 14 00 cd ae 01 00 00| ............| xlog_body0: raw bits 0x16d4-0x1902.7 (559) 0x16e0|10 09 00 00 01 1d d5 45 00 10 00 00 f8 01 f8 01|.......E........| * |until 0x1902.7 (559) | | -0x16d0| 00 00 00 00 | .... | xl_xid: 0 0x16d4-0x16d7.7 (4) -0x16d0| 98 14 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD001498" (1850275271832) 0x16d8-0x16df.7 (8) -0x16e0|10 |. | xl_info: 16 0x16e0-0x16e0.7 (1) -0x16e0| 09 | . | xl_rmid: 9 0x16e1-0x16e1.7 (1) -0x16e0| 00 00 | .. | hole1: 0 0x16e2-0x16e3.7 (2) -0x16e0| 01 1d d5 45 | ...E | xl_crc: 1171594497 0x16e4-0x16e7.7 (4) -0x1900| 00 00 00 00 00 | ..... | align0: raw bits 0x1903-0x1907.7 (5) - | | | [11]{}: XLogRecord 0x1908-0x1b3f.7 (568) - | | | lsn: "1AE/CD001908" (1850275272968) 0x1908-NA (0) -0x1900| 33 02 00 00 | 3... | xl_tot_len: 563 0x1908-0x190b.7 (4) -0x1900| 00 00 00 00| ....| xLogBody0: raw bits 0x190c-0x1b3a.7 (559) +0x16d0| 00 00 00 00 | .... | xl_xid: 0 0x16d4-0x16d7.7 (4) +0x16d0| 98 14 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD001498" (1850275271832) 0x16d8-0x16df.7 (8) +0x16e0|10 |. | xl_info: 16 0x16e0-0x16e0.7 (1) +0x16e0| 09 | . | xl_rmid: 9 0x16e1-0x16e1.7 (1) +0x16e0| 00 00 | .. | hole1: 0 0x16e2-0x16e3.7 (2) +0x16e0| 01 1d d5 45 | ...E | xl_crc: 1171594497 0x16e4-0x16e7.7 (4) +0x1900| 00 00 00 00 00 | ..... | align0: raw bits 0x1903-0x1907.7 (5) + | | | [11]{}: xlog_record 0x1908-0x1b3f.7 (568) + | | | lsn: "1AE/CD001908" (1850275272968) 0x1908-NA (0) +0x1900| 33 02 00 00 | 3... | xl_tot_len: 563 0x1908-0x190b.7 (4) +0x1900| 00 00 00 00| ....| xlog_body0: raw bits 0x190c-0x1b3a.7 (559) 0x1910|d0 16 00 cd ae 01 00 00 10 09 00 00 d5 77 f4 9d|.............w..| * |until 0x1b3a.7 (559) | | -0x1900| 00 00 00 00| ....| xl_xid: 0 0x190c-0x190f.7 (4) -0x1910|d0 16 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD0016D0" (1850275272400) 0x1910-0x1917.7 (8) -0x1910| 10 | . | xl_info: 16 0x1918-0x1918.7 (1) -0x1910| 09 | . | xl_rmid: 9 0x1919-0x1919.7 (1) -0x1910| 00 00 | .. | hole1: 0 0x191a-0x191b.7 (2) -0x1910| d5 77 f4 9d| .w..| xl_crc: 2650044373 0x191c-0x191f.7 (4) -0x1b30| 00 00 00 00 00| .....| align0: raw bits 0x1b3b-0x1b3f.7 (5) - | | | [12]{}: XLogRecord 0x1b40-0x1d77.7 (568) - | | | lsn: "1AE/CD001B40" (1850275273536) 0x1b40-NA (0) -0x1b40|33 02 00 00 |3... | xl_tot_len: 563 0x1b40-0x1b43.7 (4) -0x1b40| 00 00 00 00 08 19 00 cd ae 01 00 00| ............| xLogBody0: raw bits 0x1b44-0x1d72.7 (559) +0x1900| 00 00 00 00| ....| xl_xid: 0 0x190c-0x190f.7 (4) +0x1910|d0 16 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD0016D0" (1850275272400) 0x1910-0x1917.7 (8) +0x1910| 10 | . | xl_info: 16 0x1918-0x1918.7 (1) +0x1910| 09 | . | xl_rmid: 9 0x1919-0x1919.7 (1) +0x1910| 00 00 | .. | hole1: 0 0x191a-0x191b.7 (2) +0x1910| d5 77 f4 9d| .w..| xl_crc: 2650044373 0x191c-0x191f.7 (4) +0x1b30| 00 00 00 00 00| .....| align0: raw bits 0x1b3b-0x1b3f.7 (5) + | | | [12]{}: xlog_record 0x1b40-0x1d77.7 (568) + | | | lsn: "1AE/CD001B40" (1850275273536) 0x1b40-NA (0) +0x1b40|33 02 00 00 |3... | xl_tot_len: 563 0x1b40-0x1b43.7 (4) +0x1b40| 00 00 00 00 08 19 00 cd ae 01 00 00| ............| xlog_body0: raw bits 0x1b44-0x1d72.7 (559) 0x1b50|10 09 00 00 4f 66 92 24 00 10 00 00 f8 01 f8 01|....Of.$........| * |until 0x1d72.7 (559) | | -0x1b40| 00 00 00 00 | .... | xl_xid: 0 0x1b44-0x1b47.7 (4) -0x1b40| 08 19 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD001908" (1850275272968) 0x1b48-0x1b4f.7 (8) -0x1b50|10 |. | xl_info: 16 0x1b50-0x1b50.7 (1) -0x1b50| 09 | . | xl_rmid: 9 0x1b51-0x1b51.7 (1) -0x1b50| 00 00 | .. | hole1: 0 0x1b52-0x1b53.7 (2) -0x1b50| 4f 66 92 24 | Of.$ | xl_crc: 613574223 0x1b54-0x1b57.7 (4) -0x1d70| 00 00 00 00 00 | ..... | align0: raw bits 0x1d73-0x1d77.7 (5) - | | | [13]{}: XLogRecord 0x1d78-0x1faf.7 (568) - | | | lsn: "1AE/CD001D78" (1850275274104) 0x1d78-NA (0) -0x1d70| 33 02 00 00 | 3... | xl_tot_len: 563 0x1d78-0x1d7b.7 (4) -0x1d70| 00 00 00 00| ....| xLogBody0: raw bits 0x1d7c-0x1faa.7 (559) +0x1b40| 00 00 00 00 | .... | xl_xid: 0 0x1b44-0x1b47.7 (4) +0x1b40| 08 19 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD001908" (1850275272968) 0x1b48-0x1b4f.7 (8) +0x1b50|10 |. | xl_info: 16 0x1b50-0x1b50.7 (1) +0x1b50| 09 | . | xl_rmid: 9 0x1b51-0x1b51.7 (1) +0x1b50| 00 00 | .. | hole1: 0 0x1b52-0x1b53.7 (2) +0x1b50| 4f 66 92 24 | Of.$ | xl_crc: 613574223 0x1b54-0x1b57.7 (4) +0x1d70| 00 00 00 00 00 | ..... | align0: raw bits 0x1d73-0x1d77.7 (5) + | | | [13]{}: xlog_record 0x1d78-0x1faf.7 (568) + | | | lsn: "1AE/CD001D78" (1850275274104) 0x1d78-NA (0) +0x1d70| 33 02 00 00 | 3... | xl_tot_len: 563 0x1d78-0x1d7b.7 (4) +0x1d70| 00 00 00 00| ....| xlog_body0: raw bits 0x1d7c-0x1faa.7 (559) 0x1d80|40 1b 00 cd ae 01 00 00 10 09 00 00 70 46 fe 1a|@...........pF..| * |until 0x1faa.7 (559) | | -0x1d70| 00 00 00 00| ....| xl_xid: 0 0x1d7c-0x1d7f.7 (4) -0x1d80|40 1b 00 cd ae 01 00 00 |@....... | xl_prev: "1AE/CD001B40" (1850275273536) 0x1d80-0x1d87.7 (8) -0x1d80| 10 | . | xl_info: 16 0x1d88-0x1d88.7 (1) -0x1d80| 09 | . | xl_rmid: 9 0x1d89-0x1d89.7 (1) -0x1d80| 00 00 | .. | hole1: 0 0x1d8a-0x1d8b.7 (2) -0x1d80| 70 46 fe 1a| pF..| xl_crc: 452871792 0x1d8c-0x1d8f.7 (4) -0x1fa0| 00 00 00 00 00| .....| align0: raw bits 0x1fab-0x1faf.7 (5) - | | | [14]{}: XLogRecord 0x1fb0-0x21ff.7 (592) - | | | lsn: "1AE/CD001FB0" (1850275274672) 0x1fb0-NA (0) -0x1fb0|33 02 00 00 |3... | xl_tot_len: 563 0x1fb0-0x1fb3.7 (4) -0x1fb0| 00 00 00 00 78 1d 00 cd ae 01 00 00| ....x.......| xLogBody0: raw bits 0x1fb4-0x1fff.7 (76) +0x1d70| 00 00 00 00| ....| xl_xid: 0 0x1d7c-0x1d7f.7 (4) +0x1d80|40 1b 00 cd ae 01 00 00 |@....... | xl_prev: "1AE/CD001B40" (1850275273536) 0x1d80-0x1d87.7 (8) +0x1d80| 10 | . | xl_info: 16 0x1d88-0x1d88.7 (1) +0x1d80| 09 | . | xl_rmid: 9 0x1d89-0x1d89.7 (1) +0x1d80| 00 00 | .. | hole1: 0 0x1d8a-0x1d8b.7 (2) +0x1d80| 70 46 fe 1a| pF..| xl_crc: 452871792 0x1d8c-0x1d8f.7 (4) +0x1fa0| 00 00 00 00 00| .....| align0: raw bits 0x1fab-0x1faf.7 (5) + | | | [14]{}: xlog_record 0x1fb0-0x21ff.7 (592) + | | | lsn: "1AE/CD001FB0" (1850275274672) 0x1fb0-NA (0) +0x1fb0|33 02 00 00 |3... | xl_tot_len: 563 0x1fb0-0x1fb3.7 (4) +0x1fb0| 00 00 00 00 78 1d 00 cd ae 01 00 00| ....x.......| xlog_body0: raw bits 0x1fb4-0x1fff.7 (76) 0x1fc0|10 09 00 00 8b 13 fa fb 00 10 00 00 f8 01 f8 01|................| * |until 0x1fff.7 (76) | | -0x1fb0| 00 00 00 00 | .... | xl_xid: 0 0x1fb4-0x1fb7.7 (4) -0x1fb0| 78 1d 00 cd ae 01 00 00| x.......| xl_prev: "1AE/CD001D78" (1850275274104) 0x1fb8-0x1fbf.7 (8) -0x1fc0|10 |. | xl_info: 16 0x1fc0-0x1fc0.7 (1) -0x1fc0| 09 | . | xl_rmid: 9 0x1fc1-0x1fc1.7 (1) -0x1fc0| 00 00 | .. | hole1: 0 0x1fc2-0x1fc3.7 (2) -0x1fc0| 8b 13 fa fb | .... | xl_crc: 4227470219 0x1fc4-0x1fc7.7 (4) -0x2010| 80 01 00 00 80 01 00 00| ........| xLogBody1: raw bits 0x2018-0x21ff.7 (488) +0x1fb0| 00 00 00 00 | .... | xl_xid: 0 0x1fb4-0x1fb7.7 (4) +0x1fb0| 78 1d 00 cd ae 01 00 00| x.......| xl_prev: "1AE/CD001D78" (1850275274104) 0x1fb8-0x1fbf.7 (8) +0x1fc0|10 |. | xl_info: 16 0x1fc0-0x1fc0.7 (1) +0x1fc0| 09 | . | xl_rmid: 9 0x1fc1-0x1fc1.7 (1) +0x1fc0| 00 00 | .. | hole1: 0 0x1fc2-0x1fc3.7 (2) +0x1fc0| 8b 13 fa fb | .... | xl_crc: 4227470219 0x1fc4-0x1fc7.7 (4) +0x2010| 80 01 00 00 80 01 00 00| ........| xlog_body1: raw bits 0x2018-0x21ff.7 (488) 0x2020|80 01 00 00 80 01 00 00 80 01 00 00 80 01 00 00|................| * |until 0x21ff.7 (488) | | - | | | [1]{}: Page 0x2000-0x3fff.7 (8192) - | | | XLogPageHeaderData{}: 0x2000-0x2017.7 (24) -0x2000|0d d1 |.. | xlp_magic: 53517 0x2000-0x2001.7 (2) -0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) -0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) -0x2000| 00 20 00 cd ae 01 00 00| . ......| xlp_pageaddr: 1850275274752 0x2008-0x200f.7 (8) -0x2010|e3 01 00 00 |.... | xlp_rem_len: 483 0x2010-0x2013.7 (4) -0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) - | | | Records[0:14]: 0x2200-0x3fff.7 (7680) - | | | [0]{}: XLogRecord 0x2200-0x2437.7 (568) - | | | lsn: "1AE/CD002200" (1850275275264) 0x2200-NA (0) -0x2200|33 02 00 00 |3... | xl_tot_len: 563 0x2200-0x2203.7 (4) -0x2200| 00 00 00 00 b0 1f 00 cd ae 01 00 00| ............| xLogBody0: raw bits 0x2204-0x2432.7 (559) + | | | [1]{}: page 0x2000-0x3fff.7 (8192) + | | | xloog_page_header_data{}: 0x2000-0x2017.7 (24) +0x2000|0d d1 |.. | xlp_magic: 53517 0x2000-0x2001.7 (2) +0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) +0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) +0x2000| 00 20 00 cd ae 01 00 00| . ......| xlp_pageaddr: 1850275274752 0x2008-0x200f.7 (8) +0x2010|e3 01 00 00 |.... | xlp_rem_len: 483 0x2010-0x2013.7 (4) +0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) + | | | records[0:14]: 0x2200-0x3fff.7 (7680) + | | | [0]{}: xlog_record 0x2200-0x2437.7 (568) + | | | lsn: "1AE/CD002200" (1850275275264) 0x2200-NA (0) +0x2200|33 02 00 00 |3... | xl_tot_len: 563 0x2200-0x2203.7 (4) +0x2200| 00 00 00 00 b0 1f 00 cd ae 01 00 00| ............| xlog_body0: raw bits 0x2204-0x2432.7 (559) 0x2210|10 09 00 00 af c7 8a 8b 00 10 00 00 f8 01 f8 01|................| * |until 0x2432.7 (559) | | -0x2200| 00 00 00 00 | .... | xl_xid: 0 0x2204-0x2207.7 (4) -0x2200| b0 1f 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD001FB0" (1850275274672) 0x2208-0x220f.7 (8) -0x2210|10 |. | xl_info: 16 0x2210-0x2210.7 (1) -0x2210| 09 | . | xl_rmid: 9 0x2211-0x2211.7 (1) -0x2210| 00 00 | .. | hole1: 0 0x2212-0x2213.7 (2) -0x2210| af c7 8a 8b | .... | xl_crc: 2341128111 0x2214-0x2217.7 (4) -0x2430| 00 00 00 00 00 | ..... | align0: raw bits 0x2433-0x2437.7 (5) - | | | [1]{}: XLogRecord 0x2438-0x266f.7 (568) - | | | lsn: "1AE/CD002438" (1850275275832) 0x2438-NA (0) -0x2430| 33 02 00 00 | 3... | xl_tot_len: 563 0x2438-0x243b.7 (4) -0x2430| 00 00 00 00| ....| xLogBody0: raw bits 0x243c-0x266a.7 (559) +0x2200| 00 00 00 00 | .... | xl_xid: 0 0x2204-0x2207.7 (4) +0x2200| b0 1f 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD001FB0" (1850275274672) 0x2208-0x220f.7 (8) +0x2210|10 |. | xl_info: 16 0x2210-0x2210.7 (1) +0x2210| 09 | . | xl_rmid: 9 0x2211-0x2211.7 (1) +0x2210| 00 00 | .. | hole1: 0 0x2212-0x2213.7 (2) +0x2210| af c7 8a 8b | .... | xl_crc: 2341128111 0x2214-0x2217.7 (4) +0x2430| 00 00 00 00 00 | ..... | align0: raw bits 0x2433-0x2437.7 (5) + | | | [1]{}: xlog_record 0x2438-0x266f.7 (568) + | | | lsn: "1AE/CD002438" (1850275275832) 0x2438-NA (0) +0x2430| 33 02 00 00 | 3... | xl_tot_len: 563 0x2438-0x243b.7 (4) +0x2430| 00 00 00 00| ....| xlog_body0: raw bits 0x243c-0x266a.7 (559) 0x2440|00 22 00 cd ae 01 00 00 10 09 00 00 9e 5c 82 1c|."...........\..| * |until 0x266a.7 (559) | | -0x2430| 00 00 00 00| ....| xl_xid: 0 0x243c-0x243f.7 (4) -0x2440|00 22 00 cd ae 01 00 00 |."...... | xl_prev: "1AE/CD002200" (1850275275264) 0x2440-0x2447.7 (8) -0x2440| 10 | . | xl_info: 16 0x2448-0x2448.7 (1) -0x2440| 09 | . | xl_rmid: 9 0x2449-0x2449.7 (1) -0x2440| 00 00 | .. | hole1: 0 0x244a-0x244b.7 (2) -0x2440| 9e 5c 82 1c| .\..| xl_crc: 478305438 0x244c-0x244f.7 (4) -0x2660| 00 00 00 00 00| .....| align0: raw bits 0x266b-0x266f.7 (5) - | | | [2]{}: XLogRecord 0x2670-0x28a7.7 (568) - | | | lsn: "1AE/CD002670" (1850275276400) 0x2670-NA (0) -0x2670|33 02 00 00 |3... | xl_tot_len: 563 0x2670-0x2673.7 (4) -0x2670| 00 00 00 00 38 24 00 cd ae 01 00 00| ....8$......| xLogBody0: raw bits 0x2674-0x28a2.7 (559) +0x2430| 00 00 00 00| ....| xl_xid: 0 0x243c-0x243f.7 (4) +0x2440|00 22 00 cd ae 01 00 00 |."...... | xl_prev: "1AE/CD002200" (1850275275264) 0x2440-0x2447.7 (8) +0x2440| 10 | . | xl_info: 16 0x2448-0x2448.7 (1) +0x2440| 09 | . | xl_rmid: 9 0x2449-0x2449.7 (1) +0x2440| 00 00 | .. | hole1: 0 0x244a-0x244b.7 (2) +0x2440| 9e 5c 82 1c| .\..| xl_crc: 478305438 0x244c-0x244f.7 (4) +0x2660| 00 00 00 00 00| .....| align0: raw bits 0x266b-0x266f.7 (5) + | | | [2]{}: xlog_record 0x2670-0x28a7.7 (568) + | | | lsn: "1AE/CD002670" (1850275276400) 0x2670-NA (0) +0x2670|33 02 00 00 |3... | xl_tot_len: 563 0x2670-0x2673.7 (4) +0x2670| 00 00 00 00 38 24 00 cd ae 01 00 00| ....8$......| xlog_body0: raw bits 0x2674-0x28a2.7 (559) 0x2680|10 09 00 00 3c 35 49 e6 00 10 00 00 f8 01 f8 01|....<5I.........| * |until 0x28a2.7 (559) | | -0x2670| 00 00 00 00 | .... | xl_xid: 0 0x2674-0x2677.7 (4) -0x2670| 38 24 00 cd ae 01 00 00| 8$......| xl_prev: "1AE/CD002438" (1850275275832) 0x2678-0x267f.7 (8) -0x2680|10 |. | xl_info: 16 0x2680-0x2680.7 (1) -0x2680| 09 | . | xl_rmid: 9 0x2681-0x2681.7 (1) -0x2680| 00 00 | .. | hole1: 0 0x2682-0x2683.7 (2) -0x2680| 3c 35 49 e6 | <5I. | xl_crc: 3863557436 0x2684-0x2687.7 (4) -0x28a0| 00 00 00 00 00 | ..... | align0: raw bits 0x28a3-0x28a7.7 (5) - | | | [3]{}: XLogRecord 0x28a8-0x2adf.7 (568) - | | | lsn: "1AE/CD0028A8" (1850275276968) 0x28a8-NA (0) -0x28a0| 33 02 00 00 | 3... | xl_tot_len: 563 0x28a8-0x28ab.7 (4) -0x28a0| 00 00 00 00| ....| xLogBody0: raw bits 0x28ac-0x2ada.7 (559) +0x2670| 00 00 00 00 | .... | xl_xid: 0 0x2674-0x2677.7 (4) +0x2670| 38 24 00 cd ae 01 00 00| 8$......| xl_prev: "1AE/CD002438" (1850275275832) 0x2678-0x267f.7 (8) +0x2680|10 |. | xl_info: 16 0x2680-0x2680.7 (1) +0x2680| 09 | . | xl_rmid: 9 0x2681-0x2681.7 (1) +0x2680| 00 00 | .. | hole1: 0 0x2682-0x2683.7 (2) +0x2680| 3c 35 49 e6 | <5I. | xl_crc: 3863557436 0x2684-0x2687.7 (4) +0x28a0| 00 00 00 00 00 | ..... | align0: raw bits 0x28a3-0x28a7.7 (5) + | | | [3]{}: xlog_record 0x28a8-0x2adf.7 (568) + | | | lsn: "1AE/CD0028A8" (1850275276968) 0x28a8-NA (0) +0x28a0| 33 02 00 00 | 3... | xl_tot_len: 563 0x28a8-0x28ab.7 (4) +0x28a0| 00 00 00 00| ....| xlog_body0: raw bits 0x28ac-0x2ada.7 (559) 0x28b0|70 26 00 cd ae 01 00 00 10 09 00 00 79 04 ea ef|p&..........y...| * |until 0x2ada.7 (559) | | -0x28a0| 00 00 00 00| ....| xl_xid: 0 0x28ac-0x28af.7 (4) -0x28b0|70 26 00 cd ae 01 00 00 |p&...... | xl_prev: "1AE/CD002670" (1850275276400) 0x28b0-0x28b7.7 (8) -0x28b0| 10 | . | xl_info: 16 0x28b8-0x28b8.7 (1) -0x28b0| 09 | . | xl_rmid: 9 0x28b9-0x28b9.7 (1) -0x28b0| 00 00 | .. | hole1: 0 0x28ba-0x28bb.7 (2) -0x28b0| 79 04 ea ef| y...| xl_crc: 4025091193 0x28bc-0x28bf.7 (4) -0x2ad0| 00 00 00 00 00| .....| align0: raw bits 0x2adb-0x2adf.7 (5) - | | | [4]{}: XLogRecord 0x2ae0-0x2d17.7 (568) - | | | lsn: "1AE/CD002AE0" (1850275277536) 0x2ae0-NA (0) -0x2ae0|33 02 00 00 |3... | xl_tot_len: 563 0x2ae0-0x2ae3.7 (4) -0x2ae0| 00 00 00 00 a8 28 00 cd ae 01 00 00| .....(......| xLogBody0: raw bits 0x2ae4-0x2d12.7 (559) +0x28a0| 00 00 00 00| ....| xl_xid: 0 0x28ac-0x28af.7 (4) +0x28b0|70 26 00 cd ae 01 00 00 |p&...... | xl_prev: "1AE/CD002670" (1850275276400) 0x28b0-0x28b7.7 (8) +0x28b0| 10 | . | xl_info: 16 0x28b8-0x28b8.7 (1) +0x28b0| 09 | . | xl_rmid: 9 0x28b9-0x28b9.7 (1) +0x28b0| 00 00 | .. | hole1: 0 0x28ba-0x28bb.7 (2) +0x28b0| 79 04 ea ef| y...| xl_crc: 4025091193 0x28bc-0x28bf.7 (4) +0x2ad0| 00 00 00 00 00| .....| align0: raw bits 0x2adb-0x2adf.7 (5) + | | | [4]{}: xlog_record 0x2ae0-0x2d17.7 (568) + | | | lsn: "1AE/CD002AE0" (1850275277536) 0x2ae0-NA (0) +0x2ae0|33 02 00 00 |3... | xl_tot_len: 563 0x2ae0-0x2ae3.7 (4) +0x2ae0| 00 00 00 00 a8 28 00 cd ae 01 00 00| .....(......| xlog_body0: raw bits 0x2ae4-0x2d12.7 (559) 0x2af0|10 09 00 00 b2 37 ea f5 00 10 00 00 f8 01 f8 01|.....7..........| * |until 0x2d12.7 (559) | | -0x2ae0| 00 00 00 00 | .... | xl_xid: 0 0x2ae4-0x2ae7.7 (4) -0x2ae0| a8 28 00 cd ae 01 00 00| .(......| xl_prev: "1AE/CD0028A8" (1850275276968) 0x2ae8-0x2aef.7 (8) -0x2af0|10 |. | xl_info: 16 0x2af0-0x2af0.7 (1) -0x2af0| 09 | . | xl_rmid: 9 0x2af1-0x2af1.7 (1) -0x2af0| 00 00 | .. | hole1: 0 0x2af2-0x2af3.7 (2) -0x2af0| b2 37 ea f5 | .7.. | xl_crc: 4125767602 0x2af4-0x2af7.7 (4) -0x2d10| 00 00 00 00 00 | ..... | align0: raw bits 0x2d13-0x2d17.7 (5) - | | | [5]{}: XLogRecord 0x2d18-0x2f4f.7 (568) - | | | lsn: "1AE/CD002D18" (1850275278104) 0x2d18-NA (0) -0x2d10| 33 02 00 00 | 3... | xl_tot_len: 563 0x2d18-0x2d1b.7 (4) -0x2d10| 00 00 00 00| ....| xLogBody0: raw bits 0x2d1c-0x2f4a.7 (559) +0x2ae0| 00 00 00 00 | .... | xl_xid: 0 0x2ae4-0x2ae7.7 (4) +0x2ae0| a8 28 00 cd ae 01 00 00| .(......| xl_prev: "1AE/CD0028A8" (1850275276968) 0x2ae8-0x2aef.7 (8) +0x2af0|10 |. | xl_info: 16 0x2af0-0x2af0.7 (1) +0x2af0| 09 | . | xl_rmid: 9 0x2af1-0x2af1.7 (1) +0x2af0| 00 00 | .. | hole1: 0 0x2af2-0x2af3.7 (2) +0x2af0| b2 37 ea f5 | .7.. | xl_crc: 4125767602 0x2af4-0x2af7.7 (4) +0x2d10| 00 00 00 00 00 | ..... | align0: raw bits 0x2d13-0x2d17.7 (5) + | | | [5]{}: xlog_record 0x2d18-0x2f4f.7 (568) + | | | lsn: "1AE/CD002D18" (1850275278104) 0x2d18-NA (0) +0x2d10| 33 02 00 00 | 3... | xl_tot_len: 563 0x2d18-0x2d1b.7 (4) +0x2d10| 00 00 00 00| ....| xlog_body0: raw bits 0x2d1c-0x2f4a.7 (559) 0x2d20|e0 2a 00 cd ae 01 00 00 10 09 00 00 b2 22 7d b8|.*..........."}.| * |until 0x2f4a.7 (559) | | -0x2d10| 00 00 00 00| ....| xl_xid: 0 0x2d1c-0x2d1f.7 (4) -0x2d20|e0 2a 00 cd ae 01 00 00 |.*...... | xl_prev: "1AE/CD002AE0" (1850275277536) 0x2d20-0x2d27.7 (8) -0x2d20| 10 | . | xl_info: 16 0x2d28-0x2d28.7 (1) -0x2d20| 09 | . | xl_rmid: 9 0x2d29-0x2d29.7 (1) -0x2d20| 00 00 | .. | hole1: 0 0x2d2a-0x2d2b.7 (2) -0x2d20| b2 22 7d b8| ."}.| xl_crc: 3095208626 0x2d2c-0x2d2f.7 (4) -0x2f40| 00 00 00 00 00| .....| align0: raw bits 0x2f4b-0x2f4f.7 (5) - | | | [6]{}: XLogRecord 0x2f50-0x3187.7 (568) - | | | lsn: "1AE/CD002F50" (1850275278672) 0x2f50-NA (0) -0x2f50|33 02 00 00 |3... | xl_tot_len: 563 0x2f50-0x2f53.7 (4) -0x2f50| 00 00 00 00 18 2d 00 cd ae 01 00 00| .....-......| xLogBody0: raw bits 0x2f54-0x3182.7 (559) +0x2d10| 00 00 00 00| ....| xl_xid: 0 0x2d1c-0x2d1f.7 (4) +0x2d20|e0 2a 00 cd ae 01 00 00 |.*...... | xl_prev: "1AE/CD002AE0" (1850275277536) 0x2d20-0x2d27.7 (8) +0x2d20| 10 | . | xl_info: 16 0x2d28-0x2d28.7 (1) +0x2d20| 09 | . | xl_rmid: 9 0x2d29-0x2d29.7 (1) +0x2d20| 00 00 | .. | hole1: 0 0x2d2a-0x2d2b.7 (2) +0x2d20| b2 22 7d b8| ."}.| xl_crc: 3095208626 0x2d2c-0x2d2f.7 (4) +0x2f40| 00 00 00 00 00| .....| align0: raw bits 0x2f4b-0x2f4f.7 (5) + | | | [6]{}: xlog_record 0x2f50-0x3187.7 (568) + | | | lsn: "1AE/CD002F50" (1850275278672) 0x2f50-NA (0) +0x2f50|33 02 00 00 |3... | xl_tot_len: 563 0x2f50-0x2f53.7 (4) +0x2f50| 00 00 00 00 18 2d 00 cd ae 01 00 00| .....-......| xlog_body0: raw bits 0x2f54-0x3182.7 (559) 0x2f60|10 09 00 00 80 96 72 1a 00 10 00 00 f8 01 f8 01|......r.........| * |until 0x3182.7 (559) | | -0x2f50| 00 00 00 00 | .... | xl_xid: 0 0x2f54-0x2f57.7 (4) -0x2f50| 18 2d 00 cd ae 01 00 00| .-......| xl_prev: "1AE/CD002D18" (1850275278104) 0x2f58-0x2f5f.7 (8) -0x2f60|10 |. | xl_info: 16 0x2f60-0x2f60.7 (1) -0x2f60| 09 | . | xl_rmid: 9 0x2f61-0x2f61.7 (1) -0x2f60| 00 00 | .. | hole1: 0 0x2f62-0x2f63.7 (2) -0x2f60| 80 96 72 1a | ..r. | xl_crc: 443717248 0x2f64-0x2f67.7 (4) -0x3180| 00 00 00 00 00 | ..... | align0: raw bits 0x3183-0x3187.7 (5) - | | | [7]{}: XLogRecord 0x3188-0x33bf.7 (568) - | | | lsn: "1AE/CD003188" (1850275279240) 0x3188-NA (0) -0x3180| 33 02 00 00 | 3... | xl_tot_len: 563 0x3188-0x318b.7 (4) -0x3180| 00 00 00 00| ....| xLogBody0: raw bits 0x318c-0x33ba.7 (559) +0x2f50| 00 00 00 00 | .... | xl_xid: 0 0x2f54-0x2f57.7 (4) +0x2f50| 18 2d 00 cd ae 01 00 00| .-......| xl_prev: "1AE/CD002D18" (1850275278104) 0x2f58-0x2f5f.7 (8) +0x2f60|10 |. | xl_info: 16 0x2f60-0x2f60.7 (1) +0x2f60| 09 | . | xl_rmid: 9 0x2f61-0x2f61.7 (1) +0x2f60| 00 00 | .. | hole1: 0 0x2f62-0x2f63.7 (2) +0x2f60| 80 96 72 1a | ..r. | xl_crc: 443717248 0x2f64-0x2f67.7 (4) +0x3180| 00 00 00 00 00 | ..... | align0: raw bits 0x3183-0x3187.7 (5) + | | | [7]{}: xlog_record 0x3188-0x33bf.7 (568) + | | | lsn: "1AE/CD003188" (1850275279240) 0x3188-NA (0) +0x3180| 33 02 00 00 | 3... | xl_tot_len: 563 0x3188-0x318b.7 (4) +0x3180| 00 00 00 00| ....| xlog_body0: raw bits 0x318c-0x33ba.7 (559) 0x3190|50 2f 00 cd ae 01 00 00 10 09 00 00 1f 08 37 dc|P/............7.| * |until 0x33ba.7 (559) | | -0x3180| 00 00 00 00| ....| xl_xid: 0 0x318c-0x318f.7 (4) -0x3190|50 2f 00 cd ae 01 00 00 |P/...... | xl_prev: "1AE/CD002F50" (1850275278672) 0x3190-0x3197.7 (8) -0x3190| 10 | . | xl_info: 16 0x3198-0x3198.7 (1) -0x3190| 09 | . | xl_rmid: 9 0x3199-0x3199.7 (1) -0x3190| 00 00 | .. | hole1: 0 0x319a-0x319b.7 (2) -0x3190| 1f 08 37 dc| ..7.| xl_crc: 3694594079 0x319c-0x319f.7 (4) -0x33b0| 00 00 00 00 00| .....| align0: raw bits 0x33bb-0x33bf.7 (5) - | | | [8]{}: XLogRecord 0x33c0-0x35f7.7 (568) - | | | lsn: "1AE/CD0033C0" (1850275279808) 0x33c0-NA (0) -0x33c0|33 02 00 00 |3... | xl_tot_len: 563 0x33c0-0x33c3.7 (4) -0x33c0| 00 00 00 00 88 31 00 cd ae 01 00 00| .....1......| xLogBody0: raw bits 0x33c4-0x35f2.7 (559) +0x3180| 00 00 00 00| ....| xl_xid: 0 0x318c-0x318f.7 (4) +0x3190|50 2f 00 cd ae 01 00 00 |P/...... | xl_prev: "1AE/CD002F50" (1850275278672) 0x3190-0x3197.7 (8) +0x3190| 10 | . | xl_info: 16 0x3198-0x3198.7 (1) +0x3190| 09 | . | xl_rmid: 9 0x3199-0x3199.7 (1) +0x3190| 00 00 | .. | hole1: 0 0x319a-0x319b.7 (2) +0x3190| 1f 08 37 dc| ..7.| xl_crc: 3694594079 0x319c-0x319f.7 (4) +0x33b0| 00 00 00 00 00| .....| align0: raw bits 0x33bb-0x33bf.7 (5) + | | | [8]{}: xlog_record 0x33c0-0x35f7.7 (568) + | | | lsn: "1AE/CD0033C0" (1850275279808) 0x33c0-NA (0) +0x33c0|33 02 00 00 |3... | xl_tot_len: 563 0x33c0-0x33c3.7 (4) +0x33c0| 00 00 00 00 88 31 00 cd ae 01 00 00| .....1......| xlog_body0: raw bits 0x33c4-0x35f2.7 (559) 0x33d0|10 09 00 00 65 b1 ef 38 00 10 00 00 f8 01 f8 01|....e..8........| * |until 0x35f2.7 (559) | | -0x33c0| 00 00 00 00 | .... | xl_xid: 0 0x33c4-0x33c7.7 (4) -0x33c0| 88 31 00 cd ae 01 00 00| .1......| xl_prev: "1AE/CD003188" (1850275279240) 0x33c8-0x33cf.7 (8) -0x33d0|10 |. | xl_info: 16 0x33d0-0x33d0.7 (1) -0x33d0| 09 | . | xl_rmid: 9 0x33d1-0x33d1.7 (1) -0x33d0| 00 00 | .. | hole1: 0 0x33d2-0x33d3.7 (2) -0x33d0| 65 b1 ef 38 | e..8 | xl_crc: 955232613 0x33d4-0x33d7.7 (4) -0x35f0| 00 00 00 00 00 | ..... | align0: raw bits 0x35f3-0x35f7.7 (5) - | | | [9]{}: XLogRecord 0x35f8-0x382f.7 (568) - | | | lsn: "1AE/CD0035F8" (1850275280376) 0x35f8-NA (0) -0x35f0| 33 02 00 00 | 3... | xl_tot_len: 563 0x35f8-0x35fb.7 (4) -0x35f0| 00 00 00 00| ....| xLogBody0: raw bits 0x35fc-0x382a.7 (559) +0x33c0| 00 00 00 00 | .... | xl_xid: 0 0x33c4-0x33c7.7 (4) +0x33c0| 88 31 00 cd ae 01 00 00| .1......| xl_prev: "1AE/CD003188" (1850275279240) 0x33c8-0x33cf.7 (8) +0x33d0|10 |. | xl_info: 16 0x33d0-0x33d0.7 (1) +0x33d0| 09 | . | xl_rmid: 9 0x33d1-0x33d1.7 (1) +0x33d0| 00 00 | .. | hole1: 0 0x33d2-0x33d3.7 (2) +0x33d0| 65 b1 ef 38 | e..8 | xl_crc: 955232613 0x33d4-0x33d7.7 (4) +0x35f0| 00 00 00 00 00 | ..... | align0: raw bits 0x35f3-0x35f7.7 (5) + | | | [9]{}: xlog_record 0x35f8-0x382f.7 (568) + | | | lsn: "1AE/CD0035F8" (1850275280376) 0x35f8-NA (0) +0x35f0| 33 02 00 00 | 3... | xl_tot_len: 563 0x35f8-0x35fb.7 (4) +0x35f0| 00 00 00 00| ....| xlog_body0: raw bits 0x35fc-0x382a.7 (559) 0x3600|c0 33 00 cd ae 01 00 00 10 09 00 00 32 e8 42 32|.3..........2.B2| * |until 0x382a.7 (559) | | -0x35f0| 00 00 00 00| ....| xl_xid: 0 0x35fc-0x35ff.7 (4) -0x3600|c0 33 00 cd ae 01 00 00 |.3...... | xl_prev: "1AE/CD0033C0" (1850275279808) 0x3600-0x3607.7 (8) -0x3600| 10 | . | xl_info: 16 0x3608-0x3608.7 (1) -0x3600| 09 | . | xl_rmid: 9 0x3609-0x3609.7 (1) -0x3600| 00 00 | .. | hole1: 0 0x360a-0x360b.7 (2) -0x3600| 32 e8 42 32| 2.B2| xl_crc: 843245618 0x360c-0x360f.7 (4) -0x3820| 00 00 00 00 00| .....| align0: raw bits 0x382b-0x382f.7 (5) - | | | [10]{}: XLogRecord 0x3830-0x3a67.7 (568) - | | | lsn: "1AE/CD003830" (1850275280944) 0x3830-NA (0) -0x3830|33 02 00 00 |3... | xl_tot_len: 563 0x3830-0x3833.7 (4) -0x3830| 00 00 00 00 f8 35 00 cd ae 01 00 00| .....5......| xLogBody0: raw bits 0x3834-0x3a62.7 (559) +0x35f0| 00 00 00 00| ....| xl_xid: 0 0x35fc-0x35ff.7 (4) +0x3600|c0 33 00 cd ae 01 00 00 |.3...... | xl_prev: "1AE/CD0033C0" (1850275279808) 0x3600-0x3607.7 (8) +0x3600| 10 | . | xl_info: 16 0x3608-0x3608.7 (1) +0x3600| 09 | . | xl_rmid: 9 0x3609-0x3609.7 (1) +0x3600| 00 00 | .. | hole1: 0 0x360a-0x360b.7 (2) +0x3600| 32 e8 42 32| 2.B2| xl_crc: 843245618 0x360c-0x360f.7 (4) +0x3820| 00 00 00 00 00| .....| align0: raw bits 0x382b-0x382f.7 (5) + | | | [10]{}: xlog_record 0x3830-0x3a67.7 (568) + | | | lsn: "1AE/CD003830" (1850275280944) 0x3830-NA (0) +0x3830|33 02 00 00 |3... | xl_tot_len: 563 0x3830-0x3833.7 (4) +0x3830| 00 00 00 00 f8 35 00 cd ae 01 00 00| .....5......| xlog_body0: raw bits 0x3834-0x3a62.7 (559) 0x3840|10 09 00 00 47 bd 15 95 00 10 00 00 f8 01 f8 01|....G...........| * |until 0x3a62.7 (559) | | -0x3830| 00 00 00 00 | .... | xl_xid: 0 0x3834-0x3837.7 (4) -0x3830| f8 35 00 cd ae 01 00 00| .5......| xl_prev: "1AE/CD0035F8" (1850275280376) 0x3838-0x383f.7 (8) -0x3840|10 |. | xl_info: 16 0x3840-0x3840.7 (1) -0x3840| 09 | . | xl_rmid: 9 0x3841-0x3841.7 (1) -0x3840| 00 00 | .. | hole1: 0 0x3842-0x3843.7 (2) -0x3840| 47 bd 15 95 | G... | xl_crc: 2501229895 0x3844-0x3847.7 (4) -0x3a60| 00 00 00 00 00 | ..... | align0: raw bits 0x3a63-0x3a67.7 (5) - | | | [11]{}: XLogRecord 0x3a68-0x3c9f.7 (568) - | | | lsn: "1AE/CD003A68" (1850275281512) 0x3a68-NA (0) -0x3a60| 33 02 00 00 | 3... | xl_tot_len: 563 0x3a68-0x3a6b.7 (4) -0x3a60| 00 00 00 00| ....| xLogBody0: raw bits 0x3a6c-0x3c9a.7 (559) +0x3830| 00 00 00 00 | .... | xl_xid: 0 0x3834-0x3837.7 (4) +0x3830| f8 35 00 cd ae 01 00 00| .5......| xl_prev: "1AE/CD0035F8" (1850275280376) 0x3838-0x383f.7 (8) +0x3840|10 |. | xl_info: 16 0x3840-0x3840.7 (1) +0x3840| 09 | . | xl_rmid: 9 0x3841-0x3841.7 (1) +0x3840| 00 00 | .. | hole1: 0 0x3842-0x3843.7 (2) +0x3840| 47 bd 15 95 | G... | xl_crc: 2501229895 0x3844-0x3847.7 (4) +0x3a60| 00 00 00 00 00 | ..... | align0: raw bits 0x3a63-0x3a67.7 (5) + | | | [11]{}: xlog_record 0x3a68-0x3c9f.7 (568) + | | | lsn: "1AE/CD003A68" (1850275281512) 0x3a68-NA (0) +0x3a60| 33 02 00 00 | 3... | xl_tot_len: 563 0x3a68-0x3a6b.7 (4) +0x3a60| 00 00 00 00| ....| xlog_body0: raw bits 0x3a6c-0x3c9a.7 (559) 0x3a70|30 38 00 cd ae 01 00 00 10 09 00 00 14 a8 35 e0|08............5.| * |until 0x3c9a.7 (559) | | -0x3a60| 00 00 00 00| ....| xl_xid: 0 0x3a6c-0x3a6f.7 (4) -0x3a70|30 38 00 cd ae 01 00 00 |08...... | xl_prev: "1AE/CD003830" (1850275280944) 0x3a70-0x3a77.7 (8) -0x3a70| 10 | . | xl_info: 16 0x3a78-0x3a78.7 (1) -0x3a70| 09 | . | xl_rmid: 9 0x3a79-0x3a79.7 (1) -0x3a70| 00 00 | .. | hole1: 0 0x3a7a-0x3a7b.7 (2) -0x3a70| 14 a8 35 e0| ..5.| xl_crc: 3761612820 0x3a7c-0x3a7f.7 (4) -0x3c90| 00 00 00 00 00| .....| align0: raw bits 0x3c9b-0x3c9f.7 (5) - | | | [12]{}: XLogRecord 0x3ca0-0x3ed7.7 (568) - | | | lsn: "1AE/CD003CA0" (1850275282080) 0x3ca0-NA (0) -0x3ca0|33 02 00 00 |3... | xl_tot_len: 563 0x3ca0-0x3ca3.7 (4) -0x3ca0| 00 00 00 00 68 3a 00 cd ae 01 00 00| ....h:......| xLogBody0: raw bits 0x3ca4-0x3ed2.7 (559) +0x3a60| 00 00 00 00| ....| xl_xid: 0 0x3a6c-0x3a6f.7 (4) +0x3a70|30 38 00 cd ae 01 00 00 |08...... | xl_prev: "1AE/CD003830" (1850275280944) 0x3a70-0x3a77.7 (8) +0x3a70| 10 | . | xl_info: 16 0x3a78-0x3a78.7 (1) +0x3a70| 09 | . | xl_rmid: 9 0x3a79-0x3a79.7 (1) +0x3a70| 00 00 | .. | hole1: 0 0x3a7a-0x3a7b.7 (2) +0x3a70| 14 a8 35 e0| ..5.| xl_crc: 3761612820 0x3a7c-0x3a7f.7 (4) +0x3c90| 00 00 00 00 00| .....| align0: raw bits 0x3c9b-0x3c9f.7 (5) + | | | [12]{}: xlog_record 0x3ca0-0x3ed7.7 (568) + | | | lsn: "1AE/CD003CA0" (1850275282080) 0x3ca0-NA (0) +0x3ca0|33 02 00 00 |3... | xl_tot_len: 563 0x3ca0-0x3ca3.7 (4) +0x3ca0| 00 00 00 00 68 3a 00 cd ae 01 00 00| ....h:......| xlog_body0: raw bits 0x3ca4-0x3ed2.7 (559) 0x3cb0|10 09 00 00 84 11 b3 9e 00 10 00 00 f8 01 f8 01|................| * |until 0x3ed2.7 (559) | | -0x3ca0| 00 00 00 00 | .... | xl_xid: 0 0x3ca4-0x3ca7.7 (4) -0x3ca0| 68 3a 00 cd ae 01 00 00| h:......| xl_prev: "1AE/CD003A68" (1850275281512) 0x3ca8-0x3caf.7 (8) -0x3cb0|10 |. | xl_info: 16 0x3cb0-0x3cb0.7 (1) -0x3cb0| 09 | . | xl_rmid: 9 0x3cb1-0x3cb1.7 (1) -0x3cb0| 00 00 | .. | hole1: 0 0x3cb2-0x3cb3.7 (2) -0x3cb0| 84 11 b3 9e | .... | xl_crc: 2662535556 0x3cb4-0x3cb7.7 (4) -0x3ed0| 00 00 00 00 00 | ..... | align0: raw bits 0x3ed3-0x3ed7.7 (5) - | | | [13]{}: XLogRecord 0x3ed8-0x3fff.7 (296) - | | | lsn: "1AE/CD003ED8" (1850275282648) 0x3ed8-NA (0) -0x3ed0| 33 02 00 00 | 3... | xl_tot_len: 563 0x3ed8-0x3edb.7 (4) -0x3ed0| 00 00 00 00| ....| xLogBody0: raw bits 0x3edc-0x3fff.7 (292) +0x3ca0| 00 00 00 00 | .... | xl_xid: 0 0x3ca4-0x3ca7.7 (4) +0x3ca0| 68 3a 00 cd ae 01 00 00| h:......| xl_prev: "1AE/CD003A68" (1850275281512) 0x3ca8-0x3caf.7 (8) +0x3cb0|10 |. | xl_info: 16 0x3cb0-0x3cb0.7 (1) +0x3cb0| 09 | . | xl_rmid: 9 0x3cb1-0x3cb1.7 (1) +0x3cb0| 00 00 | .. | hole1: 0 0x3cb2-0x3cb3.7 (2) +0x3cb0| 84 11 b3 9e | .... | xl_crc: 2662535556 0x3cb4-0x3cb7.7 (4) +0x3ed0| 00 00 00 00 00 | ..... | align0: raw bits 0x3ed3-0x3ed7.7 (5) + | | | [13]{}: xlog_record 0x3ed8-0x3fff.7 (296) + | | | lsn: "1AE/CD003ED8" (1850275282648) 0x3ed8-NA (0) +0x3ed0| 33 02 00 00 | 3... | xl_tot_len: 563 0x3ed8-0x3edb.7 (4) +0x3ed0| 00 00 00 00| ....| xlog_body0: raw bits 0x3edc-0x3fff.7 (292) 0x3ee0|a0 3c 00 cd ae 01 00 00 10 09 00 00 f5 86 96 77|.<.............w| * |until 0x3fff.7 (end) (292) | | -0x3ed0| 00 00 00 00| ....| xl_xid: 0 0x3edc-0x3edf.7 (4) -0x3ee0|a0 3c 00 cd ae 01 00 00 |.<...... | xl_prev: "1AE/CD003CA0" (1850275282080) 0x3ee0-0x3ee7.7 (8) -0x3ee0| 10 | . | xl_info: 16 0x3ee8-0x3ee8.7 (1) -0x3ee0| 09 | . | xl_rmid: 9 0x3ee9-0x3ee9.7 (1) -0x3ee0| 00 00 | .. | hole1: 0 0x3eea-0x3eeb.7 (2) -0x3ee0| f5 86 96 77| ...w| xl_crc: 2006353653 0x3eec-0x3eef.7 (4) +0x3ed0| 00 00 00 00| ....| xl_xid: 0 0x3edc-0x3edf.7 (4) +0x3ee0|a0 3c 00 cd ae 01 00 00 |.<...... | xl_prev: "1AE/CD003CA0" (1850275282080) 0x3ee0-0x3ee7.7 (8) +0x3ee0| 10 | . | xl_info: 16 0x3ee8-0x3ee8.7 (1) +0x3ee0| 09 | . | xl_rmid: 9 0x3ee9-0x3ee9.7 (1) +0x3ee0| 00 00 | .. | hole1: 0 0x3eea-0x3eeb.7 (2) +0x3ee0| f5 86 96 77| ...w| xl_crc: 2006353653 0x3eec-0x3eef.7 (4) From de68785a8d3cc504e21cc48a259a161e25cf2439 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 31 Oct 2022 08:36:57 +0300 Subject: [PATCH 116/141] postgres: add test files --- .../pgproee10/000000010000000000000001 | Bin 0 -> 16384 bytes .../000000010000000000000001_1.fqtest | 67 ++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 format/postgres/testdata/flavours/pgproee10/000000010000000000000001 create mode 100644 format/postgres/testdata/flavours/pgproee10/000000010000000000000001_1.fqtest diff --git a/format/postgres/testdata/flavours/pgproee10/000000010000000000000001 b/format/postgres/testdata/flavours/pgproee10/000000010000000000000001 new file mode 100644 index 0000000000000000000000000000000000000000..d2bbf69a174a0287b83bfd4a1778de65f6026622 GIT binary patch literal 16384 zcmeI2y-EW?5P;`$iH(hdq~1=ku-5mmv$V7pEQA!kflbgVjZfec*x3kq0Kr1R!a@{m zEIjw;rnz{yB)Mdhd<(a;GdsIG`whn(?DmH($;6jZ1m&iCa(DZ9bZoUujL3B`|5?9X zJnR=|JI>Pwz0A8HIdKGu6Hce;yLuIt@sH2s+Uoe-gV-@gdQEG(G0Bl z^1XX5o3>#@+P$?9-fLULg{7spC$i;S%#Tr9o=a}q?r}wB&_;E&tE~E~JyuRSK6aft zzj?1;7uT%ptG@qPaZYs|@}FvEhzkPE6X5-Co-r#x00Izz00fdFzz;xjDIp*TKmY;| zfB*y_009U<00Iygk3fIe@u&6n;M*UaXTBb9u4Nomy;pD_ZV$-7Zua!*`)lN0!BfP& z0t?w;R@5q$UsYGT%K!S+uTD-nzHZ)F`@GkWjk77gRo{P8To+|t^1mpVB2EZQp8)Uw p^qDdv1Rwwb2tXip0(}2d&k*rJ00Izz00bZa0SG_<0uWd}0>4SHB>?~c literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee10/000000010000000000000001_1.fqtest b/format/postgres/testdata/flavours/pgproee10/000000010000000000000001_1.fqtest new file mode 100644 index 000000000..249a401c6 --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee10/000000010000000000000001_1.fqtest @@ -0,0 +1,67 @@ +$ fq -d pg_wal -o flavour=pgproee11 "dv" 000000010000000000000001 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0:2]: 000000010000000000000001 (pg_wal) 0x0-0x3fff.7 (16384) + | | | [0]{}: page 0x0-0x211f.7 (8480) + | | | xloog_page_header_data{}: 0x0-0x27.7 (40) +0x0000|97 d0 |.. | xlp_magic: 53399 0x0-0x1.7 (2) +0x0000| 02 00 | .. | xlp_info: 2 0x2-0x3.7 (2) +0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) +0x0000| 00 00 00 01 00 00 00 00| ........| xlp_pageaddr: 16777216 0x8-0xf.7 (8) +0x0010|00 00 00 00 |.... | xlp_rem_len: 0 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) + | | | xlog_long_page_header_data{}: 0x18-0x27.7 (16) +0x0010| a5 16 6b c1 b3 dc 5b 63| ..k...[c| xlp_sysid: 7159558697237812901 0x18-0x1f.7 (8) +0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) +0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) + | | | records[0:2]: 0x28-0x211f.7 (8440) + | | | [0]{}: xlog_record 0x28-0xc7.7 (160) + | | | lsn: "0/1000028" (16777256) 0x28-NA (0) +0x0020| 9a 00 00 00 | .... | xl_tot_len: 154 0x28-0x2b.7 (4) +0x0020| 00 00 00 00| ....| xlog_body0: raw bits 0x2c-0xc1.7 (150) +0x0030|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0xc1.7 (150) | | +0x0020| 00 00 00 00| ....| hole0: 0 0x2c-0x2f.7 (4) +0x0030|00 00 00 00 00 00 00 00 |........ | xl_xid: 0 0x30-0x37.7 (8) +0x0030| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x38-0x3f.7 (8) +0x0040|00 |. | xl_info: 0 0x40-0x40.7 (1) +0x0040| 00 | . | xl_rmid: 0 0x41-0x41.7 (1) +0x0040| 00 00 | .. | hole1: 0 0x42-0x43.7 (2) +0x0040| eb 83 cd 38 | ...8 | xl_crc: 952992747 0x44-0x47.7 (4) +0x00c0| 00 00 00 00 00 00 | ...... | align0: raw bits 0xc2-0xc7.7 (6) + | | | [1]{}: xlog_record 0xc8-0x211f.7 (8280) + | | | lsn: "0/10000C8" (16777416) 0xc8-NA (0) +0x00c0| 39 20 00 00 | 9 .. | xl_tot_len: 8249 0xc8-0xcb.7 (4) +0x00c0| 00 00 00 00| ....| xlog_body0: raw bits 0xcc-0x1fff.7 (7988) +0x00d0|01 00 00 00 00 00 00 00 28 00 00 01 00 00 00 00|........(.......| +* |until 0x1fff.7 (7988) | | +0x00c0| 00 00 00 00| ....| hole0: 0 0xcc-0xcf.7 (4) +0x00d0|01 00 00 00 00 00 00 00 |........ | xl_xid: 1 0xd0-0xd7.7 (8) +0x00d0| 28 00 00 01 00 00 00 00| (.......| xl_prev: "0/1000028" (16777256) 0xd8-0xdf.7 (8) +0x00e0|a0 |. | xl_info: 160 0xe0-0xe0.7 (1) +0x00e0| 00 | . | xl_rmid: 0 0xe1-0xe1.7 (1) +0x00e0| 00 00 | .. | hole1: 0 0xe2-0xe3.7 (2) +0x00e0| 92 ef 16 7c | ...| | xl_crc: 2081877906 0xe4-0xe7.7 (4) +0x2010| 00 00 00 00 00 00 00 00| ........| xlog_body1: raw bits 0x2018-0x211f.7 (264) +0x2020|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x211f.7 (264) | | + | | | [1]{}: page 0x2000-0x3fff.7 (8192) + | | | xloog_page_header_data{}: 0x2000-0x2017.7 (24) +0x2000|97 d0 |.. | xlp_magic: 53399 0x2000-0x2001.7 (2) +0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) +0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) +0x2000| 00 20 00 01 00 00 00 00| . ......| xlp_pageaddr: 16785408 0x2008-0x200f.7 (8) +0x2010|01 01 00 00 |.... | xlp_rem_len: 257 0x2010-0x2013.7 (4) +0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) + | | | records[0:1]: 0x2120-0x3fff.7 (7904) + | | | [0]{}: xlog_record 0x2120-0x3fff.7 (7904) + | | | lsn: "0/1002120" (16785696) 0x2120-NA (0) +0x2120|39 20 00 00 |9 .. | xl_tot_len: 8249 0x2120-0x2123.7 (4) +0x2120| 00 00 00 00 01 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2124-0x3fff.7 (7900) +0x2130|c8 00 00 01 00 00 00 00 a0 00 00 00 75 99 fa f5|............u...| +* |until 0x3fff.7 (end) (7900) | | +0x2120| 00 00 00 00 | .... | hole0: 0 0x2124-0x2127.7 (4) +0x2120| 01 00 00 00 00 00 00 00| ........| xl_xid: 1 0x2128-0x212f.7 (8) +0x2130|c8 00 00 01 00 00 00 00 |........ | xl_prev: "0/10000C8" (16777416) 0x2130-0x2137.7 (8) +0x2130| a0 | . | xl_info: 160 0x2138-0x2138.7 (1) +0x2130| 00 | . | xl_rmid: 0 0x2139-0x2139.7 (1) +0x2130| 00 00 | .. | hole1: 0 0x213a-0x213b.7 (2) +0x2130| 75 99 fa f5| u...| xl_crc: 4126841205 0x213c-0x213f.7 (4) From 3c7ed5d73c6e400b5dcf787b3a11fc9fb95cce73 Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 31 Oct 2022 09:32:31 +0300 Subject: [PATCH 117/141] postgres: add tests data --- .../flavours/pgpro10/000000010000000000000001 | Bin 0 -> 16384 bytes .../pgpro10/000000010000000000000001_1.fqtest | 64 ++++++++++ .../flavours/pgpro14/00000001000000000000000A | Bin 0 -> 16384 bytes .../pgpro14/00000001000000000000000A_1.fqtest | 116 ++++++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 format/postgres/testdata/flavours/pgpro10/000000010000000000000001 create mode 100644 format/postgres/testdata/flavours/pgpro10/000000010000000000000001_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro14/00000001000000000000000A create mode 100644 format/postgres/testdata/flavours/pgpro14/00000001000000000000000A_1.fqtest diff --git a/format/postgres/testdata/flavours/pgpro10/000000010000000000000001 b/format/postgres/testdata/flavours/pgpro10/000000010000000000000001 new file mode 100644 index 0000000000000000000000000000000000000000..4680b74ffdf4ccc6b9742efa6f32b0869e44d2b2 GIT binary patch literal 16384 zcmeI2u};G<5I`>>WkkTl=nYoB10nSfKp+PAiB9|iWz5n6AwGnyQ`e6D16HtWpVXRG zO;ty!)n_R=pYMD=zmt_A9*#>XWZr`C%IN3o?e+fd(Q1VlkrzL_{Qj7n{PwS$hi&eq zkJFFrb9xz!L07wzA-e6YYS+fk)abQ!y16~C<;-@htr{GAhgl_3+A(bpPa+r2#Z*Se zief1^+lWOZ?eb!vA*m4INr8;*XwVaZ)*QT-+yYJxy7UYxmApOA&`y$=RX}w zB0&HG5P$##av{L?KbK08Cj=k>0SG_<0uX=z1Rwwb2((3DIPUrX+s2FUwifC*uHGkj z55Mzkn@`ny{`_~JVA|k5L0QhP9O$(JmAb`P*Kw7b?CQ5p?mB;6+@|AQuirG!w)_r# z|7~&2B`)>PrBdVxf%F78|LK_$5dsi^00bbg?*#b%?|X&F4+0Q?00bZa0SG_<0uX=z H1Y!bzvRfF% literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgpro10/000000010000000000000001_1.fqtest b/format/postgres/testdata/flavours/pgpro10/000000010000000000000001_1.fqtest new file mode 100644 index 000000000..917c8c1e9 --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro10/000000010000000000000001_1.fqtest @@ -0,0 +1,64 @@ +$ fq -d pg_wal "dv" 000000010000000000000001 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0:2]: 000000010000000000000001 (pg_wal) 0x0-0x3fff.7 (16384) + | | | [0]{}: page 0x0-0x20e7.7 (8424) + | | | xloog_page_header_data{}: 0x0-0x27.7 (40) +0x0000|97 d0 |.. | xlp_magic: 53399 0x0-0x1.7 (2) +0x0000| 02 00 | .. | xlp_info: 2 0x2-0x3.7 (2) +0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) +0x0000| 00 00 00 01 00 00 00 00| ........| xlp_pageaddr: 16777216 0x8-0xf.7 (8) +0x0010|00 00 00 00 |.... | xlp_rem_len: 0 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) + | | | xlog_long_page_header_data{}: 0x18-0x27.7 (16) +0x0010| a5 f6 ad 96 85 60 5f 63| .....`_c| xlp_sysid: 7160548059417278117 0x18-0x1f.7 (8) +0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) +0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) + | | | records[0:2]: 0x28-0x20e7.7 (8384) + | | | [0]{}: xlog_record 0x28-0x97.7 (112) + | | | lsn: "0/1000028" (16777256) 0x28-NA (0) +0x0020| 6a 00 00 00 | j... | xl_tot_len: 106 0x28-0x2b.7 (4) +0x0020| 00 00 00 00| ....| xlog_body0: raw bits 0x2c-0x91.7 (102) +0x0030|00 00 00 00 00 00 00 00 00 00 00 00 00 a9 d6 0e|................| +* |until 0x91.7 (102) | | +0x0020| 00 00 00 00| ....| xl_xid: 0 0x2c-0x2f.7 (4) +0x0030|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x30-0x37.7 (8) +0x0030| 00 | . | xl_info: 0 0x38-0x38.7 (1) +0x0030| 00 | . | xl_rmid: 0 0x39-0x39.7 (1) +0x0030| 00 00 | .. | hole1: 0 0x3a-0x3b.7 (2) +0x0030| 00 a9 d6 0e| ....| xl_crc: 248948992 0x3c-0x3f.7 (4) +0x0090| 00 00 00 00 00 00 | ...... | align0: raw bits 0x92-0x97.7 (6) + | | | [1]{}: xlog_record 0x98-0x20e7.7 (8272) + | | | lsn: "0/1000098" (16777368) 0x98-NA (0) +0x0090| 31 20 00 00 | 1 .. | xl_tot_len: 8241 0x98-0x9b.7 (4) +0x0090| 01 00 00 00| ....| xlog_body0: raw bits 0x9c-0x1fff.7 (8036) +0x00a0|28 00 00 01 00 00 00 00 a0 00 00 00 4b 4d 12 a0|(...........KM..| +* |until 0x1fff.7 (8036) | | +0x0090| 01 00 00 00| ....| xl_xid: 1 0x9c-0x9f.7 (4) +0x00a0|28 00 00 01 00 00 00 00 |(....... | xl_prev: "0/1000028" (16777256) 0xa0-0xa7.7 (8) +0x00a0| a0 | . | xl_info: 160 0xa8-0xa8.7 (1) +0x00a0| 00 | . | xl_rmid: 0 0xa9-0xa9.7 (1) +0x00a0| 00 00 | .. | hole1: 0 0xaa-0xab.7 (2) +0x00a0| 4b 4d 12 a0| KM..| xl_crc: 2685553995 0xac-0xaf.7 (4) +0x2010| 00 00 00 00 00 00 00 00| ........| xlog_body1: raw bits 0x2018-0x20e7.7 (208) +0x2020|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x20e7.7 (208) | | + | | | [1]{}: page 0x2000-0x3fff.7 (8192) + | | | xloog_page_header_data{}: 0x2000-0x2017.7 (24) +0x2000|97 d0 |.. | xlp_magic: 53399 0x2000-0x2001.7 (2) +0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) +0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) +0x2000| 00 20 00 01 00 00 00 00| . ......| xlp_pageaddr: 16785408 0x2008-0x200f.7 (8) +0x2010|c9 00 00 00 |.... | xlp_rem_len: 201 0x2010-0x2013.7 (4) +0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) + | | | records[0:1]: 0x20e8-0x3fff.7 (7960) + | | | [0]{}: xlog_record 0x20e8-0x3fff.7 (7960) + | | | lsn: "0/10020E8" (16785640) 0x20e8-NA (0) +0x20e0| 31 20 00 00 | 1 .. | xl_tot_len: 8241 0x20e8-0x20eb.7 (4) +0x20e0| 01 00 00 00| ....| xlog_body0: raw bits 0x20ec-0x3fff.7 (7956) +0x20f0|98 00 00 01 00 00 00 00 a0 00 00 00 04 05 69 ab|..............i.| +* |until 0x3fff.7 (end) (7956) | | +0x20e0| 01 00 00 00| ....| xl_xid: 1 0x20ec-0x20ef.7 (4) +0x20f0|98 00 00 01 00 00 00 00 |........ | xl_prev: "0/1000098" (16777368) 0x20f0-0x20f7.7 (8) +0x20f0| a0 | . | xl_info: 160 0x20f8-0x20f8.7 (1) +0x20f0| 00 | . | xl_rmid: 0 0x20f9-0x20f9.7 (1) +0x20f0| 00 00 | .. | hole1: 0 0x20fa-0x20fb.7 (2) +0x20f0| 04 05 69 ab| ..i.| xl_crc: 2875786500 0x20fc-0x20ff.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro14/00000001000000000000000A b/format/postgres/testdata/flavours/pgpro14/00000001000000000000000A new file mode 100644 index 0000000000000000000000000000000000000000..992fe7e2fc1cd8eca3a786af04721a624728a250 GIT binary patch literal 16384 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 U&wKsZ`g~p~`{PS8&eFvH1Fe22J^%m! literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgpro14/00000001000000000000000A_1.fqtest b/format/postgres/testdata/flavours/pgpro14/00000001000000000000000A_1.fqtest new file mode 100644 index 000000000..ee083b753 --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro14/00000001000000000000000A_1.fqtest @@ -0,0 +1,116 @@ +$ fq -d pg_wal ".[0].records[0:10] | dv" 00000001000000000000000A +[ + { + "hole1": 0, + "lsn": "0/A000048", + "xl_crc": 162371186, + "xl_info": 64, + "xl_prev": "0/9FFFFD8", + "xl_rmid": 10, + "xl_tot_len": 72, + "xl_xid": 23351, + "xlog_body0": "<68>N1sAANj//wkAAAAAQAoAAHKWrQkAIAwAfwYAALc1AAAPQAAAAAAAAP8OCAAEgJEgGAc8df//N1sAALMAACA3WwAAvAA=" + }, + { + "hole1": 0, + "lsn": "0/A000090", + "xl_crc": 702343481, + "xl_info": 64, + "xl_prev": "0/A000048", + "xl_rmid": 10, + "xl_tot_len": 72, + "xl_xid": 23355, + "xlog_body0": "<68>O1sAAEgAAAoAAAAAQAoAADnp3CkAIAwAfwYAALc1AAAPQAAAAAAAAP8OCAAEgAEoGAc6CAEAO1sAAGYAACAAAAAAvgA=" + }, + { + "hole1": 0, + "lsn": "0/A0000D8", + "xl_crc": 642258824, + "xl_info": 64, + "xl_prev": "0/A000090", + "xl_rmid": 10, + "xl_tot_len": 72, + "xl_xid": 23358, + "xlog_body0": "<68>PlsAAJAAAAoAAAAAQAoAAIgXSCYAIAwAfwYAALc1AAAPQAAAAQAAAP8OCAAEgAEoGAensP//PlsAAGAAACAAAAAAcAA=" + }, + { + "hole1": 0, + "lsn": "0/A000120", + "xl_crc": 352113203, + "xl_info": 64, + "xl_prev": "0/A0000D8", + "xl_rmid": 10, + "xl_tot_len": 72, + "xl_xid": 23359, + "xlog_body0": "<68>P1sAANgAAAoAAAAAQAoAADPS/BQAIAwAfwYAALc1AAAPQAAAAAAAAP8OCAAEgAEoGAfz7v//P1sAAHgAACAAAAAAvwA=" + }, + { + "hole1": 0, + "lsn": "0/A000168", + "xl_crc": 1932211605, + "xl_info": 64, + "xl_prev": "0/A000120", + "xl_rmid": 10, + "xl_tot_len": 72, + "xl_xid": 23357, + "xlog_body0": "<68>PVsAACABAAoAAAAAQAoAAJU1K3MAIAwAfwYAALc1AAANQAAABQAAAP8OBAADgAEoGANBkgAAPVsAAC4AACAAAAAAMAA=" + }, + { + "hole1": 0, + "lsn": "0/A0001B0", + "xl_crc": 1172777075, + "xl_info": 64, + "xl_prev": "0/A000168", + "xl_rmid": 10, + "xl_tot_len": 72, + "xl_xid": 23355, + "xlog_body0": "<68>O1sAAGgBAAoAAAAAQAoAAHMo50UAIAwAfwYAALc1AAANQAAAAgAAAP8OBAADgAEoGANqYwUAO1sAAJAAACAAAAAAkgA=" + }, + { + "hole1": 0, + "lsn": "0/A0001F8", + "xl_crc": 3467337604, + "xl_info": 64, + "xl_prev": "0/A0001B0", + "xl_rmid": 10, + "xl_tot_len": 72, + "xl_xid": 23359, + "xlog_body0": "<68>P1sAALABAAoAAAAAQAoAAIRfq84AIAwAfwYAALc1AAANQAAABQAAAP8OBAADgAEoGANlw/7/P1sAACsAACAAAAAAMQA=" + }, + { + "align0": "<1>AA==", + "hole1": 0, + "lsn": "0/A000240", + "xl_crc": 2150511209, + "xl_info": 0, + "xl_prev": "0/A0001F8", + "xl_rmid": 10, + "xl_tot_len": 79, + "xl_xid": 23357, + "xlog_body0": "<75>PVsAAPgBAAoAAAAAAAoAAGkyLoAAIB4AfwYAALc1AAAWQAAAjQAAAP8DBgABCBgfKAAAAAoAAACEzwYAkPz///HDxkBNjwIASwAA" + }, + { + "align0": "<1>AA==", + "hole1": 0, + "lsn": "0/A000290", + "xl_crc": 1895222202, + "xl_info": 0, + "xl_prev": "0/A000240", + "xl_rmid": 10, + "xl_tot_len": 79, + "xl_xid": 23355, + "xlog_body0": "<75>O1sAAEACAAoAAAAAAAoAALrL9nAAIB4AfwYAALc1AAAWQAAAjgAAAP8DBgABCBgfDQAAAAEAAABQHQMA9e3//wTExkBNjwIAQgAA" + }, + { + "align0": "<1>AA==", + "hole1": 0, + "lsn": "0/A0002E0", + "xl_crc": 2165445570, + "xl_info": 0, + "xl_prev": "0/A000290", + "xl_rmid": 10, + "xl_tot_len": 79, + "xl_xid": 23359, + "xlog_body0": "<75>P1sAAJACAAoAAAAAAAoAAMITEoEAIB4AfwYAALc1AAAWQAAAkQAAAP8DBgABCBgfSgAAAAgAAACnUwQAvPL//xbExkBNjwIAOQAA" + } +] From 7fd41090e3ef5dba2eb364da8b5d3ad7511e170f Mon Sep 17 00:00:00 2001 From: Pavel Safonov Date: Mon, 31 Oct 2022 11:07:10 +0300 Subject: [PATCH 118/141] postgres: add btree index tests --- .../postgres/testdata/flavours/pgpro10/16401 | Bin 0 -> 16384 bytes .../testdata/flavours/pgpro10/16401_1.fqtest | 41 +++++++ .../testdata/flavours/pgpro10/16401_2.fqtest | 111 ++++++++++++++++++ .../postgres/testdata/flavours/pgpro14/16404 | Bin 0 -> 16384 bytes .../testdata/flavours/pgpro14/16404_1.fqtest | 41 +++++++ .../testdata/flavours/pgpro14/16404_2.fqtest | 111 ++++++++++++++++++ .../testdata/flavours/pgproee10/16401 | Bin 0 -> 16384 bytes .../flavours/pgproee10/16401_1.fqtest | 41 +++++++ .../flavours/pgproee10/16401_2.fqtest | 111 ++++++++++++++++++ .../testdata/flavours/pgproee14/16404 | Bin 0 -> 16384 bytes .../flavours/pgproee14/16404_1.fqtest | 41 +++++++ .../flavours/pgproee14/16404_2.fqtest | 111 ++++++++++++++++++ .../testdata/flavours/postgres10/16401 | Bin 0 -> 2260992 bytes .../flavours/postgres10/16401_1.fqtest | 41 +++++++ .../flavours/postgres10/16401_2.fqtest | 111 ++++++++++++++++++ 15 files changed, 760 insertions(+) create mode 100644 format/postgres/testdata/flavours/pgpro10/16401 create mode 100644 format/postgres/testdata/flavours/pgpro10/16401_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro10/16401_2.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro14/16404 create mode 100644 format/postgres/testdata/flavours/pgpro14/16404_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro14/16404_2.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee10/16401 create mode 100644 format/postgres/testdata/flavours/pgproee10/16401_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee10/16401_2.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee14/16404 create mode 100644 format/postgres/testdata/flavours/pgproee14/16404_1.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee14/16404_2.fqtest create mode 100644 format/postgres/testdata/flavours/postgres10/16401 create mode 100644 format/postgres/testdata/flavours/postgres10/16401_1.fqtest create mode 100644 format/postgres/testdata/flavours/postgres10/16401_2.fqtest diff --git a/format/postgres/testdata/flavours/pgpro10/16401 b/format/postgres/testdata/flavours/pgpro10/16401 new file mode 100644 index 0000000000000000000000000000000000000000..cf41ea27738d710cd373ee1cc418d6916cb4d052 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgpro10/16401_1.fqtest b/format/postgres/testdata/flavours/pgpro10/16401_1.fqtest new file mode 100644 index 000000000..3a224aa4e --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro10/16401_1.fqtest @@ -0,0 +1,41 @@ +$ fq -d pg_btree ".[1].pd_linp[0,1,2,3,4,5,6,7,8,9] | dv" 16401 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[0]{}: item_id 0x2018-0x201b.7 (4) +0x2010| 00 89 20 00 | .. . | lp_off: 2304 0x2018-0x201b.7 (4) +0x2010| 00 89 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2018-0x201b.7 (4) +0x2010| 00 89 20 00 | .. . | lp_len: 16 0x2018-0x201b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[1]{}: item_id 0x201c-0x201f.7 (4) +0x2010| e0 9f 20 00| .. .| lp_off: 8160 0x201c-0x201f.7 (4) +0x2010| e0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x201c-0x201f.7 (4) +0x2010| e0 9f 20 00| .. .| lp_len: 16 0x201c-0x201f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[2]{}: item_id 0x2020-0x2023.7 (4) +0x2020|d0 9f 20 00 |.. . | lp_off: 8144 0x2020-0x2023.7 (4) +0x2020|d0 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2020-0x2023.7 (4) +0x2020|d0 9f 20 00 |.. . | lp_len: 16 0x2020-0x2023.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[3]{}: item_id 0x2024-0x2027.7 (4) +0x2020| c0 9f 20 00 | .. . | lp_off: 8128 0x2024-0x2027.7 (4) +0x2020| c0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2024-0x2027.7 (4) +0x2020| c0 9f 20 00 | .. . | lp_len: 16 0x2024-0x2027.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[4]{}: item_id 0x2028-0x202b.7 (4) +0x2020| b0 9f 20 00 | .. . | lp_off: 8112 0x2028-0x202b.7 (4) +0x2020| b0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2028-0x202b.7 (4) +0x2020| b0 9f 20 00 | .. . | lp_len: 16 0x2028-0x202b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[5]{}: item_id 0x202c-0x202f.7 (4) +0x2020| a0 9f 20 00| .. .| lp_off: 8096 0x202c-0x202f.7 (4) +0x2020| a0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x202c-0x202f.7 (4) +0x2020| a0 9f 20 00| .. .| lp_len: 16 0x202c-0x202f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[6]{}: item_id 0x2030-0x2033.7 (4) +0x2030|90 9f 20 00 |.. . | lp_off: 8080 0x2030-0x2033.7 (4) +0x2030|90 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2030-0x2033.7 (4) +0x2030|90 9f 20 00 |.. . | lp_len: 16 0x2030-0x2033.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[7]{}: item_id 0x2034-0x2037.7 (4) +0x2030| 80 9f 20 00 | .. . | lp_off: 8064 0x2034-0x2037.7 (4) +0x2030| 80 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2034-0x2037.7 (4) +0x2030| 80 9f 20 00 | .. . | lp_len: 16 0x2034-0x2037.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[8]{}: item_id 0x2038-0x203b.7 (4) +0x2030| 70 9f 20 00 | p. . | lp_off: 8048 0x2038-0x203b.7 (4) +0x2030| 70 9f 20 00 | p. . | lp_flags: "LP_NORMAL" (1) 0x2038-0x203b.7 (4) +0x2030| 70 9f 20 00 | p. . | lp_len: 16 0x2038-0x203b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[9]{}: item_id 0x203c-0x203f.7 (4) +0x2030| 60 9f 20 00| `. .| lp_off: 8032 0x203c-0x203f.7 (4) +0x2030| 60 9f 20 00| `. .| lp_flags: "LP_NORMAL" (1) 0x203c-0x203f.7 (4) +0x2030| 60 9f 20 00| `. .| lp_len: 16 0x203c-0x203f.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro10/16401_2.fqtest b/format/postgres/testdata/flavours/pgpro10/16401_2.fqtest new file mode 100644 index 000000000..5bf56024c --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro10/16401_2.fqtest @@ -0,0 +1,111 @@ +$ fq -d pg_btree ".[1].tuples[0,1,2,3,4,5,6,7,8,9] | dv" 16401 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[0]{}: tuple 0x2900-0x290f.7 (16) + | | | index_tuple_data{}: 0x2900-0x290f.7 (16) + | | | t_tid{}: 0x2900-0x2905.7 (6) +0x2900|00 00 06 00 |.... | ip_blkid: 393216 0x2900-0x2903.7 (4) +0x2900| 01 00 | .. | ip_posid: 1 0x2904-0x2905.7 (2) +0x2900| 10 00 | .. | t_info: 16 0x2906-0x2907.7 (2) + | | | flags{}: 0x2908-NA (0) + | | | has_nulls: false 0x2908-NA (0) + | | | has_var_widths: false 0x2908-NA (0) + | | | size: 16 0x2908-NA (0) +0x2900| 6f 01 00 00 00 00 00 00| o.......| data: raw bits 0x2908-0x290f.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[1]{}: tuple 0x3fe0-0x3fef.7 (16) + | | | index_tuple_data{}: 0x3fe0-0x3fef.7 (16) + | | | t_tid{}: 0x3fe0-0x3fe5.7 (6) +0x3fe0|00 00 00 00 |.... | ip_blkid: 0 0x3fe0-0x3fe3.7 (4) +0x3fe0| 01 00 | .. | ip_posid: 1 0x3fe4-0x3fe5.7 (2) +0x3fe0| 10 00 | .. | t_info: 16 0x3fe6-0x3fe7.7 (2) + | | | flags{}: 0x3fe8-NA (0) + | | | has_nulls: false 0x3fe8-NA (0) + | | | has_var_widths: false 0x3fe8-NA (0) + | | | size: 16 0x3fe8-NA (0) +0x3fe0| 01 00 00 00 00 00 00 00| ........| data: raw bits 0x3fe8-0x3fef.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[2]{}: tuple 0x3fd0-0x3fdf.7 (16) + | | | index_tuple_data{}: 0x3fd0-0x3fdf.7 (16) + | | | t_tid{}: 0x3fd0-0x3fd5.7 (6) +0x3fd0|00 00 00 00 |.... | ip_blkid: 0 0x3fd0-0x3fd3.7 (4) +0x3fd0| 02 00 | .. | ip_posid: 2 0x3fd4-0x3fd5.7 (2) +0x3fd0| 10 00 | .. | t_info: 16 0x3fd6-0x3fd7.7 (2) + | | | flags{}: 0x3fd8-NA (0) + | | | has_nulls: false 0x3fd8-NA (0) + | | | has_var_widths: false 0x3fd8-NA (0) + | | | size: 16 0x3fd8-NA (0) +0x3fd0| 02 00 00 00 00 00 00 00| ........| data: raw bits 0x3fd8-0x3fdf.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[3]{}: tuple 0x3fc0-0x3fcf.7 (16) + | | | index_tuple_data{}: 0x3fc0-0x3fcf.7 (16) + | | | t_tid{}: 0x3fc0-0x3fc5.7 (6) +0x3fc0|00 00 00 00 |.... | ip_blkid: 0 0x3fc0-0x3fc3.7 (4) +0x3fc0| 03 00 | .. | ip_posid: 3 0x3fc4-0x3fc5.7 (2) +0x3fc0| 10 00 | .. | t_info: 16 0x3fc6-0x3fc7.7 (2) + | | | flags{}: 0x3fc8-NA (0) + | | | has_nulls: false 0x3fc8-NA (0) + | | | has_var_widths: false 0x3fc8-NA (0) + | | | size: 16 0x3fc8-NA (0) +0x3fc0| 03 00 00 00 00 00 00 00| ........| data: raw bits 0x3fc8-0x3fcf.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[4]{}: tuple 0x3fb0-0x3fbf.7 (16) + | | | index_tuple_data{}: 0x3fb0-0x3fbf.7 (16) + | | | t_tid{}: 0x3fb0-0x3fb5.7 (6) +0x3fb0|00 00 00 00 |.... | ip_blkid: 0 0x3fb0-0x3fb3.7 (4) +0x3fb0| 04 00 | .. | ip_posid: 4 0x3fb4-0x3fb5.7 (2) +0x3fb0| 10 00 | .. | t_info: 16 0x3fb6-0x3fb7.7 (2) + | | | flags{}: 0x3fb8-NA (0) + | | | has_nulls: false 0x3fb8-NA (0) + | | | has_var_widths: false 0x3fb8-NA (0) + | | | size: 16 0x3fb8-NA (0) +0x3fb0| 04 00 00 00 00 00 00 00| ........| data: raw bits 0x3fb8-0x3fbf.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[5]{}: tuple 0x3fa0-0x3faf.7 (16) + | | | index_tuple_data{}: 0x3fa0-0x3faf.7 (16) + | | | t_tid{}: 0x3fa0-0x3fa5.7 (6) +0x3fa0|00 00 00 00 |.... | ip_blkid: 0 0x3fa0-0x3fa3.7 (4) +0x3fa0| 05 00 | .. | ip_posid: 5 0x3fa4-0x3fa5.7 (2) +0x3fa0| 10 00 | .. | t_info: 16 0x3fa6-0x3fa7.7 (2) + | | | flags{}: 0x3fa8-NA (0) + | | | has_nulls: false 0x3fa8-NA (0) + | | | has_var_widths: false 0x3fa8-NA (0) + | | | size: 16 0x3fa8-NA (0) +0x3fa0| 05 00 00 00 00 00 00 00| ........| data: raw bits 0x3fa8-0x3faf.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[6]{}: tuple 0x3f90-0x3f9f.7 (16) + | | | index_tuple_data{}: 0x3f90-0x3f9f.7 (16) + | | | t_tid{}: 0x3f90-0x3f95.7 (6) +0x3f90|00 00 00 00 |.... | ip_blkid: 0 0x3f90-0x3f93.7 (4) +0x3f90| 06 00 | .. | ip_posid: 6 0x3f94-0x3f95.7 (2) +0x3f90| 10 00 | .. | t_info: 16 0x3f96-0x3f97.7 (2) + | | | flags{}: 0x3f98-NA (0) + | | | has_nulls: false 0x3f98-NA (0) + | | | has_var_widths: false 0x3f98-NA (0) + | | | size: 16 0x3f98-NA (0) +0x3f90| 06 00 00 00 00 00 00 00| ........| data: raw bits 0x3f98-0x3f9f.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[7]{}: tuple 0x3f80-0x3f8f.7 (16) + | | | index_tuple_data{}: 0x3f80-0x3f8f.7 (16) + | | | t_tid{}: 0x3f80-0x3f85.7 (6) +0x3f80|00 00 00 00 |.... | ip_blkid: 0 0x3f80-0x3f83.7 (4) +0x3f80| 07 00 | .. | ip_posid: 7 0x3f84-0x3f85.7 (2) +0x3f80| 10 00 | .. | t_info: 16 0x3f86-0x3f87.7 (2) + | | | flags{}: 0x3f88-NA (0) + | | | has_nulls: false 0x3f88-NA (0) + | | | has_var_widths: false 0x3f88-NA (0) + | | | size: 16 0x3f88-NA (0) +0x3f80| 07 00 00 00 00 00 00 00| ........| data: raw bits 0x3f88-0x3f8f.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[8]{}: tuple 0x3f70-0x3f7f.7 (16) + | | | index_tuple_data{}: 0x3f70-0x3f7f.7 (16) + | | | t_tid{}: 0x3f70-0x3f75.7 (6) +0x3f70|00 00 00 00 |.... | ip_blkid: 0 0x3f70-0x3f73.7 (4) +0x3f70| 08 00 | .. | ip_posid: 8 0x3f74-0x3f75.7 (2) +0x3f70| 10 00 | .. | t_info: 16 0x3f76-0x3f77.7 (2) + | | | flags{}: 0x3f78-NA (0) + | | | has_nulls: false 0x3f78-NA (0) + | | | has_var_widths: false 0x3f78-NA (0) + | | | size: 16 0x3f78-NA (0) +0x3f70| 08 00 00 00 00 00 00 00| ........| data: raw bits 0x3f78-0x3f7f.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[9]{}: tuple 0x3f60-0x3f6f.7 (16) + | | | index_tuple_data{}: 0x3f60-0x3f6f.7 (16) + | | | t_tid{}: 0x3f60-0x3f65.7 (6) +0x3f60|00 00 00 00 |.... | ip_blkid: 0 0x3f60-0x3f63.7 (4) +0x3f60| 09 00 | .. | ip_posid: 9 0x3f64-0x3f65.7 (2) +0x3f60| 10 00 | .. | t_info: 16 0x3f66-0x3f67.7 (2) + | | | flags{}: 0x3f68-NA (0) + | | | has_nulls: false 0x3f68-NA (0) + | | | has_var_widths: false 0x3f68-NA (0) + | | | size: 16 0x3f68-NA (0) +0x3f60| 09 00 00 00 00 00 00 00| ........| data: raw bits 0x3f68-0x3f6f.7 (8) diff --git a/format/postgres/testdata/flavours/pgpro14/16404 b/format/postgres/testdata/flavours/pgpro14/16404 new file mode 100644 index 0000000000000000000000000000000000000000..abe4e237a881127d300de42a7c5d1fe821649113 GIT binary patch literal 16384 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 bwdX#w_S|dMo(Gz>=N_~6JivVLHGS;gV1c3o literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgpro14/16404_1.fqtest b/format/postgres/testdata/flavours/pgpro14/16404_1.fqtest new file mode 100644 index 000000000..c03305538 --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro14/16404_1.fqtest @@ -0,0 +1,41 @@ +$ fq -d pg_btree ".[1].pd_linp[0,1,2,3,4,5,6,7,8,9] | dv" 16404 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[0]{}: item_id 0x2018-0x201b.7 (4) +0x2010| 00 89 20 00 | .. . | lp_off: 2304 0x2018-0x201b.7 (4) +0x2010| 00 89 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2018-0x201b.7 (4) +0x2010| 00 89 20 00 | .. . | lp_len: 16 0x2018-0x201b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[1]{}: item_id 0x201c-0x201f.7 (4) +0x2010| e0 9f 20 00| .. .| lp_off: 8160 0x201c-0x201f.7 (4) +0x2010| e0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x201c-0x201f.7 (4) +0x2010| e0 9f 20 00| .. .| lp_len: 16 0x201c-0x201f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[2]{}: item_id 0x2020-0x2023.7 (4) +0x2020|d0 9f 20 00 |.. . | lp_off: 8144 0x2020-0x2023.7 (4) +0x2020|d0 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2020-0x2023.7 (4) +0x2020|d0 9f 20 00 |.. . | lp_len: 16 0x2020-0x2023.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[3]{}: item_id 0x2024-0x2027.7 (4) +0x2020| c0 9f 20 00 | .. . | lp_off: 8128 0x2024-0x2027.7 (4) +0x2020| c0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2024-0x2027.7 (4) +0x2020| c0 9f 20 00 | .. . | lp_len: 16 0x2024-0x2027.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[4]{}: item_id 0x2028-0x202b.7 (4) +0x2020| b0 9f 20 00 | .. . | lp_off: 8112 0x2028-0x202b.7 (4) +0x2020| b0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2028-0x202b.7 (4) +0x2020| b0 9f 20 00 | .. . | lp_len: 16 0x2028-0x202b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[5]{}: item_id 0x202c-0x202f.7 (4) +0x2020| a0 9f 20 00| .. .| lp_off: 8096 0x202c-0x202f.7 (4) +0x2020| a0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x202c-0x202f.7 (4) +0x2020| a0 9f 20 00| .. .| lp_len: 16 0x202c-0x202f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[6]{}: item_id 0x2030-0x2033.7 (4) +0x2030|90 9f 20 00 |.. . | lp_off: 8080 0x2030-0x2033.7 (4) +0x2030|90 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2030-0x2033.7 (4) +0x2030|90 9f 20 00 |.. . | lp_len: 16 0x2030-0x2033.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[7]{}: item_id 0x2034-0x2037.7 (4) +0x2030| 80 9f 20 00 | .. . | lp_off: 8064 0x2034-0x2037.7 (4) +0x2030| 80 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2034-0x2037.7 (4) +0x2030| 80 9f 20 00 | .. . | lp_len: 16 0x2034-0x2037.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[8]{}: item_id 0x2038-0x203b.7 (4) +0x2030| 70 9f 20 00 | p. . | lp_off: 8048 0x2038-0x203b.7 (4) +0x2030| 70 9f 20 00 | p. . | lp_flags: "LP_NORMAL" (1) 0x2038-0x203b.7 (4) +0x2030| 70 9f 20 00 | p. . | lp_len: 16 0x2038-0x203b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[9]{}: item_id 0x203c-0x203f.7 (4) +0x2030| 60 9f 20 00| `. .| lp_off: 8032 0x203c-0x203f.7 (4) +0x2030| 60 9f 20 00| `. .| lp_flags: "LP_NORMAL" (1) 0x203c-0x203f.7 (4) +0x2030| 60 9f 20 00| `. .| lp_len: 16 0x203c-0x203f.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro14/16404_2.fqtest b/format/postgres/testdata/flavours/pgpro14/16404_2.fqtest new file mode 100644 index 000000000..db1251e5f --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro14/16404_2.fqtest @@ -0,0 +1,111 @@ +$ fq -d pg_btree ".[1].tuples[0,1,2,3,4,5,6,7,8,9] | dv" 16404 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[0]{}: tuple 0x2900-0x290f.7 (16) + | | | index_tuple_data{}: 0x2900-0x290f.7 (16) + | | | t_tid{}: 0x2900-0x2905.7 (6) +0x2900|00 00 06 00 |.... | ip_blkid: 393216 0x2900-0x2903.7 (4) +0x2900| 01 00 | .. | ip_posid: 1 0x2904-0x2905.7 (2) +0x2900| 10 20 | . | t_info: 8208 0x2906-0x2907.7 (2) + | | | flags{}: 0x2908-NA (0) + | | | has_nulls: false 0x2908-NA (0) + | | | has_var_widths: false 0x2908-NA (0) + | | | size: 16 0x2908-NA (0) +0x2900| 6f 01 00 00 00 00 00 00| o.......| data: raw bits 0x2908-0x290f.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[1]{}: tuple 0x3fe0-0x3fef.7 (16) + | | | index_tuple_data{}: 0x3fe0-0x3fef.7 (16) + | | | t_tid{}: 0x3fe0-0x3fe5.7 (6) +0x3fe0|00 00 00 00 |.... | ip_blkid: 0 0x3fe0-0x3fe3.7 (4) +0x3fe0| 01 00 | .. | ip_posid: 1 0x3fe4-0x3fe5.7 (2) +0x3fe0| 10 00 | .. | t_info: 16 0x3fe6-0x3fe7.7 (2) + | | | flags{}: 0x3fe8-NA (0) + | | | has_nulls: false 0x3fe8-NA (0) + | | | has_var_widths: false 0x3fe8-NA (0) + | | | size: 16 0x3fe8-NA (0) +0x3fe0| 01 00 00 00 00 00 00 00| ........| data: raw bits 0x3fe8-0x3fef.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[2]{}: tuple 0x3fd0-0x3fdf.7 (16) + | | | index_tuple_data{}: 0x3fd0-0x3fdf.7 (16) + | | | t_tid{}: 0x3fd0-0x3fd5.7 (6) +0x3fd0|00 00 00 00 |.... | ip_blkid: 0 0x3fd0-0x3fd3.7 (4) +0x3fd0| 02 00 | .. | ip_posid: 2 0x3fd4-0x3fd5.7 (2) +0x3fd0| 10 00 | .. | t_info: 16 0x3fd6-0x3fd7.7 (2) + | | | flags{}: 0x3fd8-NA (0) + | | | has_nulls: false 0x3fd8-NA (0) + | | | has_var_widths: false 0x3fd8-NA (0) + | | | size: 16 0x3fd8-NA (0) +0x3fd0| 02 00 00 00 00 00 00 00| ........| data: raw bits 0x3fd8-0x3fdf.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[3]{}: tuple 0x3fc0-0x3fcf.7 (16) + | | | index_tuple_data{}: 0x3fc0-0x3fcf.7 (16) + | | | t_tid{}: 0x3fc0-0x3fc5.7 (6) +0x3fc0|00 00 00 00 |.... | ip_blkid: 0 0x3fc0-0x3fc3.7 (4) +0x3fc0| 03 00 | .. | ip_posid: 3 0x3fc4-0x3fc5.7 (2) +0x3fc0| 10 00 | .. | t_info: 16 0x3fc6-0x3fc7.7 (2) + | | | flags{}: 0x3fc8-NA (0) + | | | has_nulls: false 0x3fc8-NA (0) + | | | has_var_widths: false 0x3fc8-NA (0) + | | | size: 16 0x3fc8-NA (0) +0x3fc0| 03 00 00 00 00 00 00 00| ........| data: raw bits 0x3fc8-0x3fcf.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[4]{}: tuple 0x3fb0-0x3fbf.7 (16) + | | | index_tuple_data{}: 0x3fb0-0x3fbf.7 (16) + | | | t_tid{}: 0x3fb0-0x3fb5.7 (6) +0x3fb0|00 00 00 00 |.... | ip_blkid: 0 0x3fb0-0x3fb3.7 (4) +0x3fb0| 04 00 | .. | ip_posid: 4 0x3fb4-0x3fb5.7 (2) +0x3fb0| 10 00 | .. | t_info: 16 0x3fb6-0x3fb7.7 (2) + | | | flags{}: 0x3fb8-NA (0) + | | | has_nulls: false 0x3fb8-NA (0) + | | | has_var_widths: false 0x3fb8-NA (0) + | | | size: 16 0x3fb8-NA (0) +0x3fb0| 04 00 00 00 00 00 00 00| ........| data: raw bits 0x3fb8-0x3fbf.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[5]{}: tuple 0x3fa0-0x3faf.7 (16) + | | | index_tuple_data{}: 0x3fa0-0x3faf.7 (16) + | | | t_tid{}: 0x3fa0-0x3fa5.7 (6) +0x3fa0|00 00 00 00 |.... | ip_blkid: 0 0x3fa0-0x3fa3.7 (4) +0x3fa0| 05 00 | .. | ip_posid: 5 0x3fa4-0x3fa5.7 (2) +0x3fa0| 10 00 | .. | t_info: 16 0x3fa6-0x3fa7.7 (2) + | | | flags{}: 0x3fa8-NA (0) + | | | has_nulls: false 0x3fa8-NA (0) + | | | has_var_widths: false 0x3fa8-NA (0) + | | | size: 16 0x3fa8-NA (0) +0x3fa0| 05 00 00 00 00 00 00 00| ........| data: raw bits 0x3fa8-0x3faf.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[6]{}: tuple 0x3f90-0x3f9f.7 (16) + | | | index_tuple_data{}: 0x3f90-0x3f9f.7 (16) + | | | t_tid{}: 0x3f90-0x3f95.7 (6) +0x3f90|00 00 00 00 |.... | ip_blkid: 0 0x3f90-0x3f93.7 (4) +0x3f90| 06 00 | .. | ip_posid: 6 0x3f94-0x3f95.7 (2) +0x3f90| 10 00 | .. | t_info: 16 0x3f96-0x3f97.7 (2) + | | | flags{}: 0x3f98-NA (0) + | | | has_nulls: false 0x3f98-NA (0) + | | | has_var_widths: false 0x3f98-NA (0) + | | | size: 16 0x3f98-NA (0) +0x3f90| 06 00 00 00 00 00 00 00| ........| data: raw bits 0x3f98-0x3f9f.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[7]{}: tuple 0x3f80-0x3f8f.7 (16) + | | | index_tuple_data{}: 0x3f80-0x3f8f.7 (16) + | | | t_tid{}: 0x3f80-0x3f85.7 (6) +0x3f80|00 00 00 00 |.... | ip_blkid: 0 0x3f80-0x3f83.7 (4) +0x3f80| 07 00 | .. | ip_posid: 7 0x3f84-0x3f85.7 (2) +0x3f80| 10 00 | .. | t_info: 16 0x3f86-0x3f87.7 (2) + | | | flags{}: 0x3f88-NA (0) + | | | has_nulls: false 0x3f88-NA (0) + | | | has_var_widths: false 0x3f88-NA (0) + | | | size: 16 0x3f88-NA (0) +0x3f80| 07 00 00 00 00 00 00 00| ........| data: raw bits 0x3f88-0x3f8f.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[8]{}: tuple 0x3f70-0x3f7f.7 (16) + | | | index_tuple_data{}: 0x3f70-0x3f7f.7 (16) + | | | t_tid{}: 0x3f70-0x3f75.7 (6) +0x3f70|00 00 00 00 |.... | ip_blkid: 0 0x3f70-0x3f73.7 (4) +0x3f70| 08 00 | .. | ip_posid: 8 0x3f74-0x3f75.7 (2) +0x3f70| 10 00 | .. | t_info: 16 0x3f76-0x3f77.7 (2) + | | | flags{}: 0x3f78-NA (0) + | | | has_nulls: false 0x3f78-NA (0) + | | | has_var_widths: false 0x3f78-NA (0) + | | | size: 16 0x3f78-NA (0) +0x3f70| 08 00 00 00 00 00 00 00| ........| data: raw bits 0x3f78-0x3f7f.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[9]{}: tuple 0x3f60-0x3f6f.7 (16) + | | | index_tuple_data{}: 0x3f60-0x3f6f.7 (16) + | | | t_tid{}: 0x3f60-0x3f65.7 (6) +0x3f60|00 00 00 00 |.... | ip_blkid: 0 0x3f60-0x3f63.7 (4) +0x3f60| 09 00 | .. | ip_posid: 9 0x3f64-0x3f65.7 (2) +0x3f60| 10 00 | .. | t_info: 16 0x3f66-0x3f67.7 (2) + | | | flags{}: 0x3f68-NA (0) + | | | has_nulls: false 0x3f68-NA (0) + | | | has_var_widths: false 0x3f68-NA (0) + | | | size: 16 0x3f68-NA (0) +0x3f60| 09 00 00 00 00 00 00 00| ........| data: raw bits 0x3f68-0x3f6f.7 (8) diff --git a/format/postgres/testdata/flavours/pgproee10/16401 b/format/postgres/testdata/flavours/pgproee10/16401 new file mode 100644 index 0000000000000000000000000000000000000000..0e3cab270fd690177bfe59c664082414dc04b86c GIT binary patch literal 16384 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

m(%lc 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%0D%0~TGCjX6)ALI*J-;Z^^9wRPKQGhsb22?YE7S8c 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

y=s8+ex?KEC>V@ZaBH`1!)< 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

oU(4zFS8{s(rJSCBA*bhs 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

0Wc@t9?`7SrleM!}*324NJ*#Ea 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 WOwU!Bo;Uv9|Nh*6{&eNT0R9iUuOj&X literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres10/16401_1.fqtest b/format/postgres/testdata/flavours/postgres10/16401_1.fqtest new file mode 100644 index 000000000..3a224aa4e --- /dev/null +++ b/format/postgres/testdata/flavours/postgres10/16401_1.fqtest @@ -0,0 +1,41 @@ +$ fq -d pg_btree ".[1].pd_linp[0,1,2,3,4,5,6,7,8,9] | dv" 16401 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[0]{}: item_id 0x2018-0x201b.7 (4) +0x2010| 00 89 20 00 | .. . | lp_off: 2304 0x2018-0x201b.7 (4) +0x2010| 00 89 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2018-0x201b.7 (4) +0x2010| 00 89 20 00 | .. . | lp_len: 16 0x2018-0x201b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[1]{}: item_id 0x201c-0x201f.7 (4) +0x2010| e0 9f 20 00| .. .| lp_off: 8160 0x201c-0x201f.7 (4) +0x2010| e0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x201c-0x201f.7 (4) +0x2010| e0 9f 20 00| .. .| lp_len: 16 0x201c-0x201f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[2]{}: item_id 0x2020-0x2023.7 (4) +0x2020|d0 9f 20 00 |.. . | lp_off: 8144 0x2020-0x2023.7 (4) +0x2020|d0 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2020-0x2023.7 (4) +0x2020|d0 9f 20 00 |.. . | lp_len: 16 0x2020-0x2023.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[3]{}: item_id 0x2024-0x2027.7 (4) +0x2020| c0 9f 20 00 | .. . | lp_off: 8128 0x2024-0x2027.7 (4) +0x2020| c0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2024-0x2027.7 (4) +0x2020| c0 9f 20 00 | .. . | lp_len: 16 0x2024-0x2027.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[4]{}: item_id 0x2028-0x202b.7 (4) +0x2020| b0 9f 20 00 | .. . | lp_off: 8112 0x2028-0x202b.7 (4) +0x2020| b0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2028-0x202b.7 (4) +0x2020| b0 9f 20 00 | .. . | lp_len: 16 0x2028-0x202b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[5]{}: item_id 0x202c-0x202f.7 (4) +0x2020| a0 9f 20 00| .. .| lp_off: 8096 0x202c-0x202f.7 (4) +0x2020| a0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x202c-0x202f.7 (4) +0x2020| a0 9f 20 00| .. .| lp_len: 16 0x202c-0x202f.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[6]{}: item_id 0x2030-0x2033.7 (4) +0x2030|90 9f 20 00 |.. . | lp_off: 8080 0x2030-0x2033.7 (4) +0x2030|90 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2030-0x2033.7 (4) +0x2030|90 9f 20 00 |.. . | lp_len: 16 0x2030-0x2033.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[7]{}: item_id 0x2034-0x2037.7 (4) +0x2030| 80 9f 20 00 | .. . | lp_off: 8064 0x2034-0x2037.7 (4) +0x2030| 80 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2034-0x2037.7 (4) +0x2030| 80 9f 20 00 | .. . | lp_len: 16 0x2034-0x2037.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[8]{}: item_id 0x2038-0x203b.7 (4) +0x2030| 70 9f 20 00 | p. . | lp_off: 8048 0x2038-0x203b.7 (4) +0x2030| 70 9f 20 00 | p. . | lp_flags: "LP_NORMAL" (1) 0x2038-0x203b.7 (4) +0x2030| 70 9f 20 00 | p. . | lp_len: 16 0x2038-0x203b.7 (4) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[9]{}: item_id 0x203c-0x203f.7 (4) +0x2030| 60 9f 20 00| `. .| lp_off: 8032 0x203c-0x203f.7 (4) +0x2030| 60 9f 20 00| `. .| lp_flags: "LP_NORMAL" (1) 0x203c-0x203f.7 (4) +0x2030| 60 9f 20 00| `. .| lp_len: 16 0x203c-0x203f.7 (4) diff --git a/format/postgres/testdata/flavours/postgres10/16401_2.fqtest b/format/postgres/testdata/flavours/postgres10/16401_2.fqtest new file mode 100644 index 000000000..5bf56024c --- /dev/null +++ b/format/postgres/testdata/flavours/postgres10/16401_2.fqtest @@ -0,0 +1,111 @@ +$ fq -d pg_btree ".[1].tuples[0,1,2,3,4,5,6,7,8,9] | dv" 16401 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[0]{}: tuple 0x2900-0x290f.7 (16) + | | | index_tuple_data{}: 0x2900-0x290f.7 (16) + | | | t_tid{}: 0x2900-0x2905.7 (6) +0x2900|00 00 06 00 |.... | ip_blkid: 393216 0x2900-0x2903.7 (4) +0x2900| 01 00 | .. | ip_posid: 1 0x2904-0x2905.7 (2) +0x2900| 10 00 | .. | t_info: 16 0x2906-0x2907.7 (2) + | | | flags{}: 0x2908-NA (0) + | | | has_nulls: false 0x2908-NA (0) + | | | has_var_widths: false 0x2908-NA (0) + | | | size: 16 0x2908-NA (0) +0x2900| 6f 01 00 00 00 00 00 00| o.......| data: raw bits 0x2908-0x290f.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[1]{}: tuple 0x3fe0-0x3fef.7 (16) + | | | index_tuple_data{}: 0x3fe0-0x3fef.7 (16) + | | | t_tid{}: 0x3fe0-0x3fe5.7 (6) +0x3fe0|00 00 00 00 |.... | ip_blkid: 0 0x3fe0-0x3fe3.7 (4) +0x3fe0| 01 00 | .. | ip_posid: 1 0x3fe4-0x3fe5.7 (2) +0x3fe0| 10 00 | .. | t_info: 16 0x3fe6-0x3fe7.7 (2) + | | | flags{}: 0x3fe8-NA (0) + | | | has_nulls: false 0x3fe8-NA (0) + | | | has_var_widths: false 0x3fe8-NA (0) + | | | size: 16 0x3fe8-NA (0) +0x3fe0| 01 00 00 00 00 00 00 00| ........| data: raw bits 0x3fe8-0x3fef.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[2]{}: tuple 0x3fd0-0x3fdf.7 (16) + | | | index_tuple_data{}: 0x3fd0-0x3fdf.7 (16) + | | | t_tid{}: 0x3fd0-0x3fd5.7 (6) +0x3fd0|00 00 00 00 |.... | ip_blkid: 0 0x3fd0-0x3fd3.7 (4) +0x3fd0| 02 00 | .. | ip_posid: 2 0x3fd4-0x3fd5.7 (2) +0x3fd0| 10 00 | .. | t_info: 16 0x3fd6-0x3fd7.7 (2) + | | | flags{}: 0x3fd8-NA (0) + | | | has_nulls: false 0x3fd8-NA (0) + | | | has_var_widths: false 0x3fd8-NA (0) + | | | size: 16 0x3fd8-NA (0) +0x3fd0| 02 00 00 00 00 00 00 00| ........| data: raw bits 0x3fd8-0x3fdf.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[3]{}: tuple 0x3fc0-0x3fcf.7 (16) + | | | index_tuple_data{}: 0x3fc0-0x3fcf.7 (16) + | | | t_tid{}: 0x3fc0-0x3fc5.7 (6) +0x3fc0|00 00 00 00 |.... | ip_blkid: 0 0x3fc0-0x3fc3.7 (4) +0x3fc0| 03 00 | .. | ip_posid: 3 0x3fc4-0x3fc5.7 (2) +0x3fc0| 10 00 | .. | t_info: 16 0x3fc6-0x3fc7.7 (2) + | | | flags{}: 0x3fc8-NA (0) + | | | has_nulls: false 0x3fc8-NA (0) + | | | has_var_widths: false 0x3fc8-NA (0) + | | | size: 16 0x3fc8-NA (0) +0x3fc0| 03 00 00 00 00 00 00 00| ........| data: raw bits 0x3fc8-0x3fcf.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[4]{}: tuple 0x3fb0-0x3fbf.7 (16) + | | | index_tuple_data{}: 0x3fb0-0x3fbf.7 (16) + | | | t_tid{}: 0x3fb0-0x3fb5.7 (6) +0x3fb0|00 00 00 00 |.... | ip_blkid: 0 0x3fb0-0x3fb3.7 (4) +0x3fb0| 04 00 | .. | ip_posid: 4 0x3fb4-0x3fb5.7 (2) +0x3fb0| 10 00 | .. | t_info: 16 0x3fb6-0x3fb7.7 (2) + | | | flags{}: 0x3fb8-NA (0) + | | | has_nulls: false 0x3fb8-NA (0) + | | | has_var_widths: false 0x3fb8-NA (0) + | | | size: 16 0x3fb8-NA (0) +0x3fb0| 04 00 00 00 00 00 00 00| ........| data: raw bits 0x3fb8-0x3fbf.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[5]{}: tuple 0x3fa0-0x3faf.7 (16) + | | | index_tuple_data{}: 0x3fa0-0x3faf.7 (16) + | | | t_tid{}: 0x3fa0-0x3fa5.7 (6) +0x3fa0|00 00 00 00 |.... | ip_blkid: 0 0x3fa0-0x3fa3.7 (4) +0x3fa0| 05 00 | .. | ip_posid: 5 0x3fa4-0x3fa5.7 (2) +0x3fa0| 10 00 | .. | t_info: 16 0x3fa6-0x3fa7.7 (2) + | | | flags{}: 0x3fa8-NA (0) + | | | has_nulls: false 0x3fa8-NA (0) + | | | has_var_widths: false 0x3fa8-NA (0) + | | | size: 16 0x3fa8-NA (0) +0x3fa0| 05 00 00 00 00 00 00 00| ........| data: raw bits 0x3fa8-0x3faf.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[6]{}: tuple 0x3f90-0x3f9f.7 (16) + | | | index_tuple_data{}: 0x3f90-0x3f9f.7 (16) + | | | t_tid{}: 0x3f90-0x3f95.7 (6) +0x3f90|00 00 00 00 |.... | ip_blkid: 0 0x3f90-0x3f93.7 (4) +0x3f90| 06 00 | .. | ip_posid: 6 0x3f94-0x3f95.7 (2) +0x3f90| 10 00 | .. | t_info: 16 0x3f96-0x3f97.7 (2) + | | | flags{}: 0x3f98-NA (0) + | | | has_nulls: false 0x3f98-NA (0) + | | | has_var_widths: false 0x3f98-NA (0) + | | | size: 16 0x3f98-NA (0) +0x3f90| 06 00 00 00 00 00 00 00| ........| data: raw bits 0x3f98-0x3f9f.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[7]{}: tuple 0x3f80-0x3f8f.7 (16) + | | | index_tuple_data{}: 0x3f80-0x3f8f.7 (16) + | | | t_tid{}: 0x3f80-0x3f85.7 (6) +0x3f80|00 00 00 00 |.... | ip_blkid: 0 0x3f80-0x3f83.7 (4) +0x3f80| 07 00 | .. | ip_posid: 7 0x3f84-0x3f85.7 (2) +0x3f80| 10 00 | .. | t_info: 16 0x3f86-0x3f87.7 (2) + | | | flags{}: 0x3f88-NA (0) + | | | has_nulls: false 0x3f88-NA (0) + | | | has_var_widths: false 0x3f88-NA (0) + | | | size: 16 0x3f88-NA (0) +0x3f80| 07 00 00 00 00 00 00 00| ........| data: raw bits 0x3f88-0x3f8f.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[8]{}: tuple 0x3f70-0x3f7f.7 (16) + | | | index_tuple_data{}: 0x3f70-0x3f7f.7 (16) + | | | t_tid{}: 0x3f70-0x3f75.7 (6) +0x3f70|00 00 00 00 |.... | ip_blkid: 0 0x3f70-0x3f73.7 (4) +0x3f70| 08 00 | .. | ip_posid: 8 0x3f74-0x3f75.7 (2) +0x3f70| 10 00 | .. | t_info: 16 0x3f76-0x3f77.7 (2) + | | | flags{}: 0x3f78-NA (0) + | | | has_nulls: false 0x3f78-NA (0) + | | | has_var_widths: false 0x3f78-NA (0) + | | | size: 16 0x3f78-NA (0) +0x3f70| 08 00 00 00 00 00 00 00| ........| data: raw bits 0x3f78-0x3f7f.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].tuples[9]{}: tuple 0x3f60-0x3f6f.7 (16) + | | | index_tuple_data{}: 0x3f60-0x3f6f.7 (16) + | | | t_tid{}: 0x3f60-0x3f65.7 (6) +0x3f60|00 00 00 00 |.... | ip_blkid: 0 0x3f60-0x3f63.7 (4) +0x3f60| 09 00 | .. | ip_posid: 9 0x3f64-0x3f65.7 (2) +0x3f60| 10 00 | .. | t_info: 16 0x3f66-0x3f67.7 (2) + | | | flags{}: 0x3f68-NA (0) + | | | has_nulls: false 0x3f68-NA (0) + | | | has_var_widths: false 0x3f68-NA (0) + | | | size: 16 0x3f68-NA (0) +0x3f60| 09 00 00 00 00 00 00 00| ........| data: raw bits 0x3f68-0x3f6f.7 (8) From 6e2e44d6825ba24834651ea7cc995f442654916f Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Mon, 31 Oct 2022 12:55:09 +0300 Subject: [PATCH 119/141] postgres: remove arg in pg_btree --- format/postgres/pg_btree.go | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/format/postgres/pg_btree.go b/format/postgres/pg_btree.go index e830b1b52..51d6860d3 100644 --- a/format/postgres/pg_btree.go +++ b/format/postgres/pg_btree.go @@ -17,26 +17,13 @@ func init() { Name: format.PG_BTREE, Description: "PostgreSQL btree index file", DecodeFn: decodePgBTree, - DecodeInArg: format.PostgresIn{ - Flavour: PG_FLAVOUR_POSTGRES14, - }, - RootArray: true, - RootName: "pages", + RootArray: true, + RootName: "pages", }) interp.RegisterFS(pgBTreeFS) } func decodePgBTree(d *decode.D, in any) any { d.Endian = decode.LittleEndian - - _, ok := in.(format.PostgresIn) - if !ok { - d.Fatalf("DecodeInArg must be PostgresIn!\n") - } - - //switch pgIn.Flavour { - //case PG_FLAVOUR_POSTGRES14: - // return postgres14.DecodePgBTree(d) - //} return postgres14.DecodePgBTree(d) } From 721c1ab3bfa27d3f69d00b85c3d1156dea8e8b8d Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Mon, 31 Oct 2022 13:56:56 +0300 Subject: [PATCH 120/141] psotgres: refactoring --- .../{flavours/postgres14 => common/pg_btree}/pg_btree.go | 2 +- format/postgres/pg_btree.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename format/postgres/{flavours/postgres14 => common/pg_btree}/pg_btree.go (99%) diff --git a/format/postgres/flavours/postgres14/pg_btree.go b/format/postgres/common/pg_btree/pg_btree.go similarity index 99% rename from format/postgres/flavours/postgres14/pg_btree.go rename to format/postgres/common/pg_btree/pg_btree.go index 871b4e427..e1eb26a5c 100644 --- a/format/postgres/flavours/postgres14/pg_btree.go +++ b/format/postgres/common/pg_btree/pg_btree.go @@ -1,4 +1,4 @@ -package postgres14 +package pg_btree import ( "github.com/wader/fq/format/postgres/common" diff --git a/format/postgres/pg_btree.go b/format/postgres/pg_btree.go index 51d6860d3..01b5aa75c 100644 --- a/format/postgres/pg_btree.go +++ b/format/postgres/pg_btree.go @@ -2,9 +2,9 @@ package postgres import ( "embed" + "github.com/wader/fq/format/postgres/common/pg_btree" "github.com/wader/fq/format" - "github.com/wader/fq/format/postgres/flavours/postgres14" "github.com/wader/fq/pkg/decode" "github.com/wader/fq/pkg/interp" ) @@ -25,5 +25,5 @@ func init() { func decodePgBTree(d *decode.D, in any) any { d.Endian = decode.LittleEndian - return postgres14.DecodePgBTree(d) + return pg_btree.DecodePgBTree(d) } From a4d904e1c282b17d020167a9506864b1fff4cf8d Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Mon, 31 Oct 2022 14:02:08 +0300 Subject: [PATCH 121/141] postgres: refactoring --- format/postgres/common/pg_btree/{ => postgres}/pg_btree.go | 2 +- format/postgres/pg_btree.go | 5 +++-- format/postgres/pg_wal.go | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) rename format/postgres/common/pg_btree/{ => postgres}/pg_btree.go (99%) diff --git a/format/postgres/common/pg_btree/pg_btree.go b/format/postgres/common/pg_btree/postgres/pg_btree.go similarity index 99% rename from format/postgres/common/pg_btree/pg_btree.go rename to format/postgres/common/pg_btree/postgres/pg_btree.go index e1eb26a5c..8ec52e8d0 100644 --- a/format/postgres/common/pg_btree/pg_btree.go +++ b/format/postgres/common/pg_btree/postgres/pg_btree.go @@ -1,4 +1,4 @@ -package pg_btree +package postgres import ( "github.com/wader/fq/format/postgres/common" diff --git a/format/postgres/pg_btree.go b/format/postgres/pg_btree.go index 01b5aa75c..5e510c65c 100644 --- a/format/postgres/pg_btree.go +++ b/format/postgres/pg_btree.go @@ -2,7 +2,8 @@ package postgres import ( "embed" - "github.com/wader/fq/format/postgres/common/pg_btree" + + "github.com/wader/fq/format/postgres/common/pg_btree/postgres" "github.com/wader/fq/format" "github.com/wader/fq/pkg/decode" @@ -25,5 +26,5 @@ func init() { func decodePgBTree(d *decode.D, in any) any { d.Endian = decode.LittleEndian - return pg_btree.DecodePgBTree(d) + return postgres.DecodePgBTree(d) } diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index 54f354f2d..6e7932236 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -2,6 +2,7 @@ package postgres import ( "fmt" + "github.com/wader/fq/format/postgres/common/pg_wal/pgproee" "github.com/wader/fq/format/postgres/common/pg_wal/postgres" From e87d5a6b7116b00391e00e227fefd2ec458eeddf Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Mon, 7 Nov 2022 11:25:14 +0300 Subject: [PATCH 122/141] postgres: remove unused code --- pkg/decode/decode.go | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/pkg/decode/decode.go b/pkg/decode/decode.go index 56a5418ee..ccf266674 100644 --- a/pkg/decode/decode.go +++ b/pkg/decode/decode.go @@ -762,27 +762,6 @@ func (d *D) FieldGet(name string) *Value { } return nil } - -func (d *D) FieldGetScalar(name string) *scalar.S { - v := d.FieldGet(name) - if v == nil { - return nil - } - sr, ok := v.V.(*scalar.S) - if !ok { - panic("not a scalar value") - } - return sr -} - -func (d *D) FieldTryGetScalarActualU(name string) (bool, uint64) { - sr := d.FieldGetScalar(name) - if sr == nil { - return false, 0 - } - return true, sr.ActualU() -} - func (d *D) FieldMustGet(name string) *Value { if v := d.FieldGet(name); v != nil { return v From 5bb865442377b46048ed2db0271324cf0a4f268e Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Mon, 7 Nov 2022 12:05:33 +0300 Subject: [PATCH 123/141] postgres: remove lsn parameter in pg_wal --- format/format.go | 5 ---- .../postgres/common/pg_wal/pgproee/decode.go | 3 +-- .../postgres/common/pg_wal/postgres/decode.go | 3 +-- .../postgres/common/pg_wal/postgres/pg_wal.go | 14 +---------- format/postgres/pg_wal.go | 25 ++++--------------- 5 files changed, 8 insertions(+), 42 deletions(-) diff --git a/format/format.go b/format/format.go index 79b9502ef..b43caedf2 100644 --- a/format/format.go +++ b/format/format.go @@ -333,8 +333,3 @@ type PostgresHeapIn struct { PageNumber int `doc:"First page number in file, default is 0"` SegmentNumber int `doc:"Segment file number (16790.1 is 1), default is 0"` } - -type PostgresWalIn struct { - Flavour string `doc:"PostgreSQL flavour: postgres14, pgproee14.., postgres10"` - Lsn string `doc:"Current LSN for WAL, use \"select pg_current_wal_lsn()\""` -} diff --git a/format/postgres/common/pg_wal/pgproee/decode.go b/format/postgres/common/pg_wal/pgproee/decode.go index 98a46cb4c..fe48c0627 100644 --- a/format/postgres/common/pg_wal/pgproee/decode.go +++ b/format/postgres/common/pg_wal/pgproee/decode.go @@ -5,9 +5,8 @@ import ( "github.com/wader/fq/pkg/decode" ) -func DecodePGWAL(d *decode.D, maxOffset uint32) any { +func DecodePGWAL(d *decode.D) any { wal := &postgres.Wal{ - MaxOffset: int64(maxOffset), DecodeXLogRecord: decodeXLogRecord, } return postgres.Decode(d, wal) diff --git a/format/postgres/common/pg_wal/postgres/decode.go b/format/postgres/common/pg_wal/postgres/decode.go index 2fe9b96f3..0f899d6c0 100644 --- a/format/postgres/common/pg_wal/postgres/decode.go +++ b/format/postgres/common/pg_wal/postgres/decode.go @@ -2,9 +2,8 @@ package postgres import "github.com/wader/fq/pkg/decode" -func DecodePGWAL(d *decode.D, maxOffset uint32) any { +func DecodePGWAL(d *decode.D) any { wal := &Wal{ - MaxOffset: int64(maxOffset), DecodeXLogRecord: decodeXLogRecord, } return Decode(d, wal) diff --git a/format/postgres/common/pg_wal/postgres/pg_wal.go b/format/postgres/common/pg_wal/postgres/pg_wal.go index 662f0b1c8..22a57b97f 100644 --- a/format/postgres/common/pg_wal/postgres/pg_wal.go +++ b/format/postgres/common/pg_wal/postgres/pg_wal.go @@ -49,8 +49,7 @@ const ( /* total size (bytes): 12 */ type Wal struct { - MaxOffset int64 - page *walPage + page *walPage pageRecords *decode.D @@ -79,11 +78,6 @@ func Decode(d *decode.D, wal *Wal) any { } posBytes := pages.Pos() / 8 - if posBytes >= wal.MaxOffset { - d.FieldRawLen("unused", d.BitsLeft()) - break - } - remBytes := posBytes % XLOG_BLCKSZ if remBytes != 0 { d.Fatalf("invalid page remBytes = %d\n", remBytes) @@ -193,12 +187,6 @@ func decodeXLogRecords(wal *Wal, d *decode.D) { /* 20 | 4 */ // pg_crc32c xl_crc posBytes1 := d.Pos() / 8 posBytes1Aligned := int64(common.TypeAlign8(uint64(posBytes1))) - // check aligned - this is correct - // record header is 8 byte aligned - if posBytes1Aligned >= wal.MaxOffset { - d.FieldRawLen("unused", d.BitsLeft()) - break - } // check what we cat read xl_tot_len on this page if posMaxOfPageBytes < posBytes1Aligned+4 { diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go index 6e7932236..7d72f3edc 100644 --- a/format/postgres/pg_wal.go +++ b/format/postgres/pg_wal.go @@ -21,9 +21,8 @@ func init() { Name: format.PG_WAL, Description: "PostgreSQL write-ahead log file", DecodeFn: decodePGWAL, - DecodeInArg: format.PostgresWalIn{ + DecodeInArg: format.PostgresIn{ Flavour: PG_FLAVOUR_POSTGRES14, - Lsn: "", }, RootArray: true, RootName: "pages", @@ -48,28 +47,14 @@ func ParseLsn(lsn string) (uint32, error) { return uint32(r1), err } -func XLogSegmentOffset(xLogPtr uint32) uint32 { - const walSegSizeBytes = 16 * 1024 * 1024 - return xLogPtr & (walSegSizeBytes - 1) -} - func decodePGWAL(d *decode.D, in any) any { d.Endian = decode.LittleEndian - pgIn, ok := in.(format.PostgresWalIn) + pgIn, ok := in.(format.PostgresIn) if !ok { d.Fatalf("DecodeInArg must be PostgresIn!\n") } - maxOffset := uint32(0xFFFFFFFF) - if pgIn.Lsn != "" { - lsn, err := ParseLsn(pgIn.Lsn) - if err != nil { - d.Fatalf("Failed to ParseLsn, err = %v\n", err) - } - maxOffset = XLogSegmentOffset(lsn) - } - switch pgIn.Flavour { case PG_FLAVOUR_POSTGRES10, PG_FLAVOUR_POSTGRES11, @@ -81,18 +66,18 @@ func decodePGWAL(d *decode.D, in any) any { PG_FLAVOUR_PGPRO12, PG_FLAVOUR_PGPRO13, PG_FLAVOUR_PGPRO14: - return postgres.DecodePGWAL(d, maxOffset) + return postgres.DecodePGWAL(d) case PG_FLAVOUR_PGPROEE10, PG_FLAVOUR_PGPROEE11, PG_FLAVOUR_PGPROEE12, PG_FLAVOUR_PGPROEE13, PG_FLAVOUR_PGPROEE14: - return pgproee.DecodePGWAL(d, maxOffset) + return pgproee.DecodePGWAL(d) default: break } - return postgres.DecodePGWAL(d, maxOffset) + return postgres.DecodePGWAL(d) } From 5664c0a498f3a394f218fea50b8b1d2c57164d59 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Mon, 7 Nov 2022 13:35:23 +0300 Subject: [PATCH 124/141] postgres: refactor ItemIdData --- format/postgres/common/pg_heap.go | 24 +- .../common/pg_heap/postgres/heap_page.go | 14 +- .../testdata/flavours/pgpro10/16396_1.fqtest | 14 +- .../testdata/flavours/pgpro10/16401_1.fqtest | 70 ++-- .../testdata/flavours/pgpro10/16404_1.fqtest | 14 +- .../testdata/flavours/pgpro11/16396_1.fqtest | 14 +- .../testdata/flavours/pgpro11/16406_1.fqtest | 14 +- .../testdata/flavours/pgpro12/16396_1.fqtest | 14 +- .../testdata/flavours/pgpro12/16406_1.fqtest | 14 +- .../testdata/flavours/pgpro13/16396_1.fqtest | 14 +- .../testdata/flavours/pgpro13/16406_1.fqtest | 14 +- .../testdata/flavours/pgpro14/16396_1.fqtest | 14 +- .../testdata/flavours/pgpro14/16404_1.fqtest | 70 ++-- .../testdata/flavours/pgpro14/16406_1.fqtest | 14 +- .../flavours/pgproee10/16396_1.fqtest | 14 +- .../flavours/pgproee10/16401_1.fqtest | 70 ++-- .../flavours/pgproee10/16403_1.fqtest | 14 +- .../flavours/pgproee11/90150_1.fqtest | 14 +- .../flavours/pgproee12/16396_1.fqtest | 14 +- .../flavours/pgproee12/16406_1.fqtest | 14 +- .../flavours/pgproee13/16396_1.fqtest | 14 +- .../flavours/pgproee13/16406_1.fqtest | 14 +- .../flavours/pgproee14/16396_1.fqtest | 14 +- .../flavours/pgproee14/16404_1.fqtest | 70 ++-- .../flavours/postgres10/16396_1.fqtest | 14 +- .../flavours/postgres10/16401_1.fqtest | 70 ++-- .../flavours/postgres10/16407_1.fqtest | 14 +- .../flavours/postgres11/16396_1.fqtest | 14 +- .../flavours/postgres11/16406_1.fqtest | 14 +- .../flavours/postgres12/16396_1.fqtest | 14 +- .../flavours/postgres12/16406_1.fqtest | 14 +- .../flavours/postgres13/16407_1.fqtest | 21 +- .../flavours/postgres14/16404_2.fqtest | 350 ++++++++++-------- .../flavours/postgres14/16994_1.fqtest | 28 +- .../flavours/postgres14/33233_1.fqtest | 21 +- 35 files changed, 641 insertions(+), 503 deletions(-) diff --git a/format/postgres/common/pg_heap.go b/format/postgres/common/pg_heap.go index 9c4c7da17..3ec43905d 100644 --- a/format/postgres/common/pg_heap.go +++ b/format/postgres/common/pg_heap.go @@ -19,22 +19,10 @@ func TransactionIDIsNormal(xid uint64) bool { return xid >= FirstNormalTransactionID } -type lpOffMapper struct{} - -func (m lpOffMapper) MapScalar(s scalar.S) (scalar.S, error) { - v := s.ActualU() & 0x7fff - s.Actual = v - return s, nil -} - -var LpOffMapper = lpOffMapper{} - type lpFlagsMapper struct{} func (m lpFlagsMapper) MapScalar(s scalar.S) (scalar.S, error) { - v := (s.ActualU() >> 15) & 0x3 - s.Actual = v - switch v { + switch s.ActualU() { case LP_UNUSED: s.Sym = "LP_UNUSED" case LP_NORMAL: @@ -49,16 +37,6 @@ func (m lpFlagsMapper) MapScalar(s scalar.S) (scalar.S, error) { var LpFlagsMapper = lpFlagsMapper{} -type lpLenMapper struct{} - -func (m lpLenMapper) MapScalar(s scalar.S) (scalar.S, error) { - v := (s.ActualU() >> 17) & 0x7fff - s.Actual = v - return s, nil -} - -var LpLenMapper = lpLenMapper{} - type Mask struct { Mask uint64 } diff --git a/format/postgres/common/pg_heap/postgres/heap_page.go b/format/postgres/common/pg_heap/postgres/heap_page.go index 07bc5a175..4851ba947 100644 --- a/format/postgres/common/pg_heap/postgres/heap_page.go +++ b/format/postgres/common/pg_heap/postgres/heap_page.go @@ -85,14 +85,16 @@ func decodeItemIdsInternal(page *HeapPage, d *decode.D) { /* 1: 7 | 4 */ // unsigned int lp_flags: 2 /* 2: 1 | 4 */ // unsigned int lp_len: 15 d.FieldStruct("item_id", func(d *decode.D) { + itemIdData := d.FieldU32("item_id_data") + itemID := ItemID{} + itemID.Off = uint32(itemIdData & 0x7fff) + itemID.Flags = uint32((itemIdData >> 15) & 0x3) + itemID.Len = uint32((itemIdData >> 17) & 0x7fff) - itemPos := d.Pos() - itemID.Off = uint32(d.FieldU32("lp_off", common.LpOffMapper)) - d.SeekAbs(itemPos) - itemID.Flags = uint32(d.FieldU32("lp_flags", common.LpFlagsMapper)) - d.SeekAbs(itemPos) - itemID.Len = uint32(d.FieldU32("lp_len", common.LpLenMapper)) + d.FieldValueU("lp_off", uint64(itemID.Off)) + d.FieldValueU("lp_flags", uint64(itemID.Flags), common.LpFlagsMapper) + d.FieldValueU("lp_len", uint64(itemID.Len)) page.ItemIds = append(page.ItemIds, itemID) }) diff --git a/format/postgres/testdata/flavours/pgpro10/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro10/16396_1.fqtest index ff33055e3..1cdf666a7 100644 --- a/format/postgres/testdata/flavours/pgpro10/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro10/16396_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgpro10 ".[0].pd_linp[0,-1] | dv" 16396 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | item_id_data: 15900544 0x18-0x1b.7 (4) + | | | lp_off: 8064 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 121 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[60]{}: item_id 0x108-0x10b.7 (4) -0x100| 80 81 f2 00 | .... | lp_off: 384 0x108-0x10b.7 (4) -0x100| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x108-0x10b.7 (4) -0x100| 80 81 f2 00 | .... | lp_len: 121 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | item_id_data: 15892864 0x108-0x10b.7 (4) + | | | lp_off: 384 0x10c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x10c-NA (0) + | | | lp_len: 121 0x10c-NA (0) diff --git a/format/postgres/testdata/flavours/pgpro10/16401_1.fqtest b/format/postgres/testdata/flavours/pgpro10/16401_1.fqtest index 3a224aa4e..8c31d3965 100644 --- a/format/postgres/testdata/flavours/pgpro10/16401_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro10/16401_1.fqtest @@ -1,41 +1,51 @@ $ fq -d pg_btree ".[1].pd_linp[0,1,2,3,4,5,6,7,8,9] | dv" 16401 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[0]{}: item_id 0x2018-0x201b.7 (4) -0x2010| 00 89 20 00 | .. . | lp_off: 2304 0x2018-0x201b.7 (4) -0x2010| 00 89 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2018-0x201b.7 (4) -0x2010| 00 89 20 00 | .. . | lp_len: 16 0x2018-0x201b.7 (4) +0x2010| 00 89 20 00 | .. . | item_id_data: 2132224 0x2018-0x201b.7 (4) + | | | lp_off: 2304 0x201c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x201c-NA (0) + | | | lp_len: 16 0x201c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[1]{}: item_id 0x201c-0x201f.7 (4) -0x2010| e0 9f 20 00| .. .| lp_off: 8160 0x201c-0x201f.7 (4) -0x2010| e0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x201c-0x201f.7 (4) -0x2010| e0 9f 20 00| .. .| lp_len: 16 0x201c-0x201f.7 (4) +0x2010| e0 9f 20 00| .. .| item_id_data: 2138080 0x201c-0x201f.7 (4) + | | | lp_off: 8160 0x2020-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2020-NA (0) + | | | lp_len: 16 0x2020-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[2]{}: item_id 0x2020-0x2023.7 (4) -0x2020|d0 9f 20 00 |.. . | lp_off: 8144 0x2020-0x2023.7 (4) -0x2020|d0 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2020-0x2023.7 (4) -0x2020|d0 9f 20 00 |.. . | lp_len: 16 0x2020-0x2023.7 (4) +0x2020|d0 9f 20 00 |.. . | item_id_data: 2138064 0x2020-0x2023.7 (4) + | | | lp_off: 8144 0x2024-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2024-NA (0) + | | | lp_len: 16 0x2024-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[3]{}: item_id 0x2024-0x2027.7 (4) -0x2020| c0 9f 20 00 | .. . | lp_off: 8128 0x2024-0x2027.7 (4) -0x2020| c0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2024-0x2027.7 (4) -0x2020| c0 9f 20 00 | .. . | lp_len: 16 0x2024-0x2027.7 (4) +0x2020| c0 9f 20 00 | .. . | item_id_data: 2138048 0x2024-0x2027.7 (4) + | | | lp_off: 8128 0x2028-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2028-NA (0) + | | | lp_len: 16 0x2028-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[4]{}: item_id 0x2028-0x202b.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_off: 8112 0x2028-0x202b.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2028-0x202b.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_len: 16 0x2028-0x202b.7 (4) +0x2020| b0 9f 20 00 | .. . | item_id_data: 2138032 0x2028-0x202b.7 (4) + | | | lp_off: 8112 0x202c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x202c-NA (0) + | | | lp_len: 16 0x202c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[5]{}: item_id 0x202c-0x202f.7 (4) -0x2020| a0 9f 20 00| .. .| lp_off: 8096 0x202c-0x202f.7 (4) -0x2020| a0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x202c-0x202f.7 (4) -0x2020| a0 9f 20 00| .. .| lp_len: 16 0x202c-0x202f.7 (4) +0x2020| a0 9f 20 00| .. .| item_id_data: 2138016 0x202c-0x202f.7 (4) + | | | lp_off: 8096 0x2030-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2030-NA (0) + | | | lp_len: 16 0x2030-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[6]{}: item_id 0x2030-0x2033.7 (4) -0x2030|90 9f 20 00 |.. . | lp_off: 8080 0x2030-0x2033.7 (4) -0x2030|90 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2030-0x2033.7 (4) -0x2030|90 9f 20 00 |.. . | lp_len: 16 0x2030-0x2033.7 (4) +0x2030|90 9f 20 00 |.. . | item_id_data: 2138000 0x2030-0x2033.7 (4) + | | | lp_off: 8080 0x2034-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2034-NA (0) + | | | lp_len: 16 0x2034-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[7]{}: item_id 0x2034-0x2037.7 (4) -0x2030| 80 9f 20 00 | .. . | lp_off: 8064 0x2034-0x2037.7 (4) -0x2030| 80 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2034-0x2037.7 (4) -0x2030| 80 9f 20 00 | .. . | lp_len: 16 0x2034-0x2037.7 (4) +0x2030| 80 9f 20 00 | .. . | item_id_data: 2137984 0x2034-0x2037.7 (4) + | | | lp_off: 8064 0x2038-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2038-NA (0) + | | | lp_len: 16 0x2038-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[8]{}: item_id 0x2038-0x203b.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_off: 8048 0x2038-0x203b.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_flags: "LP_NORMAL" (1) 0x2038-0x203b.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_len: 16 0x2038-0x203b.7 (4) +0x2030| 70 9f 20 00 | p. . | item_id_data: 2137968 0x2038-0x203b.7 (4) + | | | lp_off: 8048 0x203c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x203c-NA (0) + | | | lp_len: 16 0x203c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[9]{}: item_id 0x203c-0x203f.7 (4) -0x2030| 60 9f 20 00| `. .| lp_off: 8032 0x203c-0x203f.7 (4) -0x2030| 60 9f 20 00| `. .| lp_flags: "LP_NORMAL" (1) 0x203c-0x203f.7 (4) -0x2030| 60 9f 20 00| `. .| lp_len: 16 0x203c-0x203f.7 (4) +0x2030| 60 9f 20 00| `. .| item_id_data: 2137952 0x203c-0x203f.7 (4) + | | | lp_off: 8032 0x2040-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2040-NA (0) + | | | lp_len: 16 0x2040-NA (0) diff --git a/format/postgres/testdata/flavours/pgpro10/16404_1.fqtest b/format/postgres/testdata/flavours/pgpro10/16404_1.fqtest index 3f0d5918e..d5925a6a3 100644 --- a/format/postgres/testdata/flavours/pgpro10/16404_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro10/16404_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgpro10 ".[0].pd_linp[0,-1] | dv" 16404 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | item_id_data: 6332368 0x18-0x1b.7 (4) + | | | lp_off: 8144 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 48 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[99]{}: item_id 0x1a4-0x1a7.7 (4) -0x1a0| 40 8d 60 00 | @.`. | lp_off: 3392 0x1a4-0x1a7.7 (4) -0x1a0| 40 8d 60 00 | @.`. | lp_flags: "LP_NORMAL" (1) 0x1a4-0x1a7.7 (4) -0x1a0| 40 8d 60 00 | @.`. | lp_len: 48 0x1a4-0x1a7.7 (4) +0x1a0| 40 8d 60 00 | @.`. | item_id_data: 6327616 0x1a4-0x1a7.7 (4) + | | | lp_off: 3392 0x1a8-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1a8-NA (0) + | | | lp_len: 48 0x1a8-NA (0) diff --git a/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest index 940b06065..60dd9ac15 100644 --- a/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/16396_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgpro11 ".[0].pd_linp[0,-1] | dv" 16396 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | item_id_data: 15900544 0x18-0x1b.7 (4) + | | | lp_off: 8064 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 121 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[60]{}: item_id 0x108-0x10b.7 (4) -0x100| 80 81 f2 00 | .... | lp_off: 384 0x108-0x10b.7 (4) -0x100| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x108-0x10b.7 (4) -0x100| 80 81 f2 00 | .... | lp_len: 121 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | item_id_data: 15892864 0x108-0x10b.7 (4) + | | | lp_off: 384 0x10c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x10c-NA (0) + | | | lp_len: 121 0x10c-NA (0) diff --git a/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest index 6c856551c..cab27dffb 100644 --- a/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro11/16406_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgpro11 ".[0].pd_linp[0,-1] | dv" 16406 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | item_id_data: 6332368 0x18-0x1b.7 (4) + | | | lp_off: 8144 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 48 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | item_id_data: 6324880 0x288-0x28b.7 (4) + | | | lp_off: 656 0x28c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x28c-NA (0) + | | | lp_len: 48 0x28c-NA (0) diff --git a/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest index a63ea7c53..25f8d346e 100644 --- a/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/16396_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgpro12 ".[0].pd_linp[0,-1] | dv" 16396 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | item_id_data: 15900544 0x18-0x1b.7 (4) + | | | lp_off: 8064 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 121 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[60]{}: item_id 0x108-0x10b.7 (4) -0x100| 80 81 f2 00 | .... | lp_off: 384 0x108-0x10b.7 (4) -0x100| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x108-0x10b.7 (4) -0x100| 80 81 f2 00 | .... | lp_len: 121 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | item_id_data: 15892864 0x108-0x10b.7 (4) + | | | lp_off: 384 0x10c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x10c-NA (0) + | | | lp_len: 121 0x10c-NA (0) diff --git a/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest index e58cdc6dd..d01ff6a05 100644 --- a/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro12/16406_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgpro12 ".[0].pd_linp[0,-1] | dv" 16406 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | item_id_data: 6332368 0x18-0x1b.7 (4) + | | | lp_off: 8144 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 48 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | item_id_data: 6324880 0x288-0x28b.7 (4) + | | | lp_off: 656 0x28c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x28c-NA (0) + | | | lp_len: 48 0x28c-NA (0) diff --git a/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest index 52e2af2dc..99656fd71 100644 --- a/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro13/16396_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgpro13 ".[0].pd_linp[0,-1] | dv" 16396 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | item_id_data: 15900544 0x18-0x1b.7 (4) + | | | lp_off: 8064 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 121 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[60]{}: item_id 0x108-0x10b.7 (4) -0x100| 80 81 f2 00 | .... | lp_off: 384 0x108-0x10b.7 (4) -0x100| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x108-0x10b.7 (4) -0x100| 80 81 f2 00 | .... | lp_len: 121 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | item_id_data: 15892864 0x108-0x10b.7 (4) + | | | lp_off: 384 0x10c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x10c-NA (0) + | | | lp_len: 121 0x10c-NA (0) diff --git a/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest index ff58dd2c3..2305739fc 100644 --- a/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro13/16406_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgpro13 ".[0].pd_linp[0,-1] | dv" 16406 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | item_id_data: 6332368 0x18-0x1b.7 (4) + | | | lp_off: 8144 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 48 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | item_id_data: 6324880 0x288-0x28b.7 (4) + | | | lp_off: 656 0x28c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x28c-NA (0) + | | | lp_len: 48 0x28c-NA (0) diff --git a/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest b/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest index c541fbba1..c4f713b21 100644 --- a/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/16396_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgpro14 ".[0].pd_linp[0,-1] | dv" 16396 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | item_id_data: 15900544 0x18-0x1b.7 (4) + | | | lp_off: 8064 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 121 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[71]{}: item_id 0x134-0x137.7 (4) -0x130| 80 81 f2 00 | .... | lp_off: 384 0x134-0x137.7 (4) -0x130| 80 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x134-0x137.7 (4) -0x130| 80 81 f2 00 | .... | lp_len: 121 0x134-0x137.7 (4) +0x130| 80 81 f2 00 | .... | item_id_data: 15892864 0x134-0x137.7 (4) + | | | lp_off: 384 0x138-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x138-NA (0) + | | | lp_len: 121 0x138-NA (0) diff --git a/format/postgres/testdata/flavours/pgpro14/16404_1.fqtest b/format/postgres/testdata/flavours/pgpro14/16404_1.fqtest index c03305538..562588332 100644 --- a/format/postgres/testdata/flavours/pgpro14/16404_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/16404_1.fqtest @@ -1,41 +1,51 @@ $ fq -d pg_btree ".[1].pd_linp[0,1,2,3,4,5,6,7,8,9] | dv" 16404 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[0]{}: item_id 0x2018-0x201b.7 (4) -0x2010| 00 89 20 00 | .. . | lp_off: 2304 0x2018-0x201b.7 (4) -0x2010| 00 89 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2018-0x201b.7 (4) -0x2010| 00 89 20 00 | .. . | lp_len: 16 0x2018-0x201b.7 (4) +0x2010| 00 89 20 00 | .. . | item_id_data: 2132224 0x2018-0x201b.7 (4) + | | | lp_off: 2304 0x201c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x201c-NA (0) + | | | lp_len: 16 0x201c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[1]{}: item_id 0x201c-0x201f.7 (4) -0x2010| e0 9f 20 00| .. .| lp_off: 8160 0x201c-0x201f.7 (4) -0x2010| e0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x201c-0x201f.7 (4) -0x2010| e0 9f 20 00| .. .| lp_len: 16 0x201c-0x201f.7 (4) +0x2010| e0 9f 20 00| .. .| item_id_data: 2138080 0x201c-0x201f.7 (4) + | | | lp_off: 8160 0x2020-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2020-NA (0) + | | | lp_len: 16 0x2020-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[2]{}: item_id 0x2020-0x2023.7 (4) -0x2020|d0 9f 20 00 |.. . | lp_off: 8144 0x2020-0x2023.7 (4) -0x2020|d0 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2020-0x2023.7 (4) -0x2020|d0 9f 20 00 |.. . | lp_len: 16 0x2020-0x2023.7 (4) +0x2020|d0 9f 20 00 |.. . | item_id_data: 2138064 0x2020-0x2023.7 (4) + | | | lp_off: 8144 0x2024-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2024-NA (0) + | | | lp_len: 16 0x2024-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[3]{}: item_id 0x2024-0x2027.7 (4) -0x2020| c0 9f 20 00 | .. . | lp_off: 8128 0x2024-0x2027.7 (4) -0x2020| c0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2024-0x2027.7 (4) -0x2020| c0 9f 20 00 | .. . | lp_len: 16 0x2024-0x2027.7 (4) +0x2020| c0 9f 20 00 | .. . | item_id_data: 2138048 0x2024-0x2027.7 (4) + | | | lp_off: 8128 0x2028-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2028-NA (0) + | | | lp_len: 16 0x2028-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[4]{}: item_id 0x2028-0x202b.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_off: 8112 0x2028-0x202b.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2028-0x202b.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_len: 16 0x2028-0x202b.7 (4) +0x2020| b0 9f 20 00 | .. . | item_id_data: 2138032 0x2028-0x202b.7 (4) + | | | lp_off: 8112 0x202c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x202c-NA (0) + | | | lp_len: 16 0x202c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[5]{}: item_id 0x202c-0x202f.7 (4) -0x2020| a0 9f 20 00| .. .| lp_off: 8096 0x202c-0x202f.7 (4) -0x2020| a0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x202c-0x202f.7 (4) -0x2020| a0 9f 20 00| .. .| lp_len: 16 0x202c-0x202f.7 (4) +0x2020| a0 9f 20 00| .. .| item_id_data: 2138016 0x202c-0x202f.7 (4) + | | | lp_off: 8096 0x2030-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2030-NA (0) + | | | lp_len: 16 0x2030-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[6]{}: item_id 0x2030-0x2033.7 (4) -0x2030|90 9f 20 00 |.. . | lp_off: 8080 0x2030-0x2033.7 (4) -0x2030|90 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2030-0x2033.7 (4) -0x2030|90 9f 20 00 |.. . | lp_len: 16 0x2030-0x2033.7 (4) +0x2030|90 9f 20 00 |.. . | item_id_data: 2138000 0x2030-0x2033.7 (4) + | | | lp_off: 8080 0x2034-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2034-NA (0) + | | | lp_len: 16 0x2034-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[7]{}: item_id 0x2034-0x2037.7 (4) -0x2030| 80 9f 20 00 | .. . | lp_off: 8064 0x2034-0x2037.7 (4) -0x2030| 80 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2034-0x2037.7 (4) -0x2030| 80 9f 20 00 | .. . | lp_len: 16 0x2034-0x2037.7 (4) +0x2030| 80 9f 20 00 | .. . | item_id_data: 2137984 0x2034-0x2037.7 (4) + | | | lp_off: 8064 0x2038-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2038-NA (0) + | | | lp_len: 16 0x2038-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[8]{}: item_id 0x2038-0x203b.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_off: 8048 0x2038-0x203b.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_flags: "LP_NORMAL" (1) 0x2038-0x203b.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_len: 16 0x2038-0x203b.7 (4) +0x2030| 70 9f 20 00 | p. . | item_id_data: 2137968 0x2038-0x203b.7 (4) + | | | lp_off: 8048 0x203c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x203c-NA (0) + | | | lp_len: 16 0x203c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[9]{}: item_id 0x203c-0x203f.7 (4) -0x2030| 60 9f 20 00| `. .| lp_off: 8032 0x203c-0x203f.7 (4) -0x2030| 60 9f 20 00| `. .| lp_flags: "LP_NORMAL" (1) 0x203c-0x203f.7 (4) -0x2030| 60 9f 20 00| `. .| lp_len: 16 0x203c-0x203f.7 (4) +0x2030| 60 9f 20 00| `. .| item_id_data: 2137952 0x203c-0x203f.7 (4) + | | | lp_off: 8032 0x2040-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2040-NA (0) + | | | lp_len: 16 0x2040-NA (0) diff --git a/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest b/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest index 5e3a3a03a..5db6b6cf3 100644 --- a/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgpro14/16406_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgpro14 ".[0].pd_linp[0,-1] | dv" 16406 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | item_id_data: 6332368 0x18-0x1b.7 (4) + | | | lp_off: 8144 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 48 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | item_id_data: 6324880 0x288-0x28b.7 (4) + | | | lp_off: 656 0x28c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x28c-NA (0) + | | | lp_len: 48 0x28c-NA (0) diff --git a/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest index beae53925..b711337e1 100644 --- a/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/16396_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgproee10 ".[0].pd_linp[0,-1] | dv" 16396 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) -0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) -0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) -0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | item_id_data: 15900520 0x14-0x17.7 (4) + | | | lp_off: 8040 0x18-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x18-NA (0) + | | | lp_len: 121 0x18-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[67]{}: item_id 0x120-0x123.7 (4) -0x120|68 81 f2 00 |h... | lp_off: 360 0x120-0x123.7 (4) -0x120|68 81 f2 00 |h... | lp_flags: "LP_NORMAL" (1) 0x120-0x123.7 (4) -0x120|68 81 f2 00 |h... | lp_len: 121 0x120-0x123.7 (4) +0x120|68 81 f2 00 |h... | item_id_data: 15892840 0x120-0x123.7 (4) + | | | lp_off: 360 0x124-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x124-NA (0) + | | | lp_len: 121 0x124-NA (0) diff --git a/format/postgres/testdata/flavours/pgproee10/16401_1.fqtest b/format/postgres/testdata/flavours/pgproee10/16401_1.fqtest index 3068ca855..fe8970105 100644 --- a/format/postgres/testdata/flavours/pgproee10/16401_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/16401_1.fqtest @@ -1,41 +1,51 @@ $ fq -d pg_btree ".[1].pd_linp[0,1,2,3,4,5,6,7,8,9] | dv" 16401 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[0]{}: item_id 0x2018-0x201b.7 (4) -0x2010| e0 9f 20 00 | .. . | lp_off: 8160 0x2018-0x201b.7 (4) -0x2010| e0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2018-0x201b.7 (4) -0x2010| e0 9f 20 00 | .. . | lp_len: 16 0x2018-0x201b.7 (4) +0x2010| e0 9f 20 00 | .. . | item_id_data: 2138080 0x2018-0x201b.7 (4) + | | | lp_off: 8160 0x201c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x201c-NA (0) + | | | lp_len: 16 0x201c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[1]{}: item_id 0x201c-0x201f.7 (4) -0x2010| d0 9f 20 00| .. .| lp_off: 8144 0x201c-0x201f.7 (4) -0x2010| d0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x201c-0x201f.7 (4) -0x2010| d0 9f 20 00| .. .| lp_len: 16 0x201c-0x201f.7 (4) +0x2010| d0 9f 20 00| .. .| item_id_data: 2138064 0x201c-0x201f.7 (4) + | | | lp_off: 8144 0x2020-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2020-NA (0) + | | | lp_len: 16 0x2020-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[2]{}: item_id 0x2020-0x2023.7 (4) -0x2020|c0 9f 20 00 |.. . | lp_off: 8128 0x2020-0x2023.7 (4) -0x2020|c0 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2020-0x2023.7 (4) -0x2020|c0 9f 20 00 |.. . | lp_len: 16 0x2020-0x2023.7 (4) +0x2020|c0 9f 20 00 |.. . | item_id_data: 2138048 0x2020-0x2023.7 (4) + | | | lp_off: 8128 0x2024-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2024-NA (0) + | | | lp_len: 16 0x2024-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[3]{}: item_id 0x2024-0x2027.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_off: 8112 0x2024-0x2027.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2024-0x2027.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_len: 16 0x2024-0x2027.7 (4) +0x2020| b0 9f 20 00 | .. . | item_id_data: 2138032 0x2024-0x2027.7 (4) + | | | lp_off: 8112 0x2028-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2028-NA (0) + | | | lp_len: 16 0x2028-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[4]{}: item_id 0x2028-0x202b.7 (4) -0x2020| a0 9f 20 00 | .. . | lp_off: 8096 0x2028-0x202b.7 (4) -0x2020| a0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2028-0x202b.7 (4) -0x2020| a0 9f 20 00 | .. . | lp_len: 16 0x2028-0x202b.7 (4) +0x2020| a0 9f 20 00 | .. . | item_id_data: 2138016 0x2028-0x202b.7 (4) + | | | lp_off: 8096 0x202c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x202c-NA (0) + | | | lp_len: 16 0x202c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[5]{}: item_id 0x202c-0x202f.7 (4) -0x2020| 90 9f 20 00| .. .| lp_off: 8080 0x202c-0x202f.7 (4) -0x2020| 90 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x202c-0x202f.7 (4) -0x2020| 90 9f 20 00| .. .| lp_len: 16 0x202c-0x202f.7 (4) +0x2020| 90 9f 20 00| .. .| item_id_data: 2138000 0x202c-0x202f.7 (4) + | | | lp_off: 8080 0x2030-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2030-NA (0) + | | | lp_len: 16 0x2030-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[6]{}: item_id 0x2030-0x2033.7 (4) -0x2030|a0 88 20 00 |.. . | lp_off: 2208 0x2030-0x2033.7 (4) -0x2030|a0 88 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2030-0x2033.7 (4) -0x2030|a0 88 20 00 |.. . | lp_len: 16 0x2030-0x2033.7 (4) +0x2030|a0 88 20 00 |.. . | item_id_data: 2132128 0x2030-0x2033.7 (4) + | | | lp_off: 2208 0x2034-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2034-NA (0) + | | | lp_len: 16 0x2034-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[7]{}: item_id 0x2034-0x2037.7 (4) -0x2030| 80 9f 20 00 | .. . | lp_off: 8064 0x2034-0x2037.7 (4) -0x2030| 80 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2034-0x2037.7 (4) -0x2030| 80 9f 20 00 | .. . | lp_len: 16 0x2034-0x2037.7 (4) +0x2030| 80 9f 20 00 | .. . | item_id_data: 2137984 0x2034-0x2037.7 (4) + | | | lp_off: 8064 0x2038-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2038-NA (0) + | | | lp_len: 16 0x2038-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[8]{}: item_id 0x2038-0x203b.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_off: 8048 0x2038-0x203b.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_flags: "LP_NORMAL" (1) 0x2038-0x203b.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_len: 16 0x2038-0x203b.7 (4) +0x2030| 70 9f 20 00 | p. . | item_id_data: 2137968 0x2038-0x203b.7 (4) + | | | lp_off: 8048 0x203c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x203c-NA (0) + | | | lp_len: 16 0x203c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[9]{}: item_id 0x203c-0x203f.7 (4) -0x2030| 60 9f 20 00| `. .| lp_off: 8032 0x203c-0x203f.7 (4) -0x2030| 60 9f 20 00| `. .| lp_flags: "LP_NORMAL" (1) 0x203c-0x203f.7 (4) -0x2030| 60 9f 20 00| `. .| lp_len: 16 0x203c-0x203f.7 (4) +0x2030| 60 9f 20 00| `. .| item_id_data: 2137952 0x203c-0x203f.7 (4) + | | | lp_off: 8032 0x2040-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2040-NA (0) + | | | lp_len: 16 0x2040-NA (0) diff --git a/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest b/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest index 58addd66f..5789951b2 100644 --- a/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee10/16403_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgproee10 ".[0].pd_linp[0,-1] | dv" 16403 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) -0x10| b8 9f 60 00 | ..`. | lp_off: 8120 0x14-0x17.7 (4) -0x10| b8 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) -0x10| b8 9f 60 00 | ..`. | lp_len: 48 0x14-0x17.7 (4) +0x10| b8 9f 60 00 | ..`. | item_id_data: 6332344 0x14-0x17.7 (4) + | | | lp_off: 8120 0x18-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x18-NA (0) + | | | lp_len: 48 0x18-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[155]{}: item_id 0x280-0x283.7 (4) -0x280|a8 82 60 00 |..`. | lp_off: 680 0x280-0x283.7 (4) -0x280|a8 82 60 00 |..`. | lp_flags: "LP_NORMAL" (1) 0x280-0x283.7 (4) -0x280|a8 82 60 00 |..`. | lp_len: 48 0x280-0x283.7 (4) +0x280|a8 82 60 00 |..`. | item_id_data: 6324904 0x280-0x283.7 (4) + | | | lp_off: 680 0x284-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x284-NA (0) + | | | lp_len: 48 0x284-NA (0) diff --git a/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest b/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest index c5e844623..1e08c13b2 100644 --- a/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee11/90150_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgproee11 ".[0].pd_linp[0,-1] | dv" 90150 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) -0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) -0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) -0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | item_id_data: 15900520 0x14-0x17.7 (4) + | | | lp_off: 8040 0x18-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x18-NA (0) + | | | lp_len: 121 0x18-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[60]{}: item_id 0x104-0x107.7 (4) -0x100| 68 81 f2 00 | h... | lp_off: 360 0x104-0x107.7 (4) -0x100| 68 81 f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x104-0x107.7 (4) -0x100| 68 81 f2 00 | h... | lp_len: 121 0x104-0x107.7 (4) +0x100| 68 81 f2 00 | h... | item_id_data: 15892840 0x104-0x107.7 (4) + | | | lp_off: 360 0x108-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x108-NA (0) + | | | lp_len: 121 0x108-NA (0) diff --git a/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest index dab0d1ccb..73997b281 100644 --- a/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/16396_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgproee12 ".[0].pd_linp[0,-1] | dv" 16396 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) -0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) -0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) -0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | item_id_data: 15900520 0x14-0x17.7 (4) + | | | lp_off: 8040 0x18-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x18-NA (0) + | | | lp_len: 121 0x18-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[65]{}: item_id 0x118-0x11b.7 (4) -0x110| 68 81 f2 00 | h... | lp_off: 360 0x118-0x11b.7 (4) -0x110| 68 81 f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x118-0x11b.7 (4) -0x110| 68 81 f2 00 | h... | lp_len: 121 0x118-0x11b.7 (4) +0x110| 68 81 f2 00 | h... | item_id_data: 15892840 0x118-0x11b.7 (4) + | | | lp_off: 360 0x11c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x11c-NA (0) + | | | lp_len: 121 0x11c-NA (0) diff --git a/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest b/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest index 805ea8744..8b10391ae 100644 --- a/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee12/16406_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgproee12 ".[0].pd_linp[0,-1] | dv" 16406 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) -0x10| b8 9f 60 00 | ..`. | lp_off: 8120 0x14-0x17.7 (4) -0x10| b8 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) -0x10| b8 9f 60 00 | ..`. | lp_len: 48 0x14-0x17.7 (4) +0x10| b8 9f 60 00 | ..`. | item_id_data: 6332344 0x14-0x17.7 (4) + | | | lp_off: 8120 0x18-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x18-NA (0) + | | | lp_len: 48 0x18-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[155]{}: item_id 0x280-0x283.7 (4) -0x280|a8 82 60 00 |..`. | lp_off: 680 0x280-0x283.7 (4) -0x280|a8 82 60 00 |..`. | lp_flags: "LP_NORMAL" (1) 0x280-0x283.7 (4) -0x280|a8 82 60 00 |..`. | lp_len: 48 0x280-0x283.7 (4) +0x280|a8 82 60 00 |..`. | item_id_data: 6324904 0x280-0x283.7 (4) + | | | lp_off: 680 0x284-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x284-NA (0) + | | | lp_len: 48 0x284-NA (0) diff --git a/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest index 52be1562a..1fbe7b824 100644 --- a/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee13/16396_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgproee13 ".[0].pd_linp[0,-1] | dv" 16396 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) -0x10| 68 9f f2 00 | h... | lp_off: 8040 0x14-0x17.7 (4) -0x10| 68 9f f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) -0x10| 68 9f f2 00 | h... | lp_len: 121 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | item_id_data: 15900520 0x14-0x17.7 (4) + | | | lp_off: 8040 0x18-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x18-NA (0) + | | | lp_len: 121 0x18-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[68]{}: item_id 0x124-0x127.7 (4) -0x120| 68 81 f2 00 | h... | lp_off: 360 0x124-0x127.7 (4) -0x120| 68 81 f2 00 | h... | lp_flags: "LP_NORMAL" (1) 0x124-0x127.7 (4) -0x120| 68 81 f2 00 | h... | lp_len: 121 0x124-0x127.7 (4) +0x120| 68 81 f2 00 | h... | item_id_data: 15892840 0x124-0x127.7 (4) + | | | lp_off: 360 0x128-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x128-NA (0) + | | | lp_len: 121 0x128-NA (0) diff --git a/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest b/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest index 8193fb36b..25156cd8f 100644 --- a/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee13/16406_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgproee13 ".[0].pd_linp[0,-1] | dv" 16406 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) -0x10| b8 9f 60 00 | ..`. | lp_off: 8120 0x14-0x17.7 (4) -0x10| b8 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x14-0x17.7 (4) -0x10| b8 9f 60 00 | ..`. | lp_len: 48 0x14-0x17.7 (4) +0x10| b8 9f 60 00 | ..`. | item_id_data: 6332344 0x14-0x17.7 (4) + | | | lp_off: 8120 0x18-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x18-NA (0) + | | | lp_len: 48 0x18-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[155]{}: item_id 0x280-0x283.7 (4) -0x280|a8 82 60 00 |..`. | lp_off: 680 0x280-0x283.7 (4) -0x280|a8 82 60 00 |..`. | lp_flags: "LP_NORMAL" (1) 0x280-0x283.7 (4) -0x280|a8 82 60 00 |..`. | lp_len: 48 0x280-0x283.7 (4) +0x280|a8 82 60 00 |..`. | item_id_data: 6324904 0x280-0x283.7 (4) + | | | lp_off: 680 0x284-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x284-NA (0) + | | | lp_len: 48 0x284-NA (0) diff --git a/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest b/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest index e84d4dbf0..ac487d369 100644 --- a/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee14/16396_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=pgproee14 ".[0].pd_linp[0,-1] | dv" 16396 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) -0x10| 53 00 01 00 | S... | lp_off: 83 0x14-0x17.7 (4) -0x10| 53 00 01 00 | S... | lp_flags: "LP_REDIRECT" (2) 0x14-0x17.7 (4) -0x10| 53 00 01 00 | S... | lp_len: 0 0x14-0x17.7 (4) +0x10| 53 00 01 00 | S... | item_id_data: 65619 0x14-0x17.7 (4) + | | | lp_off: 83 0x18-NA (0) + | | | lp_flags: "LP_REDIRECT" (2) 0x18-NA (0) + | | | lp_len: 0 0x18-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[85]{}: item_id 0x168-0x16b.7 (4) -0x160| e8 81 f2 00 | .... | lp_off: 488 0x168-0x16b.7 (4) -0x160| e8 81 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x168-0x16b.7 (4) -0x160| e8 81 f2 00 | .... | lp_len: 121 0x168-0x16b.7 (4) +0x160| e8 81 f2 00 | .... | item_id_data: 15892968 0x168-0x16b.7 (4) + | | | lp_off: 488 0x16c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x16c-NA (0) + | | | lp_len: 121 0x16c-NA (0) diff --git a/format/postgres/testdata/flavours/pgproee14/16404_1.fqtest b/format/postgres/testdata/flavours/pgproee14/16404_1.fqtest index 886aa7316..a38f9f839 100644 --- a/format/postgres/testdata/flavours/pgproee14/16404_1.fqtest +++ b/format/postgres/testdata/flavours/pgproee14/16404_1.fqtest @@ -1,41 +1,51 @@ $ fq -d pg_btree ".[1].pd_linp[0,1,2,3,4,5,6,7,8,9] | dv" 16404 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[0]{}: item_id 0x2018-0x201b.7 (4) -0x2010| e0 9f 20 00 | .. . | lp_off: 8160 0x2018-0x201b.7 (4) -0x2010| e0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2018-0x201b.7 (4) -0x2010| e0 9f 20 00 | .. . | lp_len: 16 0x2018-0x201b.7 (4) +0x2010| e0 9f 20 00 | .. . | item_id_data: 2138080 0x2018-0x201b.7 (4) + | | | lp_off: 8160 0x201c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x201c-NA (0) + | | | lp_len: 16 0x201c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[1]{}: item_id 0x201c-0x201f.7 (4) -0x2010| d0 9f 20 00| .. .| lp_off: 8144 0x201c-0x201f.7 (4) -0x2010| d0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x201c-0x201f.7 (4) -0x2010| d0 9f 20 00| .. .| lp_len: 16 0x201c-0x201f.7 (4) +0x2010| d0 9f 20 00| .. .| item_id_data: 2138064 0x201c-0x201f.7 (4) + | | | lp_off: 8144 0x2020-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2020-NA (0) + | | | lp_len: 16 0x2020-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[2]{}: item_id 0x2020-0x2023.7 (4) -0x2020|c0 9f 20 00 |.. . | lp_off: 8128 0x2020-0x2023.7 (4) -0x2020|c0 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2020-0x2023.7 (4) -0x2020|c0 9f 20 00 |.. . | lp_len: 16 0x2020-0x2023.7 (4) +0x2020|c0 9f 20 00 |.. . | item_id_data: 2138048 0x2020-0x2023.7 (4) + | | | lp_off: 8128 0x2024-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2024-NA (0) + | | | lp_len: 16 0x2024-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[3]{}: item_id 0x2024-0x2027.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_off: 8112 0x2024-0x2027.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2024-0x2027.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_len: 16 0x2024-0x2027.7 (4) +0x2020| b0 9f 20 00 | .. . | item_id_data: 2138032 0x2024-0x2027.7 (4) + | | | lp_off: 8112 0x2028-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2028-NA (0) + | | | lp_len: 16 0x2028-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[4]{}: item_id 0x2028-0x202b.7 (4) -0x2020| a0 9f 20 00 | .. . | lp_off: 8096 0x2028-0x202b.7 (4) -0x2020| a0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2028-0x202b.7 (4) -0x2020| a0 9f 20 00 | .. . | lp_len: 16 0x2028-0x202b.7 (4) +0x2020| a0 9f 20 00 | .. . | item_id_data: 2138016 0x2028-0x202b.7 (4) + | | | lp_off: 8096 0x202c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x202c-NA (0) + | | | lp_len: 16 0x202c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[5]{}: item_id 0x202c-0x202f.7 (4) -0x2020| 90 9f 20 00| .. .| lp_off: 8080 0x202c-0x202f.7 (4) -0x2020| 90 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x202c-0x202f.7 (4) -0x2020| 90 9f 20 00| .. .| lp_len: 16 0x202c-0x202f.7 (4) +0x2020| 90 9f 20 00| .. .| item_id_data: 2138000 0x202c-0x202f.7 (4) + | | | lp_off: 8080 0x2030-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2030-NA (0) + | | | lp_len: 16 0x2030-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[6]{}: item_id 0x2030-0x2033.7 (4) -0x2030|80 9f 20 00 |.. . | lp_off: 8064 0x2030-0x2033.7 (4) -0x2030|80 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2030-0x2033.7 (4) -0x2030|80 9f 20 00 |.. . | lp_len: 16 0x2030-0x2033.7 (4) +0x2030|80 9f 20 00 |.. . | item_id_data: 2137984 0x2030-0x2033.7 (4) + | | | lp_off: 8064 0x2034-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2034-NA (0) + | | | lp_len: 16 0x2034-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[7]{}: item_id 0x2034-0x2037.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_off: 8048 0x2034-0x2037.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_flags: "LP_NORMAL" (1) 0x2034-0x2037.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_len: 16 0x2034-0x2037.7 (4) +0x2030| 70 9f 20 00 | p. . | item_id_data: 2137968 0x2034-0x2037.7 (4) + | | | lp_off: 8048 0x2038-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2038-NA (0) + | | | lp_len: 16 0x2038-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[8]{}: item_id 0x2038-0x203b.7 (4) -0x2030| 60 9f 20 00 | `. . | lp_off: 8032 0x2038-0x203b.7 (4) -0x2030| 60 9f 20 00 | `. . | lp_flags: "LP_NORMAL" (1) 0x2038-0x203b.7 (4) -0x2030| 60 9f 20 00 | `. . | lp_len: 16 0x2038-0x203b.7 (4) +0x2030| 60 9f 20 00 | `. . | item_id_data: 2137952 0x2038-0x203b.7 (4) + | | | lp_off: 8032 0x203c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x203c-NA (0) + | | | lp_len: 16 0x203c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[9]{}: item_id 0x203c-0x203f.7 (4) -0x2030| 50 9f 20 00| P. .| lp_off: 8016 0x203c-0x203f.7 (4) -0x2030| 50 9f 20 00| P. .| lp_flags: "LP_NORMAL" (1) 0x203c-0x203f.7 (4) -0x2030| 50 9f 20 00| P. .| lp_len: 16 0x203c-0x203f.7 (4) +0x2030| 50 9f 20 00| P. .| item_id_data: 2137936 0x203c-0x203f.7 (4) + | | | lp_off: 8016 0x2040-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2040-NA (0) + | | | lp_len: 16 0x2040-NA (0) diff --git a/format/postgres/testdata/flavours/postgres10/16396_1.fqtest b/format/postgres/testdata/flavours/postgres10/16396_1.fqtest index 7c0114fb3..3f00055ea 100644 --- a/format/postgres/testdata/flavours/postgres10/16396_1.fqtest +++ b/format/postgres/testdata/flavours/postgres10/16396_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=postgres10 ".[0].pd_linp[0,-1] | dv" 16396 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | item_id_data: 15900544 0x18-0x1b.7 (4) + | | | lp_off: 8064 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 121 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[75]{}: item_id 0x144-0x147.7 (4) -0x140| 80 82 f2 00 | .... | lp_off: 640 0x144-0x147.7 (4) -0x140| 80 82 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x144-0x147.7 (4) -0x140| 80 82 f2 00 | .... | lp_len: 121 0x144-0x147.7 (4) +0x140| 80 82 f2 00 | .... | item_id_data: 15893120 0x144-0x147.7 (4) + | | | lp_off: 640 0x148-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x148-NA (0) + | | | lp_len: 121 0x148-NA (0) diff --git a/format/postgres/testdata/flavours/postgres10/16401_1.fqtest b/format/postgres/testdata/flavours/postgres10/16401_1.fqtest index 3a224aa4e..8c31d3965 100644 --- a/format/postgres/testdata/flavours/postgres10/16401_1.fqtest +++ b/format/postgres/testdata/flavours/postgres10/16401_1.fqtest @@ -1,41 +1,51 @@ $ fq -d pg_btree ".[1].pd_linp[0,1,2,3,4,5,6,7,8,9] | dv" 16401 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[0]{}: item_id 0x2018-0x201b.7 (4) -0x2010| 00 89 20 00 | .. . | lp_off: 2304 0x2018-0x201b.7 (4) -0x2010| 00 89 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2018-0x201b.7 (4) -0x2010| 00 89 20 00 | .. . | lp_len: 16 0x2018-0x201b.7 (4) +0x2010| 00 89 20 00 | .. . | item_id_data: 2132224 0x2018-0x201b.7 (4) + | | | lp_off: 2304 0x201c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x201c-NA (0) + | | | lp_len: 16 0x201c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[1]{}: item_id 0x201c-0x201f.7 (4) -0x2010| e0 9f 20 00| .. .| lp_off: 8160 0x201c-0x201f.7 (4) -0x2010| e0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x201c-0x201f.7 (4) -0x2010| e0 9f 20 00| .. .| lp_len: 16 0x201c-0x201f.7 (4) +0x2010| e0 9f 20 00| .. .| item_id_data: 2138080 0x201c-0x201f.7 (4) + | | | lp_off: 8160 0x2020-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2020-NA (0) + | | | lp_len: 16 0x2020-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[2]{}: item_id 0x2020-0x2023.7 (4) -0x2020|d0 9f 20 00 |.. . | lp_off: 8144 0x2020-0x2023.7 (4) -0x2020|d0 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2020-0x2023.7 (4) -0x2020|d0 9f 20 00 |.. . | lp_len: 16 0x2020-0x2023.7 (4) +0x2020|d0 9f 20 00 |.. . | item_id_data: 2138064 0x2020-0x2023.7 (4) + | | | lp_off: 8144 0x2024-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2024-NA (0) + | | | lp_len: 16 0x2024-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[3]{}: item_id 0x2024-0x2027.7 (4) -0x2020| c0 9f 20 00 | .. . | lp_off: 8128 0x2024-0x2027.7 (4) -0x2020| c0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2024-0x2027.7 (4) -0x2020| c0 9f 20 00 | .. . | lp_len: 16 0x2024-0x2027.7 (4) +0x2020| c0 9f 20 00 | .. . | item_id_data: 2138048 0x2024-0x2027.7 (4) + | | | lp_off: 8128 0x2028-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2028-NA (0) + | | | lp_len: 16 0x2028-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[4]{}: item_id 0x2028-0x202b.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_off: 8112 0x2028-0x202b.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2028-0x202b.7 (4) -0x2020| b0 9f 20 00 | .. . | lp_len: 16 0x2028-0x202b.7 (4) +0x2020| b0 9f 20 00 | .. . | item_id_data: 2138032 0x2028-0x202b.7 (4) + | | | lp_off: 8112 0x202c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x202c-NA (0) + | | | lp_len: 16 0x202c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[5]{}: item_id 0x202c-0x202f.7 (4) -0x2020| a0 9f 20 00| .. .| lp_off: 8096 0x202c-0x202f.7 (4) -0x2020| a0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) 0x202c-0x202f.7 (4) -0x2020| a0 9f 20 00| .. .| lp_len: 16 0x202c-0x202f.7 (4) +0x2020| a0 9f 20 00| .. .| item_id_data: 2138016 0x202c-0x202f.7 (4) + | | | lp_off: 8096 0x2030-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2030-NA (0) + | | | lp_len: 16 0x2030-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[6]{}: item_id 0x2030-0x2033.7 (4) -0x2030|90 9f 20 00 |.. . | lp_off: 8080 0x2030-0x2033.7 (4) -0x2030|90 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) 0x2030-0x2033.7 (4) -0x2030|90 9f 20 00 |.. . | lp_len: 16 0x2030-0x2033.7 (4) +0x2030|90 9f 20 00 |.. . | item_id_data: 2138000 0x2030-0x2033.7 (4) + | | | lp_off: 8080 0x2034-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2034-NA (0) + | | | lp_len: 16 0x2034-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[7]{}: item_id 0x2034-0x2037.7 (4) -0x2030| 80 9f 20 00 | .. . | lp_off: 8064 0x2034-0x2037.7 (4) -0x2030| 80 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) 0x2034-0x2037.7 (4) -0x2030| 80 9f 20 00 | .. . | lp_len: 16 0x2034-0x2037.7 (4) +0x2030| 80 9f 20 00 | .. . | item_id_data: 2137984 0x2034-0x2037.7 (4) + | | | lp_off: 8064 0x2038-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2038-NA (0) + | | | lp_len: 16 0x2038-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[8]{}: item_id 0x2038-0x203b.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_off: 8048 0x2038-0x203b.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_flags: "LP_NORMAL" (1) 0x2038-0x203b.7 (4) -0x2030| 70 9f 20 00 | p. . | lp_len: 16 0x2038-0x203b.7 (4) +0x2030| 70 9f 20 00 | p. . | item_id_data: 2137968 0x2038-0x203b.7 (4) + | | | lp_off: 8048 0x203c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x203c-NA (0) + | | | lp_len: 16 0x203c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1].pd_linp[9]{}: item_id 0x203c-0x203f.7 (4) -0x2030| 60 9f 20 00| `. .| lp_off: 8032 0x203c-0x203f.7 (4) -0x2030| 60 9f 20 00| `. .| lp_flags: "LP_NORMAL" (1) 0x203c-0x203f.7 (4) -0x2030| 60 9f 20 00| `. .| lp_len: 16 0x203c-0x203f.7 (4) +0x2030| 60 9f 20 00| `. .| item_id_data: 2137952 0x203c-0x203f.7 (4) + | | | lp_off: 8032 0x2040-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x2040-NA (0) + | | | lp_len: 16 0x2040-NA (0) diff --git a/format/postgres/testdata/flavours/postgres10/16407_1.fqtest b/format/postgres/testdata/flavours/postgres10/16407_1.fqtest index 8f254bb62..2e97e7550 100644 --- a/format/postgres/testdata/flavours/postgres10/16407_1.fqtest +++ b/format/postgres/testdata/flavours/postgres10/16407_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=postgres10 ".[0].pd_linp[0,-1] | dv" 16407 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | item_id_data: 6332368 0x18-0x1b.7 (4) + | | | lp_off: 8144 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 48 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | item_id_data: 6324880 0x288-0x28b.7 (4) + | | | lp_off: 656 0x28c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x28c-NA (0) + | | | lp_len: 48 0x28c-NA (0) diff --git a/format/postgres/testdata/flavours/postgres11/16396_1.fqtest b/format/postgres/testdata/flavours/postgres11/16396_1.fqtest index 511eca935..652f03003 100644 --- a/format/postgres/testdata/flavours/postgres11/16396_1.fqtest +++ b/format/postgres/testdata/flavours/postgres11/16396_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=postgres11 ".[0].pd_linp[0,-1] | dv" 16396 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | item_id_data: 15900544 0x18-0x1b.7 (4) + | | | lp_off: 8064 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 121 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[82]{}: item_id 0x160-0x163.7 (4) -0x160|00 82 f2 00 |.... | lp_off: 512 0x160-0x163.7 (4) -0x160|00 82 f2 00 |.... | lp_flags: "LP_NORMAL" (1) 0x160-0x163.7 (4) -0x160|00 82 f2 00 |.... | lp_len: 121 0x160-0x163.7 (4) +0x160|00 82 f2 00 |.... | item_id_data: 15892992 0x160-0x163.7 (4) + | | | lp_off: 512 0x164-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x164-NA (0) + | | | lp_len: 121 0x164-NA (0) diff --git a/format/postgres/testdata/flavours/postgres11/16406_1.fqtest b/format/postgres/testdata/flavours/postgres11/16406_1.fqtest index cdf9acd24..b79008e5a 100644 --- a/format/postgres/testdata/flavours/postgres11/16406_1.fqtest +++ b/format/postgres/testdata/flavours/postgres11/16406_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=postgres11 ".[0].pd_linp[0,-1] | dv" 16406 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | item_id_data: 6332368 0x18-0x1b.7 (4) + | | | lp_off: 8144 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 48 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | item_id_data: 6324880 0x288-0x28b.7 (4) + | | | lp_off: 656 0x28c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x28c-NA (0) + | | | lp_len: 48 0x28c-NA (0) diff --git a/format/postgres/testdata/flavours/postgres12/16396_1.fqtest b/format/postgres/testdata/flavours/postgres12/16396_1.fqtest index f3f5683e5..33794ba8a 100644 --- a/format/postgres/testdata/flavours/postgres12/16396_1.fqtest +++ b/format/postgres/testdata/flavours/postgres12/16396_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=postgres12 ".[0].pd_linp[0,-1] | dv" 16396 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_off: 8064 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| 80 9f f2 00 | .... | lp_len: 121 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | item_id_data: 15900544 0x18-0x1b.7 (4) + | | | lp_off: 8064 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 121 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[81]{}: item_id 0x15c-0x15f.7 (4) -0x150| 00 82 f2 00| ....| lp_off: 512 0x15c-0x15f.7 (4) -0x150| 00 82 f2 00| ....| lp_flags: "LP_NORMAL" (1) 0x15c-0x15f.7 (4) -0x150| 00 82 f2 00| ....| lp_len: 121 0x15c-0x15f.7 (4) +0x150| 00 82 f2 00| ....| item_id_data: 15892992 0x15c-0x15f.7 (4) + | | | lp_off: 512 0x160-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x160-NA (0) + | | | lp_len: 121 0x160-NA (0) diff --git a/format/postgres/testdata/flavours/postgres12/16406_1.fqtest b/format/postgres/testdata/flavours/postgres12/16406_1.fqtest index 63dc3ae6e..9aeccb977 100644 --- a/format/postgres/testdata/flavours/postgres12/16406_1.fqtest +++ b/format/postgres/testdata/flavours/postgres12/16406_1.fqtest @@ -1,9 +1,11 @@ $ fq -d pg_heap -o flavour=postgres12 ".[0].pd_linp[0,-1] | dv" 16406 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | item_id_data: 6332368 0x18-0x1b.7 (4) + | | | lp_off: 8144 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 48 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | item_id_data: 6324880 0x288-0x28b.7 (4) + | | | lp_off: 656 0x28c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x28c-NA (0) + | | | lp_len: 48 0x28c-NA (0) diff --git a/format/postgres/testdata/flavours/postgres13/16407_1.fqtest b/format/postgres/testdata/flavours/postgres13/16407_1.fqtest index bc7bd0526..4b1d02b03 100644 --- a/format/postgres/testdata/flavours/postgres13/16407_1.fqtest +++ b/format/postgres/testdata/flavours/postgres13/16407_1.fqtest @@ -1,13 +1,16 @@ $ fq -d pg_heap -o flavour=postgres13 ".[0].pd_linp[0, 1, -1] | dv" 16407 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_off: 8144 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x18-0x1b.7 (4) -0x10| d0 9f 60 00 | ..`. | lp_len: 48 0x18-0x1b.7 (4) +0x10| d0 9f 60 00 | ..`. | item_id_data: 6332368 0x18-0x1b.7 (4) + | | | lp_off: 8144 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 48 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) -0x10| a0 9f 60 00| ..`.| lp_off: 8096 0x1c-0x1f.7 (4) -0x10| a0 9f 60 00| ..`.| lp_flags: "LP_NORMAL" (1) 0x1c-0x1f.7 (4) -0x10| a0 9f 60 00| ..`.| lp_len: 48 0x1c-0x1f.7 (4) +0x10| a0 9f 60 00| ..`.| item_id_data: 6332320 0x1c-0x1f.7 (4) + | | | lp_off: 8096 0x20-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x20-NA (0) + | | | lp_len: 48 0x20-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[156]{}: item_id 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_off: 656 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_flags: "LP_NORMAL" (1) 0x288-0x28b.7 (4) -0x280| 90 82 60 00 | ..`. | lp_len: 48 0x288-0x28b.7 (4) +0x280| 90 82 60 00 | ..`. | item_id_data: 6324880 0x288-0x28b.7 (4) + | | | lp_off: 656 0x28c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x28c-NA (0) + | | | lp_len: 48 0x28c-NA (0) diff --git a/format/postgres/testdata/flavours/postgres14/16404_2.fqtest b/format/postgres/testdata/flavours/postgres14/16404_2.fqtest index 94079e749..3b3472efe 100644 --- a/format/postgres/testdata/flavours/postgres14/16404_2.fqtest +++ b/format/postgres/testdata/flavours/postgres14/16404_2.fqtest @@ -58,205 +58,255 @@ $ fq -d pg_btree -o flavour=postgres14 ".[] | d" 16404 0x2010| 00 00 00 00 | .... | pd_prune_xid: 0 | | | pd_linp[0:367]: | | | [0]{}: item_id -0x2010| 00 89 20 00 | .. . | lp_off: 2304 -0x2010| 00 89 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x2010| 00 89 20 00 | .. . | lp_len: 16 +0x2010| 00 89 20 00 | .. . | item_id_data: 2132224 + | | | lp_off: 2304 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [1]{}: item_id -0x2010| e0 9f 20 00| .. .| lp_off: 8160 -0x2010| e0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) -0x2010| e0 9f 20 00| .. .| lp_len: 16 +0x2010| e0 9f 20 00| .. .| item_id_data: 2138080 + | | | lp_off: 8160 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [2]{}: item_id -0x2020|d0 9f 20 00 |.. . | lp_off: 8144 -0x2020|d0 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) -0x2020|d0 9f 20 00 |.. . | lp_len: 16 +0x2020|d0 9f 20 00 |.. . | item_id_data: 2138064 + | | | lp_off: 8144 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [3]{}: item_id -0x2020| c0 9f 20 00 | .. . | lp_off: 8128 -0x2020| c0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x2020| c0 9f 20 00 | .. . | lp_len: 16 +0x2020| c0 9f 20 00 | .. . | item_id_data: 2138048 + | | | lp_off: 8128 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [4]{}: item_id -0x2020| b0 9f 20 00 | .. . | lp_off: 8112 -0x2020| b0 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x2020| b0 9f 20 00 | .. . | lp_len: 16 +0x2020| b0 9f 20 00 | .. . | item_id_data: 2138032 + | | | lp_off: 8112 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [5]{}: item_id -0x2020| a0 9f 20 00| .. .| lp_off: 8096 -0x2020| a0 9f 20 00| .. .| lp_flags: "LP_NORMAL" (1) -0x2020| a0 9f 20 00| .. .| lp_len: 16 +0x2020| a0 9f 20 00| .. .| item_id_data: 2138016 + | | | lp_off: 8096 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [6]{}: item_id -0x2030|90 9f 20 00 |.. . | lp_off: 8080 -0x2030|90 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) -0x2030|90 9f 20 00 |.. . | lp_len: 16 +0x2030|90 9f 20 00 |.. . | item_id_data: 2138000 + | | | lp_off: 8080 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [7]{}: item_id -0x2030| 80 9f 20 00 | .. . | lp_off: 8064 -0x2030| 80 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x2030| 80 9f 20 00 | .. . | lp_len: 16 +0x2030| 80 9f 20 00 | .. . | item_id_data: 2137984 + | | | lp_off: 8064 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [8]{}: item_id -0x2030| 70 9f 20 00 | p. . | lp_off: 8048 -0x2030| 70 9f 20 00 | p. . | lp_flags: "LP_NORMAL" (1) -0x2030| 70 9f 20 00 | p. . | lp_len: 16 +0x2030| 70 9f 20 00 | p. . | item_id_data: 2137968 + | | | lp_off: 8048 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [9]{}: item_id -0x2030| 60 9f 20 00| `. .| lp_off: 8032 -0x2030| 60 9f 20 00| `. .| lp_flags: "LP_NORMAL" (1) -0x2030| 60 9f 20 00| `. .| lp_len: 16 +0x2030| 60 9f 20 00| `. .| item_id_data: 2137952 + | | | lp_off: 8032 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [10]{}: item_id -0x2040|50 9f 20 00 |P. . | lp_off: 8016 -0x2040|50 9f 20 00 |P. . | lp_flags: "LP_NORMAL" (1) -0x2040|50 9f 20 00 |P. . | lp_len: 16 +0x2040|50 9f 20 00 |P. . | item_id_data: 2137936 + | | | lp_off: 8016 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [11]{}: item_id -0x2040| 40 9f 20 00 | @. . | lp_off: 8000 -0x2040| 40 9f 20 00 | @. . | lp_flags: "LP_NORMAL" (1) -0x2040| 40 9f 20 00 | @. . | lp_len: 16 +0x2040| 40 9f 20 00 | @. . | item_id_data: 2137920 + | | | lp_off: 8000 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [12]{}: item_id -0x2040| 30 9f 20 00 | 0. . | lp_off: 7984 -0x2040| 30 9f 20 00 | 0. . | lp_flags: "LP_NORMAL" (1) -0x2040| 30 9f 20 00 | 0. . | lp_len: 16 +0x2040| 30 9f 20 00 | 0. . | item_id_data: 2137904 + | | | lp_off: 7984 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [13]{}: item_id -0x2040| 20 9f 20 00| . .| lp_off: 7968 -0x2040| 20 9f 20 00| . .| lp_flags: "LP_NORMAL" (1) -0x2040| 20 9f 20 00| . .| lp_len: 16 +0x2040| 20 9f 20 00| . .| item_id_data: 2137888 + | | | lp_off: 7968 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [14]{}: item_id -0x2050|10 9f 20 00 |.. . | lp_off: 7952 -0x2050|10 9f 20 00 |.. . | lp_flags: "LP_NORMAL" (1) -0x2050|10 9f 20 00 |.. . | lp_len: 16 +0x2050|10 9f 20 00 |.. . | item_id_data: 2137872 + | | | lp_off: 7952 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [15]{}: item_id -0x2050| 00 9f 20 00 | .. . | lp_off: 7936 -0x2050| 00 9f 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x2050| 00 9f 20 00 | .. . | lp_len: 16 +0x2050| 00 9f 20 00 | .. . | item_id_data: 2137856 + | | | lp_off: 7936 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [16]{}: item_id -0x2050| f0 9e 20 00 | .. . | lp_off: 7920 -0x2050| f0 9e 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x2050| f0 9e 20 00 | .. . | lp_len: 16 +0x2050| f0 9e 20 00 | .. . | item_id_data: 2137840 + | | | lp_off: 7920 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [17]{}: item_id -0x2050| e0 9e 20 00| .. .| lp_off: 7904 -0x2050| e0 9e 20 00| .. .| lp_flags: "LP_NORMAL" (1) -0x2050| e0 9e 20 00| .. .| lp_len: 16 +0x2050| e0 9e 20 00| .. .| item_id_data: 2137824 + | | | lp_off: 7904 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [18]{}: item_id -0x2060|d0 9e 20 00 |.. . | lp_off: 7888 -0x2060|d0 9e 20 00 |.. . | lp_flags: "LP_NORMAL" (1) -0x2060|d0 9e 20 00 |.. . | lp_len: 16 +0x2060|d0 9e 20 00 |.. . | item_id_data: 2137808 + | | | lp_off: 7888 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [19]{}: item_id -0x2060| c0 9e 20 00 | .. . | lp_off: 7872 -0x2060| c0 9e 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x2060| c0 9e 20 00 | .. . | lp_len: 16 +0x2060| c0 9e 20 00 | .. . | item_id_data: 2137792 + | | | lp_off: 7872 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [20]{}: item_id -0x2060| b0 9e 20 00 | .. . | lp_off: 7856 -0x2060| b0 9e 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x2060| b0 9e 20 00 | .. . | lp_len: 16 +0x2060| b0 9e 20 00 | .. . | item_id_data: 2137776 + | | | lp_off: 7856 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [21]{}: item_id -0x2060| a0 9e 20 00| .. .| lp_off: 7840 -0x2060| a0 9e 20 00| .. .| lp_flags: "LP_NORMAL" (1) -0x2060| a0 9e 20 00| .. .| lp_len: 16 +0x2060| a0 9e 20 00| .. .| item_id_data: 2137760 + | | | lp_off: 7840 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [22]{}: item_id -0x2070|90 9e 20 00 |.. . | lp_off: 7824 -0x2070|90 9e 20 00 |.. . | lp_flags: "LP_NORMAL" (1) -0x2070|90 9e 20 00 |.. . | lp_len: 16 +0x2070|90 9e 20 00 |.. . | item_id_data: 2137744 + | | | lp_off: 7824 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [23]{}: item_id -0x2070| 80 9e 20 00 | .. . | lp_off: 7808 -0x2070| 80 9e 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x2070| 80 9e 20 00 | .. . | lp_len: 16 +0x2070| 80 9e 20 00 | .. . | item_id_data: 2137728 + | | | lp_off: 7808 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [24]{}: item_id -0x2070| 70 9e 20 00 | p. . | lp_off: 7792 -0x2070| 70 9e 20 00 | p. . | lp_flags: "LP_NORMAL" (1) -0x2070| 70 9e 20 00 | p. . | lp_len: 16 +0x2070| 70 9e 20 00 | p. . | item_id_data: 2137712 + | | | lp_off: 7792 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [25]{}: item_id -0x2070| 60 9e 20 00| `. .| lp_off: 7776 -0x2070| 60 9e 20 00| `. .| lp_flags: "LP_NORMAL" (1) -0x2070| 60 9e 20 00| `. .| lp_len: 16 +0x2070| 60 9e 20 00| `. .| item_id_data: 2137696 + | | | lp_off: 7776 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [26]{}: item_id -0x2080|50 9e 20 00 |P. . | lp_off: 7760 -0x2080|50 9e 20 00 |P. . | lp_flags: "LP_NORMAL" (1) -0x2080|50 9e 20 00 |P. . | lp_len: 16 +0x2080|50 9e 20 00 |P. . | item_id_data: 2137680 + | | | lp_off: 7760 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [27]{}: item_id -0x2080| 40 9e 20 00 | @. . | lp_off: 7744 -0x2080| 40 9e 20 00 | @. . | lp_flags: "LP_NORMAL" (1) -0x2080| 40 9e 20 00 | @. . | lp_len: 16 +0x2080| 40 9e 20 00 | @. . | item_id_data: 2137664 + | | | lp_off: 7744 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [28]{}: item_id -0x2080| 30 9e 20 00 | 0. . | lp_off: 7728 -0x2080| 30 9e 20 00 | 0. . | lp_flags: "LP_NORMAL" (1) -0x2080| 30 9e 20 00 | 0. . | lp_len: 16 +0x2080| 30 9e 20 00 | 0. . | item_id_data: 2137648 + | | | lp_off: 7728 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [29]{}: item_id -0x2080| 20 9e 20 00| . .| lp_off: 7712 -0x2080| 20 9e 20 00| . .| lp_flags: "LP_NORMAL" (1) -0x2080| 20 9e 20 00| . .| lp_len: 16 +0x2080| 20 9e 20 00| . .| item_id_data: 2137632 + | | | lp_off: 7712 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [30]{}: item_id -0x2090|10 9e 20 00 |.. . | lp_off: 7696 -0x2090|10 9e 20 00 |.. . | lp_flags: "LP_NORMAL" (1) -0x2090|10 9e 20 00 |.. . | lp_len: 16 +0x2090|10 9e 20 00 |.. . | item_id_data: 2137616 + | | | lp_off: 7696 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [31]{}: item_id -0x2090| 00 9e 20 00 | .. . | lp_off: 7680 -0x2090| 00 9e 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x2090| 00 9e 20 00 | .. . | lp_len: 16 +0x2090| 00 9e 20 00 | .. . | item_id_data: 2137600 + | | | lp_off: 7680 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [32]{}: item_id -0x2090| f0 9d 20 00 | .. . | lp_off: 7664 -0x2090| f0 9d 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x2090| f0 9d 20 00 | .. . | lp_len: 16 +0x2090| f0 9d 20 00 | .. . | item_id_data: 2137584 + | | | lp_off: 7664 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [33]{}: item_id -0x2090| e0 9d 20 00| .. .| lp_off: 7648 -0x2090| e0 9d 20 00| .. .| lp_flags: "LP_NORMAL" (1) -0x2090| e0 9d 20 00| .. .| lp_len: 16 +0x2090| e0 9d 20 00| .. .| item_id_data: 2137568 + | | | lp_off: 7648 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [34]{}: item_id -0x20a0|d0 9d 20 00 |.. . | lp_off: 7632 -0x20a0|d0 9d 20 00 |.. . | lp_flags: "LP_NORMAL" (1) -0x20a0|d0 9d 20 00 |.. . | lp_len: 16 +0x20a0|d0 9d 20 00 |.. . | item_id_data: 2137552 + | | | lp_off: 7632 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [35]{}: item_id -0x20a0| c0 9d 20 00 | .. . | lp_off: 7616 -0x20a0| c0 9d 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x20a0| c0 9d 20 00 | .. . | lp_len: 16 +0x20a0| c0 9d 20 00 | .. . | item_id_data: 2137536 + | | | lp_off: 7616 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [36]{}: item_id -0x20a0| b0 9d 20 00 | .. . | lp_off: 7600 -0x20a0| b0 9d 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x20a0| b0 9d 20 00 | .. . | lp_len: 16 +0x20a0| b0 9d 20 00 | .. . | item_id_data: 2137520 + | | | lp_off: 7600 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [37]{}: item_id -0x20a0| a0 9d 20 00| .. .| lp_off: 7584 -0x20a0| a0 9d 20 00| .. .| lp_flags: "LP_NORMAL" (1) -0x20a0| a0 9d 20 00| .. .| lp_len: 16 +0x20a0| a0 9d 20 00| .. .| item_id_data: 2137504 + | | | lp_off: 7584 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [38]{}: item_id -0x20b0|90 9d 20 00 |.. . | lp_off: 7568 -0x20b0|90 9d 20 00 |.. . | lp_flags: "LP_NORMAL" (1) -0x20b0|90 9d 20 00 |.. . | lp_len: 16 +0x20b0|90 9d 20 00 |.. . | item_id_data: 2137488 + | | | lp_off: 7568 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [39]{}: item_id -0x20b0| 80 9d 20 00 | .. . | lp_off: 7552 -0x20b0| 80 9d 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x20b0| 80 9d 20 00 | .. . | lp_len: 16 +0x20b0| 80 9d 20 00 | .. . | item_id_data: 2137472 + | | | lp_off: 7552 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [40]{}: item_id -0x20b0| 70 9d 20 00 | p. . | lp_off: 7536 -0x20b0| 70 9d 20 00 | p. . | lp_flags: "LP_NORMAL" (1) -0x20b0| 70 9d 20 00 | p. . | lp_len: 16 +0x20b0| 70 9d 20 00 | p. . | item_id_data: 2137456 + | | | lp_off: 7536 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [41]{}: item_id -0x20b0| 60 9d 20 00| `. .| lp_off: 7520 -0x20b0| 60 9d 20 00| `. .| lp_flags: "LP_NORMAL" (1) -0x20b0| 60 9d 20 00| `. .| lp_len: 16 +0x20b0| 60 9d 20 00| `. .| item_id_data: 2137440 + | | | lp_off: 7520 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [42]{}: item_id -0x20c0|50 9d 20 00 |P. . | lp_off: 7504 -0x20c0|50 9d 20 00 |P. . | lp_flags: "LP_NORMAL" (1) -0x20c0|50 9d 20 00 |P. . | lp_len: 16 +0x20c0|50 9d 20 00 |P. . | item_id_data: 2137424 + | | | lp_off: 7504 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [43]{}: item_id -0x20c0| 40 9d 20 00 | @. . | lp_off: 7488 -0x20c0| 40 9d 20 00 | @. . | lp_flags: "LP_NORMAL" (1) -0x20c0| 40 9d 20 00 | @. . | lp_len: 16 +0x20c0| 40 9d 20 00 | @. . | item_id_data: 2137408 + | | | lp_off: 7488 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [44]{}: item_id -0x20c0| 30 9d 20 00 | 0. . | lp_off: 7472 -0x20c0| 30 9d 20 00 | 0. . | lp_flags: "LP_NORMAL" (1) -0x20c0| 30 9d 20 00 | 0. . | lp_len: 16 +0x20c0| 30 9d 20 00 | 0. . | item_id_data: 2137392 + | | | lp_off: 7472 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [45]{}: item_id -0x20c0| 20 9d 20 00| . .| lp_off: 7456 -0x20c0| 20 9d 20 00| . .| lp_flags: "LP_NORMAL" (1) -0x20c0| 20 9d 20 00| . .| lp_len: 16 +0x20c0| 20 9d 20 00| . .| item_id_data: 2137376 + | | | lp_off: 7456 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [46]{}: item_id -0x20d0|10 9d 20 00 |.. . | lp_off: 7440 -0x20d0|10 9d 20 00 |.. . | lp_flags: "LP_NORMAL" (1) -0x20d0|10 9d 20 00 |.. . | lp_len: 16 +0x20d0|10 9d 20 00 |.. . | item_id_data: 2137360 + | | | lp_off: 7440 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [47]{}: item_id -0x20d0| 00 9d 20 00 | .. . | lp_off: 7424 -0x20d0| 00 9d 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x20d0| 00 9d 20 00 | .. . | lp_len: 16 +0x20d0| 00 9d 20 00 | .. . | item_id_data: 2137344 + | | | lp_off: 7424 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [48]{}: item_id -0x20d0| f0 9c 20 00 | .. . | lp_off: 7408 -0x20d0| f0 9c 20 00 | .. . | lp_flags: "LP_NORMAL" (1) -0x20d0| f0 9c 20 00 | .. . | lp_len: 16 +0x20d0| f0 9c 20 00 | .. . | item_id_data: 2137328 + | | | lp_off: 7408 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [49]{}: item_id -0x20d0| e0 9c 20 00| .. .| lp_off: 7392 -0x20d0| e0 9c 20 00| .. .| lp_flags: "LP_NORMAL" (1) -0x20d0| e0 9c 20 00| .. .| lp_len: 16 +0x20d0| e0 9c 20 00| .. .| item_id_data: 2137312 + | | | lp_off: 7392 + | | | lp_flags: "LP_NORMAL" (1) + | | | lp_len: 16 | | | [50:367]: ... 0x25d0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| free_space: "00000000000000000000000000000000000000000000000..." (raw bits) 0x25e0|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| diff --git a/format/postgres/testdata/flavours/postgres14/16994_1.fqtest b/format/postgres/testdata/flavours/postgres14/16994_1.fqtest index 9e4e6d68b..d5da3d8ef 100644 --- a/format/postgres/testdata/flavours/postgres14/16994_1.fqtest +++ b/format/postgres/testdata/flavours/postgres14/16994_1.fqtest @@ -1,17 +1,21 @@ $ fq -d pg_heap -o flavour=postgres14 ".[0].pd_linp[0, 1, 2, -1] | dv" 16994 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| 00 80 01 00 | .... | lp_off: 0 0x18-0x1b.7 (4) -0x10| 00 80 01 00 | .... | lp_flags: "LP_DEAD" (3) 0x18-0x1b.7 (4) -0x10| 00 80 01 00 | .... | lp_len: 0 0x18-0x1b.7 (4) +0x10| 00 80 01 00 | .... | item_id_data: 98304 0x18-0x1b.7 (4) + | | | lp_off: 0 0x1c-NA (0) + | | | lp_flags: "LP_DEAD" (3) 0x1c-NA (0) + | | | lp_len: 0 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) -0x10| e0 9f 38 00| ..8.| lp_off: 8160 0x1c-0x1f.7 (4) -0x10| e0 9f 38 00| ..8.| lp_flags: "LP_NORMAL" (1) 0x1c-0x1f.7 (4) -0x10| e0 9f 38 00| ..8.| lp_len: 28 0x1c-0x1f.7 (4) +0x10| e0 9f 38 00| ..8.| item_id_data: 3710944 0x1c-0x1f.7 (4) + | | | lp_off: 8160 0x20-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x20-NA (0) + | | | lp_len: 28 0x20-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[2]{}: item_id 0x20-0x23.7 (4) -0x20|c0 9f 38 00 |..8. | lp_off: 8128 0x20-0x23.7 (4) -0x20|c0 9f 38 00 |..8. | lp_flags: "LP_NORMAL" (1) 0x20-0x23.7 (4) -0x20|c0 9f 38 00 |..8. | lp_len: 28 0x20-0x23.7 (4) +0x20|c0 9f 38 00 |..8. | item_id_data: 3710912 0x20-0x23.7 (4) + | | | lp_off: 8128 0x24-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x24-NA (0) + | | | lp_len: 28 0x24-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[225]{}: item_id 0x39c-0x39f.7 (4) -0x390| e0 83 38 00| ..8.| lp_off: 992 0x39c-0x39f.7 (4) -0x390| e0 83 38 00| ..8.| lp_flags: "LP_NORMAL" (1) 0x39c-0x39f.7 (4) -0x390| e0 83 38 00| ..8.| lp_len: 28 0x39c-0x39f.7 (4) +0x390| e0 83 38 00| ..8.| item_id_data: 3703776 0x39c-0x39f.7 (4) + | | | lp_off: 992 0x3a0-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x3a0-NA (0) + | | | lp_len: 28 0x3a0-NA (0) diff --git a/format/postgres/testdata/flavours/postgres14/33233_1.fqtest b/format/postgres/testdata/flavours/postgres14/33233_1.fqtest index c85b0d98a..13cfb15dc 100644 --- a/format/postgres/testdata/flavours/postgres14/33233_1.fqtest +++ b/format/postgres/testdata/flavours/postgres14/33233_1.fqtest @@ -1,13 +1,16 @@ $ fq -d pg_heap -o flavour=postgres14 ".[0].pd_linp[0, 1, -1] | dv" 33233 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) -0x10| 4d 00 01 00 | M... | lp_off: 77 0x18-0x1b.7 (4) -0x10| 4d 00 01 00 | M... | lp_flags: "LP_REDIRECT" (2) 0x18-0x1b.7 (4) -0x10| 4d 00 01 00 | M... | lp_len: 0 0x18-0x1b.7 (4) +0x10| 4d 00 01 00 | M... | item_id_data: 65613 0x18-0x1b.7 (4) + | | | lp_off: 77 0x1c-NA (0) + | | | lp_flags: "LP_REDIRECT" (2) 0x1c-NA (0) + | | | lp_len: 0 0x1c-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) -0x10| 6a 00 01 00| j...| lp_off: 106 0x1c-0x1f.7 (4) -0x10| 6a 00 01 00| j...| lp_flags: "LP_REDIRECT" (2) 0x1c-0x1f.7 (4) -0x10| 6a 00 01 00| j...| lp_len: 0 0x1c-0x1f.7 (4) +0x10| 6a 00 01 00| j...| item_id_data: 65642 0x1c-0x1f.7 (4) + | | | lp_off: 106 0x20-NA (0) + | | | lp_flags: "LP_REDIRECT" (2) 0x20-NA (0) + | | | lp_len: 0 0x20-NA (0) |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[119]{}: item_id 0x1f4-0x1f7.7 (4) -0x1f0| 80 82 f2 00 | .... | lp_off: 640 0x1f4-0x1f7.7 (4) -0x1f0| 80 82 f2 00 | .... | lp_flags: "LP_NORMAL" (1) 0x1f4-0x1f7.7 (4) -0x1f0| 80 82 f2 00 | .... | lp_len: 121 0x1f4-0x1f7.7 (4) +0x1f0| 80 82 f2 00 | .... | item_id_data: 15893120 0x1f4-0x1f7.7 (4) + | | | lp_off: 640 0x1f8-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1f8-NA (0) + | | | lp_len: 121 0x1f8-NA (0) From e8bb1692f6a633994dd0d98701b71e0e56eaaa41 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Wed, 9 Nov 2022 16:57:56 +0300 Subject: [PATCH 125/141] postgres: fix pg_wal when XLogRecord size is more than page size --- format/postgres/common/pg_wal/postgres/pg_wal.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/format/postgres/common/pg_wal/postgres/pg_wal.go b/format/postgres/common/pg_wal/postgres/pg_wal.go index 22a57b97f..d9ba4b948 100644 --- a/format/postgres/common/pg_wal/postgres/pg_wal.go +++ b/format/postgres/common/pg_wal/postgres/pg_wal.go @@ -89,6 +89,8 @@ func Decode(d *decode.D, wal *Wal) any { func decodeXLogPage(wal *Wal, d *decode.D) { pos0 := d.Pos() + posPageEnd := pos0 + XLOG_BLCKSZ*8 + d.SeekRel(8 * 8) xlpPageAddr0 := d.U64() d.SeekAbs(pos0) @@ -142,6 +144,13 @@ func decodeXLogPage(wal *Wal, d *decode.D) { pos1 := header.Pos() xLogPage.SeekAbs(pos1) + maxBitOnPage := posPageEnd - pos1 + if remLen > maxBitOnPage { + // XLogRecord size is more than page size + remLen = maxBitOnPage + remLenBytesAligned = remLen / 8 + } + // parted XLogRecord if remLen > 0 { if wal.State == nil { From 015b770585121ca317b8b06a0c4d7ceceb2c5da0 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Thu, 10 Nov 2022 11:32:25 +0300 Subject: [PATCH 126/141] postgres: wal support multiple xlog_body for wal record --- format/postgres/common/pg_wal/postgres/pg_wal.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/format/postgres/common/pg_wal/postgres/pg_wal.go b/format/postgres/common/pg_wal/postgres/pg_wal.go index d9ba4b948..9bafe454f 100644 --- a/format/postgres/common/pg_wal/postgres/pg_wal.go +++ b/format/postgres/common/pg_wal/postgres/pg_wal.go @@ -1,6 +1,8 @@ package postgres import ( + "fmt" + "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/pkg/decode" ) @@ -279,12 +281,12 @@ func decodeXLogRecord(wal *Wal, maxBytes int64) { pos0 := record.Pos() maxLen := maxBytes * 8 - if record.FieldGet("xlog_body0") == nil { - // body on first page - record.FieldRawLen("xlog_body0", maxLen) - } else { - // body on second page - record.FieldRawLen("xlog_body1", maxLen) + for i := 0; ; i++ { + fieldName := fmt.Sprintf("xlog_body%d", i) + if record.FieldGet(fieldName) == nil { + record.FieldRawLen(fieldName, maxLen) + break + } } pos1 := record.Pos() posMax := pos1 From 60709e5a0093089ae6540d574e7530bf12d39529 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Wed, 23 Nov 2022 13:55:07 +0300 Subject: [PATCH 127/141] postgres: remove pg_wal. Failed to implement. --- format/format.go | 4 - .../postgres/common/pg_wal/pgproee/decode.go | 13 - .../postgres/common/pg_wal/pgproee/pg_wal.go | 76 -- .../postgres/common/pg_wal/postgres/decode.go | 10 - .../postgres/common/pg_wal/postgres/pg_wal.go | 349 -------- format/postgres/pg_multixact.go | 82 -- format/postgres/pg_wal.go | 83 -- format/postgres/pg_wal_page.go | 31 - format/postgres/pg_wal_test.go | 32 - .../flavours/pgpro10/000000010000000000000001 | Bin 16384 -> 0 bytes .../pgpro10/000000010000000000000001_1.fqtest | 64 -- .../flavours/pgpro14/00000001000000000000000A | Bin 16384 -> 0 bytes .../pgpro14/00000001000000000000000A_1.fqtest | 116 --- .../pgproee10/000000010000000000000001 | Bin 16384 -> 0 bytes .../000000010000000000000001_1.fqtest | 67 -- .../pgproee13/000000010000017A0000005B | Bin 16384 -> 0 bytes .../000000010000017A0000005B_1.fqtest | 808 ------------------ .../pgproee14/000000010000000600000028 | Bin 16384 -> 0 bytes .../000000010000000600000028_1.fqtest | 53 -- .../postgres14/00000001000000000000004E | Bin 16384 -> 0 bytes .../00000001000000000000004E_1.fqtest | 54 -- .../postgres14/00000001000001AE000000CD | Bin 16384 -> 0 bytes .../00000001000001AE000000CD_1.fqtest | 405 --------- 23 files changed, 2247 deletions(-) delete mode 100644 format/postgres/common/pg_wal/pgproee/decode.go delete mode 100644 format/postgres/common/pg_wal/pgproee/pg_wal.go delete mode 100644 format/postgres/common/pg_wal/postgres/decode.go delete mode 100644 format/postgres/common/pg_wal/postgres/pg_wal.go delete mode 100644 format/postgres/pg_multixact.go delete mode 100644 format/postgres/pg_wal.go delete mode 100644 format/postgres/pg_wal_page.go delete mode 100644 format/postgres/pg_wal_test.go delete mode 100644 format/postgres/testdata/flavours/pgpro10/000000010000000000000001 delete mode 100644 format/postgres/testdata/flavours/pgpro10/000000010000000000000001_1.fqtest delete mode 100644 format/postgres/testdata/flavours/pgpro14/00000001000000000000000A delete mode 100644 format/postgres/testdata/flavours/pgpro14/00000001000000000000000A_1.fqtest delete mode 100644 format/postgres/testdata/flavours/pgproee10/000000010000000000000001 delete mode 100644 format/postgres/testdata/flavours/pgproee10/000000010000000000000001_1.fqtest delete mode 100644 format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B delete mode 100644 format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B_1.fqtest delete mode 100644 format/postgres/testdata/flavours/pgproee14/000000010000000600000028 delete mode 100644 format/postgres/testdata/flavours/pgproee14/000000010000000600000028_1.fqtest delete mode 100644 format/postgres/testdata/flavours/postgres14/00000001000000000000004E delete mode 100644 format/postgres/testdata/flavours/postgres14/00000001000000000000004E_1.fqtest delete mode 100644 format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD delete mode 100644 format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD_1.fqtest diff --git a/format/format.go b/format/format.go index b43caedf2..dd525ed2b 100644 --- a/format/format.go +++ b/format/format.go @@ -105,10 +105,6 @@ const ( PCAP = "pcap" PCAPNG = "pcapng" PG_BTREE = "pg_btree" - PG_WAL = "pg_wal" - PG_WALPAGE = "pg_wal_page" - PG_MULTIXACTOFF = "pg_multixact_offsets" - PG_MULTIXACTMEM = "pg_multixact_members" PG_CONTROL = "pg_control" PG_HEAP = "pg_heap" PNG = "png" diff --git a/format/postgres/common/pg_wal/pgproee/decode.go b/format/postgres/common/pg_wal/pgproee/decode.go deleted file mode 100644 index fe48c0627..000000000 --- a/format/postgres/common/pg_wal/pgproee/decode.go +++ /dev/null @@ -1,13 +0,0 @@ -package pgproee - -import ( - "github.com/wader/fq/format/postgres/common/pg_wal/postgres" - "github.com/wader/fq/pkg/decode" -) - -func DecodePGWAL(d *decode.D) any { - wal := &postgres.Wal{ - DecodeXLogRecord: decodeXLogRecord, - } - return postgres.Decode(d, wal) -} diff --git a/format/postgres/common/pg_wal/pgproee/pg_wal.go b/format/postgres/common/pg_wal/pgproee/pg_wal.go deleted file mode 100644 index ec212f316..000000000 --- a/format/postgres/common/pg_wal/pgproee/pg_wal.go +++ /dev/null @@ -1,76 +0,0 @@ -package pgproee - -import ( - "github.com/wader/fq/format/postgres/common" - "github.com/wader/fq/format/postgres/common/pg_wal/postgres" -) - -func decodeXLogRecord(wal *postgres.Wal, maxBytes int64) { - record := wal.State.Record - - pos0 := record.Pos() - maxLen := maxBytes * 8 - if record.FieldGet("xlog_body0") == nil { - // body on first page - record.FieldRawLen("xlog_body0", maxLen) - } else { - // body on second page - record.FieldRawLen("xlog_body1", maxLen) - } - pos1 := record.Pos() - posMax := pos1 - record.SeekAbs(pos0) - - // xl_tot_len already read - - if record.FieldGet("hole0") == nil { - if postgres.IsEnd(record, posMax, 32) { - return - } - record.FieldU32("hole0") - } - - if record.FieldGet("xl_xid") == nil { - if postgres.IsEnd(record, posMax, 64) { - return - } - record.FieldU64("xl_xid") - } - - if record.FieldGet("xl_prev") == nil { - if postgres.IsEnd(record, posMax, 64) { - return - } - record.FieldU64("xl_prev", common.XLogRecPtrMapper) - } - - if record.FieldGet("xl_info") == nil { - if postgres.IsEnd(record, posMax, 8) { - return - } - record.FieldU8("xl_info") - } - - if record.FieldGet("xl_rmid") == nil { - if postgres.IsEnd(record, posMax, 8) { - return - } - record.FieldU8("xl_rmid") - } - - if record.FieldGet("hole1") == nil { - if postgres.IsEnd(record, posMax, 16) { - return - } - record.FieldU16("hole1") - } - - if record.FieldGet("xl_crc") == nil { - if postgres.IsEnd(record, posMax, 32) { - return - } - record.FieldU32("xl_crc") - } - - record.SeekAbs(posMax) -} diff --git a/format/postgres/common/pg_wal/postgres/decode.go b/format/postgres/common/pg_wal/postgres/decode.go deleted file mode 100644 index 0f899d6c0..000000000 --- a/format/postgres/common/pg_wal/postgres/decode.go +++ /dev/null @@ -1,10 +0,0 @@ -package postgres - -import "github.com/wader/fq/pkg/decode" - -func DecodePGWAL(d *decode.D) any { - wal := &Wal{ - DecodeXLogRecord: decodeXLogRecord, - } - return Decode(d, wal) -} diff --git a/format/postgres/common/pg_wal/postgres/pg_wal.go b/format/postgres/common/pg_wal/postgres/pg_wal.go deleted file mode 100644 index 9bafe454f..000000000 --- a/format/postgres/common/pg_wal/postgres/pg_wal.go +++ /dev/null @@ -1,349 +0,0 @@ -package postgres - -import ( - "fmt" - - "github.com/wader/fq/format/postgres/common" - "github.com/wader/fq/pkg/decode" -) - -//nolint:revive -const ( - XLOG_BLCKSZ = 8192 - XLP_LONG_HEADER = 2 -) - -// struct XLogLongPageHeaderData { -// /* 0 | 24 */ XLogPageHeaderData std; -// /* 24 | 8 */ uint64 xlp_sysid; -// /* 32 | 4 */ uint32 xlp_seg_size; -// /* 36 | 4 */ uint32 xlp_xlog_blcksz; -// -// /* total size (bytes): 40 */ -//} - -// struct XLogPageHeaderData { -/* 0 | 2 */ // uint16 xlp_magic; -/* 2 | 2 */ // uint16 xlp_info; -/* 4 | 4 */ // TimeLineID xlp_tli; -/* 8 | 8 */ // XLogRecPtr xlp_pageaddr; -/* 16 | 4 */ // uint32 xlp_rem_len; -/* XXX 4-byte padding */ -// -/* total size (bytes): 24 */ - -// struct XLogRecord { -/* 0 | 4 */ // uint32 xl_tot_len -/* 4 | 4 */ // TransactionId xl_xid -/* 8 | 8 */ // XLogRecPtr xl_prev -/* 16 | 1 */ // uint8 xl_info -/* 17 | 1 */ // RmgrId xl_rmid -/* XXX 2-byte hole */ -/* 20 | 4 */ // pg_crc32c xl_crc -// -/* total size (bytes): 24 */ - -// struct RelFileNode { -/* 0 | 4 */ // Oid spcNode -/* 4 | 4 */ // Oid dbNode -/* 8 | 4 */ // Oid relNode -// -/* total size (bytes): 12 */ - -type Wal struct { - page *walPage - - pageRecords *decode.D - - State *walState - - DecodeXLogRecord func(wal *Wal, maxBytes int64) -} - -type walState struct { - Record *decode.D - recordRemLenBytes int64 -} - -type walPage struct { - xlpPageAddr uint64 -} - -func Decode(d *decode.D, wal *Wal) any { - pages := d - - for { - decodeXLogPage(wal, pages) - - if pages.End() { - break - } - - posBytes := pages.Pos() / 8 - remBytes := posBytes % XLOG_BLCKSZ - if remBytes != 0 { - d.Fatalf("invalid page remBytes = %d\n", remBytes) - } - } - - return nil -} - -func decodeXLogPage(wal *Wal, d *decode.D) { - pos0 := d.Pos() - posPageEnd := pos0 + XLOG_BLCKSZ*8 - - d.SeekRel(8 * 8) - xlpPageAddr0 := d.U64() - d.SeekAbs(pos0) - if wal.page != nil { - xlpPageAddr1 := wal.page.xlpPageAddr + XLOG_BLCKSZ - if xlpPageAddr0 != xlpPageAddr1 { - d.Fatalf("invalid xlp_pageaddr expected = %d, actual = %d\n", xlpPageAddr1, xlpPageAddr0) - } - } - wal.page = &walPage{} - - // type = struct XLogPageHeaderData { - /* 0 | 2 */ // uint16 xlp_magic; - /* 2 | 2 */ // uint16 xlp_info; - /* 4 | 4 */ // TimeLineID xlp_tli; - /* 8 | 8 */ // XLogRecPtr xlp_pageaddr; - /* 16 | 4 */ // uint32 xlp_rem_len; - /* XXX 4-byte padding */ - xLogPage := d.FieldStructValue("page") - header := xLogPage.FieldStructValue("xloog_page_header_data") - - header.FieldU16("xlp_magic") - xlpInfo := header.FieldU16("xlp_info") - header.FieldU32("xlp_tli") - wal.page.xlpPageAddr = header.FieldU64("xlp_pageaddr") - remLenBytes := header.FieldU32("xlp_rem_len") - header.FieldU32("padding0") - - //if (xlpMagic & XLOG_PAGE_MAGIC_MASK) == 0 { - // d.Fatalf("invalid xlp_magic = %X\n", xlpMagic) - //} - - if (xlpInfo & XLP_LONG_HEADER) != 0 { - // Long header - header.FieldStruct("xlog_long_page_header_data", func(d *decode.D) { - d.FieldU64("xlp_sysid") - d.FieldU32("xlp_seg_size") - d.FieldU32("xlp_xlog_blcksz") - }) - } - - if wal.State != nil { // check recordRemLenBytes is initialized - if wal.State.recordRemLenBytes != int64(remLenBytes) { - d.Fatalf("recordRemLenBytes = %d != remLenBytes = %d", wal.State.recordRemLenBytes, remLenBytes) - } - } - - remLenBytesAligned := int64(common.TypeAlign8(remLenBytes)) - remLen := remLenBytesAligned * 8 - - pos1 := header.Pos() - xLogPage.SeekAbs(pos1) - - maxBitOnPage := posPageEnd - pos1 - if remLen > maxBitOnPage { - // XLogRecord size is more than page size - remLen = maxBitOnPage - remLenBytesAligned = remLen / 8 - } - - // parted XLogRecord - if remLen > 0 { - if wal.State == nil { - // record of previous file - checkPosBytes := xLogPage.Pos() / 8 - if checkPosBytes >= XLOG_BLCKSZ { - d.Fatalf("invalid pos of raw_bytes_of_prev_wal_file, pos = %d\n", checkPosBytes) - } - xLogPage.FieldRawLen("raw_bytes_of_prev_wal_file", remLen) - } else { - // record of previous page - wal.DecodeXLogRecord(wal, remLenBytesAligned) - } - } - - pos2 := xLogPage.Pos() - - if wal.State != nil && wal.State.Record != nil { - wal.State.Record.SeekAbs(pos1) - } - - xLogPage.SeekAbs(pos2) - pageRecords := xLogPage.FieldArrayValue("records") - - wal.pageRecords = pageRecords - - decodeXLogRecords(wal, d) -} - -func decodeXLogRecords(wal *Wal, d *decode.D) { - pageRecords := wal.pageRecords - - posBytes := d.Pos() / 8 - posMaxOfPageBytes := int64(common.TypeAlign(XLOG_BLCKSZ, uint64(posBytes))) - - for { - /* 0 | 4 */ // uint32 xl_tot_len - /* 4 | 4 */ // TransactionId xl_xid - /* 8 | 8 */ // XLogRecPtr xl_prev - /* 16 | 1 */ // uint8 xl_info - /* 17 | 1 */ // RmgrId xl_rmid - /* XXX 2-byte hole */ - /* 20 | 4 */ // pg_crc32c xl_crc - posBytes1 := d.Pos() / 8 - posBytes1Aligned := int64(common.TypeAlign8(uint64(posBytes1))) - - // check what we cat read xl_tot_len on this page - if posMaxOfPageBytes < posBytes1Aligned+4 { - remOnPage := posMaxOfPageBytes - posBytes1 - d.FieldRawLen("page_padding0", remOnPage*8) - // can't read xl_tot_len on this page - // can't create row in this page - // continue on next page - wal.State = nil - return - } - - if posBytes1 != posBytes1Aligned { - // ensure align - d.SeekAbs(posBytes1Aligned * 8) - } - - record := pageRecords.FieldStructValue("xlog_record") - wal.State = &walState{ - Record: record, - } - - lsn0 := uint64(d.Pos() / 8) - lsn1 := lsn0 % XLOG_BLCKSZ - lsn := lsn1 + wal.page.xlpPageAddr - record.FieldValueU("lsn", lsn, common.XLogRecPtrMapper) - - xlTotLen := record.FieldU32("xl_tot_len") - if xlTotLen < 4 { - d.Fatalf("xl_tot_len is less than 4\n") - } - xlTotLen1Bytes := xlTotLen - 4 - pos2Bytes := d.Pos() / 8 - - remOnPage := posMaxOfPageBytes - pos2Bytes - if remOnPage <= 0 { - d.Fatalf("remOnPage is negative\n") - } - - if remOnPage < int64(xlTotLen1Bytes) { - //record.FieldRawLen("xLogBody", remOnPage*8) - wal.DecodeXLogRecord(wal, remOnPage) - wal.State.recordRemLenBytes = int64(xlTotLen1Bytes) - remOnPage - break - } - - xLogBodyLen := int64(xlTotLen1Bytes) * 8 - if xLogBodyLen <= 0 { - errPos := record.Pos() / 8 - d.Fatalf("xlTotLen1Bytes is negative, xLogBodyLen = %d, pos = %X\n", xLogBodyLen, errPos) - } - - wal.DecodeXLogRecord(wal, int64(xlTotLen1Bytes)) - - // align record - posBytes2 := d.Pos() / 8 - posBytes2Aligned := int64(common.TypeAlign8(uint64(posBytes2))) - if posBytes2 < posBytes2Aligned { - alignLen := (posBytes2Aligned - posBytes2) * 8 - wal.State.Record.FieldRawLen("align0", alignLen) - } - - wal.State = nil - } -} - -// IsEnd - check that we can read bitsCount on page (with posMax?) -func IsEnd(d *decode.D, posMax int64, bitsCount int64) bool { - pos := d.Pos() - posRead := pos + bitsCount - result := posRead > posMax - if result { - // set reader at and position to continue reading - d.SeekAbs(posMax) - } - return result -} - -func decodeXLogRecord(wal *Wal, maxBytes int64) { - record := wal.State.Record - - pos0 := record.Pos() - maxLen := maxBytes * 8 - for i := 0; ; i++ { - fieldName := fmt.Sprintf("xlog_body%d", i) - if record.FieldGet(fieldName) == nil { - record.FieldRawLen(fieldName, maxLen) - break - } - } - pos1 := record.Pos() - posMax := pos1 - record.SeekAbs(pos0) - - // struct XLogRecord { - /* 0 | 4 */ // uint32 xl_tot_len - /* 4 | 4 */ // TransactionId xl_xid - /* 8 | 8 */ // XLogRecPtr xl_prev - /* 16 | 1 */ // uint8 xl_info - /* 17 | 1 */ // RmgrId xl_rmid - /* XXX 2-byte hole */ - /* 20 | 4 */ // pg_crc32c xl_crc - - // xl_tot_len already read - - if record.FieldGet("xl_xid") == nil { - if IsEnd(record, posMax, 32) { - return - } - record.FieldU32("xl_xid") - } - - if record.FieldGet("xl_prev") == nil { - if IsEnd(record, posMax, 64) { - return - } - record.FieldU64("xl_prev", common.XLogRecPtrMapper) - } - - if record.FieldGet("xl_info") == nil { - if IsEnd(record, posMax, 8) { - return - } - record.FieldU8("xl_info") - } - - if record.FieldGet("xl_rmid") == nil { - if IsEnd(record, posMax, 8) { - return - } - record.FieldU8("xl_rmid") - } - - if record.FieldGet("hole1") == nil { - if IsEnd(record, posMax, 16) { - return - } - record.FieldU16("hole1") - } - - if record.FieldGet("xl_crc") == nil { - if IsEnd(record, posMax, 32) { - return - } - record.FieldU32("xl_crc") - } - - record.SeekAbs(posMax) -} diff --git a/format/postgres/pg_multixact.go b/format/postgres/pg_multixact.go deleted file mode 100644 index f47d10a1a..000000000 --- a/format/postgres/pg_multixact.go +++ /dev/null @@ -1,82 +0,0 @@ -package postgres - -// TO DO -// actualize - -//const BLCKSZ = 8192 -// -//func init() { -// interp.RegisterFormat(decode.Format{ -// Name: format.PG_MULTIXACTOFF, -// Description: "PostgreSQL multixact offset file", -// DecodeFn: mxOffsetDecode, -// }) -// interp.RegisterFormat(decode.Format{ -// Name: format.PG_MULTIXACTMEM, -// Description: "PostgreSQL multixact members file", -// DecodeFn: mxMembersDecode, -// }) -//} -// -//func mxOffsetDecode(d *decode.D, in interface{}) interface{} { -// d.Endian = decode.LittleEndian -// -// d.FieldArray("offsets", func(d *decode.D) { -// for { -// if d.End() { -// break -// } -// d.FieldU32("offset", scalar.ActualHex) -// -// } -// }) -// return nil -//} -// -//var flags = scalar.UToScalar{ -// 0: {Sym: "ForKeyShare", Description: "For Key Share"}, -// 1: {Sym: "ForShare", Description: "For Share"}, -// 2: {Sym: "ForNoKeyUpdate", Description: "For No Key Update"}, -// 3: {Sym: "ForUpdate", Description: "For Update"}, -// 4: {Sym: "NoKeyUpdate", Description: "No Key Update"}, -// 5: {Sym: "Update", Description: "Update"}, -//} -// -//func mxMembersDecode(d *decode.D, in interface{}) interface{} { -// var xidLen uint = 4 -// var groupLen uint = 4 * (1 + xidLen) -// d.Endian = decode.LittleEndian -// -// m := d.FieldArrayValue("members") -// p := d.FieldArrayValue("paddings") -// -// for { -// var xacts []*decode.D = make([]*decode.D, 4) -// -// for i := 0; i < 4; i++ { -// xacts[i] = m.FieldStructValue("xact") -// xacts[i].FieldU8("status", flags) -// } -// -// for i := 0; i < 4; i++ { -// xacts[i].FieldU32("xid") -// } -// -// // Check if rest of bytes are padding before EOF -// if d.BitsLeft() < int64(groupLen*8) && d.BitsLeft() > 0 { -// p.FieldRawLen("padding", d.BitsLeft()) -// break -// } -// -// // Check on EOF -// if d.End() { -// break -// } -// -// // Not EOF, let's check on block boundary -// if blkLeft := BLCKSZ - (uint(d.Pos())>>3)%BLCKSZ; blkLeft < groupLen { -// p.FieldRawLen("padding", int64(blkLeft*8)) -// } -// } -// return nil -//} diff --git a/format/postgres/pg_wal.go b/format/postgres/pg_wal.go deleted file mode 100644 index 7d72f3edc..000000000 --- a/format/postgres/pg_wal.go +++ /dev/null @@ -1,83 +0,0 @@ -package postgres - -import ( - "fmt" - - "github.com/wader/fq/format/postgres/common/pg_wal/pgproee" - "github.com/wader/fq/format/postgres/common/pg_wal/postgres" - - "github.com/wader/fq/format" - "github.com/wader/fq/pkg/decode" - "github.com/wader/fq/pkg/interp" - - "strconv" - "strings" -) - -// partial parsing of WAL - -func init() { - interp.RegisterFormat(decode.Format{ - Name: format.PG_WAL, - Description: "PostgreSQL write-ahead log file", - DecodeFn: decodePGWAL, - DecodeInArg: format.PostgresIn{ - Flavour: PG_FLAVOUR_POSTGRES14, - }, - RootArray: true, - RootName: "pages", - }) -} - -func ParseLsn(lsn string) (uint32, error) { - // check for 0/4E394440 - str1 := lsn - if strings.Contains(lsn, "/") { - parts := strings.Split(lsn, "/") - if len(parts) != 2 { - return 0, fmt.Errorf("invalid lsn = %s", lsn) - } - str1 = parts[1] - } - // parse hex to coded file name + file offset - r1, err := strconv.ParseInt(str1, 16, 64) - if err != nil { - return 0, err - } - return uint32(r1), err -} - -func decodePGWAL(d *decode.D, in any) any { - d.Endian = decode.LittleEndian - - pgIn, ok := in.(format.PostgresIn) - if !ok { - d.Fatalf("DecodeInArg must be PostgresIn!\n") - } - - switch pgIn.Flavour { - case PG_FLAVOUR_POSTGRES10, - PG_FLAVOUR_POSTGRES11, - PG_FLAVOUR_POSTGRES12, - PG_FLAVOUR_POSTGRES13, - PG_FLAVOUR_POSTGRES14, - PG_FLAVOUR_PGPRO10, - PG_FLAVOUR_PGPRO11, - PG_FLAVOUR_PGPRO12, - PG_FLAVOUR_PGPRO13, - PG_FLAVOUR_PGPRO14: - return postgres.DecodePGWAL(d) - - case PG_FLAVOUR_PGPROEE10, - PG_FLAVOUR_PGPROEE11, - PG_FLAVOUR_PGPROEE12, - PG_FLAVOUR_PGPROEE13, - PG_FLAVOUR_PGPROEE14: - return pgproee.DecodePGWAL(d) - - default: - break - } - - return postgres.DecodePGWAL(d) -} diff --git a/format/postgres/pg_wal_page.go b/format/postgres/pg_wal_page.go deleted file mode 100644 index 8aeefad7d..000000000 --- a/format/postgres/pg_wal_page.go +++ /dev/null @@ -1,31 +0,0 @@ -package postgres - -// TO DO -// remove - -//import ( -// "github.com/wader/fq/format" -// "github.com/wader/fq/pkg/decode" -// "github.com/wader/fq/pkg/interp" -// _ "github.com/wader/fq/pkg/scalar" -//) -// -//func init() { -// interp.RegisterFormat(decode.Format{ -// Name: format.PGWALPAGE, -// Description: "PostgreSQL write-ahead page", -// DecodeFn: walpageDecode, -// }) -//} -// -////const XLOG_BLCKSZ = 8192 -// -//func walpageDecode(d *decode.D, in interface{}) interface{} { -// -// d.Endian = decode.LittleEndian -// -// pageHeaders := d.FieldArrayValue("XLogPageHeaders") -// _ = pageHeaders.FieldStruct("XLogPageHeaderData", decodeXLogPageHeaderData) -// -// return nil -//} diff --git a/format/postgres/pg_wal_test.go b/format/postgres/pg_wal_test.go deleted file mode 100644 index 40e11ddf1..000000000 --- a/format/postgres/pg_wal_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package postgres_test - -import ( - "github.com/wader/fq/format/postgres" - - "testing" -) - -func TestParseLsn(t *testing.T) { - lsn1, err := postgres.ParseLsn("0/4E394440") - if err != nil { - t.Fatalf("TestParseLsn 1, err = %v\n", err) - } - if lsn1 != 0x4E394440 { - t.Fatalf("TestParseLsn 2, invalid lsn value\n") - } - - lsn2, err := postgres.ParseLsn("0/4469E930") - if err != nil { - t.Fatalf("TestParseLsn 3, err = %v\n", err) - } - if lsn2 != 0x4469E930 { - t.Fatalf("TestParseLsn 4, invalid lsn value\n") - } -} - -func TestXLogSegmentOffset(t *testing.T) { - offset := postgres.XLogSegmentOffset(0x4E394440) - if offset == 0 { - t.Fatalf("TestXLogSegmentOffset 1, invalid offset\n") - } -} diff --git a/format/postgres/testdata/flavours/pgpro10/000000010000000000000001 b/format/postgres/testdata/flavours/pgpro10/000000010000000000000001 deleted file mode 100644 index 4680b74ffdf4ccc6b9742efa6f32b0869e44d2b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI2u};G<5I`>>WkkTl=nYoB10nSfKp+PAiB9|iWz5n6AwGnyQ`e6D16HtWpVXRG zO;ty!)n_R=pYMD=zmt_A9*#>XWZr`C%IN3o?e+fd(Q1VlkrzL_{Qj7n{PwS$hi&eq zkJFFrb9xz!L07wzA-e6YYS+fk)abQ!y16~C<;-@htr{GAhgl_3+A(bpPa+r2#Z*Se zief1<xB6m>^+lWOZ?eb!vA*m4INr8;*XwVaZ)*QT-+yYJxy7UYxmApOA&`y$=RX}w zB0&HG5P$##av{L?KbK08Cj=k>0SG_<0uX=z1Rwwb2((3DIPUrX+s2FUwifC*uHGkj z55Mzkn@`ny{`_~JVA|k5L0QhP9O$(JmAb`P*Kw7b?CQ5p?mB;6+@|AQuirG!w)_r# z|7~&2B`)>PrBdVxf%F78|LK_$5dsi^00bbg?*#b%?|X&F4+0Q?00bZa0SG_<0uX=z H1Y!bzvRfF% diff --git a/format/postgres/testdata/flavours/pgpro10/000000010000000000000001_1.fqtest b/format/postgres/testdata/flavours/pgpro10/000000010000000000000001_1.fqtest deleted file mode 100644 index 917c8c1e9..000000000 --- a/format/postgres/testdata/flavours/pgpro10/000000010000000000000001_1.fqtest +++ /dev/null @@ -1,64 +0,0 @@ -$ fq -d pg_wal "dv" 000000010000000000000001 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0:2]: 000000010000000000000001 (pg_wal) 0x0-0x3fff.7 (16384) - | | | [0]{}: page 0x0-0x20e7.7 (8424) - | | | xloog_page_header_data{}: 0x0-0x27.7 (40) -0x0000|97 d0 |.. | xlp_magic: 53399 0x0-0x1.7 (2) -0x0000| 02 00 | .. | xlp_info: 2 0x2-0x3.7 (2) -0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) -0x0000| 00 00 00 01 00 00 00 00| ........| xlp_pageaddr: 16777216 0x8-0xf.7 (8) -0x0010|00 00 00 00 |.... | xlp_rem_len: 0 0x10-0x13.7 (4) -0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) - | | | xlog_long_page_header_data{}: 0x18-0x27.7 (16) -0x0010| a5 f6 ad 96 85 60 5f 63| .....`_c| xlp_sysid: 7160548059417278117 0x18-0x1f.7 (8) -0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) -0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) - | | | records[0:2]: 0x28-0x20e7.7 (8384) - | | | [0]{}: xlog_record 0x28-0x97.7 (112) - | | | lsn: "0/1000028" (16777256) 0x28-NA (0) -0x0020| 6a 00 00 00 | j... | xl_tot_len: 106 0x28-0x2b.7 (4) -0x0020| 00 00 00 00| ....| xlog_body0: raw bits 0x2c-0x91.7 (102) -0x0030|00 00 00 00 00 00 00 00 00 00 00 00 00 a9 d6 0e|................| -* |until 0x91.7 (102) | | -0x0020| 00 00 00 00| ....| xl_xid: 0 0x2c-0x2f.7 (4) -0x0030|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x30-0x37.7 (8) -0x0030| 00 | . | xl_info: 0 0x38-0x38.7 (1) -0x0030| 00 | . | xl_rmid: 0 0x39-0x39.7 (1) -0x0030| 00 00 | .. | hole1: 0 0x3a-0x3b.7 (2) -0x0030| 00 a9 d6 0e| ....| xl_crc: 248948992 0x3c-0x3f.7 (4) -0x0090| 00 00 00 00 00 00 | ...... | align0: raw bits 0x92-0x97.7 (6) - | | | [1]{}: xlog_record 0x98-0x20e7.7 (8272) - | | | lsn: "0/1000098" (16777368) 0x98-NA (0) -0x0090| 31 20 00 00 | 1 .. | xl_tot_len: 8241 0x98-0x9b.7 (4) -0x0090| 01 00 00 00| ....| xlog_body0: raw bits 0x9c-0x1fff.7 (8036) -0x00a0|28 00 00 01 00 00 00 00 a0 00 00 00 4b 4d 12 a0|(...........KM..| -* |until 0x1fff.7 (8036) | | -0x0090| 01 00 00 00| ....| xl_xid: 1 0x9c-0x9f.7 (4) -0x00a0|28 00 00 01 00 00 00 00 |(....... | xl_prev: "0/1000028" (16777256) 0xa0-0xa7.7 (8) -0x00a0| a0 | . | xl_info: 160 0xa8-0xa8.7 (1) -0x00a0| 00 | . | xl_rmid: 0 0xa9-0xa9.7 (1) -0x00a0| 00 00 | .. | hole1: 0 0xaa-0xab.7 (2) -0x00a0| 4b 4d 12 a0| KM..| xl_crc: 2685553995 0xac-0xaf.7 (4) -0x2010| 00 00 00 00 00 00 00 00| ........| xlog_body1: raw bits 0x2018-0x20e7.7 (208) -0x2020|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| -* |until 0x20e7.7 (208) | | - | | | [1]{}: page 0x2000-0x3fff.7 (8192) - | | | xloog_page_header_data{}: 0x2000-0x2017.7 (24) -0x2000|97 d0 |.. | xlp_magic: 53399 0x2000-0x2001.7 (2) -0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) -0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) -0x2000| 00 20 00 01 00 00 00 00| . ......| xlp_pageaddr: 16785408 0x2008-0x200f.7 (8) -0x2010|c9 00 00 00 |.... | xlp_rem_len: 201 0x2010-0x2013.7 (4) -0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) - | | | records[0:1]: 0x20e8-0x3fff.7 (7960) - | | | [0]{}: xlog_record 0x20e8-0x3fff.7 (7960) - | | | lsn: "0/10020E8" (16785640) 0x20e8-NA (0) -0x20e0| 31 20 00 00 | 1 .. | xl_tot_len: 8241 0x20e8-0x20eb.7 (4) -0x20e0| 01 00 00 00| ....| xlog_body0: raw bits 0x20ec-0x3fff.7 (7956) -0x20f0|98 00 00 01 00 00 00 00 a0 00 00 00 04 05 69 ab|..............i.| -* |until 0x3fff.7 (end) (7956) | | -0x20e0| 01 00 00 00| ....| xl_xid: 1 0x20ec-0x20ef.7 (4) -0x20f0|98 00 00 01 00 00 00 00 |........ | xl_prev: "0/1000098" (16777368) 0x20f0-0x20f7.7 (8) -0x20f0| a0 | . | xl_info: 160 0x20f8-0x20f8.7 (1) -0x20f0| 00 | . | xl_rmid: 0 0x20f9-0x20f9.7 (1) -0x20f0| 00 00 | .. | hole1: 0 0x20fa-0x20fb.7 (2) -0x20f0| 04 05 69 ab| ..i.| xl_crc: 2875786500 0x20fc-0x20ff.7 (4) diff --git a/format/postgres/testdata/flavours/pgpro14/00000001000000000000000A b/format/postgres/testdata/flavours/pgpro14/00000001000000000000000A deleted file mode 100644 index 992fe7e2fc1cd8eca3a786af04721a624728a250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 U&wKsZ`g~p~`{PS8&eFvH1Fe22J^%m! diff --git a/format/postgres/testdata/flavours/pgpro14/00000001000000000000000A_1.fqtest b/format/postgres/testdata/flavours/pgpro14/00000001000000000000000A_1.fqtest deleted file mode 100644 index ee083b753..000000000 --- a/format/postgres/testdata/flavours/pgpro14/00000001000000000000000A_1.fqtest +++ /dev/null @@ -1,116 +0,0 @@ -$ fq -d pg_wal ".[0].records[0:10] | dv" 00000001000000000000000A -[ - { - "hole1": 0, - "lsn": "0/A000048", - "xl_crc": 162371186, - "xl_info": 64, - "xl_prev": "0/9FFFFD8", - "xl_rmid": 10, - "xl_tot_len": 72, - "xl_xid": 23351, - "xlog_body0": "<68>N1sAANj//wkAAAAAQAoAAHKWrQkAIAwAfwYAALc1AAAPQAAAAAAAAP8OCAAEgJEgGAc8df//N1sAALMAACA3WwAAvAA=" - }, - { - "hole1": 0, - "lsn": "0/A000090", - "xl_crc": 702343481, - "xl_info": 64, - "xl_prev": "0/A000048", - "xl_rmid": 10, - "xl_tot_len": 72, - "xl_xid": 23355, - "xlog_body0": "<68>O1sAAEgAAAoAAAAAQAoAADnp3CkAIAwAfwYAALc1AAAPQAAAAAAAAP8OCAAEgAEoGAc6CAEAO1sAAGYAACAAAAAAvgA=" - }, - { - "hole1": 0, - "lsn": "0/A0000D8", - "xl_crc": 642258824, - "xl_info": 64, - "xl_prev": "0/A000090", - "xl_rmid": 10, - "xl_tot_len": 72, - "xl_xid": 23358, - "xlog_body0": "<68>PlsAAJAAAAoAAAAAQAoAAIgXSCYAIAwAfwYAALc1AAAPQAAAAQAAAP8OCAAEgAEoGAensP//PlsAAGAAACAAAAAAcAA=" - }, - { - "hole1": 0, - "lsn": "0/A000120", - "xl_crc": 352113203, - "xl_info": 64, - "xl_prev": "0/A0000D8", - "xl_rmid": 10, - "xl_tot_len": 72, - "xl_xid": 23359, - "xlog_body0": "<68>P1sAANgAAAoAAAAAQAoAADPS/BQAIAwAfwYAALc1AAAPQAAAAAAAAP8OCAAEgAEoGAfz7v//P1sAAHgAACAAAAAAvwA=" - }, - { - "hole1": 0, - "lsn": "0/A000168", - "xl_crc": 1932211605, - "xl_info": 64, - "xl_prev": "0/A000120", - "xl_rmid": 10, - "xl_tot_len": 72, - "xl_xid": 23357, - "xlog_body0": "<68>PVsAACABAAoAAAAAQAoAAJU1K3MAIAwAfwYAALc1AAANQAAABQAAAP8OBAADgAEoGANBkgAAPVsAAC4AACAAAAAAMAA=" - }, - { - "hole1": 0, - "lsn": "0/A0001B0", - "xl_crc": 1172777075, - "xl_info": 64, - "xl_prev": "0/A000168", - "xl_rmid": 10, - "xl_tot_len": 72, - "xl_xid": 23355, - "xlog_body0": "<68>O1sAAGgBAAoAAAAAQAoAAHMo50UAIAwAfwYAALc1AAANQAAAAgAAAP8OBAADgAEoGANqYwUAO1sAAJAAACAAAAAAkgA=" - }, - { - "hole1": 0, - "lsn": "0/A0001F8", - "xl_crc": 3467337604, - "xl_info": 64, - "xl_prev": "0/A0001B0", - "xl_rmid": 10, - "xl_tot_len": 72, - "xl_xid": 23359, - "xlog_body0": "<68>P1sAALABAAoAAAAAQAoAAIRfq84AIAwAfwYAALc1AAANQAAABQAAAP8OBAADgAEoGANlw/7/P1sAACsAACAAAAAAMQA=" - }, - { - "align0": "<1>AA==", - "hole1": 0, - "lsn": "0/A000240", - "xl_crc": 2150511209, - "xl_info": 0, - "xl_prev": "0/A0001F8", - "xl_rmid": 10, - "xl_tot_len": 79, - "xl_xid": 23357, - "xlog_body0": "<75>PVsAAPgBAAoAAAAAAAoAAGkyLoAAIB4AfwYAALc1AAAWQAAAjQAAAP8DBgABCBgfKAAAAAoAAACEzwYAkPz///HDxkBNjwIASwAA" - }, - { - "align0": "<1>AA==", - "hole1": 0, - "lsn": "0/A000290", - "xl_crc": 1895222202, - "xl_info": 0, - "xl_prev": "0/A000240", - "xl_rmid": 10, - "xl_tot_len": 79, - "xl_xid": 23355, - "xlog_body0": "<75>O1sAAEACAAoAAAAAAAoAALrL9nAAIB4AfwYAALc1AAAWQAAAjgAAAP8DBgABCBgfDQAAAAEAAABQHQMA9e3//wTExkBNjwIAQgAA" - }, - { - "align0": "<1>AA==", - "hole1": 0, - "lsn": "0/A0002E0", - "xl_crc": 2165445570, - "xl_info": 0, - "xl_prev": "0/A000290", - "xl_rmid": 10, - "xl_tot_len": 79, - "xl_xid": 23359, - "xlog_body0": "<75>P1sAAJACAAoAAAAAAAoAAMITEoEAIB4AfwYAALc1AAAWQAAAkQAAAP8DBgABCBgfSgAAAAgAAACnUwQAvPL//xbExkBNjwIAOQAA" - } -] diff --git a/format/postgres/testdata/flavours/pgproee10/000000010000000000000001 b/format/postgres/testdata/flavours/pgproee10/000000010000000000000001 deleted file mode 100644 index d2bbf69a174a0287b83bfd4a1778de65f6026622..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI2y-EW?5P;`$iH(hdq~1=ku-5mmv$V7pEQA!kflbgVjZfec*x3kq0Kr1R!a@{m zEIjw;rnz{yB)Mdhd<(a;GdsIG`whn(?DmH($;6jZ1m&iCa(DZ9bZoUujL3B`|5?9X zJnR=|JI>P<SLx&3U)B#>wz0A8HIdKGu6Hce;yLuIt@sH2s+Uoe-gV-@gdQEG(G0Bl z^1XX5o3>#@+P$?9-fLULg{7spC$i;S%#Tr9o=a}q?r}wB&_;E&tE~E~JyuRSK6aft zzj?1;7uT%ptG@qPaZYs|@}FvEhzkPE6X5-Co-r#x00Izz00fdFzz;xjDIp*TKmY;| zfB*y_009U<00Iygk3fIe@u&6n;M*UaXTBb9u4Nomy;pD_ZV$-7Zua!*`)lN0!BfP& z0t?w;R@5q$UsYGT%K!S+uTD-nzHZ)F`@GkWjk77gRo{P8To+|t^1mpVB2EZQp8)Uw p^qDdv1Rwwb2tXip0(}2d&k*rJ00Izz00bZa0SG_<0uWd}0>4SHB>?~c diff --git a/format/postgres/testdata/flavours/pgproee10/000000010000000000000001_1.fqtest b/format/postgres/testdata/flavours/pgproee10/000000010000000000000001_1.fqtest deleted file mode 100644 index 249a401c6..000000000 --- a/format/postgres/testdata/flavours/pgproee10/000000010000000000000001_1.fqtest +++ /dev/null @@ -1,67 +0,0 @@ -$ fq -d pg_wal -o flavour=pgproee11 "dv" 000000010000000000000001 - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0:2]: 000000010000000000000001 (pg_wal) 0x0-0x3fff.7 (16384) - | | | [0]{}: page 0x0-0x211f.7 (8480) - | | | xloog_page_header_data{}: 0x0-0x27.7 (40) -0x0000|97 d0 |.. | xlp_magic: 53399 0x0-0x1.7 (2) -0x0000| 02 00 | .. | xlp_info: 2 0x2-0x3.7 (2) -0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) -0x0000| 00 00 00 01 00 00 00 00| ........| xlp_pageaddr: 16777216 0x8-0xf.7 (8) -0x0010|00 00 00 00 |.... | xlp_rem_len: 0 0x10-0x13.7 (4) -0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) - | | | xlog_long_page_header_data{}: 0x18-0x27.7 (16) -0x0010| a5 16 6b c1 b3 dc 5b 63| ..k...[c| xlp_sysid: 7159558697237812901 0x18-0x1f.7 (8) -0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) -0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) - | | | records[0:2]: 0x28-0x211f.7 (8440) - | | | [0]{}: xlog_record 0x28-0xc7.7 (160) - | | | lsn: "0/1000028" (16777256) 0x28-NA (0) -0x0020| 9a 00 00 00 | .... | xl_tot_len: 154 0x28-0x2b.7 (4) -0x0020| 00 00 00 00| ....| xlog_body0: raw bits 0x2c-0xc1.7 (150) -0x0030|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| -* |until 0xc1.7 (150) | | -0x0020| 00 00 00 00| ....| hole0: 0 0x2c-0x2f.7 (4) -0x0030|00 00 00 00 00 00 00 00 |........ | xl_xid: 0 0x30-0x37.7 (8) -0x0030| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x38-0x3f.7 (8) -0x0040|00 |. | xl_info: 0 0x40-0x40.7 (1) -0x0040| 00 | . | xl_rmid: 0 0x41-0x41.7 (1) -0x0040| 00 00 | .. | hole1: 0 0x42-0x43.7 (2) -0x0040| eb 83 cd 38 | ...8 | xl_crc: 952992747 0x44-0x47.7 (4) -0x00c0| 00 00 00 00 00 00 | ...... | align0: raw bits 0xc2-0xc7.7 (6) - | | | [1]{}: xlog_record 0xc8-0x211f.7 (8280) - | | | lsn: "0/10000C8" (16777416) 0xc8-NA (0) -0x00c0| 39 20 00 00 | 9 .. | xl_tot_len: 8249 0xc8-0xcb.7 (4) -0x00c0| 00 00 00 00| ....| xlog_body0: raw bits 0xcc-0x1fff.7 (7988) -0x00d0|01 00 00 00 00 00 00 00 28 00 00 01 00 00 00 00|........(.......| -* |until 0x1fff.7 (7988) | | -0x00c0| 00 00 00 00| ....| hole0: 0 0xcc-0xcf.7 (4) -0x00d0|01 00 00 00 00 00 00 00 |........ | xl_xid: 1 0xd0-0xd7.7 (8) -0x00d0| 28 00 00 01 00 00 00 00| (.......| xl_prev: "0/1000028" (16777256) 0xd8-0xdf.7 (8) -0x00e0|a0 |. | xl_info: 160 0xe0-0xe0.7 (1) -0x00e0| 00 | . | xl_rmid: 0 0xe1-0xe1.7 (1) -0x00e0| 00 00 | .. | hole1: 0 0xe2-0xe3.7 (2) -0x00e0| 92 ef 16 7c | ...| | xl_crc: 2081877906 0xe4-0xe7.7 (4) -0x2010| 00 00 00 00 00 00 00 00| ........| xlog_body1: raw bits 0x2018-0x211f.7 (264) -0x2020|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| -* |until 0x211f.7 (264) | | - | | | [1]{}: page 0x2000-0x3fff.7 (8192) - | | | xloog_page_header_data{}: 0x2000-0x2017.7 (24) -0x2000|97 d0 |.. | xlp_magic: 53399 0x2000-0x2001.7 (2) -0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) -0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) -0x2000| 00 20 00 01 00 00 00 00| . ......| xlp_pageaddr: 16785408 0x2008-0x200f.7 (8) -0x2010|01 01 00 00 |.... | xlp_rem_len: 257 0x2010-0x2013.7 (4) -0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) - | | | records[0:1]: 0x2120-0x3fff.7 (7904) - | | | [0]{}: xlog_record 0x2120-0x3fff.7 (7904) - | | | lsn: "0/1002120" (16785696) 0x2120-NA (0) -0x2120|39 20 00 00 |9 .. | xl_tot_len: 8249 0x2120-0x2123.7 (4) -0x2120| 00 00 00 00 01 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2124-0x3fff.7 (7900) -0x2130|c8 00 00 01 00 00 00 00 a0 00 00 00 75 99 fa f5|............u...| -* |until 0x3fff.7 (end) (7900) | | -0x2120| 00 00 00 00 | .... | hole0: 0 0x2124-0x2127.7 (4) -0x2120| 01 00 00 00 00 00 00 00| ........| xl_xid: 1 0x2128-0x212f.7 (8) -0x2130|c8 00 00 01 00 00 00 00 |........ | xl_prev: "0/10000C8" (16777416) 0x2130-0x2137.7 (8) -0x2130| a0 | . | xl_info: 160 0x2138-0x2138.7 (1) -0x2130| 00 | . | xl_rmid: 0 0x2139-0x2139.7 (1) -0x2130| 00 00 | .. | hole1: 0 0x213a-0x213b.7 (2) -0x2130| 75 99 fa f5| u...| xl_crc: 4126841205 0x213c-0x213f.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B b/format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B deleted file mode 100644 index 81143e4928af8a3dbc42bef51b1e251d83a6cb65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI(e@xV69KiACNDmT=BLXrQUP1^W@k0m%vb$k+?0!IMYMOydiefIFWj|zVUa=Yt zOj`ZHDh;<Hk`Zif<#HA@F-F#)X629xHR77h(1Jxv=$_}k`#!9Fo@edZ!++2H!|~zx z9OM1k!;LRkhr^Kt(c7;2;GKlfeKh*c-jQN^-lM^HEy!*RLvL(0gsi_rZVg*Fy?^05 z!TYYc`JH5+<3@z~k|K*x@X-gY2t8GR&}|Nc&ILba@gtO+K7r<gj|tswK;H%D3vVuj z=+|WnKBjXtJP8G#yxFqfvUK6H6tZObv%yd8-RQ=jzF|T8ErFGRm2>umtMq;K-+}pw z|2POf#sBirVss@wa&P^*oack475JzLV?M@qv`m0L?qoh{-S|SW_Mu(^yiwXmkI|L* zn28%a!}CGY3Vbv!VLpyWb&Y^NQcWK}HoNirziJ<FP4!c0A45i0;=}!T*26p>G_Al# zhn4wg+dgv<^s(CXG1cY9?djTwdI|7GX&+NYSK{Mvb=nU+A2hAN$3O)0F<E*(2K13; z`ar{O+&Hg&z%|uRrF{fnPtw<w#E17KTRqPQO)KybSjK#uezATU^pS4*u>I-AhfirA z>LtJ%rF~>aG9Rz{<FE33(6j;{5jQa(byu8&ppP}C4|}`^r@pIwz%|uRrF~QwUCH^8 zclFv6JRdZzz(-mX^RYGmt9Z~yhUp`_$b(0EwGZ_Y;EmEg>Wr?$$J8IwKk<Cfv;rTl zXyzliX?hm)vDWlaSn0u?TeJ_jruwP0j~1gV@$vnIjfm%irWN?8iD5pFYttj3k4)1? z#Va0Mxlj90F9F^t?W4!&N_^ZhQrg7xLDLF+G{!O?+s;Ov1by7ad~|v63x~81xTgB4 zw2vX9EAi2Nygi2JgQgYu=!j=NzSz6zDCi^0^ilJT2Um@2AL=E*8>M|r8C{8w+Kywb zJRdZzz{kJ}=Hqnj@_#@d*`^Qw?;d=uUHgD*s-H^xu-zW&N_?F7s56@9gQgYu2qZ8c z_3r*e&_@pQ5$DC5w`(8jCBPe{ePkyxAFm%hagOJMrWN>zNMb%daVF$~K5|VTtp#3u zbA$E)*Hk~9w+=52UH`X-Iwc#=A$wi7!st!TmBG=nFrFKlT;RrGd_Cm4|L$EA@bBH% znQnS^c(Gf%Q4fT(QTkkIG`bQWQ59K7cs^)afsd+H>|7a-je)Q0<}n`!y|`chT?nV9 z`mwZ+4x=ma@mcoSXLvqnT7eIL3iHvhZ%I4&b0^>QG1lhA)A9P}j(Q33Mrj`dMpxov zsOkXsbqP%?@X?maeEfE0Z4v0>ZqvtKeO~<hr1k;VR6mvW5iq(EA77THJjOdeXj*}f z-ZbXJY5QO`=%ax72zc=wKWiWACBPe{eMF>(x)L8H&bKmoK4@BjkFhn(N6c&veBHm$ z^kG}(!yoIv3xQ)U!c^KvS_bpc*Ph_u`Jib9K2Rp}vFGJ*CwP9WH+|SMeE7-F_4%;~ z6u_0zK3qmua(;Bryf@49LDLF+*t3|Ah`Ch{f<B6vkIg<joTYt$F&AMd?W4x%N_?C= zKf8tJgQgYuaO5x_$DVWbgFcE)AB9i*aFo8Ty9g5CmC`;MjjqJU<s<Fi@_f*=0v}cD zn2+)319hN}64OV;n?CHU*5?OYQ~gxhM~Bgs_}F>9ocn)MG_AmgKcD${dquSs^l=aK zamt5tE^8m^CBPe{eGC{~iI2RlsRrKpLDLF+v=uNP+a_}^fj%~vK58!da8r-=0oPPN zmG%)Zx)LABuXUyKe9*K4AHD0DkJ{4iGSJ7prVsyhA5N;$KGaKqH%j}6C<=8YK00F) z%XmI$T7i$TV&>z_1H1nQeK<@XttsWW`62BCuBm=1?IW#(`RM*IyOQUFrWN==8<>yk aOM6m4A5POp&wb@MPM;s@A#gUDKK=!~c5CJU diff --git a/format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B_1.fqtest b/format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B_1.fqtest deleted file mode 100644 index f8f6a610b..000000000 --- a/format/postgres/testdata/flavours/pgproee13/000000010000017A0000005B_1.fqtest +++ /dev/null @@ -1,808 +0,0 @@ -$ fq -d pg_wal "dv" 000000010000017A0000005B - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0:2]: 000000010000017A0000005B (pg_wal) 0x0-0x3fff.7 (16384) - | | | [0]{}: page 0x0-0x203f.7 (8256) - | | | xloog_page_header_data{}: 0x0-0x27.7 (40) -0x0000|06 d1 |.. | xlp_magic: 53510 0x0-0x1.7 (2) -0x0000| 07 00 | .. | xlp_info: 7 0x2-0x3.7 (2) -0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) -0x0000| 00 00 00 5b 7a 01 00 00| ...[z...| xlp_pageaddr: 1625024364544 0x8-0xf.7 (8) -0x0010|1b 00 00 00 |.... | xlp_rem_len: 27 0x10-0x13.7 (4) -0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) - | | | xlog_long_page_header_data{}: 0x18-0x27.7 (16) -0x0010| dd 9c 64 db 3b 20 34 63| ..d.; 4c| xlp_sysid: 7148373949999783133 0x18-0x1f.7 (8) -0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) -0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) -0x0020| 00 00 00 00 00 00 00 00| ........| raw_bytes_of_prev_wal_file: raw bits 0x28-0x47.7 (32) -0x0030|00 00 00 10 10 00 00 06 e6 0b 54 02 00 00 00 00|..........T.....| -0x0040|00 00 00 00 00 00 00 00 |........ | - | | | records[0:30]: 0x48-0x203f.7 (8184) - | | | [0]{}: xlog_record 0x48-0x8f.7 (72) - | | | lsn: "17A/5B000048" (1625024364616) 0x48-NA (0) -0x0040| 47 00 00 00 | G... | xl_tot_len: 71 0x48-0x4b.7 (4) -0x0040| 00 00 00 00| ....| xlog_body0: raw bits 0x4c-0x8e.7 (67) -0x0050|00 00 00 00 00 00 00 00 48 fe ff 5a 7a 01 00 00|........H..Zz...| -* |until 0x8e.7 (67) | | -0x0040| 00 00 00 00| ....| xl_xid: 0 0x4c-0x4f.7 (4) -0x0050|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x50-0x57.7 (8) -0x0050| 48 | H | xl_info: 72 0x58-0x58.7 (1) -0x0050| fe | . | xl_rmid: 254 0x59-0x59.7 (1) -0x0050| ff 5a | .Z | hole1: 23295 0x5a-0x5b.7 (2) -0x0050| 7a 01 00 00| z...| xl_crc: 378 0x5c-0x5f.7 (4) -0x0080| 00| .| align0: raw bits 0x8f-0x8f.7 (1) - | | | [1]{}: xlog_record 0x90-0x267.7 (472) - | | | lsn: "17A/5B000090" (1625024364688) 0x90-NA (0) -0x0090|d3 01 00 00 |.... | xl_tot_len: 467 0x90-0x93.7 (4) -0x0090| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x94-0x262.7 (463) -0x00a0|48 00 00 5b 7a 01 00 00 10 09 00 00 ab dd 07 1e|H..[z...........| -* |until 0x262.7 (463) | | -0x0090| 00 00 00 00 | .... | xl_xid: 0 0x94-0x97.7 (4) -0x0090| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x98-0x9f.7 (8) -0x00a0|48 |H | xl_info: 72 0xa0-0xa0.7 (1) -0x00a0| 00 | . | xl_rmid: 0 0xa1-0xa1.7 (1) -0x00a0| 00 5b | .[ | hole1: 23296 0xa2-0xa3.7 (2) -0x00a0| 7a 01 00 00 | z... | xl_crc: 378 0xa4-0xa7.7 (4) -0x0260| 00 00 00 00 00 | ..... | align0: raw bits 0x263-0x267.7 (5) - | | | [2]{}: xlog_record 0x268-0x2af.7 (72) - | | | lsn: "17A/5B000268" (1625024365160) 0x268-NA (0) -0x0260| 47 00 00 00 | G... | xl_tot_len: 71 0x268-0x26b.7 (4) -0x0260| 00 00 00 00| ....| xlog_body0: raw bits 0x26c-0x2ae.7 (67) -0x0270|00 00 00 00 00 00 00 00 90 00 00 5b 7a 01 00 00|...........[z...| -* |until 0x2ae.7 (67) | | -0x0260| 00 00 00 00| ....| xl_xid: 0 0x26c-0x26f.7 (4) -0x0270|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x270-0x277.7 (8) -0x0270| 90 | . | xl_info: 144 0x278-0x278.7 (1) -0x0270| 00 | . | xl_rmid: 0 0x279-0x279.7 (1) -0x0270| 00 5b | .[ | hole1: 23296 0x27a-0x27b.7 (2) -0x0270| 7a 01 00 00| z...| xl_crc: 378 0x27c-0x27f.7 (4) -0x02a0| 00| .| align0: raw bits 0x2af-0x2af.7 (1) - | | | [3]{}: xlog_record 0x2b0-0x487.7 (472) - | | | lsn: "17A/5B0002B0" (1625024365232) 0x2b0-NA (0) -0x02b0|d3 01 00 00 |.... | xl_tot_len: 467 0x2b0-0x2b3.7 (4) -0x02b0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2b4-0x482.7 (463) -0x02c0|68 02 00 5b 7a 01 00 00 10 09 00 00 e0 58 90 e5|h..[z........X..| -* |until 0x482.7 (463) | | -0x02b0| 00 00 00 00 | .... | xl_xid: 0 0x2b4-0x2b7.7 (4) -0x02b0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x2b8-0x2bf.7 (8) -0x02c0|68 |h | xl_info: 104 0x2c0-0x2c0.7 (1) -0x02c0| 02 | . | xl_rmid: 2 0x2c1-0x2c1.7 (1) -0x02c0| 00 5b | .[ | hole1: 23296 0x2c2-0x2c3.7 (2) -0x02c0| 7a 01 00 00 | z... | xl_crc: 378 0x2c4-0x2c7.7 (4) -0x0480| 00 00 00 00 00 | ..... | align0: raw bits 0x483-0x487.7 (5) - | | | [4]{}: xlog_record 0x488-0x4cf.7 (72) - | | | lsn: "17A/5B000488" (1625024365704) 0x488-NA (0) -0x0480| 47 00 00 00 | G... | xl_tot_len: 71 0x488-0x48b.7 (4) -0x0480| 00 00 00 00| ....| xlog_body0: raw bits 0x48c-0x4ce.7 (67) -0x0490|00 00 00 00 00 00 00 00 b0 02 00 5b 7a 01 00 00|...........[z...| -* |until 0x4ce.7 (67) | | -0x0480| 00 00 00 00| ....| xl_xid: 0 0x48c-0x48f.7 (4) -0x0490|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x490-0x497.7 (8) -0x0490| b0 | . | xl_info: 176 0x498-0x498.7 (1) -0x0490| 02 | . | xl_rmid: 2 0x499-0x499.7 (1) -0x0490| 00 5b | .[ | hole1: 23296 0x49a-0x49b.7 (2) -0x0490| 7a 01 00 00| z...| xl_crc: 378 0x49c-0x49f.7 (4) -0x04c0| 00| .| align0: raw bits 0x4cf-0x4cf.7 (1) - | | | [5]{}: xlog_record 0x4d0-0x6a7.7 (472) - | | | lsn: "17A/5B0004D0" (1625024365776) 0x4d0-NA (0) -0x04d0|d3 01 00 00 |.... | xl_tot_len: 467 0x4d0-0x4d3.7 (4) -0x04d0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x4d4-0x6a2.7 (463) -0x04e0|88 04 00 5b 7a 01 00 00 10 09 00 00 aa 0f ad db|...[z...........| -* |until 0x6a2.7 (463) | | -0x04d0| 00 00 00 00 | .... | xl_xid: 0 0x4d4-0x4d7.7 (4) -0x04d0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x4d8-0x4df.7 (8) -0x04e0|88 |. | xl_info: 136 0x4e0-0x4e0.7 (1) -0x04e0| 04 | . | xl_rmid: 4 0x4e1-0x4e1.7 (1) -0x04e0| 00 5b | .[ | hole1: 23296 0x4e2-0x4e3.7 (2) -0x04e0| 7a 01 00 00 | z... | xl_crc: 378 0x4e4-0x4e7.7 (4) -0x06a0| 00 00 00 00 00 | ..... | align0: raw bits 0x6a3-0x6a7.7 (5) - | | | [6]{}: xlog_record 0x6a8-0x6ef.7 (72) - | | | lsn: "17A/5B0006A8" (1625024366248) 0x6a8-NA (0) -0x06a0| 47 00 00 00 | G... | xl_tot_len: 71 0x6a8-0x6ab.7 (4) -0x06a0| 00 00 00 00| ....| xlog_body0: raw bits 0x6ac-0x6ee.7 (67) -0x06b0|00 00 00 00 00 00 00 00 d0 04 00 5b 7a 01 00 00|...........[z...| -* |until 0x6ee.7 (67) | | -0x06a0| 00 00 00 00| ....| xl_xid: 0 0x6ac-0x6af.7 (4) -0x06b0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x6b0-0x6b7.7 (8) -0x06b0| d0 | . | xl_info: 208 0x6b8-0x6b8.7 (1) -0x06b0| 04 | . | xl_rmid: 4 0x6b9-0x6b9.7 (1) -0x06b0| 00 5b | .[ | hole1: 23296 0x6ba-0x6bb.7 (2) -0x06b0| 7a 01 00 00| z...| xl_crc: 378 0x6bc-0x6bf.7 (4) -0x06e0| 00| .| align0: raw bits 0x6ef-0x6ef.7 (1) - | | | [7]{}: xlog_record 0x6f0-0x8c7.7 (472) - | | | lsn: "17A/5B0006F0" (1625024366320) 0x6f0-NA (0) -0x06f0|d3 01 00 00 |.... | xl_tot_len: 467 0x6f0-0x6f3.7 (4) -0x06f0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x6f4-0x8c2.7 (463) -0x0700|a8 06 00 5b 7a 01 00 00 10 09 00 00 a0 57 f6 dc|...[z........W..| -* |until 0x8c2.7 (463) | | -0x06f0| 00 00 00 00 | .... | xl_xid: 0 0x6f4-0x6f7.7 (4) -0x06f0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x6f8-0x6ff.7 (8) -0x0700|a8 |. | xl_info: 168 0x700-0x700.7 (1) -0x0700| 06 | . | xl_rmid: 6 0x701-0x701.7 (1) -0x0700| 00 5b | .[ | hole1: 23296 0x702-0x703.7 (2) -0x0700| 7a 01 00 00 | z... | xl_crc: 378 0x704-0x707.7 (4) -0x08c0| 00 00 00 00 00 | ..... | align0: raw bits 0x8c3-0x8c7.7 (5) - | | | [8]{}: xlog_record 0x8c8-0x90f.7 (72) - | | | lsn: "17A/5B0008C8" (1625024366792) 0x8c8-NA (0) -0x08c0| 47 00 00 00 | G... | xl_tot_len: 71 0x8c8-0x8cb.7 (4) -0x08c0| 00 00 00 00| ....| xlog_body0: raw bits 0x8cc-0x90e.7 (67) -0x08d0|00 00 00 00 00 00 00 00 f0 06 00 5b 7a 01 00 00|...........[z...| -* |until 0x90e.7 (67) | | -0x08c0| 00 00 00 00| ....| xl_xid: 0 0x8cc-0x8cf.7 (4) -0x08d0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x8d0-0x8d7.7 (8) -0x08d0| f0 | . | xl_info: 240 0x8d8-0x8d8.7 (1) -0x08d0| 06 | . | xl_rmid: 6 0x8d9-0x8d9.7 (1) -0x08d0| 00 5b | .[ | hole1: 23296 0x8da-0x8db.7 (2) -0x08d0| 7a 01 00 00| z...| xl_crc: 378 0x8dc-0x8df.7 (4) -0x0900| 00| .| align0: raw bits 0x90f-0x90f.7 (1) - | | | [9]{}: xlog_record 0x910-0xae7.7 (472) - | | | lsn: "17A/5B000910" (1625024366864) 0x910-NA (0) -0x0910|d3 01 00 00 |.... | xl_tot_len: 467 0x910-0x913.7 (4) -0x0910| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x914-0xae2.7 (463) -0x0920|c8 08 00 5b 7a 01 00 00 10 09 00 00 e7 43 d5 13|...[z........C..| -* |until 0xae2.7 (463) | | -0x0910| 00 00 00 00 | .... | xl_xid: 0 0x914-0x917.7 (4) -0x0910| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x918-0x91f.7 (8) -0x0920|c8 |. | xl_info: 200 0x920-0x920.7 (1) -0x0920| 08 | . | xl_rmid: 8 0x921-0x921.7 (1) -0x0920| 00 5b | .[ | hole1: 23296 0x922-0x923.7 (2) -0x0920| 7a 01 00 00 | z... | xl_crc: 378 0x924-0x927.7 (4) -0x0ae0| 00 00 00 00 00 | ..... | align0: raw bits 0xae3-0xae7.7 (5) - | | | [10]{}: xlog_record 0xae8-0xb2f.7 (72) - | | | lsn: "17A/5B000AE8" (1625024367336) 0xae8-NA (0) -0x0ae0| 47 00 00 00 | G... | xl_tot_len: 71 0xae8-0xaeb.7 (4) -0x0ae0| 00 00 00 00| ....| xlog_body0: raw bits 0xaec-0xb2e.7 (67) -0x0af0|00 00 00 00 00 00 00 00 10 09 00 5b 7a 01 00 00|...........[z...| -* |until 0xb2e.7 (67) | | -0x0ae0| 00 00 00 00| ....| xl_xid: 0 0xaec-0xaef.7 (4) -0x0af0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0xaf0-0xaf7.7 (8) -0x0af0| 10 | . | xl_info: 16 0xaf8-0xaf8.7 (1) -0x0af0| 09 | . | xl_rmid: 9 0xaf9-0xaf9.7 (1) -0x0af0| 00 5b | .[ | hole1: 23296 0xafa-0xafb.7 (2) -0x0af0| 7a 01 00 00| z...| xl_crc: 378 0xafc-0xaff.7 (4) -0x0b20| 00| .| align0: raw bits 0xb2f-0xb2f.7 (1) - | | | [11]{}: xlog_record 0xb30-0xd07.7 (472) - | | | lsn: "17A/5B000B30" (1625024367408) 0xb30-NA (0) -0x0b30|d3 01 00 00 |.... | xl_tot_len: 467 0xb30-0xb33.7 (4) -0x0b30| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0xb34-0xd02.7 (463) -0x0b40|e8 0a 00 5b 7a 01 00 00 10 09 00 00 bd 81 7a f5|...[z.........z.| -* |until 0xd02.7 (463) | | -0x0b30| 00 00 00 00 | .... | xl_xid: 0 0xb34-0xb37.7 (4) -0x0b30| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0xb38-0xb3f.7 (8) -0x0b40|e8 |. | xl_info: 232 0xb40-0xb40.7 (1) -0x0b40| 0a | . | xl_rmid: 10 0xb41-0xb41.7 (1) -0x0b40| 00 5b | .[ | hole1: 23296 0xb42-0xb43.7 (2) -0x0b40| 7a 01 00 00 | z... | xl_crc: 378 0xb44-0xb47.7 (4) -0x0d00| 00 00 00 00 00 | ..... | align0: raw bits 0xd03-0xd07.7 (5) - | | | [12]{}: xlog_record 0xd08-0xd4f.7 (72) - | | | lsn: "17A/5B000D08" (1625024367880) 0xd08-NA (0) -0x0d00| 47 00 00 00 | G... | xl_tot_len: 71 0xd08-0xd0b.7 (4) -0x0d00| 00 00 00 00| ....| xlog_body0: raw bits 0xd0c-0xd4e.7 (67) -0x0d10|00 00 00 00 00 00 00 00 30 0b 00 5b 7a 01 00 00|........0..[z...| -* |until 0xd4e.7 (67) | | -0x0d00| 00 00 00 00| ....| xl_xid: 0 0xd0c-0xd0f.7 (4) -0x0d10|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0xd10-0xd17.7 (8) -0x0d10| 30 | 0 | xl_info: 48 0xd18-0xd18.7 (1) -0x0d10| 0b | . | xl_rmid: 11 0xd19-0xd19.7 (1) -0x0d10| 00 5b | .[ | hole1: 23296 0xd1a-0xd1b.7 (2) -0x0d10| 7a 01 00 00| z...| xl_crc: 378 0xd1c-0xd1f.7 (4) -0x0d40| 00| .| align0: raw bits 0xd4f-0xd4f.7 (1) - | | | [13]{}: xlog_record 0xd50-0xf27.7 (472) - | | | lsn: "17A/5B000D50" (1625024367952) 0xd50-NA (0) -0x0d50|d3 01 00 00 |.... | xl_tot_len: 467 0xd50-0xd53.7 (4) -0x0d50| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0xd54-0xf22.7 (463) -0x0d60|08 0d 00 5b 7a 01 00 00 10 09 00 00 70 ee 41 ca|...[z.......p.A.| -* |until 0xf22.7 (463) | | -0x0d50| 00 00 00 00 | .... | xl_xid: 0 0xd54-0xd57.7 (4) -0x0d50| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0xd58-0xd5f.7 (8) -0x0d60|08 |. | xl_info: 8 0xd60-0xd60.7 (1) -0x0d60| 0d | . | xl_rmid: 13 0xd61-0xd61.7 (1) -0x0d60| 00 5b | .[ | hole1: 23296 0xd62-0xd63.7 (2) -0x0d60| 7a 01 00 00 | z... | xl_crc: 378 0xd64-0xd67.7 (4) -0x0f20| 00 00 00 00 00 | ..... | align0: raw bits 0xf23-0xf27.7 (5) - | | | [14]{}: xlog_record 0xf28-0xf6f.7 (72) - | | | lsn: "17A/5B000F28" (1625024368424) 0xf28-NA (0) -0x0f20| 47 00 00 00 | G... | xl_tot_len: 71 0xf28-0xf2b.7 (4) -0x0f20| 00 00 00 00| ....| xlog_body0: raw bits 0xf2c-0xf6e.7 (67) -0x0f30|00 00 00 00 00 00 00 00 50 0d 00 5b 7a 01 00 00|........P..[z...| -* |until 0xf6e.7 (67) | | -0x0f20| 00 00 00 00| ....| xl_xid: 0 0xf2c-0xf2f.7 (4) -0x0f30|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0xf30-0xf37.7 (8) -0x0f30| 50 | P | xl_info: 80 0xf38-0xf38.7 (1) -0x0f30| 0d | . | xl_rmid: 13 0xf39-0xf39.7 (1) -0x0f30| 00 5b | .[ | hole1: 23296 0xf3a-0xf3b.7 (2) -0x0f30| 7a 01 00 00| z...| xl_crc: 378 0xf3c-0xf3f.7 (4) -0x0f60| 00| .| align0: raw bits 0xf6f-0xf6f.7 (1) - | | | [15]{}: xlog_record 0xf70-0x1147.7 (472) - | | | lsn: "17A/5B000F70" (1625024368496) 0xf70-NA (0) -0x0f70|d3 01 00 00 |.... | xl_tot_len: 467 0xf70-0xf73.7 (4) -0x0f70| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0xf74-0x1142.7 (463) -0x0f80|28 0f 00 5b 7a 01 00 00 10 09 00 00 54 35 cb 17|(..[z.......T5..| -* |until 0x1142.7 (463) | | -0x0f70| 00 00 00 00 | .... | xl_xid: 0 0xf74-0xf77.7 (4) -0x0f70| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0xf78-0xf7f.7 (8) -0x0f80|28 |( | xl_info: 40 0xf80-0xf80.7 (1) -0x0f80| 0f | . | xl_rmid: 15 0xf81-0xf81.7 (1) -0x0f80| 00 5b | .[ | hole1: 23296 0xf82-0xf83.7 (2) -0x0f80| 7a 01 00 00 | z... | xl_crc: 378 0xf84-0xf87.7 (4) -0x1140| 00 00 00 00 00 | ..... | align0: raw bits 0x1143-0x1147.7 (5) - | | | [16]{}: xlog_record 0x1148-0x118f.7 (72) - | | | lsn: "17A/5B001148" (1625024368968) 0x1148-NA (0) -0x1140| 47 00 00 00 | G... | xl_tot_len: 71 0x1148-0x114b.7 (4) -0x1140| 00 00 00 00| ....| xlog_body0: raw bits 0x114c-0x118e.7 (67) -0x1150|00 00 00 00 00 00 00 00 70 0f 00 5b 7a 01 00 00|........p..[z...| -* |until 0x118e.7 (67) | | -0x1140| 00 00 00 00| ....| xl_xid: 0 0x114c-0x114f.7 (4) -0x1150|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x1150-0x1157.7 (8) -0x1150| 70 | p | xl_info: 112 0x1158-0x1158.7 (1) -0x1150| 0f | . | xl_rmid: 15 0x1159-0x1159.7 (1) -0x1150| 00 5b | .[ | hole1: 23296 0x115a-0x115b.7 (2) -0x1150| 7a 01 00 00| z...| xl_crc: 378 0x115c-0x115f.7 (4) -0x1180| 00| .| align0: raw bits 0x118f-0x118f.7 (1) - | | | [17]{}: xlog_record 0x1190-0x1367.7 (472) - | | | lsn: "17A/5B001190" (1625024369040) 0x1190-NA (0) -0x1190|d3 01 00 00 |.... | xl_tot_len: 467 0x1190-0x1193.7 (4) -0x1190| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x1194-0x1362.7 (463) -0x11a0|48 11 00 5b 7a 01 00 00 10 09 00 00 23 8b f5 f9|H..[z.......#...| -* |until 0x1362.7 (463) | | -0x1190| 00 00 00 00 | .... | xl_xid: 0 0x1194-0x1197.7 (4) -0x1190| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x1198-0x119f.7 (8) -0x11a0|48 |H | xl_info: 72 0x11a0-0x11a0.7 (1) -0x11a0| 11 | . | xl_rmid: 17 0x11a1-0x11a1.7 (1) -0x11a0| 00 5b | .[ | hole1: 23296 0x11a2-0x11a3.7 (2) -0x11a0| 7a 01 00 00 | z... | xl_crc: 378 0x11a4-0x11a7.7 (4) -0x1360| 00 00 00 00 00 | ..... | align0: raw bits 0x1363-0x1367.7 (5) - | | | [18]{}: xlog_record 0x1368-0x13af.7 (72) - | | | lsn: "17A/5B001368" (1625024369512) 0x1368-NA (0) -0x1360| 47 00 00 00 | G... | xl_tot_len: 71 0x1368-0x136b.7 (4) -0x1360| 00 00 00 00| ....| xlog_body0: raw bits 0x136c-0x13ae.7 (67) -0x1370|00 00 00 00 00 00 00 00 90 11 00 5b 7a 01 00 00|...........[z...| -* |until 0x13ae.7 (67) | | -0x1360| 00 00 00 00| ....| xl_xid: 0 0x136c-0x136f.7 (4) -0x1370|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x1370-0x1377.7 (8) -0x1370| 90 | . | xl_info: 144 0x1378-0x1378.7 (1) -0x1370| 11 | . | xl_rmid: 17 0x1379-0x1379.7 (1) -0x1370| 00 5b | .[ | hole1: 23296 0x137a-0x137b.7 (2) -0x1370| 7a 01 00 00| z...| xl_crc: 378 0x137c-0x137f.7 (4) -0x13a0| 00| .| align0: raw bits 0x13af-0x13af.7 (1) - | | | [19]{}: xlog_record 0x13b0-0x1587.7 (472) - | | | lsn: "17A/5B0013B0" (1625024369584) 0x13b0-NA (0) -0x13b0|d3 01 00 00 |.... | xl_tot_len: 467 0x13b0-0x13b3.7 (4) -0x13b0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x13b4-0x1582.7 (463) -0x13c0|68 13 00 5b 7a 01 00 00 10 09 00 00 00 48 46 5e|h..[z........HF^| -* |until 0x1582.7 (463) | | -0x13b0| 00 00 00 00 | .... | xl_xid: 0 0x13b4-0x13b7.7 (4) -0x13b0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x13b8-0x13bf.7 (8) -0x13c0|68 |h | xl_info: 104 0x13c0-0x13c0.7 (1) -0x13c0| 13 | . | xl_rmid: 19 0x13c1-0x13c1.7 (1) -0x13c0| 00 5b | .[ | hole1: 23296 0x13c2-0x13c3.7 (2) -0x13c0| 7a 01 00 00 | z... | xl_crc: 378 0x13c4-0x13c7.7 (4) -0x1580| 00 00 00 00 00 | ..... | align0: raw bits 0x1583-0x1587.7 (5) - | | | [20]{}: xlog_record 0x1588-0x15cf.7 (72) - | | | lsn: "17A/5B001588" (1625024370056) 0x1588-NA (0) -0x1580| 47 00 00 00 | G... | xl_tot_len: 71 0x1588-0x158b.7 (4) -0x1580| 00 00 00 00| ....| xlog_body0: raw bits 0x158c-0x15ce.7 (67) -0x1590|00 00 00 00 00 00 00 00 b0 13 00 5b 7a 01 00 00|...........[z...| -* |until 0x15ce.7 (67) | | -0x1580| 00 00 00 00| ....| xl_xid: 0 0x158c-0x158f.7 (4) -0x1590|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x1590-0x1597.7 (8) -0x1590| b0 | . | xl_info: 176 0x1598-0x1598.7 (1) -0x1590| 13 | . | xl_rmid: 19 0x1599-0x1599.7 (1) -0x1590| 00 5b | .[ | hole1: 23296 0x159a-0x159b.7 (2) -0x1590| 7a 01 00 00| z...| xl_crc: 378 0x159c-0x159f.7 (4) -0x15c0| 00| .| align0: raw bits 0x15cf-0x15cf.7 (1) - | | | [21]{}: xlog_record 0x15d0-0x17a7.7 (472) - | | | lsn: "17A/5B0015D0" (1625024370128) 0x15d0-NA (0) -0x15d0|d3 01 00 00 |.... | xl_tot_len: 467 0x15d0-0x15d3.7 (4) -0x15d0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x15d4-0x17a2.7 (463) -0x15e0|88 15 00 5b 7a 01 00 00 10 09 00 00 56 c6 0f b8|...[z.......V...| -* |until 0x17a2.7 (463) | | -0x15d0| 00 00 00 00 | .... | xl_xid: 0 0x15d4-0x15d7.7 (4) -0x15d0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x15d8-0x15df.7 (8) -0x15e0|88 |. | xl_info: 136 0x15e0-0x15e0.7 (1) -0x15e0| 15 | . | xl_rmid: 21 0x15e1-0x15e1.7 (1) -0x15e0| 00 5b | .[ | hole1: 23296 0x15e2-0x15e3.7 (2) -0x15e0| 7a 01 00 00 | z... | xl_crc: 378 0x15e4-0x15e7.7 (4) -0x17a0| 00 00 00 00 00 | ..... | align0: raw bits 0x17a3-0x17a7.7 (5) - | | | [22]{}: xlog_record 0x17a8-0x17ef.7 (72) - | | | lsn: "17A/5B0017A8" (1625024370600) 0x17a8-NA (0) -0x17a0| 47 00 00 00 | G... | xl_tot_len: 71 0x17a8-0x17ab.7 (4) -0x17a0| 00 00 00 00| ....| xlog_body0: raw bits 0x17ac-0x17ee.7 (67) -0x17b0|00 00 00 00 00 00 00 00 d0 15 00 5b 7a 01 00 00|...........[z...| -* |until 0x17ee.7 (67) | | -0x17a0| 00 00 00 00| ....| xl_xid: 0 0x17ac-0x17af.7 (4) -0x17b0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x17b0-0x17b7.7 (8) -0x17b0| d0 | . | xl_info: 208 0x17b8-0x17b8.7 (1) -0x17b0| 15 | . | xl_rmid: 21 0x17b9-0x17b9.7 (1) -0x17b0| 00 5b | .[ | hole1: 23296 0x17ba-0x17bb.7 (2) -0x17b0| 7a 01 00 00| z...| xl_crc: 378 0x17bc-0x17bf.7 (4) -0x17e0| 00| .| align0: raw bits 0x17ef-0x17ef.7 (1) - | | | [23]{}: xlog_record 0x17f0-0x19c7.7 (472) - | | | lsn: "17A/5B0017F0" (1625024370672) 0x17f0-NA (0) -0x17f0|d3 01 00 00 |.... | xl_tot_len: 467 0x17f0-0x17f3.7 (4) -0x17f0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x17f4-0x19c2.7 (463) -0x1800|a8 17 00 5b 7a 01 00 00 10 09 00 00 c2 64 46 9e|...[z........dF.| -* |until 0x19c2.7 (463) | | -0x17f0| 00 00 00 00 | .... | xl_xid: 0 0x17f4-0x17f7.7 (4) -0x17f0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x17f8-0x17ff.7 (8) -0x1800|a8 |. | xl_info: 168 0x1800-0x1800.7 (1) -0x1800| 17 | . | xl_rmid: 23 0x1801-0x1801.7 (1) -0x1800| 00 5b | .[ | hole1: 23296 0x1802-0x1803.7 (2) -0x1800| 7a 01 00 00 | z... | xl_crc: 378 0x1804-0x1807.7 (4) -0x19c0| 00 00 00 00 00 | ..... | align0: raw bits 0x19c3-0x19c7.7 (5) - | | | [24]{}: xlog_record 0x19c8-0x1a0f.7 (72) - | | | lsn: "17A/5B0019C8" (1625024371144) 0x19c8-NA (0) -0x19c0| 47 00 00 00 | G... | xl_tot_len: 71 0x19c8-0x19cb.7 (4) -0x19c0| 00 00 00 00| ....| xlog_body0: raw bits 0x19cc-0x1a0e.7 (67) -0x19d0|00 00 00 00 00 00 00 00 f0 17 00 5b 7a 01 00 00|...........[z...| -* |until 0x1a0e.7 (67) | | -0x19c0| 00 00 00 00| ....| xl_xid: 0 0x19cc-0x19cf.7 (4) -0x19d0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x19d0-0x19d7.7 (8) -0x19d0| f0 | . | xl_info: 240 0x19d8-0x19d8.7 (1) -0x19d0| 17 | . | xl_rmid: 23 0x19d9-0x19d9.7 (1) -0x19d0| 00 5b | .[ | hole1: 23296 0x19da-0x19db.7 (2) -0x19d0| 7a 01 00 00| z...| xl_crc: 378 0x19dc-0x19df.7 (4) -0x1a00| 00| .| align0: raw bits 0x1a0f-0x1a0f.7 (1) - | | | [25]{}: xlog_record 0x1a10-0x1be7.7 (472) - | | | lsn: "17A/5B001A10" (1625024371216) 0x1a10-NA (0) -0x1a10|d3 01 00 00 |.... | xl_tot_len: 467 0x1a10-0x1a13.7 (4) -0x1a10| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x1a14-0x1be2.7 (463) -0x1a20|c8 19 00 5b 7a 01 00 00 10 09 00 00 bd 6b 0c fc|...[z........k..| -* |until 0x1be2.7 (463) | | -0x1a10| 00 00 00 00 | .... | xl_xid: 0 0x1a14-0x1a17.7 (4) -0x1a10| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x1a18-0x1a1f.7 (8) -0x1a20|c8 |. | xl_info: 200 0x1a20-0x1a20.7 (1) -0x1a20| 19 | . | xl_rmid: 25 0x1a21-0x1a21.7 (1) -0x1a20| 00 5b | .[ | hole1: 23296 0x1a22-0x1a23.7 (2) -0x1a20| 7a 01 00 00 | z... | xl_crc: 378 0x1a24-0x1a27.7 (4) -0x1be0| 00 00 00 00 00 | ..... | align0: raw bits 0x1be3-0x1be7.7 (5) - | | | [26]{}: xlog_record 0x1be8-0x1c2f.7 (72) - | | | lsn: "17A/5B001BE8" (1625024371688) 0x1be8-NA (0) -0x1be0| 47 00 00 00 | G... | xl_tot_len: 71 0x1be8-0x1beb.7 (4) -0x1be0| 00 00 00 00| ....| xlog_body0: raw bits 0x1bec-0x1c2e.7 (67) -0x1bf0|00 00 00 00 00 00 00 00 10 1a 00 5b 7a 01 00 00|...........[z...| -* |until 0x1c2e.7 (67) | | -0x1be0| 00 00 00 00| ....| xl_xid: 0 0x1bec-0x1bef.7 (4) -0x1bf0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x1bf0-0x1bf7.7 (8) -0x1bf0| 10 | . | xl_info: 16 0x1bf8-0x1bf8.7 (1) -0x1bf0| 1a | . | xl_rmid: 26 0x1bf9-0x1bf9.7 (1) -0x1bf0| 00 5b | .[ | hole1: 23296 0x1bfa-0x1bfb.7 (2) -0x1bf0| 7a 01 00 00| z...| xl_crc: 378 0x1bfc-0x1bff.7 (4) -0x1c20| 00| .| align0: raw bits 0x1c2f-0x1c2f.7 (1) - | | | [27]{}: xlog_record 0x1c30-0x1e07.7 (472) - | | | lsn: "17A/5B001C30" (1625024371760) 0x1c30-NA (0) -0x1c30|d3 01 00 00 |.... | xl_tot_len: 467 0x1c30-0x1c33.7 (4) -0x1c30| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x1c34-0x1e02.7 (463) -0x1c40|e8 1b 00 5b 7a 01 00 00 10 09 00 00 7a 4b c5 1c|...[z.......zK..| -* |until 0x1e02.7 (463) | | -0x1c30| 00 00 00 00 | .... | xl_xid: 0 0x1c34-0x1c37.7 (4) -0x1c30| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x1c38-0x1c3f.7 (8) -0x1c40|e8 |. | xl_info: 232 0x1c40-0x1c40.7 (1) -0x1c40| 1b | . | xl_rmid: 27 0x1c41-0x1c41.7 (1) -0x1c40| 00 5b | .[ | hole1: 23296 0x1c42-0x1c43.7 (2) -0x1c40| 7a 01 00 00 | z... | xl_crc: 378 0x1c44-0x1c47.7 (4) -0x1e00| 00 00 00 00 00 | ..... | align0: raw bits 0x1e03-0x1e07.7 (5) - | | | [28]{}: xlog_record 0x1e08-0x1e4f.7 (72) - | | | lsn: "17A/5B001E08" (1625024372232) 0x1e08-NA (0) -0x1e00| 47 00 00 00 | G... | xl_tot_len: 71 0x1e08-0x1e0b.7 (4) -0x1e00| 00 00 00 00| ....| xlog_body0: raw bits 0x1e0c-0x1e4e.7 (67) -0x1e10|00 00 00 00 00 00 00 00 30 1c 00 5b 7a 01 00 00|........0..[z...| -* |until 0x1e4e.7 (67) | | -0x1e00| 00 00 00 00| ....| xl_xid: 0 0x1e0c-0x1e0f.7 (4) -0x1e10|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x1e10-0x1e17.7 (8) -0x1e10| 30 | 0 | xl_info: 48 0x1e18-0x1e18.7 (1) -0x1e10| 1c | . | xl_rmid: 28 0x1e19-0x1e19.7 (1) -0x1e10| 00 5b | .[ | hole1: 23296 0x1e1a-0x1e1b.7 (2) -0x1e10| 7a 01 00 00| z...| xl_crc: 378 0x1e1c-0x1e1f.7 (4) -0x1e40| 00| .| align0: raw bits 0x1e4f-0x1e4f.7 (1) - | | | [29]{}: xlog_record 0x1e50-0x203f.7 (496) - | | | lsn: "17A/5B001E50" (1625024372304) 0x1e50-NA (0) -0x1e50|d3 01 00 00 |.... | xl_tot_len: 467 0x1e50-0x1e53.7 (4) -0x1e50| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x1e54-0x1fff.7 (428) -0x1e60|08 1e 00 5b 7a 01 00 00 10 09 00 00 b7 41 1b 32|...[z........A.2| -* |until 0x1fff.7 (428) | | -0x1e50| 00 00 00 00 | .... | xl_xid: 0 0x1e54-0x1e57.7 (4) -0x1e50| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x1e58-0x1e5f.7 (8) -0x1e60|08 |. | xl_info: 8 0x1e60-0x1e60.7 (1) -0x1e60| 1e | . | xl_rmid: 30 0x1e61-0x1e61.7 (1) -0x1e60| 00 5b | .[ | hole1: 23296 0x1e62-0x1e63.7 (2) -0x1e60| 7a 01 00 00 | z... | xl_crc: 378 0x1e64-0x1e67.7 (4) -0x2010| e5 0b 54 02 00 00 00 00| ..T.....| xlog_body1: raw bits 0x2018-0x203f.7 (40) -0x2020|00 00 00 00 00 00 00 00 00 00 00 10 10 00 00 06|................| -0x2030|e6 0b 54 02 00 00 00 00 00 00 00 00 00 00 00 00|..T.............| - | | | [1]{}: page 0x2000-0x3fff.7 (8192) - | | | xloog_page_header_data{}: 0x2000-0x2017.7 (24) -0x2000|06 d1 |.. | xlp_magic: 53510 0x2000-0x2001.7 (2) -0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) -0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) -0x2000| 00 20 00 5b 7a 01 00 00| . .[z...| xlp_pageaddr: 1625024372736 0x2008-0x200f.7 (8) -0x2010|23 00 00 00 |#... | xlp_rem_len: 35 0x2010-0x2013.7 (4) -0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) - | | | records[0:30]: 0x2040-0x3fff.7 (8128) - | | | [0]{}: xlog_record 0x2040-0x2087.7 (72) - | | | lsn: "17A/5B002040" (1625024372800) 0x2040-NA (0) -0x2040|47 00 00 00 |G... | xl_tot_len: 71 0x2040-0x2043.7 (4) -0x2040| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2044-0x2086.7 (67) -0x2050|50 1e 00 5b 7a 01 00 00 40 09 00 00 ca dd 49 02|P..[z...@.....I.| -* |until 0x2086.7 (67) | | -0x2040| 00 00 00 00 | .... | xl_xid: 0 0x2044-0x2047.7 (4) -0x2040| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x2048-0x204f.7 (8) -0x2050|50 |P | xl_info: 80 0x2050-0x2050.7 (1) -0x2050| 1e | . | xl_rmid: 30 0x2051-0x2051.7 (1) -0x2050| 00 5b | .[ | hole1: 23296 0x2052-0x2053.7 (2) -0x2050| 7a 01 00 00 | z... | xl_crc: 378 0x2054-0x2057.7 (4) -0x2080| 00 | . | align0: raw bits 0x2087-0x2087.7 (1) - | | | [1]{}: xlog_record 0x2088-0x225f.7 (472) - | | | lsn: "17A/5B002088" (1625024372872) 0x2088-NA (0) -0x2080| d3 01 00 00 | .... | xl_tot_len: 467 0x2088-0x208b.7 (4) -0x2080| 00 00 00 00| ....| xlog_body0: raw bits 0x208c-0x225a.7 (463) -0x2090|00 00 00 00 00 00 00 00 40 20 00 5b 7a 01 00 00|........@ .[z...| -* |until 0x225a.7 (463) | | -0x2080| 00 00 00 00| ....| xl_xid: 0 0x208c-0x208f.7 (4) -0x2090|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x2090-0x2097.7 (8) -0x2090| 40 | @ | xl_info: 64 0x2098-0x2098.7 (1) -0x2090| 20 | | xl_rmid: 32 0x2099-0x2099.7 (1) -0x2090| 00 5b | .[ | hole1: 23296 0x209a-0x209b.7 (2) -0x2090| 7a 01 00 00| z...| xl_crc: 378 0x209c-0x209f.7 (4) -0x2250| 00 00 00 00 00| .....| align0: raw bits 0x225b-0x225f.7 (5) - | | | [2]{}: xlog_record 0x2260-0x22a7.7 (72) - | | | lsn: "17A/5B002260" (1625024373344) 0x2260-NA (0) -0x2260|47 00 00 00 |G... | xl_tot_len: 71 0x2260-0x2263.7 (4) -0x2260| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2264-0x22a6.7 (67) -0x2270|88 20 00 5b 7a 01 00 00 40 09 00 00 0f 50 2f 9d|. .[z...@....P/.| -* |until 0x22a6.7 (67) | | -0x2260| 00 00 00 00 | .... | xl_xid: 0 0x2264-0x2267.7 (4) -0x2260| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x2268-0x226f.7 (8) -0x2270|88 |. | xl_info: 136 0x2270-0x2270.7 (1) -0x2270| 20 | | xl_rmid: 32 0x2271-0x2271.7 (1) -0x2270| 00 5b | .[ | hole1: 23296 0x2272-0x2273.7 (2) -0x2270| 7a 01 00 00 | z... | xl_crc: 378 0x2274-0x2277.7 (4) -0x22a0| 00 | . | align0: raw bits 0x22a7-0x22a7.7 (1) - | | | [3]{}: xlog_record 0x22a8-0x247f.7 (472) - | | | lsn: "17A/5B0022A8" (1625024373416) 0x22a8-NA (0) -0x22a0| d3 01 00 00 | .... | xl_tot_len: 467 0x22a8-0x22ab.7 (4) -0x22a0| 00 00 00 00| ....| xlog_body0: raw bits 0x22ac-0x247a.7 (463) -0x22b0|00 00 00 00 00 00 00 00 60 22 00 5b 7a 01 00 00|........`".[z...| -* |until 0x247a.7 (463) | | -0x22a0| 00 00 00 00| ....| xl_xid: 0 0x22ac-0x22af.7 (4) -0x22b0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x22b0-0x22b7.7 (8) -0x22b0| 60 | ` | xl_info: 96 0x22b8-0x22b8.7 (1) -0x22b0| 22 | " | xl_rmid: 34 0x22b9-0x22b9.7 (1) -0x22b0| 00 5b | .[ | hole1: 23296 0x22ba-0x22bb.7 (2) -0x22b0| 7a 01 00 00| z...| xl_crc: 378 0x22bc-0x22bf.7 (4) -0x2470| 00 00 00 00 00| .....| align0: raw bits 0x247b-0x247f.7 (5) - | | | [4]{}: xlog_record 0x2480-0x24c7.7 (72) - | | | lsn: "17A/5B002480" (1625024373888) 0x2480-NA (0) -0x2480|47 00 00 00 |G... | xl_tot_len: 71 0x2480-0x2483.7 (4) -0x2480| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2484-0x24c6.7 (67) -0x2490|a8 22 00 5b 7a 01 00 00 40 09 00 00 be 30 c6 75|.".[z...@....0.u| -* |until 0x24c6.7 (67) | | -0x2480| 00 00 00 00 | .... | xl_xid: 0 0x2484-0x2487.7 (4) -0x2480| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x2488-0x248f.7 (8) -0x2490|a8 |. | xl_info: 168 0x2490-0x2490.7 (1) -0x2490| 22 | " | xl_rmid: 34 0x2491-0x2491.7 (1) -0x2490| 00 5b | .[ | hole1: 23296 0x2492-0x2493.7 (2) -0x2490| 7a 01 00 00 | z... | xl_crc: 378 0x2494-0x2497.7 (4) -0x24c0| 00 | . | align0: raw bits 0x24c7-0x24c7.7 (1) - | | | [5]{}: xlog_record 0x24c8-0x269f.7 (472) - | | | lsn: "17A/5B0024C8" (1625024373960) 0x24c8-NA (0) -0x24c0| d3 01 00 00 | .... | xl_tot_len: 467 0x24c8-0x24cb.7 (4) -0x24c0| 00 00 00 00| ....| xlog_body0: raw bits 0x24cc-0x269a.7 (463) -0x24d0|00 00 00 00 00 00 00 00 80 24 00 5b 7a 01 00 00|.........$.[z...| -* |until 0x269a.7 (463) | | -0x24c0| 00 00 00 00| ....| xl_xid: 0 0x24cc-0x24cf.7 (4) -0x24d0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x24d0-0x24d7.7 (8) -0x24d0| 80 | . | xl_info: 128 0x24d8-0x24d8.7 (1) -0x24d0| 24 | $ | xl_rmid: 36 0x24d9-0x24d9.7 (1) -0x24d0| 00 5b | .[ | hole1: 23296 0x24da-0x24db.7 (2) -0x24d0| 7a 01 00 00| z...| xl_crc: 378 0x24dc-0x24df.7 (4) -0x2690| 00 00 00 00 00| .....| align0: raw bits 0x269b-0x269f.7 (5) - | | | [6]{}: xlog_record 0x26a0-0x26e7.7 (72) - | | | lsn: "17A/5B0026A0" (1625024374432) 0x26a0-NA (0) -0x26a0|47 00 00 00 |G... | xl_tot_len: 71 0x26a0-0x26a3.7 (4) -0x26a0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x26a4-0x26e6.7 (67) -0x26b0|c8 24 00 5b 7a 01 00 00 40 09 00 00 d0 60 79 cc|.$.[z...@....`y.| -* |until 0x26e6.7 (67) | | -0x26a0| 00 00 00 00 | .... | xl_xid: 0 0x26a4-0x26a7.7 (4) -0x26a0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x26a8-0x26af.7 (8) -0x26b0|c8 |. | xl_info: 200 0x26b0-0x26b0.7 (1) -0x26b0| 24 | $ | xl_rmid: 36 0x26b1-0x26b1.7 (1) -0x26b0| 00 5b | .[ | hole1: 23296 0x26b2-0x26b3.7 (2) -0x26b0| 7a 01 00 00 | z... | xl_crc: 378 0x26b4-0x26b7.7 (4) -0x26e0| 00 | . | align0: raw bits 0x26e7-0x26e7.7 (1) - | | | [7]{}: xlog_record 0x26e8-0x28bf.7 (472) - | | | lsn: "17A/5B0026E8" (1625024374504) 0x26e8-NA (0) -0x26e0| d3 01 00 00 | .... | xl_tot_len: 467 0x26e8-0x26eb.7 (4) -0x26e0| 00 00 00 00| ....| xlog_body0: raw bits 0x26ec-0x28ba.7 (463) -0x26f0|00 00 00 00 00 00 00 00 a0 26 00 5b 7a 01 00 00|.........&.[z...| -* |until 0x28ba.7 (463) | | -0x26e0| 00 00 00 00| ....| xl_xid: 0 0x26ec-0x26ef.7 (4) -0x26f0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x26f0-0x26f7.7 (8) -0x26f0| a0 | . | xl_info: 160 0x26f8-0x26f8.7 (1) -0x26f0| 26 | & | xl_rmid: 38 0x26f9-0x26f9.7 (1) -0x26f0| 00 5b | .[ | hole1: 23296 0x26fa-0x26fb.7 (2) -0x26f0| 7a 01 00 00| z...| xl_crc: 378 0x26fc-0x26ff.7 (4) -0x28b0| 00 00 00 00 00| .....| align0: raw bits 0x28bb-0x28bf.7 (5) - | | | [8]{}: xlog_record 0x28c0-0x2907.7 (72) - | | | lsn: "17A/5B0028C0" (1625024374976) 0x28c0-NA (0) -0x28c0|47 00 00 00 |G... | xl_tot_len: 71 0x28c0-0x28c3.7 (4) -0x28c0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x28c4-0x2906.7 (67) -0x28d0|e8 26 00 5b 7a 01 00 00 40 09 00 00 c7 43 24 66|.&.[z...@....C$f| -* |until 0x2906.7 (67) | | -0x28c0| 00 00 00 00 | .... | xl_xid: 0 0x28c4-0x28c7.7 (4) -0x28c0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x28c8-0x28cf.7 (8) -0x28d0|e8 |. | xl_info: 232 0x28d0-0x28d0.7 (1) -0x28d0| 26 | & | xl_rmid: 38 0x28d1-0x28d1.7 (1) -0x28d0| 00 5b | .[ | hole1: 23296 0x28d2-0x28d3.7 (2) -0x28d0| 7a 01 00 00 | z... | xl_crc: 378 0x28d4-0x28d7.7 (4) -0x2900| 00 | . | align0: raw bits 0x2907-0x2907.7 (1) - | | | [9]{}: xlog_record 0x2908-0x2adf.7 (472) - | | | lsn: "17A/5B002908" (1625024375048) 0x2908-NA (0) -0x2900| d3 01 00 00 | .... | xl_tot_len: 467 0x2908-0x290b.7 (4) -0x2900| 00 00 00 00| ....| xlog_body0: raw bits 0x290c-0x2ada.7 (463) -0x2910|00 00 00 00 00 00 00 00 c0 28 00 5b 7a 01 00 00|.........(.[z...| -* |until 0x2ada.7 (463) | | -0x2900| 00 00 00 00| ....| xl_xid: 0 0x290c-0x290f.7 (4) -0x2910|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x2910-0x2917.7 (8) -0x2910| c0 | . | xl_info: 192 0x2918-0x2918.7 (1) -0x2910| 28 | ( | xl_rmid: 40 0x2919-0x2919.7 (1) -0x2910| 00 5b | .[ | hole1: 23296 0x291a-0x291b.7 (2) -0x2910| 7a 01 00 00| z...| xl_crc: 378 0x291c-0x291f.7 (4) -0x2ad0| 00 00 00 00 00| .....| align0: raw bits 0x2adb-0x2adf.7 (5) - | | | [10]{}: xlog_record 0x2ae0-0x2b27.7 (72) - | | | lsn: "17A/5B002AE0" (1625024375520) 0x2ae0-NA (0) -0x2ae0|47 00 00 00 |G... | xl_tot_len: 71 0x2ae0-0x2ae3.7 (4) -0x2ae0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2ae4-0x2b26.7 (67) -0x2af0|08 29 00 5b 7a 01 00 00 40 09 00 00 3c 41 9a 2d|.).[z...@...<A.-| -* |until 0x2b26.7 (67) | | -0x2ae0| 00 00 00 00 | .... | xl_xid: 0 0x2ae4-0x2ae7.7 (4) -0x2ae0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x2ae8-0x2aef.7 (8) -0x2af0|08 |. | xl_info: 8 0x2af0-0x2af0.7 (1) -0x2af0| 29 | ) | xl_rmid: 41 0x2af1-0x2af1.7 (1) -0x2af0| 00 5b | .[ | hole1: 23296 0x2af2-0x2af3.7 (2) -0x2af0| 7a 01 00 00 | z... | xl_crc: 378 0x2af4-0x2af7.7 (4) -0x2b20| 00 | . | align0: raw bits 0x2b27-0x2b27.7 (1) - | | | [11]{}: xlog_record 0x2b28-0x2cff.7 (472) - | | | lsn: "17A/5B002B28" (1625024375592) 0x2b28-NA (0) -0x2b20| d3 01 00 00 | .... | xl_tot_len: 467 0x2b28-0x2b2b.7 (4) -0x2b20| 00 00 00 00| ....| xlog_body0: raw bits 0x2b2c-0x2cfa.7 (463) -0x2b30|00 00 00 00 00 00 00 00 e0 2a 00 5b 7a 01 00 00|.........*.[z...| -* |until 0x2cfa.7 (463) | | -0x2b20| 00 00 00 00| ....| xl_xid: 0 0x2b2c-0x2b2f.7 (4) -0x2b30|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x2b30-0x2b37.7 (8) -0x2b30| e0 | . | xl_info: 224 0x2b38-0x2b38.7 (1) -0x2b30| 2a | * | xl_rmid: 42 0x2b39-0x2b39.7 (1) -0x2b30| 00 5b | .[ | hole1: 23296 0x2b3a-0x2b3b.7 (2) -0x2b30| 7a 01 00 00| z...| xl_crc: 378 0x2b3c-0x2b3f.7 (4) -0x2cf0| 00 00 00 00 00| .....| align0: raw bits 0x2cfb-0x2cff.7 (5) - | | | [12]{}: xlog_record 0x2d00-0x2d47.7 (72) - | | | lsn: "17A/5B002D00" (1625024376064) 0x2d00-NA (0) -0x2d00|47 00 00 00 |G... | xl_tot_len: 71 0x2d00-0x2d03.7 (4) -0x2d00| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2d04-0x2d46.7 (67) -0x2d10|28 2b 00 5b 7a 01 00 00 40 09 00 00 c1 a6 1b 40|(+.[z...@......@| -* |until 0x2d46.7 (67) | | -0x2d00| 00 00 00 00 | .... | xl_xid: 0 0x2d04-0x2d07.7 (4) -0x2d00| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x2d08-0x2d0f.7 (8) -0x2d10|28 |( | xl_info: 40 0x2d10-0x2d10.7 (1) -0x2d10| 2b | + | xl_rmid: 43 0x2d11-0x2d11.7 (1) -0x2d10| 00 5b | .[ | hole1: 23296 0x2d12-0x2d13.7 (2) -0x2d10| 7a 01 00 00 | z... | xl_crc: 378 0x2d14-0x2d17.7 (4) -0x2d40| 00 | . | align0: raw bits 0x2d47-0x2d47.7 (1) - | | | [13]{}: xlog_record 0x2d48-0x2f1f.7 (472) - | | | lsn: "17A/5B002D48" (1625024376136) 0x2d48-NA (0) -0x2d40| d3 01 00 00 | .... | xl_tot_len: 467 0x2d48-0x2d4b.7 (4) -0x2d40| 00 00 00 00| ....| xlog_body0: raw bits 0x2d4c-0x2f1a.7 (463) -0x2d50|00 00 00 00 00 00 00 00 00 2d 00 5b 7a 01 00 00|.........-.[z...| -* |until 0x2f1a.7 (463) | | -0x2d40| 00 00 00 00| ....| xl_xid: 0 0x2d4c-0x2d4f.7 (4) -0x2d50|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x2d50-0x2d57.7 (8) -0x2d50| 00 | . | xl_info: 0 0x2d58-0x2d58.7 (1) -0x2d50| 2d | - | xl_rmid: 45 0x2d59-0x2d59.7 (1) -0x2d50| 00 5b | .[ | hole1: 23296 0x2d5a-0x2d5b.7 (2) -0x2d50| 7a 01 00 00| z...| xl_crc: 378 0x2d5c-0x2d5f.7 (4) -0x2f10| 00 00 00 00 00| .....| align0: raw bits 0x2f1b-0x2f1f.7 (5) - | | | [14]{}: xlog_record 0x2f20-0x2f67.7 (72) - | | | lsn: "17A/5B002F20" (1625024376608) 0x2f20-NA (0) -0x2f20|47 00 00 00 |G... | xl_tot_len: 71 0x2f20-0x2f23.7 (4) -0x2f20| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x2f24-0x2f66.7 (67) -0x2f30|48 2d 00 5b 7a 01 00 00 40 09 00 00 af f6 a4 f9|H-.[z...@.......| -* |until 0x2f66.7 (67) | | -0x2f20| 00 00 00 00 | .... | xl_xid: 0 0x2f24-0x2f27.7 (4) -0x2f20| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x2f28-0x2f2f.7 (8) -0x2f30|48 |H | xl_info: 72 0x2f30-0x2f30.7 (1) -0x2f30| 2d | - | xl_rmid: 45 0x2f31-0x2f31.7 (1) -0x2f30| 00 5b | .[ | hole1: 23296 0x2f32-0x2f33.7 (2) -0x2f30| 7a 01 00 00 | z... | xl_crc: 378 0x2f34-0x2f37.7 (4) -0x2f60| 00 | . | align0: raw bits 0x2f67-0x2f67.7 (1) - | | | [15]{}: xlog_record 0x2f68-0x313f.7 (472) - | | | lsn: "17A/5B002F68" (1625024376680) 0x2f68-NA (0) -0x2f60| d3 01 00 00 | .... | xl_tot_len: 467 0x2f68-0x2f6b.7 (4) -0x2f60| 00 00 00 00| ....| xlog_body0: raw bits 0x2f6c-0x313a.7 (463) -0x2f70|00 00 00 00 00 00 00 00 20 2f 00 5b 7a 01 00 00|........ /.[z...| -* |until 0x313a.7 (463) | | -0x2f60| 00 00 00 00| ....| xl_xid: 0 0x2f6c-0x2f6f.7 (4) -0x2f70|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x2f70-0x2f77.7 (8) -0x2f70| 20 | | xl_info: 32 0x2f78-0x2f78.7 (1) -0x2f70| 2f | / | xl_rmid: 47 0x2f79-0x2f79.7 (1) -0x2f70| 00 5b | .[ | hole1: 23296 0x2f7a-0x2f7b.7 (2) -0x2f70| 7a 01 00 00| z...| xl_crc: 378 0x2f7c-0x2f7f.7 (4) -0x3130| 00 00 00 00 00| .....| align0: raw bits 0x313b-0x313f.7 (5) - | | | [16]{}: xlog_record 0x3140-0x3187.7 (72) - | | | lsn: "17A/5B003140" (1625024377152) 0x3140-NA (0) -0x3140|47 00 00 00 |G... | xl_tot_len: 71 0x3140-0x3143.7 (4) -0x3140| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x3144-0x3186.7 (67) -0x3150|68 2f 00 5b 7a 01 00 00 40 09 00 00 b8 d5 f9 53|h/.[z...@......S| -* |until 0x3186.7 (67) | | -0x3140| 00 00 00 00 | .... | xl_xid: 0 0x3144-0x3147.7 (4) -0x3140| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x3148-0x314f.7 (8) -0x3150|68 |h | xl_info: 104 0x3150-0x3150.7 (1) -0x3150| 2f | / | xl_rmid: 47 0x3151-0x3151.7 (1) -0x3150| 00 5b | .[ | hole1: 23296 0x3152-0x3153.7 (2) -0x3150| 7a 01 00 00 | z... | xl_crc: 378 0x3154-0x3157.7 (4) -0x3180| 00 | . | align0: raw bits 0x3187-0x3187.7 (1) - | | | [17]{}: xlog_record 0x3188-0x335f.7 (472) - | | | lsn: "17A/5B003188" (1625024377224) 0x3188-NA (0) -0x3180| d3 01 00 00 | .... | xl_tot_len: 467 0x3188-0x318b.7 (4) -0x3180| 00 00 00 00| ....| xlog_body0: raw bits 0x318c-0x335a.7 (463) -0x3190|00 00 00 00 00 00 00 00 40 31 00 5b 7a 01 00 00|........@1.[z...| -* |until 0x335a.7 (463) | | -0x3180| 00 00 00 00| ....| xl_xid: 0 0x318c-0x318f.7 (4) -0x3190|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x3190-0x3197.7 (8) -0x3190| 40 | @ | xl_info: 64 0x3198-0x3198.7 (1) -0x3190| 31 | 1 | xl_rmid: 49 0x3199-0x3199.7 (1) -0x3190| 00 5b | .[ | hole1: 23296 0x319a-0x319b.7 (2) -0x3190| 7a 01 00 00| z...| xl_crc: 378 0x319c-0x319f.7 (4) -0x3350| 00 00 00 00 00| .....| align0: raw bits 0x335b-0x335f.7 (5) - | | | [18]{}: xlog_record 0x3360-0x33a7.7 (72) - | | | lsn: "17A/5B003360" (1625024377696) 0x3360-NA (0) -0x3360|47 00 00 00 |G... | xl_tot_len: 71 0x3360-0x3363.7 (4) -0x3360| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x3364-0x33a6.7 (67) -0x3370|88 31 00 5b 7a 01 00 00 40 09 00 00 eb 9d a6 d2|.1.[z...@.......| -* |until 0x33a6.7 (67) | | -0x3360| 00 00 00 00 | .... | xl_xid: 0 0x3364-0x3367.7 (4) -0x3360| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x3368-0x336f.7 (8) -0x3370|88 |. | xl_info: 136 0x3370-0x3370.7 (1) -0x3370| 31 | 1 | xl_rmid: 49 0x3371-0x3371.7 (1) -0x3370| 00 5b | .[ | hole1: 23296 0x3372-0x3373.7 (2) -0x3370| 7a 01 00 00 | z... | xl_crc: 378 0x3374-0x3377.7 (4) -0x33a0| 00 | . | align0: raw bits 0x33a7-0x33a7.7 (1) - | | | [19]{}: xlog_record 0x33a8-0x357f.7 (472) - | | | lsn: "17A/5B0033A8" (1625024377768) 0x33a8-NA (0) -0x33a0| d3 01 00 00 | .... | xl_tot_len: 467 0x33a8-0x33ab.7 (4) -0x33a0| 00 00 00 00| ....| xlog_body0: raw bits 0x33ac-0x357a.7 (463) -0x33b0|00 00 00 00 00 00 00 00 60 33 00 5b 7a 01 00 00|........`3.[z...| -* |until 0x357a.7 (463) | | -0x33a0| 00 00 00 00| ....| xl_xid: 0 0x33ac-0x33af.7 (4) -0x33b0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x33b0-0x33b7.7 (8) -0x33b0| 60 | ` | xl_info: 96 0x33b8-0x33b8.7 (1) -0x33b0| 33 | 3 | xl_rmid: 51 0x33b9-0x33b9.7 (1) -0x33b0| 00 5b | .[ | hole1: 23296 0x33ba-0x33bb.7 (2) -0x33b0| 7a 01 00 00| z...| xl_crc: 378 0x33bc-0x33bf.7 (4) -0x3570| 00 00 00 00 00| .....| align0: raw bits 0x357b-0x357f.7 (5) - | | | [20]{}: xlog_record 0x3580-0x35c7.7 (72) - | | | lsn: "17A/5B003580" (1625024378240) 0x3580-NA (0) -0x3580|47 00 00 00 |G... | xl_tot_len: 71 0x3580-0x3583.7 (4) -0x3580| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x3584-0x35c6.7 (67) -0x3590|a8 33 00 5b 7a 01 00 00 40 09 00 00 5a fd 4f 3a|.3.[z...@...Z.O:| -* |until 0x35c6.7 (67) | | -0x3580| 00 00 00 00 | .... | xl_xid: 0 0x3584-0x3587.7 (4) -0x3580| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x3588-0x358f.7 (8) -0x3590|a8 |. | xl_info: 168 0x3590-0x3590.7 (1) -0x3590| 33 | 3 | xl_rmid: 51 0x3591-0x3591.7 (1) -0x3590| 00 5b | .[ | hole1: 23296 0x3592-0x3593.7 (2) -0x3590| 7a 01 00 00 | z... | xl_crc: 378 0x3594-0x3597.7 (4) -0x35c0| 00 | . | align0: raw bits 0x35c7-0x35c7.7 (1) - | | | [21]{}: xlog_record 0x35c8-0x379f.7 (472) - | | | lsn: "17A/5B0035C8" (1625024378312) 0x35c8-NA (0) -0x35c0| d3 01 00 00 | .... | xl_tot_len: 467 0x35c8-0x35cb.7 (4) -0x35c0| 00 00 00 00| ....| xlog_body0: raw bits 0x35cc-0x379a.7 (463) -0x35d0|00 00 00 00 00 00 00 00 80 35 00 5b 7a 01 00 00|.........5.[z...| -* |until 0x379a.7 (463) | | -0x35c0| 00 00 00 00| ....| xl_xid: 0 0x35cc-0x35cf.7 (4) -0x35d0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x35d0-0x35d7.7 (8) -0x35d0| 80 | . | xl_info: 128 0x35d8-0x35d8.7 (1) -0x35d0| 35 | 5 | xl_rmid: 53 0x35d9-0x35d9.7 (1) -0x35d0| 00 5b | .[ | hole1: 23296 0x35da-0x35db.7 (2) -0x35d0| 7a 01 00 00| z...| xl_crc: 378 0x35dc-0x35df.7 (4) -0x3790| 00 00 00 00 00| .....| align0: raw bits 0x379b-0x379f.7 (5) - | | | [22]{}: xlog_record 0x37a0-0x37e7.7 (72) - | | | lsn: "17A/5B0037A0" (1625024378784) 0x37a0-NA (0) -0x37a0|47 00 00 00 |G... | xl_tot_len: 71 0x37a0-0x37a3.7 (4) -0x37a0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x37a4-0x37e6.7 (67) -0x37b0|c8 35 00 5b 7a 01 00 00 40 09 00 00 34 ad f0 83|.5.[z...@...4...| -* |until 0x37e6.7 (67) | | -0x37a0| 00 00 00 00 | .... | xl_xid: 0 0x37a4-0x37a7.7 (4) -0x37a0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x37a8-0x37af.7 (8) -0x37b0|c8 |. | xl_info: 200 0x37b0-0x37b0.7 (1) -0x37b0| 35 | 5 | xl_rmid: 53 0x37b1-0x37b1.7 (1) -0x37b0| 00 5b | .[ | hole1: 23296 0x37b2-0x37b3.7 (2) -0x37b0| 7a 01 00 00 | z... | xl_crc: 378 0x37b4-0x37b7.7 (4) -0x37e0| 00 | . | align0: raw bits 0x37e7-0x37e7.7 (1) - | | | [23]{}: xlog_record 0x37e8-0x39bf.7 (472) - | | | lsn: "17A/5B0037E8" (1625024378856) 0x37e8-NA (0) -0x37e0| d3 01 00 00 | .... | xl_tot_len: 467 0x37e8-0x37eb.7 (4) -0x37e0| 00 00 00 00| ....| xlog_body0: raw bits 0x37ec-0x39ba.7 (463) -0x37f0|00 00 00 00 00 00 00 00 a0 37 00 5b 7a 01 00 00|.........7.[z...| -* |until 0x39ba.7 (463) | | -0x37e0| 00 00 00 00| ....| xl_xid: 0 0x37ec-0x37ef.7 (4) -0x37f0|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x37f0-0x37f7.7 (8) -0x37f0| a0 | . | xl_info: 160 0x37f8-0x37f8.7 (1) -0x37f0| 37 | 7 | xl_rmid: 55 0x37f9-0x37f9.7 (1) -0x37f0| 00 5b | .[ | hole1: 23296 0x37fa-0x37fb.7 (2) -0x37f0| 7a 01 00 00| z...| xl_crc: 378 0x37fc-0x37ff.7 (4) -0x39b0| 00 00 00 00 00| .....| align0: raw bits 0x39bb-0x39bf.7 (5) - | | | [24]{}: xlog_record 0x39c0-0x3a07.7 (72) - | | | lsn: "17A/5B0039C0" (1625024379328) 0x39c0-NA (0) -0x39c0|47 00 00 00 |G... | xl_tot_len: 71 0x39c0-0x39c3.7 (4) -0x39c0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x39c4-0x3a06.7 (67) -0x39d0|e8 37 00 5b 7a 01 00 00 40 09 00 00 23 8e ad 29|.7.[z...@...#..)| -* |until 0x3a06.7 (67) | | -0x39c0| 00 00 00 00 | .... | xl_xid: 0 0x39c4-0x39c7.7 (4) -0x39c0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x39c8-0x39cf.7 (8) -0x39d0|e8 |. | xl_info: 232 0x39d0-0x39d0.7 (1) -0x39d0| 37 | 7 | xl_rmid: 55 0x39d1-0x39d1.7 (1) -0x39d0| 00 5b | .[ | hole1: 23296 0x39d2-0x39d3.7 (2) -0x39d0| 7a 01 00 00 | z... | xl_crc: 378 0x39d4-0x39d7.7 (4) -0x3a00| 00 | . | align0: raw bits 0x3a07-0x3a07.7 (1) - | | | [25]{}: xlog_record 0x3a08-0x3bdf.7 (472) - | | | lsn: "17A/5B003A08" (1625024379400) 0x3a08-NA (0) -0x3a00| d3 01 00 00 | .... | xl_tot_len: 467 0x3a08-0x3a0b.7 (4) -0x3a00| 00 00 00 00| ....| xlog_body0: raw bits 0x3a0c-0x3bda.7 (463) -0x3a10|00 00 00 00 00 00 00 00 c0 39 00 5b 7a 01 00 00|.........9.[z...| -* |until 0x3bda.7 (463) | | -0x3a00| 00 00 00 00| ....| xl_xid: 0 0x3a0c-0x3a0f.7 (4) -0x3a10|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x3a10-0x3a17.7 (8) -0x3a10| c0 | . | xl_info: 192 0x3a18-0x3a18.7 (1) -0x3a10| 39 | 9 | xl_rmid: 57 0x3a19-0x3a19.7 (1) -0x3a10| 00 5b | .[ | hole1: 23296 0x3a1a-0x3a1b.7 (2) -0x3a10| 7a 01 00 00| z...| xl_crc: 378 0x3a1c-0x3a1f.7 (4) -0x3bd0| 00 00 00 00 00| .....| align0: raw bits 0x3bdb-0x3bdf.7 (5) - | | | [26]{}: xlog_record 0x3be0-0x3c27.7 (72) - | | | lsn: "17A/5B003BE0" (1625024379872) 0x3be0-NA (0) -0x3be0|47 00 00 00 |G... | xl_tot_len: 71 0x3be0-0x3be3.7 (4) -0x3be0| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x3be4-0x3c26.7 (67) -0x3bf0|08 3a 00 5b 7a 01 00 00 40 09 00 00 ab 15 1c 49|.:.[z...@......I| -* |until 0x3c26.7 (67) | | -0x3be0| 00 00 00 00 | .... | xl_xid: 0 0x3be4-0x3be7.7 (4) -0x3be0| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x3be8-0x3bef.7 (8) -0x3bf0|08 |. | xl_info: 8 0x3bf0-0x3bf0.7 (1) -0x3bf0| 3a | : | xl_rmid: 58 0x3bf1-0x3bf1.7 (1) -0x3bf0| 00 5b | .[ | hole1: 23296 0x3bf2-0x3bf3.7 (2) -0x3bf0| 7a 01 00 00 | z... | xl_crc: 378 0x3bf4-0x3bf7.7 (4) -0x3c20| 00 | . | align0: raw bits 0x3c27-0x3c27.7 (1) - | | | [27]{}: xlog_record 0x3c28-0x3dff.7 (472) - | | | lsn: "17A/5B003C28" (1625024379944) 0x3c28-NA (0) -0x3c20| d3 01 00 00 | .... | xl_tot_len: 467 0x3c28-0x3c2b.7 (4) -0x3c20| 00 00 00 00| ....| xlog_body0: raw bits 0x3c2c-0x3dfa.7 (463) -0x3c30|00 00 00 00 00 00 00 00 e0 3b 00 5b 7a 01 00 00|.........;.[z...| -* |until 0x3dfa.7 (463) | | -0x3c20| 00 00 00 00| ....| xl_xid: 0 0x3c2c-0x3c2f.7 (4) -0x3c30|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x3c30-0x3c37.7 (8) -0x3c30| e0 | . | xl_info: 224 0x3c38-0x3c38.7 (1) -0x3c30| 3b | ; | xl_rmid: 59 0x3c39-0x3c39.7 (1) -0x3c30| 00 5b | .[ | hole1: 23296 0x3c3a-0x3c3b.7 (2) -0x3c30| 7a 01 00 00| z...| xl_crc: 378 0x3c3c-0x3c3f.7 (4) -0x3df0| 00 00 00 00 00| .....| align0: raw bits 0x3dfb-0x3dff.7 (5) - | | | [28]{}: xlog_record 0x3e00-0x3e47.7 (72) - | | | lsn: "17A/5B003E00" (1625024380416) 0x3e00-NA (0) -0x3e00|47 00 00 00 |G... | xl_tot_len: 71 0x3e00-0x3e03.7 (4) -0x3e00| 00 00 00 00 00 00 00 00 00 00 00 00| ............| xlog_body0: raw bits 0x3e04-0x3e46.7 (67) -0x3e10|28 3c 00 5b 7a 01 00 00 40 09 00 00 af a9 30 5f|(<.[z...@.....0_| -* |until 0x3e46.7 (67) | | -0x3e00| 00 00 00 00 | .... | xl_xid: 0 0x3e04-0x3e07.7 (4) -0x3e00| 00 00 00 00 00 00 00 00| ........| xl_prev: "0/0" (0) 0x3e08-0x3e0f.7 (8) -0x3e10|28 |( | xl_info: 40 0x3e10-0x3e10.7 (1) -0x3e10| 3c | < | xl_rmid: 60 0x3e11-0x3e11.7 (1) -0x3e10| 00 5b | .[ | hole1: 23296 0x3e12-0x3e13.7 (2) -0x3e10| 7a 01 00 00 | z... | xl_crc: 378 0x3e14-0x3e17.7 (4) -0x3e40| 00 | . | align0: raw bits 0x3e47-0x3e47.7 (1) - | | | [29]{}: xlog_record 0x3e48-0x3fff.7 (440) - | | | lsn: "17A/5B003E48" (1625024380488) 0x3e48-NA (0) -0x3e40| d3 01 00 00 | .... | xl_tot_len: 467 0x3e48-0x3e4b.7 (4) -0x3e40| 00 00 00 00| ....| xlog_body0: raw bits 0x3e4c-0x3fff.7 (436) -0x3e50|00 00 00 00 00 00 00 00 00 3e 00 5b 7a 01 00 00|.........>.[z...| -* |until 0x3fff.7 (end) (436) | | -0x3e40| 00 00 00 00| ....| xl_xid: 0 0x3e4c-0x3e4f.7 (4) -0x3e50|00 00 00 00 00 00 00 00 |........ | xl_prev: "0/0" (0) 0x3e50-0x3e57.7 (8) -0x3e50| 00 | . | xl_info: 0 0x3e58-0x3e58.7 (1) -0x3e50| 3e | > | xl_rmid: 62 0x3e59-0x3e59.7 (1) -0x3e50| 00 5b | .[ | hole1: 23296 0x3e5a-0x3e5b.7 (2) -0x3e50| 7a 01 00 00| z...| xl_crc: 378 0x3e5c-0x3e5f.7 (4) diff --git a/format/postgres/testdata/flavours/pgproee14/000000010000000600000028 b/format/postgres/testdata/flavours/pgproee14/000000010000000600000028 deleted file mode 100644 index ed111cd10986bb5090706b8c7af63ce76462da0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 Kc03EU_WTDRWH=81 diff --git a/format/postgres/testdata/flavours/pgproee14/000000010000000600000028_1.fqtest b/format/postgres/testdata/flavours/pgproee14/000000010000000600000028_1.fqtest deleted file mode 100644 index 63791871e..000000000 --- a/format/postgres/testdata/flavours/pgproee14/000000010000000600000028_1.fqtest +++ /dev/null @@ -1,53 +0,0 @@ -$ fq -d pg_wal -o flavour=pgproee14 ".[0].records[:4] | dv" 000000010000000600000028 -[ - { - "hole0": 0, - "hole1": 0, - "lsn": "6/28000030", - "xl_crc": 4106022103, - "xl_info": 0, - "xl_prev": "6/27FFFFA8", - "xl_rmid": 11, - "xl_tot_len": 72, - "xl_xid": 10000040108, - "xlog_body0": "<68>AAAAAKyADFQCAAAAqP//JwYAAAAACwAA1+y89AAgEAB/BgAA0jUAAEdAAAAEAQAA/wIAALwCCQAQAC1xAQAAAAAAUQA=" - }, - { - "align0": "<1>AA==", - "hole0": 0, - "hole1": 0, - "lsn": "6/28000078", - "xl_crc": 3143580000, - "xl_info": 0, - "xl_prev": "6/28000030", - "xl_rmid": 10, - "xl_tot_len": 95, - "xl_xid": 10000040108, - "xlog_body0": "<91>AAAAAKyADFQCAAAAMAAAKAYAAAAACgAAYDlfuwAgJgB/BgAA0jUAAENAAAC8AgAA/wMDAAIIGAAucQEAI3BwcHBwcHBwcHBwcHBwcHAAAAALcQEAAAAAAAoAAA==" - }, - { - "hole0": 0, - "hole1": 0, - "lsn": "6/280000D8", - "xl_crc": 154712975, - "xl_info": 0, - "xl_prev": "6/28000078", - "xl_rmid": 11, - "xl_tot_len": 72, - "xl_xid": 10000040108, - "xlog_body0": "<68>AAAAAKyADFQCAAAAeAAAKAYAAAAACwAAj7s4CQAgEAB/BgAA0jUAAEdAAAAEAQAA/wIAALwCCgAQAC5xAQAAAAAAUgA=" - }, - { - "align0": "<5>AAAAAAA=", - "hole0": 0, - "hole1": 0, - "lsn": "6/28000120", - "xl_crc": 4138595501, - "xl_info": 0, - "xl_prev": "6/280000D8", - "xl_rmid": 15, - "xl_tot_len": 107, - "xl_xid": 10000040108, - "xlog_body0": "<103>AAAAAKyADFQCAAAA2AAAKAYAAAAADwAArfSt9gBAAAB/BgAA0jUAAEJAAAAAAAAA/zV/BgAA0jUAAEJAAAACAAAAAAAAAAAAAAAAAAAAAQADAAALGABPcQEAAAAAAAAAAAAAAAAAAQ==" - } -] diff --git a/format/postgres/testdata/flavours/postgres14/00000001000000000000004E b/format/postgres/testdata/flavours/postgres14/00000001000000000000004E deleted file mode 100644 index d3912119b5a1b8159d69c545ac884545189c957a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 diff --git a/format/postgres/testdata/flavours/postgres14/00000001000000000000004E_1.fqtest b/format/postgres/testdata/flavours/postgres14/00000001000000000000004E_1.fqtest deleted file mode 100644 index 1fa7fe557..000000000 --- a/format/postgres/testdata/flavours/postgres14/00000001000000000000004E_1.fqtest +++ /dev/null @@ -1,54 +0,0 @@ -$ fq -d pg_wal "dv" 00000001000000000000004E - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0:2]: 00000001000000000000004E (pg_wal) 0x0-0x3fff.7 (16384) - | | | [0]{}: page 0x0-0x2d17.7 (11544) - | | | xloog_page_header_data{}: 0x0-0x27.7 (40) -0x0000|0d d1 |.. | xlp_magic: 53517 0x0-0x1.7 (2) -0x0000| 07 00 | .. | xlp_info: 7 0x2-0x3.7 (2) -0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) -0x0000| 00 00 00 4e 00 00 00 00| ...N....| xlp_pageaddr: 1308622848 0x8-0xf.7 (8) -0x0010|cd 0f 00 00 |.... | xlp_rem_len: 4045 0x10-0x13.7 (4) -0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) - | | | xlog_long_page_header_data{}: 0x18-0x27.7 (16) -0x0010| bb f9 25 51 64 7c d5 62| ..%Qd|.b| xlp_sysid: 7121735156056324539 0x18-0x1f.7 (8) -0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) -0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) -0x0020| 74 08 00 10 00 a2 ca 95| t.......| raw_bytes_of_prev_wal_file: raw bits 0x28-0xff7.7 (4048) -0x0030|00 00 00 00 00 02 00 a2 74 07 00 10 00 a1 ca 95|........t.......| -* |until 0xff7.7 (4048) | | - | | | records[0:1]: 0xff8-0x2d17.7 (7456) - | | | [0]{}: xlog_record 0xff8-0x2d17.7 (7456) - | | | lsn: "0/4E000FF8" (1308626936) 0xff8-NA (0) -0x0ff0| 05 1d 00 00 | .... | xl_tot_len: 7429 0xff8-0xffb.7 (4) -0x0ff0| e8 02 00 00| ....| xlog_body0: raw bits 0xffc-0x1fff.7 (4100) -0x1000|c8 f2 ff 4d 00 00 00 00 b0 00 00 00 28 0e 9d 77|...M........(..w| -* |until 0x1fff.7 (4100) | | -0x0ff0| e8 02 00 00| ....| xl_xid: 744 0xffc-0xfff.7 (4) -0x1000|c8 f2 ff 4d 00 00 00 00 |...M.... | xl_prev: "0/4DFFF2C8" (1308619464) 0x1000-0x1007.7 (8) -0x1000| b0 | . | xl_info: 176 0x1008-0x1008.7 (1) -0x1000| 00 | . | xl_rmid: 0 0x1009-0x1009.7 (1) -0x1000| 00 00 | .. | hole1: 0 0x100a-0x100b.7 (2) -0x1000| 28 0e 9d 77| (..w| xl_crc: 2006781480 0x100c-0x100f.7 (4) -0x2010| 74 18 00 10 00 e3 cb 95| t.......| xlog_body1: raw bits 0x2018-0x2d17.7 (3328) -0x2020|00 00 00 00 00 02 00 a7 74 17 00 10 00 e2 cb 95|........t.......| -* |until 0x2d17.7 (3328) | | - | | | [1]{}: page 0x2000-0x3fff.7 (8192) - | | | xloog_page_header_data{}: 0x2000-0x2017.7 (24) -0x2000|0d d1 |.. | xlp_magic: 53517 0x2000-0x2001.7 (2) -0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) -0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) -0x2000| 00 20 00 4e 00 00 00 00| . .N....| xlp_pageaddr: 1308631040 0x2008-0x200f.7 (8) -0x2010|fd 0c 00 00 |.... | xlp_rem_len: 3325 0x2010-0x2013.7 (4) -0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) - | | | records[0:1]: 0x2d18-0x3fff.7 (4840) - | | | [0]{}: xlog_record 0x2d18-0x3fff.7 (4840) - | | | lsn: "0/4E002D18" (1308634392) 0x2d18-NA (0) -0x2d10| 05 1d 00 00 | .... | xl_tot_len: 7429 0x2d18-0x2d1b.7 (4) -0x2d10| e8 02 00 00| ....| xlog_body0: raw bits 0x2d1c-0x3fff.7 (4836) -0x2d20|f8 0f 00 4e 00 00 00 00 b0 00 00 00 14 38 ce 9e|...N.........8..| -* |until 0x3fff.7 (end) (4836) | | -0x2d10| e8 02 00 00| ....| xl_xid: 744 0x2d1c-0x2d1f.7 (4) -0x2d20|f8 0f 00 4e 00 00 00 00 |...N.... | xl_prev: "0/4E000FF8" (1308626936) 0x2d20-0x2d27.7 (8) -0x2d20| b0 | . | xl_info: 176 0x2d28-0x2d28.7 (1) -0x2d20| 00 | . | xl_rmid: 0 0x2d29-0x2d29.7 (1) -0x2d20| 00 00 | .. | hole1: 0 0x2d2a-0x2d2b.7 (2) -0x2d20| 14 38 ce 9e| .8..| xl_crc: 2664314900 0x2d2c-0x2d2f.7 (4) diff --git a/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD b/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD deleted file mode 100644 index 157065e0cd4e6647b2efa58bc13b9c4b941f5011..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI%Pe{{Y7zglY;&LK`Rrb%64Uw`)DrGpzgGia3vQq^S78*Nr5DU~G8Wy2>i6D_c z^S`V7Gu^6Lirwl^kO##>mK9le$WaNSK-(rf?+)Ltd*SCZ7<+&3`0>1dKJW94{j5_d zWTM#X?NFp~d96+EZ*yjUqyK#5(nJm-PvpA<z0VD1MxxfO4WuAx?X!4g^-Xkqwp60g zjLHvWBMO_sCiC?TM3YXUlp917jcK%MnT*^~5$L-Ry)hgeyd&8WZ6|8{5+`w1;@29w z=^%=^j=IU3EV~2UjI*0iy|{^A)Ai7XZf28|n?S~yR_NvhyP4l7Zq|d9_&Gv1HnVcm zG<Nb6bn~3uRR8RiI+dW`74dtgvkl#pr6@P<nZhH`%^16JRf-#(d#EEebmK`?ZpN-Q z<Uuz<cJq3VxY4n9I%7gN!8GNj-fmrmZl19l$9Rv_DXCLLA**szI$h$0Zl1CmZ;`ms zdG>Y0hWRGfrrfkuEzCeSPuNX)lDN^acRFK2Hx-+dn;!#BAEBE7yD97MmO3SMil{YR zxiMu;ABArG>}K|oxY2p`b;O4G=G|81X1exw8+0?uZru6eM#tXij0xRXb|^O|F5b<7 zZbsOR<!hJJDXCLL#XFUo>e7`A=*Gux9H+#M&a<y0Hq1A5S;|fG=0AU-n_+h2%lwZU z>y()yk83INm^}8J^h@kQo|PLoH$hK6yYe*r>UJ~qG{l}xf9{m}Wnd#H&p|hot=zPq zZODXf2HB10inu{*YvexY#+9So6giJCKsN*I#<g4A7}*G#8+22>OS!2}UR;819<!Ue z`yEoJq)riebCsLX!o_9i<`KII<%t_~CXL(&^UeI;I5*kXg3!%FcH{Z=K=O^`8=~!b z%8jR`2LG?)WjDbZabx7%g60PEP5FN1#%?Km5A#hwyYX!kH)w5*+y~t>9#n3sMwVRA zO&_}{o@<vnC3TAEWr1>&|Ggw1y6I&%p2OnC$hig04d$D$Q@J@dvE?3g)5C6ZP2vWv zt&#hnn*%Q8Cf)0thi<yrO*qgdbxP_Kk^7Kxb91A=9lGgaH=#4)#>lw^%?;+8jw0n| R`BqCUbkoUhJoa_w<{#XWuP6Wj diff --git a/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD_1.fqtest b/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD_1.fqtest deleted file mode 100644 index 2d7a88663..000000000 --- a/format/postgres/testdata/flavours/postgres14/00000001000001AE000000CD_1.fqtest +++ /dev/null @@ -1,405 +0,0 @@ -$ fq -d pg_wal -o flavour=postgres14 "dv" 00000001000001AE000000CD - |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0:2]: 00000001000001AE000000CD (pg_wal) 0x0-0x3fff.7 (16384) - | | | [0]{}: page 0x0-0x21ff.7 (8704) - | | | xloog_page_header_data{}: 0x0-0x27.7 (40) -0x0000|0d d1 |.. | xlp_magic: 53517 0x0-0x1.7 (2) -0x0000| 07 00 | .. | xlp_info: 7 0x2-0x3.7 (2) -0x0000| 01 00 00 00 | .... | xlp_tli: 1 0x4-0x7.7 (4) -0x0000| 00 00 00 cd ae 01 00 00| ........| xlp_pageaddr: 1850275266560 0x8-0xf.7 (8) -0x0010|73 00 00 00 |s... | xlp_rem_len: 115 0x10-0x13.7 (4) -0x0010| 00 00 00 00 | .... | padding0: 0 0x14-0x17.7 (4) - | | | xlog_long_page_header_data{}: 0x18-0x27.7 (16) -0x0010| 68 e7 dd 05 b3 88 b3 61| h......a| xlp_sysid: 7040120944989169512 0x18-0x1f.7 (8) -0x0020|00 00 00 01 |.... | xlp_seg_size: 16777216 0x20-0x23.7 (4) -0x0020| 00 20 00 00 | . .. | xlp_xlog_blcksz: 8192 0x24-0x27.7 (4) -0x0020| 80 01 00 00 80 01 00 00| ........| raw_bytes_of_prev_wal_file: raw bits 0x28-0x9f.7 (120) -0x0030|80 01 00 00 80 01 00 00 80 01 00 00 80 01 00 00|................| -* |until 0x9f.7 (120) | | - | | | records[0:15]: 0xa0-0x21ff.7 (8544) - | | | [0]{}: xlog_record 0xa0-0x2d7.7 (568) - | | | lsn: "1AE/CD0000A0" (1850275266720) 0xa0-NA (0) -0x00a0|33 02 00 00 |3... | xl_tot_len: 563 0xa0-0xa3.7 (4) -0x00a0| 00 00 00 00 40 fe ff cc ae 01 00 00| ....@.......| xlog_body0: raw bits 0xa4-0x2d2.7 (559) -0x00b0|10 09 00 00 b2 1a 64 de 00 10 00 00 f8 01 f8 01|......d.........| -* |until 0x2d2.7 (559) | | -0x00a0| 00 00 00 00 | .... | xl_xid: 0 0xa4-0xa7.7 (4) -0x00a0| 40 fe ff cc ae 01 00 00| @.......| xl_prev: "1AE/CCFFFE40" (1850275266112) 0xa8-0xaf.7 (8) -0x00b0|10 |. | xl_info: 16 0xb0-0xb0.7 (1) -0x00b0| 09 | . | xl_rmid: 9 0xb1-0xb1.7 (1) -0x00b0| 00 00 | .. | hole1: 0 0xb2-0xb3.7 (2) -0x00b0| b2 1a 64 de | ..d. | xl_crc: 3731102386 0xb4-0xb7.7 (4) -0x02d0| 00 00 00 00 00 | ..... | align0: raw bits 0x2d3-0x2d7.7 (5) - | | | [1]{}: xlog_record 0x2d8-0x50f.7 (568) - | | | lsn: "1AE/CD0002D8" (1850275267288) 0x2d8-NA (0) -0x02d0| 33 02 00 00 | 3... | xl_tot_len: 563 0x2d8-0x2db.7 (4) -0x02d0| 00 00 00 00| ....| xlog_body0: raw bits 0x2dc-0x50a.7 (559) -0x02e0|a0 00 00 cd ae 01 00 00 10 09 00 00 1d bf 48 90|..............H.| -* |until 0x50a.7 (559) | | -0x02d0| 00 00 00 00| ....| xl_xid: 0 0x2dc-0x2df.7 (4) -0x02e0|a0 00 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD0000A0" (1850275266720) 0x2e0-0x2e7.7 (8) -0x02e0| 10 | . | xl_info: 16 0x2e8-0x2e8.7 (1) -0x02e0| 09 | . | xl_rmid: 9 0x2e9-0x2e9.7 (1) -0x02e0| 00 00 | .. | hole1: 0 0x2ea-0x2eb.7 (2) -0x02e0| 1d bf 48 90| ..H.| xl_crc: 2420686621 0x2ec-0x2ef.7 (4) -0x0500| 00 00 00 00 00| .....| align0: raw bits 0x50b-0x50f.7 (5) - | | | [2]{}: xlog_record 0x510-0x747.7 (568) - | | | lsn: "1AE/CD000510" (1850275267856) 0x510-NA (0) -0x0510|33 02 00 00 |3... | xl_tot_len: 563 0x510-0x513.7 (4) -0x0510| 00 00 00 00 d8 02 00 cd ae 01 00 00| ............| xlog_body0: raw bits 0x514-0x742.7 (559) -0x0520|10 09 00 00 b4 1a 59 98 00 10 00 00 f8 01 f8 01|......Y.........| -* |until 0x742.7 (559) | | -0x0510| 00 00 00 00 | .... | xl_xid: 0 0x514-0x517.7 (4) -0x0510| d8 02 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD0002D8" (1850275267288) 0x518-0x51f.7 (8) -0x0520|10 |. | xl_info: 16 0x520-0x520.7 (1) -0x0520| 09 | . | xl_rmid: 9 0x521-0x521.7 (1) -0x0520| 00 00 | .. | hole1: 0 0x522-0x523.7 (2) -0x0520| b4 1a 59 98 | ..Y. | xl_crc: 2555976372 0x524-0x527.7 (4) -0x0740| 00 00 00 00 00 | ..... | align0: raw bits 0x743-0x747.7 (5) - | | | [3]{}: xlog_record 0x748-0x97f.7 (568) - | | | lsn: "1AE/CD000748" (1850275268424) 0x748-NA (0) -0x0740| 33 02 00 00 | 3... | xl_tot_len: 563 0x748-0x74b.7 (4) -0x0740| 00 00 00 00| ....| xlog_body0: raw bits 0x74c-0x97a.7 (559) -0x0750|10 05 00 cd ae 01 00 00 10 09 00 00 89 b9 51 e1|..............Q.| -* |until 0x97a.7 (559) | | -0x0740| 00 00 00 00| ....| xl_xid: 0 0x74c-0x74f.7 (4) -0x0750|10 05 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD000510" (1850275267856) 0x750-0x757.7 (8) -0x0750| 10 | . | xl_info: 16 0x758-0x758.7 (1) -0x0750| 09 | . | xl_rmid: 9 0x759-0x759.7 (1) -0x0750| 00 00 | .. | hole1: 0 0x75a-0x75b.7 (2) -0x0750| 89 b9 51 e1| ..Q.| xl_crc: 3780229513 0x75c-0x75f.7 (4) -0x0970| 00 00 00 00 00| .....| align0: raw bits 0x97b-0x97f.7 (5) - | | | [4]{}: xlog_record 0x980-0xbb7.7 (568) - | | | lsn: "1AE/CD000980" (1850275268992) 0x980-NA (0) -0x0980|33 02 00 00 |3... | xl_tot_len: 563 0x980-0x983.7 (4) -0x0980| 00 00 00 00 48 07 00 cd ae 01 00 00| ....H.......| xlog_body0: raw bits 0x984-0xbb2.7 (559) -0x0990|10 09 00 00 68 d6 37 44 00 10 00 00 f8 01 f8 01|....h.7D........| -* |until 0xbb2.7 (559) | | -0x0980| 00 00 00 00 | .... | xl_xid: 0 0x984-0x987.7 (4) -0x0980| 48 07 00 cd ae 01 00 00| H.......| xl_prev: "1AE/CD000748" (1850275268424) 0x988-0x98f.7 (8) -0x0990|10 |. | xl_info: 16 0x990-0x990.7 (1) -0x0990| 09 | . | xl_rmid: 9 0x991-0x991.7 (1) -0x0990| 00 00 | .. | hole1: 0 0x992-0x993.7 (2) -0x0990| 68 d6 37 44 | h.7D | xl_crc: 1144510056 0x994-0x997.7 (4) -0x0bb0| 00 00 00 00 00 | ..... | align0: raw bits 0xbb3-0xbb7.7 (5) - | | | [5]{}: xlog_record 0xbb8-0xdef.7 (568) - | | | lsn: "1AE/CD000BB8" (1850275269560) 0xbb8-NA (0) -0x0bb0| 33 02 00 00 | 3... | xl_tot_len: 563 0xbb8-0xbbb.7 (4) -0x0bb0| 00 00 00 00| ....| xlog_body0: raw bits 0xbbc-0xdea.7 (559) -0x0bc0|80 09 00 cd ae 01 00 00 10 09 00 00 b9 7a 82 2d|.............z.-| -* |until 0xdea.7 (559) | | -0x0bb0| 00 00 00 00| ....| xl_xid: 0 0xbbc-0xbbf.7 (4) -0x0bc0|80 09 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD000980" (1850275268992) 0xbc0-0xbc7.7 (8) -0x0bc0| 10 | . | xl_info: 16 0xbc8-0xbc8.7 (1) -0x0bc0| 09 | . | xl_rmid: 9 0xbc9-0xbc9.7 (1) -0x0bc0| 00 00 | .. | hole1: 0 0xbca-0xbcb.7 (2) -0x0bc0| b9 7a 82 2d| .z.-| xl_crc: 763525817 0xbcc-0xbcf.7 (4) -0x0de0| 00 00 00 00 00| .....| align0: raw bits 0xdeb-0xdef.7 (5) - | | | [6]{}: xlog_record 0xdf0-0x1027.7 (568) - | | | lsn: "1AE/CD000DF0" (1850275270128) 0xdf0-NA (0) -0x0df0|33 02 00 00 |3... | xl_tot_len: 563 0xdf0-0xdf3.7 (4) -0x0df0| 00 00 00 00 b8 0b 00 cd ae 01 00 00| ............| xlog_body0: raw bits 0xdf4-0x1022.7 (559) -0x0e00|10 09 00 00 79 1f 0d ff 00 10 00 00 f8 01 f8 01|....y...........| -* |until 0x1022.7 (559) | | -0x0df0| 00 00 00 00 | .... | xl_xid: 0 0xdf4-0xdf7.7 (4) -0x0df0| b8 0b 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD000BB8" (1850275269560) 0xdf8-0xdff.7 (8) -0x0e00|10 |. | xl_info: 16 0xe00-0xe00.7 (1) -0x0e00| 09 | . | xl_rmid: 9 0xe01-0xe01.7 (1) -0x0e00| 00 00 | .. | hole1: 0 0xe02-0xe03.7 (2) -0x0e00| 79 1f 0d ff | y... | xl_crc: 4279050105 0xe04-0xe07.7 (4) -0x1020| 00 00 00 00 00 | ..... | align0: raw bits 0x1023-0x1027.7 (5) - | | | [7]{}: xlog_record 0x1028-0x125f.7 (568) - | | | lsn: "1AE/CD001028" (1850275270696) 0x1028-NA (0) -0x1020| 33 02 00 00 | 3... | xl_tot_len: 563 0x1028-0x102b.7 (4) -0x1020| 00 00 00 00| ....| xlog_body0: raw bits 0x102c-0x125a.7 (559) -0x1030|f0 0d 00 cd ae 01 00 00 10 09 00 00 46 d5 42 a8|............F.B.| -* |until 0x125a.7 (559) | | -0x1020| 00 00 00 00| ....| xl_xid: 0 0x102c-0x102f.7 (4) -0x1030|f0 0d 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD000DF0" (1850275270128) 0x1030-0x1037.7 (8) -0x1030| 10 | . | xl_info: 16 0x1038-0x1038.7 (1) -0x1030| 09 | . | xl_rmid: 9 0x1039-0x1039.7 (1) -0x1030| 00 00 | .. | hole1: 0 0x103a-0x103b.7 (2) -0x1030| 46 d5 42 a8| F.B.| xl_crc: 2822952262 0x103c-0x103f.7 (4) -0x1250| 00 00 00 00 00| .....| align0: raw bits 0x125b-0x125f.7 (5) - | | | [8]{}: xlog_record 0x1260-0x1497.7 (568) - | | | lsn: "1AE/CD001260" (1850275271264) 0x1260-NA (0) -0x1260|33 02 00 00 |3... | xl_tot_len: 563 0x1260-0x1263.7 (4) -0x1260| 00 00 00 00 28 10 00 cd ae 01 00 00| ....(.......| xlog_body0: raw bits 0x1264-0x1492.7 (559) -0x1270|10 09 00 00 9d 65 e6 d6 00 10 00 00 f8 01 f8 01|.....e..........| -* |until 0x1492.7 (559) | | -0x1260| 00 00 00 00 | .... | xl_xid: 0 0x1264-0x1267.7 (4) -0x1260| 28 10 00 cd ae 01 00 00| (.......| xl_prev: "1AE/CD001028" (1850275270696) 0x1268-0x126f.7 (8) -0x1270|10 |. | xl_info: 16 0x1270-0x1270.7 (1) -0x1270| 09 | . | xl_rmid: 9 0x1271-0x1271.7 (1) -0x1270| 00 00 | .. | hole1: 0 0x1272-0x1273.7 (2) -0x1270| 9d 65 e6 d6 | .e.. | xl_crc: 3605423517 0x1274-0x1277.7 (4) -0x1490| 00 00 00 00 00 | ..... | align0: raw bits 0x1493-0x1497.7 (5) - | | | [9]{}: xlog_record 0x1498-0x16cf.7 (568) - | | | lsn: "1AE/CD001498" (1850275271832) 0x1498-NA (0) -0x1490| 33 02 00 00 | 3... | xl_tot_len: 563 0x1498-0x149b.7 (4) -0x1490| 00 00 00 00| ....| xlog_body0: raw bits 0x149c-0x16ca.7 (559) -0x14a0|60 12 00 cd ae 01 00 00 10 09 00 00 ee ac 89 df|`...............| -* |until 0x16ca.7 (559) | | -0x1490| 00 00 00 00| ....| xl_xid: 0 0x149c-0x149f.7 (4) -0x14a0|60 12 00 cd ae 01 00 00 |`....... | xl_prev: "1AE/CD001260" (1850275271264) 0x14a0-0x14a7.7 (8) -0x14a0| 10 | . | xl_info: 16 0x14a8-0x14a8.7 (1) -0x14a0| 09 | . | xl_rmid: 9 0x14a9-0x14a9.7 (1) -0x14a0| 00 00 | .. | hole1: 0 0x14aa-0x14ab.7 (2) -0x14a0| ee ac 89 df| ....| xl_crc: 3750341870 0x14ac-0x14af.7 (4) -0x16c0| 00 00 00 00 00| .....| align0: raw bits 0x16cb-0x16cf.7 (5) - | | | [10]{}: xlog_record 0x16d0-0x1907.7 (568) - | | | lsn: "1AE/CD0016D0" (1850275272400) 0x16d0-NA (0) -0x16d0|33 02 00 00 |3... | xl_tot_len: 563 0x16d0-0x16d3.7 (4) -0x16d0| 00 00 00 00 98 14 00 cd ae 01 00 00| ............| xlog_body0: raw bits 0x16d4-0x1902.7 (559) -0x16e0|10 09 00 00 01 1d d5 45 00 10 00 00 f8 01 f8 01|.......E........| -* |until 0x1902.7 (559) | | -0x16d0| 00 00 00 00 | .... | xl_xid: 0 0x16d4-0x16d7.7 (4) -0x16d0| 98 14 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD001498" (1850275271832) 0x16d8-0x16df.7 (8) -0x16e0|10 |. | xl_info: 16 0x16e0-0x16e0.7 (1) -0x16e0| 09 | . | xl_rmid: 9 0x16e1-0x16e1.7 (1) -0x16e0| 00 00 | .. | hole1: 0 0x16e2-0x16e3.7 (2) -0x16e0| 01 1d d5 45 | ...E | xl_crc: 1171594497 0x16e4-0x16e7.7 (4) -0x1900| 00 00 00 00 00 | ..... | align0: raw bits 0x1903-0x1907.7 (5) - | | | [11]{}: xlog_record 0x1908-0x1b3f.7 (568) - | | | lsn: "1AE/CD001908" (1850275272968) 0x1908-NA (0) -0x1900| 33 02 00 00 | 3... | xl_tot_len: 563 0x1908-0x190b.7 (4) -0x1900| 00 00 00 00| ....| xlog_body0: raw bits 0x190c-0x1b3a.7 (559) -0x1910|d0 16 00 cd ae 01 00 00 10 09 00 00 d5 77 f4 9d|.............w..| -* |until 0x1b3a.7 (559) | | -0x1900| 00 00 00 00| ....| xl_xid: 0 0x190c-0x190f.7 (4) -0x1910|d0 16 00 cd ae 01 00 00 |........ | xl_prev: "1AE/CD0016D0" (1850275272400) 0x1910-0x1917.7 (8) -0x1910| 10 | . | xl_info: 16 0x1918-0x1918.7 (1) -0x1910| 09 | . | xl_rmid: 9 0x1919-0x1919.7 (1) -0x1910| 00 00 | .. | hole1: 0 0x191a-0x191b.7 (2) -0x1910| d5 77 f4 9d| .w..| xl_crc: 2650044373 0x191c-0x191f.7 (4) -0x1b30| 00 00 00 00 00| .....| align0: raw bits 0x1b3b-0x1b3f.7 (5) - | | | [12]{}: xlog_record 0x1b40-0x1d77.7 (568) - | | | lsn: "1AE/CD001B40" (1850275273536) 0x1b40-NA (0) -0x1b40|33 02 00 00 |3... | xl_tot_len: 563 0x1b40-0x1b43.7 (4) -0x1b40| 00 00 00 00 08 19 00 cd ae 01 00 00| ............| xlog_body0: raw bits 0x1b44-0x1d72.7 (559) -0x1b50|10 09 00 00 4f 66 92 24 00 10 00 00 f8 01 f8 01|....Of.$........| -* |until 0x1d72.7 (559) | | -0x1b40| 00 00 00 00 | .... | xl_xid: 0 0x1b44-0x1b47.7 (4) -0x1b40| 08 19 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD001908" (1850275272968) 0x1b48-0x1b4f.7 (8) -0x1b50|10 |. | xl_info: 16 0x1b50-0x1b50.7 (1) -0x1b50| 09 | . | xl_rmid: 9 0x1b51-0x1b51.7 (1) -0x1b50| 00 00 | .. | hole1: 0 0x1b52-0x1b53.7 (2) -0x1b50| 4f 66 92 24 | Of.$ | xl_crc: 613574223 0x1b54-0x1b57.7 (4) -0x1d70| 00 00 00 00 00 | ..... | align0: raw bits 0x1d73-0x1d77.7 (5) - | | | [13]{}: xlog_record 0x1d78-0x1faf.7 (568) - | | | lsn: "1AE/CD001D78" (1850275274104) 0x1d78-NA (0) -0x1d70| 33 02 00 00 | 3... | xl_tot_len: 563 0x1d78-0x1d7b.7 (4) -0x1d70| 00 00 00 00| ....| xlog_body0: raw bits 0x1d7c-0x1faa.7 (559) -0x1d80|40 1b 00 cd ae 01 00 00 10 09 00 00 70 46 fe 1a|@...........pF..| -* |until 0x1faa.7 (559) | | -0x1d70| 00 00 00 00| ....| xl_xid: 0 0x1d7c-0x1d7f.7 (4) -0x1d80|40 1b 00 cd ae 01 00 00 |@....... | xl_prev: "1AE/CD001B40" (1850275273536) 0x1d80-0x1d87.7 (8) -0x1d80| 10 | . | xl_info: 16 0x1d88-0x1d88.7 (1) -0x1d80| 09 | . | xl_rmid: 9 0x1d89-0x1d89.7 (1) -0x1d80| 00 00 | .. | hole1: 0 0x1d8a-0x1d8b.7 (2) -0x1d80| 70 46 fe 1a| pF..| xl_crc: 452871792 0x1d8c-0x1d8f.7 (4) -0x1fa0| 00 00 00 00 00| .....| align0: raw bits 0x1fab-0x1faf.7 (5) - | | | [14]{}: xlog_record 0x1fb0-0x21ff.7 (592) - | | | lsn: "1AE/CD001FB0" (1850275274672) 0x1fb0-NA (0) -0x1fb0|33 02 00 00 |3... | xl_tot_len: 563 0x1fb0-0x1fb3.7 (4) -0x1fb0| 00 00 00 00 78 1d 00 cd ae 01 00 00| ....x.......| xlog_body0: raw bits 0x1fb4-0x1fff.7 (76) -0x1fc0|10 09 00 00 8b 13 fa fb 00 10 00 00 f8 01 f8 01|................| -* |until 0x1fff.7 (76) | | -0x1fb0| 00 00 00 00 | .... | xl_xid: 0 0x1fb4-0x1fb7.7 (4) -0x1fb0| 78 1d 00 cd ae 01 00 00| x.......| xl_prev: "1AE/CD001D78" (1850275274104) 0x1fb8-0x1fbf.7 (8) -0x1fc0|10 |. | xl_info: 16 0x1fc0-0x1fc0.7 (1) -0x1fc0| 09 | . | xl_rmid: 9 0x1fc1-0x1fc1.7 (1) -0x1fc0| 00 00 | .. | hole1: 0 0x1fc2-0x1fc3.7 (2) -0x1fc0| 8b 13 fa fb | .... | xl_crc: 4227470219 0x1fc4-0x1fc7.7 (4) -0x2010| 80 01 00 00 80 01 00 00| ........| xlog_body1: raw bits 0x2018-0x21ff.7 (488) -0x2020|80 01 00 00 80 01 00 00 80 01 00 00 80 01 00 00|................| -* |until 0x21ff.7 (488) | | - | | | [1]{}: page 0x2000-0x3fff.7 (8192) - | | | xloog_page_header_data{}: 0x2000-0x2017.7 (24) -0x2000|0d d1 |.. | xlp_magic: 53517 0x2000-0x2001.7 (2) -0x2000| 05 00 | .. | xlp_info: 5 0x2002-0x2003.7 (2) -0x2000| 01 00 00 00 | .... | xlp_tli: 1 0x2004-0x2007.7 (4) -0x2000| 00 20 00 cd ae 01 00 00| . ......| xlp_pageaddr: 1850275274752 0x2008-0x200f.7 (8) -0x2010|e3 01 00 00 |.... | xlp_rem_len: 483 0x2010-0x2013.7 (4) -0x2010| 00 00 00 00 | .... | padding0: 0 0x2014-0x2017.7 (4) - | | | records[0:14]: 0x2200-0x3fff.7 (7680) - | | | [0]{}: xlog_record 0x2200-0x2437.7 (568) - | | | lsn: "1AE/CD002200" (1850275275264) 0x2200-NA (0) -0x2200|33 02 00 00 |3... | xl_tot_len: 563 0x2200-0x2203.7 (4) -0x2200| 00 00 00 00 b0 1f 00 cd ae 01 00 00| ............| xlog_body0: raw bits 0x2204-0x2432.7 (559) -0x2210|10 09 00 00 af c7 8a 8b 00 10 00 00 f8 01 f8 01|................| -* |until 0x2432.7 (559) | | -0x2200| 00 00 00 00 | .... | xl_xid: 0 0x2204-0x2207.7 (4) -0x2200| b0 1f 00 cd ae 01 00 00| ........| xl_prev: "1AE/CD001FB0" (1850275274672) 0x2208-0x220f.7 (8) -0x2210|10 |. | xl_info: 16 0x2210-0x2210.7 (1) -0x2210| 09 | . | xl_rmid: 9 0x2211-0x2211.7 (1) -0x2210| 00 00 | .. | hole1: 0 0x2212-0x2213.7 (2) -0x2210| af c7 8a 8b | .... | xl_crc: 2341128111 0x2214-0x2217.7 (4) -0x2430| 00 00 00 00 00 | ..... | align0: raw bits 0x2433-0x2437.7 (5) - | | | [1]{}: xlog_record 0x2438-0x266f.7 (568) - | | | lsn: "1AE/CD002438" (1850275275832) 0x2438-NA (0) -0x2430| 33 02 00 00 | 3... | xl_tot_len: 563 0x2438-0x243b.7 (4) -0x2430| 00 00 00 00| ....| xlog_body0: raw bits 0x243c-0x266a.7 (559) -0x2440|00 22 00 cd ae 01 00 00 10 09 00 00 9e 5c 82 1c|."...........\..| -* |until 0x266a.7 (559) | | -0x2430| 00 00 00 00| ....| xl_xid: 0 0x243c-0x243f.7 (4) -0x2440|00 22 00 cd ae 01 00 00 |."...... | xl_prev: "1AE/CD002200" (1850275275264) 0x2440-0x2447.7 (8) -0x2440| 10 | . | xl_info: 16 0x2448-0x2448.7 (1) -0x2440| 09 | . | xl_rmid: 9 0x2449-0x2449.7 (1) -0x2440| 00 00 | .. | hole1: 0 0x244a-0x244b.7 (2) -0x2440| 9e 5c 82 1c| .\..| xl_crc: 478305438 0x244c-0x244f.7 (4) -0x2660| 00 00 00 00 00| .....| align0: raw bits 0x266b-0x266f.7 (5) - | | | [2]{}: xlog_record 0x2670-0x28a7.7 (568) - | | | lsn: "1AE/CD002670" (1850275276400) 0x2670-NA (0) -0x2670|33 02 00 00 |3... | xl_tot_len: 563 0x2670-0x2673.7 (4) -0x2670| 00 00 00 00 38 24 00 cd ae 01 00 00| ....8$......| xlog_body0: raw bits 0x2674-0x28a2.7 (559) -0x2680|10 09 00 00 3c 35 49 e6 00 10 00 00 f8 01 f8 01|....<5I.........| -* |until 0x28a2.7 (559) | | -0x2670| 00 00 00 00 | .... | xl_xid: 0 0x2674-0x2677.7 (4) -0x2670| 38 24 00 cd ae 01 00 00| 8$......| xl_prev: "1AE/CD002438" (1850275275832) 0x2678-0x267f.7 (8) -0x2680|10 |. | xl_info: 16 0x2680-0x2680.7 (1) -0x2680| 09 | . | xl_rmid: 9 0x2681-0x2681.7 (1) -0x2680| 00 00 | .. | hole1: 0 0x2682-0x2683.7 (2) -0x2680| 3c 35 49 e6 | <5I. | xl_crc: 3863557436 0x2684-0x2687.7 (4) -0x28a0| 00 00 00 00 00 | ..... | align0: raw bits 0x28a3-0x28a7.7 (5) - | | | [3]{}: xlog_record 0x28a8-0x2adf.7 (568) - | | | lsn: "1AE/CD0028A8" (1850275276968) 0x28a8-NA (0) -0x28a0| 33 02 00 00 | 3... | xl_tot_len: 563 0x28a8-0x28ab.7 (4) -0x28a0| 00 00 00 00| ....| xlog_body0: raw bits 0x28ac-0x2ada.7 (559) -0x28b0|70 26 00 cd ae 01 00 00 10 09 00 00 79 04 ea ef|p&..........y...| -* |until 0x2ada.7 (559) | | -0x28a0| 00 00 00 00| ....| xl_xid: 0 0x28ac-0x28af.7 (4) -0x28b0|70 26 00 cd ae 01 00 00 |p&...... | xl_prev: "1AE/CD002670" (1850275276400) 0x28b0-0x28b7.7 (8) -0x28b0| 10 | . | xl_info: 16 0x28b8-0x28b8.7 (1) -0x28b0| 09 | . | xl_rmid: 9 0x28b9-0x28b9.7 (1) -0x28b0| 00 00 | .. | hole1: 0 0x28ba-0x28bb.7 (2) -0x28b0| 79 04 ea ef| y...| xl_crc: 4025091193 0x28bc-0x28bf.7 (4) -0x2ad0| 00 00 00 00 00| .....| align0: raw bits 0x2adb-0x2adf.7 (5) - | | | [4]{}: xlog_record 0x2ae0-0x2d17.7 (568) - | | | lsn: "1AE/CD002AE0" (1850275277536) 0x2ae0-NA (0) -0x2ae0|33 02 00 00 |3... | xl_tot_len: 563 0x2ae0-0x2ae3.7 (4) -0x2ae0| 00 00 00 00 a8 28 00 cd ae 01 00 00| .....(......| xlog_body0: raw bits 0x2ae4-0x2d12.7 (559) -0x2af0|10 09 00 00 b2 37 ea f5 00 10 00 00 f8 01 f8 01|.....7..........| -* |until 0x2d12.7 (559) | | -0x2ae0| 00 00 00 00 | .... | xl_xid: 0 0x2ae4-0x2ae7.7 (4) -0x2ae0| a8 28 00 cd ae 01 00 00| .(......| xl_prev: "1AE/CD0028A8" (1850275276968) 0x2ae8-0x2aef.7 (8) -0x2af0|10 |. | xl_info: 16 0x2af0-0x2af0.7 (1) -0x2af0| 09 | . | xl_rmid: 9 0x2af1-0x2af1.7 (1) -0x2af0| 00 00 | .. | hole1: 0 0x2af2-0x2af3.7 (2) -0x2af0| b2 37 ea f5 | .7.. | xl_crc: 4125767602 0x2af4-0x2af7.7 (4) -0x2d10| 00 00 00 00 00 | ..... | align0: raw bits 0x2d13-0x2d17.7 (5) - | | | [5]{}: xlog_record 0x2d18-0x2f4f.7 (568) - | | | lsn: "1AE/CD002D18" (1850275278104) 0x2d18-NA (0) -0x2d10| 33 02 00 00 | 3... | xl_tot_len: 563 0x2d18-0x2d1b.7 (4) -0x2d10| 00 00 00 00| ....| xlog_body0: raw bits 0x2d1c-0x2f4a.7 (559) -0x2d20|e0 2a 00 cd ae 01 00 00 10 09 00 00 b2 22 7d b8|.*..........."}.| -* |until 0x2f4a.7 (559) | | -0x2d10| 00 00 00 00| ....| xl_xid: 0 0x2d1c-0x2d1f.7 (4) -0x2d20|e0 2a 00 cd ae 01 00 00 |.*...... | xl_prev: "1AE/CD002AE0" (1850275277536) 0x2d20-0x2d27.7 (8) -0x2d20| 10 | . | xl_info: 16 0x2d28-0x2d28.7 (1) -0x2d20| 09 | . | xl_rmid: 9 0x2d29-0x2d29.7 (1) -0x2d20| 00 00 | .. | hole1: 0 0x2d2a-0x2d2b.7 (2) -0x2d20| b2 22 7d b8| ."}.| xl_crc: 3095208626 0x2d2c-0x2d2f.7 (4) -0x2f40| 00 00 00 00 00| .....| align0: raw bits 0x2f4b-0x2f4f.7 (5) - | | | [6]{}: xlog_record 0x2f50-0x3187.7 (568) - | | | lsn: "1AE/CD002F50" (1850275278672) 0x2f50-NA (0) -0x2f50|33 02 00 00 |3... | xl_tot_len: 563 0x2f50-0x2f53.7 (4) -0x2f50| 00 00 00 00 18 2d 00 cd ae 01 00 00| .....-......| xlog_body0: raw bits 0x2f54-0x3182.7 (559) -0x2f60|10 09 00 00 80 96 72 1a 00 10 00 00 f8 01 f8 01|......r.........| -* |until 0x3182.7 (559) | | -0x2f50| 00 00 00 00 | .... | xl_xid: 0 0x2f54-0x2f57.7 (4) -0x2f50| 18 2d 00 cd ae 01 00 00| .-......| xl_prev: "1AE/CD002D18" (1850275278104) 0x2f58-0x2f5f.7 (8) -0x2f60|10 |. | xl_info: 16 0x2f60-0x2f60.7 (1) -0x2f60| 09 | . | xl_rmid: 9 0x2f61-0x2f61.7 (1) -0x2f60| 00 00 | .. | hole1: 0 0x2f62-0x2f63.7 (2) -0x2f60| 80 96 72 1a | ..r. | xl_crc: 443717248 0x2f64-0x2f67.7 (4) -0x3180| 00 00 00 00 00 | ..... | align0: raw bits 0x3183-0x3187.7 (5) - | | | [7]{}: xlog_record 0x3188-0x33bf.7 (568) - | | | lsn: "1AE/CD003188" (1850275279240) 0x3188-NA (0) -0x3180| 33 02 00 00 | 3... | xl_tot_len: 563 0x3188-0x318b.7 (4) -0x3180| 00 00 00 00| ....| xlog_body0: raw bits 0x318c-0x33ba.7 (559) -0x3190|50 2f 00 cd ae 01 00 00 10 09 00 00 1f 08 37 dc|P/............7.| -* |until 0x33ba.7 (559) | | -0x3180| 00 00 00 00| ....| xl_xid: 0 0x318c-0x318f.7 (4) -0x3190|50 2f 00 cd ae 01 00 00 |P/...... | xl_prev: "1AE/CD002F50" (1850275278672) 0x3190-0x3197.7 (8) -0x3190| 10 | . | xl_info: 16 0x3198-0x3198.7 (1) -0x3190| 09 | . | xl_rmid: 9 0x3199-0x3199.7 (1) -0x3190| 00 00 | .. | hole1: 0 0x319a-0x319b.7 (2) -0x3190| 1f 08 37 dc| ..7.| xl_crc: 3694594079 0x319c-0x319f.7 (4) -0x33b0| 00 00 00 00 00| .....| align0: raw bits 0x33bb-0x33bf.7 (5) - | | | [8]{}: xlog_record 0x33c0-0x35f7.7 (568) - | | | lsn: "1AE/CD0033C0" (1850275279808) 0x33c0-NA (0) -0x33c0|33 02 00 00 |3... | xl_tot_len: 563 0x33c0-0x33c3.7 (4) -0x33c0| 00 00 00 00 88 31 00 cd ae 01 00 00| .....1......| xlog_body0: raw bits 0x33c4-0x35f2.7 (559) -0x33d0|10 09 00 00 65 b1 ef 38 00 10 00 00 f8 01 f8 01|....e..8........| -* |until 0x35f2.7 (559) | | -0x33c0| 00 00 00 00 | .... | xl_xid: 0 0x33c4-0x33c7.7 (4) -0x33c0| 88 31 00 cd ae 01 00 00| .1......| xl_prev: "1AE/CD003188" (1850275279240) 0x33c8-0x33cf.7 (8) -0x33d0|10 |. | xl_info: 16 0x33d0-0x33d0.7 (1) -0x33d0| 09 | . | xl_rmid: 9 0x33d1-0x33d1.7 (1) -0x33d0| 00 00 | .. | hole1: 0 0x33d2-0x33d3.7 (2) -0x33d0| 65 b1 ef 38 | e..8 | xl_crc: 955232613 0x33d4-0x33d7.7 (4) -0x35f0| 00 00 00 00 00 | ..... | align0: raw bits 0x35f3-0x35f7.7 (5) - | | | [9]{}: xlog_record 0x35f8-0x382f.7 (568) - | | | lsn: "1AE/CD0035F8" (1850275280376) 0x35f8-NA (0) -0x35f0| 33 02 00 00 | 3... | xl_tot_len: 563 0x35f8-0x35fb.7 (4) -0x35f0| 00 00 00 00| ....| xlog_body0: raw bits 0x35fc-0x382a.7 (559) -0x3600|c0 33 00 cd ae 01 00 00 10 09 00 00 32 e8 42 32|.3..........2.B2| -* |until 0x382a.7 (559) | | -0x35f0| 00 00 00 00| ....| xl_xid: 0 0x35fc-0x35ff.7 (4) -0x3600|c0 33 00 cd ae 01 00 00 |.3...... | xl_prev: "1AE/CD0033C0" (1850275279808) 0x3600-0x3607.7 (8) -0x3600| 10 | . | xl_info: 16 0x3608-0x3608.7 (1) -0x3600| 09 | . | xl_rmid: 9 0x3609-0x3609.7 (1) -0x3600| 00 00 | .. | hole1: 0 0x360a-0x360b.7 (2) -0x3600| 32 e8 42 32| 2.B2| xl_crc: 843245618 0x360c-0x360f.7 (4) -0x3820| 00 00 00 00 00| .....| align0: raw bits 0x382b-0x382f.7 (5) - | | | [10]{}: xlog_record 0x3830-0x3a67.7 (568) - | | | lsn: "1AE/CD003830" (1850275280944) 0x3830-NA (0) -0x3830|33 02 00 00 |3... | xl_tot_len: 563 0x3830-0x3833.7 (4) -0x3830| 00 00 00 00 f8 35 00 cd ae 01 00 00| .....5......| xlog_body0: raw bits 0x3834-0x3a62.7 (559) -0x3840|10 09 00 00 47 bd 15 95 00 10 00 00 f8 01 f8 01|....G...........| -* |until 0x3a62.7 (559) | | -0x3830| 00 00 00 00 | .... | xl_xid: 0 0x3834-0x3837.7 (4) -0x3830| f8 35 00 cd ae 01 00 00| .5......| xl_prev: "1AE/CD0035F8" (1850275280376) 0x3838-0x383f.7 (8) -0x3840|10 |. | xl_info: 16 0x3840-0x3840.7 (1) -0x3840| 09 | . | xl_rmid: 9 0x3841-0x3841.7 (1) -0x3840| 00 00 | .. | hole1: 0 0x3842-0x3843.7 (2) -0x3840| 47 bd 15 95 | G... | xl_crc: 2501229895 0x3844-0x3847.7 (4) -0x3a60| 00 00 00 00 00 | ..... | align0: raw bits 0x3a63-0x3a67.7 (5) - | | | [11]{}: xlog_record 0x3a68-0x3c9f.7 (568) - | | | lsn: "1AE/CD003A68" (1850275281512) 0x3a68-NA (0) -0x3a60| 33 02 00 00 | 3... | xl_tot_len: 563 0x3a68-0x3a6b.7 (4) -0x3a60| 00 00 00 00| ....| xlog_body0: raw bits 0x3a6c-0x3c9a.7 (559) -0x3a70|30 38 00 cd ae 01 00 00 10 09 00 00 14 a8 35 e0|08............5.| -* |until 0x3c9a.7 (559) | | -0x3a60| 00 00 00 00| ....| xl_xid: 0 0x3a6c-0x3a6f.7 (4) -0x3a70|30 38 00 cd ae 01 00 00 |08...... | xl_prev: "1AE/CD003830" (1850275280944) 0x3a70-0x3a77.7 (8) -0x3a70| 10 | . | xl_info: 16 0x3a78-0x3a78.7 (1) -0x3a70| 09 | . | xl_rmid: 9 0x3a79-0x3a79.7 (1) -0x3a70| 00 00 | .. | hole1: 0 0x3a7a-0x3a7b.7 (2) -0x3a70| 14 a8 35 e0| ..5.| xl_crc: 3761612820 0x3a7c-0x3a7f.7 (4) -0x3c90| 00 00 00 00 00| .....| align0: raw bits 0x3c9b-0x3c9f.7 (5) - | | | [12]{}: xlog_record 0x3ca0-0x3ed7.7 (568) - | | | lsn: "1AE/CD003CA0" (1850275282080) 0x3ca0-NA (0) -0x3ca0|33 02 00 00 |3... | xl_tot_len: 563 0x3ca0-0x3ca3.7 (4) -0x3ca0| 00 00 00 00 68 3a 00 cd ae 01 00 00| ....h:......| xlog_body0: raw bits 0x3ca4-0x3ed2.7 (559) -0x3cb0|10 09 00 00 84 11 b3 9e 00 10 00 00 f8 01 f8 01|................| -* |until 0x3ed2.7 (559) | | -0x3ca0| 00 00 00 00 | .... | xl_xid: 0 0x3ca4-0x3ca7.7 (4) -0x3ca0| 68 3a 00 cd ae 01 00 00| h:......| xl_prev: "1AE/CD003A68" (1850275281512) 0x3ca8-0x3caf.7 (8) -0x3cb0|10 |. | xl_info: 16 0x3cb0-0x3cb0.7 (1) -0x3cb0| 09 | . | xl_rmid: 9 0x3cb1-0x3cb1.7 (1) -0x3cb0| 00 00 | .. | hole1: 0 0x3cb2-0x3cb3.7 (2) -0x3cb0| 84 11 b3 9e | .... | xl_crc: 2662535556 0x3cb4-0x3cb7.7 (4) -0x3ed0| 00 00 00 00 00 | ..... | align0: raw bits 0x3ed3-0x3ed7.7 (5) - | | | [13]{}: xlog_record 0x3ed8-0x3fff.7 (296) - | | | lsn: "1AE/CD003ED8" (1850275282648) 0x3ed8-NA (0) -0x3ed0| 33 02 00 00 | 3... | xl_tot_len: 563 0x3ed8-0x3edb.7 (4) -0x3ed0| 00 00 00 00| ....| xlog_body0: raw bits 0x3edc-0x3fff.7 (292) -0x3ee0|a0 3c 00 cd ae 01 00 00 10 09 00 00 f5 86 96 77|.<.............w| -* |until 0x3fff.7 (end) (292) | | -0x3ed0| 00 00 00 00| ....| xl_xid: 0 0x3edc-0x3edf.7 (4) -0x3ee0|a0 3c 00 cd ae 01 00 00 |.<...... | xl_prev: "1AE/CD003CA0" (1850275282080) 0x3ee0-0x3ee7.7 (8) -0x3ee0| 10 | . | xl_info: 16 0x3ee8-0x3ee8.7 (1) -0x3ee0| 09 | . | xl_rmid: 9 0x3ee9-0x3ee9.7 (1) -0x3ee0| 00 00 | .. | hole1: 0 0x3eea-0x3eeb.7 (2) -0x3ee0| f5 86 96 77| ...w| xl_crc: 2006353653 0x3eec-0x3eef.7 (4) From dafbf4b7ed8c4363c88c4e4e53d25eac4b69ebc4 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Wed, 23 Nov 2022 13:56:49 +0300 Subject: [PATCH 128/141] postgres: lint fixes --- format/postgres/common/pg_heap/postgres/heap_page.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/format/postgres/common/pg_heap/postgres/heap_page.go b/format/postgres/common/pg_heap/postgres/heap_page.go index 4851ba947..5bbb12726 100644 --- a/format/postgres/common/pg_heap/postgres/heap_page.go +++ b/format/postgres/common/pg_heap/postgres/heap_page.go @@ -85,12 +85,12 @@ func decodeItemIdsInternal(page *HeapPage, d *decode.D) { /* 1: 7 | 4 */ // unsigned int lp_flags: 2 /* 2: 1 | 4 */ // unsigned int lp_len: 15 d.FieldStruct("item_id", func(d *decode.D) { - itemIdData := d.FieldU32("item_id_data") + itemIDData := d.FieldU32("item_id_data") itemID := ItemID{} - itemID.Off = uint32(itemIdData & 0x7fff) - itemID.Flags = uint32((itemIdData >> 15) & 0x3) - itemID.Len = uint32((itemIdData >> 17) & 0x7fff) + itemID.Off = uint32(itemIDData & 0x7fff) + itemID.Flags = uint32((itemIDData >> 15) & 0x3) + itemID.Len = uint32((itemIDData >> 17) & 0x7fff) d.FieldValueU("lp_off", uint64(itemID.Off)) d.FieldValueU("lp_flags", uint64(itemID.Flags), common.LpFlagsMapper) From 0ea20e68277ca8007b7da174528cff8700887691 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Wed, 23 Nov 2022 14:14:51 +0300 Subject: [PATCH 129/141] postgres: fail on error in pg_heap --- format/postgres/common/pg_heap/postgres/pg_heap.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/format/postgres/common/pg_heap/postgres/pg_heap.go b/format/postgres/common/pg_heap/postgres/pg_heap.go index 406d20d43..36239dda0 100644 --- a/format/postgres/common/pg_heap/postgres/pg_heap.go +++ b/format/postgres/common/pg_heap/postgres/pg_heap.go @@ -162,7 +162,7 @@ func decodeHeapPages(heap *Heap, d *decode.D) { pageEnd := int64(common.TypeAlign(common.PageSize, endLen)) pageEnd0 := count * common.PageSize if pageEnd0 != pageEnd { - fmt.Printf("invalid page %d end expected %d, actual %d, endLen %d\n", count-1, pageEnd0, pageEnd, endLen) + d.Errorf("invalid page %d end expected %d, actual %d, endLen %d\n", count-1, pageEnd0, pageEnd, endLen) } d.SeekAbs(pageEnd0 * 8) } From 97bbc22a1d9d5b1b515e7f731a5084c575c0ac03 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Thu, 22 Dec 2022 11:22:02 +0300 Subject: [PATCH 130/141] postgres: add page arg in pg_btree, change args names in pg_heap --- format/format.go | 10 +++++++--- .../postgres/common/pg_btree/postgres/pg_btree.go | 8 +++++--- format/postgres/common/pg_heap/postgres/pg_heap.go | 2 +- format/postgres/pg_btree.go | 14 ++++++++++---- format/postgres/pg_heap.go | 6 +++--- 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/format/format.go b/format/format.go index 3daadf254..a260c493b 100644 --- a/format/format.go +++ b/format/format.go @@ -332,7 +332,11 @@ type PostgresIn struct { } type PostgresHeapIn struct { - Flavour string `doc:"PostgreSQL flavour: postgres14, pgproee14.., postgres10"` - PageNumber int `doc:"First page number in file, default is 0"` - SegmentNumber int `doc:"Segment file number (16790.1 is 1), default is 0"` + Flavour string `doc:"PostgreSQL flavour: postgres14, pgproee14.., postgres10"` + Page int `doc:"First page number in file, default is 0"` + Segment int `doc:"Segment file number (16790.1 is 1), default is 0"` +} + +type PostgresBTreeIn struct { + Page int `doc:"First page number in file, default is 0"` } diff --git a/format/postgres/common/pg_btree/postgres/pg_btree.go b/format/postgres/common/pg_btree/postgres/pg_btree.go index 8ec52e8d0..e349ffb62 100644 --- a/format/postgres/common/pg_btree/postgres/pg_btree.go +++ b/format/postgres/common/pg_btree/postgres/pg_btree.go @@ -1,6 +1,7 @@ package postgres import ( + "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" @@ -66,8 +67,9 @@ const ( // IndexTupleData *IndexTuple; /* total size (bytes): 8 */ -func DecodePgBTree(d *decode.D) any { +func DecodePgBTree(d *decode.D, args format.PostgresBTreeIn) any { btree := &BTree{ + Args: args, PageSize: common.PageSize, } decodeBTreePages(btree, d) @@ -75,13 +77,13 @@ func DecodePgBTree(d *decode.D) any { } type BTree struct { + Args format.PostgresBTreeIn PageSize uint64 page *postgres.HeapPage } func decodeBTreePages(btree *BTree, d *decode.D) { - for i := 0; ; i++ { - + for i := btree.Args.Page; ; i++ { page := &postgres.HeapPage{} if btree.page != nil { // use prev page diff --git a/format/postgres/common/pg_heap/postgres/pg_heap.go b/format/postgres/common/pg_heap/postgres/pg_heap.go index 36239dda0..2bfc7f3fb 100644 --- a/format/postgres/common/pg_heap/postgres/pg_heap.go +++ b/format/postgres/common/pg_heap/postgres/pg_heap.go @@ -144,7 +144,7 @@ func Decode(heap *Heap, d *decode.D) any { } func decodeHeapPages(heap *Heap, d *decode.D) { - blockNumber := uint32(heap.Args.PageNumber + heap.Args.SegmentNumber*common.RelSegSize) + blockNumber := uint32(heap.Args.Page + heap.Args.Segment*common.RelSegSize) count := int64(0) for { if end, _ := d.TryEnd(); end { diff --git a/format/postgres/pg_btree.go b/format/postgres/pg_btree.go index 5e510c65c..3812867e2 100644 --- a/format/postgres/pg_btree.go +++ b/format/postgres/pg_btree.go @@ -18,13 +18,19 @@ func init() { Name: format.PG_BTREE, Description: "PostgreSQL btree index file", DecodeFn: decodePgBTree, - RootArray: true, - RootName: "pages", + DecodeInArg: format.PostgresBTreeIn{ + Page: 0, + }, + RootArray: true, + RootName: "pages", }) interp.RegisterFS(pgBTreeFS) } func decodePgBTree(d *decode.D, in any) any { - d.Endian = decode.LittleEndian - return postgres.DecodePgBTree(d) + pgIn, ok := in.(format.PostgresBTreeIn) + if !ok { + d.Fatalf("DecodeInArg must be PostgresBTreeIn!\n") + } + return postgres.DecodePgBTree(d, pgIn) } diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index 885bfe545..23d71f755 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -23,9 +23,9 @@ func init() { Description: "PostgreSQL heap file", DecodeFn: decodePgheap, DecodeInArg: format.PostgresHeapIn{ - Flavour: PG_FLAVOUR_POSTGRES14, - PageNumber: 0, - SegmentNumber: 0, + Flavour: PG_FLAVOUR_POSTGRES14, + Page: 0, + Segment: 0, }, RootArray: true, RootName: "pages", From bffa00835d77b0a6b7d791a0aa3d815167e0d9dc Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Mon, 26 Dec 2022 14:47:23 +0300 Subject: [PATCH 131/141] postgres: fix error in tests --- format/postgres/pg_btree.go | 1 + 1 file changed, 1 insertion(+) diff --git a/format/postgres/pg_btree.go b/format/postgres/pg_btree.go index 3812867e2..01f71ffd1 100644 --- a/format/postgres/pg_btree.go +++ b/format/postgres/pg_btree.go @@ -28,6 +28,7 @@ func init() { } func decodePgBTree(d *decode.D, in any) any { + d.Endian = decode.LittleEndian pgIn, ok := in.(format.PostgresBTreeIn) if !ok { d.Fatalf("DecodeInArg must be PostgresBTreeIn!\n") From c9b263e92587d6166f315abec05a0965cca105a1 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Mon, 17 Apr 2023 17:12:46 +0300 Subject: [PATCH 132/141] postgres: version 15 support --- .../postgres/flavours/pgproee15/pg_control.go | 224 ++++++++++++++++++ format/postgres/pg_control.go | 8 +- format/postgres/pg_heap.go | 7 +- .../postgres/testdata/flavours/pgpro15/16400 | Bin 0 -> 16384 bytes .../testdata/flavours/pgpro15/16400.fqtest | 21 ++ .../postgres/testdata/flavours/pgpro15/16401 | Bin 0 -> 8192 bytes .../testdata/flavours/pgpro15/16401.fqtest | 93 ++++++++ .../testdata/flavours/pgpro15/pg_control | Bin 0 -> 8192 bytes .../flavours/pgpro15/pg_control.fqtest | 67 ++++++ .../testdata/flavours/pgproee15/16400 | Bin 0 -> 16384 bytes .../testdata/flavours/pgproee15/16400.fqtest | 21 ++ .../testdata/flavours/pgproee15/16401 | Bin 0 -> 8192 bytes .../testdata/flavours/pgproee15/16401.fqtest | 93 ++++++++ .../testdata/flavours/pgproee15/pg_control | Bin 0 -> 8192 bytes .../flavours/pgproee15/pg_control.fqtest | 68 ++++++ .../testdata/flavours/postgres15/16400 | Bin 0 -> 16384 bytes .../testdata/flavours/postgres15/16400.fqtest | 21 ++ .../testdata/flavours/postgres15/16401 | Bin 0 -> 8192 bytes .../testdata/flavours/postgres15/16401.fqtest | 93 ++++++++ .../testdata/flavours/postgres15/pg_control | Bin 0 -> 8192 bytes .../flavours/postgres15/pg_control.fqtest | 67 ++++++ 21 files changed, 780 insertions(+), 3 deletions(-) create mode 100644 format/postgres/flavours/pgproee15/pg_control.go create mode 100644 format/postgres/testdata/flavours/pgpro15/16400 create mode 100644 format/postgres/testdata/flavours/pgpro15/16400.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro15/16401 create mode 100644 format/postgres/testdata/flavours/pgpro15/16401.fqtest create mode 100644 format/postgres/testdata/flavours/pgpro15/pg_control create mode 100644 format/postgres/testdata/flavours/pgpro15/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee15/16400 create mode 100644 format/postgres/testdata/flavours/pgproee15/16400.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee15/16401 create mode 100644 format/postgres/testdata/flavours/pgproee15/16401.fqtest create mode 100644 format/postgres/testdata/flavours/pgproee15/pg_control create mode 100644 format/postgres/testdata/flavours/pgproee15/pg_control.fqtest create mode 100644 format/postgres/testdata/flavours/postgres15/16400 create mode 100644 format/postgres/testdata/flavours/postgres15/16400.fqtest create mode 100644 format/postgres/testdata/flavours/postgres15/16401 create mode 100644 format/postgres/testdata/flavours/postgres15/16401.fqtest create mode 100644 format/postgres/testdata/flavours/postgres15/pg_control create mode 100644 format/postgres/testdata/flavours/postgres15/pg_control.fqtest diff --git a/format/postgres/flavours/pgproee15/pg_control.go b/format/postgres/flavours/pgproee15/pg_control.go new file mode 100644 index 000000000..59a3ba7e2 --- /dev/null +++ b/format/postgres/flavours/pgproee15/pg_control.go @@ -0,0 +1,224 @@ +package pgproee15 + +import ( + "github.com/wader/fq/format/postgres/common" + "github.com/wader/fq/pkg/decode" + "github.com/wader/fq/pkg/scalar" +) + +// type = struct ControlFileData { +/* 0 | 8 */ // uint64 system_identifier; +/* 8 | 4 */ // uint32 pg_control_version; +/* 12 | 4 */ // uint32 catalog_version_no; +/* 16 | 4 */ // DBState state; +/* XXX 4-byte hole */ +/* 24 | 8 */ // pg_time_t time; +/* 32 | 8 */ // XLogRecPtr checkPoint; +/* 40 | 120 */ // CheckPoint checkPointCopy; +/* 160 | 8 */ // XLogRecPtr unloggedLSN; +/* 168 | 8 */ // XLogRecPtr minRecoveryPoint; +/* 176 | 4 */ // TimeLineID minRecoveryPointTLI; +/* XXX 4-byte hole */ +/* 184 | 8 */ // XLogRecPtr backupStartPoint; +/* 192 | 8 */ // XLogRecPtr backupEndPoint; +/* 200 | 1 */ // _Bool backupEndRequired; +/* XXX 3-byte hole */ +/* 204 | 4 */ // int wal_level; +/* 208 | 1 */ // _Bool wal_log_hints; +/* XXX 3-byte hole */ +/* 212 | 4 */ // int MaxConnections; +/* 216 | 4 */ // int max_worker_processes; +/* 220 | 4 */ // int max_wal_senders; +/* 224 | 4 */ // int max_prepared_xacts; +/* 228 | 4 */ // int max_locks_per_xact; +/* 232 | 1 */ // _Bool track_commit_timestamp; +/* XXX 3-byte hole */ +/* 236 | 4 */ // uint32 maxAlign; +/* 240 | 8 */ // double floatFormat; +/* 248 | 4 */ // uint32 blcksz; +/* 252 | 4 */ // uint32 relseg_size; +/* 256 | 4 */ // uint32 xlog_blcksz; +/* 260 | 4 */ // uint32 xlog_seg_size; +/* 264 | 4 */ // uint32 nameDataLen; +/* 268 | 4 */ // uint32 indexMaxKeys; +/* 272 | 4 */ // uint32 toast_max_chunk_size; +/* 276 | 4 */ // uint32 loblksize; +/* 280 | 1 */ // _Bool float8ByVal; +/* XXX 3-byte hole */ +/* 284 | 4 */ // uint32 data_checksum_version; +/* 288 | 32 */ // char mock_authentication_nonce[32]; +/* 320 | 4 */ // uint32 pg_old_version; +/* 324 | 4 */ // pg_crc32c crc; + +/* total size (bytes): 328 */ + +// type = struct CheckPoint { +/* 0 | 8 */ // XLogRecPtr redo; +/* 8 | 4 */ // TimeLineID ThisTimeLineID; +/* 12 | 4 */ // TimeLineID PrevTimeLineID; +/* 16 | 1 */ // _Bool fullPageWrites; +/* XXX 7-byte hole */ +/* 24 | 8 */ // FullTransactionId nextXid; +/* 32 | 4 */ // Oid nextOid; +/* XXX 4-byte hole */ +/* 40 | 8 */ // MultiXactId nextMulti; +/* 48 | 8 */ // MultiXactOffset nextMultiOffset; +/* 56 | 8 */ // TransactionId oldestXid; +/* 64 | 4 */ // Oid oldestXidDB; +/* XXX 4-byte hole */ +/* 72 | 8 */ // MultiXactId oldestMulti; +/* 80 | 4 */ // Oid oldestMultiDB; +/* XXX 4-byte hole */ +/* 88 | 8 */ // pg_time_t time; +/* 96 | 8 */ // TransactionId oldestCommitTsXid; +/* 104 | 8 */ // TransactionId newestCommitTsXid; +/* 112 | 8 */ // TransactionId oldestActiveXid; +// +/* total size (bytes): 120 */ + +func DecodePgControl(d *decode.D, in any) any { + /* 0 | 8 */ // uint64 system_identifier; + /* 8 | 4 */ // uint32 pg_control_version; + /* 12 | 4 */ // uint32 catalog_version_no; + /* 16 | 4 */ // DBState state; + /* XXX 4-byte hole */ + d.FieldU64("system_identifier") + d.FieldU32("pg_control_version", common.VersionMapper) + d.FieldU32("catalog_version_no") + d.FieldU32("state", common.DBState) + d.FieldU32("hole0") + + /* 24 | 8 */ // pg_time_t time; + /* 32 | 8 */ // XLogRecPtr checkPoint; + /* 40 | 120 */ // CheckPoint checkPointCopy; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("check_point", common.XLogRecPtrMapper) + d.FieldStruct("check_point_copy", func(d *decode.D) { + /* 0 | 8 */ // XLogRecPtr redo; + /* 8 | 4 */ // TimeLineID ThisTimeLineID; + /* 12 | 4 */ // TimeLineID PrevTimeLineID; + /* 16 | 1 */ // _Bool fullPageWrites; + /* XXX 7-byte hole */ + d.FieldU64("redo", common.XLogRecPtrMapper) + d.FieldU32("this_time_line_id") + d.FieldU32("prev_time_line_id") + d.FieldU8("full_page_writes") + d.FieldU56("hole1") + + /* 24 | 8 */ // FullTransactionId nextXid; + /* 32 | 4 */ // Oid nextOid; + /* XXX 4-byte hole */ + d.FieldU64("next_xid") + d.FieldU32("next_oid") + d.FieldU32("hole2") + + /* 40 | 8 */ // MultiXactId nextMulti; + /* 48 | 8 */ // MultiXactOffset nextMultiOffset; + /* 56 | 8 */ // TransactionId oldestXid; + /* 64 | 4 */ // Oid oldestXidDB; + /* XXX 4-byte hole */ + d.FieldU64("next_multi") + d.FieldU64("next_multi_offset") + d.FieldU64("oldest_xid") + d.FieldU32("oldest_xid_db") + d.FieldU32("hole3") + + /* 72 | 8 */ // MultiXactId oldestMulti; + /* 80 | 4 */ // Oid oldestMultiDB; + /* XXX 4-byte hole */ + d.FieldU64("oldest_multi") + d.FieldU32("oldest_multi_db") + d.FieldU32("hole4") + + /* 88 | 8 */ // pg_time_t time; + /* 96 | 8 */ // TransactionId oldestCommitTsXid; + /* 104 | 8 */ // TransactionId newestCommitTsXid; + /* 112 | 8 */ // TransactionId oldestActiveXid; + d.FieldS64("time", common.TimeMapper) + d.FieldU64("oldest_commit_ts_xid") + d.FieldU64("newest_commit_ts_xid") + d.FieldU64("oldest_active_xid") + }) + + /* 160 | 8 */ // XLogRecPtr unloggedLSN; + /* 168 | 8 */ // XLogRecPtr minRecoveryPoint; + /* 176 | 4 */ // TimeLineID minRecoveryPointTLI; + /* XXX 4-byte hole */ + d.FieldU64("unlogged_lsn", common.LocPtrMapper) + d.FieldU64("min_recovery_point", common.LocPtrMapper) + d.FieldU32("min_recovery_point_tli") + d.FieldU32("hole5") + + /* 184 | 8 */ // XLogRecPtr backupStartPoint; + /* 192 | 8 */ // XLogRecPtr backupEndPoint; + /* 200 | 1 */ // _Bool backupEndRequired; + /* XXX 3-byte hole */ + d.FieldU64("backup_start_point", common.LocPtrMapper) + d.FieldU64("backup_end_point", common.LocPtrMapper) + d.FieldU8("backup_end_required") + d.FieldU24("hole6") + + /* 204 | 4 */ // int wal_level; + /* 208 | 1 */ // _Bool wal_log_hints; + /* XXX 3-byte hole */ + d.FieldS32("wal_level", common.WalLevel) + d.FieldU8("wal_log_hints") + d.FieldU24("hole7") + + /* 212 | 4 */ // int MaxConnections; + /* 216 | 4 */ // int max_worker_processes; + /* 220 | 4 */ // int max_wal_senders; + /* 224 | 4 */ // int max_prepared_xacts; + /* 228 | 4 */ // int max_locks_per_xact; + /* 232 | 1 */ // _Bool track_commit_timestamp; + /* XXX 3-byte hole */ + d.FieldS32("max_connections") + d.FieldS32("max_worker_processes") + d.FieldS32("max_wal_senders") + d.FieldS32("max_prepared_xacts") + d.FieldS32("max_locks_per_xact") + d.FieldU8("track_commit_timestamp") + d.FieldU24("hole8") + + /* 236 | 4 */ // uint32 maxAlign; + /* 240 | 8 */ // double floatFormat; + /* 248 | 4 */ // uint32 blcksz; + /* 252 | 4 */ // uint32 relseg_size; + /* 256 | 4 */ // uint32 xlog_blcksz; + /* 260 | 4 */ // uint32 xlog_seg_size; + /* 264 | 4 */ // uint32 nameDataLen; + /* 268 | 4 */ // uint32 indexMaxKeys; + /* 272 | 4 */ // uint32 toast_max_chunk_size; + /* 276 | 4 */ // uint32 loblksize; + /* 280 | 1 */ // _Bool float8ByVal; + /* XXX 3-byte hole */ + d.FieldU32("max_align") + d.FieldF64("float_format") + d.FieldU32("blcksz") + d.FieldU32("relseg_size") + d.FieldU32("xlog_blcksz") + d.FieldU32("xlog_seg_size") + d.FieldU32("name_data_len") + d.FieldU32("index_max_keys") + d.FieldU32("toast_max_chunk_size") + d.FieldU32("loblksize") + d.FieldU8("float8_by_val") + d.FieldU24("hole9") + + /* 284 | 4 */ // uint32 data_checksum_version; + /* 288 | 32 */ // char mock_authentication_nonce[32]; + /* 320 | 4 */ // pg_icu_version icu_version; + /* 324 | 4 */ // uint32 pg_old_version; + /* 328 | 4 */ // pg_crc32c crc; + /* XXX 4-byte padding */ + d.FieldU32("data_checksum_version") + d.FieldRawLen("mock_authentication_nonce", 32*8, scalar.RawHex) + d.FieldU32("pg_old_version") + d.FieldU32("crc") + /* total size (bytes): 328 */ + + d.AssertPos(328 * 8) + d.FieldRawLen("unused", d.BitsLeft()) + + return nil +} diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index bed5f6a10..0da140660 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -2,6 +2,7 @@ package postgres import ( "embed" + "github.com/wader/fq/format/postgres/flavours/pgproee15" "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/common" @@ -56,16 +57,19 @@ const ( PG_FLAVOUR_POSTGRES12 = "postgres12" PG_FLAVOUR_POSTGRES13 = "postgres13" PG_FLAVOUR_POSTGRES14 = "postgres14" + PG_FLAVOUR_POSTGRES15 = "postgres15" PG_FLAVOUR_PGPRO10 = "pgpro10" PG_FLAVOUR_PGPRO11 = "pgpro11" PG_FLAVOUR_PGPRO12 = "pgpro12" PG_FLAVOUR_PGPRO13 = "pgpro13" PG_FLAVOUR_PGPRO14 = "pgpro14" + PG_FLAVOUR_PGPRO15 = "pgpro15" PG_FLAVOUR_PGPROEE10 = "pgproee10" PG_FLAVOUR_PGPROEE11 = "pgproee11" PG_FLAVOUR_PGPROEE12 = "pgproee12" PG_FLAVOUR_PGPROEE13 = "pgproee13" PG_FLAVOUR_PGPROEE14 = "pgproee14" + PG_FLAVOUR_PGPROEE15 = "pgproee15" ) func decodePgControl(d *decode.D, in any) any { @@ -85,7 +89,7 @@ func decodePgControl(d *decode.D, in any) any { return postgres12.DecodePgControl(d, in) case PG_FLAVOUR_POSTGRES13: return postgres13.DecodePgControl(d, in) - case PG_FLAVOUR_POSTGRES14: + case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES15, PG_FLAVOUR_PGPRO15: return postgres14.DecodePgControl(d, in) case PG_FLAVOUR_PGPRO10: return pgpro10.DecodePgControl(d, in) @@ -107,6 +111,8 @@ func decodePgControl(d *decode.D, in any) any { return pgproee13.DecodePgControl(d, in) case PG_FLAVOUR_PGPROEE14: return pgproee14.DecodePgControl(d, in) + case PG_FLAVOUR_PGPROEE15: + return pgproee15.DecodePgControl(d, in) default: break } diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index 23d71f755..f07f05ac7 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -47,18 +47,21 @@ func decodePgheap(d *decode.D, in any) any { PG_FLAVOUR_POSTGRES12, PG_FLAVOUR_POSTGRES13, PG_FLAVOUR_POSTGRES14, + PG_FLAVOUR_POSTGRES15, PG_FLAVOUR_PGPRO10, PG_FLAVOUR_PGPRO11, PG_FLAVOUR_PGPRO12, PG_FLAVOUR_PGPRO13, - PG_FLAVOUR_PGPRO14: + PG_FLAVOUR_PGPRO14, + PG_FLAVOUR_PGPRO15: return postgres.DecodeHeap(d, pgIn) case PG_FLAVOUR_PGPROEE10, PG_FLAVOUR_PGPROEE11, PG_FLAVOUR_PGPROEE12, PG_FLAVOUR_PGPROEE13, - PG_FLAVOUR_PGPROEE14: + PG_FLAVOUR_PGPROEE14, + PG_FLAVOUR_PGPROEE15: return pgproee.DecodeHeap(d, pgIn) default: diff --git a/format/postgres/testdata/flavours/pgpro15/16400 b/format/postgres/testdata/flavours/pgpro15/16400 new file mode 100644 index 0000000000000000000000000000000000000000..66469ebe0dbb1ead8ee7d772f73f1535ad3bd900 GIT binary patch literal 16384 zcmeI%#cq@V6vgpx+NryHJ9T$AytqSgcXv;kTqv%^9Ug#}V9TozRy+Y`(sLJd&zuck za&yvI%&%z|lgvK|g5Z1WRH*Y;I7km!D2Rk3cqy>2zk>j0U$8j)jK$d}EY3b+arOa= zv-en>y~E<{Ef!~QusC~-#n~$?&R$}1_5zEu=UAN0U~%>gi?gR#oISzf>@gN+kFYp< zh{f3hEY9v@adr=jv%6TF-NEAQHWp{oSe)I$;_N0?@cfLMMYCv+2jL(ttvDFR&mq3{ zE%FZ@zV}>zjQ*I&AEiGk@<-^8i2Pyt!y<o({*cHYq(3O~2j~xo{C@iVBEOG*pUCf} z-z)Na==X^HZu;FKzl(mC$nT`zDe^n$cZmFU`t2gWjeeWRZ>8TV@>}S)i2P>y%_6^v zev`;=q~9p=8|XKP{CfKJBEOD)oyf1HUn}x!=+}t+YWme8KSDnu@~h}qiTq0Xl_I}_ zeuc;{r(Z7e%jlPh{8IX*BEN)wiO4UeUo7&A=og9nLi&Xwzkq&$$j_&rFY@!~=ZXAW z`ne)MhklO8&!(R(^0VkizYkY@|D8!cQ{-pR&k*_P^wULt8vQhppGrSf<fqV25&6mV zlSO_K{Uni}NIy~JC(ut2`C<BDksnV#UgXEok7ilL=TC@!)Q*J@CYYI+3Qhj_-~Xe3 zi&#H@_xBLG|7`!ifnOvR|NptZ_y6l6-~0bHk?;Ngs>t{Le?{bb|GzBqz5ibl`QHC8 zihS??7ev1I|MMc>`~NwS@BRO*$oKw#M&x_{KP~dT|DO{1-v3XEeDD7!M85a`<09Yt z|1pv8{r{-Q_x^uG<a_@=Eb_ho9}@ZA{|}0M@BarxzW4wABH#P}K9TSJf3L{*{=Y}$ zd;i}p^1c7>68YZ$cZz)P|2ss!_y6r8-~0bIk?;L~tH}5MzeVJG|DP23-v2j?eDD98 zM85a`jUwOs{|1ro{eQj4_x`_5<a_^LEAqYnuMzp)|5uBA@BgbrzW4u?BH#P}3X$*q zf4Ru_{=ZD*d;ec5^1c60h<xw=OGLi+|HUHT`~M=5@BM$F$oKxgK;(P>pD*&g|Idq& F{|CcP=zstK literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgpro15/16400.fqtest b/format/postgres/testdata/flavours/pgpro15/16400.fqtest new file mode 100644 index 000000000..d380b11c3 --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro15/16400.fqtest @@ -0,0 +1,21 @@ +$ fq -d pg_heap -o flavour=pgpro15 ".[0].pd_linp[0, 1, 2, -1] | dv" 16400 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | item_id_data: 15900544 0x18-0x1b.7 (4) + | | | lp_off: 8064 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 121 0x1c-NA (0) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) +0x10| 00 9f f2 00| ....| item_id_data: 15900416 0x1c-0x1f.7 (4) + | | | lp_off: 7936 0x20-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x20-NA (0) + | | | lp_len: 121 0x20-NA (0) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[2]{}: item_id 0x20-0x23.7 (4) +0x20|80 9e f2 00 |.... | item_id_data: 15900288 0x20-0x23.7 (4) + | | | lp_off: 7808 0x24-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x24-NA (0) + | | | lp_len: 121 0x24-NA (0) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[60]{}: item_id 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | item_id_data: 15892864 0x108-0x10b.7 (4) + | | | lp_off: 384 0x10c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x10c-NA (0) + | | | lp_len: 121 0x10c-NA (0) diff --git a/format/postgres/testdata/flavours/pgpro15/16401 b/format/postgres/testdata/flavours/pgpro15/16401 new file mode 100644 index 0000000000000000000000000000000000000000..402a178cab040f9ff9341adfe34213c9967579de GIT binary patch literal 8192 zcmeIuu?>Sj5Cp(|_=FA!ko=+&LYkunS|g?j+X#vvm`hf-(Q1;UZF9GNYo;8ZwA%hv zj(xep5g<T-009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0Rk@&IJ<j9eYTYJDZ|*8 G=l=mZxdv4L literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgpro15/16401.fqtest b/format/postgres/testdata/flavours/pgpro15/16401.fqtest new file mode 100644 index 000000000..5dd2f55f5 --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro15/16401.fqtest @@ -0,0 +1,93 @@ +$ fq -d pg_heap -o flavour=pgpro15 ".[0].tuples[0,-1] | dv" 16401 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fe0-0x1fff.7 (32) + | | | header{}: 0x1fe0-0x1ff7.7 (24) + | | | t_choice{}: 0x1fe0-0x1feb.7 (12) + | | | t_heap{}: 0x1fe0-0x1feb.7 (12) +0x1fe0|ea 02 00 00 |.... | t_xmin: 746 0x1fe0-0x1fe3.7 (4) +0x1fe0| 00 00 00 00 | .... | t_xmax: 0 0x1fe4-0x1fe7.7 (4) + | | | t_field3{}: 0x1fe8-0x1feb.7 (4) +0x1fe0| 04 00 00 00 | .... | t_cid: 4 0x1fe8-0x1feb.7 (4) +0x1fe0| 04 00 00 00 | .... | t_xvac: 4 0x1fe8-0x1feb.7 (4) + | | | t_datum{}: 0x1fe0-0x1feb.7 (12) +0x1fe0|ea 02 00 00 |.... | datum_len_: 746 0x1fe0-0x1fe3.7 (4) +0x1fe0| 00 00 00 00 | .... | datum_typmod: 0 0x1fe4-0x1fe7.7 (4) +0x1fe0| 04 00 00 00 | .... | datum_typeid: 4 0x1fe8-0x1feb.7 (4) + | | | t_ctid{}: 0x1fec-0x1ff1.7 (6) +0x1fe0| 00 00 00 00| ....| ip_blkid: 0 0x1fec-0x1fef.7 (4) +0x1ff0|01 00 |.. | ip_posid: 1 0x1ff0-0x1ff1.7 (2) +0x1ff0| 03 00 | .. | t_infomask2: 3 0x1ff2-0x1ff3.7 (2) + | | | infomask2{}: 0x1ff4-NA (0) + | | | heap_keys_updated: false 0x1ff4-NA (0) + | | | heap_hot_updated: false 0x1ff4-NA (0) + | | | heap_only_tuple: false 0x1ff4-NA (0) +0x1ff0| 01 09 | .. | t_infomask: 2305 0x1ff4-0x1ff5.7 (2) + | | | infomask{}: 0x1ff6-NA (0) + | | | heap_hasnull: true 0x1ff6-NA (0) + | | | heap_hasvarwidth: false 0x1ff6-NA (0) + | | | heap_hasexternal: false 0x1ff6-NA (0) + | | | heap_hasoid_old: false 0x1ff6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1ff6-NA (0) + | | | heap_combocid: false 0x1ff6-NA (0) + | | | heap_xmax_excl_lock: false 0x1ff6-NA (0) + | | | heap_xmax_lock_only: false 0x1ff6-NA (0) + | | | heap_xmax_shr_lock: false 0x1ff6-NA (0) + | | | heap_lock_mask: false 0x1ff6-NA (0) + | | | heap_xmin_committed: true 0x1ff6-NA (0) + | | | heap_xmin_invalid: false 0x1ff6-NA (0) + | | | heap_xmin_frozen: true 0x1ff6-NA (0) + | | | heap_xmax_committed: false 0x1ff6-NA (0) + | | | heap_xmax_invalid: true 0x1ff6-NA (0) + | | | heap_xmax_is_multi: false 0x1ff6-NA (0) + | | | heap_updated: false 0x1ff6-NA (0) + | | | heap_moved_off: false 0x1ff6-NA (0) + | | | heap_moved_in: false 0x1ff6-NA (0) + | | | heap_moved: false 0x1ff6-NA (0) +0x1ff0| 18 | . | t_hoff: 24 0x1ff6-0x1ff6.7 (1) +0x1ff0| 03 | . | padding0: 3 0x1ff7-0x1ff7.7 (1) +0x1ff0| 01 00 00 00 00 00 00 00| ........| data: "0100000000000000" (raw bits) 0x1ff8-0x1fff.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fe0-0x1fff.7 (32) + | | | header{}: 0x1fe0-0x1ff7.7 (24) + | | | t_choice{}: 0x1fe0-0x1feb.7 (12) + | | | t_heap{}: 0x1fe0-0x1feb.7 (12) +0x1fe0|ea 02 00 00 |.... | t_xmin: 746 0x1fe0-0x1fe3.7 (4) +0x1fe0| 00 00 00 00 | .... | t_xmax: 0 0x1fe4-0x1fe7.7 (4) + | | | t_field3{}: 0x1fe8-0x1feb.7 (4) +0x1fe0| 04 00 00 00 | .... | t_cid: 4 0x1fe8-0x1feb.7 (4) +0x1fe0| 04 00 00 00 | .... | t_xvac: 4 0x1fe8-0x1feb.7 (4) + | | | t_datum{}: 0x1fe0-0x1feb.7 (12) +0x1fe0|ea 02 00 00 |.... | datum_len_: 746 0x1fe0-0x1fe3.7 (4) +0x1fe0| 00 00 00 00 | .... | datum_typmod: 0 0x1fe4-0x1fe7.7 (4) +0x1fe0| 04 00 00 00 | .... | datum_typeid: 4 0x1fe8-0x1feb.7 (4) + | | | t_ctid{}: 0x1fec-0x1ff1.7 (6) +0x1fe0| 00 00 00 00| ....| ip_blkid: 0 0x1fec-0x1fef.7 (4) +0x1ff0|01 00 |.. | ip_posid: 1 0x1ff0-0x1ff1.7 (2) +0x1ff0| 03 00 | .. | t_infomask2: 3 0x1ff2-0x1ff3.7 (2) + | | | infomask2{}: 0x1ff4-NA (0) + | | | heap_keys_updated: false 0x1ff4-NA (0) + | | | heap_hot_updated: false 0x1ff4-NA (0) + | | | heap_only_tuple: false 0x1ff4-NA (0) +0x1ff0| 01 09 | .. | t_infomask: 2305 0x1ff4-0x1ff5.7 (2) + | | | infomask{}: 0x1ff6-NA (0) + | | | heap_hasnull: true 0x1ff6-NA (0) + | | | heap_hasvarwidth: false 0x1ff6-NA (0) + | | | heap_hasexternal: false 0x1ff6-NA (0) + | | | heap_hasoid_old: false 0x1ff6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1ff6-NA (0) + | | | heap_combocid: false 0x1ff6-NA (0) + | | | heap_xmax_excl_lock: false 0x1ff6-NA (0) + | | | heap_xmax_lock_only: false 0x1ff6-NA (0) + | | | heap_xmax_shr_lock: false 0x1ff6-NA (0) + | | | heap_lock_mask: false 0x1ff6-NA (0) + | | | heap_xmin_committed: true 0x1ff6-NA (0) + | | | heap_xmin_invalid: false 0x1ff6-NA (0) + | | | heap_xmin_frozen: true 0x1ff6-NA (0) + | | | heap_xmax_committed: false 0x1ff6-NA (0) + | | | heap_xmax_invalid: true 0x1ff6-NA (0) + | | | heap_xmax_is_multi: false 0x1ff6-NA (0) + | | | heap_updated: false 0x1ff6-NA (0) + | | | heap_moved_off: false 0x1ff6-NA (0) + | | | heap_moved_in: false 0x1ff6-NA (0) + | | | heap_moved: false 0x1ff6-NA (0) +0x1ff0| 18 | . | t_hoff: 24 0x1ff6-0x1ff6.7 (1) +0x1ff0| 03 | . | padding0: 3 0x1ff7-0x1ff7.7 (1) +0x1ff0| 01 00 00 00 00 00 00 00| ........| data: "0100000000000000" (raw bits) 0x1ff8-0x1fff.7 (8) diff --git a/format/postgres/testdata/flavours/pgpro15/pg_control b/format/postgres/testdata/flavours/pgpro15/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..99e741428b38ce04895126e26e69690b56b3bc66 GIT binary patch literal 8192 zcmew%wDhovw{40DYe0a0IWG?z0|apS+NOY5FKS(wK=cME%?M<}Fi89(SQf}gfQW;{ zE&;`0YCtpyz|4d25c*y)!$b(vFtb2<I6!7XwKza&kQfNGUo&!KPyn%j4gu2)j1E8^ zh<Sz`NB|Xr%mU#AMW2ppp_&c<%aRLR+LgAxb^f{a%mLeM3EjFC&;I@Gn$mR`sA?39 zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin bXb6mkz-S1JhQMeDjE2By2#kin;0^%*0%#?I literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgpro15/pg_control.fqtest b/format/postgres/testdata/flavours/pgpro15/pg_control.fqtest new file mode 100644 index 000000000..89c551134 --- /dev/null +++ b/format/postgres/testdata/flavours/pgpro15/pg_control.fqtest @@ -0,0 +1,67 @@ +$ fq -d pg_control -o flavour=pgpro15 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|f8 12 a5 c3 34 4b 3d 64 |....4K=d | system_identifier: 7223012067364901624 0x0-0x7.7 (8) +0x0000| 14 05 50 50 | ..PP | pg_control_version: 1347421460 0x8-0xb.7 (4) +0x0000| 2f 77 0d 0c| /w..| catalog_version_no: 202209071 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 0a 4d 3d 64 00 00 00 00| .M=d....| time: "Mon, 17 Apr 2023 13:43:38 UTC" (1681739018) 0x18-0x1f.7 (8) +0x0020|e8 7d 44 02 00 00 00 00 |.}D..... | check_point: "0/2447DE8" (38043112) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x7f.7 (88) +0x0020| b0 7d 44 02 00 00 00 00| .}D.....| redo: "0/2447DB0" (38043056) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|f1 02 00 00 00 00 00 00 |........ | next_xid: 753 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| next_multi: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | next_multi_offset: 0 0x50-0x53.7 (4) +0x0050| d2 02 00 00 | .... | oldest_xid: 722 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldest_xid_db: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldest_multi: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldest_multi_db: 1 0x60-0x63.7 (4) +0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) +0x0060| 0a 4d 3d 64 00 00 00 00| .M=d....| time: "Mon, 17 Apr 2023 13:43:38 UTC" (1681739018) 0x68-0x6f.7 (8) +0x0070|00 00 00 00 |.... | oldest_commit_ts_xid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newest_commit_ts_xid: 0 0x74-0x77.7 (4) +0x0070| f1 02 00 00 | .... | oldest_active_xid: 753 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | min_recovery_point_tli: 0 0x90-0x93.7 (4) +0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) +0x0090| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backup_end_required: 0 0xa8-0xa8.7 (1) +0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) +0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) +0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) +0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) +0x00b0| e8 03 00 00 | .... | max_connections: 1000 0xb4-0xb7.7 (4) +0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) +0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) +0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) +0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) +0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 08 00 00 00| ....| max_align: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xd0-0xd7.7 (8) +0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) +0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) +0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) +0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) +0x00e0| 40 00 00 00 | @... | name_data_len: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| index_max_keys: 32 0xec-0xef.7 (4) +0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) +0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) +0x00f0| 01 | . | float8_by_val: 1 0xf8-0xf8.7 (1) +0x00f0| 00 00 00 | ... | hole7: 0 0xf9-0xfb.7 (3) +0x00f0| 01 00 00 00| ....| data_checksum_version: 1 0xfc-0xff.7 (4) +0x0100|60 21 4c 88 7b 12 7c b0 ff 76 63 70 44 87 22 b5|`!L.{.|..vcpD.".| mock_authentication_nonce: "60214c887b127cb0ff766370448722b5ed43f9b5ccc03d6..." (raw bits) 0x100-0x11f.7 (32) +0x0110|ed 43 f9 b5 cc c0 3d 6b 18 2d 7e a8 e6 fe fd 8a|.C....=k.-~.....| +0x0120|94 8a c3 00 |.... | crc: 12814996 0x120-0x123.7 (4) +0x0120| 00 00 00 00 | .... | padding1: 0 0x124-0x127.7 (4) +0x0120| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x128-0x1fff.7 (7896) +0x0130|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7896) | | diff --git a/format/postgres/testdata/flavours/pgproee15/16400 b/format/postgres/testdata/flavours/pgproee15/16400 new file mode 100644 index 0000000000000000000000000000000000000000..46a7494343f7ee60046b10bbb6d62d316e51e5dc GIT binary patch literal 16384 zcmeI%#ZKG-6vg2g7>W$;&fxBDb$6lePTh4^>h5moy34*oAE1kFyKU~82WWaGoSU>H zUBcP)pIlC0!IyyqlKBM!c)pGWzkdk@5`v>aEBh50{Wu=5595JRoV~~5>>U<oZ?QOg zgT>ivEY4nGarP36vlm#LJ;&ng85U<xu{e8z#o1#l&K_ZL_7ID+2Uwil$KvcB7H4;{ zIJ<+z*=;P&ZeekD6N|GOSe#wQ;_Mn0XIHT}8^hx43KlojPb`5n?r<O!hzaKhhVglj zU;7-Hf`{LGvOh$BNaPRF9~Aim^an(KKmC4@-$%bs<oD9=75P2%dqjRW{ce%pMZZhr zchc_^`5p8-M1DK{c9GvkzfI(~(r*>{E%aMNelz`Mk>5nWN#r-uZxs0r^czHeJ^gx- zUq`=A<k!-#75O#vYearE{c4e4MZZeqSJJN(`4#jlM1DE_a*-dQ9})Rw^vgtkDg9EB zUqZh`<QLN~7WqZ=i$s1Q{X&snK)*ob=hM#@`FZs7M1C&)T#=tcKS$(e)6W+9S@g3+ zekT1)k)J_7L*%E^PZ#-V^rP>GE8hQ3rJpMDQ|PCN{ABvcB0o$&Eb^1+CyD$-`iUYx zfqsI>kEb6m@@LSWA@bws$BFz9{gB9yr628*iogFc^kYPRkbd;FPsi&Y{}~>MzScjV z^yoi-Jl}qd1wRe^@Bb4&jj8$gcYhC}`%m=$%iyNt_dnV9{(nj2d;h;E^1c6G5c%H! z&x?HT|K~)$_y4mZ-~0a=k?;Ngw8;1Ve@f(g|34}6z5kyO`QHDJi+u0@$3(vO|Dz(` z`~MM<@BRO<$oKw#NaTC}9~JrD{|}0M@BarxzW4wABH#P}K9TSJf3L{*{=Y}$d;i}p z^1c7>68YZ$cZz)P|2ss!_y6r8-~0bIk?;L~tH}5MzeVJG|KBX~z5j0#`QHCGihS?? z8$`bM|Meo@`~Qf@_x`_5<a_^LEAqYnuMzp)|5uBA@BgbrzW4u?BH#P}3X$*qf4Ru_ z{=ZD*d;ec5^1c5r5&7Q#7mIxF|BFPv_y2_=-~0apk?;L~zR36fKTqU)|DP-Jz5mY< Y`QHC$i+u0@vqZl4|C!U||EvH11_6$;>Hq)$ literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee15/16400.fqtest b/format/postgres/testdata/flavours/pgproee15/16400.fqtest new file mode 100644 index 000000000..5bfcd2618 --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee15/16400.fqtest @@ -0,0 +1,21 @@ +$ fq -d pg_heap -o flavour=pgproee15 ".[0].pd_linp[0, 1, 2, -1] | dv" 16400 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x14-0x17.7 (4) +0x10| 68 9f f2 00 | h... | item_id_data: 15900520 0x14-0x17.7 (4) + | | | lp_off: 8040 0x18-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x18-NA (0) + | | | lp_len: 121 0x18-NA (0) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[1]{}: item_id 0x18-0x1b.7 (4) +0x10| e8 9e f2 00 | .... | item_id_data: 15900392 0x18-0x1b.7 (4) + | | | lp_off: 7912 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 121 0x1c-NA (0) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[2]{}: item_id 0x1c-0x1f.7 (4) +0x10| 68 9e f2 00| h...| item_id_data: 15900264 0x1c-0x1f.7 (4) + | | | lp_off: 7784 0x20-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x20-NA (0) + | | | lp_len: 121 0x20-NA (0) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[60]{}: item_id 0x104-0x107.7 (4) +0x100| 68 81 f2 00 | h... | item_id_data: 15892840 0x104-0x107.7 (4) + | | | lp_off: 360 0x108-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x108-NA (0) + | | | lp_len: 121 0x108-NA (0) diff --git a/format/postgres/testdata/flavours/pgproee15/16401 b/format/postgres/testdata/flavours/pgproee15/16401 new file mode 100644 index 0000000000000000000000000000000000000000..bdd30fedb9065ef6d61ed614e053c9858f8c0115 GIT binary patch literal 8192 zcmeIuu?@mN5Cp(|zY|1aiNt{=6H*36xId_c$dw>s7hsv-BMKmzOICNuttLsHuUj`= z`ixoU&%9sP$NhUX1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfWW^6YJ1qX UEU77{v6i-P@AK0Alp2QQ07*#+6#xJL literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee15/16401.fqtest b/format/postgres/testdata/flavours/pgproee15/16401.fqtest new file mode 100644 index 000000000..af042c711 --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee15/16401.fqtest @@ -0,0 +1,93 @@ +$ fq -d pg_heap -o flavour=pgproee15 ".[0].tuples[0,-1] | dv" 16401 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fc8-0x1fe7.7 (32) + | | | header{}: 0x1fc8-0x1fdf.7 (24) + | | | t_choice{}: 0x1fc8-0x1fd3.7 (12) + | | | t_heap{}: 0x1fc8-0x1fd3.7 (12) +0x1fc0| 03 00 00 00 | .... | t_xmin: 3 0x1fc8-0x1fcb.7 (4) +0x1fc0| 00 00 00 00| ....| t_xmax: 0 0x1fcc-0x1fcf.7 (4) + | | | t_field3{}: 0x1fd0-0x1fd3.7 (4) +0x1fd0|04 00 00 00 |.... | t_cid: 4 0x1fd0-0x1fd3.7 (4) +0x1fd0|04 00 00 00 |.... | t_xvac: 4 0x1fd0-0x1fd3.7 (4) + | | | t_datum{}: 0x1fc8-0x1fd3.7 (12) +0x1fc0| 03 00 00 00 | .... | datum_len_: 3 0x1fc8-0x1fcb.7 (4) +0x1fc0| 00 00 00 00| ....| datum_typmod: 0 0x1fcc-0x1fcf.7 (4) +0x1fd0|04 00 00 00 |.... | datum_typeid: 4 0x1fd0-0x1fd3.7 (4) + | | | t_ctid{}: 0x1fd4-0x1fd9.7 (6) +0x1fd0| 00 00 00 00 | .... | ip_blkid: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 01 00 | .. | ip_posid: 1 0x1fd8-0x1fd9.7 (2) +0x1fd0| 03 00 | .. | t_infomask2: 3 0x1fda-0x1fdb.7 (2) + | | | infomask2{}: 0x1fdc-NA (0) + | | | heap_keys_updated: false 0x1fdc-NA (0) + | | | heap_hot_updated: false 0x1fdc-NA (0) + | | | heap_only_tuple: false 0x1fdc-NA (0) +0x1fd0| 01 09 | .. | t_infomask: 2305 0x1fdc-0x1fdd.7 (2) + | | | infomask{}: 0x1fde-NA (0) + | | | heap_hasnull: true 0x1fde-NA (0) + | | | heap_hasvarwidth: false 0x1fde-NA (0) + | | | heap_hasexternal: false 0x1fde-NA (0) + | | | heap_hasoid_old: false 0x1fde-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fde-NA (0) + | | | heap_combocid: false 0x1fde-NA (0) + | | | heap_xmax_excl_lock: false 0x1fde-NA (0) + | | | heap_xmax_lock_only: false 0x1fde-NA (0) + | | | heap_xmax_shr_lock: false 0x1fde-NA (0) + | | | heap_lock_mask: false 0x1fde-NA (0) + | | | heap_xmin_committed: true 0x1fde-NA (0) + | | | heap_xmin_invalid: false 0x1fde-NA (0) + | | | heap_xmin_frozen: true 0x1fde-NA (0) + | | | heap_xmax_committed: false 0x1fde-NA (0) + | | | heap_xmax_invalid: true 0x1fde-NA (0) + | | | heap_xmax_is_multi: false 0x1fde-NA (0) + | | | heap_updated: false 0x1fde-NA (0) + | | | heap_moved_off: false 0x1fde-NA (0) + | | | heap_moved_in: false 0x1fde-NA (0) + | | | heap_moved: false 0x1fde-NA (0) +0x1fd0| 18 | . | t_hoff: 24 0x1fde-0x1fde.7 (1) +0x1fd0| 03| .| padding0: 3 0x1fdf-0x1fdf.7 (1) +0x1fe0|01 00 00 00 00 00 00 00 |........ | data: "0100000000000000" (raw bits) 0x1fe0-0x1fe7.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fc8-0x1fe7.7 (32) + | | | header{}: 0x1fc8-0x1fdf.7 (24) + | | | t_choice{}: 0x1fc8-0x1fd3.7 (12) + | | | t_heap{}: 0x1fc8-0x1fd3.7 (12) +0x1fc0| 03 00 00 00 | .... | t_xmin: 3 0x1fc8-0x1fcb.7 (4) +0x1fc0| 00 00 00 00| ....| t_xmax: 0 0x1fcc-0x1fcf.7 (4) + | | | t_field3{}: 0x1fd0-0x1fd3.7 (4) +0x1fd0|04 00 00 00 |.... | t_cid: 4 0x1fd0-0x1fd3.7 (4) +0x1fd0|04 00 00 00 |.... | t_xvac: 4 0x1fd0-0x1fd3.7 (4) + | | | t_datum{}: 0x1fc8-0x1fd3.7 (12) +0x1fc0| 03 00 00 00 | .... | datum_len_: 3 0x1fc8-0x1fcb.7 (4) +0x1fc0| 00 00 00 00| ....| datum_typmod: 0 0x1fcc-0x1fcf.7 (4) +0x1fd0|04 00 00 00 |.... | datum_typeid: 4 0x1fd0-0x1fd3.7 (4) + | | | t_ctid{}: 0x1fd4-0x1fd9.7 (6) +0x1fd0| 00 00 00 00 | .... | ip_blkid: 0 0x1fd4-0x1fd7.7 (4) +0x1fd0| 01 00 | .. | ip_posid: 1 0x1fd8-0x1fd9.7 (2) +0x1fd0| 03 00 | .. | t_infomask2: 3 0x1fda-0x1fdb.7 (2) + | | | infomask2{}: 0x1fdc-NA (0) + | | | heap_keys_updated: false 0x1fdc-NA (0) + | | | heap_hot_updated: false 0x1fdc-NA (0) + | | | heap_only_tuple: false 0x1fdc-NA (0) +0x1fd0| 01 09 | .. | t_infomask: 2305 0x1fdc-0x1fdd.7 (2) + | | | infomask{}: 0x1fde-NA (0) + | | | heap_hasnull: true 0x1fde-NA (0) + | | | heap_hasvarwidth: false 0x1fde-NA (0) + | | | heap_hasexternal: false 0x1fde-NA (0) + | | | heap_hasoid_old: false 0x1fde-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1fde-NA (0) + | | | heap_combocid: false 0x1fde-NA (0) + | | | heap_xmax_excl_lock: false 0x1fde-NA (0) + | | | heap_xmax_lock_only: false 0x1fde-NA (0) + | | | heap_xmax_shr_lock: false 0x1fde-NA (0) + | | | heap_lock_mask: false 0x1fde-NA (0) + | | | heap_xmin_committed: true 0x1fde-NA (0) + | | | heap_xmin_invalid: false 0x1fde-NA (0) + | | | heap_xmin_frozen: true 0x1fde-NA (0) + | | | heap_xmax_committed: false 0x1fde-NA (0) + | | | heap_xmax_invalid: true 0x1fde-NA (0) + | | | heap_xmax_is_multi: false 0x1fde-NA (0) + | | | heap_updated: false 0x1fde-NA (0) + | | | heap_moved_off: false 0x1fde-NA (0) + | | | heap_moved_in: false 0x1fde-NA (0) + | | | heap_moved: false 0x1fde-NA (0) +0x1fd0| 18 | . | t_hoff: 24 0x1fde-0x1fde.7 (1) +0x1fd0| 03| .| padding0: 3 0x1fdf-0x1fdf.7 (1) +0x1fe0|01 00 00 00 00 00 00 00 |........ | data: "0100000000000000" (raw bits) 0x1fe0-0x1fe7.7 (8) diff --git a/format/postgres/testdata/flavours/pgproee15/pg_control b/format/postgres/testdata/flavours/pgproee15/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..7181ef53eeaf08271513ce6b944f7ce0287e4ad4 GIT binary patch literal 8192 zcmaF!NMt3WvssD=t80K|IWG?z0|aEdn5BSN58}O<K=ceK%?M<}Fi8CGGwu+uf&>r` z2tKiDf#hM}E>s>a29<~Lv!M3C)Wc|)xi6SuB7|v}nIJtJK;>LeEe=o`BnATQ*Nhw) z6hJJX%fU1QqXUo!VxD0K5<rC@vp_i3>aC8+k(+6}bNAamV_oeUy~?xX==)#Wl$%ng zYbbe|F);l9-z6cx6R30)jE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J shQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz<`AS00kE-jsO4v literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/pgproee15/pg_control.fqtest b/format/postgres/testdata/flavours/pgproee15/pg_control.fqtest new file mode 100644 index 000000000..41cd787a2 --- /dev/null +++ b/format/postgres/testdata/flavours/pgproee15/pg_control.fqtest @@ -0,0 +1,68 @@ +$ fq -d pg_control -o flavour=pgproee15 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|ec e2 14 a9 01 43 36 64 |.....C6d | system_identifier: 7221032726945915628 0x0-0x7.7 (8) +0x0000| 14 05 45 50 | ..EP | pg_control_version: "Postgres Pro Enterprise 1300" (1346700564) 0x8-0xb.7 (4) +0x0000| 39 77 0d 0c| 9w..| catalog_version_no: 202209081 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 6b 44 36 64 00 00 00 00| kD6d....| time: "Wed, 12 Apr 2023 05:40:59 UTC" (1681278059) 0x18-0x1f.7 (8) +0x0020|e0 5f 4b 02 00 00 00 00 |._K..... | check_point: "0/24B5FE0" (38494176) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x9f.7 (120) +0x0020| 98 5f 4b 02 00 00 00 00| ._K.....| redo: "0/24B5F98" (38494104) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|fd e6 0b 54 02 00 00 00 |...T.... | next_xid: 10000000765 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x48-0x4b.7 (4) +0x0040| 00 00 00 00| ....| hole2: 0 0x4c-0x4f.7 (4) +0x0050|00 f2 05 2a 01 00 00 00 |...*.... | next_multi: 5000000000 0x50-0x57.7 (8) +0x0050| 00 00 00 00 00 00 00 00| ........| next_multi_offset: 0 0x58-0x5f.7 (8) +0x0060|dd e6 0b 54 02 00 00 00 |...T.... | oldest_xid: 10000000733 0x60-0x67.7 (8) +0x0060| 01 00 00 00 | .... | oldest_xid_db: 1 0x68-0x6b.7 (4) +0x0060| 00 00 00 00| ....| hole3: 0 0x6c-0x6f.7 (4) +0x0070|00 f2 05 2a 01 00 00 00 |...*.... | oldest_multi: 5000000000 0x70-0x77.7 (8) +0x0070| 01 00 00 00 | .... | oldest_multi_db: 1 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| hole4: 0 0x7c-0x7f.7 (4) +0x0080|6a 44 36 64 00 00 00 00 |jD6d.... | time: "Wed, 12 Apr 2023 05:40:58 UTC" (1681278058) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| oldest_commit_ts_xid: 0 0x88-0x8f.7 (8) +0x0090|00 00 00 00 00 00 00 00 |........ | newest_commit_ts_xid: 0 0x90-0x97.7 (8) +0x0090| fd e6 0b 54 02 00 00 00| ...T....| oldest_active_xid: 10000000765 0x98-0x9f.7 (8) +0x00a0|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0xa0-0xa7.7 (8) +0x00a0| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0xa8-0xaf.7 (8) +0x00b0|00 00 00 00 |.... | min_recovery_point_tli: 0 0xb0-0xb3.7 (4) +0x00b0| 00 00 00 00 | .... | hole5: 0 0xb4-0xb7.7 (4) +0x00b0| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0xb8-0xbf.7 (8) +0x00c0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xc0-0xc7.7 (8) +0x00c0| 00 | . | backup_end_required: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xcc-0xcf.7 (4) +0x00d0|00 |. | wal_log_hints: 0 0xd0-0xd0.7 (1) +0x00d0| 00 00 00 | ... | hole7: 0 0xd1-0xd3.7 (3) +0x00d0| e8 03 00 00 | .... | max_connections: 1000 0xd4-0xd7.7 (4) +0x00d0| 08 00 00 00 | .... | max_worker_processes: 8 0xd8-0xdb.7 (4) +0x00d0| 0a 00 00 00| ....| max_wal_senders: 10 0xdc-0xdf.7 (4) +0x00e0|00 00 00 00 |.... | max_prepared_xacts: 0 0xe0-0xe3.7 (4) +0x00e0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xe4-0xe7.7 (4) +0x00e0| 00 | . | track_commit_timestamp: 0 0xe8-0xe8.7 (1) +0x00e0| 00 00 00 | ... | hole8: 0 0xe9-0xeb.7 (3) +0x00e0| 08 00 00 00| ....| max_align: 8 0xec-0xef.7 (4) +0x00f0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xf0-0xf7.7 (8) +0x00f0| 00 20 00 00 | . .. | blcksz: 8192 0xf8-0xfb.7 (4) +0x00f0| 00 00 02 00| ....| relseg_size: 131072 0xfc-0xff.7 (4) +0x0100|00 20 00 00 |. .. | xlog_blcksz: 8192 0x100-0x103.7 (4) +0x0100| 00 00 00 01 | .... | xlog_seg_size: 16777216 0x104-0x107.7 (4) +0x0100| 40 00 00 00 | @... | name_data_len: 64 0x108-0x10b.7 (4) +0x0100| 20 00 00 00| ...| index_max_keys: 32 0x10c-0x10f.7 (4) +0x0110|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0x110-0x113.7 (4) +0x0110| 00 08 00 00 | .... | loblksize: 2048 0x114-0x117.7 (4) +0x0110| 01 | . | float8_by_val: 1 0x118-0x118.7 (1) +0x0110| 00 00 00 | ... | hole9: 0 0x119-0x11b.7 (3) +0x0110| 01 00 00 00| ....| data_checksum_version: 1 0x11c-0x11f.7 (4) +0x0120|5d 3a ed 2c 34 c4 d9 66 0d 9d bf 3d e6 05 ab 45|]:.,4..f...=...E| mock_authentication_nonce: "5d3aed2c34c4d9660d9dbf3de605ab455baa4974c5effab..." (raw bits) 0x120-0x13f.7 (32) +0x0130|5b aa 49 74 c5 ef fa b6 23 82 65 97 28 22 49 36|[.It....#.e.("I6| +0x0140|00 00 ff ff |.... | pg_old_version: 4294901760 0x140-0x143.7 (4) +0x0140| 8a 18 1f b9 | .... | crc: 3105822858 0x144-0x147.7 (4) +0x0140| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x148-0x1fff.7 (7864) +0x0150|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7864) | | diff --git a/format/postgres/testdata/flavours/postgres15/16400 b/format/postgres/testdata/flavours/postgres15/16400 new file mode 100644 index 0000000000000000000000000000000000000000..f43ce0cc7573b9248f37c8e6a4a1c0a36d0e793f GIT binary patch literal 16384 zcmeI%#cq@V6vgpx+NryHJ9T$A9E!VZad)SiTZ$Jc?(hIS7H>d!0M4Z6F6f>)8@}Y` zq_db`(=H~Ne-H%0T>DgL`gb@;4_PRPgd=z<u<yTu0B7H@IQxpl*%vI%K4WqA35&Cj zSe$*p;_N*ZXYa5$dyB={8!XOVV{!Hhi?f$loXufz_5zEu=UALQ!{Y2I7H6|qoISzf z>@gN+kFYp<h{f3hEY9v@adr=jvl%ST?qYE^jTJmU<L1#U+T%euh)XLD#_@BAul<Pp zgNN_E&>y2eCh|w=kBa;e`XeHLnEtTHAEG}b@(1Y;iu?ik10uhle!s}?qu(d;d+GOz z{2ux}BEOq{x5)3J-zD-p>353!4*DG;zny-&$Zw<HCh}Y9w~G80`Yj^AnSQg#Z=&BM z@*C+liu?xp4I;mue!a-AqhBZTYw6dD{2KZ-BEOn`waAaqkBIy#`c)#ol76Mgub^Kc z^2_O$i~KVBWg@?neyPYWp<g2Mi|H4O{37~ABEOJ+p~x?wUm)`H>F105Jo<SeKbL;4 z$j_mlBl5H9XN&wS`qA&h72khn($5t68T2zmemebhk)K9CP2{K2PZjwo^ixEBGW}$c zpF}@N<R{Wk6!{7C6GVQPepuwk(~lSVarC2ER`K~0q93(m;e!b#C#FL6v;X^l^luUC z=kNX=LieBV|99|<#Nz+I(D(j-TjYEHza{d$|KAk(-v4iieDD9)MZWj{Ya-wK|5cIi z{r`%{_x^ub<a__WB=WugUljS?|1XGq@BimTzW4ugBH#P}S&{Gk|BT4@{(oBJd;dQr z^1c6`6#3r&Pl$Z)|HnnX_y1!e-~0bjk?;Ngh{*T;e^}&u|DP23-v1AYeDD7UMZWj{ z10vu1|9+A0{ePdx_x`_E<a__$Bl5lf?-u#q|96Re@BceRzW4tfBH#P}c9HM>f1Akn z{=Ze^d;i}e^1c6W7Wv-)H;H`j{~JZV_x}wd-~0c1k?;L~oyhn8zgFaX|6e2Wz5lNk z`QHC0M85a`RU+T}|4NbX{eOkX_x`_J<a_^LCi1=iFBSRT|Cfk-@BfQMzW4t{G4lTa DY5L^0 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres15/16400.fqtest b/format/postgres/testdata/flavours/postgres15/16400.fqtest new file mode 100644 index 000000000..dd209b1cd --- /dev/null +++ b/format/postgres/testdata/flavours/postgres15/16400.fqtest @@ -0,0 +1,21 @@ +$ fq -d pg_heap -o flavour=postgres15 ".[0].pd_linp[0, 1, 2, -1] | dv" 16400 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[0]{}: item_id 0x18-0x1b.7 (4) +0x10| 80 9f f2 00 | .... | item_id_data: 15900544 0x18-0x1b.7 (4) + | | | lp_off: 8064 0x1c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x1c-NA (0) + | | | lp_len: 121 0x1c-NA (0) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[1]{}: item_id 0x1c-0x1f.7 (4) +0x10| 00 9f f2 00| ....| item_id_data: 15900416 0x1c-0x1f.7 (4) + | | | lp_off: 7936 0x20-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x20-NA (0) + | | | lp_len: 121 0x20-NA (0) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[2]{}: item_id 0x20-0x23.7 (4) +0x20|80 9e f2 00 |.... | item_id_data: 15900288 0x20-0x23.7 (4) + | | | lp_off: 7808 0x24-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x24-NA (0) + | | | lp_len: 121 0x24-NA (0) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].pd_linp[60]{}: item_id 0x108-0x10b.7 (4) +0x100| 80 81 f2 00 | .... | item_id_data: 15892864 0x108-0x10b.7 (4) + | | | lp_off: 384 0x10c-NA (0) + | | | lp_flags: "LP_NORMAL" (1) 0x10c-NA (0) + | | | lp_len: 121 0x10c-NA (0) diff --git a/format/postgres/testdata/flavours/postgres15/16401 b/format/postgres/testdata/flavours/postgres15/16401 new file mode 100644 index 0000000000000000000000000000000000000000..5765b6f859b5e66b170a069689120a5ecb0c77c9 GIT binary patch literal 8192 zcmeIu!3l&w5Cp(p-H#av3T`MyXbPq#Tmlz@iU#4M=F?2Sno5%Y*1BP;nR6^@wOv(? zeZ9jGAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0v{0gb<c?UZYk+ghOsa2 Fe*(Yv1^NI0 literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres15/16401.fqtest b/format/postgres/testdata/flavours/postgres15/16401.fqtest new file mode 100644 index 000000000..94358c027 --- /dev/null +++ b/format/postgres/testdata/flavours/postgres15/16401.fqtest @@ -0,0 +1,93 @@ +$ fq -d pg_heap -o flavour=postgres15 ".[0].tuples[0,-1] | dv" 16401 + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fe0-0x1fff.7 (32) + | | | header{}: 0x1fe0-0x1ff7.7 (24) + | | | t_choice{}: 0x1fe0-0x1feb.7 (12) + | | | t_heap{}: 0x1fe0-0x1feb.7 (12) +0x1fe0|e3 02 00 00 |.... | t_xmin: 739 0x1fe0-0x1fe3.7 (4) +0x1fe0| 00 00 00 00 | .... | t_xmax: 0 0x1fe4-0x1fe7.7 (4) + | | | t_field3{}: 0x1fe8-0x1feb.7 (4) +0x1fe0| 04 00 00 00 | .... | t_cid: 4 0x1fe8-0x1feb.7 (4) +0x1fe0| 04 00 00 00 | .... | t_xvac: 4 0x1fe8-0x1feb.7 (4) + | | | t_datum{}: 0x1fe0-0x1feb.7 (12) +0x1fe0|e3 02 00 00 |.... | datum_len_: 739 0x1fe0-0x1fe3.7 (4) +0x1fe0| 00 00 00 00 | .... | datum_typmod: 0 0x1fe4-0x1fe7.7 (4) +0x1fe0| 04 00 00 00 | .... | datum_typeid: 4 0x1fe8-0x1feb.7 (4) + | | | t_ctid{}: 0x1fec-0x1ff1.7 (6) +0x1fe0| 00 00 00 00| ....| ip_blkid: 0 0x1fec-0x1fef.7 (4) +0x1ff0|01 00 |.. | ip_posid: 1 0x1ff0-0x1ff1.7 (2) +0x1ff0| 03 00 | .. | t_infomask2: 3 0x1ff2-0x1ff3.7 (2) + | | | infomask2{}: 0x1ff4-NA (0) + | | | heap_keys_updated: false 0x1ff4-NA (0) + | | | heap_hot_updated: false 0x1ff4-NA (0) + | | | heap_only_tuple: false 0x1ff4-NA (0) +0x1ff0| 01 09 | .. | t_infomask: 2305 0x1ff4-0x1ff5.7 (2) + | | | infomask{}: 0x1ff6-NA (0) + | | | heap_hasnull: true 0x1ff6-NA (0) + | | | heap_hasvarwidth: false 0x1ff6-NA (0) + | | | heap_hasexternal: false 0x1ff6-NA (0) + | | | heap_hasoid_old: false 0x1ff6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1ff6-NA (0) + | | | heap_combocid: false 0x1ff6-NA (0) + | | | heap_xmax_excl_lock: false 0x1ff6-NA (0) + | | | heap_xmax_lock_only: false 0x1ff6-NA (0) + | | | heap_xmax_shr_lock: false 0x1ff6-NA (0) + | | | heap_lock_mask: false 0x1ff6-NA (0) + | | | heap_xmin_committed: true 0x1ff6-NA (0) + | | | heap_xmin_invalid: false 0x1ff6-NA (0) + | | | heap_xmin_frozen: true 0x1ff6-NA (0) + | | | heap_xmax_committed: false 0x1ff6-NA (0) + | | | heap_xmax_invalid: true 0x1ff6-NA (0) + | | | heap_xmax_is_multi: false 0x1ff6-NA (0) + | | | heap_updated: false 0x1ff6-NA (0) + | | | heap_moved_off: false 0x1ff6-NA (0) + | | | heap_moved_in: false 0x1ff6-NA (0) + | | | heap_moved: false 0x1ff6-NA (0) +0x1ff0| 18 | . | t_hoff: 24 0x1ff6-0x1ff6.7 (1) +0x1ff0| 03 | . | padding0: 3 0x1ff7-0x1ff7.7 (1) +0x1ff0| 01 00 00 00 00 00 00 00| ........| data: "0100000000000000" (raw bits) 0x1ff8-0x1fff.7 (8) + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[0].tuples[0]{}: tuple 0x1fe0-0x1fff.7 (32) + | | | header{}: 0x1fe0-0x1ff7.7 (24) + | | | t_choice{}: 0x1fe0-0x1feb.7 (12) + | | | t_heap{}: 0x1fe0-0x1feb.7 (12) +0x1fe0|e3 02 00 00 |.... | t_xmin: 739 0x1fe0-0x1fe3.7 (4) +0x1fe0| 00 00 00 00 | .... | t_xmax: 0 0x1fe4-0x1fe7.7 (4) + | | | t_field3{}: 0x1fe8-0x1feb.7 (4) +0x1fe0| 04 00 00 00 | .... | t_cid: 4 0x1fe8-0x1feb.7 (4) +0x1fe0| 04 00 00 00 | .... | t_xvac: 4 0x1fe8-0x1feb.7 (4) + | | | t_datum{}: 0x1fe0-0x1feb.7 (12) +0x1fe0|e3 02 00 00 |.... | datum_len_: 739 0x1fe0-0x1fe3.7 (4) +0x1fe0| 00 00 00 00 | .... | datum_typmod: 0 0x1fe4-0x1fe7.7 (4) +0x1fe0| 04 00 00 00 | .... | datum_typeid: 4 0x1fe8-0x1feb.7 (4) + | | | t_ctid{}: 0x1fec-0x1ff1.7 (6) +0x1fe0| 00 00 00 00| ....| ip_blkid: 0 0x1fec-0x1fef.7 (4) +0x1ff0|01 00 |.. | ip_posid: 1 0x1ff0-0x1ff1.7 (2) +0x1ff0| 03 00 | .. | t_infomask2: 3 0x1ff2-0x1ff3.7 (2) + | | | infomask2{}: 0x1ff4-NA (0) + | | | heap_keys_updated: false 0x1ff4-NA (0) + | | | heap_hot_updated: false 0x1ff4-NA (0) + | | | heap_only_tuple: false 0x1ff4-NA (0) +0x1ff0| 01 09 | .. | t_infomask: 2305 0x1ff4-0x1ff5.7 (2) + | | | infomask{}: 0x1ff6-NA (0) + | | | heap_hasnull: true 0x1ff6-NA (0) + | | | heap_hasvarwidth: false 0x1ff6-NA (0) + | | | heap_hasexternal: false 0x1ff6-NA (0) + | | | heap_hasoid_old: false 0x1ff6-NA (0) + | | | heap_xmax_keyshr_lock: false 0x1ff6-NA (0) + | | | heap_combocid: false 0x1ff6-NA (0) + | | | heap_xmax_excl_lock: false 0x1ff6-NA (0) + | | | heap_xmax_lock_only: false 0x1ff6-NA (0) + | | | heap_xmax_shr_lock: false 0x1ff6-NA (0) + | | | heap_lock_mask: false 0x1ff6-NA (0) + | | | heap_xmin_committed: true 0x1ff6-NA (0) + | | | heap_xmin_invalid: false 0x1ff6-NA (0) + | | | heap_xmin_frozen: true 0x1ff6-NA (0) + | | | heap_xmax_committed: false 0x1ff6-NA (0) + | | | heap_xmax_invalid: true 0x1ff6-NA (0) + | | | heap_xmax_is_multi: false 0x1ff6-NA (0) + | | | heap_updated: false 0x1ff6-NA (0) + | | | heap_moved_off: false 0x1ff6-NA (0) + | | | heap_moved_in: false 0x1ff6-NA (0) + | | | heap_moved: false 0x1ff6-NA (0) +0x1ff0| 18 | . | t_hoff: 24 0x1ff6-0x1ff6.7 (1) +0x1ff0| 03 | . | padding0: 3 0x1ff7-0x1ff7.7 (1) +0x1ff0| 01 00 00 00 00 00 00 00| ........| data: "0100000000000000" (raw bits) 0x1ff8-0x1fff.7 (8) diff --git a/format/postgres/testdata/flavours/postgres15/pg_control b/format/postgres/testdata/flavours/postgres15/pg_control new file mode 100644 index 0000000000000000000000000000000000000000..14a875bf0ad131627f8905a3194324c6e8d8cdf2 GIT binary patch literal 8192 zcmc~<wnt>r6XO&SRt5&ua$X)b1_)4pW1IqF{rKs`1fmZ>X+|I$hC$-5z_LI_0z@1n zb_OU0Qv;$w0A?P9htT(e874xQhM5J@!vR#z1=ZpJr9omK(0<LxkwF2(0y+dtGcY;; zc_8K)b|3*%2r>(V%a?B3AiB<^>(RpYMSP9-V|3XBf*<dxe9W>u<-T(GwGB6KUpNa? zHVQ^VU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n eMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmwhX4TK{U{*- literal 0 HcmV?d00001 diff --git a/format/postgres/testdata/flavours/postgres15/pg_control.fqtest b/format/postgres/testdata/flavours/postgres15/pg_control.fqtest new file mode 100644 index 000000000..434c3c77d --- /dev/null +++ b/format/postgres/testdata/flavours/postgres15/pg_control.fqtest @@ -0,0 +1,67 @@ +$ fq -d pg_control -o flavour=postgres15 dv pg_control + |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: pg_control (pg_control) 0x0-0x1fff.7 (8192) +0x0000|6c a6 bc 14 92 e4 33 64 |l.....3d | system_identifier: 7220365943669302892 0x0-0x7.7 (8) +0x0000| 14 05 00 00 | .... | pg_control_version: 1300 0x8-0xb.7 (4) +0x0000| 25 77 0d 0c| %w..| catalog_version_no: 202209061 0xc-0xf.7 (4) +0x0010|06 00 00 00 |.... | state: "DB_IN_PRODUCTION" (6) 0x10-0x13.7 (4) +0x0010| 00 00 00 00 | .... | hole0: 0 0x14-0x17.7 (4) +0x0010| 27 ec 33 64 00 00 00 00| '.3d....| time: "Mon, 10 Apr 2023 10:59:51 UTC" (1681124391) 0x18-0x1f.7 (8) +0x0020|f8 f9 42 02 00 00 00 00 |..B..... | check_point: "0/242F9F8" (37943800) 0x20-0x27.7 (8) + | | | check_point_copy{}: 0x28-0x7f.7 (88) +0x0020| c0 f9 42 02 00 00 00 00| ..B.....| redo: "0/242F9C0" (37943744) 0x28-0x2f.7 (8) +0x0030|01 00 00 00 |.... | this_time_line_id: 1 0x30-0x33.7 (4) +0x0030| 01 00 00 00 | .... | prev_time_line_id: 1 0x34-0x37.7 (4) +0x0030| 01 | . | full_page_writes: 1 0x38-0x38.7 (1) +0x0030| 00 00 00 00 00 00 00| .......| hole1: 0 0x39-0x3f.7 (7) +0x0040|ea 02 00 00 00 00 00 00 |........ | next_xid: 746 0x40-0x47.7 (8) +0x0040| 00 60 00 00 | .`.. | next_oid: 24576 0x48-0x4b.7 (4) +0x0040| 01 00 00 00| ....| next_multi: 1 0x4c-0x4f.7 (4) +0x0050|00 00 00 00 |.... | next_multi_offset: 0 0x50-0x53.7 (4) +0x0050| cc 02 00 00 | .... | oldest_xid: 716 0x54-0x57.7 (4) +0x0050| 01 00 00 00 | .... | oldest_xid_db: 1 0x58-0x5b.7 (4) +0x0050| 01 00 00 00| ....| oldest_multi: 1 0x5c-0x5f.7 (4) +0x0060|01 00 00 00 |.... | oldest_multi_db: 1 0x60-0x63.7 (4) +0x0060| 00 00 00 00 | .... | hole2: 0 0x64-0x67.7 (4) +0x0060| 27 ec 33 64 00 00 00 00| '.3d....| time: "Mon, 10 Apr 2023 10:59:51 UTC" (1681124391) 0x68-0x6f.7 (8) +0x0070|00 00 00 00 |.... | oldest_commit_ts_xid: 0 0x70-0x73.7 (4) +0x0070| 00 00 00 00 | .... | newest_commit_ts_xid: 0 0x74-0x77.7 (4) +0x0070| ea 02 00 00 | .... | oldest_active_xid: 746 0x78-0x7b.7 (4) +0x0070| 00 00 00 00| ....| padding0: 0 0x7c-0x7f.7 (4) +0x0080|e8 03 00 00 00 00 00 00 |........ | unlogged_lsn: "0/3E8" (1000) 0x80-0x87.7 (8) +0x0080| 00 00 00 00 00 00 00 00| ........| min_recovery_point: "0/0" (0) 0x88-0x8f.7 (8) +0x0090|00 00 00 00 |.... | min_recovery_point_tli: 0 0x90-0x93.7 (4) +0x0090| 00 00 00 00 | .... | hole3: 0 0x94-0x97.7 (4) +0x0090| 00 00 00 00 00 00 00 00| ........| backup_start_point: "0/0" (0) 0x98-0x9f.7 (8) +0x00a0|00 00 00 00 00 00 00 00 |........ | backup_end_point: "0/0" (0) 0xa0-0xa7.7 (8) +0x00a0| 00 | . | backup_end_required: 0 0xa8-0xa8.7 (1) +0x00a0| 00 00 00 | ... | hole4: 0 0xa9-0xab.7 (3) +0x00a0| 01 00 00 00| ....| wal_level: "WAL_LEVEL_REPLICA" (1) 0xac-0xaf.7 (4) +0x00b0|00 |. | wal_log_hints: 0 0xb0-0xb0.7 (1) +0x00b0| 00 00 00 | ... | hole5: 0 0xb1-0xb3.7 (3) +0x00b0| e8 03 00 00 | .... | max_connections: 1000 0xb4-0xb7.7 (4) +0x00b0| 08 00 00 00 | .... | max_worker_processes: 8 0xb8-0xbb.7 (4) +0x00b0| 0a 00 00 00| ....| max_wal_senders: 10 0xbc-0xbf.7 (4) +0x00c0|00 00 00 00 |.... | max_prepared_xacts: 0 0xc0-0xc3.7 (4) +0x00c0| 40 00 00 00 | @... | max_locks_per_xact: 64 0xc4-0xc7.7 (4) +0x00c0| 00 | . | track_commit_timestamp: 0 0xc8-0xc8.7 (1) +0x00c0| 00 00 00 | ... | hole6: 0 0xc9-0xcb.7 (3) +0x00c0| 08 00 00 00| ....| max_align: 8 0xcc-0xcf.7 (4) +0x00d0|00 00 00 00 87 d6 32 41 |......2A | float_format: 1.234567e+06 0xd0-0xd7.7 (8) +0x00d0| 00 20 00 00 | . .. | blcksz: 8192 0xd8-0xdb.7 (4) +0x00d0| 00 00 02 00| ....| relseg_size: 131072 0xdc-0xdf.7 (4) +0x00e0|00 20 00 00 |. .. | xlog_blcksz: 8192 0xe0-0xe3.7 (4) +0x00e0| 00 00 00 01 | .... | xlog_seg_size: 16777216 0xe4-0xe7.7 (4) +0x00e0| 40 00 00 00 | @... | name_data_len: 64 0xe8-0xeb.7 (4) +0x00e0| 20 00 00 00| ...| index_max_keys: 32 0xec-0xef.7 (4) +0x00f0|cc 07 00 00 |.... | toast_max_chunk_size: 1996 0xf0-0xf3.7 (4) +0x00f0| 00 08 00 00 | .... | loblksize: 2048 0xf4-0xf7.7 (4) +0x00f0| 01 | . | float8_by_val: 1 0xf8-0xf8.7 (1) +0x00f0| 00 00 00 | ... | hole7: 0 0xf9-0xfb.7 (3) +0x00f0| 01 00 00 00| ....| data_checksum_version: 1 0xfc-0xff.7 (4) +0x0100|77 a5 b6 b0 15 ae 34 8a e2 a1 87 a2 0e 81 df 5c|w.....4........\| mock_authentication_nonce: "77a5b6b015ae348ae2a187a20e81df5c2d061053e3bc79e..." (raw bits) 0x100-0x11f.7 (32) +0x0110|2d 06 10 53 e3 bc 79 e3 04 a7 64 df 23 57 d6 b0|-..S..y...d.#W..| +0x0120|d9 db d0 cd |.... | crc: 3453017049 0x120-0x123.7 (4) +0x0120| 00 00 00 00 | .... | padding1: 0 0x124-0x127.7 (4) +0x0120| 00 00 00 00 00 00 00 00| ........| unused: raw bits 0x128-0x1fff.7 (7896) +0x0130|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| +* |until 0x1fff.7 (end) (7896) | | From e5f15c5fed0fff6e1f0df8c2fe76f60225bc7f0d Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Wed, 3 May 2023 09:45:25 +0300 Subject: [PATCH 133/141] postgres: fix compilation, fix tests --- format/all/all.fqtest | 3 + format/format.go | 6 +- .../common/pg_btree/postgres/pg_btree.go | 2 +- format/postgres/common/pg_control.go | 77 ++++++++++--------- format/postgres/common/pg_heap.go | 8 +- .../common/pg_heap/postgres/heap_page.go | 6 +- .../common/pg_heap/postgres/pg_heap.go | 6 +- .../postgres/flavours/pgpro10/pg_control.go | 2 +- .../postgres/flavours/pgpro11/pg_control.go | 2 +- .../postgres/flavours/pgpro12/pg_control.go | 2 +- .../postgres/flavours/pgpro13/pg_control.go | 2 +- .../postgres/flavours/pgpro14/pg_control.go | 2 +- .../postgres/flavours/pgproee10/pg_control.go | 2 +- .../postgres/flavours/pgproee11/pg_control.go | 2 +- .../postgres/flavours/pgproee12/pg_control.go | 2 +- .../postgres/flavours/pgproee13/pg_control.go | 2 +- .../postgres/flavours/pgproee14/pg_control.go | 2 +- .../postgres/flavours/pgproee15/pg_control.go | 2 +- .../flavours/postgres10/pg_control.go | 2 +- .../flavours/postgres11/pg_control.go | 2 +- .../flavours/postgres12/pg_control.go | 2 +- .../flavours/postgres13/pg_control.go | 2 +- .../flavours/postgres14/pg_control.go | 2 +- format/postgres/pg_btree.go | 11 ++- format/postgres/pg_control.go | 71 +++++++++-------- format/postgres/pg_heap.go | 11 ++- 26 files changed, 119 insertions(+), 114 deletions(-) diff --git a/format/all/all.fqtest b/format/all/all.fqtest index 068d8f7e2..0598879ec 100644 --- a/format/all/all.fqtest +++ b/format/all/all.fqtest @@ -126,6 +126,9 @@ ogg_page OGG page opus_packet Opus packet pcap PCAP packet capture pcapng PCAPNG packet capture +pg_btree PostgreSQL btree index file +pg_control PostgreSQL control file +pg_heap PostgreSQL heap file png Portable Network Graphics file prores_frame Apple ProRes frame protobuf Protobuf diff --git a/format/format.go b/format/format.go index 92f5f5a2c..4ef71e68f 100644 --- a/format/format.go +++ b/format/format.go @@ -112,9 +112,9 @@ var ( Opus_Packet = &decode.Group{Name: "opus_packet"} PCAP = &decode.Group{Name: "pcap"} PCAPNG = &decode.Group{Name: "pcapng"} - PG_BTREE = "pg_btree" - PG_CONTROL = "pg_control" - PG_HEAP = "pg_heap" + PG_BTREE = &decode.Group{Name: "pg_btree"} + PG_CONTROL = &decode.Group{Name: "pg_control"} + PG_HEAP = &decode.Group{Name: "pg_heap"} PNG = &decode.Group{Name: "png"} Prores_Frame = &decode.Group{Name: "prores_frame"} Protobuf = &decode.Group{Name: "protobuf"} diff --git a/format/postgres/common/pg_btree/postgres/pg_btree.go b/format/postgres/common/pg_btree/postgres/pg_btree.go index e349ffb62..2c2ccb853 100644 --- a/format/postgres/common/pg_btree/postgres/pg_btree.go +++ b/format/postgres/common/pg_btree/postgres/pg_btree.go @@ -272,7 +272,7 @@ func decodeIndexTuples(btree *BTree, d *decode.D) { d.FieldValueBool("has_nulls", hasNulls) d.FieldValueBool("has_var_widths", hasVarWidths) }) - d.FieldValueU("size", size) + d.FieldValueUint("size", size) if size < IndexTupleDataSize { d.Fatalf("invalid size of tuple = %d\n", size) } diff --git a/format/postgres/common/pg_control.go b/format/postgres/common/pg_control.go index 37bf05d7c..5c372b367 100644 --- a/format/postgres/common/pg_control.go +++ b/format/postgres/common/pg_control.go @@ -8,17 +8,18 @@ import ( "time" ) -//typedef enum DBState -//{ -// DB_STARTUP = 0, -// DB_SHUTDOWNED, -// DB_SHUTDOWNED_IN_RECOVERY, -// DB_SHUTDOWNING, -// DB_IN_CRASH_RECOVERY, -// DB_IN_ARCHIVE_RECOVERY, -// DB_IN_PRODUCTION -//} DBState; -var DBState = scalar.UToScalar{ +// typedef enum DBState +// +// { +// DB_STARTUP = 0, +// DB_SHUTDOWNED, +// DB_SHUTDOWNED_IN_RECOVERY, +// DB_SHUTDOWNING, +// DB_IN_CRASH_RECOVERY, +// DB_IN_ARCHIVE_RECOVERY, +// DB_IN_PRODUCTION +// } DBState; +var DBState = scalar.UintMap{ 0: {Sym: "DB_STARTUP"}, 1: {Sym: "DB_SHUTDOWNED"}, 2: {Sym: "DB_SHUTDOWNED_IN_RECOVERY"}, @@ -28,13 +29,14 @@ var DBState = scalar.UToScalar{ 6: {Sym: "DB_IN_PRODUCTION"}, } -//typedef enum WalLevel -//{ -// WAL_LEVEL_MINIMAL = 0, -// WAL_LEVEL_REPLICA, -// WAL_LEVEL_LOGICAL -//} WalLevel; -var WalLevel = scalar.SToScalar{ +// typedef enum WalLevel +// +// { +// WAL_LEVEL_MINIMAL = 0, +// WAL_LEVEL_REPLICA, +// WAL_LEVEL_LOGICAL +// } WalLevel; +var WalLevel = scalar.SintMap{ 0: {Sym: "WAL_LEVEL_MINIMAL"}, 1: {Sym: "WAL_LEVEL_REPLICA"}, 2: {Sym: "WAL_LEVEL_LOGICAL"}, @@ -42,8 +44,9 @@ var WalLevel = scalar.SToScalar{ type icuVersionMapper struct{} -func (m icuVersionMapper) MapScalar(s scalar.S) (scalar.S, error) { - a := s.ActualU() +func (m icuVersionMapper) MapUint(s scalar.Uint) (scalar.Uint, error) { + s.ScalarActual() + a := s.Actual major := a & 0xff minor := (a >> 8) & 0xff v1 := (a >> 16) & 0xff @@ -56,8 +59,8 @@ var IcuVersionMapper = icuVersionMapper{} type xLogRecPtrMapper struct{} -func (m xLogRecPtrMapper) MapScalar(s scalar.S) (scalar.S, error) { - v := s.ActualU() +func (m xLogRecPtrMapper) MapUint(s scalar.Uint) (scalar.Uint, error) { + v := s.Actual s.Sym = fmt.Sprintf("%X/%X", v>>32, uint32(v)) return s, nil } @@ -67,8 +70,8 @@ var LocPtrMapper = xLogRecPtrMapper{} type nextFullXidMapper struct{} -func (m nextFullXidMapper) MapScalar(s scalar.S) (scalar.S, error) { - v := s.ActualU() +func (m nextFullXidMapper) MapUint(s scalar.Uint) (scalar.Uint, error) { + v := s.Actual s.Sym = fmt.Sprintf("%d:%d", v>>32, uint32(v)) return s, nil } @@ -77,8 +80,8 @@ var NextFullXidMapper = nextFullXidMapper{} type timeMapper struct{} -func (m timeMapper) MapScalar(s scalar.S) (scalar.S, error) { - ut := s.ActualS() +func (m timeMapper) MapSint(s scalar.Sint) (scalar.Sint, error) { + ut := s.Actual t := time.Unix(ut, 0) s.Sym = t.UTC().Format(time.RFC1123) return s, nil @@ -87,12 +90,14 @@ func (m timeMapper) MapScalar(s scalar.S) (scalar.S, error) { var TimeMapper = timeMapper{} // typedef enum -//{ -// PG_UNKNOWN = 0xFFFF, -// PG_ORIGINAL = 0, -// PGPRO_STANDARD = ('P'<<8|'P'), -// PGPRO_ENTERPRISE = ('P'<<8|'E'), -//} PgEdition; +// +// { +// PG_UNKNOWN = 0xFFFF, +// PG_ORIGINAL = 0, +// PGPRO_STANDARD = ('P'<<8|'P'), +// PGPRO_ENTERPRISE = ('P'<<8|'E'), +// } PgEdition; +// //nolint:revive const ( PG_UNKNOWN = 0xFFFF @@ -108,8 +113,8 @@ const ( type versionMapper struct{} -func (m versionMapper) MapScalar(s scalar.S) (scalar.S, error) { - v := s.ActualU() +func (m versionMapper) MapUint(s scalar.Uint) (scalar.Uint, error) { + v := s.Actual v1, v2 := ParsePgProVersion(uint32(v)) switch v1 { case PG_UNKNOWN: @@ -134,8 +139,8 @@ func ParsePgProVersion(v uint32) (pgProVersion uint32, oriVer uint32) { type hexMapper struct{} -func (m hexMapper) MapScalar(s scalar.S) (scalar.S, error) { - v := s.ActualU() +func (m hexMapper) MapUint(s scalar.Uint) (scalar.Uint, error) { + v := s.Actual s.Sym = fmt.Sprintf("%X", v) return s, nil } diff --git a/format/postgres/common/pg_heap.go b/format/postgres/common/pg_heap.go index 3ec43905d..af8532065 100644 --- a/format/postgres/common/pg_heap.go +++ b/format/postgres/common/pg_heap.go @@ -21,8 +21,8 @@ func TransactionIDIsNormal(xid uint64) bool { type lpFlagsMapper struct{} -func (m lpFlagsMapper) MapScalar(s scalar.S) (scalar.S, error) { - switch s.ActualU() { +func (m lpFlagsMapper) MapUint(s scalar.Uint) (scalar.Uint, error) { + switch s.Actual { case LP_UNUSED: s.Sym = "LP_UNUSED" case LP_NORMAL: @@ -41,8 +41,8 @@ type Mask struct { Mask uint64 } -func (m Mask) MapScalar(s scalar.S) (scalar.S, error) { - m1 := s.ActualU() +func (m Mask) MapUint(s scalar.Uint) (scalar.Uint, error) { + m1 := s.Actual v := IsMaskSet(m1, m.Mask) s.Actual = v return s, nil diff --git a/format/postgres/common/pg_heap/postgres/heap_page.go b/format/postgres/common/pg_heap/postgres/heap_page.go index 5bbb12726..db1ddae61 100644 --- a/format/postgres/common/pg_heap/postgres/heap_page.go +++ b/format/postgres/common/pg_heap/postgres/heap_page.go @@ -92,9 +92,9 @@ func decodeItemIdsInternal(page *HeapPage, d *decode.D) { itemID.Flags = uint32((itemIDData >> 15) & 0x3) itemID.Len = uint32((itemIDData >> 17) & 0x7fff) - d.FieldValueU("lp_off", uint64(itemID.Off)) - d.FieldValueU("lp_flags", uint64(itemID.Flags), common.LpFlagsMapper) - d.FieldValueU("lp_len", uint64(itemID.Len)) + d.FieldValueUint("lp_off", uint64(itemID.Off)) + d.FieldValueUint("lp_flags", uint64(itemID.Flags), common.LpFlagsMapper) + d.FieldValueUint("lp_len", uint64(itemID.Len)) page.ItemIds = append(page.ItemIds, itemID) }) diff --git a/format/postgres/common/pg_heap/postgres/pg_heap.go b/format/postgres/common/pg_heap/postgres/pg_heap.go index 2bfc7f3fb..490f737a8 100644 --- a/format/postgres/common/pg_heap/postgres/pg_heap.go +++ b/format/postgres/common/pg_heap/postgres/pg_heap.go @@ -183,7 +183,7 @@ func decodeHeapPage(heap *Heap, d *decode.D, blockNumber uint32) { d.FieldStruct("page_header", func(d *decode.D) { heap.DecodePageHeaderData(page, d) - d.FieldValueU("pd_checksum_check", uint64(checkSum)) + d.FieldValueUint("pd_checksum_check", uint64(checkSum)) sumEqual := page.PdChecksum == checkSum d.FieldValueBool("pd_checksum_check_equal", sumEqual) }) @@ -398,8 +398,8 @@ type TransactionMapper struct { Tuple *TupleD } -func (m TransactionMapper) MapScalar(s scalar.S) (scalar.S, error) { - xid := s.ActualU() +func (m TransactionMapper) MapUint(s scalar.Uint) (scalar.Uint, error) { + xid := s.Actual if m.Special.PdXidBase != 0 && m.Tuple.IsMulti && common.TransactionIDIsNormal(xid) { xid64 := xid + m.Special.PdXidBase diff --git a/format/postgres/flavours/pgpro10/pg_control.go b/format/postgres/flavours/pgpro10/pg_control.go index f8c54eb06..9cdf53a5e 100644 --- a/format/postgres/flavours/pgpro10/pg_control.go +++ b/format/postgres/flavours/pgpro10/pg_control.go @@ -6,7 +6,7 @@ import ( "github.com/wader/fq/pkg/scalar" ) -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { d.FieldU64("system_identifier") d.FieldU32("pg_control_version", common.VersionMapper) d.FieldU32("catalog_version_no") diff --git a/format/postgres/flavours/pgpro11/pg_control.go b/format/postgres/flavours/pgpro11/pg_control.go index e3301101d..e30c8bf2f 100644 --- a/format/postgres/flavours/pgpro11/pg_control.go +++ b/format/postgres/flavours/pgpro11/pg_control.go @@ -76,7 +76,7 @@ import ( // /* total size (bytes): 80 */ -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgpro12/pg_control.go b/format/postgres/flavours/pgpro12/pg_control.go index f8d287176..fdeba9413 100644 --- a/format/postgres/flavours/pgpro12/pg_control.go +++ b/format/postgres/flavours/pgpro12/pg_control.go @@ -76,7 +76,7 @@ import ( // /* total size (bytes): 88 */ -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgpro13/pg_control.go b/format/postgres/flavours/pgpro13/pg_control.go index afe827b93..fb44fb9d9 100644 --- a/format/postgres/flavours/pgpro13/pg_control.go +++ b/format/postgres/flavours/pgpro13/pg_control.go @@ -74,7 +74,7 @@ import ( /* XXX 4-byte padding */ /* total size (bytes): 88 */ -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgpro14/pg_control.go b/format/postgres/flavours/pgpro14/pg_control.go index 76186ca6a..2832049eb 100644 --- a/format/postgres/flavours/pgpro14/pg_control.go +++ b/format/postgres/flavours/pgpro14/pg_control.go @@ -74,7 +74,7 @@ import ( /* XXX 4-byte padding */ // /* total size (bytes): 88 */ -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgproee10/pg_control.go b/format/postgres/flavours/pgproee10/pg_control.go index af5f0a532..0f9e0e770 100644 --- a/format/postgres/flavours/pgproee10/pg_control.go +++ b/format/postgres/flavours/pgproee10/pg_control.go @@ -80,7 +80,7 @@ import ( // /* total size (bytes): 120 */ -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgproee11/pg_control.go b/format/postgres/flavours/pgproee11/pg_control.go index 290e0ce54..21082cf8c 100644 --- a/format/postgres/flavours/pgproee11/pg_control.go +++ b/format/postgres/flavours/pgproee11/pg_control.go @@ -81,7 +81,7 @@ import ( // /* total size (bytes): 120 */ -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgproee12/pg_control.go b/format/postgres/flavours/pgproee12/pg_control.go index 117dde36f..ea46df5cc 100644 --- a/format/postgres/flavours/pgproee12/pg_control.go +++ b/format/postgres/flavours/pgproee12/pg_control.go @@ -81,7 +81,7 @@ import ( // /* total size (bytes): 120 */ -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgproee13/pg_control.go b/format/postgres/flavours/pgproee13/pg_control.go index 21a383f84..d3149b5eb 100644 --- a/format/postgres/flavours/pgproee13/pg_control.go +++ b/format/postgres/flavours/pgproee13/pg_control.go @@ -78,7 +78,7 @@ import ( // /* total size (bytes): 120 */ -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgproee14/pg_control.go b/format/postgres/flavours/pgproee14/pg_control.go index 4b08e5ef8..fd9dd2263 100644 --- a/format/postgres/flavours/pgproee14/pg_control.go +++ b/format/postgres/flavours/pgproee14/pg_control.go @@ -78,7 +78,7 @@ import ( // /* total size (bytes): 120 */ -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/pgproee15/pg_control.go b/format/postgres/flavours/pgproee15/pg_control.go index 59a3ba7e2..db1e9d92d 100644 --- a/format/postgres/flavours/pgproee15/pg_control.go +++ b/format/postgres/flavours/pgproee15/pg_control.go @@ -76,7 +76,7 @@ import ( // /* total size (bytes): 120 */ -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/postgres10/pg_control.go b/format/postgres/flavours/postgres10/pg_control.go index dd7aadd67..ba5e37e34 100644 --- a/format/postgres/flavours/postgres10/pg_control.go +++ b/format/postgres/flavours/postgres10/pg_control.go @@ -78,7 +78,7 @@ import ( /* total size (bytes): 80 */ // -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/postgres11/pg_control.go b/format/postgres/flavours/postgres11/pg_control.go index a98f79a14..cc4a76ccb 100644 --- a/format/postgres/flavours/postgres11/pg_control.go +++ b/format/postgres/flavours/postgres11/pg_control.go @@ -76,7 +76,7 @@ import ( // /* total size (bytes): 80 */ // -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/postgres12/pg_control.go b/format/postgres/flavours/postgres12/pg_control.go index b77bec396..c0768738c 100644 --- a/format/postgres/flavours/postgres12/pg_control.go +++ b/format/postgres/flavours/postgres12/pg_control.go @@ -75,7 +75,7 @@ import ( /* XXX 4-byte padding */ // /* total size (bytes): 88 */ -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/postgres13/pg_control.go b/format/postgres/flavours/postgres13/pg_control.go index 3a86ebc51..f3d6d547e 100644 --- a/format/postgres/flavours/postgres13/pg_control.go +++ b/format/postgres/flavours/postgres13/pg_control.go @@ -74,7 +74,7 @@ import ( /* XXX 4-byte padding */ // /* total size (bytes): 88 */ -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/flavours/postgres14/pg_control.go b/format/postgres/flavours/postgres14/pg_control.go index 6ffbb5088..c9778bda3 100644 --- a/format/postgres/flavours/postgres14/pg_control.go +++ b/format/postgres/flavours/postgres14/pg_control.go @@ -74,7 +74,7 @@ import ( /* XXX 4-byte padding */ // /* total size (bytes): 88 */ -func DecodePgControl(d *decode.D, in any) any { +func DecodePgControl(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; /* 12 | 4 */ // uint32 catalog_version_no; diff --git a/format/postgres/pg_btree.go b/format/postgres/pg_btree.go index 01f71ffd1..fd1037e5d 100644 --- a/format/postgres/pg_btree.go +++ b/format/postgres/pg_btree.go @@ -14,11 +14,10 @@ import ( var pgBTreeFS embed.FS func init() { - interp.RegisterFormat(decode.Format{ - Name: format.PG_BTREE, + interp.RegisterFormat(format.PG_BTREE, &decode.Format{ Description: "PostgreSQL btree index file", DecodeFn: decodePgBTree, - DecodeInArg: format.PostgresBTreeIn{ + DefaultInArg: format.PostgresBTreeIn{ Page: 0, }, RootArray: true, @@ -27,10 +26,10 @@ func init() { interp.RegisterFS(pgBTreeFS) } -func decodePgBTree(d *decode.D, in any) any { +func decodePgBTree(d *decode.D) any { d.Endian = decode.LittleEndian - pgIn, ok := in.(format.PostgresBTreeIn) - if !ok { + var pgIn format.PostgresBTreeIn + if !d.ArgAs(&pgIn) { d.Fatalf("DecodeInArg must be PostgresBTreeIn!\n") } return postgres.DecodePgBTree(d, pgIn) diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 0da140660..69b28a1e4 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -29,11 +29,10 @@ import ( var pgControlFS embed.FS func init() { - interp.RegisterFormat(decode.Format{ - Name: format.PG_CONTROL, + interp.RegisterFormat(format.PG_CONTROL, &decode.Format{ Description: "PostgreSQL control file", DecodeFn: decodePgControl, - DecodeInArg: format.PostgresIn{ + DefaultInArg: format.PostgresIn{ Flavour: "", }, }) @@ -72,55 +71,55 @@ const ( PG_FLAVOUR_PGPROEE15 = "pgproee15" ) -func decodePgControl(d *decode.D, in any) any { +func decodePgControl(d *decode.D) any { d.Endian = decode.LittleEndian - pgIn, ok := in.(format.PostgresIn) - if !ok { + var pgIn format.PostgresIn + if !d.ArgAs(&pgIn) { d.Fatalf("DecodeInArg must be PostgresIn!\n") } switch pgIn.Flavour { case PG_FLAVOUR_POSTGRES10: - return postgres10.DecodePgControl(d, in) + return postgres10.DecodePgControl(d) case PG_FLAVOUR_POSTGRES11: - return postgres11.DecodePgControl(d, in) + return postgres11.DecodePgControl(d) case PG_FLAVOUR_POSTGRES12: - return postgres12.DecodePgControl(d, in) + return postgres12.DecodePgControl(d) case PG_FLAVOUR_POSTGRES13: - return postgres13.DecodePgControl(d, in) + return postgres13.DecodePgControl(d) case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES15, PG_FLAVOUR_PGPRO15: - return postgres14.DecodePgControl(d, in) + return postgres14.DecodePgControl(d) case PG_FLAVOUR_PGPRO10: - return pgpro10.DecodePgControl(d, in) + return pgpro10.DecodePgControl(d) case PG_FLAVOUR_PGPRO11: - return pgpro11.DecodePgControl(d, in) + return pgpro11.DecodePgControl(d) case PG_FLAVOUR_PGPRO12: - return pgpro12.DecodePgControl(d, in) + return pgpro12.DecodePgControl(d) case PG_FLAVOUR_PGPRO13: - return pgpro13.DecodePgControl(d, in) + return pgpro13.DecodePgControl(d) case PG_FLAVOUR_PGPRO14: - return pgpro14.DecodePgControl(d, in) + return pgpro14.DecodePgControl(d) case PG_FLAVOUR_PGPROEE10: - return pgproee10.DecodePgControl(d, in) + return pgproee10.DecodePgControl(d) case PG_FLAVOUR_PGPROEE11: - return pgproee11.DecodePgControl(d, in) + return pgproee11.DecodePgControl(d) case PG_FLAVOUR_PGPROEE12: - return pgproee12.DecodePgControl(d, in) + return pgproee12.DecodePgControl(d) case PG_FLAVOUR_PGPROEE13: - return pgproee13.DecodePgControl(d, in) + return pgproee13.DecodePgControl(d) case PG_FLAVOUR_PGPROEE14: - return pgproee14.DecodePgControl(d, in) + return pgproee14.DecodePgControl(d) case PG_FLAVOUR_PGPROEE15: - return pgproee15.DecodePgControl(d, in) + return pgproee15.DecodePgControl(d) default: break } - return probeForDecode(d, in) + return probeForDecode(d) } -func probeForDecode(d *decode.D, in any) any { +func probeForDecode(d *decode.D) any { /* 0 | 8 */ // uint64 system_identifier; /* 8 | 4 */ // uint32 pg_control_version; d.U64() @@ -132,39 +131,39 @@ func probeForDecode(d *decode.D, in any) any { if pgProVersion == common.PG_ORIGINAL { switch oriVersion { case PG_CONTROL_VERSION_10: - return postgres10.DecodePgControl(d, in) + return postgres10.DecodePgControl(d) case PG_CONTROL_VERSION_11: - return postgres11.DecodePgControl(d, in) + return postgres11.DecodePgControl(d) case PG_CONTROL_VERSION_12: - return postgres12.DecodePgControl(d, in) + return postgres12.DecodePgControl(d) case PG_CONTROL_VERSION_14: - return postgres14.DecodePgControl(d, in) + return postgres14.DecodePgControl(d) } } if pgProVersion == common.PGPRO_STANDARD { switch oriVersion { case PG_CONTROL_VERSION_10: - return pgpro10.DecodePgControl(d, in) + return pgpro10.DecodePgControl(d) case PG_CONTROL_VERSION_11: - return pgpro11.DecodePgControl(d, in) + return pgpro11.DecodePgControl(d) case PG_CONTROL_VERSION_12: - return pgpro12.DecodePgControl(d, in) + return pgpro12.DecodePgControl(d) case PG_CONTROL_VERSION_14: - return pgpro14.DecodePgControl(d, in) + return pgpro14.DecodePgControl(d) } } if pgProVersion == common.PGPRO_ENTERPRISE { switch oriVersion { case PG_CONTROL_VERSION_10: - return pgproee10.DecodePgControl(d, in) + return pgproee10.DecodePgControl(d) case PGPRO_CONTROL_VERSION_11: - return pgproee11.DecodePgControl(d, in) + return pgproee11.DecodePgControl(d) case PG_CONTROL_VERSION_12: - return pgproee12.DecodePgControl(d, in) + return pgproee12.DecodePgControl(d) case PG_CONTROL_VERSION_14: - return pgproee14.DecodePgControl(d, in) + return pgproee14.DecodePgControl(d) } } diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index f07f05ac7..5ef82744e 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -18,11 +18,10 @@ import ( var pgHeapFS embed.FS func init() { - interp.RegisterFormat(decode.Format{ - Name: format.PG_HEAP, + interp.RegisterFormat(format.PG_HEAP, &decode.Format{ Description: "PostgreSQL heap file", DecodeFn: decodePgheap, - DecodeInArg: format.PostgresHeapIn{ + DefaultInArg: format.PostgresHeapIn{ Flavour: PG_FLAVOUR_POSTGRES14, Page: 0, Segment: 0, @@ -33,11 +32,11 @@ func init() { interp.RegisterFS(pgHeapFS) } -func decodePgheap(d *decode.D, in any) any { +func decodePgheap(d *decode.D) any { d.Endian = decode.LittleEndian - pgIn, ok := in.(format.PostgresHeapIn) - if !ok { + var pgIn format.PostgresHeapIn + if !d.ArgAs(&pgIn) { d.Fatalf("DecodeInArg must be PostgresIn!\n") } From 9508a209ea754a8c253c9ef53a49be0fecba4bbf Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Wed, 3 May 2023 15:28:29 +0300 Subject: [PATCH 134/141] postgres: fix lint --- format/postgres/common/pg_btree/postgres/pg_btree.go | 2 -- format/postgres/common/pg_control.go | 2 -- format/postgres/common/pg_heap.go | 1 - format/postgres/common/pg_heap/postgres/pg_heap.go | 2 -- format/postgres/pg_control.go | 4 +--- 5 files changed, 1 insertion(+), 10 deletions(-) diff --git a/format/postgres/common/pg_btree/postgres/pg_btree.go b/format/postgres/common/pg_btree/postgres/pg_btree.go index 2c2ccb853..d701b0e9a 100644 --- a/format/postgres/common/pg_btree/postgres/pg_btree.go +++ b/format/postgres/common/pg_btree/postgres/pg_btree.go @@ -7,7 +7,6 @@ import ( "github.com/wader/fq/pkg/decode" ) -//nolint:revive const ( BTREE_MAGIC = 0x053162 P_NONE = 0 @@ -24,7 +23,6 @@ const ( BTP_HAS_FULLXID = 1 << 8 /* contains BTDeletedPageData */ ) -//nolint:revive const ( INDEX_SIZE_MASK = 0x1FFF INDEX_AM_RESERVED_BIT = 0x2000 /* reserved for index-AM specific usage */ diff --git a/format/postgres/common/pg_control.go b/format/postgres/common/pg_control.go index 5c372b367..707a08b02 100644 --- a/format/postgres/common/pg_control.go +++ b/format/postgres/common/pg_control.go @@ -97,8 +97,6 @@ var TimeMapper = timeMapper{} // PGPRO_STANDARD = ('P'<<8|'P'), // PGPRO_ENTERPRISE = ('P'<<8|'E'), // } PgEdition; -// -//nolint:revive const ( PG_UNKNOWN = 0xFFFF PG_ORIGINAL = 0 diff --git a/format/postgres/common/pg_heap.go b/format/postgres/common/pg_heap.go index af8532065..584635d30 100644 --- a/format/postgres/common/pg_heap.go +++ b/format/postgres/common/pg_heap.go @@ -4,7 +4,6 @@ import ( "github.com/wader/fq/pkg/scalar" ) -//nolint:revive const ( PageSize = 8192 FirstNormalTransactionID = 3 diff --git a/format/postgres/common/pg_heap/postgres/pg_heap.go b/format/postgres/common/pg_heap/postgres/pg_heap.go index 490f737a8..145d41191 100644 --- a/format/postgres/common/pg_heap/postgres/pg_heap.go +++ b/format/postgres/common/pg_heap/postgres/pg_heap.go @@ -10,7 +10,6 @@ import ( "github.com/wader/fq/pkg/scalar" ) -//nolint:revive const ( HEAP_HASNULL = 0x0001 /* has null attribute(s) */ HEAP_HASVARWIDTH = 0x0002 /* has variable-width attribute(s) */ @@ -41,7 +40,6 @@ const ( HEAP_MOVED = HEAP_MOVED_OFF | HEAP_MOVED_IN ) -//nolint:revive const ( HEAP_KEYS_UPDATED = 0x2000 /* tuple was updated and key cols modified, or tuple deleted */ HEAP_HOT_UPDATED = 0x4000 /* tuple was HOT-updated */ diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 69b28a1e4..1f793a0bf 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -2,7 +2,6 @@ package postgres import ( "embed" - "github.com/wader/fq/format/postgres/flavours/pgproee15" "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/common" @@ -16,6 +15,7 @@ import ( "github.com/wader/fq/format/postgres/flavours/pgproee12" "github.com/wader/fq/format/postgres/flavours/pgproee13" "github.com/wader/fq/format/postgres/flavours/pgproee14" + "github.com/wader/fq/format/postgres/flavours/pgproee15" "github.com/wader/fq/format/postgres/flavours/postgres10" "github.com/wader/fq/format/postgres/flavours/postgres11" "github.com/wader/fq/format/postgres/flavours/postgres12" @@ -39,7 +39,6 @@ func init() { interp.RegisterFS(pgControlFS) } -//nolint:revive const ( PG_CONTROL_VERSION_10 = 1002 PG_CONTROL_VERSION_11 = 1100 @@ -49,7 +48,6 @@ const ( PG_CONTROL_VERSION_14 = 1300 ) -//nolint:revive const ( PG_FLAVOUR_POSTGRES10 = "postgres10" PG_FLAVOUR_POSTGRES11 = "postgres11" From f6f8d5c037e4e5b7732ce4046a8eb7db81e819cb Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Wed, 3 May 2023 15:40:32 +0300 Subject: [PATCH 135/141] postgres: refactoring --- format/format.go | 2 +- format/postgres/pg_control.go | 6 +++--- format/postgres/pg_heap.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/format/format.go b/format/format.go index 4ef71e68f..8c0118e67 100644 --- a/format/format.go +++ b/format/format.go @@ -343,7 +343,7 @@ type TLS_In struct { Keylog string `doc:"NSS Key Log content"` } -type PostgresIn struct { +type PgControlIn struct { Flavour string `doc:"PostgreSQL flavour: postgres14, pgproee14.., postgres10"` } diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index 1f793a0bf..dd5b072a6 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -32,7 +32,7 @@ func init() { interp.RegisterFormat(format.PG_CONTROL, &decode.Format{ Description: "PostgreSQL control file", DecodeFn: decodePgControl, - DefaultInArg: format.PostgresIn{ + DefaultInArg: format.PgControlIn{ Flavour: "", }, }) @@ -72,9 +72,9 @@ const ( func decodePgControl(d *decode.D) any { d.Endian = decode.LittleEndian - var pgIn format.PostgresIn + var pgIn format.PgControlIn if !d.ArgAs(&pgIn) { - d.Fatalf("DecodeInArg must be PostgresIn!\n") + d.Fatalf("DecodeInArg must be PgControlIn!\n") } switch pgIn.Flavour { diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index 5ef82744e..e7d40ead2 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -37,7 +37,7 @@ func decodePgheap(d *decode.D) any { var pgIn format.PostgresHeapIn if !d.ArgAs(&pgIn) { - d.Fatalf("DecodeInArg must be PostgresIn!\n") + d.Fatalf("DecodeInArg must be PostgresHeapIn!\n") } switch pgIn.Flavour { From 7a89234b136fc471a9442c004fbc0ec4ac1c3255 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Thu, 4 May 2023 08:34:32 +0300 Subject: [PATCH 136/141] postgres: update doc --- README.md | 1 - doc/formats.md | 124 +++- doc/formats.svg | 1748 ++++++++++++++++++++++++----------------------- 3 files changed, 1006 insertions(+), 867 deletions(-) diff --git a/README.md b/README.md index 75c9d0092..ad65b5b21 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,6 @@ pcapng, [pg_btree](doc/formats.md#pg_btree), [pg_control](doc/formats.md#pg_control), [pg_heap](doc/formats.md#pg_heap), -[pg_wal](doc/formats.md#pg_wal), png, prores_frame, [protobuf](doc/formats.md#protobuf), diff --git a/doc/formats.md b/doc/formats.md index f3e0d6b60..343def793 100644 --- a/doc/formats.md +++ b/doc/formats.md @@ -92,6 +92,9 @@ |`opus_packet` |Opus&nbsp;packet |<sub>`vorbis_comment`</sub>| |[`pcap`](#pcap) |PCAP&nbsp;packet&nbsp;capture |<sub>`link_frame` `tcp_stream` `ipv4_packet`</sub>| |`pcapng` |PCAPNG&nbsp;packet&nbsp;capture |<sub>`link_frame` `tcp_stream` `ipv4_packet`</sub>| +|[`pg_btree`](#pg_btree) |PostgreSQL&nbsp;btree&nbsp;index&nbsp;file |<sub></sub>| +|[`pg_control`](#pg_control) |PostgreSQL&nbsp;control&nbsp;file |<sub></sub>| +|[`pg_heap`](#pg_heap) |PostgreSQL&nbsp;heap&nbsp;file |<sub></sub>| |`png` |Portable&nbsp;Network&nbsp;Graphics&nbsp;file |<sub>`icc_profile` `exif`</sub>| |`prores_frame` |Apple&nbsp;ProRes&nbsp;frame |<sub></sub>| |[`protobuf`](#protobuf) |Protobuf |<sub></sub>| @@ -434,7 +437,7 @@ bplist> from_ns_keyed_archiver(1) ## bson -### Limitations: +### Limitations - The decimal128 type is not supported for decoding, will just be treated as binary @@ -450,6 +453,10 @@ $ fq -d bson torepr file.bson $ fq -d bson 'torepr | select(.name=="bob")' file.bson ``` +### Authors +- Mattias Wadman mattias.wadman@gmail.com, original author +- Matt Dale [@matthewdale](https://github.com/matthewdale), additional types and bug fixes + ### References - https://bsonspec.org/spec.html @@ -821,6 +828,121 @@ $ fq '.tcp_connections | group_by(.client.ip) | map({key: .[0].client.ip, value: "10.99.12.150": 218 } ``` +## pg_btree + +### Options + +|Name |Default|Description| +|- |- |-| +|`page`|0 |First page number in file, default is 0| + +### Examples + +Decode file using pg_btree options +``` +$ fq -d pg_btree -o page=0 . file +``` + +Decode value as pg_btree +``` +... | pg_btree({page:0}) +``` + +### Btree index meta page + +```sh +$ fq -d pg_btree -o flavour=postgres14 ".[0] | d" 16404 +``` + +### Btree index page + +```sh +$ fq -d pg_btree -o flavour=postgres14 ".[1]" 16404 +``` + +### References +- https://www.postgresql.org/docs/current/storage-page-layout.html +## pg_control + +### Options + +|Name |Default|Description| +|- |- |-| +|`flavour`| |PostgreSQL flavour: postgres14, pgproee14.., postgres10| + +### Examples + +Decode file using pg_control options +``` +$ fq -d pg_control -o flavour="" . file +``` + +Decode value as pg_control +``` +... | pg_control({flavour:""}) +``` + +### Decode content of pg_control file + +```sh +$ fq -d pg_control -o flavour=postgres14 d pg_control +``` + +### Specific fields can be got by request + +```sh +$ fq -d pg_control -o flavour=postgres14 ".state, .check_point_copy.redo, .wal_level" pg_control +``` + +### References +- https://github.com/postgres/postgres/blob/REL_14_2/src/include/catalog/pg_control.h +## pg_heap + +### Options + +|Name |Default |Description| +|- |- |-| +|`flavour`|postgres14|PostgreSQL flavour: postgres14, pgproee14.., postgres10| +|`page` |0 |First page number in file, default is 0| +|`segment`|0 |Segment file number (16790.1 is 1), default is 0| + +### Examples + +Decode file using pg_heap options +``` +$ fq -d pg_heap -o flavour="postgres14" -o page=0 -o segment=0 . file +``` + +Decode value as pg_heap +``` +... | pg_heap({flavour:"postgres14",page:0,segment:0}) +``` + +### To see heap page's content +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0]" 16994 +``` + +### To see page's header + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].page_header" 16994 +``` + +### First and last item pointers on first page + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].pd_linp[0, -1]" 16994 +``` + +### First and last tuple on first page + +```sh +$ fq -d pg_heap -o flavour=postgres14 ".[0].tuples[0, -1]" 16994 +``` + +### References +- https://www.postgresql.org/docs/current/storage-page-layout.html ## protobuf ### Can decode sub messages diff --git a/doc/formats.svg b/doc/formats.svg index 63bc3eec6..d0fc812ea 100644 --- a/doc/formats.svg +++ b/doc/formats.svg @@ -4,2100 +4,2118 @@ <!-- --> <!-- Title: formats Pages: 1 --> -<svg width="4305pt" height="2095pt" - viewBox="0.00 0.00 4305.48 2095.22" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> -<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 2091.22)"> +<svg width="4901pt" height="2097pt" + viewBox="0.00 0.00 4901.13 2097.20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 2093.2)"> <title>formats</title> -<polygon fill="white" stroke="none" points="-4,4 -4,-2091.22 4301.48,-2091.22 4301.48,4 -4,4"/> +<polygon fill="white" stroke="transparent" points="-4,4 -4,-2093.2 4897.13,-2093.2 4897.13,4 -4,4"/> <!-- adts --> <g id="node1" class="node"> <title>adts</title> -<polygon fill="paleturquoise" stroke="none" points="1880,-1880 1880,-1925 1945,-1925 1945,-1880 1880,-1880"/> -<text text-anchor="start" x="1897" y="-1906.5" font-family="Times,serif" font-size="20.00">adts</text> -<polygon fill="lightgrey" stroke="none" points="1880.5,-1879.5 1880.5,-1898.5 1945.5,-1898.5 1945.5,-1879.5 1880.5,-1879.5"/> -<text text-anchor="start" x="1882.5" y="-1885.3" font-family="Times,serif" font-size="14.00">adts_frame</text> +<polygon fill="paleturquoise" stroke="transparent" points="2207.5,-1880 2207.5,-1925 2291.5,-1925 2291.5,-1880 2207.5,-1880"/> +<text text-anchor="start" x="2227.5" y="-1906.5" font-family="Times,serif" font-size="20.00">adts</text> +<polygon fill="lightgrey" stroke="transparent" points="2207.5,-1879.5 2207.5,-1898.5 2291.5,-1898.5 2291.5,-1879.5 2207.5,-1879.5"/> +<text text-anchor="start" x="2209.5" y="-1885.3" font-family="Times,serif" font-size="14.00">adts_frame</text> </g> <!-- adts_frame --> <g id="node2" class="node"> <title>adts_frame</title> -<polygon fill="paleturquoise" stroke="none" points="1186,-1546 1186,-1591 1279,-1591 1279,-1546 1186,-1546"/> -<text text-anchor="start" x="1188.5" y="-1572.5" font-family="Times,serif" font-size="20.00">adts_frame</text> -<polygon fill="lightgrey" stroke="none" points="1186.5,-1545.5 1186.5,-1564.5 1279.5,-1564.5 1279.5,-1545.5 1186.5,-1545.5"/> -<text text-anchor="start" x="1188.5" y="-1551.3" font-family="Times,serif" font-size="14.00">aac_frame</text> +<polygon fill="paleturquoise" stroke="transparent" points="1434.5,-1546 1434.5,-1591 1552.5,-1591 1552.5,-1546 1434.5,-1546"/> +<text text-anchor="start" x="1436.5" y="-1572.5" font-family="Times,serif" font-size="20.00">adts_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="1434.5,-1545.5 1434.5,-1564.5 1552.5,-1564.5 1552.5,-1545.5 1434.5,-1545.5"/> +<text text-anchor="start" x="1436.5" y="-1551.3" font-family="Times,serif" font-size="14.00">aac_frame</text> </g> <!-- adts&#45;&gt;adts_frame --> <g id="edge1" class="edge"> <title>adts:e&#45;&gt;adts_frame:n</title> -<path fill="none" stroke="#93648a" stroke-width="2" d="M1946.5,-1888.5C1952.07,-1888.5 1948.72,-1880.55 1945.5,-1876 1921.62,-1842.2 1900.34,-1849.19 1860.5,-1838 1739.28,-1803.94 1397.62,-1843.64 1298.5,-1766 1238.03,-1718.64 1232.91,-1681.07 1232.53,-1608.46"/> -<polygon fill="#93648a" stroke="#93648a" stroke-width="2" points="1236.03,-1608.52 1232.51,-1598.53 1229.03,-1608.53 1236.03,-1608.52"/> +<path fill="none" stroke="#93648a" stroke-width="2" d="M2292.5,-1888.5C2308.68,-1888.5 2324.14,-1870.45 2188.5,-1838 2054.25,-1805.88 1683.22,-1847.09 1571.5,-1766 1507.27,-1719.38 1494.54,-1682.7 1493.56,-1606.94"/> +<polygon fill="#93648a" stroke="#93648a" stroke-width="2" points="1497.06,-1606.48 1493.5,-1596.5 1490.06,-1606.52 1497.06,-1606.48"/> </g> <!-- aac_frame --> <g id="node3" class="node"> <title>aac_frame</title> -<polygon fill="paleturquoise" stroke="none" points="1264,-544 1264,-570 1353,-570 1353,-544 1264,-544"/> -<text text-anchor="start" x="1266.5" y="-552" font-family="Times,serif" font-size="20.00">aac_frame</text> +<polygon fill="paleturquoise" stroke="transparent" points="1490.5,-544 1490.5,-570 1600.5,-570 1600.5,-544 1490.5,-544"/> +<text text-anchor="start" x="1492.5" y="-552" font-family="Times,serif" font-size="20.00">aac_frame</text> </g> <!-- adts_frame&#45;&gt;aac_frame --> <g id="edge2" class="edge"> <title>adts_frame:e&#45;&gt;aac_frame:n</title> -<path fill="none" stroke="#b08cab" stroke-width="2" d="M1280.5,-1554.5C1426.33,-1554.5 1179.22,-1348.07 1260.5,-1227 1307.61,-1156.83 1389.39,-1225.17 1436.5,-1155 1557.89,-974.19 1537.38,-858.01 1436.5,-665 1406.6,-607.79 1321.31,-640.07 1309.79,-588.72"/> -<polygon fill="#b08cab" stroke="#b08cab" stroke-width="2" points="1313.3,-588.61 1308.81,-579.01 1306.34,-589.31 1313.3,-588.61"/> +<path fill="none" stroke="#b08cab" stroke-width="2" d="M1553.5,-1554.5C1700.36,-1554.5 1424.23,-1346.57 1509.5,-1227 1566.55,-1147.01 1661.45,-1234.99 1718.5,-1155 1844.95,-977.69 1831.93,-850.91 1718.5,-665 1675.4,-594.36 1556.34,-656.61 1546.19,-586.3"/> +<polygon fill="#b08cab" stroke="#b08cab" stroke-width="2" points="1549.66,-585.74 1545.5,-576 1542.68,-586.21 1549.66,-585.74"/> </g> <!-- apev2 --> <g id="node4" class="node"> <title>apev2</title> -<polygon fill="paleturquoise" stroke="none" points="2373.5,-1546 2373.5,-1591 2425.5,-1591 2425.5,-1546 2373.5,-1546"/> -<text text-anchor="start" x="2375.5" y="-1572.5" font-family="Times,serif" font-size="20.00">apev2</text> -<polygon fill="lightgrey" stroke="none" points="2373.5,-1545.5 2373.5,-1564.5 2425.5,-1564.5 2425.5,-1545.5 2373.5,-1545.5"/> -<text text-anchor="start" x="2375.5" y="-1551.3" font-family="Times,serif" font-size="14.00">image</text> +<polygon fill="paleturquoise" stroke="transparent" points="2756,-1546 2756,-1591 2821,-1591 2821,-1546 2756,-1546"/> +<text text-anchor="start" x="2758.5" y="-1572.5" font-family="Times,serif" font-size="20.00">apev2</text> +<polygon fill="lightgrey" stroke="transparent" points="2756.5,-1545.5 2756.5,-1564.5 2821.5,-1564.5 2821.5,-1545.5 2756.5,-1545.5"/> +<text text-anchor="start" x="2758.5" y="-1551.3" font-family="Times,serif" font-size="14.00">image</text> </g> <!-- image --> <g id="node5" class="node"> <title>image</title> -<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M2305.5,-1245C2305.5,-1245 2359.5,-1245 2359.5,-1245 2365.5,-1245 2371.5,-1251 2371.5,-1257 2371.5,-1257 2371.5,-1269 2371.5,-1269 2371.5,-1275 2365.5,-1281 2359.5,-1281 2359.5,-1281 2305.5,-1281 2305.5,-1281 2299.5,-1281 2293.5,-1275 2293.5,-1269 2293.5,-1269 2293.5,-1257 2293.5,-1257 2293.5,-1251 2299.5,-1245 2305.5,-1245"/> -<text text-anchor="middle" x="2332.5" y="-1257" font-family="Times,serif" font-size="25.00">image</text> +<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M2674,-1245C2674,-1245 2745,-1245 2745,-1245 2751,-1245 2757,-1251 2757,-1257 2757,-1257 2757,-1269 2757,-1269 2757,-1275 2751,-1281 2745,-1281 2745,-1281 2674,-1281 2674,-1281 2668,-1281 2662,-1275 2662,-1269 2662,-1269 2662,-1257 2662,-1257 2662,-1251 2668,-1245 2674,-1245"/> +<text text-anchor="middle" x="2709.5" y="-1257" font-family="Times,serif" font-size="25.00">image</text> </g> <!-- apev2&#45;&gt;image --> <g id="edge3" class="edge"> <title>apev2:e&#45;&gt;image:n</title> -<path fill="none" stroke="#5c5d4e" stroke-width="2" d="M2426.5,-1554.5C2486.8,-1554.5 2350.26,-1369.77 2334.05,-1294.68"/> -<polygon fill="#5c5d4e" stroke="#5c5d4e" stroke-width="2" points="2337.56,-1294.51 2332.87,-1285 2330.61,-1295.36 2337.56,-1294.51"/> +<path fill="none" stroke="#5c5d4e" stroke-width="2" d="M2822.5,-1554.5C2884.98,-1554.5 2725.7,-1366.5 2710.63,-1292.11"/> +<polygon fill="#5c5d4e" stroke="#5c5d4e" stroke-width="2" points="2714.09,-1291.55 2709.5,-1282 2707.14,-1292.33 2714.09,-1291.55"/> </g> <!-- jpeg --> <g id="node46" class="node"> <title>jpeg</title> -<polygon fill="paleturquoise" stroke="none" points="2994,-525 2994,-589 3057,-589 3057,-525 2994,-525"/> -<text text-anchor="start" x="3009" y="-571" font-family="Times,serif" font-size="20.00">jpeg</text> -<polygon fill="lightgrey" stroke="none" points="2994.5,-544 2994.5,-563 3057.5,-563 3057.5,-544 2994.5,-544"/> -<text text-anchor="start" x="2996.5" y="-549.8" font-family="Times,serif" font-size="14.00">exif</text> -<polygon fill="lightgrey" stroke="none" points="2994.5,-525 2994.5,-544 3057.5,-544 3057.5,-525 2994.5,-525"/> -<text text-anchor="start" x="2996.5" y="-530.8" font-family="Times,serif" font-size="14.00">icc_profile</text> +<polygon fill="paleturquoise" stroke="transparent" points="3518,-525 3518,-589 3595,-589 3595,-525 3518,-525"/> +<text text-anchor="start" x="3535" y="-571" font-family="Times,serif" font-size="20.00">jpeg</text> +<polygon fill="lightgrey" stroke="transparent" points="3518.5,-544 3518.5,-563 3595.5,-563 3595.5,-544 3518.5,-544"/> +<text text-anchor="start" x="3520.5" y="-549.8" font-family="Times,serif" font-size="14.00">exif</text> +<polygon fill="lightgrey" stroke="transparent" points="3518.5,-525 3518.5,-544 3595.5,-544 3595.5,-525 3518.5,-525"/> +<text text-anchor="start" x="3520.5" y="-530.8" font-family="Times,serif" font-size="14.00">icc_profile</text> </g> <!-- image&#45;&gt;jpeg --> <g id="edge150" class="edge"> <title>image&#45;&gt;jpeg:n</title> -<path fill="none" stroke="#b43c96" stroke-width="2" d="M2329.28,-1245C2313,-1156.88 2243.58,-752.78 2322.5,-665 2424.61,-551.43 2991.84,-735.92 3024.99,-602.93"/> -<polygon fill="#b43c96" stroke="#b43c96" stroke-width="2" points="3028.46,-603.35 3026.15,-593.01 3021.51,-602.53 3028.46,-603.35"/> +<path fill="none" stroke="#b43c96" stroke-width="2" d="M2706.55,-1244.97C2691.7,-1156.72 2628.8,-752.05 2708.5,-665 2834.03,-527.9 3530.94,-770.11 3556.76,-600.09"/> +<polygon fill="#b43c96" stroke="#b43c96" stroke-width="2" points="3560.26,-600.23 3557.5,-590 3553.28,-599.72 3560.26,-600.23"/> </g> <!-- mp4 --> <g id="node65" class="node"> <title>mp4</title> -<polygon fill="paleturquoise" stroke="none" points="1919.5,-669 1919.5,-1151 2035.5,-1151 2035.5,-669 1919.5,-669"/> -<text text-anchor="start" x="1959.5" y="-1133" font-family="Times,serif" font-size="20.00">mp4</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-1106 1919.5,-1125 2035.5,-1125 2035.5,-1106 1919.5,-1106"/> -<text text-anchor="start" x="1921.5" y="-1111.8" font-family="Times,serif" font-size="14.00">aac_frame</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-1087 1919.5,-1106 2035.5,-1106 2035.5,-1087 1919.5,-1087"/> -<text text-anchor="start" x="1921.5" y="-1092.8" font-family="Times,serif" font-size="14.00">av1_ccr</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-1068 1919.5,-1087 2035.5,-1087 2035.5,-1068 1919.5,-1068"/> -<text text-anchor="start" x="1921.5" y="-1073.8" font-family="Times,serif" font-size="14.00">av1_frame</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-1049 1919.5,-1068 2035.5,-1068 2035.5,-1049 1919.5,-1049"/> -<text text-anchor="start" x="1921.5" y="-1054.8" font-family="Times,serif" font-size="14.00">avc_au</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-1030 1919.5,-1049 2035.5,-1049 2035.5,-1030 1919.5,-1030"/> -<text text-anchor="start" x="1921.5" y="-1035.8" font-family="Times,serif" font-size="14.00">avc_dcr</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-1011 1919.5,-1030 2035.5,-1030 2035.5,-1011 1919.5,-1011"/> -<text text-anchor="start" x="1921.5" y="-1016.8" font-family="Times,serif" font-size="14.00">flac_frame</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-992 1919.5,-1011 2035.5,-1011 2035.5,-992 1919.5,-992"/> -<text text-anchor="start" x="1921.5" y="-997.8" font-family="Times,serif" font-size="14.00">flac_metadatablocks</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-973 1919.5,-992 2035.5,-992 2035.5,-973 1919.5,-973"/> -<text text-anchor="start" x="1921.5" y="-978.8" font-family="Times,serif" font-size="14.00">hevc_au</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-954 1919.5,-973 2035.5,-973 2035.5,-954 1919.5,-954"/> -<text text-anchor="start" x="1921.5" y="-959.8" font-family="Times,serif" font-size="14.00">hevc_dcr</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-935 1919.5,-954 2035.5,-954 2035.5,-935 1919.5,-935"/> -<text text-anchor="start" x="1921.5" y="-940.8" font-family="Times,serif" font-size="14.00">icc_profile</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-916 1919.5,-935 2035.5,-935 2035.5,-916 1919.5,-916"/> -<text text-anchor="start" x="1921.5" y="-921.8" font-family="Times,serif" font-size="14.00">id3v2</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-897 1919.5,-916 2035.5,-916 2035.5,-897 1919.5,-897"/> -<text text-anchor="start" x="1921.5" y="-902.8" font-family="Times,serif" font-size="14.00">image</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-878 1919.5,-897 2035.5,-897 2035.5,-878 1919.5,-878"/> -<text text-anchor="start" x="1921.5" y="-883.8" font-family="Times,serif" font-size="14.00">jpeg</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-859 1919.5,-878 2035.5,-878 2035.5,-859 1919.5,-859"/> -<text text-anchor="start" x="1921.5" y="-864.8" font-family="Times,serif" font-size="14.00">mp3_frame</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-840 1919.5,-859 2035.5,-859 2035.5,-840 1919.5,-840"/> -<text text-anchor="start" x="1921.5" y="-845.8" font-family="Times,serif" font-size="14.00">mpeg_es</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-821 1919.5,-840 2035.5,-840 2035.5,-821 1919.5,-821"/> -<text text-anchor="start" x="1921.5" y="-826.8" font-family="Times,serif" font-size="14.00">mpeg_pes_packet</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-802 1919.5,-821 2035.5,-821 2035.5,-802 1919.5,-802"/> -<text text-anchor="start" x="1921.5" y="-807.8" font-family="Times,serif" font-size="14.00">opus_packet</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-783 1919.5,-802 2035.5,-802 2035.5,-783 1919.5,-783"/> -<text text-anchor="start" x="1921.5" y="-788.8" font-family="Times,serif" font-size="14.00">png</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-764 1919.5,-783 2035.5,-783 2035.5,-764 1919.5,-764"/> -<text text-anchor="start" x="1921.5" y="-769.8" font-family="Times,serif" font-size="14.00">prores_frame</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-745 1919.5,-764 2035.5,-764 2035.5,-745 1919.5,-745"/> -<text text-anchor="start" x="1921.5" y="-750.8" font-family="Times,serif" font-size="14.00">protobuf_widevine</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-726 1919.5,-745 2035.5,-745 2035.5,-726 1919.5,-726"/> -<text text-anchor="start" x="1921.5" y="-731.8" font-family="Times,serif" font-size="14.00">pssh_playready</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-707 1919.5,-726 2035.5,-726 2035.5,-707 1919.5,-707"/> -<text text-anchor="start" x="1921.5" y="-712.8" font-family="Times,serif" font-size="14.00">vorbis_packet</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-688 1919.5,-707 2035.5,-707 2035.5,-688 1919.5,-688"/> -<text text-anchor="start" x="1921.5" y="-693.8" font-family="Times,serif" font-size="14.00">vp9_frame</text> -<polygon fill="lightgrey" stroke="none" points="1919.5,-669 1919.5,-688 2035.5,-688 2035.5,-669 1919.5,-669"/> -<text text-anchor="start" x="1921.5" y="-674.8" font-family="Times,serif" font-size="14.00">vpx_ccr</text> +<polygon fill="paleturquoise" stroke="transparent" points="2232,-669 2232,-1151 2381,-1151 2381,-669 2232,-669"/> +<text text-anchor="start" x="2284.5" y="-1133" font-family="Times,serif" font-size="20.00">mp4</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-1106 2232.5,-1125 2381.5,-1125 2381.5,-1106 2232.5,-1106"/> +<text text-anchor="start" x="2234.5" y="-1111.8" font-family="Times,serif" font-size="14.00">aac_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-1087 2232.5,-1106 2381.5,-1106 2381.5,-1087 2232.5,-1087"/> +<text text-anchor="start" x="2234.5" y="-1092.8" font-family="Times,serif" font-size="14.00">av1_ccr</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-1068 2232.5,-1087 2381.5,-1087 2381.5,-1068 2232.5,-1068"/> +<text text-anchor="start" x="2234.5" y="-1073.8" font-family="Times,serif" font-size="14.00">av1_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-1049 2232.5,-1068 2381.5,-1068 2381.5,-1049 2232.5,-1049"/> +<text text-anchor="start" x="2234.5" y="-1054.8" font-family="Times,serif" font-size="14.00">avc_au</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-1030 2232.5,-1049 2381.5,-1049 2381.5,-1030 2232.5,-1030"/> +<text text-anchor="start" x="2234.5" y="-1035.8" font-family="Times,serif" font-size="14.00">avc_dcr</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-1011 2232.5,-1030 2381.5,-1030 2381.5,-1011 2232.5,-1011"/> +<text text-anchor="start" x="2234.5" y="-1016.8" font-family="Times,serif" font-size="14.00">flac_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-992 2232.5,-1011 2381.5,-1011 2381.5,-992 2232.5,-992"/> +<text text-anchor="start" x="2234.5" y="-997.8" font-family="Times,serif" font-size="14.00">flac_metadatablocks</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-973 2232.5,-992 2381.5,-992 2381.5,-973 2232.5,-973"/> +<text text-anchor="start" x="2234.5" y="-978.8" font-family="Times,serif" font-size="14.00">hevc_au</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-954 2232.5,-973 2381.5,-973 2381.5,-954 2232.5,-954"/> +<text text-anchor="start" x="2234.5" y="-959.8" font-family="Times,serif" font-size="14.00">hevc_dcr</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-935 2232.5,-954 2381.5,-954 2381.5,-935 2232.5,-935"/> +<text text-anchor="start" x="2234.5" y="-940.8" font-family="Times,serif" font-size="14.00">icc_profile</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-916 2232.5,-935 2381.5,-935 2381.5,-916 2232.5,-916"/> +<text text-anchor="start" x="2234.5" y="-921.8" font-family="Times,serif" font-size="14.00">id3v2</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-897 2232.5,-916 2381.5,-916 2381.5,-897 2232.5,-897"/> +<text text-anchor="start" x="2234.5" y="-902.8" font-family="Times,serif" font-size="14.00">image</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-878 2232.5,-897 2381.5,-897 2381.5,-878 2232.5,-878"/> +<text text-anchor="start" x="2234.5" y="-883.8" font-family="Times,serif" font-size="14.00">jpeg</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-859 2232.5,-878 2381.5,-878 2381.5,-859 2232.5,-859"/> +<text text-anchor="start" x="2234.5" y="-864.8" font-family="Times,serif" font-size="14.00">mp3_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-840 2232.5,-859 2381.5,-859 2381.5,-840 2232.5,-840"/> +<text text-anchor="start" x="2234.5" y="-845.8" font-family="Times,serif" font-size="14.00">mpeg_es</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-821 2232.5,-840 2381.5,-840 2381.5,-821 2232.5,-821"/> +<text text-anchor="start" x="2234.5" y="-826.8" font-family="Times,serif" font-size="14.00">mpeg_pes_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-802 2232.5,-821 2381.5,-821 2381.5,-802 2232.5,-802"/> +<text text-anchor="start" x="2234.5" y="-807.8" font-family="Times,serif" font-size="14.00">opus_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-783 2232.5,-802 2381.5,-802 2381.5,-783 2232.5,-783"/> +<text text-anchor="start" x="2234.5" y="-788.8" font-family="Times,serif" font-size="14.00">png</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-764 2232.5,-783 2381.5,-783 2381.5,-764 2232.5,-764"/> +<text text-anchor="start" x="2234.5" y="-769.8" font-family="Times,serif" font-size="14.00">prores_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-745 2232.5,-764 2381.5,-764 2381.5,-745 2232.5,-745"/> +<text text-anchor="start" x="2234.5" y="-750.8" font-family="Times,serif" font-size="14.00">protobuf_widevine</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-726 2232.5,-745 2381.5,-745 2381.5,-726 2232.5,-726"/> +<text text-anchor="start" x="2234.5" y="-731.8" font-family="Times,serif" font-size="14.00">pssh_playready</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-707 2232.5,-726 2381.5,-726 2381.5,-707 2232.5,-707"/> +<text text-anchor="start" x="2234.5" y="-712.8" font-family="Times,serif" font-size="14.00">vorbis_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-688 2232.5,-707 2381.5,-707 2381.5,-688 2232.5,-688"/> +<text text-anchor="start" x="2234.5" y="-693.8" font-family="Times,serif" font-size="14.00">vp9_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="2232.5,-669 2232.5,-688 2381.5,-688 2381.5,-669 2232.5,-669"/> +<text text-anchor="start" x="2234.5" y="-674.8" font-family="Times,serif" font-size="14.00">vpx_ccr</text> </g> <!-- image&#45;&gt;mp4 --> <g id="edge160" class="edge"> <title>image&#45;&gt;mp4:n</title> -<path fill="none" stroke="#b43c96" stroke-width="2" d="M2293.81,-1248.95C2273.77,-1242.26 2248.86,-1234.06 2226.5,-1227 2120.7,-1193.6 1988.57,-1261.72 1978.16,-1164.98"/> -<polygon fill="#b43c96" stroke="#b43c96" stroke-width="2" points="1981.65,-1164.83 1977.65,-1155.02 1974.66,-1165.19 1981.65,-1164.83"/> +<path fill="none" stroke="#b43c96" stroke-width="2" d="M2661.79,-1247.01C2641.15,-1240.65 2616.69,-1233.27 2594.5,-1227 2471.1,-1192.11 2316.23,-1278.87 2307.86,-1162.32"/> +<polygon fill="#b43c96" stroke="#b43c96" stroke-width="2" points="2311.34,-1161.87 2307.5,-1152 2304.35,-1162.11 2311.34,-1161.87"/> </g> <!-- png --> <g id="node67" class="node"> <title>png</title> -<polygon fill="paleturquoise" stroke="none" points="3087,-525 3087,-589 3150,-589 3150,-525 3087,-525"/> -<text text-anchor="start" x="3104" y="-571" font-family="Times,serif" font-size="20.00">png</text> -<polygon fill="lightgrey" stroke="none" points="3087.5,-544 3087.5,-563 3150.5,-563 3150.5,-544 3087.5,-544"/> -<text text-anchor="start" x="3089.5" y="-549.8" font-family="Times,serif" font-size="14.00">icc_profile</text> -<polygon fill="lightgrey" stroke="none" points="3087.5,-525 3087.5,-544 3150.5,-544 3150.5,-525 3087.5,-525"/> -<text text-anchor="start" x="3089.5" y="-530.8" font-family="Times,serif" font-size="14.00">exif</text> +<polygon fill="paleturquoise" stroke="transparent" points="3625,-525 3625,-589 3702,-589 3702,-525 3625,-525"/> +<text text-anchor="start" x="3644.5" y="-571" font-family="Times,serif" font-size="20.00">png</text> +<polygon fill="lightgrey" stroke="transparent" points="3625.5,-544 3625.5,-563 3702.5,-563 3702.5,-544 3625.5,-544"/> +<text text-anchor="start" x="3627.5" y="-549.8" font-family="Times,serif" font-size="14.00">icc_profile</text> +<polygon fill="lightgrey" stroke="transparent" points="3625.5,-525 3625.5,-544 3702.5,-544 3702.5,-525 3625.5,-525"/> +<text text-anchor="start" x="3627.5" y="-530.8" font-family="Times,serif" font-size="14.00">exif</text> </g> <!-- image&#45;&gt;png --> <g id="edge166" class="edge"> <title>image&#45;&gt;png:n</title> -<path fill="none" stroke="#b43c96" stroke-width="2" d="M2331.78,-1245.23C2327.96,-1152.81 2311.84,-708.35 2352.5,-665 2466.57,-543.38 3085.6,-749.83 3118.17,-602.74"/> -<polygon fill="#b43c96" stroke="#b43c96" stroke-width="2" points="3121.62,-603.32 3119.18,-593.01 3114.66,-602.59 3121.62,-603.32"/> +<path fill="none" stroke="#b43c96" stroke-width="2" d="M2709.02,-1244.9C2706.58,-1151.71 2697.18,-707.68 2738.5,-665 2807.92,-593.3 3608.64,-686.62 3661.73,-599.62"/> +<polygon fill="#b43c96" stroke="#b43c96" stroke-width="2" points="3665.1,-600.58 3664.5,-590 3658.37,-598.64 3665.1,-600.58"/> </g> <!-- tiff --> <g id="node85" class="node"> <title>tiff</title> -<polygon fill="paleturquoise" stroke="none" points="2424,-887.5 2424,-932.5 2487,-932.5 2487,-887.5 2424,-887.5"/> -<text text-anchor="start" x="2443.5" y="-914" font-family="Times,serif" font-size="20.00">tiff</text> -<polygon fill="lightgrey" stroke="none" points="2424.5,-887 2424.5,-906 2487.5,-906 2487.5,-887 2424.5,-887"/> -<text text-anchor="start" x="2426.5" y="-892.8" font-family="Times,serif" font-size="14.00">icc_profile</text> +<polygon fill="paleturquoise" stroke="transparent" points="2810,-887.5 2810,-932.5 2887,-932.5 2887,-887.5 2810,-887.5"/> +<text text-anchor="start" x="2834" y="-914" font-family="Times,serif" font-size="20.00">tiff</text> +<polygon fill="lightgrey" stroke="transparent" points="2810.5,-887 2810.5,-906 2887.5,-906 2887.5,-887 2810.5,-887"/> +<text text-anchor="start" x="2812.5" y="-892.8" font-family="Times,serif" font-size="14.00">icc_profile</text> </g> <!-- image&#45;&gt;tiff --> <g id="edge173" class="edge"> <title>image&#45;&gt;tiff:n</title> -<path fill="none" stroke="#b43c96" stroke-width="2" d="M2343.94,-1245.03C2373.62,-1199.37 2451.12,-1069.02 2456.23,-945.68"/> -<polygon fill="#b43c96" stroke="#b43c96" stroke-width="2" points="2459.73,-946.1 2456.44,-936.03 2452.73,-945.95 2459.73,-946.1"/> +<path fill="none" stroke="#b43c96" stroke-width="2" d="M2722.67,-1244.92C2756.6,-1199.19 2844.69,-1068.92 2849.31,-943.2"/> +<polygon fill="#b43c96" stroke="#b43c96" stroke-width="2" points="2852.81,-943.06 2849.5,-933 2845.82,-942.93 2852.81,-943.06"/> </g> <!-- webp --> <g id="node91" class="node"> <title>webp</title> -<polygon fill="paleturquoise" stroke="none" points="903.5,-887.5 903.5,-932.5 967.5,-932.5 967.5,-887.5 903.5,-887.5"/> -<text text-anchor="start" x="914" y="-914" font-family="Times,serif" font-size="20.00">webp</text> -<polygon fill="lightgrey" stroke="none" points="903.5,-887 903.5,-906 967.5,-906 967.5,-887 903.5,-887"/> -<text text-anchor="start" x="905.5" y="-892.8" font-family="Times,serif" font-size="14.00">vp8_frame</text> +<polygon fill="paleturquoise" stroke="transparent" points="1118.5,-887.5 1118.5,-932.5 1198.5,-932.5 1198.5,-887.5 1118.5,-887.5"/> +<text text-anchor="start" x="1131" y="-914" font-family="Times,serif" font-size="20.00">webp</text> +<polygon fill="lightgrey" stroke="transparent" points="1118.5,-887 1118.5,-906 1198.5,-906 1198.5,-887 1118.5,-887"/> +<text text-anchor="start" x="1120.5" y="-892.8" font-family="Times,serif" font-size="14.00">vp8_frame</text> </g> <!-- image&#45;&gt;webp --> <g id="edge181" class="edge"> <title>image&#45;&gt;webp:n</title> -<path fill="none" stroke="#b43c96" stroke-width="2" d="M2293.87,-1246.63C2274.04,-1239.41 2249.33,-1231.45 2226.5,-1227 1987.35,-1180.43 1351.31,-1262.15 1132.5,-1155 1017.96,-1098.91 940.76,-1067.07 935.76,-945.81"/> -<polygon fill="#b43c96" stroke="#b43c96" stroke-width="2" points="939.26,-945.95 935.56,-936.03 932.26,-946.1 939.26,-945.95"/> +<path fill="none" stroke="#b43c96" stroke-width="2" d="M2662.56,-1244.96C2641.95,-1238.2 2617.3,-1231.08 2594.5,-1227 2324.75,-1178.77 1611.21,-1272.16 1363.5,-1155 1245.18,-1099.04 1162.77,-1068.85 1158.66,-943.03"/> +<polygon fill="#b43c96" stroke="#b43c96" stroke-width="2" points="1162.16,-942.94 1158.5,-933 1155.16,-943.05 1162.16,-942.94"/> </g> <!-- gif --> <g id="node100" class="node"> <title>gif</title> -<polygon fill="paleturquoise" stroke="none" points="3130.5,-897 3130.5,-923 3156.5,-923 3156.5,-897 3130.5,-897"/> -<text text-anchor="start" x="3132.5" y="-905" font-family="Times,serif" font-size="20.00">gif</text> +<polygon fill="paleturquoise" stroke="transparent" points="3638.5,-897 3638.5,-923 3670.5,-923 3670.5,-897 3638.5,-897"/> +<text text-anchor="start" x="3640.5" y="-905" font-family="Times,serif" font-size="20.00">gif</text> </g> <!-- image&#45;&gt;gif --> <g id="edge141" class="edge"> <title>image&#45;&gt;gif:n</title> -<path fill="none" stroke="#b43c96" stroke-width="2" d="M2371.41,-1257.25C2526.39,-1238.23 3092.11,-1168.06 3105.5,-1155 3176.88,-1085.42 3146.37,-1032.64 3143.68,-936.85"/> -<polygon fill="#b43c96" stroke="#b43c96" stroke-width="2" points="3147.18,-936.98 3143.54,-927.03 3140.19,-937.08 3147.18,-936.98"/> +<path fill="none" stroke="#b43c96" stroke-width="2" d="M2757.01,-1257.17C2941.48,-1238.34 3600.73,-1170.07 3616.5,-1155 3689.23,-1085.51 3656.85,-1031.72 3654.62,-934.2"/> +<polygon fill="#b43c96" stroke="#b43c96" stroke-width="2" points="3658.12,-933.96 3654.5,-924 3651.12,-934.04 3658.12,-933.96"/> </g> <!-- ar --> <g id="node6" class="node"> <title>ar</title> -<polygon fill="paleturquoise" stroke="none" points="753,-1880 753,-1925 788,-1925 788,-1880 753,-1880"/> -<text text-anchor="start" x="763" y="-1906.5" font-family="Times,serif" font-size="20.00">ar</text> -<polygon fill="lightgrey" stroke="none" points="753.5,-1879.5 753.5,-1898.5 788.5,-1898.5 788.5,-1879.5 753.5,-1879.5"/> -<text text-anchor="start" x="755.5" y="-1885.3" font-family="Times,serif" font-size="14.00">probe</text> +<polygon fill="paleturquoise" stroke="transparent" points="942.5,-1880 942.5,-1925 988.5,-1925 988.5,-1880 942.5,-1880"/> +<text text-anchor="start" x="954.5" y="-1906.5" font-family="Times,serif" font-size="20.00">ar</text> +<polygon fill="lightgrey" stroke="transparent" points="942.5,-1879.5 942.5,-1898.5 988.5,-1898.5 988.5,-1879.5 942.5,-1879.5"/> +<text text-anchor="start" x="944.5" y="-1885.3" font-family="Times,serif" font-size="14.00">probe</text> </g> <!-- probe --> <g id="node7" class="node"> <title>probe</title> -<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M2466.5,-2039.5C2466.5,-2039.5 2516.5,-2039.5 2516.5,-2039.5 2522.5,-2039.5 2528.5,-2045.5 2528.5,-2051.5 2528.5,-2051.5 2528.5,-2063.5 2528.5,-2063.5 2528.5,-2069.5 2522.5,-2075.5 2516.5,-2075.5 2516.5,-2075.5 2466.5,-2075.5 2466.5,-2075.5 2460.5,-2075.5 2454.5,-2069.5 2454.5,-2063.5 2454.5,-2063.5 2454.5,-2051.5 2454.5,-2051.5 2454.5,-2045.5 2460.5,-2039.5 2466.5,-2039.5"/> -<text text-anchor="middle" x="2491.5" y="-2051.5" font-family="Times,serif" font-size="25.00">probe</text> +<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M2861.5,-2039.5C2861.5,-2039.5 2927.5,-2039.5 2927.5,-2039.5 2933.5,-2039.5 2939.5,-2045.5 2939.5,-2051.5 2939.5,-2051.5 2939.5,-2063.5 2939.5,-2063.5 2939.5,-2069.5 2933.5,-2075.5 2927.5,-2075.5 2927.5,-2075.5 2861.5,-2075.5 2861.5,-2075.5 2855.5,-2075.5 2849.5,-2069.5 2849.5,-2063.5 2849.5,-2063.5 2849.5,-2051.5 2849.5,-2051.5 2849.5,-2045.5 2855.5,-2039.5 2861.5,-2039.5"/> +<text text-anchor="middle" x="2894.5" y="-2051.5" font-family="Times,serif" font-size="25.00">probe</text> </g> <!-- ar&#45;&gt;probe --> <g id="edge4" class="edge"> <title>ar:e&#45;&gt;probe:n</title> -<path fill="none" stroke="#813e9a" stroke-width="2" d="M789.5,-1888.5C825.02,-1888.5 777.61,-1943.8 804.5,-1967 949.66,-2092.24 2395.79,-1900.63 2528.5,-2039 2539.73,-2050.71 2539.81,-2063.88 2528.5,-2075.5 2521.24,-2082.96 2508.35,-2087.97 2499.87,-2086.47"/> -<polygon fill="#813e9a" stroke="#813e9a" stroke-width="2" points="2502.56,-2084.23 2493.45,-2078.82 2497.19,-2088.73 2502.56,-2084.23"/> +<path fill="none" stroke="#813e9a" stroke-width="2" d="M989.5,-1888.5C1024.94,-1888.5 976.76,-1943.75 1003.5,-1967 1165.94,-2108.25 2790.14,-1883.99 2939.5,-2039 2945.13,-2044.84 2945.17,-2069.7 2939.5,-2075.5 2928.57,-2086.67 2907.25,-2093.21 2898.45,-2085.99"/> +<polygon fill="#813e9a" stroke="#813e9a" stroke-width="2" points="2901.57,-2084.39 2894.5,-2076.5 2895.11,-2087.08 2901.57,-2084.39"/> </g> <!-- probe&#45;&gt;adts --> <g id="edge125" class="edge"> <title>probe&#45;&gt;adts:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.91,-2056.07C2332.81,-2053.7 1945.43,-2038.28 1915.35,-1938.14"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1918.85,-1937.88 1913.94,-1928.49 1911.93,-1938.9 1918.85,-1937.88"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.4,-2056.95C2707.01,-2057.21 2274.93,-2048.63 2250.57,-1935.65"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2254.03,-1935.08 2249.5,-1925.5 2247.07,-1935.81 2254.03,-1935.08"/> </g> <!-- probe&#45;&gt;ar --> <g id="edge128" class="edge"> <title>probe&#45;&gt;ar:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.54,-2056.35C2221.09,-2055.14 955.86,-2045.03 804.5,-1967 787.97,-1958.48 776.98,-1952.24 773.08,-1938.41"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="776.56,-1938.01 771.87,-1928.5 769.61,-1938.86 776.56,-1938.01"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.28,-2056.41C2578.28,-2055.62 1175.45,-2047.6 1003.5,-1967 984.39,-1958.04 970.48,-1952.46 966.59,-1935.91"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="970.03,-1935.08 965.5,-1925.5 963.06,-1935.81 970.03,-1935.08"/> </g> <!-- avi --> <g id="node17" class="node"> <title>avi</title> -<polygon fill="paleturquoise" stroke="none" points="1147.5,-859 1147.5,-961 1215.5,-961 1215.5,-859 1147.5,-859"/> -<text text-anchor="start" x="1169" y="-943" font-family="Times,serif" font-size="20.00">avi</text> -<polygon fill="lightgrey" stroke="none" points="1147.5,-916 1147.5,-935 1215.5,-935 1215.5,-916 1147.5,-916"/> -<text text-anchor="start" x="1149.5" y="-921.8" font-family="Times,serif" font-size="14.00">avc_au</text> -<polygon fill="lightgrey" stroke="none" points="1147.5,-897 1147.5,-916 1215.5,-916 1215.5,-897 1147.5,-897"/> -<text text-anchor="start" x="1149.5" y="-902.8" font-family="Times,serif" font-size="14.00">hevc_au</text> -<polygon fill="lightgrey" stroke="none" points="1147.5,-878 1147.5,-897 1215.5,-897 1215.5,-878 1147.5,-878"/> -<text text-anchor="start" x="1149.5" y="-883.8" font-family="Times,serif" font-size="14.00">mp3_frame</text> -<polygon fill="lightgrey" stroke="none" points="1147.5,-859 1147.5,-878 1215.5,-878 1215.5,-859 1147.5,-859"/> -<text text-anchor="start" x="1149.5" y="-864.8" font-family="Times,serif" font-size="14.00">flac_frame</text> +<polygon fill="paleturquoise" stroke="transparent" points="1379,-859 1379,-961 1464,-961 1464,-859 1379,-859"/> +<text text-anchor="start" x="1406.5" y="-943" font-family="Times,serif" font-size="20.00">avi</text> +<polygon fill="lightgrey" stroke="transparent" points="1379.5,-916 1379.5,-935 1464.5,-935 1464.5,-916 1379.5,-916"/> +<text text-anchor="start" x="1381.5" y="-921.8" font-family="Times,serif" font-size="14.00">avc_au</text> +<polygon fill="lightgrey" stroke="transparent" points="1379.5,-897 1379.5,-916 1464.5,-916 1464.5,-897 1379.5,-897"/> +<text text-anchor="start" x="1381.5" y="-902.8" font-family="Times,serif" font-size="14.00">hevc_au</text> +<polygon fill="lightgrey" stroke="transparent" points="1379.5,-878 1379.5,-897 1464.5,-897 1464.5,-878 1379.5,-878"/> +<text text-anchor="start" x="1381.5" y="-883.8" font-family="Times,serif" font-size="14.00">mp3_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="1379.5,-859 1379.5,-878 1464.5,-878 1464.5,-859 1379.5,-859"/> +<text text-anchor="start" x="1381.5" y="-864.8" font-family="Times,serif" font-size="14.00">flac_frame</text> </g> <!-- probe&#45;&gt;avi --> <g id="edge129" class="edge"> <title>probe&#45;&gt;avi:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.69,-2055.65C2246.01,-2049.94 1215.31,-2009.52 1052.5,-1766 853.76,-1468.74 1173.68,-1327.31 1181.36,-974.89"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1184.86,-975.06 1181.47,-965.03 1177.86,-974.99 1184.86,-975.06"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.25,-2056.38C2607.46,-2054.61 1472.16,-2032.12 1287.5,-1766 1082.85,-1471.08 1416.21,-1327.02 1422.41,-972.03"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1425.91,-972.03 1422.5,-962 1418.91,-971.97 1425.91,-972.03"/> </g> <!-- bitcoin_blkdat --> <g id="node21" class="node"> <title>bitcoin_blkdat</title> -<polygon fill="paleturquoise" stroke="none" points="820,-1880 820,-1925 937,-1925 937,-1880 820,-1880"/> -<text text-anchor="start" x="822.5" y="-1906.5" font-family="Times,serif" font-size="20.00">bitcoin_blkdat</text> -<polygon fill="lightgrey" stroke="none" points="820.5,-1879.5 820.5,-1898.5 937.5,-1898.5 937.5,-1879.5 820.5,-1879.5"/> -<text text-anchor="start" x="822.5" y="-1885.3" font-family="Times,serif" font-size="14.00">bitcoin_block</text> +<polygon fill="paleturquoise" stroke="transparent" points="1019,-1880 1019,-1925 1168,-1925 1168,-1880 1019,-1880"/> +<text text-anchor="start" x="1021.5" y="-1906.5" font-family="Times,serif" font-size="20.00">bitcoin_blkdat</text> +<polygon fill="lightgrey" stroke="transparent" points="1019.5,-1879.5 1019.5,-1898.5 1168.5,-1898.5 1168.5,-1879.5 1019.5,-1879.5"/> +<text text-anchor="start" x="1021.5" y="-1885.3" font-family="Times,serif" font-size="14.00">bitcoin_block</text> </g> <!-- probe&#45;&gt;bitcoin_blkdat --> <g id="edge131" class="edge"> <title>probe&#45;&gt;bitcoin_blkdat:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.7,-2056.51C2250.08,-2056.22 1251.04,-2050.51 956.5,-1967 923.92,-1957.76 889.67,-1962.63 881.38,-1938.34"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="884.85,-1937.88 879.94,-1928.49 877.93,-1938.9 884.85,-1937.88"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.12,-2056.36C2612.26,-2055.29 1516.25,-2046.08 1187.5,-1967 1147.1,-1957.28 1102.5,-1968.58 1095.46,-1935.48"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1098.94,-1935.12 1094.5,-1925.5 1091.97,-1935.79 1098.94,-1935.12"/> </g> <!-- bzip2 --> <g id="node27" class="node"> <title>bzip2</title> -<polygon fill="paleturquoise" stroke="none" points="1553.5,-1880 1553.5,-1925 1601.5,-1925 1601.5,-1880 1553.5,-1880"/> -<text text-anchor="start" x="1555.5" y="-1906.5" font-family="Times,serif" font-size="20.00">bzip2</text> -<polygon fill="lightgrey" stroke="none" points="1553.5,-1879.5 1553.5,-1898.5 1601.5,-1898.5 1601.5,-1879.5 1553.5,-1879.5"/> -<text text-anchor="start" x="1555.5" y="-1885.3" font-family="Times,serif" font-size="14.00">probe</text> +<polygon fill="paleturquoise" stroke="transparent" points="1840.5,-1880 1840.5,-1925 1900.5,-1925 1900.5,-1880 1840.5,-1880"/> +<text text-anchor="start" x="1842.5" y="-1906.5" font-family="Times,serif" font-size="20.00">bzip2</text> +<polygon fill="lightgrey" stroke="transparent" points="1840.5,-1879.5 1840.5,-1898.5 1900.5,-1898.5 1900.5,-1879.5 1840.5,-1879.5"/> +<text text-anchor="start" x="1842.5" y="-1885.3" font-family="Times,serif" font-size="14.00">probe</text> </g> <!-- probe&#45;&gt;bzip2 --> <g id="edge134" class="edge"> <title>probe&#45;&gt;bzip2:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.89,-2056.13C2308.73,-2054.12 1767.59,-2041.7 1616.5,-1967 1598.24,-1957.97 1584.11,-1952.99 1579.29,-1938.2"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1582.79,-1937.91 1577.92,-1928.5 1575.86,-1938.89 1582.79,-1937.91"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.47,-2056.18C2680.65,-2054.42 2086.2,-2042.83 1915.5,-1967 1894.13,-1957.51 1876.26,-1953.77 1871.65,-1935.64"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1875.11,-1935.04 1870.5,-1925.5 1868.15,-1935.83 1875.11,-1935.04"/> </g> <!-- flac --> <g id="node29" class="node"> <title>flac</title> -<polygon fill="paleturquoise" stroke="none" points="1305.5,-878 1305.5,-942 1421.5,-942 1421.5,-878 1305.5,-878"/> -<text text-anchor="start" x="1348" y="-924" font-family="Times,serif" font-size="20.00">flac</text> -<polygon fill="lightgrey" stroke="none" points="1305.5,-897 1305.5,-916 1421.5,-916 1421.5,-897 1305.5,-897"/> -<text text-anchor="start" x="1307.5" y="-902.8" font-family="Times,serif" font-size="14.00">flac_metadatablocks</text> -<polygon fill="lightgrey" stroke="none" points="1305.5,-878 1305.5,-897 1421.5,-897 1421.5,-878 1305.5,-878"/> -<text text-anchor="start" x="1307.5" y="-883.8" font-family="Times,serif" font-size="14.00">flac_frame</text> +<polygon fill="paleturquoise" stroke="transparent" points="1555,-878 1555,-942 1704,-942 1704,-878 1555,-878"/> +<text text-anchor="start" x="1611.5" y="-924" font-family="Times,serif" font-size="20.00">flac</text> +<polygon fill="lightgrey" stroke="transparent" points="1555.5,-897 1555.5,-916 1704.5,-916 1704.5,-897 1555.5,-897"/> +<text text-anchor="start" x="1557.5" y="-902.8" font-family="Times,serif" font-size="14.00">flac_metadatablocks</text> +<polygon fill="lightgrey" stroke="transparent" points="1555.5,-878 1555.5,-897 1704.5,-897 1704.5,-878 1555.5,-878"/> +<text text-anchor="start" x="1557.5" y="-883.8" font-family="Times,serif" font-size="14.00">flac_frame</text> </g> <!-- probe&#45;&gt;flac --> <g id="edge139" class="edge"> <title>probe&#45;&gt;flac:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.73,-2056.44C2333.95,-2055.49 1952.11,-2046.15 1864.5,-1967 1820.67,-1927.4 1876.99,-1876.86 1832.5,-1838 1721.05,-1740.65 1269.32,-1876.15 1170.5,-1766 1141.19,-1733.33 1161.27,-1413.91 1170.5,-1371 1213.45,-1171.28 1357.28,-1152.39 1363.31,-955.89"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1366.8,-956.08 1363.45,-946.03 1359.8,-955.97 1366.8,-956.08"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.03,-2057.14C2709.34,-2058.16 2290.02,-2053.78 2192.5,-1967 2148.37,-1927.73 2205.21,-1876.61 2160.5,-1838 2035.28,-1729.88 1530.68,-1888.51 1419.5,-1766 1390,-1733.5 1409.54,-1413.74 1419.5,-1371 1466.87,-1167.78 1625.28,-1155.44 1630.37,-953.1"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1633.88,-953.04 1630.5,-943 1626.88,-952.96 1633.88,-953.04"/> </g> <!-- gzip --> <g id="node35" class="node"> <title>gzip</title> -<polygon fill="paleturquoise" stroke="none" points="1751.5,-1880 1751.5,-1925 1789.5,-1925 1789.5,-1880 1751.5,-1880"/> -<text text-anchor="start" x="1753.5" y="-1906.5" font-family="Times,serif" font-size="20.00">gzip</text> -<polygon fill="lightgrey" stroke="none" points="1751.5,-1879.5 1751.5,-1898.5 1789.5,-1898.5 1789.5,-1879.5 1751.5,-1879.5"/> -<text text-anchor="start" x="1753.5" y="-1885.3" font-family="Times,serif" font-size="14.00">probe</text> +<polygon fill="paleturquoise" stroke="transparent" points="2070,-1880 2070,-1925 2117,-1925 2117,-1880 2070,-1880"/> +<text text-anchor="start" x="2072.5" y="-1906.5" font-family="Times,serif" font-size="20.00">gzip</text> +<polygon fill="lightgrey" stroke="transparent" points="2070.5,-1879.5 2070.5,-1898.5 2117.5,-1898.5 2117.5,-1879.5 2070.5,-1879.5"/> +<text text-anchor="start" x="2072.5" y="-1885.3" font-family="Times,serif" font-size="14.00">probe</text> </g> <!-- probe&#45;&gt;gzip --> <g id="edge142" class="edge"> <title>probe&#45;&gt;gzip:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.64,-2054.98C2329.6,-2049.3 1922.94,-2026.56 1808.5,-1967 1790.65,-1957.71 1776.92,-1952.69 1772.24,-1938.06"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1775.75,-1937.92 1770.92,-1928.5 1768.82,-1938.88 1775.75,-1937.92"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.3,-2054.99C2706.03,-2049.61 2263.97,-2028.33 2136.5,-1967 2116.36,-1957.31 2100.07,-1953.06 2095.67,-1935.81"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2099.11,-1935.04 2094.5,-1925.5 2092.15,-1935.83 2099.11,-1935.04"/> </g> <!-- probe&#45;&gt;jpeg --> <g id="edge149" class="edge"> <title>probe&#45;&gt;jpeg:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.86,-2050.44C2410.64,-2041.02 2337.82,-2018.28 2302.5,-1967 2201.98,-1821.07 2271.5,-1746.7 2271.5,-1569.5 2271.5,-1569.5 2271.5,-1569.5 2271.5,-1262 2271.5,-1195.65 2238.51,-713.76 2283.5,-665 2392.95,-546.36 2992.41,-744.56 3025.11,-602.78"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3028.57,-603.33 3026.17,-593.01 3021.61,-602.57 3028.57,-603.33"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.46,-2050.65C2800.44,-2041.73 2723.81,-2019.76 2684.5,-1967 2578.28,-1824.43 2639.5,-1747.3 2639.5,-1569.5 2639.5,-1569.5 2639.5,-1569.5 2639.5,-1262 2639.5,-1195.6 2619.51,-712.89 2665.5,-665 2731.97,-595.79 3500.56,-682.9 3554.52,-599.78"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3557.93,-600.59 3557.5,-590 3551.23,-598.54 3557.93,-600.59"/> </g> <!-- macho_fat --> <g id="node49" class="node"> <title>macho_fat</title> -<polygon fill="paleturquoise" stroke="none" points="1632,-1880 1632,-1925 1721,-1925 1721,-1880 1632,-1880"/> -<text text-anchor="start" x="1634.5" y="-1906.5" font-family="Times,serif" font-size="20.00">macho_fat</text> -<polygon fill="lightgrey" stroke="none" points="1632.5,-1879.5 1632.5,-1898.5 1721.5,-1898.5 1721.5,-1879.5 1632.5,-1879.5"/> -<text text-anchor="start" x="1634.5" y="-1885.3" font-family="Times,serif" font-size="14.00">macho</text> +<polygon fill="paleturquoise" stroke="transparent" points="1931,-1880 1931,-1925 2040,-1925 2040,-1880 1931,-1880"/> +<text text-anchor="start" x="1933.5" y="-1906.5" font-family="Times,serif" font-size="20.00">macho_fat</text> +<polygon fill="lightgrey" stroke="transparent" points="1931.5,-1879.5 1931.5,-1898.5 2040.5,-1898.5 2040.5,-1879.5 1931.5,-1879.5"/> +<text text-anchor="start" x="1933.5" y="-1885.3" font-family="Times,serif" font-size="14.00">macho</text> </g> <!-- probe&#45;&gt;macho_fat --> <g id="edge154" class="edge"> <title>probe&#45;&gt;macho_fat:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.5,-2054.52C2321.81,-2047.04 1870.56,-2018.3 1736.5,-1967 1711.24,-1957.33 1686.6,-1957.26 1679.52,-1938.21"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1683,-1937.82 1677.98,-1928.49 1676.09,-1938.92 1683,-1937.82"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.47,-2054.81C2673.41,-2047.63 2038.85,-2016.28 1989.54,-1935.59"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1992.74,-1934.06 1986.5,-1925.5 1986.04,-1936.08 1992.74,-1934.06"/> </g> <!-- macho --> <g id="node50" class="node"> <title>macho</title> -<polygon fill="paleturquoise" stroke="none" points="1067.5,-1555.5 1067.5,-1581.5 1125.5,-1581.5 1125.5,-1555.5 1067.5,-1555.5"/> -<text text-anchor="start" x="1069.5" y="-1563.5" font-family="Times,serif" font-size="20.00">macho</text> +<polygon fill="paleturquoise" stroke="transparent" points="1303,-1555.5 1303,-1581.5 1374,-1581.5 1374,-1555.5 1303,-1555.5"/> +<text text-anchor="start" x="1305.5" y="-1563.5" font-family="Times,serif" font-size="20.00">macho</text> </g> <!-- probe&#45;&gt;macho --> <g id="edge153" class="edge"> <title>probe&#45;&gt;macho:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.57,-2056.63C2330.44,-2056.28 1930.82,-2048.73 1838.5,-1967 1794.11,-1927.7 1849.43,-1876.69 1804.5,-1838 1580.9,-1645.47 1367.93,-1958.74 1144.5,-1766 1084.04,-1713.84 1095.05,-1671.48 1096.38,-1595.51"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1099.88,-1595.56 1096.47,-1585.53 1092.88,-1595.49 1099.88,-1595.56"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.5,-2053.86C2698.78,-2044.64 2218.34,-2011.93 2166.5,-1967 2121.61,-1928.09 2176.88,-1876.34 2131.5,-1838 1879.77,-1625.3 1647.48,-1976.01 1393.5,-1766 1330.67,-1714.05 1338.68,-1671.17 1339.45,-1592.76"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1342.95,-1592.52 1339.5,-1582.5 1335.95,-1592.48 1342.95,-1592.52"/> </g> <!-- matroska --> <g id="node51" class="node"> <title>matroska</title> -<polygon fill="paleturquoise" stroke="none" points="1440.5,-1375 1440.5,-1762 1556.5,-1762 1556.5,-1375 1440.5,-1375"/> -<text text-anchor="start" x="1462" y="-1743.5" font-family="Times,serif" font-size="20.00">matroska</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1716.5 1440.5,-1735.5 1556.5,-1735.5 1556.5,-1716.5 1440.5,-1716.5"/> -<text text-anchor="start" x="1442.5" y="-1722.3" font-family="Times,serif" font-size="14.00">aac_frame</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1697.5 1440.5,-1716.5 1556.5,-1716.5 1556.5,-1697.5 1440.5,-1697.5"/> -<text text-anchor="start" x="1442.5" y="-1703.3" font-family="Times,serif" font-size="14.00">av1_ccr</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1678.5 1440.5,-1697.5 1556.5,-1697.5 1556.5,-1678.5 1440.5,-1678.5"/> -<text text-anchor="start" x="1442.5" y="-1684.3" font-family="Times,serif" font-size="14.00">av1_frame</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1659.5 1440.5,-1678.5 1556.5,-1678.5 1556.5,-1659.5 1440.5,-1659.5"/> -<text text-anchor="start" x="1442.5" y="-1665.3" font-family="Times,serif" font-size="14.00">avc_au</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1640.5 1440.5,-1659.5 1556.5,-1659.5 1556.5,-1640.5 1440.5,-1640.5"/> -<text text-anchor="start" x="1442.5" y="-1646.3" font-family="Times,serif" font-size="14.00">avc_dcr</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1621.5 1440.5,-1640.5 1556.5,-1640.5 1556.5,-1621.5 1440.5,-1621.5"/> -<text text-anchor="start" x="1442.5" y="-1627.3" font-family="Times,serif" font-size="14.00">flac_frame</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1602.5 1440.5,-1621.5 1556.5,-1621.5 1556.5,-1602.5 1440.5,-1602.5"/> -<text text-anchor="start" x="1442.5" y="-1608.3" font-family="Times,serif" font-size="14.00">flac_metadatablocks</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1583.5 1440.5,-1602.5 1556.5,-1602.5 1556.5,-1583.5 1440.5,-1583.5"/> -<text text-anchor="start" x="1442.5" y="-1589.3" font-family="Times,serif" font-size="14.00">hevc_au</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1564.5 1440.5,-1583.5 1556.5,-1583.5 1556.5,-1564.5 1440.5,-1564.5"/> -<text text-anchor="start" x="1442.5" y="-1570.3" font-family="Times,serif" font-size="14.00">hevc_dcr</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1545.5 1440.5,-1564.5 1556.5,-1564.5 1556.5,-1545.5 1440.5,-1545.5"/> -<text text-anchor="start" x="1442.5" y="-1551.3" font-family="Times,serif" font-size="14.00">image</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1526.5 1440.5,-1545.5 1556.5,-1545.5 1556.5,-1526.5 1440.5,-1526.5"/> -<text text-anchor="start" x="1442.5" y="-1532.3" font-family="Times,serif" font-size="14.00">mp3_frame</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1507.5 1440.5,-1526.5 1556.5,-1526.5 1556.5,-1507.5 1440.5,-1507.5"/> -<text text-anchor="start" x="1442.5" y="-1513.3" font-family="Times,serif" font-size="14.00">mpeg_asc</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1488.5 1440.5,-1507.5 1556.5,-1507.5 1556.5,-1488.5 1440.5,-1488.5"/> -<text text-anchor="start" x="1442.5" y="-1494.3" font-family="Times,serif" font-size="14.00">mpeg_pes_packet</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1469.5 1440.5,-1488.5 1556.5,-1488.5 1556.5,-1469.5 1440.5,-1469.5"/> -<text text-anchor="start" x="1442.5" y="-1475.3" font-family="Times,serif" font-size="14.00">mpeg_spu</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1450.5 1440.5,-1469.5 1556.5,-1469.5 1556.5,-1450.5 1440.5,-1450.5"/> -<text text-anchor="start" x="1442.5" y="-1456.3" font-family="Times,serif" font-size="14.00">opus_packet</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1431.5 1440.5,-1450.5 1556.5,-1450.5 1556.5,-1431.5 1440.5,-1431.5"/> -<text text-anchor="start" x="1442.5" y="-1437.3" font-family="Times,serif" font-size="14.00">vorbis_packet</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1412.5 1440.5,-1431.5 1556.5,-1431.5 1556.5,-1412.5 1440.5,-1412.5"/> -<text text-anchor="start" x="1442.5" y="-1418.3" font-family="Times,serif" font-size="14.00">vp8_frame</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1393.5 1440.5,-1412.5 1556.5,-1412.5 1556.5,-1393.5 1440.5,-1393.5"/> -<text text-anchor="start" x="1442.5" y="-1399.3" font-family="Times,serif" font-size="14.00">vp9_cfm</text> -<polygon fill="lightgrey" stroke="none" points="1440.5,-1374.5 1440.5,-1393.5 1556.5,-1393.5 1556.5,-1374.5 1440.5,-1374.5"/> -<text text-anchor="start" x="1442.5" y="-1380.3" font-family="Times,serif" font-size="14.00">vp9_frame</text> +<polygon fill="paleturquoise" stroke="transparent" points="1690,-1375 1690,-1762 1839,-1762 1839,-1375 1690,-1375"/> +<text text-anchor="start" x="1717" y="-1743.5" font-family="Times,serif" font-size="20.00">matroska</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1716.5 1690.5,-1735.5 1839.5,-1735.5 1839.5,-1716.5 1690.5,-1716.5"/> +<text text-anchor="start" x="1692.5" y="-1722.3" font-family="Times,serif" font-size="14.00">aac_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1697.5 1690.5,-1716.5 1839.5,-1716.5 1839.5,-1697.5 1690.5,-1697.5"/> +<text text-anchor="start" x="1692.5" y="-1703.3" font-family="Times,serif" font-size="14.00">av1_ccr</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1678.5 1690.5,-1697.5 1839.5,-1697.5 1839.5,-1678.5 1690.5,-1678.5"/> +<text text-anchor="start" x="1692.5" y="-1684.3" font-family="Times,serif" font-size="14.00">av1_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1659.5 1690.5,-1678.5 1839.5,-1678.5 1839.5,-1659.5 1690.5,-1659.5"/> +<text text-anchor="start" x="1692.5" y="-1665.3" font-family="Times,serif" font-size="14.00">avc_au</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1640.5 1690.5,-1659.5 1839.5,-1659.5 1839.5,-1640.5 1690.5,-1640.5"/> +<text text-anchor="start" x="1692.5" y="-1646.3" font-family="Times,serif" font-size="14.00">avc_dcr</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1621.5 1690.5,-1640.5 1839.5,-1640.5 1839.5,-1621.5 1690.5,-1621.5"/> +<text text-anchor="start" x="1692.5" y="-1627.3" font-family="Times,serif" font-size="14.00">flac_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1602.5 1690.5,-1621.5 1839.5,-1621.5 1839.5,-1602.5 1690.5,-1602.5"/> +<text text-anchor="start" x="1692.5" y="-1608.3" font-family="Times,serif" font-size="14.00">flac_metadatablocks</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1583.5 1690.5,-1602.5 1839.5,-1602.5 1839.5,-1583.5 1690.5,-1583.5"/> +<text text-anchor="start" x="1692.5" y="-1589.3" font-family="Times,serif" font-size="14.00">hevc_au</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1564.5 1690.5,-1583.5 1839.5,-1583.5 1839.5,-1564.5 1690.5,-1564.5"/> +<text text-anchor="start" x="1692.5" y="-1570.3" font-family="Times,serif" font-size="14.00">hevc_dcr</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1545.5 1690.5,-1564.5 1839.5,-1564.5 1839.5,-1545.5 1690.5,-1545.5"/> +<text text-anchor="start" x="1692.5" y="-1551.3" font-family="Times,serif" font-size="14.00">image</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1526.5 1690.5,-1545.5 1839.5,-1545.5 1839.5,-1526.5 1690.5,-1526.5"/> +<text text-anchor="start" x="1692.5" y="-1532.3" font-family="Times,serif" font-size="14.00">mp3_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1507.5 1690.5,-1526.5 1839.5,-1526.5 1839.5,-1507.5 1690.5,-1507.5"/> +<text text-anchor="start" x="1692.5" y="-1513.3" font-family="Times,serif" font-size="14.00">mpeg_asc</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1488.5 1690.5,-1507.5 1839.5,-1507.5 1839.5,-1488.5 1690.5,-1488.5"/> +<text text-anchor="start" x="1692.5" y="-1494.3" font-family="Times,serif" font-size="14.00">mpeg_pes_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1469.5 1690.5,-1488.5 1839.5,-1488.5 1839.5,-1469.5 1690.5,-1469.5"/> +<text text-anchor="start" x="1692.5" y="-1475.3" font-family="Times,serif" font-size="14.00">mpeg_spu</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1450.5 1690.5,-1469.5 1839.5,-1469.5 1839.5,-1450.5 1690.5,-1450.5"/> +<text text-anchor="start" x="1692.5" y="-1456.3" font-family="Times,serif" font-size="14.00">opus_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1431.5 1690.5,-1450.5 1839.5,-1450.5 1839.5,-1431.5 1690.5,-1431.5"/> +<text text-anchor="start" x="1692.5" y="-1437.3" font-family="Times,serif" font-size="14.00">vorbis_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1412.5 1690.5,-1431.5 1839.5,-1431.5 1839.5,-1412.5 1690.5,-1412.5"/> +<text text-anchor="start" x="1692.5" y="-1418.3" font-family="Times,serif" font-size="14.00">vp8_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1393.5 1690.5,-1412.5 1839.5,-1412.5 1839.5,-1393.5 1690.5,-1393.5"/> +<text text-anchor="start" x="1692.5" y="-1399.3" font-family="Times,serif" font-size="14.00">vp9_cfm</text> +<polygon fill="lightgrey" stroke="transparent" points="1690.5,-1374.5 1690.5,-1393.5 1839.5,-1393.5 1839.5,-1374.5 1690.5,-1374.5"/> +<text text-anchor="start" x="1692.5" y="-1380.3" font-family="Times,serif" font-size="14.00">vp9_frame</text> </g> <!-- probe&#45;&gt;matroska --> <g id="edge155" class="edge"> <title>probe&#45;&gt;matroska:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.57,-2054.86C2351.17,-2049.53 2061.89,-2029.23 1994.5,-1967 1950.94,-1926.77 2004.38,-1877.87 1960.5,-1838 1886.96,-1771.19 1532.47,-1858.02 1500.77,-1775.33"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1504.21,-1774.72 1499.03,-1765.48 1497.32,-1775.94 1504.21,-1774.72"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.16,-2055.35C2730.55,-2051.41 2415.1,-2034.66 2340.5,-1967 2296.58,-1927.17 2350.85,-1877.36 2306.5,-1838 2218.37,-1759.78 1791.57,-1876.66 1766.64,-1772.54"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1770.1,-1772.04 1765.5,-1762.5 1763.15,-1772.83 1770.1,-1772.04"/> </g> <!-- mp3 --> <g id="node61" class="node"> <title>mp3</title> -<polygon fill="paleturquoise" stroke="none" points="2373.5,-1842 2373.5,-1963 2441.5,-1963 2441.5,-1842 2373.5,-1842"/> -<text text-anchor="start" x="2389.5" y="-1944.5" font-family="Times,serif" font-size="20.00">mp3</text> -<polygon fill="lightgrey" stroke="none" points="2373.5,-1917.5 2373.5,-1936.5 2441.5,-1936.5 2441.5,-1917.5 2373.5,-1917.5"/> -<text text-anchor="start" x="2375.5" y="-1923.3" font-family="Times,serif" font-size="14.00">id3v2</text> -<polygon fill="lightgrey" stroke="none" points="2373.5,-1898.5 2373.5,-1917.5 2441.5,-1917.5 2441.5,-1898.5 2373.5,-1898.5"/> -<text text-anchor="start" x="2375.5" y="-1904.3" font-family="Times,serif" font-size="14.00">id3v1</text> -<polygon fill="lightgrey" stroke="none" points="2373.5,-1879.5 2373.5,-1898.5 2441.5,-1898.5 2441.5,-1879.5 2373.5,-1879.5"/> -<text text-anchor="start" x="2375.5" y="-1885.3" font-family="Times,serif" font-size="14.00">id3v11</text> -<polygon fill="lightgrey" stroke="none" points="2373.5,-1860.5 2373.5,-1879.5 2441.5,-1879.5 2441.5,-1860.5 2373.5,-1860.5"/> -<text text-anchor="start" x="2375.5" y="-1866.3" font-family="Times,serif" font-size="14.00">apev2</text> -<polygon fill="lightgrey" stroke="none" points="2373.5,-1841.5 2373.5,-1860.5 2441.5,-1860.5 2441.5,-1841.5 2373.5,-1841.5"/> -<text text-anchor="start" x="2375.5" y="-1847.3" font-family="Times,serif" font-size="14.00">mp3_frame</text> +<polygon fill="paleturquoise" stroke="transparent" points="2756,-1842 2756,-1963 2841,-1963 2841,-1842 2756,-1842"/> +<text text-anchor="start" x="2776.5" y="-1944.5" font-family="Times,serif" font-size="20.00">mp3</text> +<polygon fill="lightgrey" stroke="transparent" points="2756.5,-1917.5 2756.5,-1936.5 2841.5,-1936.5 2841.5,-1917.5 2756.5,-1917.5"/> +<text text-anchor="start" x="2758.5" y="-1923.3" font-family="Times,serif" font-size="14.00">id3v2</text> +<polygon fill="lightgrey" stroke="transparent" points="2756.5,-1898.5 2756.5,-1917.5 2841.5,-1917.5 2841.5,-1898.5 2756.5,-1898.5"/> +<text text-anchor="start" x="2758.5" y="-1904.3" font-family="Times,serif" font-size="14.00">id3v1</text> +<polygon fill="lightgrey" stroke="transparent" points="2756.5,-1879.5 2756.5,-1898.5 2841.5,-1898.5 2841.5,-1879.5 2756.5,-1879.5"/> +<text text-anchor="start" x="2758.5" y="-1885.3" font-family="Times,serif" font-size="14.00">id3v11</text> +<polygon fill="lightgrey" stroke="transparent" points="2756.5,-1860.5 2756.5,-1879.5 2841.5,-1879.5 2841.5,-1860.5 2756.5,-1860.5"/> +<text text-anchor="start" x="2758.5" y="-1866.3" font-family="Times,serif" font-size="14.00">apev2</text> +<polygon fill="lightgrey" stroke="transparent" points="2756.5,-1841.5 2756.5,-1860.5 2841.5,-1860.5 2841.5,-1841.5 2756.5,-1841.5"/> +<text text-anchor="start" x="2758.5" y="-1847.3" font-family="Times,serif" font-size="14.00">mp3_frame</text> </g> <!-- probe&#45;&gt;mp3 --> <g id="edge156" class="edge"> <title>probe&#45;&gt;mp3:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2461.65,-2039.62C2440.71,-2025.65 2415.37,-2003.7 2409,-1976.41"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2412.48,-1976.03 2407.85,-1966.51 2405.53,-1976.84 2412.48,-1976.03"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2858.58,-2039.36C2834.41,-2025.34 2805.98,-2003.04 2800.46,-1973.71"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2803.92,-1973.13 2799.5,-1963.5 2796.95,-1973.78 2803.92,-1973.13"/> </g> <!-- probe&#45;&gt;mp4 --> <g id="edge159" class="edge"> <title>probe&#45;&gt;mp4:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.81,-2048.23C2406.86,-2036.15 2321.8,-2010.29 2260.5,-1967 2164.22,-1899.01 2135.65,-1873.58 2087.5,-1766 1988.79,-1545.46 2089.11,-1457.46 2016.5,-1227 2006.66,-1195.79 1984.37,-1190.55 1978.79,-1164.89"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1982.28,-1164.61 1977.8,-1155.01 1975.31,-1165.31 1982.28,-1164.61"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.36,-2048.06C2794.1,-2036.26 2699.15,-2011.17 2628.5,-1967 2522.17,-1900.52 2485.23,-1878.82 2430.5,-1766 2325.11,-1548.76 2451.86,-1451.31 2362.5,-1227 2348.58,-1192.05 2314.44,-1192.83 2308.41,-1162.09"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2311.89,-1161.64 2307.5,-1152 2304.92,-1162.28 2311.89,-1161.64"/> </g> <!-- probe&#45;&gt;png --> <g id="edge165" class="edge"> <title>probe&#45;&gt;png:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.54,-2046.49C2417.8,-2034.36 2363.44,-2009.99 2338.5,-1967 2293.67,-1889.73 2336.94,-1855.34 2336.5,-1766 2335.63,-1590.45 2290.68,-1540.47 2336.5,-1371 2346.17,-1335.24 2367.96,-1334.52 2378.5,-1299 2418.63,-1163.77 2312.61,-767.51 2409.5,-665 2515.39,-552.96 3085.85,-737.64 3118.08,-602.63"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3121.52,-603.34 3119.16,-593.01 3114.57,-602.55 3121.52,-603.34"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.13,-2047.06C2807.6,-2035.77 2748.51,-2012.39 2720.5,-1967 2673.59,-1890.97 2718.94,-1855.34 2718.5,-1766 2717.63,-1590.45 2669.27,-1539.51 2718.5,-1371 2729.15,-1334.55 2752.96,-1335.18 2764.5,-1299 2807.35,-1164.61 2697.63,-766.58 2795.5,-665 2860.25,-597.8 3606.01,-680.33 3661.27,-600.03"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3664.76,-600.59 3664.5,-590 3658.1,-598.44 3664.76,-600.59"/> </g> <!-- ogg --> <g id="node73" class="node"> <title>ogg</title> -<polygon fill="paleturquoise" stroke="none" points="1692,-849.5 1692,-970.5 1803,-970.5 1803,-849.5 1692,-849.5"/> -<text text-anchor="start" x="1733" y="-952" font-family="Times,serif" font-size="20.00">ogg</text> -<polygon fill="lightgrey" stroke="none" points="1692.5,-925 1692.5,-944 1803.5,-944 1803.5,-925 1692.5,-925"/> -<text text-anchor="start" x="1694.5" y="-930.8" font-family="Times,serif" font-size="14.00">ogg_page</text> -<polygon fill="lightgrey" stroke="none" points="1692.5,-906 1692.5,-925 1803.5,-925 1803.5,-906 1692.5,-906"/> -<text text-anchor="start" x="1694.5" y="-911.8" font-family="Times,serif" font-size="14.00">vorbis_packet</text> -<polygon fill="lightgrey" stroke="none" points="1692.5,-887 1692.5,-906 1803.5,-906 1803.5,-887 1692.5,-887"/> -<text text-anchor="start" x="1694.5" y="-892.8" font-family="Times,serif" font-size="14.00">opus_packet</text> -<polygon fill="lightgrey" stroke="none" points="1692.5,-868 1692.5,-887 1803.5,-887 1803.5,-868 1692.5,-868"/> -<text text-anchor="start" x="1694.5" y="-873.8" font-family="Times,serif" font-size="14.00">flac_metadatablock</text> -<polygon fill="lightgrey" stroke="none" points="1692.5,-849 1692.5,-868 1803.5,-868 1803.5,-849 1692.5,-849"/> -<text text-anchor="start" x="1694.5" y="-854.8" font-family="Times,serif" font-size="14.00">flac_frame</text> +<polygon fill="paleturquoise" stroke="transparent" points="1975,-849.5 1975,-970.5 2116,-970.5 2116,-849.5 1975,-849.5"/> +<text text-anchor="start" x="2027" y="-952" font-family="Times,serif" font-size="20.00">ogg</text> +<polygon fill="lightgrey" stroke="transparent" points="1975.5,-925 1975.5,-944 2116.5,-944 2116.5,-925 1975.5,-925"/> +<text text-anchor="start" x="1977.5" y="-930.8" font-family="Times,serif" font-size="14.00">ogg_page</text> +<polygon fill="lightgrey" stroke="transparent" points="1975.5,-906 1975.5,-925 2116.5,-925 2116.5,-906 1975.5,-906"/> +<text text-anchor="start" x="1977.5" y="-911.8" font-family="Times,serif" font-size="14.00">vorbis_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="1975.5,-887 1975.5,-906 2116.5,-906 2116.5,-887 1975.5,-887"/> +<text text-anchor="start" x="1977.5" y="-892.8" font-family="Times,serif" font-size="14.00">opus_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="1975.5,-868 1975.5,-887 2116.5,-887 2116.5,-868 1975.5,-868"/> +<text text-anchor="start" x="1977.5" y="-873.8" font-family="Times,serif" font-size="14.00">flac_metadatablock</text> +<polygon fill="lightgrey" stroke="transparent" points="1975.5,-849 1975.5,-868 2116.5,-868 2116.5,-849 1975.5,-849"/> +<text text-anchor="start" x="1977.5" y="-854.8" font-family="Times,serif" font-size="14.00">flac_frame</text> </g> <!-- probe&#45;&gt;ogg --> <g id="edge162" class="edge"> <title>probe&#45;&gt;ogg:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.6,-2051.85C2371.31,-2040.69 2172.04,-2010.1 2121.5,-1967 2047.75,-1904.1 1755.32,-1355.05 1748.62,-983.85"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1752.12,-983.99 1748.53,-974.03 1745.12,-984.06 1752.12,-983.99"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.19,-2052.26C2751.81,-2042.31 2526.65,-2014.68 2468.5,-1967 2397.83,-1909.05 2052.13,-1399.07 2046.57,-981.16"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2050.07,-980.98 2046.5,-971 2043.07,-981.02 2050.07,-980.98"/> </g> <!-- pcap --> <g id="node75" class="node"> <title>pcap</title> -<polygon fill="paleturquoise" stroke="none" points="3298,-1861 3298,-1944 3369,-1944 3369,-1861 3298,-1861"/> -<text text-anchor="start" x="3315" y="-1925.5" font-family="Times,serif" font-size="20.00">pcap</text> -<polygon fill="lightgrey" stroke="none" points="3298.5,-1898.5 3298.5,-1917.5 3369.5,-1917.5 3369.5,-1898.5 3298.5,-1898.5"/> -<text text-anchor="start" x="3300.5" y="-1904.3" font-family="Times,serif" font-size="14.00">link_frame</text> -<polygon fill="lightgrey" stroke="none" points="3298.5,-1879.5 3298.5,-1898.5 3369.5,-1898.5 3369.5,-1879.5 3298.5,-1879.5"/> -<text text-anchor="start" x="3300.5" y="-1885.3" font-family="Times,serif" font-size="14.00">tcp_stream</text> -<polygon fill="lightgrey" stroke="none" points="3298.5,-1860.5 3298.5,-1879.5 3369.5,-1879.5 3369.5,-1860.5 3298.5,-1860.5"/> -<text text-anchor="start" x="3300.5" y="-1866.3" font-family="Times,serif" font-size="14.00">ipv4_packet</text> +<polygon fill="paleturquoise" stroke="transparent" points="3808,-1861 3808,-1944 3897,-1944 3897,-1861 3808,-1861"/> +<text text-anchor="start" x="3828.5" y="-1925.5" font-family="Times,serif" font-size="20.00">pcap</text> +<polygon fill="lightgrey" stroke="transparent" points="3808.5,-1898.5 3808.5,-1917.5 3897.5,-1917.5 3897.5,-1898.5 3808.5,-1898.5"/> +<text text-anchor="start" x="3810.5" y="-1904.3" font-family="Times,serif" font-size="14.00">link_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="3808.5,-1879.5 3808.5,-1898.5 3897.5,-1898.5 3897.5,-1879.5 3808.5,-1879.5"/> +<text text-anchor="start" x="3810.5" y="-1885.3" font-family="Times,serif" font-size="14.00">tcp_stream</text> +<polygon fill="lightgrey" stroke="transparent" points="3808.5,-1860.5 3808.5,-1879.5 3897.5,-1879.5 3897.5,-1860.5 3808.5,-1860.5"/> +<text text-anchor="start" x="3810.5" y="-1866.3" font-family="Times,serif" font-size="14.00">ipv4_packet</text> </g> <!-- probe&#45;&gt;pcap --> <g id="edge163" class="edge"> <title>probe&#45;&gt;pcap:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.07,-2041.33C2530.9,-2040.45 2533.73,-2039.66 2536.5,-2039 2860.55,-1961.91 2959.95,-2050.15 3282.5,-1967 3301.55,-1962.09 3322.57,-1966.49 3330.86,-1956.64"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3334.11,-1957.98 3333.63,-1947.4 3327.4,-1955.97 3334.11,-1957.98"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.7,-2040.58C2941.99,-2040 2944.26,-2039.46 2946.5,-2039 3315.98,-1962.27 3424.17,-2049.03 3792.5,-1967 3816.74,-1961.6 3844.37,-1970.21 3851.66,-1954.39"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3855.11,-1954.97 3853.5,-1944.5 3848.23,-1953.69 3855.11,-1954.97"/> </g> <!-- pcapng --> <g id="node78" class="node"> <title>pcapng</title> -<polygon fill="paleturquoise" stroke="none" points="2642,-1861 2642,-1944 2713,-1944 2713,-1861 2642,-1861"/> -<text text-anchor="start" x="2649" y="-1925.5" font-family="Times,serif" font-size="20.00">pcapng</text> -<polygon fill="lightgrey" stroke="none" points="2642.5,-1898.5 2642.5,-1917.5 2713.5,-1917.5 2713.5,-1898.5 2642.5,-1898.5"/> -<text text-anchor="start" x="2644.5" y="-1904.3" font-family="Times,serif" font-size="14.00">link_frame</text> -<polygon fill="lightgrey" stroke="none" points="2642.5,-1879.5 2642.5,-1898.5 2713.5,-1898.5 2713.5,-1879.5 2642.5,-1879.5"/> -<text text-anchor="start" x="2644.5" y="-1885.3" font-family="Times,serif" font-size="14.00">tcp_stream</text> -<polygon fill="lightgrey" stroke="none" points="2642.5,-1860.5 2642.5,-1879.5 2713.5,-1879.5 2713.5,-1860.5 2642.5,-1860.5"/> -<text text-anchor="start" x="2644.5" y="-1866.3" font-family="Times,serif" font-size="14.00">ipv4_packet</text> +<polygon fill="paleturquoise" stroke="transparent" points="3062,-1861 3062,-1944 3151,-1944 3151,-1861 3062,-1861"/> +<text text-anchor="start" x="3069.5" y="-1925.5" font-family="Times,serif" font-size="20.00">pcapng</text> +<polygon fill="lightgrey" stroke="transparent" points="3062.5,-1898.5 3062.5,-1917.5 3151.5,-1917.5 3151.5,-1898.5 3062.5,-1898.5"/> +<text text-anchor="start" x="3064.5" y="-1904.3" font-family="Times,serif" font-size="14.00">link_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="3062.5,-1879.5 3062.5,-1898.5 3151.5,-1898.5 3151.5,-1879.5 3062.5,-1879.5"/> +<text text-anchor="start" x="3064.5" y="-1885.3" font-family="Times,serif" font-size="14.00">tcp_stream</text> +<polygon fill="lightgrey" stroke="transparent" points="3062.5,-1860.5 3062.5,-1879.5 3151.5,-1879.5 3151.5,-1860.5 3062.5,-1860.5"/> +<text text-anchor="start" x="3064.5" y="-1866.3" font-family="Times,serif" font-size="14.00">ipv4_packet</text> </g> <!-- probe&#45;&gt;pcapng --> <g id="edge164" class="edge"> <title>probe&#45;&gt;pcapng:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2526.24,-2039.69C2571.65,-2017.25 2648.18,-1977.74 2671.53,-1955.26"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2674.36,-1957.34 2676.85,-1947.04 2668.48,-1953.53 2674.36,-1957.34"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2935.57,-2039.47C2989.49,-2016.56 3079.93,-1976.08 3102.35,-1953.32"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3105.49,-1954.9 3107.5,-1944.5 3099.44,-1951.38 3105.49,-1954.9"/> </g> <!-- tar --> <g id="node84" class="node"> <title>tar</title> -<polygon fill="paleturquoise" stroke="none" points="2473,-1880 2473,-1925 2508,-1925 2508,-1880 2473,-1880"/> -<text text-anchor="start" x="2480" y="-1906.5" font-family="Times,serif" font-size="20.00">tar</text> -<polygon fill="lightgrey" stroke="none" points="2473.5,-1879.5 2473.5,-1898.5 2508.5,-1898.5 2508.5,-1879.5 2473.5,-1879.5"/> -<text text-anchor="start" x="2475.5" y="-1885.3" font-family="Times,serif" font-size="14.00">probe</text> +<polygon fill="paleturquoise" stroke="transparent" points="2871.5,-1880 2871.5,-1925 2917.5,-1925 2917.5,-1880 2871.5,-1880"/> +<text text-anchor="start" x="2879" y="-1906.5" font-family="Times,serif" font-size="20.00">tar</text> +<polygon fill="lightgrey" stroke="transparent" points="2871.5,-1879.5 2871.5,-1898.5 2917.5,-1898.5 2917.5,-1879.5 2871.5,-1879.5"/> +<text text-anchor="start" x="2873.5" y="-1885.3" font-family="Times,serif" font-size="14.00">probe</text> </g> <!-- probe&#45;&gt;tar --> <g id="edge170" class="edge"> <title>probe&#45;&gt;tar:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2491.5,-2039.54C2491.5,-2017.11 2491.5,-1975.98 2491.5,-1938.16"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2495,-1938.53 2491.5,-1928.53 2488,-1938.53 2495,-1938.53"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2894.5,-2039.12C2894.5,-2016.09 2894.5,-1973.9 2894.5,-1935.65"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2898,-1935.5 2894.5,-1925.5 2891,-1935.5 2898,-1935.5"/> </g> <!-- probe&#45;&gt;tiff --> <g id="edge172" class="edge"> <title>probe&#45;&gt;tiff:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.58,-2043.22C2422.68,-2029.54 2378.64,-2004.83 2358.5,-1967 2327.38,-1908.55 2339.93,-1434.56 2358.5,-1371 2369.15,-1334.55 2391.31,-1334.61 2404.5,-1299 2460.08,-1149 2456.72,-1099.89 2456.51,-945.76"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2460.01,-946.02 2456.5,-936.03 2453.01,-946.03 2460.01,-946.02"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.34,-2043.77C2813.05,-2030.89 2764.47,-2007.04 2741.5,-1967 2708.55,-1909.56 2722.01,-1434.29 2741.5,-1371 2752.89,-1334.01 2776.19,-1334.97 2790.5,-1299 2850.11,-1149.2 2849.55,-1099.88 2849.5,-943.46"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2853,-943 2849.5,-933 2846,-943 2853,-943"/> </g> <!-- wav --> <g id="node90" class="node"> <title>wav</title> -<polygon fill="paleturquoise" stroke="none" points="2539.5,-1861 2539.5,-1944 2581.5,-1944 2581.5,-1861 2539.5,-1861"/> -<text text-anchor="start" x="2543.5" y="-1925.5" font-family="Times,serif" font-size="20.00">wav</text> -<polygon fill="lightgrey" stroke="none" points="2539.5,-1898.5 2539.5,-1917.5 2581.5,-1917.5 2581.5,-1898.5 2539.5,-1898.5"/> -<text text-anchor="start" x="2541.5" y="-1904.3" font-family="Times,serif" font-size="14.00">id3v2</text> -<polygon fill="lightgrey" stroke="none" points="2539.5,-1879.5 2539.5,-1898.5 2581.5,-1898.5 2581.5,-1879.5 2539.5,-1879.5"/> -<text text-anchor="start" x="2541.5" y="-1885.3" font-family="Times,serif" font-size="14.00">id3v1</text> -<polygon fill="lightgrey" stroke="none" points="2539.5,-1860.5 2539.5,-1879.5 2581.5,-1879.5 2581.5,-1860.5 2539.5,-1860.5"/> -<text text-anchor="start" x="2541.5" y="-1866.3" font-family="Times,serif" font-size="14.00">id3v11</text> +<polygon fill="paleturquoise" stroke="transparent" points="2948,-1861 2948,-1944 3001,-1944 3001,-1861 2948,-1861"/> +<text text-anchor="start" x="2954.5" y="-1925.5" font-family="Times,serif" font-size="20.00">wav</text> +<polygon fill="lightgrey" stroke="transparent" points="2948.5,-1898.5 2948.5,-1917.5 3001.5,-1917.5 3001.5,-1898.5 2948.5,-1898.5"/> +<text text-anchor="start" x="2950.5" y="-1904.3" font-family="Times,serif" font-size="14.00">id3v2</text> +<polygon fill="lightgrey" stroke="transparent" points="2948.5,-1879.5 2948.5,-1898.5 3001.5,-1898.5 3001.5,-1879.5 2948.5,-1879.5"/> +<text text-anchor="start" x="2950.5" y="-1885.3" font-family="Times,serif" font-size="14.00">id3v1</text> +<polygon fill="lightgrey" stroke="transparent" points="2948.5,-1860.5 2948.5,-1879.5 3001.5,-1879.5 3001.5,-1860.5 2948.5,-1860.5"/> +<text text-anchor="start" x="2950.5" y="-1866.3" font-family="Times,serif" font-size="14.00">id3v11</text> </g> <!-- probe&#45;&gt;wav --> <g id="edge179" class="edge"> <title>probe&#45;&gt;wav:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2509.99,-2039.86C2528.19,-2021.77 2554.04,-1990.88 2559.47,-1957.07"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2562.93,-1957.77 2560.25,-1947.52 2555.95,-1957.2 2562.93,-1957.77"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2917.49,-2039.48C2939.38,-2021.31 2969.72,-1990.28 2974.77,-1954.66"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2978.28,-1954.72 2975.5,-1944.5 2971.3,-1954.22 2978.28,-1954.72"/> </g> <!-- probe&#45;&gt;webp --> <g id="edge180" class="edge"> <title>probe&#45;&gt;webp:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2454.71,-2055.91C2249.72,-2052.36 1253.42,-2031.87 1134.5,-1967 1036.88,-1913.75 1023.52,-1870.5 985.5,-1766 860.18,-1421.55 933.73,-1306.58 935.47,-945.93"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="938.97,-946.04 935.49,-936.03 931.97,-946.02 938.97,-946.04"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2849.23,-2056.12C2610.08,-2053.83 1499.77,-2039.34 1366.5,-1967 957.54,-1745.01 1155.55,-1406.76 1158.47,-943.28"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="1161.97,-943.01 1158.5,-933 1154.97,-942.99 1161.97,-943.01"/> </g> <!-- zip --> <g id="node92" class="node"> <title>zip</title> -<polygon fill="paleturquoise" stroke="none" points="2745,-1880 2745,-1925 2780,-1925 2780,-1880 2745,-1880"/> -<text text-anchor="start" x="2750.5" y="-1906.5" font-family="Times,serif" font-size="20.00">zip</text> -<polygon fill="lightgrey" stroke="none" points="2745.5,-1879.5 2745.5,-1898.5 2780.5,-1898.5 2780.5,-1879.5 2745.5,-1879.5"/> -<text text-anchor="start" x="2747.5" y="-1885.3" font-family="Times,serif" font-size="14.00">probe</text> +<polygon fill="paleturquoise" stroke="transparent" points="3181.5,-1880 3181.5,-1925 3227.5,-1925 3227.5,-1880 3181.5,-1880"/> +<text text-anchor="start" x="3189" y="-1906.5" font-family="Times,serif" font-size="20.00">zip</text> +<polygon fill="lightgrey" stroke="transparent" points="3181.5,-1879.5 3181.5,-1898.5 3227.5,-1898.5 3227.5,-1879.5 3181.5,-1879.5"/> +<text text-anchor="start" x="3183.5" y="-1885.3" font-family="Times,serif" font-size="14.00">probe</text> </g> <!-- probe&#45;&gt;zip --> <g id="edge184" class="edge"> <title>probe&#45;&gt;zip:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.32,-2042.14C2531.09,-2041.07 2533.84,-2040.02 2536.5,-2039 2637.65,-2000.37 2753.79,-2035.26 2762.92,-1938.33"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2766.41,-1938.67 2763.36,-1928.52 2759.42,-1938.36 2766.41,-1938.67"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.59,-2041.3C2941.93,-2040.52 2944.24,-2039.75 2946.5,-2039 3062.03,-2000.66 3196.64,-2047.94 3204.17,-1935.72"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3207.67,-1935.61 3204.5,-1925.5 3200.68,-1935.38 3207.67,-1935.61"/> </g> <!-- aiff --> <g id="node93" class="node"> <title>aiff</title> -<polygon fill="paleturquoise" stroke="none" points="2814.5,-1889.5 2814.5,-1915.5 2846.5,-1915.5 2846.5,-1889.5 2814.5,-1889.5"/> -<text text-anchor="start" x="2816.5" y="-1897.5" font-family="Times,serif" font-size="20.00">aiff</text> +<polygon fill="paleturquoise" stroke="transparent" points="3257.5,-1889.5 3257.5,-1915.5 3295.5,-1915.5 3295.5,-1889.5 3257.5,-1889.5"/> +<text text-anchor="start" x="3259.5" y="-1897.5" font-family="Times,serif" font-size="20.00">aiff</text> </g> <!-- probe&#45;&gt;aiff --> <g id="edge126" class="edge"> <title>probe&#45;&gt;aiff:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.23,-2041.87C2531.01,-2040.87 2533.8,-2039.9 2536.5,-2039 2666.65,-1995.79 2820.55,-2054.18 2830.04,-1929.18"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2833.52,-1929.65 2830.39,-1919.53 2826.53,-1929.39 2833.52,-1929.65"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.52,-2041.08C2941.88,-2040.36 2944.21,-2039.66 2946.5,-2039 3093.41,-1996.5 3268.44,-2069.53 3276.23,-1926.69"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3279.73,-1926.59 3276.5,-1916.5 3272.74,-1926.4 3279.73,-1926.59"/> </g> <!-- apple_bookmark --> <g id="node94" class="node"> <title>apple_bookmark</title> -<polygon fill="paleturquoise" stroke="none" points="2880,-1889.5 2880,-1915.5 3017,-1915.5 3017,-1889.5 2880,-1889.5"/> -<text text-anchor="start" x="2882.5" y="-1897.5" font-family="Times,serif" font-size="20.00">apple_bookmark</text> +<polygon fill="paleturquoise" stroke="transparent" points="3325.5,-1889.5 3325.5,-1915.5 3497.5,-1915.5 3497.5,-1889.5 3325.5,-1889.5"/> +<text text-anchor="start" x="3327.5" y="-1897.5" font-family="Times,serif" font-size="20.00">apple_bookmark</text> </g> <!-- probe&#45;&gt;apple_bookmark --> <g id="edge127" class="edge"> <title>probe&#45;&gt;apple_bookmark:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.17,-2041.7C2530.97,-2040.74 2533.77,-2039.82 2536.5,-2039 2679.37,-1995.82 2725.68,-2021.82 2864.5,-1967 2900.9,-1952.63 2939.89,-1958.65 2947.98,-1929.1"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="2951.41,-1929.85 2949.14,-1919.51 2944.46,-1929.01 2951.41,-1929.85"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.77,-2040.88C2942.04,-2040.22 2944.29,-2039.59 2946.5,-2039 3105.87,-1996.61 3154.46,-2020.36 3310.5,-1967 3354.46,-1951.97 3403.59,-1964.5 3410.64,-1926.62"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3414.14,-1926.76 3411.5,-1916.5 3407.17,-1926.17 3414.14,-1926.76"/> </g> <!-- avro_ocf --> <g id="node95" class="node"> <title>avro_ocf</title> -<polygon fill="paleturquoise" stroke="none" points="3047,-1889.5 3047,-1915.5 3122,-1915.5 3122,-1889.5 3047,-1889.5"/> -<text text-anchor="start" x="3049.5" y="-1897.5" font-family="Times,serif" font-size="20.00">avro_ocf</text> +<polygon fill="paleturquoise" stroke="transparent" points="3527.5,-1889.5 3527.5,-1915.5 3617.5,-1915.5 3617.5,-1889.5 3527.5,-1889.5"/> +<text text-anchor="start" x="3529.5" y="-1897.5" font-family="Times,serif" font-size="20.00">avro_ocf</text> </g> <!-- probe&#45;&gt;avro_ocf --> <g id="edge130" class="edge"> <title>probe&#45;&gt;avro_ocf:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.11,-2041.48C2530.93,-2040.57 2533.74,-2039.73 2536.5,-2039 2751.91,-1982.27 2832.18,-2064.43 3032.5,-1967 3057.42,-1954.88 3078.33,-1950.38 3083.99,-1929.21"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3087.44,-1929.85 3085.14,-1919.51 3080.49,-1929.02 3087.44,-1929.85"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.72,-2040.69C2942,-2040.08 2944.27,-2039.51 2946.5,-2039 3193.66,-1982.28 3280.25,-2068.8 3512.5,-1967 3541.06,-1954.48 3566.53,-1951.84 3571.59,-1926.47"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3575.08,-1926.78 3572.5,-1916.5 3568.11,-1926.14 3575.08,-1926.78"/> </g> <!-- bplist --> <g id="node96" class="node"> <title>bplist</title> -<polygon fill="paleturquoise" stroke="none" points="3152,-1889.5 3152,-1915.5 3199,-1915.5 3199,-1889.5 3152,-1889.5"/> -<text text-anchor="start" x="3154.5" y="-1897.5" font-family="Times,serif" font-size="20.00">bplist</text> +<polygon fill="paleturquoise" stroke="transparent" points="3647.5,-1889.5 3647.5,-1915.5 3709.5,-1915.5 3709.5,-1889.5 3647.5,-1889.5"/> +<text text-anchor="start" x="3649.5" y="-1897.5" font-family="Times,serif" font-size="20.00">bplist</text> </g> <!-- probe&#45;&gt;bplist --> <g id="edge132" class="edge"> <title>probe&#45;&gt;bplist:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.09,-2041.4C2530.91,-2040.51 2533.74,-2039.69 2536.5,-2039 2672.72,-2004.93 3146.58,-2057.91 3175.15,-1929.1"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3178.59,-1929.83 3176.18,-1919.51 3171.63,-1929.08 3178.59,-1929.83"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.71,-2040.63C2941.99,-2040.04 2944.27,-2039.49 2946.5,-2039 3104.18,-2004.63 3654.16,-2078.15 3677.72,-1926.8"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3681.23,-1926.74 3678.5,-1916.5 3674.25,-1926.21 3681.23,-1926.74"/> </g> <!-- elf --> <g id="node99" class="node"> <title>elf</title> -<polygon fill="paleturquoise" stroke="none" points="3235.5,-1889.5 3235.5,-1915.5 3261.5,-1915.5 3261.5,-1889.5 3235.5,-1889.5"/> -<text text-anchor="start" x="3237.5" y="-1897.5" font-family="Times,serif" font-size="20.00">elf</text> +<polygon fill="paleturquoise" stroke="transparent" points="3743,-1889.5 3743,-1915.5 3774,-1915.5 3774,-1889.5 3743,-1889.5"/> +<text text-anchor="start" x="3745.5" y="-1897.5" font-family="Times,serif" font-size="20.00">elf</text> </g> <!-- probe&#45;&gt;elf --> <g id="edge137" class="edge"> <title>probe&#45;&gt;elf:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.08,-2041.36C2530.9,-2040.48 2533.73,-2039.67 2536.5,-2039 2688.24,-2002.13 3218.39,-2072.98 3247.27,-1929.15"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3250.72,-1929.8 3248.21,-1919.51 3243.76,-1929.13 3250.72,-1929.8"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.7,-2040.6C2941.99,-2040.01 2944.26,-2039.47 2946.5,-2039 3121.85,-2001.91 3735.51,-2095.52 3758.82,-1926.64"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3762.32,-1926.71 3759.5,-1916.5 3755.34,-1926.24 3762.32,-1926.71"/> </g> <!-- probe&#45;&gt;gif --> <g id="edge140" class="edge"> <title>probe&#45;&gt;gif:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2519.98,-2039.55C2544.01,-2023.77 2577.46,-1998.03 2596.5,-1967 2627.34,-1916.74 2603.28,-1891.76 2627.5,-1838 2817.31,-1416.62 3137.49,-1390.93 3143.42,-936.87"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3146.92,-937.05 3143.48,-927.03 3139.92,-937 3146.92,-937.05"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2929.82,-2039.44C2957.56,-2024.23 2994.97,-1999.37 3016.5,-1967 3049.15,-1917.9 3021.05,-1890.7 3047.5,-1838 3224.75,-1484.9 3452.22,-1514.32 3616.5,-1155 3658.33,-1063.52 3654.8,-1030.26 3654.52,-934.13"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3658.02,-933.99 3654.5,-924 3651.02,-934.01 3658.02,-933.99"/> </g> <!-- json --> <g id="node103" class="node"> <title>json</title> -<polygon fill="paleturquoise" stroke="none" points="3400,-1889.5 3400,-1915.5 3437,-1915.5 3437,-1889.5 3400,-1889.5"/> -<text text-anchor="start" x="3402.5" y="-1897.5" font-family="Times,serif" font-size="20.00">json</text> +<polygon fill="paleturquoise" stroke="transparent" points="3927.5,-1889.5 3927.5,-1915.5 3973.5,-1915.5 3973.5,-1889.5 3927.5,-1889.5"/> +<text text-anchor="start" x="3929.5" y="-1897.5" font-family="Times,serif" font-size="20.00">json</text> </g> <!-- probe&#45;&gt;json --> <g id="edge151" class="edge"> <title>probe&#45;&gt;json:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.07,-2041.3C2530.89,-2040.42 2533.72,-2039.64 2536.5,-2039 2725.15,-1995.27 3388.75,-2109.28 3418.47,-1929.37"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3421.95,-1929.76 3419.26,-1919.52 3414.97,-1929.21 3421.95,-1929.76"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.69,-2040.55C2941.98,-2039.98 2944.26,-2039.45 2946.5,-2039 3157.49,-1996.34 3723.6,-2070.21 3912.5,-1967 3933.88,-1955.32 3946.75,-1947.04 3949.8,-1926.73"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3953.31,-1926.72 3950.5,-1916.5 3946.32,-1926.24 3953.31,-1926.72"/> </g> <!-- jsonl --> <g id="node104" class="node"> <title>jsonl</title> -<polygon fill="paleturquoise" stroke="none" points="3467.5,-1889.5 3467.5,-1915.5 3509.5,-1915.5 3509.5,-1889.5 3467.5,-1889.5"/> -<text text-anchor="start" x="3469.5" y="-1897.5" font-family="Times,serif" font-size="20.00">jsonl</text> +<polygon fill="paleturquoise" stroke="transparent" points="4004,-1889.5 4004,-1915.5 4057,-1915.5 4057,-1889.5 4004,-1889.5"/> +<text text-anchor="start" x="4006.5" y="-1897.5" font-family="Times,serif" font-size="20.00">jsonl</text> </g> <!-- probe&#45;&gt;jsonl --> <g id="edge152" class="edge"> <title>probe&#45;&gt;jsonl:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.06,-2041.28C2530.89,-2040.41 2533.72,-2039.63 2536.5,-2039 2735.55,-1993.51 3274.8,-2067.56 3452.5,-1967 3472.27,-1955.81 3483.91,-1947.48 3487.39,-1929.47"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3490.87,-1929.78 3488.24,-1919.52 3483.9,-1929.18 3490.87,-1929.78"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.69,-2040.53C2941.98,-2039.96 2944.26,-2039.45 2946.5,-2039 3174.13,-1993.61 3781.27,-2071.54 3988.5,-1967 4011.53,-1955.38 4027.18,-1948 4030.73,-1926.59"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="4034.23,-1926.74 4031.5,-1916.5 4027.25,-1926.21 4034.23,-1926.74"/> </g> <!-- mpeg_ts --> <g id="node107" class="node"> <title>mpeg_ts</title> -<polygon fill="paleturquoise" stroke="none" points="3540,-1889.5 3540,-1915.5 3611,-1915.5 3611,-1889.5 3540,-1889.5"/> -<text text-anchor="start" x="3542.5" y="-1897.5" font-family="Times,serif" font-size="20.00">mpeg_ts</text> +<polygon fill="paleturquoise" stroke="transparent" points="4087,-1889.5 4087,-1915.5 4176,-1915.5 4176,-1889.5 4087,-1889.5"/> +<text text-anchor="start" x="4089.5" y="-1897.5" font-family="Times,serif" font-size="20.00">mpeg_ts</text> </g> <!-- probe&#45;&gt;mpeg_ts --> <g id="edge161" class="edge"> <title>probe&#45;&gt;mpeg_ts:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.06,-2041.26C2530.88,-2040.4 2533.72,-2039.63 2536.5,-2039 2751.24,-1990.57 3323.65,-2057.12 3524.5,-1967 3549.53,-1955.77 3569.64,-1950.41 3575.06,-1929.17"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3578.5,-1929.84 3576.16,-1919.51 3571.55,-1929.05 3578.5,-1929.84"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.69,-2040.52C2941.98,-2039.95 2944.26,-2039.44 2946.5,-2039 3192.52,-1990.6 3839.82,-2060.41 4072.5,-1967 4101.43,-1955.38 4126.61,-1952.03 4131.6,-1926.5"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="4135.09,-1926.77 4132.5,-1916.5 4128.12,-1926.15 4135.09,-1926.77"/> </g> <!-- toml --> <g id="node109" class="node"> <title>toml</title> -<polygon fill="paleturquoise" stroke="none" points="3641,-1889.5 3641,-1915.5 3682,-1915.5 3682,-1889.5 3641,-1889.5"/> -<text text-anchor="start" x="3643.5" y="-1897.5" font-family="Times,serif" font-size="20.00">toml</text> +<polygon fill="paleturquoise" stroke="transparent" points="4206.5,-1889.5 4206.5,-1915.5 4256.5,-1915.5 4256.5,-1889.5 4206.5,-1889.5"/> +<text text-anchor="start" x="4208.5" y="-1897.5" font-family="Times,serif" font-size="20.00">toml</text> </g> <!-- probe&#45;&gt;toml --> <g id="edge175" class="edge"> <title>probe&#45;&gt;toml:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.05,-2041.24C2530.88,-2040.38 2533.72,-2039.62 2536.5,-2039 2773.48,-1986.4 3414.49,-2085.23 3626.5,-1967 3646.44,-1955.88 3658.04,-1947.45 3661.44,-1929.22"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3664.91,-1929.77 3662.25,-1919.52 3657.93,-1929.19 3664.91,-1929.77"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.68,-2040.5C2941.97,-2039.94 2944.26,-2039.43 2946.5,-2039 3218.58,-1986.34 3945.6,-2094.81 4191.5,-1967 4213.63,-1955.5 4227.56,-1947.44 4230.78,-1926.63"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="4234.28,-1926.72 4231.5,-1916.5 4227.3,-1926.23 4234.28,-1926.72"/> </g> <!-- tzif --> <g id="node110" class="node"> <title>tzif</title> -<polygon fill="paleturquoise" stroke="none" points="3716,-1889.5 3716,-1915.5 3747,-1915.5 3747,-1889.5 3716,-1889.5"/> -<text text-anchor="start" x="3718.5" y="-1897.5" font-family="Times,serif" font-size="20.00">tzif</text> +<polygon fill="paleturquoise" stroke="transparent" points="4286.5,-1889.5 4286.5,-1915.5 4324.5,-1915.5 4324.5,-1889.5 4286.5,-1889.5"/> +<text text-anchor="start" x="4288.5" y="-1897.5" font-family="Times,serif" font-size="20.00">tzif</text> </g> <!-- probe&#45;&gt;tzif --> <g id="edge176" class="edge"> <title>probe&#45;&gt;tzif:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.05,-2041.22C2530.88,-2040.37 2533.72,-2039.61 2536.5,-2039 2788.97,-1983.49 3472.32,-2093.94 3697.5,-1967 3717.11,-1955.95 3728.17,-1947.36 3731.45,-1929.39"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3734.93,-1929.77 3732.25,-1919.52 3727.96,-1929.2 3734.93,-1929.77"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.68,-2040.49C2941.97,-2039.93 2944.25,-2039.43 2946.5,-2039 3091.3,-2011.23 4143.28,-2039.78 4271.5,-1967 4291.81,-1955.47 4302.39,-1946.38 4304.91,-1926.7"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="4308.41,-1926.69 4305.5,-1916.5 4301.42,-1926.28 4308.41,-1926.69"/> </g> <!-- wasm --> <g id="node111" class="node"> <title>wasm</title> -<polygon fill="paleturquoise" stroke="none" points="3781,-1889.5 3781,-1915.5 3832,-1915.5 3832,-1889.5 3781,-1889.5"/> -<text text-anchor="start" x="3783.5" y="-1897.5" font-family="Times,serif" font-size="20.00">wasm</text> +<polygon fill="paleturquoise" stroke="transparent" points="4355,-1889.5 4355,-1915.5 4418,-1915.5 4418,-1889.5 4355,-1889.5"/> +<text text-anchor="start" x="4357.5" y="-1897.5" font-family="Times,serif" font-size="20.00">wasm</text> </g> <!-- probe&#45;&gt;wasm --> <g id="edge178" class="edge"> <title>probe&#45;&gt;wasm:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.05,-2041.21C2530.88,-2040.36 2533.72,-2039.61 2536.5,-2039 2803.8,-1980.71 3521.31,-2090.36 3765.5,-1967 3787.28,-1956 3802,-1948.5 3806.24,-1929.28"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3809.7,-1929.81 3807.2,-1919.51 3802.74,-1929.12 3809.7,-1929.81"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.68,-2040.49C2941.97,-2039.93 2944.25,-2039.43 2946.5,-2039 3251,-1981.03 4057.91,-2096.56 4339.5,-1967 4364.22,-1955.62 4382.57,-1949.16 4386.65,-1926.73"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="4390.16,-1926.76 4387.5,-1916.5 4383.18,-1926.17 4390.16,-1926.76"/> </g> <!-- xml --> <g id="node112" class="node"> <title>xml</title> -<polygon fill="paleturquoise" stroke="none" points="3864,-1889.5 3864,-1915.5 3899,-1915.5 3899,-1889.5 3864,-1889.5"/> -<text text-anchor="start" x="3866.5" y="-1897.5" font-family="Times,serif" font-size="20.00">xml</text> +<polygon fill="paleturquoise" stroke="transparent" points="4448,-1889.5 4448,-1915.5 4489,-1915.5 4489,-1889.5 4448,-1889.5"/> +<text text-anchor="start" x="4450.5" y="-1897.5" font-family="Times,serif" font-size="20.00">xml</text> </g> <!-- probe&#45;&gt;xml --> <g id="edge182" class="edge"> <title>probe&#45;&gt;xml:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.04,-2041.2C2530.87,-2040.35 2533.71,-2039.6 2536.5,-2039 2821.69,-1977.36 3592.83,-2109.39 3847.5,-1967 3867.15,-1956.02 3878.18,-1947.38 3881.46,-1929.4"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3884.94,-1929.77 3882.26,-1919.52 3877.96,-1929.2 3884.94,-1929.77"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.68,-2040.48C2941.97,-2039.92 2944.25,-2039.42 2946.5,-2039 3109.05,-2008.33 4288.33,-2046.29 4433.5,-1967 4454.48,-1955.54 4466.14,-1946.71 4468.87,-1926.59"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="4472.37,-1926.7 4469.5,-1916.5 4465.39,-1926.26 4472.37,-1926.7"/> </g> <!-- yaml --> <g id="node113" class="node"> <title>yaml</title> -<polygon fill="paleturquoise" stroke="none" points="3930.5,-1889.5 3930.5,-1915.5 3974.5,-1915.5 3974.5,-1889.5 3930.5,-1889.5"/> -<text text-anchor="start" x="3932.5" y="-1897.5" font-family="Times,serif" font-size="20.00">yaml</text> +<polygon fill="paleturquoise" stroke="transparent" points="4519,-1889.5 4519,-1915.5 4572,-1915.5 4572,-1889.5 4519,-1889.5"/> +<text text-anchor="start" x="4521.5" y="-1897.5" font-family="Times,serif" font-size="20.00">yaml</text> </g> <!-- probe&#45;&gt;yaml --> <g id="edge183" class="edge"> <title>probe&#45;&gt;yaml:n</title> -<path fill="none" stroke="#49647f" stroke-width="2" d="M2528.04,-2041.19C2530.87,-2040.35 2533.71,-2039.6 2536.5,-2039 2836.52,-1974.57 3645.52,-2112.86 3915.5,-1967 3935.77,-1956.05 3947.84,-1947.68 3951.39,-1929.33"/> -<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="3954.87,-1929.78 3952.24,-1919.52 3947.89,-1929.18 3954.87,-1929.78"/> +<path fill="none" stroke="#49647f" stroke-width="2" d="M2939.68,-2040.47C2941.97,-2039.92 2944.25,-2039.42 2946.5,-2039 3116.83,-2007.05 4349.34,-2044.18 4504.5,-1967 4527.37,-1955.62 4542.37,-1947.84 4545.77,-1926.52"/> +<polygon fill="#49647f" stroke="#49647f" stroke-width="2" points="4549.26,-1926.73 4546.5,-1916.5 4542.28,-1926.22 4549.26,-1926.73"/> </g> <!-- av1_frame --> <g id="node8" class="node"> <title>av1_frame</title> -<polygon fill="paleturquoise" stroke="none" points="1511.5,-534.5 1511.5,-579.5 1601.5,-579.5 1601.5,-534.5 1511.5,-534.5"/> -<text text-anchor="start" x="1513.5" y="-561" font-family="Times,serif" font-size="20.00">av1_frame</text> -<polygon fill="lightgrey" stroke="none" points="1511.5,-534 1511.5,-553 1601.5,-553 1601.5,-534 1511.5,-534"/> -<text text-anchor="start" x="1513.5" y="-539.8" font-family="Times,serif" font-size="14.00">av1_obu</text> +<polygon fill="paleturquoise" stroke="transparent" points="1774.5,-534.5 1774.5,-579.5 1884.5,-579.5 1884.5,-534.5 1774.5,-534.5"/> +<text text-anchor="start" x="1776.5" y="-561" font-family="Times,serif" font-size="20.00">av1_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="1774.5,-534 1774.5,-553 1884.5,-553 1884.5,-534 1774.5,-534"/> +<text text-anchor="start" x="1776.5" y="-539.8" font-family="Times,serif" font-size="14.00">av1_obu</text> </g> <!-- av1_obu --> <g id="node9" class="node"> <title>av1_obu</title> -<polygon fill="paleturquoise" stroke="none" points="1578.5,-390.5 1578.5,-416.5 1650.5,-416.5 1650.5,-390.5 1578.5,-390.5"/> -<text text-anchor="start" x="1580.5" y="-398.5" font-family="Times,serif" font-size="20.00">av1_obu</text> +<polygon fill="paleturquoise" stroke="transparent" points="1858.5,-390.5 1858.5,-416.5 1946.5,-416.5 1946.5,-390.5 1858.5,-390.5"/> +<text text-anchor="start" x="1860.5" y="-398.5" font-family="Times,serif" font-size="20.00">av1_obu</text> </g> <!-- av1_frame&#45;&gt;av1_obu --> <g id="edge5" class="edge"> <title>av1_frame:e&#45;&gt;av1_obu:n</title> -<path fill="none" stroke="#4ca6a1" stroke-width="2" d="M1602.5,-543C1626.05,-543 1617.57,-471.35 1615.09,-435.4"/> -<polygon fill="#4ca6a1" stroke="#4ca6a1" stroke-width="2" points="1618.59,-435.35 1614.64,-425.52 1611.6,-435.67 1618.59,-435.35"/> +<path fill="none" stroke="#4ca6a1" stroke-width="2" d="M1885.5,-543C1909.8,-543 1904.16,-467.56 1902.76,-432.63"/> +<polygon fill="#4ca6a1" stroke="#4ca6a1" stroke-width="2" points="1906.26,-432.41 1902.5,-422.5 1899.26,-432.59 1906.26,-432.41"/> </g> <!-- avc_annexb --> <g id="node10" class="node"> <title>avc_annexb</title> -<polygon fill="paleturquoise" stroke="none" points="724,-534.5 724,-579.5 823,-579.5 823,-534.5 724,-534.5"/> -<text text-anchor="start" x="726.5" y="-561" font-family="Times,serif" font-size="20.00">avc_annexb</text> -<polygon fill="lightgrey" stroke="none" points="724.5,-534 724.5,-553 823.5,-553 823.5,-534 724.5,-534"/> -<text text-anchor="start" x="726.5" y="-539.8" font-family="Times,serif" font-size="14.00">avc_nalu</text> +<polygon fill="paleturquoise" stroke="transparent" points="850.5,-534.5 850.5,-579.5 972.5,-579.5 972.5,-534.5 850.5,-534.5"/> +<text text-anchor="start" x="852.5" y="-561" font-family="Times,serif" font-size="20.00">avc_annexb</text> +<polygon fill="lightgrey" stroke="transparent" points="850.5,-534 850.5,-553 972.5,-553 972.5,-534 850.5,-534"/> +<text text-anchor="start" x="852.5" y="-539.8" font-family="Times,serif" font-size="14.00">avc_nalu</text> </g> <!-- avc_nalu --> <g id="node11" class="node"> <title>avc_nalu</title> -<polygon fill="paleturquoise" stroke="none" points="876.5,-362 876.5,-445 952.5,-445 952.5,-362 876.5,-362"/> -<text text-anchor="start" x="878.5" y="-426.5" font-family="Times,serif" font-size="20.00">avc_nalu</text> -<polygon fill="lightgrey" stroke="none" points="876.5,-399.5 876.5,-418.5 952.5,-418.5 952.5,-399.5 876.5,-399.5"/> -<text text-anchor="start" x="878.5" y="-405.3" font-family="Times,serif" font-size="14.00">avc_sps</text> -<polygon fill="lightgrey" stroke="none" points="876.5,-380.5 876.5,-399.5 952.5,-399.5 952.5,-380.5 876.5,-380.5"/> -<text text-anchor="start" x="878.5" y="-386.3" font-family="Times,serif" font-size="14.00">avc_pps</text> -<polygon fill="lightgrey" stroke="none" points="876.5,-361.5 876.5,-380.5 952.5,-380.5 952.5,-361.5 876.5,-361.5"/> -<text text-anchor="start" x="878.5" y="-367.3" font-family="Times,serif" font-size="14.00">avc_sei</text> +<polygon fill="paleturquoise" stroke="transparent" points="1030,-362 1030,-445 1123,-445 1123,-362 1030,-362"/> +<text text-anchor="start" x="1032.5" y="-426.5" font-family="Times,serif" font-size="20.00">avc_nalu</text> +<polygon fill="lightgrey" stroke="transparent" points="1030.5,-399.5 1030.5,-418.5 1123.5,-418.5 1123.5,-399.5 1030.5,-399.5"/> +<text text-anchor="start" x="1032.5" y="-405.3" font-family="Times,serif" font-size="14.00">avc_sps</text> +<polygon fill="lightgrey" stroke="transparent" points="1030.5,-380.5 1030.5,-399.5 1123.5,-399.5 1123.5,-380.5 1030.5,-380.5"/> +<text text-anchor="start" x="1032.5" y="-386.3" font-family="Times,serif" font-size="14.00">avc_pps</text> +<polygon fill="lightgrey" stroke="transparent" points="1030.5,-361.5 1030.5,-380.5 1123.5,-380.5 1123.5,-361.5 1030.5,-361.5"/> +<text text-anchor="start" x="1032.5" y="-367.3" font-family="Times,serif" font-size="14.00">avc_sei</text> </g> <!-- avc_annexb&#45;&gt;avc_nalu --> <g id="edge6" class="edge"> <title>avc_annexb:e&#45;&gt;avc_nalu:n</title> -<path fill="none" stroke="#725675" stroke-width="2" d="M824.5,-543C835.86,-543 830.39,-529.86 837.5,-521 863.85,-488.17 905.01,-494.03 913.09,-461.58"/> -<polygon fill="#725675" stroke="#725675" stroke-width="2" points="916.53,-462.34 914.16,-452.01 909.57,-461.56 916.53,-462.34"/> +<path fill="none" stroke="#725675" stroke-width="2" d="M973.5,-543C985.09,-543 979.78,-529.65 987.5,-521 1018.86,-485.86 1068.43,-497.68 1075.62,-459.26"/> +<polygon fill="#725675" stroke="#725675" stroke-width="2" points="1079.13,-459.26 1076.5,-449 1072.16,-458.66 1079.13,-459.26"/> </g> <!-- avc_sps --> <g id="node14" class="node"> <title>avc_sps</title> -<polygon fill="paleturquoise" stroke="none" points="1017,-246.5 1017,-272.5 1084,-272.5 1084,-246.5 1017,-246.5"/> -<text text-anchor="start" x="1019.5" y="-254.5" font-family="Times,serif" font-size="20.00">avc_sps</text> +<polygon fill="paleturquoise" stroke="transparent" points="1196,-246.5 1196,-272.5 1279,-272.5 1279,-246.5 1196,-246.5"/> +<text text-anchor="start" x="1198.5" y="-254.5" font-family="Times,serif" font-size="20.00">avc_sps</text> </g> <!-- avc_nalu&#45;&gt;avc_sps --> <g id="edge9" class="edge"> <title>avc_nalu:e&#45;&gt;avc_sps:n</title> -<path fill="none" stroke="#7880b2" stroke-width="2" d="M953.5,-409.5C1021.56,-409.5 1047.35,-357.82 1050.22,-291.5"/> -<polygon fill="#7880b2" stroke="#7880b2" stroke-width="2" points="1053.72,-291.6 1050.44,-281.53 1046.72,-291.45 1053.72,-291.6"/> +<path fill="none" stroke="#7880b2" stroke-width="2" d="M1124.5,-409.5C1197.94,-409.5 1234.17,-360.14 1237.28,-288.72"/> +<polygon fill="#7880b2" stroke="#7880b2" stroke-width="2" points="1240.78,-288.57 1237.5,-278.5 1233.79,-288.42 1240.78,-288.57"/> </g> <!-- avc_pps --> <g id="node15" class="node"> <title>avc_pps</title> -<polygon fill="paleturquoise" stroke="none" points="918,-246.5 918,-272.5 987,-272.5 987,-246.5 918,-246.5"/> -<text text-anchor="start" x="920.5" y="-254.5" font-family="Times,serif" font-size="20.00">avc_pps</text> +<polygon fill="paleturquoise" stroke="transparent" points="1081,-246.5 1081,-272.5 1166,-272.5 1166,-246.5 1081,-246.5"/> +<text text-anchor="start" x="1083.5" y="-254.5" font-family="Times,serif" font-size="20.00">avc_pps</text> </g> <!-- avc_nalu&#45;&gt;avc_pps --> <g id="edge10" class="edge"> <title>avc_nalu:e&#45;&gt;avc_pps:n</title> -<path fill="none" stroke="#7880b2" stroke-width="2" d="M953.5,-389.5C998.6,-389.5 960.42,-337.98 953.52,-291.45"/> -<polygon fill="#7880b2" stroke="#7880b2" stroke-width="2" points="957.01,-291.21 952.74,-281.52 950.03,-291.76 957.01,-291.21"/> +<path fill="none" stroke="#7880b2" stroke-width="2" d="M1124.5,-389.5C1170.46,-389.5 1129.92,-335.98 1124.16,-288.77"/> +<polygon fill="#7880b2" stroke="#7880b2" stroke-width="2" points="1127.63,-288.26 1123.5,-278.5 1120.65,-288.7 1127.63,-288.26"/> </g> <!-- avc_sei --> <g id="node16" class="node"> <title>avc_sei</title> -<polygon fill="paleturquoise" stroke="none" points="823.5,-246.5 823.5,-272.5 887.5,-272.5 887.5,-246.5 823.5,-246.5"/> -<text text-anchor="start" x="825.5" y="-254.5" font-family="Times,serif" font-size="20.00">avc_sei</text> +<polygon fill="paleturquoise" stroke="transparent" points="972.5,-246.5 972.5,-272.5 1050.5,-272.5 1050.5,-246.5 972.5,-246.5"/> +<text text-anchor="start" x="974.5" y="-254.5" font-family="Times,serif" font-size="20.00">avc_sei</text> </g> <!-- avc_nalu&#45;&gt;avc_sei --> <g id="edge11" class="edge"> <title>avc_nalu:e&#45;&gt;avc_sei:n</title> -<path fill="none" stroke="#7880b2" stroke-width="2" d="M953.5,-370.5C959.07,-370.5 955.08,-362.94 952.5,-358 928.88,-312.86 867.4,-330.39 857,-291.17"/> -<polygon fill="#7880b2" stroke="#7880b2" stroke-width="2" points="860.51,-291.02 855.86,-281.51 853.56,-291.85 860.51,-291.02"/> +<path fill="none" stroke="#7880b2" stroke-width="2" d="M1124.5,-370.5C1130.07,-370.5 1126.25,-362.85 1123.5,-358 1095.17,-308.14 1021.22,-335.67 1012.37,-288.58"/> +<polygon fill="#7880b2" stroke="#7880b2" stroke-width="2" points="1015.85,-288.16 1011.5,-278.5 1008.87,-288.76 1015.85,-288.16"/> </g> <!-- avc_au --> <g id="node12" class="node"> <title>avc_au</title> -<polygon fill="paleturquoise" stroke="none" points="853,-534.5 853,-579.5 914,-579.5 914,-534.5 853,-534.5"/> -<text text-anchor="start" x="855.5" y="-561" font-family="Times,serif" font-size="20.00">avc_au</text> -<polygon fill="lightgrey" stroke="none" points="853.5,-534 853.5,-553 914.5,-553 914.5,-534 853.5,-534"/> -<text text-anchor="start" x="855.5" y="-539.8" font-family="Times,serif" font-size="14.00">avc_nalu</text> +<polygon fill="paleturquoise" stroke="transparent" points="1002.5,-534.5 1002.5,-579.5 1076.5,-579.5 1076.5,-534.5 1002.5,-534.5"/> +<text text-anchor="start" x="1004.5" y="-561" font-family="Times,serif" font-size="20.00">avc_au</text> +<polygon fill="lightgrey" stroke="transparent" points="1002.5,-534 1002.5,-553 1076.5,-553 1076.5,-534 1002.5,-534"/> +<text text-anchor="start" x="1004.5" y="-539.8" font-family="Times,serif" font-size="14.00">avc_nalu</text> </g> <!-- avc_au&#45;&gt;avc_nalu --> <g id="edge7" class="edge"> <title>avc_au:e&#45;&gt;avc_nalu:n</title> -<path fill="none" stroke="#687e91" stroke-width="2" d="M915.5,-543C933.21,-543 920.18,-490.47 915.8,-461.74"/> -<polygon fill="#687e91" stroke="#687e91" stroke-width="2" points="919.3,-461.61 914.81,-452.01 912.34,-462.31 919.3,-461.61"/> +<path fill="none" stroke="#687e91" stroke-width="2" d="M1077.5,-543C1095.78,-543 1081.3,-487.03 1077.4,-459.04"/> +<polygon fill="#687e91" stroke="#687e91" stroke-width="2" points="1080.88,-458.65 1076.5,-449 1073.91,-459.27 1080.88,-458.65"/> </g> <!-- avc_dcr --> <g id="node13" class="node"> <title>avc_dcr</title> -<polygon fill="paleturquoise" stroke="none" points="1383.5,-534.5 1383.5,-579.5 1451.5,-579.5 1451.5,-534.5 1383.5,-534.5"/> -<text text-anchor="start" x="1385.5" y="-561" font-family="Times,serif" font-size="20.00">avc_dcr</text> -<polygon fill="lightgrey" stroke="none" points="1383.5,-534 1383.5,-553 1451.5,-553 1451.5,-534 1383.5,-534"/> -<text text-anchor="start" x="1385.5" y="-539.8" font-family="Times,serif" font-size="14.00">avc_nalu</text> +<polygon fill="paleturquoise" stroke="transparent" points="1631,-534.5 1631,-579.5 1714,-579.5 1714,-534.5 1631,-534.5"/> +<text text-anchor="start" x="1633.5" y="-561" font-family="Times,serif" font-size="20.00">avc_dcr</text> +<polygon fill="lightgrey" stroke="transparent" points="1631.5,-534 1631.5,-553 1714.5,-553 1714.5,-534 1631.5,-534"/> +<text text-anchor="start" x="1633.5" y="-539.8" font-family="Times,serif" font-size="14.00">avc_nalu</text> </g> <!-- avc_dcr&#45;&gt;avc_nalu --> <g id="edge8" class="edge"> <title>avc_dcr:e&#45;&gt;avc_nalu:n</title> -<path fill="none" stroke="#5f7e40" stroke-width="2" d="M1452.5,-543C1458.07,-543 1455.3,-534.58 1451.5,-530.5 1372.36,-445.55 948.6,-560.3 916.43,-461.74"/> -<polygon fill="#5f7e40" stroke="#5f7e40" stroke-width="2" points="919.92,-461.35 914.95,-451.99 912.99,-462.4 919.92,-461.35"/> +<path fill="none" stroke="#5f7e40" stroke-width="2" d="M1715.5,-543C1721.07,-543 1718.35,-534.53 1714.5,-530.5 1618.35,-429.7 1103.6,-583.73 1077.53,-459.3"/> +<polygon fill="#5f7e40" stroke="#5f7e40" stroke-width="2" points="1080.97,-458.6 1076.5,-449 1074.01,-459.3 1080.97,-458.6"/> </g> <!-- avi&#45;&gt;avc_au --> <g id="edge12" class="edge"> <title>avi:e&#45;&gt;avc_au:n</title> -<path fill="none" stroke="#7b8673" stroke-width="2" d="M1216.5,-926C1288.32,-926 1279.18,-799.94 1128.5,-665 1046.49,-591.55 896.16,-690.16 884.25,-596.72"/> -<polygon fill="#7b8673" stroke="#7b8673" stroke-width="2" points="887.76,-596.8 883.68,-587.02 880.78,-597.21 887.76,-596.8"/> +<path fill="none" stroke="#7b8673" stroke-width="2" d="M1465.5,-926C1509.79,-926 1458.15,-740.85 1359.5,-665 1246.12,-577.83 1049.4,-724.13 1039.86,-595.2"/> +<polygon fill="#7b8673" stroke="#7b8673" stroke-width="2" points="1043.35,-594.87 1039.5,-585 1036.35,-595.12 1043.35,-594.87"/> </g> <!-- hevc_au --> <g id="node18" class="node"> <title>hevc_au</title> -<polygon fill="paleturquoise" stroke="none" points="516,-534.5 516,-579.5 587,-579.5 587,-534.5 516,-534.5"/> -<text text-anchor="start" x="518.5" y="-561" font-family="Times,serif" font-size="20.00">hevc_au</text> -<polygon fill="lightgrey" stroke="none" points="516.5,-534 516.5,-553 587.5,-553 587.5,-534 516.5,-534"/> -<text text-anchor="start" x="518.5" y="-539.8" font-family="Times,serif" font-size="14.00">hevc_nalu</text> +<polygon fill="paleturquoise" stroke="transparent" points="608.5,-534.5 608.5,-579.5 694.5,-579.5 694.5,-534.5 608.5,-534.5"/> +<text text-anchor="start" x="610.5" y="-561" font-family="Times,serif" font-size="20.00">hevc_au</text> +<polygon fill="lightgrey" stroke="transparent" points="608.5,-534 608.5,-553 694.5,-553 694.5,-534 608.5,-534"/> +<text text-anchor="start" x="610.5" y="-539.8" font-family="Times,serif" font-size="14.00">hevc_nalu</text> </g> <!-- avi&#45;&gt;hevc_au --> <g id="edge13" class="edge"> <title>avi:e&#45;&gt;hevc_au:n</title> -<path fill="none" stroke="#7b8673" stroke-width="2" d="M1216.5,-906C1235.76,-906 1193.33,-713.13 1128.5,-665 1028.19,-590.54 584.3,-704.89 553.22,-596.73"/> -<polygon fill="#7b8673" stroke="#7b8673" stroke-width="2" points="556.71,-596.44 551.9,-587 549.77,-597.38 556.71,-596.44"/> +<path fill="none" stroke="#7b8673" stroke-width="2" d="M1465.5,-906C1488.33,-906 1439.49,-718.34 1359.5,-665 1230.73,-579.13 677.16,-736 652.36,-595.18"/> +<polygon fill="#7b8673" stroke="#7b8673" stroke-width="2" points="655.83,-594.67 651.5,-585 648.85,-595.26 655.83,-594.67"/> </g> <!-- mp3_frame --> <g id="node19" class="node"> <title>mp3_frame</title> -<polygon fill="paleturquoise" stroke="none" points="268,-534.5 268,-579.5 365,-579.5 365,-534.5 268,-534.5"/> -<text text-anchor="start" x="270.5" y="-561" font-family="Times,serif" font-size="20.00">mp3_frame</text> -<polygon fill="lightgrey" stroke="none" points="268.5,-534 268.5,-553 365.5,-553 365.5,-534 268.5,-534"/> -<text text-anchor="start" x="270.5" y="-539.8" font-family="Times,serif" font-size="14.00">mp3_frame_tags</text> +<polygon fill="paleturquoise" stroke="transparent" points="314.5,-534.5 314.5,-579.5 436.5,-579.5 436.5,-534.5 314.5,-534.5"/> +<text text-anchor="start" x="318" y="-561" font-family="Times,serif" font-size="20.00">mp3_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="314.5,-534 314.5,-553 436.5,-553 436.5,-534 314.5,-534"/> +<text text-anchor="start" x="316.5" y="-539.8" font-family="Times,serif" font-size="14.00">mp3_frame_tags</text> </g> <!-- avi&#45;&gt;mp3_frame --> <g id="edge14" class="edge"> <title>avi:e&#45;&gt;mp3_frame:n</title> -<path fill="none" stroke="#7b8673" stroke-width="2" d="M1216.5,-887C1244.94,-887 1260.66,-772.04 1068.5,-665 925.54,-585.37 348.09,-743.35 317.74,-596.6"/> -<polygon fill="#7b8673" stroke="#7b8673" stroke-width="2" points="321.26,-596.62 316.8,-587.01 314.3,-597.31 321.26,-596.62"/> +<path fill="none" stroke="#7b8673" stroke-width="2" d="M1465.5,-887C1479.73,-887 1469.69,-868.25 1464.5,-855 1423.73,-750.86 1399.2,-715.67 1299.5,-665 1210.68,-619.86 429.94,-683.55 378.19,-594.7"/> +<polygon fill="#7b8673" stroke="#7b8673" stroke-width="2" points="381.55,-593.7 375.5,-585 374.8,-595.57 381.55,-593.7"/> </g> <!-- flac_frame --> <g id="node20" class="node"> <title>flac_frame</title> -<polygon fill="paleturquoise" stroke="none" points="944.5,-544 944.5,-570 1036.5,-570 1036.5,-544 944.5,-544"/> -<text text-anchor="start" x="946.5" y="-552" font-family="Times,serif" font-size="20.00">flac_frame</text> +<polygon fill="paleturquoise" stroke="transparent" points="1107,-544 1107,-570 1218,-570 1218,-544 1107,-544"/> +<text text-anchor="start" x="1109.5" y="-552" font-family="Times,serif" font-size="20.00">flac_frame</text> </g> <!-- avi&#45;&gt;flac_frame --> <g id="edge15" class="edge"> <title>avi:e&#45;&gt;flac_frame:n</title> -<path fill="none" stroke="#7b8673" stroke-width="2" d="M1216.5,-868C1226.52,-868 1291.24,-852.92 1128.5,-665 1083.8,-613.39 1001.95,-644.33 991.59,-588.77"/> -<polygon fill="#7b8673" stroke="#7b8673" stroke-width="2" points="995.09,-588.68 990.76,-579.02 988.12,-589.28 995.09,-588.68"/> +<path fill="none" stroke="#7b8673" stroke-width="2" d="M1465.5,-868C1567.28,-868 1434.31,-734.02 1359.5,-665 1291.5,-602.27 1171.8,-666.91 1163.01,-586.02"/> +<polygon fill="#7b8673" stroke="#7b8673" stroke-width="2" points="1166.51,-585.81 1162.5,-576 1159.52,-586.17 1166.51,-585.81"/> </g> <!-- hevc_nalu --> <g id="node37" class="node"> <title>hevc_nalu</title> -<polygon fill="paleturquoise" stroke="none" points="261.5,-362 261.5,-445 347.5,-445 347.5,-362 261.5,-362"/> -<text text-anchor="start" x="263.5" y="-426.5" font-family="Times,serif" font-size="20.00">hevc_nalu</text> -<polygon fill="lightgrey" stroke="none" points="261.5,-399.5 261.5,-418.5 347.5,-418.5 347.5,-399.5 261.5,-399.5"/> -<text text-anchor="start" x="263.5" y="-405.3" font-family="Times,serif" font-size="14.00">hevc_vps</text> -<polygon fill="lightgrey" stroke="none" points="261.5,-380.5 261.5,-399.5 347.5,-399.5 347.5,-380.5 261.5,-380.5"/> -<text text-anchor="start" x="263.5" y="-386.3" font-family="Times,serif" font-size="14.00">hevc_pps</text> -<polygon fill="lightgrey" stroke="none" points="261.5,-361.5 261.5,-380.5 347.5,-380.5 347.5,-361.5 261.5,-361.5"/> -<text text-anchor="start" x="263.5" y="-367.3" font-family="Times,serif" font-size="14.00">hevc_sps</text> +<polygon fill="paleturquoise" stroke="transparent" points="308.5,-362 308.5,-445 414.5,-445 414.5,-362 308.5,-362"/> +<text text-anchor="start" x="310.5" y="-426.5" font-family="Times,serif" font-size="20.00">hevc_nalu</text> +<polygon fill="lightgrey" stroke="transparent" points="308.5,-399.5 308.5,-418.5 414.5,-418.5 414.5,-399.5 308.5,-399.5"/> +<text text-anchor="start" x="310.5" y="-405.3" font-family="Times,serif" font-size="14.00">hevc_vps</text> +<polygon fill="lightgrey" stroke="transparent" points="308.5,-380.5 308.5,-399.5 414.5,-399.5 414.5,-380.5 308.5,-380.5"/> +<text text-anchor="start" x="310.5" y="-386.3" font-family="Times,serif" font-size="14.00">hevc_pps</text> +<polygon fill="lightgrey" stroke="transparent" points="308.5,-361.5 308.5,-380.5 414.5,-380.5 414.5,-361.5 308.5,-361.5"/> +<text text-anchor="start" x="310.5" y="-367.3" font-family="Times,serif" font-size="14.00">hevc_sps</text> </g> <!-- hevc_au&#45;&gt;hevc_nalu --> <g id="edge31" class="edge"> <title>hevc_au:e&#45;&gt;hevc_nalu:n</title> -<path fill="none" stroke="#909244" stroke-width="2" d="M588.5,-543C594.07,-543 591.03,-534.82 587.5,-530.5 507.59,-432.71 318.43,-569.6 305.23,-461.78"/> -<polygon fill="#909244" stroke="#909244" stroke-width="2" points="308.74,-461.81 304.67,-452.02 301.75,-462.21 308.74,-461.81"/> +<path fill="none" stroke="#909244" stroke-width="2" d="M695.5,-543C701.07,-543 698.11,-534.74 694.5,-530.5 598.04,-417.2 372.4,-592.77 361.88,-459.16"/> +<polygon fill="#909244" stroke="#909244" stroke-width="2" points="365.37,-458.86 361.5,-449 358.38,-459.12 365.37,-458.86"/> </g> <!-- mp3_frame_tags --> <g id="node64" class="node"> <title>mp3_frame_tags</title> -<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M460.5,-385.5C460.5,-385.5 622.5,-385.5 622.5,-385.5 628.5,-385.5 634.5,-391.5 634.5,-397.5 634.5,-397.5 634.5,-409.5 634.5,-409.5 634.5,-415.5 628.5,-421.5 622.5,-421.5 622.5,-421.5 460.5,-421.5 460.5,-421.5 454.5,-421.5 448.5,-415.5 448.5,-409.5 448.5,-409.5 448.5,-397.5 448.5,-397.5 448.5,-391.5 454.5,-385.5 460.5,-385.5"/> -<text text-anchor="middle" x="541.5" y="-397.5" font-family="Times,serif" font-size="25.00">mp3_frame_tags</text> +<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M516.5,-385.5C516.5,-385.5 718.5,-385.5 718.5,-385.5 724.5,-385.5 730.5,-391.5 730.5,-397.5 730.5,-397.5 730.5,-409.5 730.5,-409.5 730.5,-415.5 724.5,-421.5 718.5,-421.5 718.5,-421.5 516.5,-421.5 516.5,-421.5 510.5,-421.5 504.5,-415.5 504.5,-409.5 504.5,-409.5 504.5,-397.5 504.5,-397.5 504.5,-391.5 510.5,-385.5 516.5,-385.5"/> +<text text-anchor="middle" x="617.5" y="-397.5" font-family="Times,serif" font-size="25.00">mp3_frame_tags</text> </g> <!-- mp3_frame&#45;&gt;mp3_frame_tags --> <g id="edge66" class="edge"> <title>mp3_frame:e&#45;&gt;mp3_frame_tags:n</title> -<path fill="none" stroke="#646b7c" stroke-width="2" d="M366.5,-543C377.86,-543 371.52,-529.08 379.5,-521 435.47,-464.32 530.39,-502.08 540.6,-435.2"/> -<polygon fill="#646b7c" stroke="#646b7c" stroke-width="2" points="544.07,-435.74 541.29,-425.52 537.09,-435.25 544.07,-435.74"/> +<path fill="none" stroke="#646b7c" stroke-width="2" d="M437.5,-543C449.09,-543 443.18,-529.07 451.5,-521 510.45,-463.86 608.61,-504.45 616.93,-432.84"/> +<polygon fill="#646b7c" stroke="#646b7c" stroke-width="2" points="620.45,-432.68 617.5,-422.5 613.46,-432.29 620.45,-432.68"/> </g> <!-- bitcoin_block --> <g id="node22" class="node"> <title>bitcoin_block</title> -<polygon fill="paleturquoise" stroke="none" points="756.5,-1546 756.5,-1591 868.5,-1591 868.5,-1546 756.5,-1546"/> -<text text-anchor="start" x="758.5" y="-1572.5" font-family="Times,serif" font-size="20.00">bitcoin_block</text> -<polygon fill="lightgrey" stroke="none" points="756.5,-1545.5 756.5,-1564.5 868.5,-1564.5 868.5,-1545.5 756.5,-1545.5"/> -<text text-anchor="start" x="758.5" y="-1551.3" font-family="Times,serif" font-size="14.00">bitcoin_transaction</text> +<polygon fill="paleturquoise" stroke="transparent" points="939,-1546 939,-1591 1080,-1591 1080,-1546 939,-1546"/> +<text text-anchor="start" x="942" y="-1572.5" font-family="Times,serif" font-size="20.00">bitcoin_block</text> +<polygon fill="lightgrey" stroke="transparent" points="939.5,-1545.5 939.5,-1564.5 1080.5,-1564.5 1080.5,-1545.5 939.5,-1545.5"/> +<text text-anchor="start" x="941.5" y="-1551.3" font-family="Times,serif" font-size="14.00">bitcoin_transaction</text> </g> <!-- bitcoin_blkdat&#45;&gt;bitcoin_block --> <g id="edge16" class="edge"> <title>bitcoin_blkdat:e&#45;&gt;bitcoin_block:n</title> -<path fill="none" stroke="#45659f" stroke-width="2" d="M938.5,-1888.5C1005.57,-1888.5 832.88,-1689.6 814.13,-1608.17"/> -<polygon fill="#45659f" stroke="#45659f" stroke-width="2" points="817.64,-1607.97 812.89,-1598.5 810.69,-1608.87 817.64,-1607.97"/> +<path fill="none" stroke="#45659f" stroke-width="2" d="M1169.5,-1888.5C1240.38,-1888.5 1028.61,-1688.42 1010.7,-1606.56"/> +<polygon fill="#45659f" stroke="#45659f" stroke-width="2" points="1014.16,-1606.02 1009.5,-1596.5 1007.21,-1606.84 1014.16,-1606.02"/> </g> <!-- bitcoin_transaction --> <g id="node23" class="node"> <title>bitcoin_transaction</title> -<polygon fill="paleturquoise" stroke="none" points="722,-1240.5 722,-1285.5 877,-1285.5 877,-1240.5 722,-1240.5"/> -<text text-anchor="start" x="724.5" y="-1267" font-family="Times,serif" font-size="20.00">bitcoin_transaction</text> -<polygon fill="lightgrey" stroke="none" points="722.5,-1240 722.5,-1259 877.5,-1259 877.5,-1240 722.5,-1240"/> -<text text-anchor="start" x="724.5" y="-1245.8" font-family="Times,serif" font-size="14.00">bitcoin_script</text> +<polygon fill="paleturquoise" stroke="transparent" points="891,-1240.5 891,-1285.5 1092,-1285.5 1092,-1240.5 891,-1240.5"/> +<text text-anchor="start" x="893.5" y="-1267" font-family="Times,serif" font-size="20.00">bitcoin_transaction</text> +<polygon fill="lightgrey" stroke="transparent" points="891.5,-1240 891.5,-1259 1092.5,-1259 1092.5,-1240 891.5,-1240"/> +<text text-anchor="start" x="893.5" y="-1245.8" font-family="Times,serif" font-size="14.00">bitcoin_script</text> </g> <!-- bitcoin_block&#45;&gt;bitcoin_transaction --> <g id="edge17" class="edge"> <title>bitcoin_block:e&#45;&gt;bitcoin_transaction:n</title> -<path fill="none" stroke="#414a80" stroke-width="2" d="M869.5,-1554.5C986.83,-1554.5 812.58,-1421.47 800.19,-1302.9"/> -<polygon fill="#414a80" stroke="#414a80" stroke-width="2" points="803.69,-1302.82 799.66,-1293.02 796.7,-1303.2 803.69,-1302.82"/> +<path fill="none" stroke="#414a80" stroke-width="2" d="M1081.5,-1554.5C1201.87,-1554.5 1002.94,-1422.29 991.97,-1301.18"/> +<polygon fill="#414a80" stroke="#414a80" stroke-width="2" points="995.46,-1300.83 991.5,-1291 988.46,-1301.15 995.46,-1300.83"/> </g> <!-- bitcoin_script --> <g id="node24" class="node"> <title>bitcoin_script</title> -<polygon fill="paleturquoise" stroke="none" points="761.5,-897 761.5,-923 873.5,-923 873.5,-897 761.5,-897"/> -<text text-anchor="start" x="763.5" y="-905" font-family="Times,serif" font-size="20.00">bitcoin_script</text> +<polygon fill="paleturquoise" stroke="transparent" points="944.5,-897 944.5,-923 1088.5,-923 1088.5,-897 944.5,-897"/> +<text text-anchor="start" x="946.5" y="-905" font-family="Times,serif" font-size="20.00">bitcoin_script</text> </g> <!-- bitcoin_transaction&#45;&gt;bitcoin_script --> <g id="edge18" class="edge"> <title>bitcoin_transaction:e&#45;&gt;bitcoin_script:n</title> -<path fill="none" stroke="#974489" stroke-width="2" d="M878.5,-1249C947.07,-1249 831,-1026.82 818.56,-941.85"/> -<polygon fill="#974489" stroke="#974489" stroke-width="2" points="822.06,-941.69 817.75,-932.02 815.09,-942.27 822.06,-941.69"/> +<path fill="none" stroke="#974489" stroke-width="2" d="M1093.5,-1249C1163.57,-1249 1028.72,-1022.44 1017.27,-939.1"/> +<polygon fill="#974489" stroke="#974489" stroke-width="2" points="1020.75,-938.71 1016.5,-929 1013.77,-939.24 1020.75,-938.71"/> </g> <!-- bsd_loopback_frame --> <g id="node25" class="node"> <title>bsd_loopback_frame</title> -<polygon fill="paleturquoise" stroke="none" points="3584.5,-1240.5 3584.5,-1285.5 3754.5,-1285.5 3754.5,-1240.5 3584.5,-1240.5"/> -<text text-anchor="start" x="3586.5" y="-1267" font-family="Times,serif" font-size="20.00">bsd_loopback_frame</text> -<polygon fill="lightgrey" stroke="none" points="3584.5,-1240 3584.5,-1259 3754.5,-1259 3754.5,-1240 3584.5,-1240"/> -<text text-anchor="start" x="3586.5" y="-1245.8" font-family="Times,serif" font-size="14.00">inet_packet</text> +<polygon fill="paleturquoise" stroke="transparent" points="4279.5,-1240.5 4279.5,-1285.5 4491.5,-1285.5 4491.5,-1240.5 4279.5,-1240.5"/> +<text text-anchor="start" x="4281.5" y="-1267" font-family="Times,serif" font-size="20.00">bsd_loopback_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="4279.5,-1240 4279.5,-1259 4491.5,-1259 4491.5,-1240 4279.5,-1240"/> +<text text-anchor="start" x="4281.5" y="-1245.8" font-family="Times,serif" font-size="14.00">inet_packet</text> </g> <!-- inet_packet --> <g id="node26" class="node"> <title>inet_packet</title> -<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M3870,-892C3870,-892 3979,-892 3979,-892 3985,-892 3991,-898 3991,-904 3991,-904 3991,-916 3991,-916 3991,-922 3985,-928 3979,-928 3979,-928 3870,-928 3870,-928 3864,-928 3858,-922 3858,-916 3858,-916 3858,-904 3858,-904 3858,-898 3864,-892 3870,-892"/> -<text text-anchor="middle" x="3924.5" y="-904" font-family="Times,serif" font-size="25.00">inet_packet</text> +<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M4422,-892C4422,-892 4561,-892 4561,-892 4567,-892 4573,-898 4573,-904 4573,-904 4573,-916 4573,-916 4573,-922 4567,-928 4561,-928 4561,-928 4422,-928 4422,-928 4416,-928 4410,-922 4410,-916 4410,-916 4410,-904 4410,-904 4410,-898 4416,-892 4422,-892"/> +<text text-anchor="middle" x="4491.5" y="-904" font-family="Times,serif" font-size="25.00">inet_packet</text> </g> <!-- bsd_loopback_frame&#45;&gt;inet_packet --> <g id="edge19" class="edge"> <title>bsd_loopback_frame:e&#45;&gt;inet_packet:n</title> -<path fill="none" stroke="#4361a5" stroke-width="2" d="M3755.5,-1249C3759.99,-1249 3891.11,-998.06 3919.22,-940.58"/> -<polygon fill="#4361a5" stroke="#4361a5" stroke-width="2" points="3922.28,-942.31 3923.24,-931.75 3915.91,-939.4 3922.28,-942.31"/> +<path fill="none" stroke="#4361a5" stroke-width="2" d="M4492.5,-1249C4525.69,-1249 4496.04,-1001.08 4491.95,-939.22"/> +<polygon fill="#4361a5" stroke="#4361a5" stroke-width="2" points="4495.44,-938.84 4491.5,-929 4488.45,-939.14 4495.44,-938.84"/> </g> <!-- ipv4_packet --> <g id="node43" class="node"> <title>ipv4_packet</title> -<polygon fill="paleturquoise" stroke="none" points="3503,-534.5 3503,-579.5 3604,-579.5 3604,-534.5 3503,-534.5"/> -<text text-anchor="start" x="3505.5" y="-561" font-family="Times,serif" font-size="20.00">ipv4_packet</text> -<polygon fill="lightgrey" stroke="none" points="3503.5,-534 3503.5,-553 3604.5,-553 3604.5,-534 3503.5,-534"/> -<text text-anchor="start" x="3505.5" y="-539.8" font-family="Times,serif" font-size="14.00">ip_packet</text> +<polygon fill="paleturquoise" stroke="transparent" points="4048.5,-534.5 4048.5,-579.5 4174.5,-579.5 4174.5,-534.5 4048.5,-534.5"/> +<text text-anchor="start" x="4050.5" y="-561" font-family="Times,serif" font-size="20.00">ipv4_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="4048.5,-534 4048.5,-553 4174.5,-553 4174.5,-534 4048.5,-534"/> +<text text-anchor="start" x="4050.5" y="-539.8" font-family="Times,serif" font-size="14.00">ip_packet</text> </g> <!-- inet_packet&#45;&gt;ipv4_packet --> <g id="edge145" class="edge"> <title>inet_packet&#45;&gt;ipv4_packet:n</title> -<path fill="none" stroke="#5a43ab" stroke-width="2" d="M3875.75,-892.05C3777.83,-854.64 3565.63,-755.2 3554.92,-592.82"/> -<polygon fill="#5a43ab" stroke="#5a43ab" stroke-width="2" points="3558.43,-592.91 3554.6,-583.03 3551.43,-593.14 3558.43,-592.91"/> +<path fill="none" stroke="#5a43ab" stroke-width="2" d="M4439.86,-891.88C4338.09,-854.59 4120.66,-755.85 4111.78,-590.48"/> +<polygon fill="#5a43ab" stroke="#5a43ab" stroke-width="2" points="4115.27,-589.9 4111.5,-580 4108.27,-590.09 4115.27,-589.9"/> </g> <!-- ipv6_packet --> <g id="node45" class="node"> <title>ipv6_packet</title> -<polygon fill="paleturquoise" stroke="none" points="3873,-534.5 3873,-579.5 3974,-579.5 3974,-534.5 3873,-534.5"/> -<text text-anchor="start" x="3875.5" y="-561" font-family="Times,serif" font-size="20.00">ipv6_packet</text> -<polygon fill="lightgrey" stroke="none" points="3873.5,-534 3873.5,-553 3974.5,-553 3974.5,-534 3873.5,-534"/> -<text text-anchor="start" x="3875.5" y="-539.8" font-family="Times,serif" font-size="14.00">ip_packet</text> +<polygon fill="paleturquoise" stroke="transparent" points="4428.5,-534.5 4428.5,-579.5 4554.5,-579.5 4554.5,-534.5 4428.5,-534.5"/> +<text text-anchor="start" x="4430.5" y="-561" font-family="Times,serif" font-size="20.00">ipv6_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="4428.5,-534 4428.5,-553 4554.5,-553 4554.5,-534 4428.5,-534"/> +<text text-anchor="start" x="4430.5" y="-539.8" font-family="Times,serif" font-size="14.00">ip_packet</text> </g> <!-- inet_packet&#45;&gt;ipv6_packet --> <g id="edge147" class="edge"> <title>inet_packet&#45;&gt;ipv6_packet:n</title> -<path fill="none" stroke="#5a43ab" stroke-width="2" d="M3924.5,-892.22C3924.5,-845.51 3924.5,-709.68 3924.5,-592.71"/> -<polygon fill="#5a43ab" stroke="#5a43ab" stroke-width="2" points="3928,-593.03 3924.5,-583.03 3921,-593.03 3928,-593.03"/> +<path fill="none" stroke="#5a43ab" stroke-width="2" d="M4491.5,-891.87C4491.5,-844.5 4491.5,-707.44 4491.5,-590.2"/> +<polygon fill="#5a43ab" stroke="#5a43ab" stroke-width="2" points="4495,-590 4491.5,-580 4488,-590 4495,-590"/> </g> <!-- bzip2&#45;&gt;probe --> <g id="edge20" class="edge"> <title>bzip2:e&#45;&gt;probe:n</title> -<path fill="none" stroke="#3f8a57" stroke-width="2" d="M1602.5,-1888.5C1637.94,-1888.5 1590.25,-1943.19 1616.5,-1967 1767.1,-2103.56 2390.52,-1889.7 2528.5,-2039 2539.51,-2050.91 2539.81,-2063.88 2528.5,-2075.5 2521.24,-2082.96 2508.35,-2087.97 2499.87,-2086.47"/> -<polygon fill="#3f8a57" stroke="#3f8a57" stroke-width="2" points="2502.56,-2084.23 2493.45,-2078.82 2497.19,-2088.73 2502.56,-2084.23"/> +<path fill="none" stroke="#3f8a57" stroke-width="2" d="M1901.5,-1888.5C1936.94,-1888.5 1889.14,-1943.31 1915.5,-1967 2085.14,-2119.51 2783.96,-1872.14 2939.5,-2039 2945.03,-2044.93 2945.17,-2069.7 2939.5,-2075.5 2928.57,-2086.67 2907.25,-2093.21 2898.45,-2085.99"/> +<polygon fill="#3f8a57" stroke="#3f8a57" stroke-width="2" points="2901.57,-2084.39 2894.5,-2076.5 2895.11,-2087.08 2901.57,-2084.39"/> </g> <!-- ether8023_frame --> <g id="node28" class="node"> <title>ether8023_frame</title> -<polygon fill="paleturquoise" stroke="none" points="3784.5,-1240.5 3784.5,-1285.5 3924.5,-1285.5 3924.5,-1240.5 3784.5,-1240.5"/> -<text text-anchor="start" x="3786.5" y="-1267" font-family="Times,serif" font-size="20.00">ether8023_frame</text> -<polygon fill="lightgrey" stroke="none" points="3784.5,-1240 3784.5,-1259 3924.5,-1259 3924.5,-1240 3784.5,-1240"/> -<text text-anchor="start" x="3786.5" y="-1245.8" font-family="Times,serif" font-size="14.00">inet_packet</text> +<polygon fill="paleturquoise" stroke="transparent" points="4521.5,-1240.5 4521.5,-1285.5 4701.5,-1285.5 4701.5,-1240.5 4521.5,-1240.5"/> +<text text-anchor="start" x="4523.5" y="-1267" font-family="Times,serif" font-size="20.00">ether8023_frame</text> +<polygon fill="lightgrey" stroke="transparent" points="4521.5,-1240 4521.5,-1259 4701.5,-1259 4701.5,-1240 4521.5,-1240"/> +<text text-anchor="start" x="4523.5" y="-1245.8" font-family="Times,serif" font-size="14.00">inet_packet</text> </g> <!-- ether8023_frame&#45;&gt;inet_packet --> <g id="edge21" class="edge"> <title>ether8023_frame:e&#45;&gt;inet_packet:n</title> -<path fill="none" stroke="#b8865e" stroke-width="2" d="M3925.5,-1249C3958.28,-1249 3929.77,-1007.26 3925.12,-941.64"/> -<polygon fill="#b8865e" stroke="#b8865e" stroke-width="2" points="3928.63,-941.84 3924.65,-932.02 3921.64,-942.18 3928.63,-941.84"/> +<path fill="none" stroke="#b8865e" stroke-width="2" d="M4702.5,-1249C4742.59,-1249 4520.2,-1003.15 4494,-938.8"/> +<polygon fill="#b8865e" stroke="#b8865e" stroke-width="2" points="4497.36,-937.82 4491.5,-929 4490.58,-939.55 4497.36,-937.82"/> </g> <!-- flac&#45;&gt;flac_frame --> <g id="edge23" class="edge"> <title>flac:e&#45;&gt;flac_frame:n</title> -<path fill="none" stroke="#609e78" stroke-width="2" d="M1422.5,-887C1480.35,-887 1332.74,-699.77 1286.5,-665 1180.34,-585.19 1002.78,-704.91 991.11,-588.81"/> -<polygon fill="#609e78" stroke="#609e78" stroke-width="2" points="994.61,-588.85 990.64,-579.02 987.62,-589.18 994.61,-588.85"/> +<path fill="none" stroke="#609e78" stroke-width="2" d="M1705.5,-887C1767.64,-887 1588.06,-698.13 1535.5,-665 1394.28,-575.98 1171.85,-739.47 1162.79,-586.06"/> +<polygon fill="#609e78" stroke="#609e78" stroke-width="2" points="1166.28,-585.9 1162.5,-576 1159.29,-586.1 1166.28,-585.9"/> </g> <!-- flac_metadatablocks --> <g id="node30" class="node"> <title>flac_metadatablocks</title> -<polygon fill="paleturquoise" stroke="none" points="1067,-534.5 1067,-579.5 1234,-579.5 1234,-534.5 1067,-534.5"/> -<text text-anchor="start" x="1069.5" y="-561" font-family="Times,serif" font-size="20.00">flac_metadatablocks</text> -<polygon fill="lightgrey" stroke="none" points="1067.5,-534 1067.5,-553 1234.5,-553 1234.5,-534 1067.5,-534"/> -<text text-anchor="start" x="1069.5" y="-539.8" font-family="Times,serif" font-size="14.00">flac_metadatablock</text> +<polygon fill="paleturquoise" stroke="transparent" points="1248.5,-534.5 1248.5,-579.5 1460.5,-579.5 1460.5,-534.5 1248.5,-534.5"/> +<text text-anchor="start" x="1250.5" y="-561" font-family="Times,serif" font-size="20.00">flac_metadatablocks</text> +<polygon fill="lightgrey" stroke="transparent" points="1248.5,-534 1248.5,-553 1460.5,-553 1460.5,-534 1248.5,-534"/> +<text text-anchor="start" x="1250.5" y="-539.8" font-family="Times,serif" font-size="14.00">flac_metadatablock</text> </g> <!-- flac&#45;&gt;flac_metadatablocks --> <g id="edge22" class="edge"> <title>flac:e&#45;&gt;flac_metadatablocks:n</title> -<path fill="none" stroke="#609e78" stroke-width="2" d="M1422.5,-906C1457.36,-906 1519.81,-889.98 1286.5,-665 1239.32,-619.5 1162.01,-649.54 1151.66,-596.97"/> -<polygon fill="#609e78" stroke="#609e78" stroke-width="2" points="1155.15,-596.66 1150.77,-587.02 1148.17,-597.29 1155.15,-596.66"/> +<path fill="none" stroke="#609e78" stroke-width="2" d="M1705.5,-906C1729.18,-906 1710.31,-798.86 1535.5,-665 1468.53,-613.72 1363.55,-668.11 1355.05,-595.09"/> +<polygon fill="#609e78" stroke="#609e78" stroke-width="2" points="1358.54,-594.79 1354.5,-585 1351.55,-595.18 1358.54,-594.79"/> </g> <!-- flac_metadatablock --> <g id="node31" class="node"> <title>flac_metadatablock</title> -<polygon fill="paleturquoise" stroke="none" points="1388.5,-362 1388.5,-445 1548.5,-445 1548.5,-362 1388.5,-362"/> -<text text-anchor="start" x="1390.5" y="-426.5" font-family="Times,serif" font-size="20.00">flac_metadatablock</text> -<polygon fill="lightgrey" stroke="none" points="1388.5,-399.5 1388.5,-418.5 1548.5,-418.5 1548.5,-399.5 1388.5,-399.5"/> -<text text-anchor="start" x="1390.5" y="-405.3" font-family="Times,serif" font-size="14.00">flac_streaminfo</text> -<polygon fill="lightgrey" stroke="none" points="1388.5,-380.5 1388.5,-399.5 1548.5,-399.5 1548.5,-380.5 1388.5,-380.5"/> -<text text-anchor="start" x="1390.5" y="-386.3" font-family="Times,serif" font-size="14.00">flac_picture</text> -<polygon fill="lightgrey" stroke="none" points="1388.5,-361.5 1388.5,-380.5 1548.5,-380.5 1548.5,-361.5 1388.5,-361.5"/> -<text text-anchor="start" x="1390.5" y="-367.3" font-family="Times,serif" font-size="14.00">vorbis_comment</text> +<polygon fill="paleturquoise" stroke="transparent" points="1626.5,-362 1626.5,-445 1828.5,-445 1828.5,-362 1626.5,-362"/> +<text text-anchor="start" x="1628.5" y="-426.5" font-family="Times,serif" font-size="20.00">flac_metadatablock</text> +<polygon fill="lightgrey" stroke="transparent" points="1626.5,-399.5 1626.5,-418.5 1828.5,-418.5 1828.5,-399.5 1626.5,-399.5"/> +<text text-anchor="start" x="1628.5" y="-405.3" font-family="Times,serif" font-size="14.00">flac_streaminfo</text> +<polygon fill="lightgrey" stroke="transparent" points="1626.5,-380.5 1626.5,-399.5 1828.5,-399.5 1828.5,-380.5 1626.5,-380.5"/> +<text text-anchor="start" x="1628.5" y="-386.3" font-family="Times,serif" font-size="14.00">flac_picture</text> +<polygon fill="lightgrey" stroke="transparent" points="1626.5,-361.5 1626.5,-380.5 1828.5,-380.5 1828.5,-361.5 1626.5,-361.5"/> +<text text-anchor="start" x="1628.5" y="-367.3" font-family="Times,serif" font-size="14.00">vorbis_comment</text> </g> <!-- flac_metadatablocks&#45;&gt;flac_metadatablock --> <g id="edge27" class="edge"> <title>flac_metadatablocks:e&#45;&gt;flac_metadatablock:n</title> -<path fill="none" stroke="#688a82" stroke-width="2" d="M1235.5,-543C1246.86,-543 1239.65,-528.11 1248.5,-521 1325.03,-459.53 1455.79,-543.47 1467.64,-461.95"/> -<polygon fill="#688a82" stroke="#688a82" stroke-width="2" points="1471.12,-462.23 1468.3,-452.02 1464.14,-461.77 1471.12,-462.23"/> +<path fill="none" stroke="#688a82" stroke-width="2" d="M1461.5,-543C1473.09,-543 1466.21,-527.93 1475.5,-521 1565.93,-453.5 1717.65,-558.53 1727.04,-459.26"/> +<polygon fill="#688a82" stroke="#688a82" stroke-width="2" points="1730.55,-459.15 1727.5,-449 1723.56,-458.83 1730.55,-459.15"/> </g> <!-- flac_streaminfo --> <g id="node32" class="node"> <title>flac_streaminfo</title> -<polygon fill="paleturquoise" stroke="none" points="1559,-246.5 1559,-272.5 1688,-272.5 1688,-246.5 1559,-246.5"/> -<text text-anchor="start" x="1561.5" y="-254.5" font-family="Times,serif" font-size="20.00">flac_streaminfo</text> +<polygon fill="paleturquoise" stroke="transparent" points="1829,-246.5 1829,-272.5 1990,-272.5 1990,-246.5 1829,-246.5"/> +<text text-anchor="start" x="1831.5" y="-254.5" font-family="Times,serif" font-size="20.00">flac_streaminfo</text> </g> <!-- flac_metadatablock&#45;&gt;flac_streaminfo --> <g id="edge24" class="edge"> <title>flac_metadatablock:e&#45;&gt;flac_streaminfo:n</title> -<path fill="none" stroke="#747787" stroke-width="2" d="M1549.5,-409.5C1573.22,-409.5 1553.06,-379.3 1563.5,-358 1580.86,-322.6 1614.89,-322.31 1622.13,-291.4"/> -<polygon fill="#747787" stroke="#747787" stroke-width="2" points="1625.6,-291.82 1623.18,-281.51 1618.64,-291.08 1625.6,-291.82"/> +<path fill="none" stroke="#747787" stroke-width="2" d="M1829.5,-409.5C1853.22,-409.5 1832.56,-379.05 1843.5,-358 1862.93,-320.59 1902.3,-323.57 1908.63,-288.79"/> +<polygon fill="#747787" stroke="#747787" stroke-width="2" points="1912.15,-288.76 1909.5,-278.5 1905.17,-288.17 1912.15,-288.76"/> </g> <!-- flac_picture --> <g id="node33" class="node"> <title>flac_picture</title> -<polygon fill="paleturquoise" stroke="none" points="1806,-112 1806,-157 1905,-157 1905,-112 1806,-112"/> -<text text-anchor="start" x="1808.5" y="-138.5" font-family="Times,serif" font-size="20.00">flac_picture</text> -<polygon fill="lightgrey" stroke="none" points="1806.5,-111.5 1806.5,-130.5 1905.5,-130.5 1905.5,-111.5 1806.5,-111.5"/> -<text text-anchor="start" x="1808.5" y="-117.3" font-family="Times,serif" font-size="14.00">image</text> +<polygon fill="paleturquoise" stroke="transparent" points="2129,-112 2129,-157 2254,-157 2254,-112 2129,-112"/> +<text text-anchor="start" x="2131.5" y="-138.5" font-family="Times,serif" font-size="20.00">flac_picture</text> +<polygon fill="lightgrey" stroke="transparent" points="2129.5,-111.5 2129.5,-130.5 2254.5,-130.5 2254.5,-111.5 2129.5,-111.5"/> +<text text-anchor="start" x="2131.5" y="-117.3" font-family="Times,serif" font-size="14.00">image</text> </g> <!-- flac_metadatablock&#45;&gt;flac_picture --> <g id="edge25" class="edge"> <title>flac_metadatablock:e&#45;&gt;flac_picture:n</title> -<path fill="none" stroke="#747787" stroke-width="2" d="M1549.5,-389.5C1584.3,-389.5 1521.83,-260.24 1543.5,-233 1629.24,-125.22 1841.24,-291.91 1854.82,-173.77"/> -<polygon fill="#747787" stroke="#747787" stroke-width="2" points="1858.3,-174.2 1855.34,-164.02 1851.31,-173.82 1858.3,-174.2"/> +<path fill="none" stroke="#747787" stroke-width="2" d="M1829.5,-389.5C1843.51,-389.5 1830.16,-371.91 1828.5,-358 1821.88,-302.44 1777.83,-276.11 1813.5,-233 1920.29,-103.94 2180.54,-322.71 2191.16,-171.02"/> +<polygon fill="#747787" stroke="#747787" stroke-width="2" points="2194.66,-171.11 2191.5,-161 2187.67,-170.88 2194.66,-171.11"/> </g> <!-- vorbis_comment --> <g id="node34" class="node"> <title>vorbis_comment</title> -<polygon fill="paleturquoise" stroke="none" points="1718,-237 1718,-282 1855,-282 1855,-237 1718,-237"/> -<text text-anchor="start" x="1720.5" y="-263.5" font-family="Times,serif" font-size="20.00">vorbis_comment</text> -<polygon fill="lightgrey" stroke="none" points="1718.5,-236.5 1718.5,-255.5 1855.5,-255.5 1855.5,-236.5 1718.5,-236.5"/> -<text text-anchor="start" x="1720.5" y="-242.3" font-family="Times,serif" font-size="14.00">flac_picture</text> +<polygon fill="paleturquoise" stroke="transparent" points="2020,-237 2020,-282 2191,-282 2191,-237 2020,-237"/> +<text text-anchor="start" x="2022.5" y="-263.5" font-family="Times,serif" font-size="20.00">vorbis_comment</text> +<polygon fill="lightgrey" stroke="transparent" points="2020.5,-236.5 2020.5,-255.5 2191.5,-255.5 2191.5,-236.5 2020.5,-236.5"/> +<text text-anchor="start" x="2022.5" y="-242.3" font-family="Times,serif" font-size="14.00">flac_picture</text> </g> <!-- flac_metadatablock&#45;&gt;vorbis_comment --> <g id="edge26" class="edge"> <title>flac_metadatablock:e&#45;&gt;vorbis_comment:n</title> -<path fill="none" stroke="#747787" stroke-width="2" d="M1549.5,-370.5C1557.84,-370.5 1556.26,-362.15 1563.5,-358 1649.79,-308.53 1774.67,-382.88 1785.71,-298.93"/> -<polygon fill="#747787" stroke="#747787" stroke-width="2" points="1789.2,-299.22 1786.32,-289.02 1782.21,-298.79 1789.2,-299.22"/> +<path fill="none" stroke="#747787" stroke-width="2" d="M1829.5,-370.5C1837.84,-370.5 1836.17,-361.99 1843.5,-358 1946.46,-301.95 2096.41,-400.66 2105.1,-296.04"/> +<polygon fill="#747787" stroke="#747787" stroke-width="2" points="2108.6,-296.13 2105.5,-286 2101.61,-295.85 2108.6,-296.13"/> </g> <!-- flac_picture&#45;&gt;image --> <g id="edge28" class="edge"> <title>flac_picture:e&#45;&gt;image:n</title> -<path fill="none" stroke="#72a899" stroke-width="2" d="M1906.5,-120.5C2195.36,-120.5 2955.7,-181.67 3184.5,-358 3247.96,-406.91 3243.96,-442.82 3261.5,-521 3268.5,-552.22 3278.61,-565.96 3261.5,-593 3221.53,-656.17 3172.48,-624.73 3109.5,-665 3021.7,-721.15 2405.56,-1321.02 2338.43,-1293.33"/> -<polygon fill="#72a899" stroke="#72a899" stroke-width="2" points="2341.64,-1291.92 2333.9,-1284.68 2335.44,-1295.17 2341.64,-1291.92"/> +<path fill="none" stroke="#72a899" stroke-width="2" d="M2255.5,-120.5C2589.25,-120.5 3465.43,-166.1 3738.5,-358 3806.21,-405.58 3807.85,-440.86 3828.5,-521 3836.49,-551.99 3847.06,-566.93 3828.5,-593 3771.76,-672.69 3707.43,-620.13 3620.5,-665 3515.68,-719.1 2765.06,-1356.99 2712.41,-1291.97"/> +<polygon fill="#72a899" stroke="#72a899" stroke-width="2" points="2715.66,-1290.62 2709.5,-1282 2708.94,-1292.58 2715.66,-1290.62"/> </g> <!-- vorbis_comment&#45;&gt;flac_picture --> <g id="edge118" class="edge"> <title>vorbis_comment:e&#45;&gt;flac_picture:n</title> -<path fill="none" stroke="#a79097" stroke-width="2" d="M1856.5,-245.5C1889.95,-245.5 1863.02,-208.27 1856.73,-173.59"/> -<polygon fill="#a79097" stroke="#a79097" stroke-width="2" points="1860.25,-173.62 1855.8,-164.01 1853.29,-174.31 1860.25,-173.62"/> +<path fill="none" stroke="#a79097" stroke-width="2" d="M2192.5,-245.5C2226.68,-245.5 2197.81,-206.61 2192.35,-171.31"/> +<polygon fill="#a79097" stroke="#a79097" stroke-width="2" points="2195.81,-170.68 2191.5,-161 2188.83,-171.25 2195.81,-170.68"/> </g> <!-- gzip&#45;&gt;probe --> <g id="edge29" class="edge"> <title>gzip:e&#45;&gt;probe:n</title> -<path fill="none" stroke="#b05869" stroke-width="2" d="M1790.5,-1888.5C1826.29,-1888.5 1781.65,-1943.33 1808.5,-1967 1929.12,-2073.33 2420.6,-1919.78 2528.5,-2039 2539.39,-2051.03 2539.81,-2063.88 2528.5,-2075.5 2521.24,-2082.96 2508.35,-2087.97 2499.87,-2086.47"/> -<polygon fill="#b05869" stroke="#b05869" stroke-width="2" points="2502.56,-2084.23 2493.45,-2078.82 2497.19,-2088.73 2502.56,-2084.23"/> +<path fill="none" stroke="#b05869" stroke-width="2" d="M2118.5,-1888.5C2154.29,-1888.5 2109.53,-1943.47 2136.5,-1967 2271.5,-2084.79 2818.6,-1906.78 2939.5,-2039 2944.97,-2044.99 2945.17,-2069.7 2939.5,-2075.5 2928.57,-2086.67 2907.25,-2093.21 2898.45,-2085.99"/> +<polygon fill="#b05869" stroke="#b05869" stroke-width="2" points="2901.57,-2084.39 2894.5,-2076.5 2895.11,-2087.08 2901.57,-2084.39"/> </g> <!-- hevc_annexb --> <g id="node36" class="node"> <title>hevc_annexb</title> -<polygon fill="paleturquoise" stroke="none" points="129,-534.5 129,-579.5 238,-579.5 238,-534.5 129,-534.5"/> -<text text-anchor="start" x="131.5" y="-561" font-family="Times,serif" font-size="20.00">hevc_annexb</text> -<polygon fill="lightgrey" stroke="none" points="129.5,-534 129.5,-553 238.5,-553 238.5,-534 129.5,-534"/> -<text text-anchor="start" x="131.5" y="-539.8" font-family="Times,serif" font-size="14.00">hevc_nalu</text> +<polygon fill="paleturquoise" stroke="transparent" points="149,-534.5 149,-579.5 284,-579.5 284,-534.5 149,-534.5"/> +<text text-anchor="start" x="151.5" y="-561" font-family="Times,serif" font-size="20.00">hevc_annexb</text> +<polygon fill="lightgrey" stroke="transparent" points="149.5,-534 149.5,-553 284.5,-553 284.5,-534 149.5,-534"/> +<text text-anchor="start" x="151.5" y="-539.8" font-family="Times,serif" font-size="14.00">hevc_nalu</text> </g> <!-- hevc_annexb&#45;&gt;hevc_nalu --> <g id="edge30" class="edge"> <title>hevc_annexb:e&#45;&gt;hevc_nalu:n</title> -<path fill="none" stroke="#5e7fb9" stroke-width="2" d="M239.5,-543C250.86,-543 246.28,-530.5 252.5,-521 271.5,-491.97 297.27,-488.84 303.23,-461.71"/> -<polygon fill="#5e7fb9" stroke="#5e7fb9" stroke-width="2" points="306.69,-462.31 304.2,-452.01 299.73,-461.62 306.69,-462.31"/> +<path fill="none" stroke="#5e7fb9" stroke-width="2" d="M285.5,-543C297.09,-543 292.59,-530.3 299.5,-521 322.42,-490.14 354.98,-490.79 360.64,-459.32"/> +<polygon fill="#5e7fb9" stroke="#5e7fb9" stroke-width="2" points="364.16,-459.26 361.5,-449 357.18,-458.68 364.16,-459.26"/> </g> <!-- hevc_vps --> <g id="node39" class="node"> <title>hevc_vps</title> -<polygon fill="paleturquoise" stroke="none" points="363,-246.5 363,-272.5 442,-272.5 442,-246.5 363,-246.5"/> -<text text-anchor="start" x="365.5" y="-254.5" font-family="Times,serif" font-size="20.00">hevc_vps</text> +<polygon fill="paleturquoise" stroke="transparent" points="405.5,-246.5 405.5,-272.5 501.5,-272.5 501.5,-246.5 405.5,-246.5"/> +<text text-anchor="start" x="407.5" y="-254.5" font-family="Times,serif" font-size="20.00">hevc_vps</text> </g> <!-- hevc_nalu&#45;&gt;hevc_vps --> <g id="edge33" class="edge"> <title>hevc_nalu:e&#45;&gt;hevc_vps:n</title> -<path fill="none" stroke="#49a04d" stroke-width="2" d="M348.5,-409.5C407.17,-409.5 403.39,-350.46 402.6,-291.46"/> -<polygon fill="#49a04d" stroke="#49a04d" stroke-width="2" points="406.1,-291.5 402.52,-281.53 399.1,-291.55 406.1,-291.5"/> +<path fill="none" stroke="#49a04d" stroke-width="2" d="M415.5,-409.5C472.81,-409.5 455.73,-346.61 453.69,-288.52"/> +<polygon fill="#49a04d" stroke="#49a04d" stroke-width="2" points="457.18,-288.43 453.5,-278.5 450.19,-288.56 457.18,-288.43"/> </g> <!-- hevc_pps --> <g id="node40" class="node"> <title>hevc_pps</title> -<polygon fill="paleturquoise" stroke="none" points="254,-246.5 254,-272.5 333,-272.5 333,-246.5 254,-246.5"/> -<text text-anchor="start" x="256.5" y="-254.5" font-family="Times,serif" font-size="20.00">hevc_pps</text> +<polygon fill="paleturquoise" stroke="transparent" points="277.5,-246.5 277.5,-272.5 375.5,-272.5 375.5,-246.5 277.5,-246.5"/> +<text text-anchor="start" x="279.5" y="-254.5" font-family="Times,serif" font-size="20.00">hevc_pps</text> </g> <!-- hevc_nalu&#45;&gt;hevc_pps --> <g id="edge34" class="edge"> <title>hevc_nalu:e&#45;&gt;hevc_pps:n</title> -<path fill="none" stroke="#49a04d" stroke-width="2" d="M348.5,-389.5C362.51,-389.5 351.83,-371.32 347.5,-358 335.79,-321.98 302.39,-320.91 294.97,-291.36"/> -<polygon fill="#49a04d" stroke="#49a04d" stroke-width="2" points="298.46,-291.04 293.84,-281.51 291.5,-291.84 298.46,-291.04"/> +<path fill="none" stroke="#49a04d" stroke-width="2" d="M415.5,-389.5C429.51,-389.5 420.39,-370.71 414.5,-358 393.9,-313.54 335.54,-328.59 327.44,-288.57"/> +<polygon fill="#49a04d" stroke="#49a04d" stroke-width="2" points="330.91,-288.13 326.5,-278.5 323.94,-288.78 330.91,-288.13"/> </g> <!-- hevc_sps --> <g id="node41" class="node"> <title>hevc_sps</title> -<polygon fill="paleturquoise" stroke="none" points="147,-246.5 147,-272.5 224,-272.5 224,-246.5 147,-246.5"/> -<text text-anchor="start" x="149.5" y="-254.5" font-family="Times,serif" font-size="20.00">hevc_sps</text> +<polygon fill="paleturquoise" stroke="transparent" points="152,-246.5 152,-272.5 247,-272.5 247,-246.5 152,-246.5"/> +<text text-anchor="start" x="154.5" y="-254.5" font-family="Times,serif" font-size="20.00">hevc_sps</text> </g> <!-- hevc_nalu&#45;&gt;hevc_sps --> <g id="edge35" class="edge"> <title>hevc_nalu:e&#45;&gt;hevc_sps:n</title> -<path fill="none" stroke="#49a04d" stroke-width="2" d="M348.5,-370.5C354.07,-370.5 350.63,-362.61 347.5,-358 305.04,-295.57 198.95,-351.31 186.67,-291.14"/> -<polygon fill="#49a04d" stroke="#49a04d" stroke-width="2" points="190.18,-291.15 185.78,-281.51 183.21,-291.79 190.18,-291.15"/> +<path fill="none" stroke="#49a04d" stroke-width="2" d="M415.5,-370.5C421.07,-370.5 417.87,-362.44 414.5,-358 355.15,-279.64 210.18,-373.32 200.06,-288.5"/> +<polygon fill="#49a04d" stroke="#49a04d" stroke-width="2" points="203.55,-288.29 199.5,-278.5 196.56,-288.68 203.55,-288.29"/> </g> <!-- hevc_dcr --> <g id="node38" class="node"> <title>hevc_dcr</title> -<polygon fill="paleturquoise" stroke="none" points="617,-534.5 617,-579.5 694,-579.5 694,-534.5 617,-534.5"/> -<text text-anchor="start" x="619.5" y="-561" font-family="Times,serif" font-size="20.00">hevc_dcr</text> -<polygon fill="lightgrey" stroke="none" points="617.5,-534 617.5,-553 694.5,-553 694.5,-534 617.5,-534"/> -<text text-anchor="start" x="619.5" y="-539.8" font-family="Times,serif" font-size="14.00">hevc_nalu</text> +<polygon fill="paleturquoise" stroke="transparent" points="725,-534.5 725,-579.5 820,-579.5 820,-534.5 725,-534.5"/> +<text text-anchor="start" x="727.5" y="-561" font-family="Times,serif" font-size="20.00">hevc_dcr</text> +<polygon fill="lightgrey" stroke="transparent" points="725.5,-534 725.5,-553 820.5,-553 820.5,-534 725.5,-534"/> +<text text-anchor="start" x="727.5" y="-539.8" font-family="Times,serif" font-size="14.00">hevc_nalu</text> </g> <!-- hevc_dcr&#45;&gt;hevc_nalu --> <g id="edge32" class="edge"> <title>hevc_dcr:e&#45;&gt;hevc_nalu:n</title> -<path fill="none" stroke="#a95844" stroke-width="2" d="M695.5,-543C701.07,-543 698.18,-534.68 694.5,-530.5 580.4,-401.02 318.26,-614.71 305.02,-461.72"/> -<polygon fill="#a95844" stroke="#a95844" stroke-width="2" points="308.53,-461.87 304.62,-452.02 301.54,-462.16 308.53,-461.87"/> +<path fill="none" stroke="#a95844" stroke-width="2" d="M821.5,-543C827.07,-543 824.25,-534.63 820.5,-530.5 753.22,-456.44 387.74,-546.05 362.84,-458.93"/> +<polygon fill="#a95844" stroke="#a95844" stroke-width="2" points="366.3,-458.44 361.5,-449 359.37,-459.38 366.3,-458.44"/> </g> <!-- id3v2 --> <g id="node42" class="node"> <title>id3v2</title> -<polygon fill="paleturquoise" stroke="none" points="3180,-534.5 3180,-579.5 3229,-579.5 3229,-534.5 3180,-534.5"/> -<text text-anchor="start" x="3182.5" y="-561" font-family="Times,serif" font-size="20.00">id3v2</text> -<polygon fill="lightgrey" stroke="none" points="3180.5,-534 3180.5,-553 3229.5,-553 3229.5,-534 3180.5,-534"/> -<text text-anchor="start" x="3182.5" y="-539.8" font-family="Times,serif" font-size="14.00">image</text> +<polygon fill="paleturquoise" stroke="transparent" points="3732,-534.5 3732,-579.5 3793,-579.5 3793,-534.5 3732,-534.5"/> +<text text-anchor="start" x="3734.5" y="-561" font-family="Times,serif" font-size="20.00">id3v2</text> +<polygon fill="lightgrey" stroke="transparent" points="3732.5,-534 3732.5,-553 3793.5,-553 3793.5,-534 3732.5,-534"/> +<text text-anchor="start" x="3734.5" y="-539.8" font-family="Times,serif" font-size="14.00">image</text> </g> <!-- id3v2&#45;&gt;image --> <g id="edge36" class="edge"> <title>id3v2:e&#45;&gt;image:n</title> -<path fill="none" stroke="#ae8959" stroke-width="2" d="M3230.5,-543C3248.51,-543 3241.43,-570.01 3229.5,-583.5 3210.45,-605.04 3194.05,-589.52 3165.5,-593 3081.74,-603.2 2468.16,-604.35 2409.5,-665 2314.15,-763.58 2470.21,-1185.78 2371.5,-1281 2363.31,-1288.9 2349.07,-1294.33 2340.25,-1292.23"/> -<polygon fill="#ae8959" stroke="#ae8959" stroke-width="2" points="2343.16,-1290.27 2334.33,-1284.41 2337.58,-1294.5 2343.16,-1290.27"/> +<path fill="none" stroke="#ae8959" stroke-width="2" d="M3794.5,-543C3812.51,-543 3805.58,-570.15 3793.5,-583.5 3770.66,-608.74 3751.37,-589.56 3717.5,-593 3615.27,-603.38 2867.59,-591.78 2795.5,-665 2699.27,-762.73 2855.97,-1186.04 2757,-1281 2744.86,-1292.65 2721.9,-1299.78 2713.08,-1291.51"/> +<polygon fill="#ae8959" stroke="#ae8959" stroke-width="2" points="2716.3,-1290.12 2709.5,-1282 2709.75,-1292.59 2716.3,-1290.12"/> </g> <!-- ip_packet --> <g id="node44" class="node"> <title>ip_packet</title> -<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M3744,-385.5C3744,-385.5 3835,-385.5 3835,-385.5 3841,-385.5 3847,-391.5 3847,-397.5 3847,-397.5 3847,-409.5 3847,-409.5 3847,-415.5 3841,-421.5 3835,-421.5 3835,-421.5 3744,-421.5 3744,-421.5 3738,-421.5 3732,-415.5 3732,-409.5 3732,-409.5 3732,-397.5 3732,-397.5 3732,-391.5 3738,-385.5 3744,-385.5"/> -<text text-anchor="middle" x="3789.5" y="-397.5" font-family="Times,serif" font-size="25.00">ip_packet</text> +<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M4144.5,-385.5C4144.5,-385.5 4258.5,-385.5 4258.5,-385.5 4264.5,-385.5 4270.5,-391.5 4270.5,-397.5 4270.5,-397.5 4270.5,-409.5 4270.5,-409.5 4270.5,-415.5 4264.5,-421.5 4258.5,-421.5 4258.5,-421.5 4144.5,-421.5 4144.5,-421.5 4138.5,-421.5 4132.5,-415.5 4132.5,-409.5 4132.5,-409.5 4132.5,-397.5 4132.5,-397.5 4132.5,-391.5 4138.5,-385.5 4144.5,-385.5"/> +<text text-anchor="middle" x="4201.5" y="-397.5" font-family="Times,serif" font-size="25.00">ip_packet</text> </g> <!-- ipv4_packet&#45;&gt;ip_packet --> <g id="edge37" class="edge"> <title>ipv4_packet:e&#45;&gt;ip_packet:n</title> -<path fill="none" stroke="#b3716f" stroke-width="2" d="M3605.5,-543C3698.77,-543 3781.56,-522.29 3788.96,-435.49"/> -<polygon fill="#b3716f" stroke="#b3716f" stroke-width="2" points="3792.46,-435.66 3789.37,-425.52 3785.46,-435.37 3792.46,-435.66"/> +<path fill="none" stroke="#b3716f" stroke-width="2" d="M4175.5,-543C4226.97,-543 4204.68,-485 4201.79,-432.55"/> +<polygon fill="#b3716f" stroke="#b3716f" stroke-width="2" points="4205.29,-432.39 4201.5,-422.5 4198.29,-432.6 4205.29,-432.39"/> </g> <!-- udp_datagram --> <g id="node88" class="node"> <title>udp_datagram</title> -<polygon fill="paleturquoise" stroke="none" points="3577.5,-237 3577.5,-282 3695.5,-282 3695.5,-237 3577.5,-237"/> -<text text-anchor="start" x="3579.5" y="-263.5" font-family="Times,serif" font-size="20.00">udp_datagram</text> -<polygon fill="lightgrey" stroke="none" points="3577.5,-236.5 3577.5,-255.5 3695.5,-255.5 3695.5,-236.5 3577.5,-236.5"/> -<text text-anchor="start" x="3579.5" y="-242.3" font-family="Times,serif" font-size="14.00">udp_payload</text> +<polygon fill="paleturquoise" stroke="transparent" points="3924,-237 3924,-282 4075,-282 4075,-237 3924,-237"/> +<text text-anchor="start" x="3926.5" y="-263.5" font-family="Times,serif" font-size="20.00">udp_datagram</text> +<polygon fill="lightgrey" stroke="transparent" points="3924.5,-236.5 3924.5,-255.5 4075.5,-255.5 4075.5,-236.5 3924.5,-236.5"/> +<text text-anchor="start" x="3926.5" y="-242.3" font-family="Times,serif" font-size="14.00">udp_payload</text> </g> <!-- ip_packet&#45;&gt;udp_datagram --> <g id="edge177" class="edge"> <title>ip_packet&#45;&gt;udp_datagram:n</title> -<path fill="none" stroke="#9940aa" stroke-width="2" d="M3736.85,-385.64C3696.31,-369.28 3645.84,-340.25 3637.65,-295.28"/> -<polygon fill="#9940aa" stroke="#9940aa" stroke-width="2" points="3641.15,-295.16 3636.77,-285.51 3634.18,-295.79 3641.15,-295.16"/> +<path fill="none" stroke="#9940aa" stroke-width="2" d="M4132.33,-390.62C4077.36,-376.99 4008.51,-348.8 4001.15,-292.55"/> +<polygon fill="#9940aa" stroke="#9940aa" stroke-width="2" points="4004.63,-292.25 4000.5,-282.5 3997.65,-292.7 4004.63,-292.25"/> </g> <!-- icmp --> <g id="node101" class="node"> <title>icmp</title> -<polygon fill="paleturquoise" stroke="none" points="3725.5,-246.5 3725.5,-272.5 3769.5,-272.5 3769.5,-246.5 3725.5,-246.5"/> -<text text-anchor="start" x="3727.5" y="-254.5" font-family="Times,serif" font-size="20.00">icmp</text> +<polygon fill="paleturquoise" stroke="transparent" points="4105.5,-246.5 4105.5,-272.5 4159.5,-272.5 4159.5,-246.5 4105.5,-246.5"/> +<text text-anchor="start" x="4107.5" y="-254.5" font-family="Times,serif" font-size="20.00">icmp</text> </g> <!-- ip_packet&#45;&gt;icmp --> <g id="edge143" class="edge"> <title>ip_packet&#45;&gt;icmp:n</title> -<path fill="none" stroke="#9940aa" stroke-width="2" d="M3780.18,-385.55C3769.06,-363.86 3751.54,-324.54 3748.1,-286.37"/> -<polygon fill="#9940aa" stroke="#9940aa" stroke-width="2" points="3751.6,-286.35 3747.64,-276.52 3744.61,-286.68 3751.6,-286.35"/> +<path fill="none" stroke="#9940aa" stroke-width="2" d="M4185.15,-385.28C4166.3,-363.69 4137.34,-324.52 4133.04,-283.64"/> +<polygon fill="#9940aa" stroke="#9940aa" stroke-width="2" points="4136.53,-283.3 4132.5,-273.5 4129.54,-283.67 4136.53,-283.3"/> </g> <!-- icmpv6 --> <g id="node102" class="node"> <title>icmpv6</title> -<polygon fill="paleturquoise" stroke="none" points="3799.5,-246.5 3799.5,-272.5 3863.5,-272.5 3863.5,-246.5 3799.5,-246.5"/> -<text text-anchor="start" x="3801.5" y="-254.5" font-family="Times,serif" font-size="20.00">icmpv6</text> +<polygon fill="paleturquoise" stroke="transparent" points="4189.5,-246.5 4189.5,-272.5 4267.5,-272.5 4267.5,-246.5 4189.5,-246.5"/> +<text text-anchor="start" x="4191.5" y="-254.5" font-family="Times,serif" font-size="20.00">icmpv6</text> </g> <!-- ip_packet&#45;&gt;icmpv6 --> <g id="edge144" class="edge"> <title>ip_packet&#45;&gt;icmpv6:n</title> -<path fill="none" stroke="#9940aa" stroke-width="2" d="M3798.82,-385.55C3809.94,-363.86 3827.46,-324.54 3830.9,-286.37"/> -<polygon fill="#9940aa" stroke="#9940aa" stroke-width="2" points="3834.39,-286.68 3831.36,-276.52 3827.4,-286.35 3834.39,-286.68"/> +<path fill="none" stroke="#9940aa" stroke-width="2" d="M4207.49,-385.21C4214.79,-362.7 4226.39,-321.7 4228.25,-283.62"/> +<polygon fill="#9940aa" stroke="#9940aa" stroke-width="2" points="4231.75,-283.58 4228.5,-273.5 4224.75,-283.41 4231.75,-283.58"/> </g> <!-- tcp_segment --> <g id="node108" class="node"> <title>tcp_segment</title> -<polygon fill="paleturquoise" stroke="none" points="3893.5,-246.5 3893.5,-272.5 3997.5,-272.5 3997.5,-246.5 3893.5,-246.5"/> -<text text-anchor="start" x="3895.5" y="-254.5" font-family="Times,serif" font-size="20.00">tcp_segment</text> +<polygon fill="paleturquoise" stroke="transparent" points="4297.5,-246.5 4297.5,-272.5 4431.5,-272.5 4431.5,-246.5 4297.5,-246.5"/> +<text text-anchor="start" x="4299.5" y="-254.5" font-family="Times,serif" font-size="20.00">tcp_segment</text> </g> <!-- ip_packet&#45;&gt;tcp_segment --> <g id="edge171" class="edge"> <title>ip_packet&#45;&gt;tcp_segment:n</title> -<path fill="none" stroke="#9940aa" stroke-width="2" d="M3838.43,-385.59C3880.61,-367.8 3936.01,-335.49 3944.41,-286.35"/> -<polygon fill="#9940aa" stroke="#9940aa" stroke-width="2" points="3947.89,-286.78 3945.25,-276.52 3940.92,-286.19 3947.89,-286.78"/> +<path fill="none" stroke="#9940aa" stroke-width="2" d="M4254.87,-385.33C4299.53,-367.45 4357.03,-334.79 4363.83,-283.62"/> +<polygon fill="#9940aa" stroke="#9940aa" stroke-width="2" points="4367.34,-283.71 4364.5,-273.5 4360.35,-283.25 4367.34,-283.71"/> </g> <!-- ipv6_packet&#45;&gt;ip_packet --> <g id="edge38" class="edge"> <title>ipv6_packet:e&#45;&gt;ip_packet:n</title> -<path fill="none" stroke="#583eb2" stroke-width="2" d="M3975.5,-543C3981.07,-543 3977.47,-535.22 3974.5,-530.5 3926.31,-453.83 3802.42,-511.44 3790.44,-435.32"/> -<polygon fill="#583eb2" stroke="#583eb2" stroke-width="2" points="3793.94,-435.24 3789.72,-425.52 3786.96,-435.75 3793.94,-435.24"/> +<path fill="none" stroke="#583eb2" stroke-width="2" d="M4555.5,-543C4561.07,-543 4557.99,-534.84 4554.5,-530.5 4453.94,-405.35 4212.18,-578.81 4201.84,-432.6"/> +<polygon fill="#583eb2" stroke="#583eb2" stroke-width="2" points="4205.34,-432.38 4201.5,-422.5 4198.34,-432.61 4205.34,-432.38"/> </g> <!-- exif --> <g id="node47" class="node"> <title>exif</title> -<polygon fill="paleturquoise" stroke="none" points="3133,-390.5 3133,-416.5 3168,-416.5 3168,-390.5 3133,-390.5"/> -<text text-anchor="start" x="3135.5" y="-398.5" font-family="Times,serif" font-size="20.00">exif</text> +<polygon fill="paleturquoise" stroke="transparent" points="3681.5,-390.5 3681.5,-416.5 3723.5,-416.5 3723.5,-390.5 3681.5,-390.5"/> +<text text-anchor="start" x="3683.5" y="-398.5" font-family="Times,serif" font-size="20.00">exif</text> </g> <!-- jpeg&#45;&gt;exif --> <g id="edge39" class="edge"> <title>jpeg:e&#45;&gt;exif:n</title> -<path fill="none" stroke="#678b78" stroke-width="2" d="M3058.5,-553C3074.02,-553 3064.5,-534.31 3072.5,-521 3098.85,-477.16 3142.37,-477.84 3149.5,-435.35"/> -<polygon fill="#678b78" stroke="#678b78" stroke-width="2" points="3152.98,-435.76 3150.26,-425.52 3146,-435.22 3152.98,-435.76"/> +<path fill="none" stroke="#678b78" stroke-width="2" d="M3596.5,-553C3612.02,-553 3601.97,-533.97 3610.5,-521 3641.43,-473.98 3695.44,-481.24 3701.87,-432.63"/> +<polygon fill="#678b78" stroke="#678b78" stroke-width="2" points="3705.37,-432.7 3702.5,-422.5 3698.38,-432.26 3705.37,-432.7"/> </g> <!-- icc_profile --> <g id="node48" class="node"> <title>icc_profile</title> -<polygon fill="paleturquoise" stroke="none" points="3011.5,-390.5 3011.5,-416.5 3101.5,-416.5 3101.5,-390.5 3011.5,-390.5"/> -<text text-anchor="start" x="3013.5" y="-398.5" font-family="Times,serif" font-size="20.00">icc_profile</text> +<polygon fill="paleturquoise" stroke="transparent" points="3540.5,-390.5 3540.5,-416.5 3650.5,-416.5 3650.5,-390.5 3540.5,-390.5"/> +<text text-anchor="start" x="3542.5" y="-398.5" font-family="Times,serif" font-size="20.00">icc_profile</text> </g> <!-- jpeg&#45;&gt;icc_profile --> <g id="edge40" class="edge"> <title>jpeg:e&#45;&gt;icc_profile:n</title> -<path fill="none" stroke="#678b78" stroke-width="2" d="M3058.5,-534C3079.99,-534 3062.7,-468.79 3057.73,-435.3"/> -<polygon fill="#678b78" stroke="#678b78" stroke-width="2" points="3061.23,-435.13 3056.79,-425.51 3054.27,-435.8 3061.23,-435.13"/> +<path fill="none" stroke="#678b78" stroke-width="2" d="M3596.5,-534C3618.57,-534 3600.53,-465.21 3596.33,-432.66"/> +<polygon fill="#678b78" stroke="#678b78" stroke-width="2" points="3599.8,-432.18 3595.5,-422.5 3592.82,-432.75 3599.8,-432.18"/> </g> <!-- macho_fat&#45;&gt;macho --> <g id="edge41" class="edge"> <title>macho_fat:e&#45;&gt;macho:n</title> -<path fill="none" stroke="#9d7d5b" stroke-width="2" d="M1722.5,-1888.5C1737.97,-1888.5 1748.17,-1871.52 1616.5,-1838 1410.86,-1785.64 1302.67,-1907.47 1144.5,-1766 1086.5,-1714.12 1095.31,-1674.07 1096.4,-1600.17"/> -<polygon fill="#9d7d5b" stroke="#9d7d5b" stroke-width="2" points="1099.9,-1600.55 1096.48,-1590.53 1092.9,-1600.5 1099.9,-1600.55"/> +<path fill="none" stroke="#9d7d5b" stroke-width="2" d="M2041.5,-1888.5C2047.07,-1888.5 2043.99,-1880.34 2040.5,-1876 2004.09,-1830.77 1972.22,-1850.45 1915.5,-1838 1801.13,-1812.89 1482.72,-1841.84 1393.5,-1766 1332.84,-1714.44 1337.94,-1673.96 1338.46,-1597.51"/> +<polygon fill="#9d7d5b" stroke="#9d7d5b" stroke-width="2" points="1341.96,-1597.51 1338.5,-1587.5 1334.96,-1597.49 1341.96,-1597.51"/> </g> <!-- matroska&#45;&gt;aac_frame --> <g id="edge42" class="edge"> <title>matroska:e&#45;&gt;aac_frame:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1726.5C1715.5,-1726.5 1560.52,-1528.95 1556.5,-1371 1555.5,-1331.75 1545.07,-697.13 1522.5,-665 1466.01,-584.58 1322.51,-670.37 1309.45,-588.95"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1312.95,-588.73 1308.72,-579.02 1305.97,-589.25 1312.95,-588.73"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1726.5C1853.08,-1726.5 1827.48,-694.24 1805.5,-665 1734.26,-570.23 1556.34,-690.67 1545.97,-586.1"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1549.46,-585.83 1545.5,-576 1542.47,-586.15 1549.46,-585.83"/> </g> <!-- matroska&#45;&gt;image --> <g id="edge51" class="edge"> <title>matroska:e&#45;&gt;image:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1554.5C1560.14,-1554.5 2223.52,-1322.91 2320.68,-1286.71"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="2321.69,-1290.07 2329.69,-1283.12 2319.1,-1283.57 2321.69,-1290.07"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1554.5C1841.98,-1554.5 2604.45,-1316.39 2699.76,-1285.32"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="2701.16,-1288.54 2709.5,-1282 2698.91,-1281.91 2701.16,-1288.54"/> </g> <!-- matroska&#45;&gt;av1_frame --> <g id="edge44" class="edge"> <title>matroska:e&#45;&gt;av1_frame:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1688.5C1730.97,-1688.5 1576.94,-1472.38 1582.5,-1299 1591.53,-1017.37 1626.08,-943.39 1582.5,-665 1577.38,-632.32 1561.31,-623.76 1557.38,-596.8"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1560.88,-596.76 1556.71,-587.02 1553.9,-597.24 1560.88,-596.76"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1688.5C2013.97,-1688.5 1859.94,-1472.38 1865.5,-1299 1874.53,-1017.37 1924.63,-940.5 1865.5,-665 1858.08,-630.45 1834.54,-624.84 1830.19,-595.07"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1833.68,-594.74 1829.5,-585 1826.7,-595.22 1833.68,-594.74"/> </g> <!-- matroska&#45;&gt;avc_au --> <g id="edge45" class="edge"> <title>matroska:e&#45;&gt;avc_au:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1669.5C1690.17,-1669.5 1611.42,-1491.77 1556.5,-1371 1546.46,-1348.93 1411.54,-1242.01 1392.5,-1227 1348.92,-1192.65 1317.72,-1203.35 1290.5,-1155 1236.96,-1059.88 1327.91,-747.55 1256.5,-665 1148.45,-540.08 897.21,-742.44 884.04,-596.63"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="887.55,-596.87 883.63,-587.02 880.56,-597.16 887.55,-596.87"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1669.5C1973.17,-1669.5 1897.81,-1490.17 1839.5,-1371 1816.68,-1324.36 1698.06,-1256.73 1655.5,-1227 1605.76,-1192.25 1570.82,-1206.97 1539.5,-1155 1483.17,-1061.51 1578.7,-745.97 1505.5,-665 1437.45,-589.72 1066.16,-683.24 1040.86,-595.06"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1044.31,-594.44 1039.5,-585 1037.37,-595.38 1044.31,-594.44"/> </g> <!-- matroska&#45;&gt;avc_dcr --> <g id="edge46" class="edge"> <title>matroska:e&#45;&gt;avc_dcr:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1650.5C1576.34,-1650.5 1600.12,-748.55 1552.5,-665 1520.22,-608.36 1430.91,-647.68 1418.85,-596.74"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1422.36,-596.58 1417.82,-587.01 1415.4,-597.32 1422.36,-596.58"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1650.5C1861.23,-1650.5 1887.89,-748.55 1835.5,-665 1794.55,-599.7 1683.14,-659.77 1673.21,-594.99"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1676.7,-594.73 1672.5,-585 1669.72,-595.22 1676.7,-594.73"/> </g> <!-- matroska&#45;&gt;hevc_au --> <g id="edge49" class="edge"> <title>matroska:e&#45;&gt;hevc_au:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1593.5C1656.39,-1593.5 1618.26,-1448.23 1556.5,-1371 1467.34,-1259.52 1363.67,-1376.04 1243.5,-1299 1175.47,-1255.39 1161.19,-1230.54 1132.5,-1155 1093.74,-1052.96 1172.75,-745.01 1098.5,-665 1018.01,-578.27 585.37,-697.39 553.37,-596.65"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="556.87,-596.37 551.94,-586.99 549.94,-597.4 556.87,-596.37"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1593.5C1939.39,-1593.5 1902.09,-1447.56 1839.5,-1371 1739.81,-1249.06 1629,-1377.6 1492.5,-1299 1418.04,-1256.12 1396.95,-1234.15 1363.5,-1155 1321.01,-1054.46 1404.87,-743.95 1329.5,-665 1227.19,-557.84 678.11,-728.37 652.43,-595.13"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="655.9,-594.64 651.5,-585 648.93,-595.28 655.9,-594.64"/> </g> <!-- matroska&#45;&gt;mp3_frame --> <g id="edge52" class="edge"> <title>matroska:e&#45;&gt;mp3_frame:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1535.5C1630.61,-1535.5 1596.6,-1432.14 1556.5,-1371 1513.07,-1304.77 1448.23,-1356.25 1393.5,-1299 1369.77,-1274.18 1390.63,-1250.4 1365.5,-1227 1286.18,-1153.13 1204.81,-1235.74 1132.5,-1155 984.57,-989.8 1201.5,-815.35 1038.5,-665 923.19,-558.64 350.28,-734.93 317.93,-596.89"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="321.41,-596.56 316.83,-587.01 314.46,-597.33 321.41,-596.56"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1535.5C1913.61,-1535.5 1880.84,-1431.3 1839.5,-1371 1790.08,-1298.91 1718.18,-1360.92 1656.5,-1299 1632.27,-1274.67 1654.03,-1249.96 1628.5,-1227 1537.77,-1145.37 1446.47,-1244.51 1363.5,-1155 1212.75,-992.37 1434.07,-813.62 1269.5,-665 1198.09,-600.51 432.23,-678.83 378.47,-594.84"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="381.74,-593.56 375.5,-585 375.04,-595.58 381.74,-593.56"/> </g> <!-- matroska&#45;&gt;flac_frame --> <g id="edge47" class="edge"> <title>matroska:e&#45;&gt;flac_frame:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1631.5C1673.28,-1631.5 1580.09,-1484.35 1556.5,-1371 1535.2,-1268.67 1487.41,-1256.75 1463.5,-1155 1451.03,-1101.92 1472.47,-705.98 1436.5,-665 1306.14,-516.51 1004.45,-766.44 990.97,-588.92"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="994.47,-588.89 990.61,-579.03 987.47,-589.15 994.47,-588.89"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1631.5C1956.28,-1631.5 1863.09,-1484.35 1839.5,-1371 1818.2,-1268.67 1770.51,-1256.72 1746.5,-1155 1733.97,-1101.93 1755.28,-705.26 1718.5,-665 1636.49,-575.23 1188.9,-694.03 1163.62,-586.03"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1167.08,-585.55 1162.5,-576 1160.13,-586.33 1167.08,-585.55"/> </g> <!-- matroska&#45;&gt;flac_metadatablocks --> <g id="edge48" class="edge"> <title>matroska:e&#45;&gt;flac_metadatablocks:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1612.5C1664.83,-1612.5 1564.85,-1478.01 1556.5,-1371 1548.95,-1274.18 1536.83,-1251.19 1523.5,-1155 1508.43,-1046.31 1534.88,-747.47 1462.5,-665 1371.05,-560.79 1164.39,-716.6 1151.17,-596.89"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1154.67,-596.83 1150.66,-587.02 1147.68,-597.19 1154.67,-596.83"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1612.5C1947.83,-1612.5 1847.85,-1478.01 1839.5,-1371 1831.95,-1274.18 1819.83,-1251.19 1806.5,-1155 1791.43,-1046.31 1820.01,-745.56 1745.5,-665 1627.53,-537.45 1365.53,-753.19 1354.84,-595.41"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1358.32,-594.88 1354.5,-585 1351.33,-595.11 1358.32,-594.88"/> </g> <!-- matroska&#45;&gt;hevc_dcr --> <g id="edge50" class="edge"> <title>matroska:e&#45;&gt;hevc_dcr:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1574.5C1647.95,-1574.5 1612.56,-1441.97 1556.5,-1371 1472.58,-1264.76 1346.65,-1403.44 1260.5,-1299 1215.62,-1244.6 1278.08,-717.06 1230.5,-665 1146.5,-573.1 689.31,-703.26 657.27,-596.62"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="660.78,-596.41 655.92,-587 653.84,-597.39 660.78,-596.41"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1574.5C1930.95,-1574.5 1896.4,-1441.3 1839.5,-1371 1745.06,-1254.32 1606.49,-1413.58 1509.5,-1299 1463.93,-1245.17 1526.78,-716.41 1478.5,-665 1372.83,-552.5 799.11,-734.38 773.39,-595.12"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="776.87,-594.65 772.5,-585 769.89,-595.27 776.87,-594.65"/> </g> <!-- av1_ccr --> <g id="node52" class="node"> <title>av1_ccr</title> -<polygon fill="paleturquoise" stroke="none" points="1937.5,-544 1937.5,-570 2005.5,-570 2005.5,-544 1937.5,-544"/> -<text text-anchor="start" x="1939.5" y="-552" font-family="Times,serif" font-size="20.00">av1_ccr</text> +<polygon fill="paleturquoise" stroke="transparent" points="2268,-544 2268,-570 2351,-570 2351,-544 2268,-544"/> +<text text-anchor="start" x="2270.5" y="-552" font-family="Times,serif" font-size="20.00">av1_ccr</text> </g> <!-- matroska&#45;&gt;av1_ccr --> <g id="edge43" class="edge"> <title>matroska:e&#45;&gt;av1_ccr:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1707.5C2045.83,-1707.5 1709.62,-1112.75 1904.5,-665 1922.41,-623.86 1962.88,-624.85 1970.32,-588.55"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1973.76,-589.3 1971.22,-579.01 1966.79,-588.64 1973.76,-589.3"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1707.5C2117.83,-1707.5 2041.01,-1417.49 2130.5,-1155 2201.84,-945.72 2112.33,-860.03 2216.5,-665 2241.72,-617.79 2301.15,-631.09 2308.71,-586.16"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="2312.21,-586.24 2309.5,-576 2305.23,-585.7 2312.21,-586.24"/> </g> <!-- mpeg_asc --> <g id="node53" class="node"> <title>mpeg_asc</title> -<polygon fill="paleturquoise" stroke="none" points="2745.5,-390.5 2745.5,-416.5 2829.5,-416.5 2829.5,-390.5 2745.5,-390.5"/> -<text text-anchor="start" x="2747.5" y="-398.5" font-family="Times,serif" font-size="20.00">mpeg_asc</text> +<polygon fill="paleturquoise" stroke="transparent" points="3221.5,-390.5 3221.5,-416.5 3325.5,-416.5 3325.5,-390.5 3221.5,-390.5"/> +<text text-anchor="start" x="3223.5" y="-398.5" font-family="Times,serif" font-size="20.00">mpeg_asc</text> </g> <!-- matroska&#45;&gt;mpeg_asc --> <g id="edge53" class="edge"> <title>matroska:e&#45;&gt;mpeg_asc:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1516.5C1829.2,-1516.5 1911.51,-1388.46 2050.5,-1155 2162.94,-966.13 1960.44,-818.77 2117.5,-665 2317.3,-469.39 2531.13,-776.05 2742.5,-593 2798.39,-544.6 2788.88,-505.53 2787.62,-435.46"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="2791.12,-435.49 2787.53,-425.53 2784.12,-435.56 2791.12,-435.49"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1516.5C2135.25,-1516.5 2237.17,-1402.98 2396.5,-1155 2515.52,-969.76 2309.71,-816.49 2469.5,-665 2592.45,-548.43 3099.32,-702.62 3228.5,-593 3285.57,-544.57 3274.68,-504.61 3273.58,-432.84"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="3277.08,-432.47 3273.5,-422.5 3270.08,-432.53 3277.08,-432.47"/> </g> <!-- mpeg_pes_packet --> <g id="node54" class="node"> <title>mpeg_pes_packet</title> -<polygon fill="paleturquoise" stroke="none" points="2817.5,-544 2817.5,-570 2963.5,-570 2963.5,-544 2817.5,-544"/> -<text text-anchor="start" x="2819.5" y="-552" font-family="Times,serif" font-size="20.00">mpeg_pes_packet</text> +<polygon fill="paleturquoise" stroke="transparent" points="3303.5,-544 3303.5,-570 3487.5,-570 3487.5,-544 3303.5,-544"/> +<text text-anchor="start" x="3305.5" y="-552" font-family="Times,serif" font-size="20.00">mpeg_pes_packet</text> </g> <!-- matroska&#45;&gt;mpeg_pes_packet --> <g id="edge54" class="edge"> <title>matroska:e&#45;&gt;mpeg_pes_packet:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1497.5C1804.46,-1497.5 1912.89,-1483.99 2076.5,-1299 2124.58,-1244.64 2179.3,-713.26 2233.5,-665 2340.21,-570 2857.78,-714.1 2889.02,-588.56"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="2892.46,-589.35 2890.15,-579.01 2885.5,-588.53 2892.46,-589.35"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1497.5C2113.8,-1497.5 2234.49,-1497.35 2422.5,-1299 2472.86,-1245.87 2545.53,-712.17 2601.5,-665 2734.61,-552.81 3369.99,-745.74 3394.76,-585.97"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="3398.25,-586.23 3395.5,-576 3391.27,-585.71 3398.25,-586.23"/> </g> <!-- mpeg_spu --> <g id="node55" class="node"> <title>mpeg_spu</title> -<polygon fill="paleturquoise" stroke="none" points="2125.5,-1250 2125.5,-1276 2211.5,-1276 2211.5,-1250 2125.5,-1250"/> -<text text-anchor="start" x="2127.5" y="-1258" font-family="Times,serif" font-size="20.00">mpeg_spu</text> +<polygon fill="paleturquoise" stroke="transparent" points="2472,-1250 2472,-1276 2579,-1276 2579,-1250 2472,-1250"/> +<text text-anchor="start" x="2474.5" y="-1258" font-family="Times,serif" font-size="20.00">mpeg_spu</text> </g> <!-- matroska&#45;&gt;mpeg_spu --> <g id="edge55" class="edge"> <title>matroska:e&#45;&gt;mpeg_spu:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1478.5C1624.91,-1478.5 2110.87,-1366.63 2163.82,-1294.15"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="2167.09,-1295.41 2167.41,-1284.83 2160.55,-1292.9 2167.09,-1295.41"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1478.5C1916.43,-1478.5 2476.69,-1370.61 2522.52,-1291.92"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="2525.98,-1292.58 2525.5,-1282 2519.27,-1290.57 2525.98,-1292.58"/> </g> <!-- opus_packet --> <g id="node56" class="node"> <title>opus_packet</title> -<polygon fill="paleturquoise" stroke="none" points="1662,-534.5 1662,-579.5 1765,-579.5 1765,-534.5 1662,-534.5"/> -<text text-anchor="start" x="1664.5" y="-561" font-family="Times,serif" font-size="20.00">opus_packet</text> -<polygon fill="lightgrey" stroke="none" points="1662.5,-534 1662.5,-553 1765.5,-553 1765.5,-534 1662.5,-534"/> -<text text-anchor="start" x="1664.5" y="-539.8" font-family="Times,serif" font-size="14.00">vorbis_comment</text> +<polygon fill="paleturquoise" stroke="transparent" points="1945,-534.5 1945,-579.5 2076,-579.5 2076,-534.5 1945,-534.5"/> +<text text-anchor="start" x="1947.5" y="-561" font-family="Times,serif" font-size="20.00">opus_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="1945.5,-534 1945.5,-553 2076.5,-553 2076.5,-534 1945.5,-534"/> +<text text-anchor="start" x="1947.5" y="-539.8" font-family="Times,serif" font-size="14.00">vorbis_comment</text> </g> <!-- matroska&#45;&gt;opus_packet --> <g id="edge56" class="edge"> <title>matroska:e&#45;&gt;opus_packet:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1459.5C1638.22,-1459.5 1620.95,-1376.79 1642.5,-1299 1717.85,-1027.06 1609.14,-939.03 1676.5,-665 1684.8,-631.22 1707.09,-624.82 1712.37,-596.9"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1715.85,-597.28 1713.24,-587.02 1708.88,-596.67 1715.85,-597.28"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1459.5C1921.22,-1459.5 1903.95,-1376.79 1925.5,-1299 2000.85,-1027.06 1873.27,-933.68 1959.5,-665 1971.23,-628.46 2003.85,-627.09 2009.62,-595.35"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="2013.14,-595.26 2010.5,-585 2006.17,-594.67 2013.14,-595.26"/> </g> <!-- vorbis_packet --> <g id="node57" class="node"> <title>vorbis_packet</title> -<polygon fill="paleturquoise" stroke="none" points="1796,-381 1796,-426 1911,-426 1911,-381 1796,-381"/> -<text text-anchor="start" x="1798.5" y="-407.5" font-family="Times,serif" font-size="20.00">vorbis_packet</text> -<polygon fill="lightgrey" stroke="none" points="1796.5,-380.5 1796.5,-399.5 1911.5,-399.5 1911.5,-380.5 1796.5,-380.5"/> -<text text-anchor="start" x="1798.5" y="-386.3" font-family="Times,serif" font-size="14.00">vorbis_comment</text> +<polygon fill="paleturquoise" stroke="transparent" points="2106.5,-381 2106.5,-426 2252.5,-426 2252.5,-381 2106.5,-381"/> +<text text-anchor="start" x="2108.5" y="-407.5" font-family="Times,serif" font-size="20.00">vorbis_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="2106.5,-380.5 2106.5,-399.5 2252.5,-399.5 2252.5,-380.5 2106.5,-380.5"/> +<text text-anchor="start" x="2108.5" y="-386.3" font-family="Times,serif" font-size="14.00">vorbis_comment</text> </g> <!-- matroska&#45;&gt;vorbis_packet --> <g id="edge57" class="edge"> <title>matroska:e&#45;&gt;vorbis_packet:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1440.5C1660.14,-1440.5 1587.53,-605.01 1646.5,-521 1701.48,-442.67 1839.7,-522.66 1852.54,-443.39"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1856.02,-443.75 1853.28,-433.52 1849.04,-443.23 1856.02,-443.75"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1440.5C1943.14,-1440.5 1867.92,-603.12 1929.5,-521 1998.16,-429.44 2168.75,-542.27 2179.02,-441.57"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="2182.52,-441.66 2179.5,-431.5 2175.52,-441.32 2182.52,-441.66"/> </g> <!-- vp8_frame --> <g id="node58" class="node"> <title>vp8_frame</title> -<polygon fill="paleturquoise" stroke="none" points="8,-544 8,-570 99,-570 99,-544 8,-544"/> +<polygon fill="paleturquoise" stroke="transparent" points="8,-544 8,-570 119,-570 119,-544 8,-544"/> <text text-anchor="start" x="10.5" y="-552" font-family="Times,serif" font-size="20.00">vp8_frame</text> </g> <!-- matroska&#45;&gt;vp8_frame --> <g id="edge58" class="edge"> <title>matroska:e&#45;&gt;vp8_frame:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1421.5C1579.95,-1421.5 1571.21,-1387.95 1556.5,-1371 1425.76,-1220.35 1276.11,-1414.53 1113.5,-1299 1054.17,-1256.84 1057.15,-1224.49 1035.5,-1155 1002.92,-1050.44 1060.91,-741.47 982.5,-665 837.22,-523.31 86.75,-772.27 54.57,-588.72"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="58.08,-588.69 53.75,-579.02 51.1,-589.27 58.08,-588.69"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1421.5C1862.95,-1421.5 1854.35,-1387.84 1839.5,-1371 1693.03,-1204.93 1528.71,-1424.83 1346.5,-1299 1286.26,-1257.4 1288.65,-1224.78 1266.5,-1155 1233.36,-1050.61 1292.52,-740.83 1213.5,-665 1123.56,-578.69 120.61,-697.33 65.83,-585.95"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="69.19,-584.94 63.5,-576 62.37,-586.53 69.19,-584.94"/> </g> <!-- vp9_cfm --> <g id="node59" class="node"> <title>vp9_cfm</title> -<polygon fill="paleturquoise" stroke="none" points="1276,-1250 1276,-1276 1351,-1276 1351,-1250 1276,-1250"/> -<text text-anchor="start" x="1278.5" y="-1258" font-family="Times,serif" font-size="20.00">vp9_cfm</text> +<polygon fill="paleturquoise" stroke="transparent" points="1525,-1250 1525,-1276 1614,-1276 1614,-1250 1525,-1250"/> +<text text-anchor="start" x="1527.5" y="-1258" font-family="Times,serif" font-size="20.00">vp9_cfm</text> </g> <!-- matroska&#45;&gt;vp9_cfm --> <g id="edge59" class="edge"> <title>matroska:e&#45;&gt;vp9_cfm:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1402.5C1571.51,-1402.5 1564.7,-1382.35 1556.5,-1371 1491.83,-1281.51 1327.39,-1387.81 1314.33,-1294.72"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1317.84,-1294.77 1313.7,-1285.02 1310.85,-1295.23 1317.84,-1294.77"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1402.5C1854.51,-1402.5 1847.89,-1382.22 1839.5,-1371 1765.98,-1272.68 1580.41,-1400.7 1569.96,-1292.11"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="1573.45,-1291.83 1569.5,-1282 1566.46,-1292.15 1573.45,-1291.83"/> </g> <!-- vp9_frame --> <g id="node60" class="node"> <title>vp9_frame</title> -<polygon fill="paleturquoise" stroke="none" points="395,-544 395,-570 486,-570 486,-544 395,-544"/> -<text text-anchor="start" x="397.5" y="-552" font-family="Times,serif" font-size="20.00">vp9_frame</text> +<polygon fill="paleturquoise" stroke="transparent" points="467,-544 467,-570 578,-570 578,-544 467,-544"/> +<text text-anchor="start" x="469.5" y="-552" font-family="Times,serif" font-size="20.00">vp9_frame</text> </g> <!-- matroska&#45;&gt;vp9_frame --> <g id="edge60" class="edge"> <title>matroska:e&#45;&gt;vp9_frame:n</title> -<path fill="none" stroke="#afb66f" stroke-width="2" d="M1557.5,-1383.5C1563.07,-1383.5 1560.24,-1375.14 1556.5,-1371 1437.46,-1239.24 1303.03,-1408.84 1163.5,-1299 1108.47,-1255.68 1118.25,-1222.48 1099.5,-1155 1070.12,-1049.28 1115.73,-742.95 1038.5,-665 947.17,-572.83 474.44,-701 442.23,-588.83"/> -<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="445.71,-588.44 440.9,-579 438.77,-589.38 445.71,-588.44"/> +<path fill="none" stroke="#afb66f" stroke-width="2" d="M1840.5,-1383.5C1846.07,-1383.5 1843.28,-1375.1 1839.5,-1371 1705.27,-1225.23 1558.08,-1417.83 1399.5,-1299 1342.71,-1256.44 1350.48,-1223.1 1330.5,-1155 1299.61,-1049.71 1347.78,-741.9 1269.5,-665 1152.81,-550.36 549.24,-734.93 523.36,-586.28"/> +<polygon fill="#afb66f" stroke="#afb66f" stroke-width="2" points="526.82,-585.67 522.5,-576 519.84,-586.26 526.82,-585.67"/> </g> <!-- opus_packet&#45;&gt;vorbis_comment --> <g id="edge100" class="edge"> <title>opus_packet:e&#45;&gt;vorbis_comment:n</title> -<path fill="none" stroke="#79624e" stroke-width="2" d="M1766.5,-543C1776.81,-543 1779.68,-368.27 1780.5,-358 1782.67,-330.74 1785.49,-320.98 1786.29,-298.86"/> -<polygon fill="#79624e" stroke="#79624e" stroke-width="2" points="1789.78,-299.08 1786.45,-289.03 1782.78,-298.97 1789.78,-299.08"/> +<path fill="none" stroke="#79624e" stroke-width="2" d="M2077.5,-543C2098.11,-543 2088.75,-378.43 2091.5,-358 2095.36,-329.35 2103.38,-320.53 2105.15,-296.17"/> +<polygon fill="#79624e" stroke="#79624e" stroke-width="2" points="2108.65,-296.11 2105.5,-286 2101.66,-295.87 2108.65,-296.11"/> </g> <!-- vorbis_packet&#45;&gt;vorbis_comment --> <g id="edge119" class="edge"> <title>vorbis_packet:e&#45;&gt;vorbis_comment:n</title> -<path fill="none" stroke="#77a776" stroke-width="2" d="M1912.5,-389.5C1918.07,-389.5 1914.22,-381.86 1911.5,-377 1880.21,-321.15 1798.73,-350.02 1787.73,-298.67"/> -<polygon fill="#77a776" stroke="#77a776" stroke-width="2" points="1791.25,-298.63 1786.79,-289.01 1784.28,-299.31 1791.25,-298.63"/> +<path fill="none" stroke="#77a776" stroke-width="2" d="M2253.5,-389.5C2259.07,-389.5 2255.4,-381.76 2252.5,-377 2214.33,-314.49 2115.38,-358.28 2106.19,-295.99"/> +<polygon fill="#77a776" stroke="#77a776" stroke-width="2" points="2109.68,-295.74 2105.5,-286 2102.69,-296.22 2109.68,-295.74"/> </g> <!-- mp3&#45;&gt;apev2 --> <g id="edge64" class="edge"> <title>mp3:e&#45;&gt;apev2:n</title> -<path fill="none" stroke="#6496b9" stroke-width="2" d="M2442.5,-1869.5C2456.51,-1869.5 2442.92,-1851.93 2441.5,-1838 2430.85,-1733.54 2401.94,-1706.96 2399.65,-1608.24"/> -<polygon fill="#6496b9" stroke="#6496b9" stroke-width="2" points="2403.15,-1608.49 2399.53,-1598.53 2396.15,-1608.57 2403.15,-1608.49"/> +<path fill="none" stroke="#6496b9" stroke-width="2" d="M2842.5,-1869.5C2856.51,-1869.5 2843.23,-1851.9 2841.5,-1838 2828.35,-1732.36 2790.94,-1707.88 2788.61,-1606.55"/> +<polygon fill="#6496b9" stroke="#6496b9" stroke-width="2" points="2792.11,-1606.46 2788.5,-1596.5 2785.11,-1606.54 2792.11,-1606.46"/> </g> <!-- mp3&#45;&gt;mp3_frame --> <g id="edge65" class="edge"> <title>mp3:e&#45;&gt;mp3_frame:n</title> -<path fill="none" stroke="#6496b9" stroke-width="2" d="M2442.5,-1850.5C2448.07,-1850.5 2445.46,-1841.92 2441.5,-1838 2280.73,-1678.68 1604.38,-1904.69 1425.5,-1766 1279.22,-1652.58 1420.53,-1505.62 1293.5,-1371 1234.37,-1308.33 1177.23,-1356.99 1113.5,-1299 1060.28,-1250.57 1060.44,-1223.84 1039.5,-1155 1007.6,-1050.12 1059.9,-742.63 982.5,-665 880.42,-562.61 350.03,-722.83 318.01,-596.67"/> -<polygon fill="#6496b9" stroke="#6496b9" stroke-width="2" points="321.52,-596.52 316.86,-587.01 314.57,-597.35 321.52,-596.52"/> +<path fill="none" stroke="#6496b9" stroke-width="2" d="M2842.5,-1850.5C2848.07,-1850.5 2845.48,-1841.9 2841.5,-1838 2656.11,-1655.96 1875.89,-1930.17 1674.5,-1766 1533.52,-1651.08 1692.83,-1502.81 1567.5,-1371 1496.32,-1296.14 1425.51,-1365.55 1346.5,-1299 1291.15,-1252.38 1291.94,-1224.12 1270.5,-1155 1238.03,-1050.3 1291.85,-741.67 1213.5,-665 1082.28,-536.59 401.44,-763.37 376.22,-594.98"/> +<polygon fill="#6496b9" stroke="#6496b9" stroke-width="2" points="379.71,-594.72 375.5,-585 372.73,-595.23 379.71,-594.72"/> </g> <!-- mp3&#45;&gt;id3v2 --> <g id="edge61" class="edge"> <title>mp3:e&#45;&gt;id3v2:n</title> -<path fill="none" stroke="#6496b9" stroke-width="2" d="M2442.5,-1927.5C2457.98,-1927.5 2465.57,-1385.3 2471.5,-1371 2633.64,-980.4 2806.17,-959.71 3109.5,-665 3145.88,-629.66 3195.13,-637.61 3203.32,-596.86"/> -<polygon fill="#6496b9" stroke="#6496b9" stroke-width="2" points="3206.8,-597.29 3204.22,-587.01 3199.83,-596.65 3206.8,-597.29"/> +<path fill="none" stroke="#6496b9" stroke-width="2" d="M2842.5,-1927.5C2857.97,-1927.5 2860.04,-1385.06 2866.5,-1371 3058.16,-953.84 3250.31,-936.5 3620.5,-665 3675.95,-624.34 3754.08,-654.06 3761.87,-595.23"/> +<polygon fill="#6496b9" stroke="#6496b9" stroke-width="2" points="3765.38,-595.2 3762.5,-585 3758.39,-594.76 3765.38,-595.2"/> </g> <!-- id3v1 --> <g id="node62" class="node"> <title>id3v1</title> -<polygon fill="paleturquoise" stroke="none" points="2575,-1555.5 2575,-1581.5 2624,-1581.5 2624,-1555.5 2575,-1555.5"/> -<text text-anchor="start" x="2577.5" y="-1563.5" font-family="Times,serif" font-size="20.00">id3v1</text> +<polygon fill="paleturquoise" stroke="transparent" points="2986,-1555.5 2986,-1581.5 3047,-1581.5 3047,-1555.5 2986,-1555.5"/> +<text text-anchor="start" x="2988.5" y="-1563.5" font-family="Times,serif" font-size="20.00">id3v1</text> </g> <!-- mp3&#45;&gt;id3v1 --> <g id="edge62" class="edge"> <title>mp3:e&#45;&gt;id3v1:n</title> -<path fill="none" stroke="#6496b9" stroke-width="2" d="M2442.5,-1908.5C2474.45,-1908.5 2438.98,-1864.71 2456.5,-1838 2487.34,-1791 2529.21,-1812.71 2560.5,-1766 2603.22,-1702.22 2600.02,-1672.08 2599.55,-1600.38"/> -<polygon fill="#6496b9" stroke="#6496b9" stroke-width="2" points="2603.05,-1600.51 2599.51,-1590.53 2596.05,-1600.54 2603.05,-1600.51"/> +<path fill="none" stroke="#6496b9" stroke-width="2" d="M2842.5,-1908.5C2874.45,-1908.5 2838.42,-1864.33 2856.5,-1838 2890.42,-1788.6 2935.2,-1814.43 2970.5,-1766 3016.68,-1702.64 3016.6,-1672.1 3016.51,-1597.78"/> +<polygon fill="#6496b9" stroke="#6496b9" stroke-width="2" points="3020.01,-1597.5 3016.5,-1587.5 3013.01,-1597.5 3020.01,-1597.5"/> </g> <!-- id3v11 --> <g id="node63" class="node"> <title>id3v11</title> -<polygon fill="paleturquoise" stroke="none" points="2486,-1555.5 2486,-1581.5 2545,-1581.5 2545,-1555.5 2486,-1555.5"/> -<text text-anchor="start" x="2488.5" y="-1563.5" font-family="Times,serif" font-size="20.00">id3v11</text> +<polygon fill="paleturquoise" stroke="transparent" points="2881.5,-1555.5 2881.5,-1581.5 2955.5,-1581.5 2955.5,-1555.5 2881.5,-1555.5"/> +<text text-anchor="start" x="2883.5" y="-1563.5" font-family="Times,serif" font-size="20.00">id3v11</text> </g> <!-- mp3&#45;&gt;id3v11 --> <g id="edge63" class="edge"> <title>mp3:e&#45;&gt;id3v11:n</title> -<path fill="none" stroke="#6496b9" stroke-width="2" d="M2442.5,-1888.5C2444.39,-1888.5 2499.59,-1656.62 2512.72,-1599.9"/> -<polygon fill="#6496b9" stroke="#6496b9" stroke-width="2" points="2516.06,-1600.98 2514.84,-1590.45 2509.23,-1599.44 2516.06,-1600.98"/> +<path fill="none" stroke="#6496b9" stroke-width="2" d="M2842.5,-1888.5C2844.43,-1888.5 2903.72,-1649.37 2916.21,-1597.38"/> +<polygon fill="#6496b9" stroke="#6496b9" stroke-width="2" points="2919.65,-1598.03 2918.5,-1587.5 2912.83,-1596.45 2919.65,-1598.03"/> </g> <!-- mp3_frame_vbri --> <g id="node105" class="node"> <title>mp3_frame_vbri</title> -<polygon fill="paleturquoise" stroke="none" points="472.5,-246.5 472.5,-272.5 610.5,-272.5 610.5,-246.5 472.5,-246.5"/> -<text text-anchor="start" x="474.5" y="-254.5" font-family="Times,serif" font-size="20.00">mp3_frame_vbri</text> +<polygon fill="paleturquoise" stroke="transparent" points="532,-246.5 532,-272.5 701,-272.5 701,-246.5 532,-246.5"/> +<text text-anchor="start" x="534.5" y="-254.5" font-family="Times,serif" font-size="20.00">mp3_frame_vbri</text> </g> <!-- mp3_frame_tags&#45;&gt;mp3_frame_vbri --> <g id="edge157" class="edge"> <title>mp3_frame_tags&#45;&gt;mp3_frame_vbri:n</title> -<path fill="none" stroke="#5fb287" stroke-width="2" d="M541.5,-385.8C541.5,-363.8 541.5,-323.56 541.5,-286.46"/> -<polygon fill="#5fb287" stroke="#5fb287" stroke-width="2" points="545,-286.53 541.5,-276.53 538,-286.53 545,-286.53"/> +<path fill="none" stroke="#5fb287" stroke-width="2" d="M617.5,-385.39C617.5,-362.81 617.5,-321.52 617.5,-283.97"/> +<polygon fill="#5fb287" stroke="#5fb287" stroke-width="2" points="621,-283.5 617.5,-273.5 614,-283.5 621,-283.5"/> </g> <!-- mp3_frame_xing --> <g id="node106" class="node"> <title>mp3_frame_xing</title> -<polygon fill="paleturquoise" stroke="none" points="641,-246.5 641,-272.5 782,-272.5 782,-246.5 641,-246.5"/> -<text text-anchor="start" x="643.5" y="-254.5" font-family="Times,serif" font-size="20.00">mp3_frame_xing</text> +<polygon fill="paleturquoise" stroke="transparent" points="731.5,-246.5 731.5,-272.5 903.5,-272.5 903.5,-246.5 731.5,-246.5"/> +<text text-anchor="start" x="733.5" y="-254.5" font-family="Times,serif" font-size="20.00">mp3_frame_xing</text> </g> <!-- mp3_frame_tags&#45;&gt;mp3_frame_xing --> <g id="edge158" class="edge"> <title>mp3_frame_tags&#45;&gt;mp3_frame_xing:n</title> -<path fill="none" stroke="#5fb287" stroke-width="2" d="M598.92,-385.56C644.81,-368.37 702.85,-336.97 711.42,-286.4"/> -<polygon fill="#5fb287" stroke="#5fb287" stroke-width="2" points="714.9,-286.77 712.25,-276.52 707.93,-286.19 714.9,-286.77"/> +<path fill="none" stroke="#5fb287" stroke-width="2" d="M694.83,-385.47C747.92,-368.97 810.01,-338.19 816.87,-283.59"/> +<polygon fill="#5fb287" stroke="#5fb287" stroke-width="2" points="820.38,-283.7 817.5,-273.5 813.39,-283.26 820.38,-283.7"/> </g> <!-- mp4&#45;&gt;aac_frame --> <g id="edge67" class="edge"> <title>mp4:e&#45;&gt;aac_frame:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-1116C2061.56,-1116 2052.26,-683.62 2035.5,-665 1929.6,-547.32 1341.92,-728.35 1309.86,-588.56"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="1313.39,-588.57 1308.83,-579.01 1306.43,-589.33 1313.39,-588.57"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-1116C2407.56,-1116 2398.39,-683.51 2381.5,-665 2257.97,-529.62 1572.33,-753.98 1546.26,-586.22"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="1549.74,-585.71 1545.5,-576 1542.75,-586.23 1549.74,-585.71"/> </g> <!-- mp4&#45;&gt;image --> <g id="edge78" class="edge"> <title>mp4:e&#45;&gt;image:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-906C2049.73,-906 2366.47,-1232.26 2371.5,-1244.5 2377.67,-1259.5 2382.82,-1269.38 2371.5,-1281 2363.56,-1289.15 2349.24,-1294.5 2340.34,-1292.32"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2343.17,-1290.25 2334.33,-1284.41 2337.6,-1294.49 2343.17,-1290.25"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-906C2410.54,-906 2745.62,-1218.87 2757,-1244.5 2763.58,-1259.33 2768.35,-1269.41 2757,-1281 2745.23,-1293.02 2722.05,-1299.93 2713.13,-1291.55"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2716.32,-1290.11 2709.5,-1282 2709.78,-1292.59 2716.32,-1290.11"/> </g> <!-- mp4&#45;&gt;av1_frame --> <g id="edge69" class="edge"> <title>mp4:e&#45;&gt;av1_frame:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-1078C2059.44,-1078 2050.33,-682.51 2035.5,-665 1968.72,-586.17 1591.04,-682.91 1558.71,-596.75"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="1562.17,-596.24 1557.02,-586.98 1555.27,-597.43 1562.17,-596.24"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-1078C2405.44,-1078 2396.54,-682.33 2381.5,-665 2302.65,-574.12 1856.75,-701.09 1830.69,-595.23"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="1834.13,-594.53 1829.5,-585 1827.18,-595.34 1834.13,-594.53"/> </g> <!-- mp4&#45;&gt;avc_au --> <g id="edge70" class="edge"> <title>mp4:e&#45;&gt;avc_au:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-1059C2058.39,-1059 2050.49,-680.95 2035.5,-665 1950.65,-574.67 955.1,-702.96 887.15,-596.23"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="890.58,-595.48 884.37,-586.9 883.87,-597.48 890.58,-595.48"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-1059C2404.39,-1059 2396.56,-680.88 2381.5,-665 2281.13,-559.14 1096.96,-726.2 1041.51,-594.97"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="1044.91,-594.11 1039.5,-585 1038.05,-595.49 1044.91,-594.11"/> </g> <!-- mp4&#45;&gt;avc_dcr --> <g id="edge71" class="edge"> <title>mp4:e&#45;&gt;avc_dcr:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-1040C2057.33,-1040 2049.26,-680.64 2035.5,-665 1947.04,-564.47 1451.98,-712.08 1419.21,-596.83"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="1422.69,-596.45 1417.9,-587 1415.75,-597.37 1422.69,-596.45"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-1040C2403.33,-1040 2395.4,-680.52 2381.5,-665 2278.08,-549.56 1699.35,-734.88 1673.4,-595.15"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="1676.87,-594.65 1672.5,-585 1669.9,-595.27 1676.87,-594.65"/> </g> <!-- mp4&#45;&gt;hevc_au --> <g id="edge74" class="edge"> <title>mp4:e&#45;&gt;hevc_au:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-983C2054.17,-983 2047.7,-677.78 2035.5,-665 1924.52,-548.67 622.87,-738.62 554.31,-596.31"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="557.81,-595.92 552.17,-586.95 550.99,-597.48 557.81,-595.92"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-983C2400.17,-983 2393.74,-677.74 2381.5,-665 2250.58,-528.75 708.71,-768.48 653.05,-595"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="656.49,-594.35 651.5,-585 649.57,-595.42 656.49,-594.35"/> </g> <!-- mp4&#45;&gt;mp3_frame --> <g id="edge80" class="edge"> <title>mp4:e&#45;&gt;mp3_frame:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-868C2059.06,-868 2051.14,-681.25 2035.5,-665 1906.03,-530.44 390.06,-763.8 319.08,-596.73"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="322.51,-596.07 317.1,-586.97 315.65,-597.46 322.51,-596.07"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-868C2405.06,-868 2397.19,-681.21 2381.5,-665 2306.12,-587.14 483.24,-690.36 380.05,-593.95"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="383.16,-592.32 375.5,-585 376.92,-595.5 383.16,-592.32"/> </g> <!-- mp4&#45;&gt;flac_frame --> <g id="edge72" class="edge"> <title>mp4:e&#45;&gt;flac_frame:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-1021C2056.28,-1021 2048.99,-679.47 2035.5,-665 1959.07,-583 1062.76,-684.23 994.6,-588.34"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="997.93,-587.26 991.45,-578.87 991.29,-589.47 997.93,-587.26"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-1021C2402.28,-1021 2395.06,-679.4 2381.5,-665 2290.75,-568.65 1219.01,-704.57 1164.64,-585.81"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="1168.05,-585.02 1162.5,-576 1161.21,-586.52 1168.05,-585.02"/> </g> <!-- mp4&#45;&gt;flac_metadatablocks --> <g id="edge73" class="edge"> <title>mp4:e&#45;&gt;flac_metadatablocks:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-1002C2055.22,-1002 2048.14,-678.81 2035.5,-665 1905.21,-522.67 1184.67,-769.67 1151.67,-596.88"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="1155.17,-596.66 1150.77,-587.01 1148.19,-597.29 1155.17,-596.66"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-1002C2401.22,-1002 2394.23,-678.72 2381.5,-665 2306.01,-583.64 1411.17,-692.48 1357.06,-594.77"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="1360.42,-593.79 1354.5,-585 1353.65,-595.56 1360.42,-593.79"/> </g> <!-- mp4&#45;&gt;hevc_dcr --> <g id="edge75" class="edge"> <title>mp4:e&#45;&gt;hevc_dcr:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-964C2053.11,-964 2046.94,-677.04 2035.5,-665 1932.68,-556.82 726.73,-727.42 658.51,-596.25"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="662.01,-595.82 656.22,-586.94 655.21,-597.49 662.01,-595.82"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-964C2399.11,-964 2392.99,-677 2381.5,-665 2260.11,-538.25 830,-755.22 774.18,-595.03"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="777.6,-594.28 772.5,-585 770.7,-595.44 777.6,-594.28"/> </g> <!-- mp4&#45;&gt;id3v2 --> <g id="edge77" class="edge"> <title>mp4:e&#45;&gt;id3v2:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-926C2218.66,-926 2183.98,-734.14 2352.5,-665 2436.52,-630.53 3137.22,-674.76 3200.01,-595.96"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="3203.19,-597.43 3203.43,-586.83 3196.64,-594.96 3203.19,-597.43"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-926C2578.69,-926 2554.41,-732.83 2738.5,-665 2842.34,-626.74 3707.73,-694.77 3760.03,-594.86"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="3763.46,-595.55 3762.5,-585 3756.67,-593.85 3763.46,-595.55"/> </g> <!-- mp4&#45;&gt;jpeg --> <g id="edge79" class="edge"> <title>mp4:e&#45;&gt;jpeg:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-887C2176.67,-887 2133.53,-724.37 2260.5,-665 2334.06,-630.6 2959.8,-673.74 3020.73,-604.57"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="3023.77,-606.38 3024.35,-595.8 3017.3,-603.71 3023.77,-606.38"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-887C2529.77,-887 2493.19,-723.14 2628.5,-665 2720.37,-625.53 3502,-691.75 3553.8,-602.73"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="3557.2,-603.57 3556.5,-593 3550.46,-601.7 3557.2,-603.57"/> </g> <!-- mp4&#45;&gt;icc_profile --> <g id="edge76" class="edge"> <title>mp4:e&#45;&gt;icc_profile:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-945C2099.63,-945 2038.52,-708.26 2084.5,-665 2191.62,-564.2 2612.89,-662.55 2742.5,-593 2779.2,-573.3 2768.67,-545.3 2802.5,-521 2897.09,-453.04 3044.73,-536.72 3055.83,-435.42"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="3059.33,-435.69 3056.34,-425.52 3052.33,-435.33 3059.33,-435.69"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-945C2445.63,-945 2384.12,-707.82 2430.5,-665 2561.32,-544.22 3070.82,-675.7 3228.5,-593 3265.39,-573.65 3253.96,-544.29 3288.5,-521 3404.41,-442.84 3586.35,-559.82 3595.17,-432.52"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="3598.67,-432.61 3595.5,-422.5 3591.67,-432.38 3598.67,-432.61"/> </g> <!-- mp4&#45;&gt;av1_ccr --> <g id="edge68" class="edge"> <title>mp4:e&#45;&gt;av1_ccr:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-1097C2060.5,-1097 2042.89,-687.83 2035.5,-665 2021.97,-623.17 1980.75,-624.03 1972.82,-588.81"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="1976.32,-588.6 1971.81,-579.01 1969.36,-589.32 1976.32,-588.6"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-1097C2406.5,-1097 2389.53,-687.62 2381.5,-665 2365.7,-620.52 2317.25,-625.76 2310.33,-586.12"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2313.8,-585.68 2309.5,-576 2306.83,-586.25 2313.8,-585.68"/> </g> <!-- mp4&#45;&gt;mpeg_pes_packet --> <g id="edge82" class="edge"> <title>mp4:e&#45;&gt;mpeg_pes_packet:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-830C2112.87,-830 2025.9,-713.98 2084.5,-665 2219.38,-552.25 2858.21,-746.3 2889.32,-588.52"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2892.77,-589.3 2890.22,-579.01 2885.8,-588.64 2892.77,-589.3"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-830C2458.87,-830 2371.47,-713.46 2430.5,-665 2594.26,-530.55 3369.93,-782.98 3394.88,-586.04"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="3398.38,-586.2 3395.5,-576 3391.39,-585.77 3398.38,-586.2"/> </g> <!-- mp4&#45;&gt;opus_packet --> <g id="edge83" class="edge"> <title>mp4:e&#45;&gt;opus_packet:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-811C2052.72,-811 2045.52,-677.76 2035.5,-665 1947.22,-552.56 1727.79,-720.45 1714.17,-596.89"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="1717.67,-596.83 1713.66,-587.02 1710.68,-597.19 1717.67,-596.83"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-811C2398.72,-811 2391.73,-677.59 2381.5,-665 2277.38,-536.93 2021.8,-744.41 2010.86,-595.34"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2014.35,-594.87 2010.5,-585 2007.35,-595.12 2014.35,-594.87"/> </g> <!-- mp4&#45;&gt;vorbis_packet --> <g id="edge88" class="edge"> <title>mp4:e&#45;&gt;vorbis_packet:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-716C2047.3,-716 2047.4,-561.26 2020.5,-521 1976.26,-454.78 1866.87,-508.09 1854.62,-443.47"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="1858.11,-443.18 1853.76,-433.52 1851.13,-443.78 1858.11,-443.18"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-716C2393.82,-716 2394.89,-561.26 2366.5,-521 2315.48,-448.64 2189.84,-517.78 2180.1,-441.54"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2183.59,-441.27 2179.5,-431.5 2176.6,-441.69 2183.59,-441.27"/> </g> <!-- mp4&#45;&gt;vp9_frame --> <g id="edge89" class="edge"> <title>mp4:e&#45;&gt;vp9_frame:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-697C2050.73,-697 2045.48,-675.14 2035.5,-665 1915.71,-543.33 669.02,-620.45 500.5,-593 478.7,-589.45 453.54,-598.36 444.22,-588.1"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="447.67,-587.42 441.39,-578.89 440.98,-589.48 447.67,-587.42"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-697C2396.73,-697 2391.52,-675.11 2381.5,-665 2311.52,-594.39 691.97,-606.64 593.5,-593 565.38,-589.1 532.11,-603.85 524.23,-585.86"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="527.68,-585.24 522.5,-576 520.78,-586.45 527.68,-585.24"/> </g> <!-- mpeg_es --> <g id="node66" class="node"> <title>mpeg_es</title> -<polygon fill="paleturquoise" stroke="none" points="2505.5,-525 2505.5,-589 2585.5,-589 2585.5,-525 2505.5,-525"/> -<text text-anchor="start" x="2510" y="-571" font-family="Times,serif" font-size="20.00">mpeg_es</text> -<polygon fill="lightgrey" stroke="none" points="2505.5,-544 2505.5,-563 2585.5,-563 2585.5,-544 2505.5,-544"/> -<text text-anchor="start" x="2507.5" y="-549.8" font-family="Times,serif" font-size="14.00">mpeg_asc</text> -<polygon fill="lightgrey" stroke="none" points="2505.5,-525 2505.5,-544 2585.5,-544 2585.5,-525 2505.5,-525"/> -<text text-anchor="start" x="2507.5" y="-530.8" font-family="Times,serif" font-size="14.00">vorbis_packet</text> +<polygon fill="paleturquoise" stroke="transparent" points="2939,-525 2939,-589 3042,-589 3042,-525 2939,-525"/> +<text text-anchor="start" x="2946.5" y="-571" font-family="Times,serif" font-size="20.00">mpeg_es</text> +<polygon fill="lightgrey" stroke="transparent" points="2939.5,-544 2939.5,-563 3042.5,-563 3042.5,-544 2939.5,-544"/> +<text text-anchor="start" x="2941.5" y="-549.8" font-family="Times,serif" font-size="14.00">mpeg_asc</text> +<polygon fill="lightgrey" stroke="transparent" points="2939.5,-525 2939.5,-544 3042.5,-544 3042.5,-525 2939.5,-525"/> +<text text-anchor="start" x="2941.5" y="-530.8" font-family="Times,serif" font-size="14.00">vorbis_packet</text> </g> <!-- mp4&#45;&gt;mpeg_es --> <g id="edge81" class="edge"> <title>mp4:e&#45;&gt;mpeg_es:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-849C2077.58,-849 2026.16,-694.74 2054.5,-665 2127.39,-588.52 2511.25,-693.71 2543.36,-605.72"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2546.79,-606.43 2545,-595.99 2539.89,-605.27 2546.79,-606.43"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-849C2423.58,-849 2371.8,-694.4 2400.5,-665 2490.25,-573.08 2963.58,-716.82 2989.4,-603.2"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2992.91,-603.32 2990.5,-593 2985.95,-602.57 2992.91,-603.32"/> </g> <!-- mp4&#45;&gt;png --> <g id="edge84" class="edge"> <title>mp4:e&#45;&gt;png:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-792C2175.58,-792 2187.88,-699.95 2322.5,-665 2404.43,-643.73 3053.3,-678.27 3113.96,-604.66"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="3117.03,-606.41 3117.4,-595.82 3110.51,-603.87 3117.03,-606.41"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-792C2538,-792 2556.87,-699.44 2708.5,-665 2808.92,-642.19 3609.41,-695.76 3660.9,-602.78"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="3664.32,-603.56 3663.5,-593 3657.55,-601.77 3664.32,-603.56"/> </g> <!-- prores_frame --> <g id="node68" class="node"> <title>prores_frame</title> -<polygon fill="paleturquoise" stroke="none" points="2616,-544 2616,-570 2727,-570 2727,-544 2616,-544"/> -<text text-anchor="start" x="2618.5" y="-552" font-family="Times,serif" font-size="20.00">prores_frame</text> +<polygon fill="paleturquoise" stroke="transparent" points="3072,-544 3072,-570 3213,-570 3213,-544 3072,-544"/> +<text text-anchor="start" x="3074.5" y="-552" font-family="Times,serif" font-size="20.00">prores_frame</text> </g> <!-- mp4&#45;&gt;prores_frame --> <g id="edge85" class="edge"> <title>mp4:e&#45;&gt;prores_frame:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-773C2060.83,-773 2037.01,-681.91 2054.5,-665 2150.8,-571.92 2637.6,-705.11 2669.82,-588.88"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2673.29,-589.37 2671.11,-579 2666.35,-588.47 2673.29,-589.37"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-773C2406.83,-773 2382.82,-681.72 2400.5,-665 2518.58,-553.35 3116.03,-734 3141.65,-586.22"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="3145.16,-586.26 3142.5,-576 3138.18,-585.68 3145.16,-586.26"/> </g> <!-- protobuf_widevine --> <g id="node69" class="node"> <title>protobuf_widevine</title> -<polygon fill="paleturquoise" stroke="none" points="2163.5,-534.5 2163.5,-579.5 2317.5,-579.5 2317.5,-534.5 2163.5,-534.5"/> -<text text-anchor="start" x="2165.5" y="-561" font-family="Times,serif" font-size="20.00">protobuf_widevine</text> -<polygon fill="lightgrey" stroke="none" points="2163.5,-534 2163.5,-553 2317.5,-553 2317.5,-534 2163.5,-534"/> -<text text-anchor="start" x="2165.5" y="-539.8" font-family="Times,serif" font-size="14.00">protobuf</text> +<polygon fill="paleturquoise" stroke="transparent" points="2523.5,-534.5 2523.5,-579.5 2717.5,-579.5 2717.5,-534.5 2523.5,-534.5"/> +<text text-anchor="start" x="2525.5" y="-561" font-family="Times,serif" font-size="20.00">protobuf_widevine</text> +<polygon fill="lightgrey" stroke="transparent" points="2523.5,-534 2523.5,-553 2717.5,-553 2717.5,-534 2523.5,-534"/> +<text text-anchor="start" x="2525.5" y="-539.8" font-family="Times,serif" font-size="14.00">protobuf</text> </g> <!-- mp4&#45;&gt;protobuf_widevine --> <g id="edge86" class="edge"> <title>mp4:e&#45;&gt;protobuf_widevine:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-754C2076.86,-754 2029.13,-696.38 2054.5,-665 2108.19,-598.58 2227.06,-666.22 2239.45,-596.9"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2242.93,-597.27 2240.25,-587.02 2235.96,-596.7 2242.93,-597.27"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-754C2422.86,-754 2374.17,-695.58 2400.5,-665 2465.99,-588.92 2609.91,-682.03 2619.95,-595.22"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2623.45,-595.17 2620.5,-585 2616.46,-594.8 2623.45,-595.17"/> </g> <!-- pssh_playready --> <g id="node70" class="node"> <title>pssh_playready</title> -<polygon fill="paleturquoise" stroke="none" points="2348,-544 2348,-570 2475,-570 2475,-544 2348,-544"/> -<text text-anchor="start" x="2350.5" y="-552" font-family="Times,serif" font-size="20.00">pssh_playready</text> +<polygon fill="paleturquoise" stroke="transparent" points="2748,-544 2748,-570 2909,-570 2909,-544 2748,-544"/> +<text text-anchor="start" x="2750.5" y="-552" font-family="Times,serif" font-size="20.00">pssh_playready</text> </g> <!-- mp4&#45;&gt;pssh_playready --> <g id="edge87" class="edge"> <title>mp4:e&#45;&gt;pssh_playready:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-735C2068.62,-735 2031.7,-687.63 2054.5,-665 2167.38,-552.95 2398.42,-729.38 2410.97,-588.64"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2414.45,-589.16 2411.37,-579.02 2407.45,-588.87 2414.45,-589.16"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-735C2414.62,-735 2377.26,-687.18 2400.5,-665 2538.51,-533.28 2818.16,-761.76 2828.22,-586.11"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2831.72,-586.09 2828.5,-576 2824.73,-585.9 2831.72,-586.09"/> </g> <!-- vpx_ccr --> <g id="node71" class="node"> <title>vpx_ccr</title> -<polygon fill="paleturquoise" stroke="none" points="2065.5,-544 2065.5,-570 2133.5,-570 2133.5,-544 2065.5,-544"/> -<text text-anchor="start" x="2067.5" y="-552" font-family="Times,serif" font-size="20.00">vpx_ccr</text> +<polygon fill="paleturquoise" stroke="transparent" points="2411.5,-544 2411.5,-570 2493.5,-570 2493.5,-544 2411.5,-544"/> +<text text-anchor="start" x="2413.5" y="-552" font-family="Times,serif" font-size="20.00">vpx_ccr</text> </g> <!-- mp4&#45;&gt;vpx_ccr --> <g id="edge90" class="edge"> <title>mp4:e&#45;&gt;vpx_ccr:n</title> -<path fill="none" stroke="#84a292" stroke-width="2" d="M2036.5,-678C2047.58,-678 2083.84,-616.61 2095.7,-588.31"/> -<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2099.01,-589.48 2098.61,-578.89 2092.32,-587.42 2099.01,-589.48"/> +<path fill="none" stroke="#84a292" stroke-width="2" d="M2382.5,-678C2394.31,-678 2437.52,-612.82 2449.44,-585.77"/> +<polygon fill="#84a292" stroke="#84a292" stroke-width="2" points="2452.85,-586.59 2452.5,-576 2446.17,-584.49 2452.85,-586.59"/> </g> <!-- mpeg_es&#45;&gt;mpeg_asc --> <g id="edge91" class="edge"> <title>mpeg_es:e&#45;&gt;mpeg_asc:n</title> -<path fill="none" stroke="#a49483" stroke-width="2" d="M2586.5,-553C2602.21,-553 2590.67,-532.37 2601.5,-521 2662.87,-456.57 2775.77,-510.22 2786.65,-435.12"/> -<polygon fill="#a49483" stroke="#a49483" stroke-width="2" points="2790.12,-435.73 2787.3,-425.52 2783.13,-435.26 2790.12,-435.73"/> +<path fill="none" stroke="#a49483" stroke-width="2" d="M3043.5,-553C3059.02,-553 3046.61,-532.06 3057.5,-521 3129,-448.39 3263.87,-522.58 3273.01,-432.67"/> +<polygon fill="#a49483" stroke="#a49483" stroke-width="2" points="3276.52,-432.66 3273.5,-422.5 3269.52,-432.32 3276.52,-432.66"/> </g> <!-- mpeg_es&#45;&gt;vorbis_packet --> <g id="edge92" class="edge"> <title>mpeg_es:e&#45;&gt;vorbis_packet:n</title> -<path fill="none" stroke="#a49483" stroke-width="2" d="M2586.5,-534C2592.29,-534 2589.5,-525.19 2585.5,-521 2475.41,-405.69 1886.96,-584.14 1854.87,-443.16"/> -<polygon fill="#a49483" stroke="#a49483" stroke-width="2" points="1858.38,-443.08 1853.82,-433.51 1851.42,-443.83 1858.38,-443.08"/> +<path fill="none" stroke="#a49483" stroke-width="2" d="M3043.5,-534C3049.29,-534 3046.54,-525.15 3042.5,-521 2910.42,-385.36 2205.63,-615.71 2180.21,-441.53"/> +<polygon fill="#a49483" stroke="#a49483" stroke-width="2" points="2183.69,-441.23 2179.5,-431.5 2176.71,-441.72 2183.69,-441.23"/> </g> <!-- png&#45;&gt;exif --> <g id="edge108" class="edge"> <title>png:e&#45;&gt;exif:n</title> -<path fill="none" stroke="#7bad75" stroke-width="2" d="M3151.5,-534C3172.99,-534 3156.46,-468.78 3151.69,-435.3"/> -<polygon fill="#7bad75" stroke="#7bad75" stroke-width="2" points="3155.19,-435.15 3150.78,-425.51 3148.22,-435.79 3155.19,-435.15"/> +<path fill="none" stroke="#7bad75" stroke-width="2" d="M3703.5,-534C3725.57,-534 3707.53,-465.21 3703.33,-432.66"/> +<polygon fill="#7bad75" stroke="#7bad75" stroke-width="2" points="3706.8,-432.18 3702.5,-422.5 3699.82,-432.75 3706.8,-432.18"/> </g> <!-- png&#45;&gt;icc_profile --> <g id="edge107" class="edge"> <title>png:e&#45;&gt;icc_profile:n</title> -<path fill="none" stroke="#7bad75" stroke-width="2" d="M3151.5,-553C3165.73,-553 3156,-534.12 3150.5,-521 3128.95,-469.54 3067.25,-480.68 3057.74,-435.32"/> -<polygon fill="#7bad75" stroke="#7bad75" stroke-width="2" points="3061.23,-435.13 3056.79,-425.51 3054.27,-435.8 3061.23,-435.13"/> +<path fill="none" stroke="#7bad75" stroke-width="2" d="M3703.5,-553C3717.73,-553 3708.42,-533.94 3702.5,-521 3677.14,-465.55 3604.4,-484.58 3596.25,-432.65"/> +<polygon fill="#7bad75" stroke="#7bad75" stroke-width="2" points="3599.72,-432.22 3595.5,-422.5 3592.74,-432.73 3599.72,-432.22"/> </g> <!-- protobuf --> <g id="node79" class="node"> <title>protobuf</title> -<polygon fill="paleturquoise" stroke="none" points="2281.5,-390.5 2281.5,-416.5 2353.5,-416.5 2353.5,-390.5 2281.5,-390.5"/> -<text text-anchor="start" x="2283.5" y="-398.5" font-family="Times,serif" font-size="20.00">protobuf</text> +<polygon fill="paleturquoise" stroke="transparent" points="2671.5,-390.5 2671.5,-416.5 2763.5,-416.5 2763.5,-390.5 2671.5,-390.5"/> +<text text-anchor="start" x="2673.5" y="-398.5" font-family="Times,serif" font-size="20.00">protobuf</text> </g> <!-- protobuf_widevine&#45;&gt;protobuf --> <g id="edge109" class="edge"> <title>protobuf_widevine:e&#45;&gt;protobuf:n</title> -<path fill="none" stroke="#a088b4" stroke-width="2" d="M2318.5,-543C2341.93,-543 2323.59,-471.24 2318.64,-435.37"/> -<polygon fill="#a088b4" stroke="#a088b4" stroke-width="2" points="2322.14,-435.17 2317.77,-425.52 2315.16,-435.79 2322.14,-435.17"/> +<path fill="none" stroke="#a088b4" stroke-width="2" d="M2718.5,-543C2742.56,-543 2722.58,-467.35 2718.27,-432.56"/> +<polygon fill="#a088b4" stroke="#a088b4" stroke-width="2" points="2721.76,-432.2 2717.5,-422.5 2714.78,-432.74 2721.76,-432.2"/> </g> <!-- mpeg_pes --> <g id="node72" class="node"> <title>mpeg_pes</title> -<polygon fill="paleturquoise" stroke="none" points="2102.5,-1536.5 2102.5,-1600.5 2204.5,-1600.5 2204.5,-1536.5 2102.5,-1536.5"/> -<text text-anchor="start" x="2113" y="-1582.5" font-family="Times,serif" font-size="20.00">mpeg_pes</text> -<polygon fill="lightgrey" stroke="none" points="2102.5,-1555.5 2102.5,-1574.5 2204.5,-1574.5 2204.5,-1555.5 2102.5,-1555.5"/> -<text text-anchor="start" x="2104.5" y="-1561.3" font-family="Times,serif" font-size="14.00">mpeg_pes_packet</text> -<polygon fill="lightgrey" stroke="none" points="2102.5,-1536.5 2102.5,-1555.5 2204.5,-1555.5 2204.5,-1536.5 2102.5,-1536.5"/> -<text text-anchor="start" x="2104.5" y="-1542.3" font-family="Times,serif" font-size="14.00">mpeg_spu</text> +<polygon fill="paleturquoise" stroke="transparent" points="2445.5,-1536.5 2445.5,-1600.5 2575.5,-1600.5 2575.5,-1536.5 2445.5,-1536.5"/> +<text text-anchor="start" x="2459.5" y="-1582.5" font-family="Times,serif" font-size="20.00">mpeg_pes</text> +<polygon fill="lightgrey" stroke="transparent" points="2445.5,-1555.5 2445.5,-1574.5 2575.5,-1574.5 2575.5,-1555.5 2445.5,-1555.5"/> +<text text-anchor="start" x="2447.5" y="-1561.3" font-family="Times,serif" font-size="14.00">mpeg_pes_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="2445.5,-1536.5 2445.5,-1555.5 2575.5,-1555.5 2575.5,-1536.5 2445.5,-1536.5"/> +<text text-anchor="start" x="2447.5" y="-1542.3" font-family="Times,serif" font-size="14.00">mpeg_spu</text> </g> <!-- mpeg_pes&#45;&gt;mpeg_pes_packet --> <g id="edge93" class="edge"> <title>mpeg_pes:e&#45;&gt;mpeg_pes_packet:n</title> -<path fill="none" stroke="#8a3d8b" stroke-width="2" d="M2205.5,-1564.5C2305.63,-1564.5 2192.56,-738.56 2260.5,-665 2353.34,-564.48 2856.53,-707.59 2888.87,-588.76"/> -<polygon fill="#8a3d8b" stroke="#8a3d8b" stroke-width="2" points="2892.32,-589.37 2890.12,-579 2885.38,-588.48 2892.32,-589.37"/> +<path fill="none" stroke="#8a3d8b" stroke-width="2" d="M2576.5,-1564.5C2676.61,-1564.5 2559.71,-737.73 2628.5,-665 2743.98,-542.89 3369.1,-739.23 3394.69,-586.08"/> +<polygon fill="#8a3d8b" stroke="#8a3d8b" stroke-width="2" points="3398.19,-586.25 3395.5,-576 3391.21,-585.69 3398.19,-586.25"/> </g> <!-- mpeg_pes&#45;&gt;mpeg_spu --> <g id="edge94" class="edge"> <title>mpeg_pes:e&#45;&gt;mpeg_spu:n</title> -<path fill="none" stroke="#8a3d8b" stroke-width="2" d="M2205.5,-1545.5C2319.49,-1545.5 2179.36,-1410.57 2169.09,-1294.92"/> -<polygon fill="#8a3d8b" stroke="#8a3d8b" stroke-width="2" points="2172.59,-1294.85 2168.64,-1285.02 2165.6,-1295.17 2172.59,-1294.85"/> +<path fill="none" stroke="#8a3d8b" stroke-width="2" d="M2576.5,-1545.5C2692.41,-1545.5 2534.91,-1409.34 2525.9,-1292.19"/> +<polygon fill="#8a3d8b" stroke="#8a3d8b" stroke-width="2" points="2529.39,-1291.86 2525.5,-1282 2522.39,-1292.13 2529.39,-1291.86"/> </g> <!-- ogg&#45;&gt;flac_frame --> <g id="edge99" class="edge"> <title>ogg:e&#45;&gt;flac_frame:n</title> -<path fill="none" stroke="#709681" stroke-width="2" d="M1804.5,-858C1891.77,-858 1545.05,-693.29 1462.5,-665 1365.77,-631.85 1021.18,-678.5 992.42,-588.62"/> -<polygon fill="#709681" stroke="#709681" stroke-width="2" points="995.91,-588.35 990.95,-578.99 988.99,-589.4 995.91,-588.35"/> +<path fill="none" stroke="#709681" stroke-width="2" d="M2117.5,-858C2210.63,-858 1834.57,-692.19 1745.5,-665 1623.58,-627.79 1187.28,-702.75 1163.51,-586.28"/> +<polygon fill="#709681" stroke="#709681" stroke-width="2" points="1166.96,-585.61 1162.5,-576 1159.99,-586.29 1166.96,-585.61"/> </g> <!-- ogg&#45;&gt;flac_metadatablock --> <g id="edge98" class="edge"> <title>ogg:e&#45;&gt;flac_metadatablock:n</title> -<path fill="none" stroke="#709681" stroke-width="2" d="M1804.5,-877C1818.51,-877 1809.68,-858.07 1803.5,-845.5 1798.63,-835.59 1502.15,-602.49 1496.5,-593 1465.41,-540.82 1467.95,-517.47 1468.44,-461.8"/> -<polygon fill="#709681" stroke="#709681" stroke-width="2" points="1471.94,-462.04 1468.49,-452.03 1464.94,-462.01 1471.94,-462.04"/> +<path fill="none" stroke="#709681" stroke-width="2" d="M2117.5,-877C2131.51,-877 2123.09,-857.86 2116.5,-845.5 2051.89,-724.23 1978.12,-743.72 1865.5,-665 1818.82,-632.37 1791.49,-640.12 1759.5,-593 1724.62,-541.62 1727.11,-517.2 1727.47,-459.04"/> +<polygon fill="#709681" stroke="#709681" stroke-width="2" points="1730.97,-459.01 1727.5,-449 1723.97,-458.99 1730.97,-459.01"/> </g> <!-- ogg&#45;&gt;opus_packet --> <g id="edge97" class="edge"> <title>ogg:e&#45;&gt;opus_packet:n</title> -<path fill="none" stroke="#709681" stroke-width="2" d="M1804.5,-896C1826.95,-896 1807.42,-867.6 1803.5,-845.5 1782.8,-728.85 1718.39,-708.32 1713.76,-596.92"/> -<polygon fill="#709681" stroke="#709681" stroke-width="2" points="1717.26,-596.95 1713.56,-587.03 1710.27,-597.1 1717.26,-596.95"/> +<path fill="none" stroke="#709681" stroke-width="2" d="M2117.5,-896C2139.95,-896 2121.03,-867.49 2116.5,-845.5 2091.97,-726.42 2014.88,-710.79 2010.68,-595.01"/> +<polygon fill="#709681" stroke="#709681" stroke-width="2" points="2014.18,-594.94 2010.5,-585 2007.18,-595.06 2014.18,-594.94"/> </g> <!-- ogg&#45;&gt;vorbis_packet --> <g id="edge96" class="edge"> <title>ogg:e&#45;&gt;vorbis_packet:n</title> -<path fill="none" stroke="#709681" stroke-width="2" d="M1804.5,-916C1892.29,-916 1790.54,-606.49 1810.5,-521 1819.56,-482.21 1846.82,-476.03 1852.47,-443.29"/> -<polygon fill="#709681" stroke="#709681" stroke-width="2" points="1855.94,-443.77 1853.26,-433.52 1848.96,-443.2 1855.94,-443.77"/> +<path fill="none" stroke="#709681" stroke-width="2" d="M2117.5,-916C2205.28,-916 2096.18,-605.05 2121.5,-521 2134.1,-479.16 2172.76,-478.68 2178.72,-441.73"/> +<polygon fill="#709681" stroke="#709681" stroke-width="2" points="2182.23,-441.74 2179.5,-431.5 2175.25,-441.21 2182.23,-441.74"/> </g> <!-- ogg_page --> <g id="node74" class="node"> <title>ogg_page</title> -<polygon fill="paleturquoise" stroke="none" points="1826,-544 1826,-570 1907,-570 1907,-544 1826,-544"/> -<text text-anchor="start" x="1828.5" y="-552" font-family="Times,serif" font-size="20.00">ogg_page</text> +<polygon fill="paleturquoise" stroke="transparent" points="2137,-544 2137,-570 2238,-570 2238,-544 2137,-544"/> +<text text-anchor="start" x="2139.5" y="-552" font-family="Times,serif" font-size="20.00">ogg_page</text> </g> <!-- ogg&#45;&gt;ogg_page --> <g id="edge95" class="edge"> <title>ogg:e&#45;&gt;ogg_page:n</title> -<path fill="none" stroke="#709681" stroke-width="2" d="M1804.5,-935C1865.36,-935 1840,-724.95 1850.5,-665 1856.62,-630.05 1864.4,-618.77 1866.14,-588.95"/> -<polygon fill="#709681" stroke="#709681" stroke-width="2" points="1869.64,-589.12 1866.42,-579.03 1862.64,-588.93 1869.64,-589.12"/> +<path fill="none" stroke="#709681" stroke-width="2" d="M2117.5,-935C2178.36,-935 2150.45,-724.45 2163.5,-665 2171.49,-628.58 2184.82,-618.67 2187.15,-586.29"/> +<polygon fill="#709681" stroke="#709681" stroke-width="2" points="2190.66,-586.11 2187.5,-576 2183.66,-585.87 2190.66,-586.11"/> </g> <!-- pcap&#45;&gt;ipv4_packet --> <g id="edge103" class="edge"> <title>pcap:e&#45;&gt;ipv4_packet:n</title> -<path fill="none" stroke="#4c9a9c" stroke-width="2" d="M3370.5,-1869.5C3385.82,-1869.5 3376.63,-1851.14 3384.5,-1838 3405.33,-1803.22 3424.73,-1803.34 3440.5,-1766 3631.66,-1313.45 3480.88,-1152.88 3538.5,-665 3542.24,-633.33 3550.85,-623.15 3553,-596.86"/> -<polygon fill="#4c9a9c" stroke="#4c9a9c" stroke-width="2" points="3556.49,-597.15 3553.38,-587.02 3549.5,-596.88 3556.49,-597.15"/> +<path fill="none" stroke="#4c9a9c" stroke-width="2" d="M3898.5,-1869.5C3913.82,-1869.5 3903.87,-1850.66 3912.5,-1838 3937.81,-1800.87 3962.9,-1805.94 3983.5,-1766 4096.25,-1547.36 4072.34,-909.6 4098.5,-665 4101.94,-632.82 4109.69,-622.96 4111.23,-595.17"/> +<polygon fill="#4c9a9c" stroke="#4c9a9c" stroke-width="2" points="4114.73,-595.09 4111.5,-585 4107.74,-594.9 4114.73,-595.09"/> </g> <!-- link_frame --> <g id="node76" class="node"> <title>link_frame</title> -<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M3710,-1550.5C3710,-1550.5 3813,-1550.5 3813,-1550.5 3819,-1550.5 3825,-1556.5 3825,-1562.5 3825,-1562.5 3825,-1574.5 3825,-1574.5 3825,-1580.5 3819,-1586.5 3813,-1586.5 3813,-1586.5 3710,-1586.5 3710,-1586.5 3704,-1586.5 3698,-1580.5 3698,-1574.5 3698,-1574.5 3698,-1562.5 3698,-1562.5 3698,-1556.5 3704,-1550.5 3710,-1550.5"/> -<text text-anchor="middle" x="3761.5" y="-1562.5" font-family="Times,serif" font-size="25.00">link_frame</text> +<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M4226.5,-1550.5C4226.5,-1550.5 4354.5,-1550.5 4354.5,-1550.5 4360.5,-1550.5 4366.5,-1556.5 4366.5,-1562.5 4366.5,-1562.5 4366.5,-1574.5 4366.5,-1574.5 4366.5,-1580.5 4360.5,-1586.5 4354.5,-1586.5 4354.5,-1586.5 4226.5,-1586.5 4226.5,-1586.5 4220.5,-1586.5 4214.5,-1580.5 4214.5,-1574.5 4214.5,-1574.5 4214.5,-1562.5 4214.5,-1562.5 4214.5,-1556.5 4220.5,-1550.5 4226.5,-1550.5"/> +<text text-anchor="middle" x="4290.5" y="-1562.5" font-family="Times,serif" font-size="25.00">link_frame</text> </g> <!-- pcap&#45;&gt;link_frame --> <g id="edge101" class="edge"> <title>pcap:e&#45;&gt;link_frame:n</title> -<path fill="none" stroke="#4c9a9c" stroke-width="2" d="M3370.5,-1908.5C3402.45,-1908.5 3364.89,-1863.22 3384.5,-1838 3430.14,-1779.31 3472.38,-1805.29 3535.5,-1766 3640.35,-1700.74 3753.26,-1714.4 3761.07,-1600.47"/> -<polygon fill="#4c9a9c" stroke="#4c9a9c" stroke-width="2" points="3764.57,-1600.64 3761.4,-1590.53 3757.57,-1600.4 3764.57,-1600.64"/> +<path fill="none" stroke="#4c9a9c" stroke-width="2" d="M3898.5,-1908.5C3930.45,-1908.5 3892.09,-1862.57 3912.5,-1838 3967.56,-1771.72 4019.36,-1811.55 4092.5,-1766 4190.12,-1705.19 4284.79,-1705.88 4290.25,-1597.61"/> +<polygon fill="#4c9a9c" stroke="#4c9a9c" stroke-width="2" points="4293.75,-1597.58 4290.5,-1587.5 4286.76,-1597.41 4293.75,-1597.58"/> </g> <!-- tcp_stream --> <g id="node77" class="node"> <title>tcp_stream</title> -<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M3318,-1550.5C3318,-1550.5 3421,-1550.5 3421,-1550.5 3427,-1550.5 3433,-1556.5 3433,-1562.5 3433,-1562.5 3433,-1574.5 3433,-1574.5 3433,-1580.5 3427,-1586.5 3421,-1586.5 3421,-1586.5 3318,-1586.5 3318,-1586.5 3312,-1586.5 3306,-1580.5 3306,-1574.5 3306,-1574.5 3306,-1562.5 3306,-1562.5 3306,-1556.5 3312,-1550.5 3318,-1550.5"/> -<text text-anchor="middle" x="3369.5" y="-1562.5" font-family="Times,serif" font-size="25.00">tcp_stream</text> +<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M3830.5,-1550.5C3830.5,-1550.5 3964.5,-1550.5 3964.5,-1550.5 3970.5,-1550.5 3976.5,-1556.5 3976.5,-1562.5 3976.5,-1562.5 3976.5,-1574.5 3976.5,-1574.5 3976.5,-1580.5 3970.5,-1586.5 3964.5,-1586.5 3964.5,-1586.5 3830.5,-1586.5 3830.5,-1586.5 3824.5,-1586.5 3818.5,-1580.5 3818.5,-1574.5 3818.5,-1574.5 3818.5,-1562.5 3818.5,-1562.5 3818.5,-1556.5 3824.5,-1550.5 3830.5,-1550.5"/> +<text text-anchor="middle" x="3897.5" y="-1562.5" font-family="Times,serif" font-size="25.00">tcp_stream</text> </g> <!-- pcap&#45;&gt;tcp_stream --> <g id="edge102" class="edge"> <title>pcap:e&#45;&gt;tcp_stream:n</title> -<path fill="none" stroke="#4c9a9c" stroke-width="2" d="M3370.5,-1888.5C3385.52,-1888.5 3372.74,-1659.03 3369.99,-1600.3"/> -<polygon fill="#4c9a9c" stroke="#4c9a9c" stroke-width="2" points="3373.5,-1600.38 3369.62,-1590.52 3366.5,-1600.65 3373.5,-1600.38"/> +<path fill="none" stroke="#4c9a9c" stroke-width="2" d="M3898.5,-1888.5C3913.75,-1888.5 3900.35,-1652 3897.88,-1597.73"/> +<polygon fill="#4c9a9c" stroke="#4c9a9c" stroke-width="2" points="3901.36,-1597.37 3897.5,-1587.5 3894.37,-1597.62 3901.36,-1597.37"/> </g> <!-- link_frame&#45;&gt;bsd_loopback_frame --> <g id="edge133" class="edge"> <title>link_frame&#45;&gt;bsd_loopback_frame:n</title> -<path fill="none" stroke="#ab3daa" stroke-width="2" d="M3751.83,-1550.67C3729.18,-1509.69 3674.26,-1400.6 3669.79,-1298.99"/> -<polygon fill="#ab3daa" stroke="#ab3daa" stroke-width="2" points="3673.29,-1298.95 3669.57,-1289.03 3666.29,-1299.1 3673.29,-1298.95"/> +<path fill="none" stroke="#ab3daa" stroke-width="2" d="M4300.67,-1550.4C4324.38,-1508.88 4381.65,-1398.64 4385.32,-1296.2"/> +<polygon fill="#ab3daa" stroke="#ab3daa" stroke-width="2" points="4388.82,-1296.06 4385.5,-1286 4381.82,-1295.93 4388.82,-1296.06"/> </g> <!-- link_frame&#45;&gt;ether8023_frame --> <g id="edge138" class="edge"> <title>link_frame&#45;&gt;ether8023_frame:n</title> -<path fill="none" stroke="#ab3daa" stroke-width="2" d="M3771.28,-1550.69C3794.17,-1509.73 3849.69,-1400.71 3854.21,-1299"/> -<polygon fill="#ab3daa" stroke="#ab3daa" stroke-width="2" points="3857.71,-1299.1 3854.43,-1289.03 3850.71,-1298.94 3857.71,-1299.1"/> +<path fill="none" stroke="#ab3daa" stroke-width="2" d="M4339.95,-1550.47C4427.8,-1516.8 4602.69,-1432.92 4611.18,-1296.35"/> +<polygon fill="#ab3daa" stroke="#ab3daa" stroke-width="2" points="4614.69,-1296.1 4611.5,-1286 4607.69,-1295.89 4614.69,-1296.1"/> </g> <!-- link_frame&#45;&gt;ipv4_packet --> <g id="edge146" class="edge"> <title>link_frame&#45;&gt;ipv4_packet:n</title> -<path fill="none" stroke="#ab3daa" stroke-width="2" d="M3743.75,-1550.78C3703.47,-1511.49 3605.82,-1408.31 3569.5,-1299 3520.41,-1151.27 3552.73,-760.73 3554.43,-592.9"/> -<polygon fill="#ab3daa" stroke="#ab3daa" stroke-width="2" points="3557.93,-593.05 3554.48,-583.03 3550.93,-593.01 3557.93,-593.05"/> +<path fill="none" stroke="#ab3daa" stroke-width="2" d="M4275.41,-1550.22C4241.18,-1509.73 4158.2,-1404.22 4127.5,-1299 4083.65,-1148.73 4110.35,-756.35 4111.46,-590.14"/> +<polygon fill="#ab3daa" stroke="#ab3daa" stroke-width="2" points="4114.96,-590.01 4111.5,-580 4107.96,-589.99 4114.96,-590.01"/> </g> <!-- link_frame&#45;&gt;ipv6_packet --> <g id="edge148" class="edge"> <title>link_frame&#45;&gt;ipv6_packet:n</title> -<path fill="none" stroke="#ab3daa" stroke-width="2" d="M3818.35,-1550.52C3913.08,-1518.78 4100.4,-1440.53 4177.5,-1299 4265.18,-1138.05 4468.42,-1500.51 3998.5,-665 3976.25,-625.44 3933.55,-628.91 3925.74,-592.63"/> -<polygon fill="#ab3daa" stroke="#ab3daa" stroke-width="2" points="3929.26,-592.62 3924.8,-583.01 3922.29,-593.31 3929.26,-592.62"/> +<path fill="none" stroke="#ab3daa" stroke-width="2" d="M4366.72,-1557.84C4495.96,-1536.9 4754.89,-1474.16 4866.5,-1299 4926.25,-1205.22 4905.89,-1102.43 4580.5,-665 4550.02,-624.03 4498.88,-633.15 4492.22,-590.03"/> +<polygon fill="#ab3daa" stroke="#ab3daa" stroke-width="2" points="4495.71,-589.72 4491.5,-580 4488.73,-590.23 4495.71,-589.72"/> </g> <!-- sll2_packet --> <g id="node82" class="node"> <title>sll2_packet</title> -<polygon fill="paleturquoise" stroke="none" points="3954.5,-1240.5 3954.5,-1285.5 4048.5,-1285.5 4048.5,-1240.5 3954.5,-1240.5"/> -<text text-anchor="start" x="3956.5" y="-1267" font-family="Times,serif" font-size="20.00">sll2_packet</text> -<polygon fill="lightgrey" stroke="none" points="3954.5,-1240 3954.5,-1259 4048.5,-1259 4048.5,-1240 3954.5,-1240"/> -<text text-anchor="start" x="3956.5" y="-1245.8" font-family="Times,serif" font-size="14.00">inet_packet</text> +<polygon fill="paleturquoise" stroke="transparent" points="4732,-1240.5 4732,-1285.5 4851,-1285.5 4851,-1240.5 4732,-1240.5"/> +<text text-anchor="start" x="4734.5" y="-1267" font-family="Times,serif" font-size="20.00">sll2_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="4732.5,-1240 4732.5,-1259 4851.5,-1259 4851.5,-1240 4732.5,-1240"/> +<text text-anchor="start" x="4734.5" y="-1245.8" font-family="Times,serif" font-size="14.00">inet_packet</text> </g> <!-- link_frame&#45;&gt;sll2_packet --> <g id="edge168" class="edge"> <title>link_frame&#45;&gt;sll2_packet:n</title> -<path fill="none" stroke="#ab3daa" stroke-width="2" d="M3792.38,-1550.57C3854.99,-1513.81 3991.73,-1420.18 4001,-1298.97"/> -<polygon fill="#ab3daa" stroke="#ab3daa" stroke-width="2" points="4004.5,-1299.15 4001.38,-1289.02 3997.5,-1298.88 4004.5,-1299.15"/> +<path fill="none" stroke="#ab3daa" stroke-width="2" d="M4366.74,-1559.78C4504.71,-1541.25 4782.51,-1481.01 4792.24,-1296.05"/> +<polygon fill="#ab3daa" stroke="#ab3daa" stroke-width="2" points="4795.74,-1296.09 4792.5,-1286 4788.74,-1295.91 4795.74,-1296.09"/> </g> <!-- sll_packet --> <g id="node83" class="node"> <title>sll_packet</title> -<polygon fill="paleturquoise" stroke="none" points="4078.5,-1240.5 4078.5,-1285.5 4162.5,-1285.5 4162.5,-1240.5 4078.5,-1240.5"/> -<text text-anchor="start" x="4080.5" y="-1267" font-family="Times,serif" font-size="20.00">sll_packet</text> -<polygon fill="lightgrey" stroke="none" points="4078.5,-1240 4078.5,-1259 4162.5,-1259 4162.5,-1240 4078.5,-1240"/> -<text text-anchor="start" x="4080.5" y="-1245.8" font-family="Times,serif" font-size="14.00">inet_packet</text> +<polygon fill="paleturquoise" stroke="transparent" points="4142,-1240.5 4142,-1285.5 4249,-1285.5 4249,-1240.5 4142,-1240.5"/> +<text text-anchor="start" x="4144.5" y="-1267" font-family="Times,serif" font-size="20.00">sll_packet</text> +<polygon fill="lightgrey" stroke="transparent" points="4142.5,-1240 4142.5,-1259 4249.5,-1259 4249.5,-1240 4142.5,-1240"/> +<text text-anchor="start" x="4144.5" y="-1245.8" font-family="Times,serif" font-size="14.00">inet_packet</text> </g> <!-- link_frame&#45;&gt;sll_packet --> <g id="edge169" class="edge"> <title>link_frame&#45;&gt;sll_packet:n</title> -<path fill="none" stroke="#ab3daa" stroke-width="2" d="M3822.4,-1550.51C3921.82,-1518.75 4109.11,-1440.46 4120,-1298.98"/> -<polygon fill="#ab3daa" stroke="#ab3daa" stroke-width="2" points="4123.5,-1299.15 4120.38,-1289.02 4116.5,-1298.88 4123.5,-1299.15"/> +<path fill="none" stroke="#ab3daa" stroke-width="2" d="M4280.44,-1550.38C4256.97,-1508.84 4200.31,-1398.53 4196.68,-1296.19"/> +<polygon fill="#ab3daa" stroke="#ab3daa" stroke-width="2" points="4200.18,-1295.94 4196.5,-1286 4193.18,-1296.06 4200.18,-1295.94"/> </g> <!-- rtmp --> <g id="node80" class="node"> <title>rtmp</title> -<polygon fill="paleturquoise" stroke="none" points="3253,-1231 3253,-1295 3312,-1295 3312,-1231 3253,-1231"/> -<text text-anchor="start" x="3264" y="-1277" font-family="Times,serif" font-size="20.00">rtmp</text> -<polygon fill="lightgrey" stroke="none" points="3253.5,-1250 3253.5,-1269 3312.5,-1269 3312.5,-1250 3253.5,-1250"/> -<text text-anchor="start" x="3255.5" y="-1255.8" font-family="Times,serif" font-size="14.00">amf0</text> -<polygon fill="lightgrey" stroke="none" points="3253.5,-1231 3253.5,-1250 3312.5,-1250 3312.5,-1231 3253.5,-1231"/> -<text text-anchor="start" x="3255.5" y="-1236.8" font-family="Times,serif" font-size="14.00">mpeg_asc</text> +<polygon fill="paleturquoise" stroke="transparent" points="3763.5,-1231 3763.5,-1295 3837.5,-1295 3837.5,-1231 3763.5,-1231"/> +<text text-anchor="start" x="3775.5" y="-1277" font-family="Times,serif" font-size="20.00">rtmp</text> +<polygon fill="lightgrey" stroke="transparent" points="3763.5,-1250 3763.5,-1269 3837.5,-1269 3837.5,-1250 3763.5,-1250"/> +<text text-anchor="start" x="3765.5" y="-1255.8" font-family="Times,serif" font-size="14.00">amf0</text> +<polygon fill="lightgrey" stroke="transparent" points="3763.5,-1231 3763.5,-1250 3837.5,-1250 3837.5,-1231 3763.5,-1231"/> +<text text-anchor="start" x="3765.5" y="-1236.8" font-family="Times,serif" font-size="14.00">mpeg_asc</text> </g> <!-- tcp_stream&#45;&gt;rtmp --> <g id="edge167" class="edge"> <title>tcp_stream&#45;&gt;rtmp:n</title> -<path fill="none" stroke="#536f9d" stroke-width="2" d="M3360.13,-1550.62C3338.78,-1510.59 3288.01,-1405.92 3283.78,-1308.73"/> -<polygon fill="#536f9d" stroke="#536f9d" stroke-width="2" points="3287.29,-1308.95 3283.57,-1299.03 3280.29,-1309.1 3287.29,-1308.95"/> +<path fill="none" stroke="#536f9d" stroke-width="2" d="M3886.75,-1550.47C3862.33,-1510.18 3804.51,-1404.92 3800.7,-1306.15"/> +<polygon fill="#536f9d" stroke="#536f9d" stroke-width="2" points="3804.19,-1305.93 3800.5,-1296 3797.2,-1306.07 3804.19,-1305.93"/> </g> <!-- tls --> <g id="node86" class="node"> <title>tls</title> -<polygon fill="paleturquoise" stroke="none" points="3437,-1240.5 3437,-1285.5 3490,-1285.5 3490,-1240.5 3437,-1240.5"/> -<text text-anchor="start" x="3454.5" y="-1267" font-family="Times,serif" font-size="20.00">tls</text> -<polygon fill="lightgrey" stroke="none" points="3437.5,-1240 3437.5,-1259 3490.5,-1259 3490.5,-1240 3437.5,-1240"/> -<text text-anchor="start" x="3439.5" y="-1245.8" font-family="Times,serif" font-size="14.00">asn1_ber</text> +<polygon fill="paleturquoise" stroke="transparent" points="3981,-1240.5 3981,-1285.5 4050,-1285.5 4050,-1240.5 3981,-1240.5"/> +<text text-anchor="start" x="4003" y="-1267" font-family="Times,serif" font-size="20.00">tls</text> +<polygon fill="lightgrey" stroke="transparent" points="3981.5,-1240 3981.5,-1259 4050.5,-1259 4050.5,-1240 3981.5,-1240"/> +<text text-anchor="start" x="3983.5" y="-1245.8" font-family="Times,serif" font-size="14.00">asn1_ber</text> </g> <!-- tcp_stream&#45;&gt;tls --> <g id="edge174" class="edge"> <title>tcp_stream&#45;&gt;tls:n</title> -<path fill="none" stroke="#536f9d" stroke-width="2" d="M3379.49,-1550.71C3402.9,-1509.78 3459.7,-1400.7 3464.21,-1298.72"/> -<polygon fill="#536f9d" stroke="#536f9d" stroke-width="2" points="3467.71,-1299.1 3464.43,-1289.03 3460.71,-1298.95 3467.71,-1299.1"/> +<path fill="none" stroke="#536f9d" stroke-width="2" d="M3910.46,-1550.46C3940.34,-1509.49 4011.84,-1401.04 4016.28,-1296.14"/> +<polygon fill="#536f9d" stroke="#536f9d" stroke-width="2" points="4019.79,-1296.07 4016.5,-1286 4012.79,-1295.92 4019.79,-1296.07"/> </g> <!-- dns_tcp --> <g id="node98" class="node"> <title>dns_tcp</title> -<polygon fill="paleturquoise" stroke="none" points="3342,-1250 3342,-1276 3407,-1276 3407,-1250 3342,-1250"/> -<text text-anchor="start" x="3344.5" y="-1258" font-family="Times,serif" font-size="20.00">dns_tcp</text> +<polygon fill="paleturquoise" stroke="transparent" points="3868,-1250 3868,-1276 3951,-1276 3951,-1250 3868,-1250"/> +<text text-anchor="start" x="3870.5" y="-1258" font-family="Times,serif" font-size="20.00">dns_tcp</text> </g> <!-- tcp_stream&#45;&gt;dns_tcp --> <g id="edge136" class="edge"> <title>tcp_stream&#45;&gt;dns_tcp:n</title> -<path fill="none" stroke="#536f9d" stroke-width="2" d="M3370.09,-1550.8C3371.53,-1508.13 3375.18,-1391.3 3375.48,-1289.92"/> -<polygon fill="#536f9d" stroke="#536f9d" stroke-width="2" points="3378.98,-1290.03 3375.5,-1280.03 3371.98,-1290.02 3378.98,-1290.03"/> +<path fill="none" stroke="#536f9d" stroke-width="2" d="M3898.79,-1550.49C3901.98,-1507.17 3909.96,-1388.95 3910.47,-1287.12"/> +<polygon fill="#536f9d" stroke="#536f9d" stroke-width="2" points="3913.97,-1287.01 3910.5,-1277 3906.97,-1286.99 3913.97,-1287.01"/> </g> <!-- pcapng&#45;&gt;ipv4_packet --> <g id="edge106" class="edge"> <title>pcapng:e&#45;&gt;ipv4_packet:n</title> -<path fill="none" stroke="#53b374" stroke-width="2" d="M2714.5,-1869.5C2729.82,-1869.5 2717.74,-1848.91 2728.5,-1838 2782.11,-1783.62 2828.76,-1818.19 2884.5,-1766 3108.12,-1556.62 3102.52,-1444.22 3203.5,-1155 3277.55,-942.91 3176.48,-831.31 3327.5,-665 3396.08,-589.48 3540.1,-681.85 3552.63,-596.88"/> -<polygon fill="#53b374" stroke="#53b374" stroke-width="2" points="3556.11,-597.23 3553.3,-587.02 3549.13,-596.76 3556.11,-597.23"/> +<path fill="none" stroke="#53b374" stroke-width="2" d="M3152.5,-1869.5C3167.82,-1869.5 3155.52,-1848.68 3166.5,-1838 3226.79,-1779.37 3276.78,-1819.72 3341.5,-1766 3586.67,-1562.5 3602.12,-1452.38 3716.5,-1155 3797.64,-944.06 3695.01,-827.1 3852.5,-665 3933.91,-581.21 4100.98,-697.99 4111.03,-595.27"/> +<polygon fill="#53b374" stroke="#53b374" stroke-width="2" points="4114.54,-595.15 4111.5,-585 4107.54,-594.83 4114.54,-595.15"/> </g> <!-- pcapng&#45;&gt;link_frame --> <g id="edge104" class="edge"> <title>pcapng:e&#45;&gt;link_frame:n</title> -<path fill="none" stroke="#53b374" stroke-width="2" d="M2714.5,-1908.5C2746.45,-1908.5 2704.86,-1859.49 2728.5,-1838 2846.18,-1731.03 3288.77,-1813.62 3440.5,-1766 3591.99,-1718.45 3752.47,-1748.96 3761.13,-1600.45"/> -<polygon fill="#53b374" stroke="#53b374" stroke-width="2" points="3764.63,-1600.62 3761.41,-1590.53 3757.63,-1600.42 3764.63,-1600.62"/> +<path fill="none" stroke="#53b374" stroke-width="2" d="M3152.5,-1908.5C3184.45,-1908.5 3142.72,-1859.33 3166.5,-1838 3302.15,-1716.28 3809.78,-1821.13 3983.5,-1766 4130.56,-1719.33 4283.47,-1744.15 4290.26,-1597.86"/> +<polygon fill="#53b374" stroke="#53b374" stroke-width="2" points="4293.77,-1597.58 4290.5,-1587.5 4286.77,-1597.42 4293.77,-1597.58"/> </g> <!-- pcapng&#45;&gt;tcp_stream --> <g id="edge105" class="edge"> <title>pcapng:e&#45;&gt;tcp_stream:n</title> -<path fill="none" stroke="#53b374" stroke-width="2" d="M2714.5,-1888.5C2737.79,-1888.5 2711,-1853.38 2728.5,-1838 2898.8,-1688.34 3037.97,-1880.74 3233.5,-1766 3315.66,-1717.79 3364.94,-1689.82 3369.2,-1600.52"/> -<polygon fill="#53b374" stroke="#53b374" stroke-width="2" points="3372.7,-1600.6 3369.43,-1590.53 3365.7,-1600.44 3372.7,-1600.6"/> +<path fill="none" stroke="#53b374" stroke-width="2" d="M3152.5,-1888.5C3175.79,-1888.5 3148.87,-1853.22 3166.5,-1838 3362.46,-1668.84 3516.46,-1888.53 3744.5,-1766 3833.49,-1718.19 3893.42,-1693.65 3897.3,-1597.65"/> +<polygon fill="#53b374" stroke="#53b374" stroke-width="2" points="3900.8,-1597.57 3897.5,-1587.5 3893.8,-1597.43 3900.8,-1597.57"/> </g> <!-- rtmp&#45;&gt;mpeg_asc --> <g id="edge111" class="edge"> <title>rtmp:e&#45;&gt;mpeg_asc:n</title> -<path fill="none" stroke="#96843c" stroke-width="2" d="M3313.5,-1240C3353.63,-1240 3271.18,-550.98 3244.5,-521 3109.33,-369.13 2801.12,-619.1 2787.94,-435.25"/> -<polygon fill="#96843c" stroke="#96843c" stroke-width="2" points="2791.44,-435.4 2787.6,-425.53 2784.45,-435.64 2791.44,-435.4"/> +<path fill="none" stroke="#96843c" stroke-width="2" d="M3838.5,-1240C3858.49,-1240 3821.61,-536.09 3808.5,-521 3652.27,-341.15 3284.48,-654.84 3273.74,-432.76"/> +<polygon fill="#96843c" stroke="#96843c" stroke-width="2" points="3277.23,-432.42 3273.5,-422.5 3270.24,-432.58 3277.23,-432.42"/> </g> <!-- amf0 --> <g id="node81" class="node"> <title>amf0</title> -<polygon fill="paleturquoise" stroke="none" points="3342.5,-897 3342.5,-923 3388.5,-923 3388.5,-897 3342.5,-897"/> -<text text-anchor="start" x="3344.5" y="-905" font-family="Times,serif" font-size="20.00">amf0</text> +<polygon fill="paleturquoise" stroke="transparent" points="3867.5,-897 3867.5,-923 3923.5,-923 3923.5,-897 3867.5,-897"/> +<text text-anchor="start" x="3869.5" y="-905" font-family="Times,serif" font-size="20.00">amf0</text> </g> <!-- rtmp&#45;&gt;amf0 --> <g id="edge110" class="edge"> <title>rtmp:e&#45;&gt;amf0:n</title> -<path fill="none" stroke="#96843c" stroke-width="2" d="M3313.5,-1259C3330.28,-1259 3359.24,-1004.32 3364.62,-941.85"/> -<polygon fill="#96843c" stroke="#96843c" stroke-width="2" points="3368.11,-942.24 3365.29,-932.02 3361.12,-941.76 3368.11,-942.24"/> +<path fill="none" stroke="#96843c" stroke-width="2" d="M3838.5,-1259C3855.58,-1259 3889.33,-996.6 3894.76,-939.16"/> +<polygon fill="#96843c" stroke="#96843c" stroke-width="2" points="3898.26,-939.23 3895.5,-929 3891.28,-938.72 3898.26,-939.23"/> </g> <!-- sll2_packet&#45;&gt;inet_packet --> <g id="edge112" class="edge"> <title>sll2_packet:e&#45;&gt;inet_packet:n</title> -<path fill="none" stroke="#88589a" stroke-width="2" d="M4049.5,-1249C4084.76,-1249 3948.19,-1008.47 3927.18,-941.73"/> -<polygon fill="#88589a" stroke="#88589a" stroke-width="2" points="3930.61,-941.03 3925.12,-931.96 3923.76,-942.47 3930.61,-941.03"/> +<path fill="none" stroke="#88589a" stroke-width="2" d="M4852.5,-1249C4956.46,-1249 4519.32,-1048.89 4492.76,-939.02"/> +<polygon fill="#88589a" stroke="#88589a" stroke-width="2" points="4496.22,-938.49 4491.5,-929 4489.27,-939.36 4496.22,-938.49"/> </g> <!-- sll_packet&#45;&gt;inet_packet --> <g id="edge113" class="edge"> <title>sll_packet:e&#45;&gt;inet_packet:n</title> -<path fill="none" stroke="#b95b72" stroke-width="2" d="M4163.5,-1249C4248.27,-1249 3953.11,-1038.06 3926.42,-941.79"/> -<polygon fill="#b95b72" stroke="#b95b72" stroke-width="2" points="3929.89,-941.36 3924.95,-931.99 3922.97,-942.4 3929.89,-941.36"/> +<path fill="none" stroke="#b95b72" stroke-width="2" d="M4250.5,-1249C4262.09,-1249 4257.87,-1236.51 4264.5,-1227 4357.77,-1093.23 4486.11,-1095.35 4491.34,-939.03"/> +<polygon fill="#b95b72" stroke="#b95b72" stroke-width="2" points="4494.84,-939.06 4491.5,-929 4487.84,-938.94 4494.84,-939.06"/> </g> <!-- tar&#45;&gt;probe --> <g id="edge114" class="edge"> <title>tar:e&#45;&gt;probe:n</title> -<path fill="none" stroke="#9791ac" stroke-width="2" d="M2509.5,-1888.5C2517.93,-1888.5 2527.97,-2030.59 2528.5,-2039 2529.52,-2055.19 2539.81,-2063.88 2528.5,-2075.5 2521.24,-2082.96 2508.35,-2087.97 2499.87,-2086.47"/> -<polygon fill="#9791ac" stroke="#9791ac" stroke-width="2" points="2502.56,-2084.23 2493.45,-2078.82 2497.19,-2088.73 2502.56,-2084.23"/> +<path fill="none" stroke="#9791ac" stroke-width="2" d="M2918.5,-1888.5C2926.94,-1888.5 2938.92,-2030.58 2939.5,-2039 2940.62,-2055.18 2950.84,-2063.9 2939.5,-2075.5 2928.57,-2086.67 2907.25,-2093.21 2898.45,-2085.99"/> +<polygon fill="#9791ac" stroke="#9791ac" stroke-width="2" points="2901.57,-2084.39 2894.5,-2076.5 2895.11,-2087.08 2901.57,-2084.39"/> </g> <!-- tiff&#45;&gt;icc_profile --> <g id="edge115" class="edge"> <title>tiff:e&#45;&gt;icc_profile:n</title> -<path fill="none" stroke="#76b1a2" stroke-width="2" d="M2488.5,-896C2499.81,-896 3238.16,-602.37 3244.5,-593 3262.43,-566.5 3261.06,-548.38 3244.5,-521 3198.06,-444.23 3069.88,-509.73 3057.47,-435.13"/> -<polygon fill="#76b1a2" stroke="#76b1a2" stroke-width="2" points="3060.99,-435.22 3056.73,-425.52 3054.01,-435.76 3060.99,-435.22"/> +<path fill="none" stroke="#76b1a2" stroke-width="2" d="M2888.5,-896C2891.86,-896 3806.53,-595.72 3808.5,-593 3900.04,-466.47 3623.58,-494.74 3597.46,-432.39"/> +<polygon fill="#76b1a2" stroke="#76b1a2" stroke-width="2" points="3600.88,-431.63 3595.5,-422.5 3594.02,-432.99 3600.88,-431.63"/> </g> <!-- asn1_ber --> <g id="node87" class="node"> <title>asn1_ber</title> -<polygon fill="paleturquoise" stroke="none" points="3418.5,-897 3418.5,-923 3494.5,-923 3494.5,-897 3418.5,-897"/> -<text text-anchor="start" x="3420.5" y="-905" font-family="Times,serif" font-size="20.00">asn1_ber</text> +<polygon fill="paleturquoise" stroke="transparent" points="3954,-897 3954,-923 4051,-923 4051,-897 3954,-897"/> +<text text-anchor="start" x="3956.5" y="-905" font-family="Times,serif" font-size="20.00">asn1_ber</text> </g> <!-- tls&#45;&gt;asn1_ber --> <g id="edge116" class="edge"> <title>tls:e&#45;&gt;asn1_ber:n</title> -<path fill="none" stroke="#6246aa" stroke-width="2" d="M3491.5,-1249C3524.47,-1249 3466.91,-1007.44 3457.71,-941.68"/> -<polygon fill="#6246aa" stroke="#6246aa" stroke-width="2" points="3461.22,-941.64 3456.79,-932.01 3454.25,-942.3 3461.22,-941.64"/> +<path fill="none" stroke="#6246aa" stroke-width="2" d="M4051.5,-1249C4085.08,-1249 4013.25,-1001.44 4003.56,-939.29"/> +<polygon fill="#6246aa" stroke="#6246aa" stroke-width="2" points="4007.01,-938.59 4002.5,-929 4000.05,-939.31 4007.01,-938.59"/> </g> <!-- udp_payload --> <g id="node89" class="node"> <title>udp_payload</title> -<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M3633.5,-116.5C3633.5,-116.5 3757.5,-116.5 3757.5,-116.5 3763.5,-116.5 3769.5,-122.5 3769.5,-128.5 3769.5,-128.5 3769.5,-140.5 3769.5,-140.5 3769.5,-146.5 3763.5,-152.5 3757.5,-152.5 3757.5,-152.5 3633.5,-152.5 3633.5,-152.5 3627.5,-152.5 3621.5,-146.5 3621.5,-140.5 3621.5,-140.5 3621.5,-128.5 3621.5,-128.5 3621.5,-122.5 3627.5,-116.5 3633.5,-116.5"/> -<text text-anchor="middle" x="3695.5" y="-128.5" font-family="Times,serif" font-size="25.00">udp_payload</text> +<path fill="palegreen" stroke="palegreen" stroke-width="2" d="M3999.5,-116.5C3999.5,-116.5 4151.5,-116.5 4151.5,-116.5 4157.5,-116.5 4163.5,-122.5 4163.5,-128.5 4163.5,-128.5 4163.5,-140.5 4163.5,-140.5 4163.5,-146.5 4157.5,-152.5 4151.5,-152.5 4151.5,-152.5 3999.5,-152.5 3999.5,-152.5 3993.5,-152.5 3987.5,-146.5 3987.5,-140.5 3987.5,-140.5 3987.5,-128.5 3987.5,-128.5 3987.5,-122.5 3993.5,-116.5 3999.5,-116.5"/> +<text text-anchor="middle" x="4075.5" y="-128.5" font-family="Times,serif" font-size="25.00">udp_payload</text> </g> <!-- udp_datagram&#45;&gt;udp_payload --> <g id="edge117" class="edge"> <title>udp_datagram:e&#45;&gt;udp_payload:n</title> -<path fill="none" stroke="#90b5ac" stroke-width="2" d="M3696.5,-245.5C3713.75,-245.5 3701.18,-194.56 3696.83,-166.36"/> -<polygon fill="#90b5ac" stroke="#90b5ac" stroke-width="2" points="3700.32,-166.1 3695.81,-156.51 3693.36,-166.82 3700.32,-166.1"/> +<path fill="none" stroke="#90b5ac" stroke-width="2" d="M4076.5,-245.5C4094.31,-245.5 4080.33,-191.2 4076.43,-163.69"/> +<polygon fill="#90b5ac" stroke="#90b5ac" stroke-width="2" points="4079.9,-163.14 4075.5,-153.5 4072.93,-163.78 4079.9,-163.14"/> </g> <!-- dns --> <g id="node97" class="node"> <title>dns</title> -<polygon fill="paleturquoise" stroke="none" points="3679.5,-5 3679.5,-31 3711.5,-31 3711.5,-5 3679.5,-5"/> -<text text-anchor="start" x="3681.5" y="-13" font-family="Times,serif" font-size="20.00">dns</text> +<polygon fill="paleturquoise" stroke="transparent" points="4054,-5 4054,-31 4095,-31 4095,-5 4054,-5"/> +<text text-anchor="start" x="4056.5" y="-13" font-family="Times,serif" font-size="20.00">dns</text> </g> <!-- udp_payload&#45;&gt;dns --> <g id="edge135" class="edge"> <title>udp_payload&#45;&gt;dns:n</title> -<path fill="none" stroke="#8c4c79" stroke-width="2" d="M3695.5,-116.62C3695.5,-99.31 3695.5,-71.25 3695.5,-44.8"/> -<polygon fill="#8c4c79" stroke="#8c4c79" stroke-width="2" points="3699,-45.03 3695.5,-35.03 3692,-45.03 3699,-45.03"/> +<path fill="none" stroke="#8c4c79" stroke-width="2" d="M4075.5,-116.26C4075.5,-98.35 4075.5,-69.23 4075.5,-42.22"/> +<polygon fill="#8c4c79" stroke="#8c4c79" stroke-width="2" points="4079,-42 4075.5,-32 4072,-42 4079,-42"/> </g> <!-- wav&#45;&gt;id3v2 --> <g id="edge120" class="edge"> <title>wav:e&#45;&gt;id3v2:n</title> -<path fill="none" stroke="#879685" stroke-width="2" d="M2582.5,-1908.5C2619.67,-1908.5 2605.81,-1868.19 2627.5,-1838 2854.91,-1521.48 3039.26,-1519.4 3177.5,-1155 3221.11,-1040.06 3205.6,-731.78 3204.55,-596.89"/> -<polygon fill="#879685" stroke="#879685" stroke-width="2" points="3208.05,-597.01 3204.51,-587.03 3201.05,-597.04 3208.05,-597.01"/> +<path fill="none" stroke="#879685" stroke-width="2" d="M3002.5,-1908.5C3039.67,-1908.5 3024.68,-1867.35 3047.5,-1838 3303.04,-1509.35 3521.99,-1536.55 3688.5,-1155 3732.16,-1054.96 3693.76,-770.3 3722.5,-665 3731.99,-630.25 3757.13,-625.43 3761.76,-595.24"/> +<polygon fill="#879685" stroke="#879685" stroke-width="2" points="3765.27,-595.23 3762.5,-585 3758.29,-594.72 3765.27,-595.23"/> </g> <!-- wav&#45;&gt;id3v1 --> <g id="edge121" class="edge"> <title>wav:e&#45;&gt;id3v1:n</title> -<path fill="none" stroke="#879685" stroke-width="2" d="M2582.5,-1888.5C2613.25,-1888.5 2601.87,-1663.08 2599.8,-1600.19"/> -<polygon fill="#879685" stroke="#879685" stroke-width="2" points="2603.3,-1600.44 2599.57,-1590.53 2596.31,-1600.61 2603.3,-1600.44"/> +<path fill="none" stroke="#879685" stroke-width="2" d="M3002.5,-1888.5C3033.63,-1888.5 3018.98,-1657.28 3016.76,-1597.86"/> +<polygon fill="#879685" stroke="#879685" stroke-width="2" points="3020.25,-1597.41 3016.5,-1587.5 3013.26,-1597.59 3020.25,-1597.41"/> </g> <!-- wav&#45;&gt;id3v11 --> <g id="edge122" class="edge"> <title>wav:e&#45;&gt;id3v11:n</title> -<path fill="none" stroke="#879685" stroke-width="2" d="M2582.5,-1869.5C2588.07,-1869.5 2582.39,-1862.5 2581.5,-1857 2562.56,-1739.66 2518.81,-1712.71 2515.68,-1600.49"/> -<polygon fill="#879685" stroke="#879685" stroke-width="2" points="2519.18,-1600.48 2515.54,-1590.53 2512.18,-1600.57 2519.18,-1600.48"/> +<path fill="none" stroke="#879685" stroke-width="2" d="M3002.5,-1869.5C3008.07,-1869.5 3002.6,-1862.46 3001.5,-1857 2993.08,-1815.26 2984.23,-1806.64 2971.5,-1766 2947.83,-1690.42 2920.92,-1671.81 2918.65,-1597.81"/> +<polygon fill="#879685" stroke="#879685" stroke-width="2" points="2922.15,-1597.45 2918.5,-1587.5 2915.15,-1597.55 2922.15,-1597.45"/> </g> <!-- webp&#45;&gt;vp8_frame --> <g id="edge123" class="edge"> <title>webp:e&#45;&gt;vp8_frame:n</title> -<path fill="none" stroke="#a6657f" stroke-width="2" d="M968.5,-896C1022.82,-896 931.47,-698.23 888.5,-665 744.49,-553.63 86.74,-752.46 54.71,-588.97"/> -<polygon fill="#a6657f" stroke="#a6657f" stroke-width="2" points="58.2,-588.65 53.78,-579.01 51.23,-589.3 58.2,-588.65"/> +<path fill="none" stroke="#a6657f" stroke-width="2" d="M1199.5,-896C1255.09,-896 1148.83,-697.18 1103.5,-665 1011.79,-599.89 119.96,-686.43 66.05,-585.97"/> +<polygon fill="#a6657f" stroke="#a6657f" stroke-width="2" points="69.37,-584.82 63.5,-576 62.59,-586.56 69.37,-584.82"/> </g> <!-- zip&#45;&gt;probe --> <g id="edge124" class="edge"> <title>zip:e&#45;&gt;probe:n</title> -<path fill="none" stroke="#698979" stroke-width="2" d="M2781.5,-1888.5C2799.51,-1888.5 2788.85,-1913.05 2780.5,-1929 2767.23,-1954.36 2753.68,-1953.38 2728.5,-1967 2648.7,-2010.16 2597.73,-1971.16 2537.5,-2039 2526.41,-2051.49 2541.51,-2065.02 2528.5,-2075.5 2520.59,-2081.87 2508.35,-2087.02 2500.14,-2086.17"/> -<polygon fill="#698979" stroke="#698979" stroke-width="2" points="2502.79,-2083.88 2493.52,-2078.76 2497.57,-2088.55 2502.79,-2083.88"/> +<path fill="none" stroke="#698979" stroke-width="2" d="M3228.5,-1888.5C3246.51,-1888.5 3236.43,-1913.37 3227.5,-1929 3211.65,-1956.73 3195.43,-1953.47 3166.5,-1967 3073.69,-2010.4 3016.17,-1962.96 2947.5,-2039 2936.37,-2051.33 2952.32,-2064.95 2939.5,-2075.5 2927.43,-2085.43 2906.75,-2092.67 2898.29,-2085.82"/> +<polygon fill="#698979" stroke="#698979" stroke-width="2" points="2901.51,-2084.45 2894.5,-2076.5 2895.02,-2087.08 2901.51,-2084.45"/> </g> <!-- bencode --> <g id="node114" class="node"> <title>bencode</title> -<polygon fill="paleturquoise" stroke="none" points="2551,-2044.5 2551,-2070.5 2622,-2070.5 2622,-2044.5 2551,-2044.5"/> -<text text-anchor="start" x="2553.5" y="-2052.5" font-family="Times,serif" font-size="20.00">bencode</text> +<polygon fill="paleturquoise" stroke="transparent" points="2961.5,-2044.5 2961.5,-2070.5 3051.5,-2070.5 3051.5,-2044.5 2961.5,-2044.5"/> +<text text-anchor="start" x="2963.5" y="-2052.5" font-family="Times,serif" font-size="20.00">bencode</text> </g> <!-- bits --> <g id="node115" class="node"> <title>bits</title> -<polygon fill="paleturquoise" stroke="none" points="2655.5,-2044.5 2655.5,-2070.5 2687.5,-2070.5 2687.5,-2044.5 2655.5,-2044.5"/> -<text text-anchor="start" x="2657.5" y="-2052.5" font-family="Times,serif" font-size="20.00">bits</text> +<polygon fill="paleturquoise" stroke="transparent" points="3082,-2044.5 3082,-2070.5 3125,-2070.5 3125,-2044.5 3082,-2044.5"/> +<text text-anchor="start" x="3084.5" y="-2052.5" font-family="Times,serif" font-size="20.00">bits</text> </g> <!-- bson --> <g id="node116" class="node"> <title>bson</title> -<polygon fill="paleturquoise" stroke="none" points="2721,-2044.5 2721,-2070.5 2762,-2070.5 2762,-2044.5 2721,-2044.5"/> -<text text-anchor="start" x="2723.5" y="-2052.5" font-family="Times,serif" font-size="20.00">bson</text> +<polygon fill="paleturquoise" stroke="transparent" points="3155,-2044.5 3155,-2070.5 3208,-2070.5 3208,-2044.5 3155,-2044.5"/> +<text text-anchor="start" x="3157.5" y="-2052.5" font-family="Times,serif" font-size="20.00">bson</text> </g> <!-- bytes --> <g id="node117" class="node"> <title>bytes</title> -<polygon fill="paleturquoise" stroke="none" points="2792.5,-2044.5 2792.5,-2070.5 2838.5,-2070.5 2838.5,-2044.5 2792.5,-2044.5"/> -<text text-anchor="start" x="2794.5" y="-2052.5" font-family="Times,serif" font-size="20.00">bytes</text> +<polygon fill="paleturquoise" stroke="transparent" points="3238,-2044.5 3238,-2070.5 3297,-2070.5 3297,-2044.5 3238,-2044.5"/> +<text text-anchor="start" x="3240.5" y="-2052.5" font-family="Times,serif" font-size="20.00">bytes</text> </g> <!-- cbor --> <g id="node118" class="node"> <title>cbor</title> -<polygon fill="paleturquoise" stroke="none" points="2868.5,-2044.5 2868.5,-2070.5 2908.5,-2070.5 2908.5,-2044.5 2868.5,-2044.5"/> -<text text-anchor="start" x="2870.5" y="-2052.5" font-family="Times,serif" font-size="20.00">cbor</text> +<polygon fill="paleturquoise" stroke="transparent" points="3327.5,-2044.5 3327.5,-2070.5 3377.5,-2070.5 3377.5,-2044.5 3327.5,-2044.5"/> +<text text-anchor="start" x="3329.5" y="-2052.5" font-family="Times,serif" font-size="20.00">cbor</text> </g> <!-- csv --> <g id="node119" class="node"> <title>csv</title> -<polygon fill="paleturquoise" stroke="none" points="2942,-2044.5 2942,-2070.5 2973,-2070.5 2973,-2044.5 2942,-2044.5"/> -<text text-anchor="start" x="2944.5" y="-2052.5" font-family="Times,serif" font-size="20.00">csv</text> +<polygon fill="paleturquoise" stroke="transparent" points="3407.5,-2044.5 3407.5,-2070.5 3445.5,-2070.5 3445.5,-2044.5 3407.5,-2044.5"/> +<text text-anchor="start" x="3409.5" y="-2052.5" font-family="Times,serif" font-size="20.00">csv</text> </g> <!-- fairplay_spc --> <g id="node120" class="node"> <title>fairplay_spc</title> -<polygon fill="paleturquoise" stroke="none" points="3006.5,-2044.5 3006.5,-2070.5 3108.5,-2070.5 3108.5,-2044.5 3006.5,-2044.5"/> -<text text-anchor="start" x="3008.5" y="-2052.5" font-family="Times,serif" font-size="20.00">fairplay_spc</text> +<polygon fill="paleturquoise" stroke="transparent" points="3475.5,-2044.5 3475.5,-2070.5 3603.5,-2070.5 3603.5,-2044.5 3475.5,-2044.5"/> +<text text-anchor="start" x="3477.5" y="-2052.5" font-family="Times,serif" font-size="20.00">fairplay_spc</text> </g> <!-- html --> <g id="node121" class="node"> <title>html</title> -<polygon fill="paleturquoise" stroke="none" points="3139,-2044.5 3139,-2070.5 3180,-2070.5 3180,-2044.5 3139,-2044.5"/> -<text text-anchor="start" x="3141.5" y="-2052.5" font-family="Times,serif" font-size="20.00">html</text> +<polygon fill="paleturquoise" stroke="transparent" points="3634,-2044.5 3634,-2070.5 3685,-2070.5 3685,-2044.5 3634,-2044.5"/> +<text text-anchor="start" x="3636.5" y="-2052.5" font-family="Times,serif" font-size="20.00">html</text> </g> <!-- markdown --> <g id="node122" class="node"> <title>markdown</title> -<polygon fill="paleturquoise" stroke="none" points="3210,-2044.5 3210,-2070.5 3299,-2070.5 3299,-2044.5 3210,-2044.5"/> -<text text-anchor="start" x="3212.5" y="-2052.5" font-family="Times,serif" font-size="20.00">markdown</text> +<polygon fill="paleturquoise" stroke="transparent" points="3715.5,-2044.5 3715.5,-2070.5 3827.5,-2070.5 3827.5,-2044.5 3715.5,-2044.5"/> +<text text-anchor="start" x="3717.5" y="-2052.5" font-family="Times,serif" font-size="20.00">markdown</text> </g> <!-- msgpack --> <g id="node123" class="node"> <title>msgpack</title> -<polygon fill="paleturquoise" stroke="none" points="3329,-2044.5 3329,-2070.5 3404,-2070.5 3404,-2044.5 3329,-2044.5"/> -<text text-anchor="start" x="3331.5" y="-2052.5" font-family="Times,serif" font-size="20.00">msgpack</text> +<polygon fill="paleturquoise" stroke="transparent" points="3858,-2044.5 3858,-2070.5 3953,-2070.5 3953,-2044.5 3858,-2044.5"/> +<text text-anchor="start" x="3860.5" y="-2052.5" font-family="Times,serif" font-size="20.00">msgpack</text> +</g> +<!-- pg_btree --> +<g id="node124" class="node"> +<title>pg_btree</title> +<polygon fill="paleturquoise" stroke="transparent" points="3983,-2044.5 3983,-2070.5 4078,-2070.5 4078,-2044.5 3983,-2044.5"/> +<text text-anchor="start" x="3985.5" y="-2052.5" font-family="Times,serif" font-size="20.00">pg_btree</text> +</g> +<!-- pg_control --> +<g id="node125" class="node"> +<title>pg_control</title> +<polygon fill="paleturquoise" stroke="transparent" points="4108,-2044.5 4108,-2070.5 4221,-2070.5 4221,-2044.5 4108,-2044.5"/> +<text text-anchor="start" x="4110.5" y="-2052.5" font-family="Times,serif" font-size="20.00">pg_control</text> +</g> +<!-- pg_heap --> +<g id="node126" class="node"> +<title>pg_heap</title> +<polygon fill="paleturquoise" stroke="transparent" points="4251,-2044.5 4251,-2070.5 4340,-2070.5 4340,-2044.5 4251,-2044.5"/> +<text text-anchor="start" x="4253.5" y="-2052.5" font-family="Times,serif" font-size="20.00">pg_heap</text> </g> </g> </svg> From 08c535239bd43d598b291f01b0a68077536541b7 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Thu, 4 May 2023 08:45:42 +0300 Subject: [PATCH 137/141] postgres: refactoring --- format/format.go | 12 ++++++------ format/postgres/common/pg_btree/postgres/pg_btree.go | 4 ++-- format/postgres/common/pg_heap/pgproee/decode.go | 2 +- format/postgres/common/pg_heap/postgres/decode.go | 2 +- format/postgres/common/pg_heap/postgres/pg_heap.go | 2 +- format/postgres/pg_btree.go | 8 ++++---- format/postgres/pg_control.go | 8 ++++---- format/postgres/pg_heap.go | 8 ++++---- 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/format/format.go b/format/format.go index 8c0118e67..fab1351b7 100644 --- a/format/format.go +++ b/format/format.go @@ -112,9 +112,9 @@ var ( Opus_Packet = &decode.Group{Name: "opus_packet"} PCAP = &decode.Group{Name: "pcap"} PCAPNG = &decode.Group{Name: "pcapng"} - PG_BTREE = &decode.Group{Name: "pg_btree"} - PG_CONTROL = &decode.Group{Name: "pg_control"} - PG_HEAP = &decode.Group{Name: "pg_heap"} + Pg_BTree = &decode.Group{Name: "pg_btree"} + Pg_Control = &decode.Group{Name: "pg_control"} + Pg_Heap = &decode.Group{Name: "pg_heap"} PNG = &decode.Group{Name: "png"} Prores_Frame = &decode.Group{Name: "prores_frame"} Protobuf = &decode.Group{Name: "protobuf"} @@ -343,16 +343,16 @@ type TLS_In struct { Keylog string `doc:"NSS Key Log content"` } -type PgControlIn struct { +type Pg_Control_In struct { Flavour string `doc:"PostgreSQL flavour: postgres14, pgproee14.., postgres10"` } -type PostgresHeapIn struct { +type Pg_Heap_In struct { Flavour string `doc:"PostgreSQL flavour: postgres14, pgproee14.., postgres10"` Page int `doc:"First page number in file, default is 0"` Segment int `doc:"Segment file number (16790.1 is 1), default is 0"` } -type PostgresBTreeIn struct { +type Pg_BTree_In struct { Page int `doc:"First page number in file, default is 0"` } diff --git a/format/postgres/common/pg_btree/postgres/pg_btree.go b/format/postgres/common/pg_btree/postgres/pg_btree.go index d701b0e9a..edff0bf86 100644 --- a/format/postgres/common/pg_btree/postgres/pg_btree.go +++ b/format/postgres/common/pg_btree/postgres/pg_btree.go @@ -65,7 +65,7 @@ const ( // IndexTupleData *IndexTuple; /* total size (bytes): 8 */ -func DecodePgBTree(d *decode.D, args format.PostgresBTreeIn) any { +func DecodePgBTree(d *decode.D, args format.Pg_BTree_In) any { btree := &BTree{ Args: args, PageSize: common.PageSize, @@ -75,7 +75,7 @@ func DecodePgBTree(d *decode.D, args format.PostgresBTreeIn) any { } type BTree struct { - Args format.PostgresBTreeIn + Args format.Pg_BTree_In PageSize uint64 page *postgres.HeapPage } diff --git a/format/postgres/common/pg_heap/pgproee/decode.go b/format/postgres/common/pg_heap/pgproee/decode.go index 051b590b8..312c74c6b 100644 --- a/format/postgres/common/pg_heap/pgproee/decode.go +++ b/format/postgres/common/pg_heap/pgproee/decode.go @@ -6,7 +6,7 @@ import ( "github.com/wader/fq/pkg/decode" ) -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { +func DecodeHeap(d *decode.D, args format.Pg_Heap_In) any { heap := &postgres.Heap{ Args: args, DecodePageHeaderData: DecodePageHeaderData, diff --git a/format/postgres/common/pg_heap/postgres/decode.go b/format/postgres/common/pg_heap/postgres/decode.go index b40c770b9..f16ba0d62 100644 --- a/format/postgres/common/pg_heap/postgres/decode.go +++ b/format/postgres/common/pg_heap/postgres/decode.go @@ -5,7 +5,7 @@ import ( "github.com/wader/fq/pkg/decode" ) -func DecodeHeap(d *decode.D, args format.PostgresHeapIn) any { +func DecodeHeap(d *decode.D, args format.Pg_Heap_In) any { heap := &Heap{ Args: args, DecodePageHeaderData: DecodePageHeader, diff --git a/format/postgres/common/pg_heap/postgres/pg_heap.go b/format/postgres/common/pg_heap/postgres/pg_heap.go index 145d41191..9c72c64b0 100644 --- a/format/postgres/common/pg_heap/postgres/pg_heap.go +++ b/format/postgres/common/pg_heap/postgres/pg_heap.go @@ -110,7 +110,7 @@ const SizeOfHeapTupleHeaderData = 24 /* total size (bytes): 6 */ type Heap struct { - Args format.PostgresHeapIn + Args format.Pg_Heap_In // current Page Page *HeapPage diff --git a/format/postgres/pg_btree.go b/format/postgres/pg_btree.go index fd1037e5d..b2e4c6ebc 100644 --- a/format/postgres/pg_btree.go +++ b/format/postgres/pg_btree.go @@ -14,10 +14,10 @@ import ( var pgBTreeFS embed.FS func init() { - interp.RegisterFormat(format.PG_BTREE, &decode.Format{ + interp.RegisterFormat(format.Pg_BTree, &decode.Format{ Description: "PostgreSQL btree index file", DecodeFn: decodePgBTree, - DefaultInArg: format.PostgresBTreeIn{ + DefaultInArg: format.Pg_BTree_In{ Page: 0, }, RootArray: true, @@ -28,9 +28,9 @@ func init() { func decodePgBTree(d *decode.D) any { d.Endian = decode.LittleEndian - var pgIn format.PostgresBTreeIn + var pgIn format.Pg_BTree_In if !d.ArgAs(&pgIn) { - d.Fatalf("DecodeInArg must be PostgresBTreeIn!\n") + d.Fatalf("DecodeInArg must be Pg_BTree_In!\n") } return postgres.DecodePgBTree(d, pgIn) } diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index dd5b072a6..e1093bb59 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -29,10 +29,10 @@ import ( var pgControlFS embed.FS func init() { - interp.RegisterFormat(format.PG_CONTROL, &decode.Format{ + interp.RegisterFormat(format.Pg_Control, &decode.Format{ Description: "PostgreSQL control file", DecodeFn: decodePgControl, - DefaultInArg: format.PgControlIn{ + DefaultInArg: format.Pg_Control_In{ Flavour: "", }, }) @@ -72,9 +72,9 @@ const ( func decodePgControl(d *decode.D) any { d.Endian = decode.LittleEndian - var pgIn format.PgControlIn + var pgIn format.Pg_Control_In if !d.ArgAs(&pgIn) { - d.Fatalf("DecodeInArg must be PgControlIn!\n") + d.Fatalf("DecodeInArg must be Pg_Control_In!\n") } switch pgIn.Flavour { diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index e7d40ead2..81d8b2285 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -18,10 +18,10 @@ import ( var pgHeapFS embed.FS func init() { - interp.RegisterFormat(format.PG_HEAP, &decode.Format{ + interp.RegisterFormat(format.Pg_Heap, &decode.Format{ Description: "PostgreSQL heap file", DecodeFn: decodePgheap, - DefaultInArg: format.PostgresHeapIn{ + DefaultInArg: format.Pg_Heap_In{ Flavour: PG_FLAVOUR_POSTGRES14, Page: 0, Segment: 0, @@ -35,9 +35,9 @@ func init() { func decodePgheap(d *decode.D) any { d.Endian = decode.LittleEndian - var pgIn format.PostgresHeapIn + var pgIn format.Pg_Heap_In if !d.ArgAs(&pgIn) { - d.Fatalf("DecodeInArg must be PostgresHeapIn!\n") + d.Fatalf("DecodeInArg must be Pg_Heap_In!\n") } switch pgIn.Flavour { From c23bc4216f32ba74022f2f8c3f5b72076630daf2 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Thu, 4 May 2023 09:16:55 +0300 Subject: [PATCH 138/141] postgres: fix line endings in error messages, simplify code, add comments --- format/postgres/common/pg_btree/postgres/pg_btree.go | 10 +++++----- format/postgres/common/pg_heap/postgres/pg_heap.go | 8 ++++---- format/postgres/pg_btree.go | 2 +- format/postgres/pg_control.go | 5 +++-- format/postgres/pg_heap.go | 2 +- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/format/postgres/common/pg_btree/postgres/pg_btree.go b/format/postgres/common/pg_btree/postgres/pg_btree.go index edff0bf86..5ae586c5a 100644 --- a/format/postgres/common/pg_btree/postgres/pg_btree.go +++ b/format/postgres/common/pg_btree/postgres/pg_btree.go @@ -93,7 +93,7 @@ func decodeBTreePages(btree *BTree, d *decode.D) { pos0 := page.BytesPosBegin * 8 d.SeekAbs(pos0) - if end, _ := d.TryEnd(); end { + if d.End() { return } @@ -130,7 +130,7 @@ func decodeBTreeMetaPage(btree *BTree, d *decode.D) { pos2 := d.Pos() bytesPos2 := pos2 / 8 if bytesPos2 != page.BytesPosEnd { - d.Fatalf("invalid pos after read page_opaque_data on meta page\n") + d.Fatalf("invalid pos after read page_opaque_data on meta page") } } @@ -160,7 +160,7 @@ func decodeBTMetaPageData(d *decode.D) { d.FieldU56("padding0") if btmMagic != BTREE_MAGIC { - d.Fatalf("invalid btmMagic = %X, must be %X\n", btmMagic, BTREE_MAGIC) + d.Fatalf("invalid btmMagic = %X, must be %X", btmMagic, BTREE_MAGIC) } } @@ -220,7 +220,7 @@ func decodeBTreePage(btree *BTree, d *decode.D) { pos2 := d.Pos() bytesPos2 := pos2 / 8 if bytesPos2 != page.BytesPosEnd { - d.Fatalf("invalid pos after read page_opaque_data on btree page\n") + d.Fatalf("invalid pos after read page_opaque_data on btree page") } d.SeekAbs(pos0) @@ -272,7 +272,7 @@ func decodeIndexTuples(btree *BTree, d *decode.D) { }) d.FieldValueUint("size", size) if size < IndexTupleDataSize { - d.Fatalf("invalid size of tuple = %d\n", size) + d.Fatalf("invalid size of tuple = %d", size) } dataSize := size - IndexTupleDataSize d.FieldRawLen("data", int64(dataSize*8)) diff --git a/format/postgres/common/pg_heap/postgres/pg_heap.go b/format/postgres/common/pg_heap/postgres/pg_heap.go index 9c72c64b0..dd301e62f 100644 --- a/format/postgres/common/pg_heap/postgres/pg_heap.go +++ b/format/postgres/common/pg_heap/postgres/pg_heap.go @@ -145,7 +145,7 @@ func decodeHeapPages(heap *Heap, d *decode.D) { blockNumber := uint32(heap.Args.Page + heap.Args.Segment*common.RelSegSize) count := int64(0) for { - if end, _ := d.TryEnd(); end { + if d.End() { return } @@ -204,7 +204,7 @@ func calcCheckSum(d *decode.D, blockNumber uint32) uint16 { rdrPage := d.RawLen(int64(common.PageSize * 8)) _, err := rdrPage.ReadBits(pageBuffer, int64(common.PageSize*8)) if err != nil { - d.Fatalf("can't read page, err = %v\n", err) + d.Fatalf("can't read page, err = %v", err) } sum2 := common.CheckSumBlock(pageBuffer, blockNumber) d.SeekAbs(pos0) @@ -224,7 +224,7 @@ func decodeTuples(heap *Heap, d *decode.D) { pos := (page.BytesPosBegin * 8) + int64(id.Off)*8 if id.Len < SizeOfHeapTupleHeaderData { - d.Fatalf("item len = %d, is less than %d HeapTupleHeaderData\n", id.Len, SizeOfHeapTupleHeaderData) + d.Fatalf("item len = %d, is less than %d HeapTupleHeaderData", id.Len, SizeOfHeapTupleHeaderData) } tupleDataLen := id.Len - SizeOfHeapTupleHeaderData @@ -303,7 +303,7 @@ func decodeTuples(heap *Heap, d *decode.D) { pos3 := uint64(d.Pos() / 8) pos2Aligned := common.TypeAlign8(pos3) if pos3 != pos2Aligned { - d.Fatalf("pos3 isn't aligned, pos2 = %d, pos3 = %d\n", pos2, pos3) + d.Fatalf("pos3 isn't aligned, pos2 = %d, pos3 = %d", pos2, pos3) } }) diff --git a/format/postgres/pg_btree.go b/format/postgres/pg_btree.go index b2e4c6ebc..5a53aa425 100644 --- a/format/postgres/pg_btree.go +++ b/format/postgres/pg_btree.go @@ -30,7 +30,7 @@ func decodePgBTree(d *decode.D) any { d.Endian = decode.LittleEndian var pgIn format.Pg_BTree_In if !d.ArgAs(&pgIn) { - d.Fatalf("DecodeInArg must be Pg_BTree_In!\n") + d.Fatalf("no page specified") } return postgres.DecodePgBTree(d, pgIn) } diff --git a/format/postgres/pg_control.go b/format/postgres/pg_control.go index e1093bb59..de0c4cabb 100644 --- a/format/postgres/pg_control.go +++ b/format/postgres/pg_control.go @@ -46,6 +46,7 @@ const ( PG_CONTROL_VERSION_12 = 1201 //PG_CONTROL_VERSION_13 = 1300 PG_CONTROL_VERSION_14 = 1300 + //PG_CONTROL_VERSION_15 = 1300 ) const ( @@ -74,7 +75,7 @@ func decodePgControl(d *decode.D) any { var pgIn format.Pg_Control_In if !d.ArgAs(&pgIn) { - d.Fatalf("DecodeInArg must be Pg_Control_In!\n") + d.Fatalf("no flavour specified") } switch pgIn.Flavour { @@ -165,6 +166,6 @@ func probeForDecode(d *decode.D) any { } } - d.Fatalf("unsupported PG_CONTROL_VERSION = %d\n", pgControlVersion) + d.Fatalf("unsupported PG_CONTROL_VERSION = %d", pgControlVersion) return nil } diff --git a/format/postgres/pg_heap.go b/format/postgres/pg_heap.go index 81d8b2285..108210cc5 100644 --- a/format/postgres/pg_heap.go +++ b/format/postgres/pg_heap.go @@ -37,7 +37,7 @@ func decodePgheap(d *decode.D) any { var pgIn format.Pg_Heap_In if !d.ArgAs(&pgIn) { - d.Fatalf("DecodeInArg must be Pg_Heap_In!\n") + d.Fatalf("no flavour specified") } switch pgIn.Flavour { From e8391916790c30104b2173d6e458f18222f93f49 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Fri, 5 May 2023 11:28:38 +0300 Subject: [PATCH 139/141] postgres: btree refactored by Mattias Wadman --- .../common/pg_btree/postgres/pg_btree.go | 48 ++++++------------- format/postgres/pg_btree.go | 3 +- 2 files changed, 17 insertions(+), 34 deletions(-) diff --git a/format/postgres/common/pg_btree/postgres/pg_btree.go b/format/postgres/common/pg_btree/postgres/pg_btree.go index 5ae586c5a..be387438d 100644 --- a/format/postgres/common/pg_btree/postgres/pg_btree.go +++ b/format/postgres/common/pg_btree/postgres/pg_btree.go @@ -1,7 +1,6 @@ package postgres import ( - "github.com/wader/fq/format" "github.com/wader/fq/format/postgres/common" "github.com/wader/fq/format/postgres/common/pg_heap/postgres" "github.com/wader/fq/pkg/decode" @@ -65,30 +64,17 @@ const ( // IndexTupleData *IndexTuple; /* total size (bytes): 8 */ -func DecodePgBTree(d *decode.D, args format.Pg_BTree_In) any { - btree := &BTree{ - Args: args, - PageSize: common.PageSize, - } - decodeBTreePages(btree, d) - return nil -} +func DecodePgBTree(d *decode.D, pageNr int) { + var prevPage *postgres.HeapPage -type BTree struct { - Args format.Pg_BTree_In - PageSize uint64 - page *postgres.HeapPage -} - -func decodeBTreePages(btree *BTree, d *decode.D) { - for i := btree.Args.Page; ; i++ { + for i := pageNr; ; i++ { page := &postgres.HeapPage{} - if btree.page != nil { + if prevPage != nil { // use prev page - page.BytesPosBegin = btree.page.BytesPosEnd + page.BytesPosBegin = prevPage.BytesPosEnd } - page.BytesPosEnd = int64(common.TypeAlign(btree.PageSize, uint64(page.BytesPosBegin)+1)) - btree.page = page + page.BytesPosEnd = int64(common.TypeAlign(common.PageSize, uint64(page.BytesPosBegin)+1)) + prevPage = page pos0 := page.BytesPosBegin * 8 d.SeekAbs(pos0) @@ -100,19 +86,18 @@ func decodeBTreePages(btree *BTree, d *decode.D) { if i == 0 { // first page contains meta information d.FieldStruct("page", func(d *decode.D) { - decodeBTreeMetaPage(btree, d) + decodeBTreeMetaPage(page, d) }) continue } d.FieldStruct("page", func(d *decode.D) { - decodeBTreePage(btree, d) + decodeBTreePage(page, d) }) } } -func decodeBTreeMetaPage(btree *BTree, d *decode.D) { - page := btree.page +func decodeBTreeMetaPage(page *postgres.HeapPage, d *decode.D) { d.FieldStruct("page_header", func(d *decode.D) { postgres.DecodePageHeader(page, d) @@ -122,7 +107,7 @@ func decodeBTreeMetaPage(btree *BTree, d *decode.D) { }) pos0 := d.Pos() - pos1 := btree.page.BytesPosSpecial * 8 + pos1 := page.BytesPosSpecial * 8 d.FieldRawLen("unused0", pos1-pos0) d.FieldStruct("page_opaque_data", func(d *decode.D) { decodeBTPageOpaqueData(d) @@ -204,15 +189,13 @@ func decodeBTPageOpaqueData(d *decode.D) { }) } -func decodeBTreePage(btree *BTree, d *decode.D) { - page := btree.page - +func decodeBTreePage(page *postgres.HeapPage, d *decode.D) { d.FieldStruct("page_header", func(d *decode.D) { postgres.DecodePageHeader(page, d) }) pos0 := d.Pos() - pos1 := btree.page.BytesPosSpecial * 8 + pos1 := page.BytesPosSpecial * 8 d.SeekAbs(pos1) d.FieldStruct("page_opaque_data", func(d *decode.D) { decodeBTPageOpaqueData(d) @@ -227,12 +210,11 @@ func decodeBTreePage(btree *BTree, d *decode.D) { postgres.DecodeItemIds(page, d) d.FieldArray("tuples", func(d *decode.D) { - decodeIndexTuples(btree, d) + decodeIndexTuples(page, d) }) } -func decodeIndexTuples(btree *BTree, d *decode.D) { - page := btree.page +func decodeIndexTuples(page *postgres.HeapPage, d *decode.D) { for i := 0; i < len(page.ItemIds); i++ { id := page.ItemIds[i] diff --git a/format/postgres/pg_btree.go b/format/postgres/pg_btree.go index 5a53aa425..9df49ac42 100644 --- a/format/postgres/pg_btree.go +++ b/format/postgres/pg_btree.go @@ -32,5 +32,6 @@ func decodePgBTree(d *decode.D) any { if !d.ArgAs(&pgIn) { d.Fatalf("no page specified") } - return postgres.DecodePgBTree(d, pgIn) + postgres.DecodePgBTree(d, pgIn.Page) + return nil } From c9350de3526377625e9daf7366ba59973d2608d9 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Sat, 6 May 2023 08:42:16 +0300 Subject: [PATCH 140/141] postgres: use bit stream instead of masks to get flags --- .../common/pg_btree/postgres/pg_btree.go | 66 +++++++------------ .../flavours/postgres14/16404_1.fqtest | 25 ++++--- .../flavours/postgres14/16404_2.fqtest | 50 +++++++------- 3 files changed, 58 insertions(+), 83 deletions(-) diff --git a/format/postgres/common/pg_btree/postgres/pg_btree.go b/format/postgres/common/pg_btree/postgres/pg_btree.go index be387438d..0c03f38a8 100644 --- a/format/postgres/common/pg_btree/postgres/pg_btree.go +++ b/format/postgres/common/pg_btree/postgres/pg_btree.go @@ -8,25 +8,12 @@ import ( const ( BTREE_MAGIC = 0x053162 - P_NONE = 0 - - /* Bits defined in btpo_flags */ - BTP_LEAF = 1 << 0 /* leaf page, i.e. not internal page */ - BTP_ROOT = 1 << 1 /* root page (has no parent) */ - BTP_DELETED = 1 << 2 /* page has been deleted from tree */ - BTP_META = 1 << 3 /* meta-page */ - BTP_HALF_DEAD = 1 << 4 /* empty, but still in tree */ - BTP_SPLIT_END = 1 << 5 /* rightmost page of split group */ - BTP_HAS_GARBAGE = 1 << 6 /* page has LP_DEAD tuples (deprecated) */ - BTP_INCOMPLETE_SPLIT = 1 << 7 /* right sibling's downlink is missing */ - BTP_HAS_FULLXID = 1 << 8 /* contains BTDeletedPageData */ ) const ( - INDEX_SIZE_MASK = 0x1FFF - INDEX_AM_RESERVED_BIT = 0x2000 /* reserved for index-AM specific usage */ - INDEX_VAR_MASK = 0x4000 - INDEX_NULL_MASK = 0x8000 + INDEX_SIZE_MASK = 0x1FFF + INDEX_VAR_MASK = 0x4000 + INDEX_NULL_MASK = 0x8000 ) const ( @@ -156,37 +143,28 @@ func decodeBTMetaPageData(d *decode.D) { /* 12 | 2 */ // uint16 btpo_flags; /* 14 | 2 */ // BTCycleId btpo_cycleid; func decodeBTPageOpaqueData(d *decode.D) { - prev := d.FieldU32("btpo_prev") - next := d.FieldU32("btpo_next") + d.FieldU32("btpo_prev") + d.FieldU32("btpo_next") d.FieldU32("btpo_level") - flags := d.FieldU16("btpo_flags") - d.FieldU16("btpo_cycleid") - isLeftMost := prev == P_NONE - isRightMost := next == P_NONE - isLeaf := (flags & BTP_LEAF) != 0 - isRoot := (flags & BTP_ROOT) != 0 - isDeleted := (flags & BTP_DELETED) != 0 - isMeta := (flags & BTP_META) != 0 - isHalfDead := (flags & BTP_HALF_DEAD) != 0 - isIgnore := isDeleted || isHalfDead - hasGarbage := (flags & BTP_HAS_GARBAGE) != 0 - isIncompleteSplit := (flags & BTP_INCOMPLETE_SPLIT) != 0 - hasFullXid := (flags & BTP_HAS_FULLXID) != 0 - - d.FieldStruct("flags", func(d *decode.D) { - d.FieldValueBool("is_leftmost", isLeftMost) - d.FieldValueBool("is_rightmost", isRightMost) - d.FieldValueBool("is_leaf", isLeaf) - d.FieldValueBool("is_root", isRoot) - d.FieldValueBool("is_deleted", isDeleted) - d.FieldValueBool("is_meta", isMeta) - d.FieldValueBool("is_half_dead", isHalfDead) - d.FieldValueBool("is_ignore", isIgnore) - d.FieldValueBool("has_garbage", hasGarbage) - d.FieldValueBool("is_incomplete_split", isIncompleteSplit) - d.FieldValueBool("has_full_xid", hasFullXid) + // bits in uint16 LE: 7 - 0 15 - 8 + d.FieldStruct("btpo_flags", func(d *decode.D) { + d.FieldBool("is_incomplete_split") + d.FieldBool("has_garbage") + d.FieldBool("split_end") + isHalfDead := d.FieldBool("is_half_dead") + d.FieldBool("is_meta") + isDeleted := d.FieldBool("is_deleted") + d.FieldBool("is_root") + d.FieldBool("is_leaf") + + d.FieldU7("skip1") + d.FieldBool("has_full_xid") + + d.FieldValueBool("is_ignore", isDeleted || isHalfDead) }) + + d.FieldU16("btpo_cycleid") } func decodeBTreePage(page *postgres.HeapPage, d *decode.D) { diff --git a/format/postgres/testdata/flavours/postgres14/16404_1.fqtest b/format/postgres/testdata/flavours/postgres14/16404_1.fqtest index 050ffc123..a824952b8 100644 --- a/format/postgres/testdata/flavours/postgres14/16404_1.fqtest +++ b/format/postgres/testdata/flavours/postgres14/16404_1.fqtest @@ -30,17 +30,16 @@ $ fq -d pg_btree -o flavour=postgres14 ".[0] | d" 16404 0x1ff0|00 00 00 00 |.... | btpo_prev: 0 0x1ff0| 00 00 00 00 | .... | btpo_next: 0 0x1ff0| 00 00 00 00 | .... | btpo_level: 0 -0x1ff0| 08 00 | .. | btpo_flags: 8 -0x1ff0| 00 00| ..| btpo_cycleid: 0 - | | | flags{}: - | | | is_leftmost: true - | | | is_rightmost: true - | | | is_leaf: false - | | | is_root: false - | | | is_deleted: false - | | | is_meta: true - | | | is_half_dead: false + | | | btpo_flags{}: +0x1ff0| 08 | . | is_incomplete_split: false +0x1ff0| 08 | . | has_garbage: false +0x1ff0| 08 | . | split_end: false +0x1ff0| 08 | . | is_half_dead: false +0x1ff0| 08 | . | is_meta: true +0x1ff0| 08 | . | is_deleted: false +0x1ff0| 08 | . | is_root: false +0x1ff0| 08 | . | is_leaf: false +0x1ff0| 00 | . | skip1: 0 +0x1ff0| 00 | . | has_full_xid: false | | | is_ignore: false - | | | has_garbage: false - | | | is_incomplete_split: false - | | | has_full_xid: false +0x1ff0| 00 00| ..| btpo_cycleid: 0 diff --git a/format/postgres/testdata/flavours/postgres14/16404_2.fqtest b/format/postgres/testdata/flavours/postgres14/16404_2.fqtest index 3b3472efe..b94f131ba 100644 --- a/format/postgres/testdata/flavours/postgres14/16404_2.fqtest +++ b/format/postgres/testdata/flavours/postgres14/16404_2.fqtest @@ -30,20 +30,19 @@ $ fq -d pg_btree -o flavour=postgres14 ".[] | d" 16404 0x1ff0|00 00 00 00 |.... | btpo_prev: 0 0x1ff0| 00 00 00 00 | .... | btpo_next: 0 0x1ff0| 00 00 00 00 | .... | btpo_level: 0 -0x1ff0| 08 00 | .. | btpo_flags: 8 -0x1ff0| 00 00| ..| btpo_cycleid: 0 - | | | flags{}: - | | | is_leftmost: true - | | | is_rightmost: true - | | | is_leaf: false - | | | is_root: false - | | | is_deleted: false - | | | is_meta: true - | | | is_half_dead: false + | | | btpo_flags{}: +0x1ff0| 08 | . | is_incomplete_split: false +0x1ff0| 08 | . | has_garbage: false +0x1ff0| 08 | . | split_end: false +0x1ff0| 08 | . | is_half_dead: false +0x1ff0| 08 | . | is_meta: true +0x1ff0| 08 | . | is_deleted: false +0x1ff0| 08 | . | is_root: false +0x1ff0| 08 | . | is_leaf: false +0x1ff0| 00 | . | skip1: 0 +0x1ff0| 00 | . | has_full_xid: false | | | is_ignore: false - | | | has_garbage: false - | | | is_incomplete_split: false - | | | has_full_xid: false +0x1ff0| 00 00| ..| btpo_cycleid: 0 |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.[1]{}: page | | | page_header{}: | | | pd_lsn{}: @@ -867,17 +866,16 @@ $ fq -d pg_btree -o flavour=postgres14 ".[] | d" 16404 0x3ff0|00 00 00 00 |.... | btpo_prev: 0 0x3ff0| 02 00 00 00 | .... | btpo_next: 2 0x3ff0| 00 00 00 00 | .... | btpo_level: 0 -0x3ff0| 01 00 | .. | btpo_flags: 1 -0x3ff0| 00 00| ..| btpo_cycleid: 0 - | | | flags{}: - | | | is_leftmost: true - | | | is_rightmost: false - | | | is_leaf: true - | | | is_root: false - | | | is_deleted: false - | | | is_meta: false - | | | is_half_dead: false + | | | btpo_flags{}: +0x3ff0| 01 | . | is_incomplete_split: false +0x3ff0| 01 | . | has_garbage: false +0x3ff0| 01 | . | split_end: false +0x3ff0| 01 | . | is_half_dead: false +0x3ff0| 01 | . | is_meta: false +0x3ff0| 01 | . | is_deleted: false +0x3ff0| 01 | . | is_root: false +0x3ff0| 01 | . | is_leaf: true +0x3ff0| 00 | . | skip1: 0 +0x3ff0| 00 | . | has_full_xid: false | | | is_ignore: false - | | | has_garbage: false - | | | is_incomplete_split: false - | | | has_full_xid: false +0x3ff0| 00 00| ..| btpo_cycleid: 0 From e6a9cdbecfceb778e8f30d6cdbf426158f288a14 Mon Sep 17 00:00:00 2001 From: Pavel Safonov <p.safonov@postgrespro.ru> Date: Sat, 6 May 2023 08:54:56 +0300 Subject: [PATCH 141/141] postgres: doc --- doc/formats.md | 15 +++++++++++++++ format/postgres/pg_btree.md | 5 +++++ format/postgres/pg_control.md | 5 +++++ format/postgres/pg_heap.md | 5 +++++ 4 files changed, 30 insertions(+) diff --git a/doc/formats.md b/doc/formats.md index 343def793..7aaea731e 100644 --- a/doc/formats.md +++ b/doc/formats.md @@ -860,6 +860,11 @@ $ fq -d pg_btree -o flavour=postgres14 ".[0] | d" 16404 $ fq -d pg_btree -o flavour=postgres14 ".[1]" 16404 ``` +### Authors +- Pavel Safonov +p.n.safonov@gmail.com +[@pnsafonov](https://github.com/pnsafonov) + ### References - https://www.postgresql.org/docs/current/storage-page-layout.html ## pg_control @@ -894,6 +899,11 @@ $ fq -d pg_control -o flavour=postgres14 d pg_control $ fq -d pg_control -o flavour=postgres14 ".state, .check_point_copy.redo, .wal_level" pg_control ``` +### Authors +- Pavel Safonov +p.n.safonov@gmail.com +[@pnsafonov](https://github.com/pnsafonov) + ### References - https://github.com/postgres/postgres/blob/REL_14_2/src/include/catalog/pg_control.h ## pg_heap @@ -941,6 +951,11 @@ $ fq -d pg_heap -o flavour=postgres14 ".[0].pd_linp[0, -1]" 16994 $ fq -d pg_heap -o flavour=postgres14 ".[0].tuples[0, -1]" 16994 ``` +### Authors +- Pavel Safonov +p.n.safonov@gmail.com +[@pnsafonov](https://github.com/pnsafonov) + ### References - https://www.postgresql.org/docs/current/storage-page-layout.html ## protobuf diff --git a/format/postgres/pg_btree.md b/format/postgres/pg_btree.md index ae803e1ba..80a16bc2c 100644 --- a/format/postgres/pg_btree.md +++ b/format/postgres/pg_btree.md @@ -10,5 +10,10 @@ $ fq -d pg_btree -o flavour=postgres14 ".[0] | d" 16404 $ fq -d pg_btree -o flavour=postgres14 ".[1]" 16404 ``` +### Authors +- Pavel Safonov +p.n.safonov@gmail.com +[@pnsafonov](https://github.com/pnsafonov) + ### References - https://www.postgresql.org/docs/current/storage-page-layout.html \ No newline at end of file diff --git a/format/postgres/pg_control.md b/format/postgres/pg_control.md index 7c3194360..64cd0b463 100644 --- a/format/postgres/pg_control.md +++ b/format/postgres/pg_control.md @@ -10,5 +10,10 @@ $ fq -d pg_control -o flavour=postgres14 d pg_control $ fq -d pg_control -o flavour=postgres14 ".state, .check_point_copy.redo, .wal_level" pg_control ``` +### Authors +- Pavel Safonov +p.n.safonov@gmail.com +[@pnsafonov](https://github.com/pnsafonov) + ### References - https://github.com/postgres/postgres/blob/REL_14_2/src/include/catalog/pg_control.h \ No newline at end of file diff --git a/format/postgres/pg_heap.md b/format/postgres/pg_heap.md index 1efe639c1..a783d03e2 100644 --- a/format/postgres/pg_heap.md +++ b/format/postgres/pg_heap.md @@ -21,5 +21,10 @@ $ fq -d pg_heap -o flavour=postgres14 ".[0].pd_linp[0, -1]" 16994 $ fq -d pg_heap -o flavour=postgres14 ".[0].tuples[0, -1]" 16994 ``` +### Authors +- Pavel Safonov +p.n.safonov@gmail.com +[@pnsafonov](https://github.com/pnsafonov) + ### References - https://www.postgresql.org/docs/current/storage-page-layout.html \ No newline at end of file