The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Revision history for Pg-Explain

1.13    2021/08/03
        - New functionality:
          - Nodes have now ->id() method which returns numeric value, which is
            unique within explain
          - Explain object can call ->node( ID ) to get node with specified ID
          - Parse properly metainformation about InitPlans (name, and what it
            returns)
        - Fixes:
          - Fix generating of text representation of plans with worktable scan
            nodes.
          - Fix exclusive time calculations for plans with InitPlans and CTEs
          - Speedup of parsing of some edge-case plans

1.12    2021/07/18
        - New functionality:
          - Parse GUC settings from plans, per:
            https://gitlab.com/depesz/Pg--Explain/-/issues/11
          - Helper script (dump.pl) - change it so that substructs are dumped
            at the end
        - Fixes:
          - Fix exclusive buffers calcualtion, per:
            https://gitlab.com/depesz/explain.depesz.com/-/issues/24
          - Remove various warnings that can happen with badly wrapped plans
          - Remove warning when parsing plans with VERY long lines (over 60k
            characters)

1.11    2021/07/04
        - Added parsing of Buffers info

1.10    2021/06/08
        - Add a way to get total number of rows returned by node over multiple
          loops or workers ($node->total_rows)
        - Add method (total_removed_rows) which shows how many rows were
          removed in given node by one of:
            - Conflict Filter
            - Filter
            - Index Recheck
            - Join Filter

1.09    2021/06/07
        - Fix parsing of planning/execution time in case of "quoted" plans and
          no trailing new line.
        - Add extraction of:
          - Conflicting Tuples
          - Conflict Arbiter Indexes
          - Conflict Filter
          - Conflict Resolution
          - Filter
          - Join Filter
          - Recheck Cond
          - Rows Removed by Conflict Filter
          - Rows Removed by Filter
          - Rows Removed by Index Recheck
          - Rows Removed by Join Filter
          - Tuples Inserted
          from non-text plans.

1.08    2021/05/15
        - Provide links to bugtracker and homepage for CPAN
        per report from Eugen Konkov

1.07    2021/04/14
        - Parse query text from auto-explain plans.
        Missing functionality reported by Jamey Courtney.

1.06    2021/03/03
        - Fixed handling of Backward (Index|Index Only) Scans in non-text plans.
        Bug reported by Yaroslav Schekin (ysch) on IRC.

1.05    2021/02/18
        - Add parsing of JIT information from plans in all four formats (text, json, yaml, xml)

1.04    2020/12/21
        - Add handling of autoexplain plans in non-text formats.
        Apparently autoexplain logs plans that are different from normal
        explain command when using json/yaml/xml.
        Problem reported by Robert Emery.

1.03    2020/09/17
        - Fix bug in parsing json/yaml/xml plans that contained Function Scans

1.02    2020/07/27
        - Fix bug with preserving whitespace in anonymized queries

1.01    2020/07/27
        - Make it possible to anonymize queries using the same anonymization
          engine that is used to anonymize plan.

1.00    2020/06/06
        - Make generated text explains more like Pg
        - Parse planning time from explains from PostgreSQL 13

0.99    2020/04/23
        - Fix requirements for tests

0.98    2020/04/17
        - Add links to git repo for cpan tools (by Tom Hukins)
        - Fix parsing plans with tabs instead of spaces (by Pierre GIRAUD)

0.97    2020/04/03
        - Allow parsing of plans inside psql generated frames
        - Provide a way to easily get all subnodes, including subnodes of subnodes
        - Provide a way to easily get parents of given node
        - Remove unnecessary Data::Dumper loads in tests
        - Assume plans should be in UTF-8

0.96    2020/03/23
        - Performance optimizations
        - Fix handling of certains misaligned plans
        - Fix heuristics to detect JSON plans
        - Fix some errors in parsing plans

0.95    2020/03/16
        - Add parsing/anonymization of Tid Scans,
        per gripe from Chris West.

0.94    2020/03/16
        - Add initial handling of plans with hard line wraps.

0.93    2020/02/26
        - Add handling for MixedAggregate to json/yaml formats.
          Per gripe from RhodiumToad.

0.92    2020/02/18
        - Recognize various Aggregate nodes from non-text explains.
          Per bug report from RhodiumToad.

0.91    2020/01/07
        - Make all times be wall-clock times. That is - take into account
          number of parallel workers
        - Re-add version to all libs, to make cpan happy

