Revision history for Pg-Explain 2.9 2025/04/07 Add handling if JIT timings with subelements, like: Timing: Generation 0.327 ms (Deform 0.131 ms), Inlining 15.092 ms, Optimization 11.314 ms, Emission 4.356 ms, Total 31.089 ms 2.8 2025/02/28 Handle fractional rowcounts, per change in PostgreSQL 18. 2.7 2023/12/29 Properly handle various I/O Timings formats per information from Michael Paquier 2.6 2023/01/26 - Fix handling of Planning I/O timings per report from Christoph Berg 2.5 2023/01/16 - Fix handling of non-ascii characters in json and yaml plans per report from James Courtney - Update copyright 2.4 2022/11/12 - Allow easy anonymization of extra strings using built-in anonymizer 2.3 2022/10/21 - Fix extracting settings from verbose plan Per report from Yaroslav Schekin 2.2 2022/09/25 - Handle WorkTable Scans in non-text plans. Per report from Jamey Courtney 2.1 2022/03/07 - Add hints for seq scans with multiple conditions joined with AND, if the conditions are equality checks (INDEXABLE_SEQSCAN_MULTI_EQUAL_AND) 2.0 2022/02/11 - Add Pg::Explain::Hinter to look through Pg::Explain plans, and suggest optimizations. For now two automatically found optimizations are there: - DISK_SORT - when there is Sort node that is using disk sort - INDEXABLE_SEQSCAN_SIMPLE - when there is Seq Scan (or Parallel Seq Scan) that is using simple expression on one column that can be indexed - Fix dependency on List::Util by requiring v. 1.44+ - use JSON::MaybeXS instead of JSON, due to talk on irc/#mojo (suggestion by ether with comments from Grinnz) 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.