0.90    2019/11/12
        - Fix display of heap fetches from json (https://gitlab.com/depesz/explain.depesz.com/issues/15)
        - Move global data (planning/execution/total time, trigger info) from top_node to explain object itself
        - Add method to easily get real total, wall-clock, runtime of query.
        - Add Pg::Explain::Analyzer, so far it can extract node types and their "paths"
        - Add scripts to run perltidy, start development tmux env, and explain schema dumper
        - Fix handling of parallel queries (hopefully)
        - Remove edge-case deep recursion error
        - Speed optimization for large explains

0.81    2019/08/26
        # Remove trailing whitespace - it makes next line matches MUCH faster.
        $line =~ s/\s*\z//;

        - Handle properly single-line JSON plans
        per report from William Meitzen
        - Fix MANIFEST file, so it passes tests
        - Fix message on missing Test::PerlTidy module
        - Fix code formatting (perltidy)

0.80    2019/06/18
        - Allow parsing of plans with COSTS disabled.
        per gripe from Marc
        - Properly parse WorkTable Scans
        per gripe from Ivan Vergiliev

0.79    2019/06/12
        - Added parsing of "Planning time", "Execution time", and "Trigger
        time"

0.78    2019/03/29
        - Fix parsing of json explain, when there is no trailing new line
          character.
          Bug reported by Grenville Wilson.

0.77    2018/08/09
        - Add missing information to data when parsing json/yaml plans
          Code provided by Filip RembiaƂkowski

0.76    2018/02/05
        - Recognize properly parallel index scans and their table/index info
          Problem reported by Matthijs van der Vleuten

0.75    2017/11/29
        - Change inclusive time calculation for parallel nodes to calculate
          wall clock time, and not total time used.
          Problem reported by Bricklen Anderson.

0.74    2017/06/20
        - Fix extracting subquery name (problem reported by Jackson Popkin)
        - Switch from using Digest::SHA1 to Digest::SHA

0.73    2016/02/08
        - Add anonymization of grouping keys

0.72    2015/10/13
        - Add anonymization of subquery scan names

0.71    2014/06/04
        - Fix missing dependency, no functional changes

0.70    2014/06/03
        - Allow parsing of plans without timing information, per request from Karl Bartel

0.69    2014/06/08
        - Anonymize CTE names, per gripe from Brian Dunavant

0.68    2013/10/01
        - Fix extracting of table/index info from "Index Only Scan" nodes from
        YAML/XML/JSON explains.
        Bug reported by David Wheeler (justatheory)

0.67    2013/05/24
        - Fix anonymization of Index Only Scans
        - Fix perlcritic tests

0.66    2013/03/30
        - Fix anonymization of One-time filter: lines.

0.65    2012/11/08
        - Fix anonymization of tables in explains of modifying queries (insert/update/delete)
        - Fix anonymization of function names in function scans

0.64    2012/08/22
        - Fix handling of really large number of estimated rows (over 2^53)

0.63    2012/07/08
        - Anonymize names of files used by foreign tables
        - Anonymize names of foreign tables
        - Anonymize names of columns when dealing with EXPLAIN ANALYZE VERBOSE output with "Output: a, b, c" lines

0.62    2012/01/31
        - Stop anonymize from changing typecasts to standard pg types

0.61    2011/06/20
        - Add handling of plans with trailing " character, but without leading " character.

0.60    2011/06/11
        - Added anonymization of plans.
        - Make it possible to generate textual plan from parsed one

0.54    2011/05/31
        - Make the parsing run fast in Mojolicious environment
        - Fix MANIFEST.SKIP to include .git

0.53    2011/05/19
        - Allow explain lines to be inside ' characters (some client does that, not sure which)
        - Add missing "use Carp;"

0.52    2011/04/30
        - Fix for handling windows-style end-of-line markers in pgAdmin output.
          Bug reported by Dave Jarvis.

0.51    2011/03/26
        - Fix calculation of exclusive time of nodes with CTE

0.50    2011/03/26
        - Add support for CTE in plans

        2011/03/25
        - Add ability to parse XML plans
        - Add ability to parse JSON plans
        - Add ability to parse YAML plans
        - Add filter to make it possible to parse explains from pgAdmin3

0.20    2011/03/19
        - Remove usage of Moose. It's faster, and will not cause unrelated test failures in CPAN reports.

0.11    2010/12/16 23:34
        - Improve calculation of exclusive times, plus minor fixes [patch by filip.rembialkowski@gmail.com].

0.10    2010-03-17 14:15:59
        - Add handling for new "SubPlan" lines, which contain numeric ID of scan.

0.09    2009-05-27 13:15
        - Fix exclusive time calculations
        - Make PE::Node understand Bitmap scans (heap and index)
        - Add proper handling of nodes that were "never executed"
        - Add ->is_analyzed method to PE::Node to make it easy to distinguish between EXPLAIN and EXPLAIN ANALYZE nodes

0.08    2008-11-24 21:11
        - Add missing documentation

0.07    2008-11-18 11:42
        - Added missing dependancy - responsible for most of fails in cpan tests
        - Changed the way to detect error thrown by autodie when opening file fails
        - Renamed test plans to make them sort nicely
        - New functionality: PE::Node->total_inclusive_time
        - New functionality: PE::Node->total_exclusive_time
        - New tests

0.06    2008-11-15 21:27
        Name changed to Pg::Explain after conversation on IRC. Main points:
        - Pg is shorter
        - Pg already exists
        - Pg is used already by PostgreSQL related modules

0.05    2008-11-11 17:01
        Add handling of init and subplans. Added more test. Refactorig of parsing method. Basic functionality done.

0.04    2008-10-27 00:40
        Add handling of subnodes. Add extraction of scan info for "Index Scan Backward" nodes.

0.03    2008-10-26 21:25
        Make it parse index scans, handle basic extra-info, remove dependency on YAML, and make tests using Test::Deep.

0.02    2008-10-19 20:07
        More tests, and changes to make it more Moose-way

0.01    2008-10-19 15:56
        First version, Not much of functionality now, but builds, and passes simple test.