summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrien nayrat <adrien.nayrat@gmail.com>2023-04-04 12:49:08 +0200
committerGitHub <noreply@github.com>2023-04-04 12:49:08 +0200
commitef0abbaece522732031d61391567c017d48d87b7 (patch)
treef392c944eb11f8d271aa686deef2ffa66031c58d
parent3c6e2af8fbc44bb1ef77389d09118c37faea8746 (diff)
downloadpygments-git-ef0abbaece522732031d61391567c017d48d87b7.tar.gz
Add PostgreSQL Explain lexer (#2398)
This lexer add support for PostgreSQL Explain plan : https://www.postgresql.org/docs/current/sql-explain.html This was heavily inspired by Maxence Ahlouche work, thanks to him : https://github.com/maahl/pg_explain_lexer Co-authored-by: Jean Abou Samra <jean@abou-samra.fr>
-rw-r--r--AUTHORS4
-rw-r--r--pygments/lexers/_mapping.py1
-rw-r--r--pygments/lexers/_postgres_builtins.py55
-rw-r--r--pygments/lexers/sql.py194
-rw-r--r--tests/examplefiles/postgres-explain/plan.txt148
-rw-r--r--tests/examplefiles/postgres-explain/plan.txt.output2727
6 files changed, 3125 insertions, 4 deletions
diff --git a/AUTHORS b/AUTHORS
index e80bd121..8dd42e2d 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -11,6 +11,7 @@ Other contributors, listed alphabetically, are:
* Ali Afshar -- image formatter
* Thomas Aglassinger -- Easytrieve, JCL, Rexx, Transact-SQL and VBScript
lexers
+* Maxence Ahlouche -- PostgreSQL Explain lexer
* Muthiah Annamalai -- Ezhil lexer
* Kumar Appaiah -- Debian control lexer
* Andreas Amann -- AppleScript lexer
@@ -162,6 +163,7 @@ Other contributors, listed alphabetically, are:
* Paulo Moura -- Logtalk lexer
* Mher Movsisyan -- DTD lexer
* Dejan Muhamedagic -- Crmsh lexer
+* Adrien Nayrat -- PostgreSQL Explain lexer
* Ana Nelson -- Ragel, ANTLR, R console lexers
* David Neto, Google LLC -- WebGPU Shading Language lexer
* Kurt Neufeld -- Markdown lexer
@@ -191,7 +193,7 @@ Other contributors, listed alphabetically, are:
* Justin Reidy -- MXML lexer
* Norman Richards -- JSON lexer
* Corey Richardson -- Rust lexer updates
-* Fabrizio Riguzzi -- cplint leder
+* Fabrizio Riguzzi -- cplint leder
* Lubomir Rintel -- GoodData MAQL and CL lexers
* Andre Roberge -- Tango style
* Georg Rollinger -- HSAIL lexer
diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py
index ed3d00b1..94d4f312 100644
--- a/pygments/lexers/_mapping.py
+++ b/pygments/lexers/_mapping.py
@@ -370,6 +370,7 @@ LEXERS = {
'PortugolLexer': ('pygments.lexers.pascal', 'Portugol', ('portugol',), ('*.alg', '*.portugol'), ()),
'PostScriptLexer': ('pygments.lexers.graphics', 'PostScript', ('postscript', 'postscr'), ('*.ps', '*.eps'), ('application/postscript',)),
'PostgresConsoleLexer': ('pygments.lexers.sql', 'PostgreSQL console (psql)', ('psql', 'postgresql-console', 'postgres-console'), (), ('text/x-postgresql-psql',)),
+ 'PostgresExplainLexer': ('pygments.lexers.sql', 'PostgreSQL EXPLAIN dialect', ('postgres-explain',), ('*.explain',), ('text/x-postgresql-explain',)),
'PostgresLexer': ('pygments.lexers.sql', 'PostgreSQL SQL dialect', ('postgresql', 'postgres'), (), ('text/x-postgresql',)),
'PovrayLexer': ('pygments.lexers.graphics', 'POVRay', ('pov',), ('*.pov', '*.inc'), ('text/x-povray',)),
'PowerShellLexer': ('pygments.lexers.shell', 'PowerShell', ('powershell', 'pwsh', 'posh', 'ps1', 'psm1'), ('*.ps1', '*.psm1'), ('text/x-powershell',)),
diff --git a/pygments/lexers/_postgres_builtins.py b/pygments/lexers/_postgres_builtins.py
index 86fd3998..ecc2a7ee 100644
--- a/pygments/lexers/_postgres_builtins.py
+++ b/pygments/lexers/_postgres_builtins.py
@@ -571,6 +571,61 @@ PLPGSQL_KEYWORDS = (
'RETURN', 'REVERSE', 'SQLSTATE', 'WHILE',
)
+# Most of these keywords are from ExplainNode function
+# in src/backend/commands/explain.c
+
+EXPLAIN_KEYWORDS = (
+ 'Aggregate',
+ 'Append',
+ 'Bitmap Heap Scan',
+ 'Bitmap Index Scan',
+ 'BitmapAnd',
+ 'BitmapOr',
+ 'CTE Scan',
+ 'Custom Scan',
+ 'Delete',
+ 'Foreign Scan',
+ 'Function Scan',
+ 'Gather Merge',
+ 'Gather',
+ 'Group',
+ 'GroupAggregate',
+ 'Hash Join',
+ 'Hash',
+ 'HashAggregate',
+ 'Incremental Sort',
+ 'Index Only Scan',
+ 'Index Scan',
+ 'Insert',
+ 'Limit',
+ 'LockRows',
+ 'Materialize',
+ 'Memoize',
+ 'Merge Append',
+ 'Merge Join',
+ 'Merge',
+ 'MixedAggregate',
+ 'Named Tuplestore Scan',
+ 'Nested Loop',
+ 'ProjectSet',
+ 'Recursive Union',
+ 'Result',
+ 'Sample Scan',
+ 'Seq Scan',
+ 'SetOp',
+ 'Sort',
+ 'SubPlan',
+ 'Subquery Scan',
+ 'Table Function Scan',
+ 'Tid Range Scan',
+ 'Tid Scan',
+ 'Unique',
+ 'Update',
+ 'Values Scan',
+ 'WindowAgg',
+ 'WorkTable Scan',
+)
+
if __name__ == '__main__': # pragma: no cover
import re
diff --git a/pygments/lexers/sql.py b/pygments/lexers/sql.py
index 87dc638e..ace512be 100644
--- a/pygments/lexers/sql.py
+++ b/pygments/lexers/sql.py
@@ -30,6 +30,9 @@
- highlights errors in the output and notification levels;
- handles psql backslash commands.
+ `PostgresExplainLexer`
+ A lexer to highlight Postgres execution plan.
+
The ``tests/examplefiles`` contains a few test files with data to be
parsed by these lexers.
@@ -45,7 +48,7 @@ from pygments.token import Punctuation, Whitespace, Text, Comment, Operator, \
from pygments.lexers import get_lexer_by_name, ClassNotFound
from pygments.lexers._postgres_builtins import KEYWORDS, DATATYPES, \
- PSEUDO_TYPES, PLPGSQL_KEYWORDS
+ PSEUDO_TYPES, PLPGSQL_KEYWORDS, EXPLAIN_KEYWORDS
from pygments.lexers._mysql_builtins import \
MYSQL_CONSTANTS, \
MYSQL_DATATYPES, \
@@ -57,8 +60,8 @@ from pygments.lexers import _tsql_builtins
__all__ = ['PostgresLexer', 'PlPgsqlLexer', 'PostgresConsoleLexer',
- 'SqlLexer', 'TransactSqlLexer', 'MySqlLexer',
- 'SqliteConsoleLexer', 'RqlLexer']
+ 'PostgresExplainLexer', 'SqlLexer', 'TransactSqlLexer',
+ 'MySqlLexer', 'SqliteConsoleLexer', 'RqlLexer']
line_re = re.compile('.*?\n')
sqlite_prompt_re = re.compile(r'^(?:sqlite| ...)>(?= )')
@@ -368,6 +371,191 @@ class PostgresConsoleLexer(Lexer):
return
+class PostgresExplainLexer(RegexLexer):
+ """
+ Handle PostgreSQL EXPLAIN output
+
+ """
+
+ name = 'PostgreSQL EXPLAIN dialect'
+ aliases = ['postgres-explain']
+ filenames = ['*.explain']
+ mimetypes = ['text/x-postgresql-explain']
+
+ tokens = {
+ 'root': [
+ (r'(:|\(|\)|ms|kB|->|\.\.|\,)', Punctuation),
+ (r'(\s+)', Whitespace),
+
+ # This match estimated cost and effectively measured counters with ANALYZE
+ # Then, we move to instrumentation state
+ (r'(cost)(=?)', bygroups(Name.Class, Punctuation), 'instrumentation'),
+ (r'(actual)( )(=?)', bygroups(Name.Class, Whitespace, Punctuation), 'instrumentation'),
+
+ # Misc keywords
+ (words(('actual', 'Memory Usage', 'Memory', 'Buckets', 'Batches',
+ 'originally', 'row', 'rows', 'Hits', 'Misses',
+ 'Evictions', 'Overflows'), suffix=r'\b'),
+ Comment.Single),
+
+ (r'(hit|read|dirtied|written|write|time|calls)(=)', bygroups(Comment.Single, Operator)),
+ (r'(shared|temp|local)', Keyword.Pseudo),
+
+ # We move to sort state in order to emphasize specific keywords (especially disk access)
+ (r'(Sort Method)(: )', bygroups(Comment.Preproc, Punctuation), 'sort'),
+
+ # These keywords can be followed by an object, like a table
+ (r'(Sort Key|Group Key|Presorted Key|Hash Key)(:)( )',
+ bygroups(Comment.Preproc, Punctuation, Whitespace), 'object_name'),
+ (r'(Cache Key|Cache Mode)(:)( )', bygroups(Comment, Punctuation, Whitespace), 'object_name'),
+
+ # These keywords can be followed by a predicate
+ (words(('Join Filter', 'Subplans Removed', 'Filter', 'Merge Cond',
+ 'Hash Cond', 'Index Cond', 'Recheck Cond', 'Heap Blocks',
+ 'TID Cond', 'Run Condition', 'Order By', 'Function Call',
+ 'Table Function Call', 'Inner Unique', 'Params Evaluated',
+ 'Single Copy', 'Sampling', 'One-Time Filter', 'Output',
+ 'Relations', 'Remote SQL'), suffix=r'\b'),
+ Comment.Preproc, 'predicate'),
+
+ # Special keyword to handle ON CONFLICT
+ (r'Conflict ', Comment.Preproc, 'conflict'),
+
+ # Special keyword for InitPlan or SubPlan
+ (r'(InitPlan|SubPlan)( )(\d+)( )',
+ bygroups(Keyword, Whitespace, Number.Integer, Whitespace),
+ 'init_plan'),
+
+ (words(('Sort Method', 'Join Filter', 'Planning time',
+ 'Planning Time', 'Execution time', 'Execution Time',
+ 'Workers Planned', 'Workers Launched', 'Buffers',
+ 'Planning', 'Worker', 'Query Identifier', 'Time',
+ 'Full-sort Groups'), suffix=r'\b'), Comment.Preproc),
+
+ # Emphasize these keywords
+
+ (words(('Rows Removed by Join Filter', 'Rows Removed by Filter',
+ 'Rows Removed by Index Recheck',
+ 'Heap Fetches', 'never executed'),
+ suffix=r'\b'), Name.Exception),
+ (r'(I/O Timings)(:)( )', bygroups(Name.Exception, Punctuation, Whitespace)),
+
+ (words(EXPLAIN_KEYWORDS, suffix=r'\b'), Keyword),
+
+ # join keywords
+ (r'((Right|Left|Full|Semi|Anti) Join)', Keyword.Type),
+ (r'(Parallel |Async |Finalize |Partial )', Comment.Preproc),
+ (r'Backward', Comment.Preproc),
+ (r'(Intersect|Except|Hash)', Comment.Preproc),
+
+ (r'(CTE)( )(\w*)?', bygroups(Comment, Whitespace, Name.Variable)),
+
+
+ # Treat "on" and "using" as a punctuation
+ (r'(on|using)', Punctuation, 'object_name'),
+
+
+ # strings
+ (r"'(''|[^'])*'", String.Single),
+ # numbers
+ (r'\d+\.\d+', Number.Float),
+ (r'(\d+)', Number.Integer),
+
+ # boolean
+ (r'(true|false)', Name.Constant),
+ # explain header
+ (r'\s*QUERY PLAN\s*\n\s*-+', Comment.Single),
+ # Settings
+ (r'(Settings)(:)( )', bygroups(Comment.Preproc, Punctuation, Whitespace), 'setting'),
+
+ # Handle JIT counters
+ (r'(JIT|Functions|Options|Timing)(:)', bygroups(Comment.Preproc, Punctuation)),
+ (r'(Inlining|Optimization|Expressions|Deforming|Generation|Emission|Total)', Keyword.Pseudo),
+
+ # Handle Triggers counters
+ (r'(Trigger)( )(\S*)(:)( )',
+ bygroups(Comment.Preproc, Whitespace, Name.Variable, Punctuation, Whitespace)),
+
+ ],
+ 'expression': [
+ # matches any kind of parenthesized expression
+ # the first opening paren is matched by the 'caller'
+ (r'\(', Punctuation, '#push'),
+ (r'\)', Punctuation, '#pop'),
+ (r'(never executed)', Name.Exception),
+ (r'[^)(]+', Comment),
+ ],
+ 'object_name': [
+
+ # This is a cost or analyze measure
+ (r'(\(cost)(=?)', bygroups(Name.Class, Punctuation), 'instrumentation'),
+ (r'(\(actual)( )(=?)', bygroups(Name.Class, Whitespace, Punctuation), 'instrumentation'),
+
+ # if object_name is parenthesized, mark opening paren as
+ # punctuation, call 'expression', and exit state
+ (r'\(', Punctuation, 'expression'),
+ (r'(on)', Punctuation),
+ # matches possibly schema-qualified table and column names
+ (r'\w+(\.\w+)*( USING \S+| \w+ USING \S+)', Name.Variable),
+ (r'\"?\w+\"?(?:\.\"?\w+\"?)?', Name.Variable),
+ (r'\'\S*\'', Name.Variable),
+
+ # if we encounter a comma, another object is listed
+ (r',\n', Punctuation, 'object_name'),
+ (r',', Punctuation, 'object_name'),
+
+ # special case: "*SELECT*"
+ (r'"\*SELECT\*( \d+)?"(.\w+)?', Name.Variable),
+ (r'"\*VALUES\*(_\d+)?"(.\w+)?', Name.Variable),
+ (r'"ANY_subquery"', Name.Variable),
+
+ # Variable $1 ...
+ (r'\$\d+', Name.Variable),
+ # cast
+ (r'::\w+', Name.Variable),
+ (r' +', Whitespace),
+ (r'"', Punctuation),
+ (r'\[\.\.\.\]', Punctuation),
+ (r'\)', Punctuation, '#pop'),
+ ],
+ 'predicate': [
+ # if predicate is parenthesized, mark paren as punctuation
+ (r'(\()([^\n]*)(\))', bygroups(Punctuation, Name.Variable, Punctuation), '#pop'),
+ # otherwise color until newline
+ (r'[^\n]*', Name.Variable, '#pop'),
+ ],
+ 'instrumentation': [
+ (r'=|\.\.', Punctuation),
+ (r' +', Whitespace),
+ (r'(rows|width|time|loops)', Name.Class),
+ (r'\d+\.\d+', Number.Float),
+ (r'(\d+)', Number.Integer),
+ (r'\)', Punctuation, '#pop'),
+ ],
+ 'conflict': [
+ (r'(Resolution: )(\w+)', bygroups(Comment.Preproc, Name.Variable)),
+ (r'(Arbiter \w+:)', Comment.Preproc, 'object_name'),
+ (r'(Filter: )', Comment.Preproc, 'predicate'),
+ ],
+ 'setting': [
+ (r'([a-z_]*?)(\s*)(=)(\s*)(\'.*?\')', bygroups(Name.Attribute, Whitespace, Operator, Whitespace, String)),
+ (r'\, ', Punctuation),
+ ],
+ 'init_plan': [
+ (r'\(', Punctuation),
+ (r'returns \$\d+(,\$\d+)?', Name.Variable),
+ (r'\)', Punctuation, '#pop'),
+ ],
+ 'sort': [
+ (r':|kB', Punctuation),
+ (r'(quicksort|top-N|heapsort|Average|Memory|Peak)', Comment.Prepoc),
+ (r'(external|merge|Disk|sort)', Name.Exception),
+ (r'(\d+)', Number.Integer),
+ (r' +', Whitespace),
+ ],
+ }
+
+
class SqlLexer(RegexLexer):
"""
Lexer for Structured Query Language. Currently, this lexer does
diff --git a/tests/examplefiles/postgres-explain/plan.txt b/tests/examplefiles/postgres-explain/plan.txt
new file mode 100644
index 00000000..f3d0d0a3
--- /dev/null
+++ b/tests/examplefiles/postgres-explain/plan.txt
@@ -0,0 +1,148 @@
+Unique (cost=49756390.50..52412720.47 rows=265632997 width=44) (actual rows=16963 loops=1)
+ Buffers: shared hit=484 read=869278 dirtied=782137 written=782104, temp read=1864338 written=1864338
+ -> Sort (cost=49756390.50..50420472.99 rows=265632997 width=44) (actual rows=389203091 loops=1)
+ Sort Key: four.india, four.quebec, four.romeo
+ Sort Method: external merge Disk: 14914368kB
+ Buffers: shared hit=484 read=869278 dirtied=782137 written=782104, temp read=1864338 written=1864338
+ -> Append (cost=1074.72..7801815.20 rows=265632997 width=44) (actual rows=389203091 loops=1)
+ Buffers: shared hit=475 read=869278 dirtied=782137 written=782104
+ -> Hash Join (cost=1074.72..5144647.71 rows=265632995 width=28) (actual rows=389203089 loops=1)
+ Hash Cond: (mike.romeo = four.romeo)
+ Buffers: shared read=869212 dirtied=782137 written=782104
+ -> Seq Scan on mike (cost=0.00..1630351.96 rows=76168096 width=4) (actual rows=76329862 loops=1)
+ Buffers: shared read=868671 dirtied=782137 written=782104
+ -> Hash (cost=778.21..778.21 rows=23721 width=28) (actual rows=23752 loops=1)
+ Buckets: 32768 Batches: 1 Memory Usage: 1676kB
+ Buffers: shared read=541
+ -> Seq Scan on four (cost=0.00..778.21 rows=23721 width=28) (actual rows=23753 loops=1)
+ Buffers: shared read=541
+ -> Seq Scan on four papa (cost=0.00..837.51 rows=2 width=28) (actual rows=2 loops=1)
+ Filter: ((quebec)::text = 'echo'::text)
+ Rows Removed by Filter: 23751
+ Buffers: shared hit=475 read=66
+
+Unique (cost=35743307.84..37168307.40 rows=142499956 width=48) (actual rows=8336122 loops=1)
+ Buffers: shared hit=10664 read=1223591, temp read=1439499 written=1032459
+ -> Sort (cost=35743307.84..36099557.73 rows=142499956 width=48) (actual rows=131104186 loops=1)
+ Sort Key: lima.tango_xray, lima.quebec, lima.xray
+ Sort Method: external merge Disk: 5874440kB
+ Buffers: shared hit=10664 read=1223591, temp read=1439499 written=1032459
+ -> Append (cost=9917231.73..13876757.50 rows=142499956 width=48) (actual rows=131104186 loops=1)
+ Buffers: shared hit=10664 read=1223591, temp read=705180 written=298140
+ -> Merge Join (cost=9917231.73..12113535.56 rows=142499955 width=32) (actual rows=131104184 loops=1)
+ Merge Cond: (lima.xray = tango_mike.xray)
+ Buffers: shared read=911596, temp read=705180 written=298140
+ -> Sort (cost=1855656.88..1885891.23 rows=12093737 width=32) (actual rows=12125134 loops=1)
+ Sort Key: lima.xray
+ Sort Method: quicksort Memory: 1340493kB
+ Buffers: shared read=312027
+ -> Seq Scan on lima (cost=0.00..432964.37 rows=12093737 width=32) (actual rows=12125134 loops=1)
+ Buffers: shared read=312027
+ -> Sort (cost=8060359.88..8195110.08 rows=53900080 width=8) (actual rows=131104540 loops=1)
+ Sort Key: tango_mike.xray
+ Sort Method: external sort Disk: 1192552kB
+ Buffers: shared read=599569, temp read=501699 written=298140
+ -> Seq Scan on tango_mike (cost=0.00..1138569.80 rows=53900080 width=8) (actual rows=55453373 loops=1)
+ Buffers: shared read=599569
+ -> Gather (cost=1000.00..338222.39 rows=1 width=32) (actual rows=2 loops=1)
+ Workers Planned: 6
+ Workers Launched: 6
+ Buffers: shared hit=10664 read=311995
+ -> Parallel Seq Scan on lima golf (cost=0.00..337222.29 rows=1 width=32) (actual rows=0 loops=7)
+ Filter: ((quebec)::text = 'echo'::text)
+ Rows Removed by Filter: 1732162
+ Buffers: shared hit=122 read=311995
+
+Group (cost=4164445.30..4175997.52 rows=385074 width=264) (actual time=206821.675..206875.256 rows=4486 loops=1)
+ Group Key: echo_whiskey0.kilo_bravo, [...]
+ Buffers: shared hit=1390631 read=993857 written=40265, local hit=26
+ I/O Timings: read=1567607.774 write=488.689
+ -> Sort (cost=4164445.30..4165407.98 rows=385074 width=264) (actual time=206821.611..206872.674 rows=4669 loops=1)
+ Sort Key: echo_whiskey0.kilo_bravo,[...]
+ Sort Method: quicksort Memory: 1737kB
+ Buffers: shared hit=1390631 read=993857 written=40265, local hit=26
+ I/O Timings: read=1567607.774 write=488.689
+ -> Hash Semi Join (cost=61200.47..4128720.49 rows=385074 width=264) (actual time=2241.552..206857.688 rows=4669 loops=1)
+ Hash Cond: ((echo_whiskey0.papa)::text = (golf.hotel)::text)
+ Buffers: shared hit=1390628 read=993857 written=40265, local hit=26
+ I/O Timings: read=1567607.774 write=488.689
+ -> Gather (cost=61043.48..4123268.73 rows=385074 width=232) (actual time=1487.139..206127.826 rows=380948 loops=1)
+ Workers Planned: 7
+ Workers Launched: 7
+ Buffers: shared hit=1390628 read=993857 written=40265
+ I/O Timings: read=1567607.774 write=488.689
+ -> Parallel Hash Join (cost=60043.48..4083761.33 rows=55011 width=232) (actual time=1479.129..206052.797 rows=47618 loops=8)
+ Hash Cond: (echo_whiskey0.victor_romeo = zulu_alpha1.delta)
+ Buffers: shared hit=1390628 read=993857 written=40265
+ I/O Timings: read=1567607.774 write=488.689
+ -> Parallel Hash Join (cost=58129.39..4081317.34 rows=55011 width=202) (actual time=882.995..205409.189 rows=47618 loops=8)
+ Hash Cond: (echo_whiskey0.romeo = zulu_alpha1kilo_oscar1.delta)
+ Buffers: shared hit=1390051 read=992531 written=40265
+ I/O Timings: read=1567535.726 write=488.689
+ -> Nested Loop (cost=56215.30..4078873.35 rows=55011 width=172) (actual time=880.305..205357.815 rows=47618 loops=8)
+ Buffers: shared hit=1388344 read=992531 written=40265
+ I/O Timings: read=1567535.726 write=488.689
+ -> Hash Join (cost=56214.87..3978622.48 rows=55011 width=176) (actual time=841.911..65184.969 rows=47618 loops=8)
+ Hash Cond: (echo_whiskey0.charlie_india = whiskey_delta0.charlie_india)
+ Buffers: shared hit=2842 read=854234 written=34524
+ I/O Timings: read=499073.802 write=421.296
+ -> Hash Join (cost=55668.42..3977931.56 rows=55011 width=132) (actual time=789.705..65085.512 rows=47618 loops=8)
+ Hash Cond: (echo_whiskey0.whiskey_six = juliet01.whiskey_six)
+ -> Parallel Bitmap Heap Scan on p_fait_radio_qdoc p_fait_radio_qdoc0
+ Buffers: shared hit=357 read=853879 written=34524
+ I/O Timings: read=499028.808 write=421.296
+ -> (cost=55614.03..3976535.39 rows=211114 width=104) (cost=0.00..0.00 rows=0 width=0) (actual time=789.126..64998.813 rows=188462 loops=8)
+ Recheck Cond: ((kilo_bravo >= 'two'::date) AND (kilo_bravo < 'tango'::date))
+ Filter: (((charlie_oscar)::text = 'xray'::text) AND ((six_foxtrot)::text = 'november'::text))
+ Rows Removed by Filter: 140321
+ Heap Blocks: exact=106838
+ -> Bitmap Index Scan on p_fait_radio_qdoc_dt_examen_idx
+ Buffers: shared hit=8 read=853879 written=34524
+ I/O Timings: read=499028.808 write=421.296
+ -> (cost=0.00..55244.59 rows=2632802 width=0) (cost=0.00..0.00 rows=0 width=0) (actual time=538.316..538.325 rows=2630265 loops=1)
+ Index Cond: ((kilo_bravo >= 'two'::date) AND (kilo_bravo < 'tango'::date))
+ Buffers: shared hit=3 read=7191
+ I/O Timings: read=87.617
+ -> Hash (cost=51.99..51.99 rows=191 width=36) (actual time=0.526..0.532 rows=191 loops=8)
+ Buckets: 1024 Batches: 1 Memory Usage: 23kB
+ Buffers: shared hit=349
+ -> Seq Scan on juliet yankee (cost=0.00..51.99 rows=191 width=36) (actual time=0.070..0.492 rows=191 loops=8)
+ Filter: ((victor_tango)::text = ANY ('{"seven_tango",[...]))
+ Rows Removed by Filter: 542
+ Buffers: shared hit=349
+ -> Hash (cost=440.09..440.09 rows=8509 width=52) (actual time=52.166..52.167 rows=8509 loops=8)
+ Buckets: 16384 Batches: 1 Memory Usage: 842kB
+ Buffers: shared hit=2485 read=355
+ I/O Timings: read=44.994
+ -> Seq Scan on whiskey_delta kilo_six (cost=0.00..440.09 rows=8509 width=52) (actual time=24.144..50.757 rows=8509 loops=8)
+ Buffers: shared hit=2485 read=355
+ I/O Timings: read=44.994
+ -> Index Only Scan using echo_mike on seven_delta six_yankee (cost=0.43..1.82 rows=1 width=4) (actual time=2.942..2.942 rows=1 loops=380948)
+ Index Cond: (three = echo_whiskey0.three)
+ Heap Fetches: 380948
+ Buffers: shared hit=1385502 read=138297 written=5741
+ I/O Timings: read=1068461.924 write=67.392
+ -> Parallel Hash (cost=1799.04..1799.04 rows=9204 width=38) (actual time=2.613..2.614 rows=1956 loops=8)
+ Buckets: 16384 Batches: 1 Memory Usage: 1376kB
+ Buffers: shared hit=1707
+ -> Parallel Seq Scan on oscar zulu_hotel (cost=0.00..1799.04 rows=9204 width=38) (actual time=0.019..1.744 rows=1956 loops=8)
+ Buffers: shared hit=1707
+ -> Parallel Hash (cost=1799.04..1799.04 rows=9204 width=38) (actual time=595.923..595.925 rows=1956 loops=8)
+ Buckets: 16384 Batches: 1 Memory Usage: 1504kB
+ Buffers: shared hit=381 read=1326
+ I/O Timings: read=72.048
+ -> Parallel Seq Scan on oscar quebec (cost=0.00..1799.04 rows=9204 width=38) (actual time=485.918..495.799 rows=1956 loops=8)
+ Buffers: shared hit=381 read=1326
+ I/O Timings: read=72.048
+ -> Hash (cost=84.22..84.22 rows=5822 width=8) (actual time=611.099..611.105 rows=5822 loops=1)
+ Buckets: 8192 Batches: 1 Memory Usage: 292kB
+ Buffers: local hit=26
+ -> Seq Scan on golf (cost=0.00..84.22 rows=5822 width=8) (actual time=0.010..0.317 rows=5822 loops=1)
+ Buffers: local hit=26
+Planning time: 2.748 ms
+JIT:
+ Functions: 361
+ Options: Expressions true, Deforming true, Optimization true, Inlining true
+ Timing: Inlining 289.335 ms, Optimization 2473.925 ms, Total 4530.841 ms, Generation 43.386 ms, Emission 1724.195 ms
+Execution time: 206882.405 ms
+
diff --git a/tests/examplefiles/postgres-explain/plan.txt.output b/tests/examplefiles/postgres-explain/plan.txt.output
new file mode 100644
index 00000000..64cea719
--- /dev/null
+++ b/tests/examplefiles/postgres-explain/plan.txt.output
@@ -0,0 +1,2727 @@
+'Unique' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'49756390.50' Literal.Number.Float
+'..' Punctuation
+'52412720.47' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'265632997' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'44' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'16963' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'484' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'869278' Literal.Number.Integer
+' ' Text.Whitespace
+'dirtied' Comment.Single
+'=' Operator
+'782137' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'782104' Literal.Number.Integer
+',' Punctuation
+' ' Text.Whitespace
+'temp' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1864338' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'1864338' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Sort' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'49756390.50' Literal.Number.Float
+'..' Punctuation
+'50420472.99' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'265632997' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'44' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'389203091' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Sort Key' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'four.india' Name.Variable
+',' Punctuation
+' ' Text.Whitespace
+'four.quebec' Name.Variable
+',' Punctuation
+' ' Text.Whitespace
+'four.romeo' Name.Variable
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Sort Method' Comment.Preproc
+': ' Punctuation
+'external' Name.Exception
+' ' Text.Whitespace
+'merge' Name.Exception
+' ' Text.Whitespace
+'Disk' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'14914368' Literal.Number.Integer
+'kB' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'484' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'869278' Literal.Number.Integer
+' ' Text.Whitespace
+'dirtied' Comment.Single
+'=' Operator
+'782137' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'782104' Literal.Number.Integer
+',' Punctuation
+' ' Text.Whitespace
+'temp' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1864338' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'1864338' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Append' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'1074.72' Literal.Number.Float
+'..' Punctuation
+'7801815.20' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'265632997' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'44' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'389203091' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'475' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'869278' Literal.Number.Integer
+' ' Text.Whitespace
+'dirtied' Comment.Single
+'=' Operator
+'782137' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'782104' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Hash Join' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'1074.72' Literal.Number.Float
+'..' Punctuation
+'5144647.71' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'265632995' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'28' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'389203089' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Hash Cond' Comment.Preproc
+': (mike.romeo = four.romeo)' Name.Variable
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'869212' Literal.Number.Integer
+' ' Text.Whitespace
+'dirtied' Comment.Single
+'=' Operator
+'782137' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'782104' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Seq Scan' Keyword
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'mike' Name.Variable
+' ' Text.Whitespace
+'(cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'1630351.96' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'76168096' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'4' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'76329862' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'868671' Literal.Number.Integer
+' ' Text.Whitespace
+'dirtied' Comment.Single
+'=' Operator
+'782137' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'782104' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Hash' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'778.21' Literal.Number.Float
+'..' Punctuation
+'778.21' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'23721' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'28' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'23752' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Buckets' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'32768' Literal.Number.Integer
+' ' Text.Whitespace
+'Batches' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'1' Literal.Number.Integer
+' ' Text.Whitespace
+'Memory Usage' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'1676' Literal.Number.Integer
+'kB' Punctuation
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'541' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Seq Scan' Keyword
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'four' Name.Variable
+' ' Text.Whitespace
+'(cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'778.21' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'23721' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'28' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'23753' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'541' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Seq Scan' Keyword
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'four' Name.Variable
+' ' Text.Whitespace
+'papa' Name.Variable
+' ' Text.Whitespace
+'(cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'837.51' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'2' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'28' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'2' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Filter' Comment.Preproc
+": ((quebec)::text = 'echo'::text)" Name.Variable
+'\n ' Text.Whitespace
+'Rows Removed by Filter' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'23751' Literal.Number.Integer
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'475' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'66' Literal.Number.Integer
+'\n\n' Text.Whitespace
+
+'Unique' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'35743307.84' Literal.Number.Float
+'..' Punctuation
+'37168307.40' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'142499956' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'48' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'8336122' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'10664' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1223591' Literal.Number.Integer
+',' Punctuation
+' ' Text.Whitespace
+'temp' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1439499' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'1032459' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Sort' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'35743307.84' Literal.Number.Float
+'..' Punctuation
+'36099557.73' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'142499956' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'48' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'131104186' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Sort Key' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'lima.tango_xray' Name.Variable
+',' Punctuation
+' ' Text.Whitespace
+'lima.quebec' Name.Variable
+',' Punctuation
+' ' Text.Whitespace
+'lima.xray' Name.Variable
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Sort Method' Comment.Preproc
+': ' Punctuation
+'external' Name.Exception
+' ' Text.Whitespace
+'merge' Name.Exception
+' ' Text.Whitespace
+'Disk' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'5874440' Literal.Number.Integer
+'kB' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'10664' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1223591' Literal.Number.Integer
+',' Punctuation
+' ' Text.Whitespace
+'temp' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1439499' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'1032459' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Append' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'9917231.73' Literal.Number.Float
+'..' Punctuation
+'13876757.50' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'142499956' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'48' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'131104186' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'10664' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1223591' Literal.Number.Integer
+',' Punctuation
+' ' Text.Whitespace
+'temp' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'705180' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'298140' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Merge Join' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'9917231.73' Literal.Number.Float
+'..' Punctuation
+'12113535.56' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'142499955' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'32' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'131104184' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Merge Cond' Comment.Preproc
+': (lima.xray = tango_mike.xray)' Name.Variable
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'911596' Literal.Number.Integer
+',' Punctuation
+' ' Text.Whitespace
+'temp' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'705180' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'298140' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Sort' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'1855656.88' Literal.Number.Float
+'..' Punctuation
+'1885891.23' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'12093737' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'32' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'12125134' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Sort Key' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'lima.xray' Name.Variable
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Sort Method' Comment.Preproc
+': ' Punctuation
+'quicksort' Comment.Prepoc
+' ' Text.Whitespace
+'Memory' Comment.Prepoc
+':' Punctuation
+' ' Text.Whitespace
+'1340493' Literal.Number.Integer
+'kB' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'312027' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Seq Scan' Keyword
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'lima' Name.Variable
+' ' Text.Whitespace
+'(cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'432964.37' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'12093737' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'32' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'12125134' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'312027' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Sort' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'8060359.88' Literal.Number.Float
+'..' Punctuation
+'8195110.08' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'53900080' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'131104540' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Sort Key' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'tango_mike.xray' Name.Variable
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Sort Method' Comment.Preproc
+': ' Punctuation
+'external' Name.Exception
+' ' Text.Whitespace
+'sort' Name.Exception
+' ' Text.Whitespace
+'Disk' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'1192552' Literal.Number.Integer
+'kB' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'599569' Literal.Number.Integer
+',' Punctuation
+' ' Text.Whitespace
+'temp' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'501699' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'298140' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Seq Scan' Keyword
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'tango_mike' Name.Variable
+' ' Text.Whitespace
+'(cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'1138569.80' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'53900080' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'55453373' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'599569' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Gather' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'1000.00' Literal.Number.Float
+'..' Punctuation
+'338222.39' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'32' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'2' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Workers Planned' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'6' Literal.Number.Integer
+'\n ' Text.Whitespace
+'Workers Launched' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'6' Literal.Number.Integer
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'10664' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'311995' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Parallel ' Comment.Preproc
+'Seq Scan' Keyword
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'lima' Name.Variable
+' ' Text.Whitespace
+'golf' Name.Variable
+' ' Text.Whitespace
+'(cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'337222.29' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'32' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(actual' Name.Class
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'0' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'7' Literal.Number.Integer
+')' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Filter' Comment.Preproc
+": ((quebec)::text = 'echo'::text)" Name.Variable
+'\n ' Text.Whitespace
+'Rows Removed by Filter' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'1732162' Literal.Number.Integer
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'122' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'311995' Literal.Number.Integer
+'\n\n' Text.Whitespace
+
+'Group' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'4164445.30' Literal.Number.Float
+'..' Punctuation
+'4175997.52' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'385074' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'264' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'206821.675' Literal.Number.Float
+'..' Punctuation
+'206875.256' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'4486' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Group Key' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'echo_whiskey0.kilo_bravo' Name.Variable
+',' Punctuation
+' ' Text.Whitespace
+'[...]' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'1390631' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'993857' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'40265' Literal.Number.Integer
+',' Punctuation
+' ' Text.Whitespace
+'local' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'26' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1567607.774' Literal.Number.Float
+' ' Text.Whitespace
+'write' Comment.Single
+'=' Operator
+'488.689' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Sort' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'4164445.30' Literal.Number.Float
+'..' Punctuation
+'4165407.98' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'385074' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'264' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'206821.611' Literal.Number.Float
+'..' Punctuation
+'206872.674' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'4669' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Sort Key' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'echo_whiskey0.kilo_bravo' Name.Variable
+',' Punctuation
+'[...]' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Sort Method' Comment.Preproc
+': ' Punctuation
+'quicksort' Comment.Prepoc
+' ' Text.Whitespace
+'Memory' Comment.Prepoc
+':' Punctuation
+' ' Text.Whitespace
+'1737' Literal.Number.Integer
+'kB' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'1390631' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'993857' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'40265' Literal.Number.Integer
+',' Punctuation
+' ' Text.Whitespace
+'local' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'26' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1567607.774' Literal.Number.Float
+' ' Text.Whitespace
+'write' Comment.Single
+'=' Operator
+'488.689' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Hash' Keyword
+' ' Text.Whitespace
+'Semi Join' Keyword.Type
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'61200.47' Literal.Number.Float
+'..' Punctuation
+'4128720.49' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'385074' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'264' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'2241.552' Literal.Number.Float
+'..' Punctuation
+'206857.688' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'4669' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Hash Cond' Comment.Preproc
+': ((echo_whiskey0.papa)::text = (golf.hotel)::text)' Name.Variable
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'1390628' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'993857' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'40265' Literal.Number.Integer
+',' Punctuation
+' ' Text.Whitespace
+'local' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'26' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1567607.774' Literal.Number.Float
+' ' Text.Whitespace
+'write' Comment.Single
+'=' Operator
+'488.689' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Gather' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'61043.48' Literal.Number.Float
+'..' Punctuation
+'4123268.73' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'385074' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'232' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'1487.139' Literal.Number.Float
+'..' Punctuation
+'206127.826' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'380948' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Workers Planned' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'7' Literal.Number.Integer
+'\n ' Text.Whitespace
+'Workers Launched' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'7' Literal.Number.Integer
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'1390628' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'993857' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'40265' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1567607.774' Literal.Number.Float
+' ' Text.Whitespace
+'write' Comment.Single
+'=' Operator
+'488.689' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Parallel ' Comment.Preproc
+'Hash Join' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'60043.48' Literal.Number.Float
+'..' Punctuation
+'4083761.33' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'55011' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'232' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'1479.129' Literal.Number.Float
+'..' Punctuation
+'206052.797' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'47618' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Hash Cond' Comment.Preproc
+': (echo_whiskey0.victor_romeo = zulu_alpha1.delta)' Name.Variable
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'1390628' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'993857' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'40265' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1567607.774' Literal.Number.Float
+' ' Text.Whitespace
+'write' Comment.Single
+'=' Operator
+'488.689' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Parallel ' Comment.Preproc
+'Hash Join' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'58129.39' Literal.Number.Float
+'..' Punctuation
+'4081317.34' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'55011' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'202' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'882.995' Literal.Number.Float
+'..' Punctuation
+'205409.189' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'47618' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Hash Cond' Comment.Preproc
+': (echo_whiskey0.romeo = zulu_alpha1kilo_oscar1.delta)' Name.Variable
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'1390051' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'992531' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'40265' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1567535.726' Literal.Number.Float
+' ' Text.Whitespace
+'write' Comment.Single
+'=' Operator
+'488.689' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Nested Loop' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'56215.30' Literal.Number.Float
+'..' Punctuation
+'4078873.35' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'55011' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'172' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'880.305' Literal.Number.Float
+'..' Punctuation
+'205357.815' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'47618' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'1388344' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'992531' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'40265' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1567535.726' Literal.Number.Float
+' ' Text.Whitespace
+'write' Comment.Single
+'=' Operator
+'488.689' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Hash Join' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'56214.87' Literal.Number.Float
+'..' Punctuation
+'3978622.48' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'55011' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'176' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'841.911' Literal.Number.Float
+'..' Punctuation
+'65184.969' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'47618' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Hash Cond' Comment.Preproc
+': (echo_whiskey0.charlie_india = whiskey_delta0.charlie_india)' Name.Variable
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'2842' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'854234' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'34524' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'499073.802' Literal.Number.Float
+' ' Text.Whitespace
+'write' Comment.Single
+'=' Operator
+'421.296' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Hash Join' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'55668.42' Literal.Number.Float
+'..' Punctuation
+'3977931.56' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'55011' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'132' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'789.705' Literal.Number.Float
+'..' Punctuation
+'65085.512' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'47618' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Hash Cond' Comment.Preproc
+': (echo_whiskey0.whiskey_six = juliet01.whiskey_six)' Name.Variable
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Parallel ' Comment.Preproc
+'Bitmap Heap Scan' Keyword
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'p_fait_radio_qdoc' Name.Variable
+' ' Text.Whitespace
+'p_fait_radio_qdoc0' Name.Variable
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'357' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'853879' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'34524' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'499028.808' Literal.Number.Float
+' ' Text.Whitespace
+'write' Comment.Single
+'=' Operator
+'421.296' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'55614.03' Literal.Number.Float
+'..' Punctuation
+'3976535.39' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'211114' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'104' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'0.00' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'0' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'0' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'789.126' Literal.Number.Float
+'..' Punctuation
+'64998.813' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'188462' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Recheck Cond' Comment.Preproc
+": ((kilo_bravo >= 'two'::date) AND (kilo_bravo < 'tango'::date))" Name.Variable
+'\n ' Text.Whitespace
+'Filter' Comment.Preproc
+": (((charlie_oscar)::text = 'xray'::text) AND ((six_foxtrot)::text = 'november'::text))" Name.Variable
+'\n ' Text.Whitespace
+'Rows Removed by Filter' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'140321' Literal.Number.Integer
+'\n ' Text.Whitespace
+'Heap Blocks' Comment.Preproc
+': exact=106838' Name.Variable
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Bitmap Index Scan' Keyword
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'p_fait_radio_qdoc_dt_examen_idx' Name.Variable
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'8' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'853879' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'34524' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'499028.808' Literal.Number.Float
+' ' Text.Whitespace
+'write' Comment.Single
+'=' Operator
+'421.296' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'55244.59' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'2632802' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'0' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'0.00' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'0' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'0' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'538.316' Literal.Number.Float
+'..' Punctuation
+'538.325' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'2630265' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Index Cond' Comment.Preproc
+": ((kilo_bravo >= 'two'::date) AND (kilo_bravo < 'tango'::date))" Name.Variable
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'3' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'7191' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'87.617' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Hash' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'51.99' Literal.Number.Float
+'..' Punctuation
+'51.99' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'191' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'36' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'0.526' Literal.Number.Float
+'..' Punctuation
+'0.532' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'191' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Buckets' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'1024' Literal.Number.Integer
+' ' Text.Whitespace
+'Batches' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'1' Literal.Number.Integer
+' ' Text.Whitespace
+'Memory Usage' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'23' Literal.Number.Integer
+'kB' Punctuation
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'349' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Seq Scan' Keyword
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'juliet' Name.Variable
+' ' Text.Whitespace
+'yankee' Name.Variable
+' ' Text.Whitespace
+'(cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'51.99' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'191' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'36' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'0.070' Literal.Number.Float
+'..' Punctuation
+'0.492' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'191' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Filter' Comment.Preproc
+': ((victor_tango)::text = ANY (\'{"seven_tango",[...]))' Name.Variable
+'\n ' Text.Whitespace
+'Rows Removed by Filter' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'542' Literal.Number.Integer
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'349' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Hash' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'440.09' Literal.Number.Float
+'..' Punctuation
+'440.09' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'8509' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'52' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'52.166' Literal.Number.Float
+'..' Punctuation
+'52.167' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'8509' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Buckets' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'16384' Literal.Number.Integer
+' ' Text.Whitespace
+'Batches' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'1' Literal.Number.Integer
+' ' Text.Whitespace
+'Memory Usage' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'842' Literal.Number.Integer
+'kB' Punctuation
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'2485' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'355' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'44.994' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Seq Scan' Keyword
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'whiskey_delta' Name.Variable
+' ' Text.Whitespace
+'kilo_six' Name.Variable
+' ' Text.Whitespace
+'(cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'440.09' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'8509' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'52' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'24.144' Literal.Number.Float
+'..' Punctuation
+'50.757' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'8509' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'2485' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'355' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'44.994' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Index Only Scan' Keyword
+' ' Text.Whitespace
+'using' Punctuation
+' ' Text.Whitespace
+'echo_mike' Name.Variable
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'seven_delta' Name.Variable
+' ' Text.Whitespace
+'six_yankee' Name.Variable
+' ' Text.Whitespace
+'(cost' Name.Class
+'=' Punctuation
+'0.43' Literal.Number.Float
+'..' Punctuation
+'1.82' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'4' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'2.942' Literal.Number.Float
+'..' Punctuation
+'2.942' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'380948' Literal.Number.Integer
+')' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Index Cond' Comment.Preproc
+': (three = echo_whiskey0.three)' Name.Variable
+'\n ' Text.Whitespace
+'Heap Fetches' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'380948' Literal.Number.Integer
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'1385502' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'138297' Literal.Number.Integer
+' ' Text.Whitespace
+'written' Comment.Single
+'=' Operator
+'5741' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1068461.924' Literal.Number.Float
+' ' Text.Whitespace
+'write' Comment.Single
+'=' Operator
+'67.392' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Parallel ' Comment.Preproc
+'Hash' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'1799.04' Literal.Number.Float
+'..' Punctuation
+'1799.04' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'9204' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'38' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'2.613' Literal.Number.Float
+'..' Punctuation
+'2.614' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'1956' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Buckets' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'16384' Literal.Number.Integer
+' ' Text.Whitespace
+'Batches' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'1' Literal.Number.Integer
+' ' Text.Whitespace
+'Memory Usage' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'1376' Literal.Number.Integer
+'kB' Punctuation
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'1707' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Parallel ' Comment.Preproc
+'Seq Scan' Keyword
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'oscar' Name.Variable
+' ' Text.Whitespace
+'zulu_hotel' Name.Variable
+' ' Text.Whitespace
+'(cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'1799.04' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'9204' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'38' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'0.019' Literal.Number.Float
+'..' Punctuation
+'1.744' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'1956' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'1707' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Parallel ' Comment.Preproc
+'Hash' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'1799.04' Literal.Number.Float
+'..' Punctuation
+'1799.04' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'9204' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'38' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'595.923' Literal.Number.Float
+'..' Punctuation
+'595.925' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'1956' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Buckets' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'16384' Literal.Number.Integer
+' ' Text.Whitespace
+'Batches' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'1' Literal.Number.Integer
+' ' Text.Whitespace
+'Memory Usage' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'1504' Literal.Number.Integer
+'kB' Punctuation
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'381' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1326' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'72.048' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Parallel ' Comment.Preproc
+'Seq Scan' Keyword
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'oscar' Name.Variable
+' ' Text.Whitespace
+'quebec' Name.Variable
+' ' Text.Whitespace
+'(cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'1799.04' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'9204' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'38' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'485.918' Literal.Number.Float
+'..' Punctuation
+'495.799' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'1956' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'shared' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'381' Literal.Number.Integer
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'1326' Literal.Number.Integer
+'\n ' Text.Whitespace
+'I/O Timings' Name.Exception
+':' Punctuation
+' ' Text.Whitespace
+'read' Comment.Single
+'=' Operator
+'72.048' Literal.Number.Float
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Hash' Keyword
+' ' Text.Whitespace
+'(' Punctuation
+'cost' Name.Class
+'=' Punctuation
+'84.22' Literal.Number.Float
+'..' Punctuation
+'84.22' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'5822' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(' Punctuation
+'actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'611.099' Literal.Number.Float
+'..' Punctuation
+'611.105' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'5822' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n ' Text.Whitespace
+'Buckets' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'8192' Literal.Number.Integer
+' ' Text.Whitespace
+'Batches' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'1' Literal.Number.Integer
+' ' Text.Whitespace
+'Memory Usage' Comment.Single
+':' Punctuation
+' ' Text.Whitespace
+'292' Literal.Number.Integer
+'kB' Punctuation
+'\n ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'local' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'26' Literal.Number.Integer
+'\n ' Text.Whitespace
+'->' Punctuation
+' ' Text.Whitespace
+'Seq Scan' Keyword
+' ' Text.Whitespace
+'on' Punctuation
+' ' Text.Whitespace
+'golf' Name.Variable
+' ' Text.Whitespace
+'(cost' Name.Class
+'=' Punctuation
+'0.00' Literal.Number.Float
+'..' Punctuation
+'84.22' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'5822' Literal.Number.Integer
+' ' Text.Whitespace
+'width' Name.Class
+'=' Punctuation
+'8' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'(actual' Name.Class
+' ' Text.Whitespace
+'time' Name.Class
+'=' Punctuation
+'0.010' Literal.Number.Float
+'..' Punctuation
+'0.317' Literal.Number.Float
+' ' Text.Whitespace
+'rows' Name.Class
+'=' Punctuation
+'5822' Literal.Number.Integer
+' ' Text.Whitespace
+'loops' Name.Class
+'=' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Buffers' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'local' Keyword.Pseudo
+' ' Text.Whitespace
+'hit' Comment.Single
+'=' Operator
+'26' Literal.Number.Integer
+'\n' Text.Whitespace
+
+'Planning time' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'2.748' Literal.Number.Float
+' ' Text.Whitespace
+'ms' Punctuation
+'\n' Text.Whitespace
+
+'JIT' Comment.Preproc
+':' Punctuation
+'\n ' Text.Whitespace
+'Functions' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'361' Literal.Number.Integer
+'\n ' Text.Whitespace
+'Options' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'Expressions' Keyword.Pseudo
+' ' Text.Whitespace
+'true' Name.Constant
+',' Punctuation
+' ' Text.Whitespace
+'Deforming' Keyword.Pseudo
+' ' Text.Whitespace
+'true' Name.Constant
+',' Punctuation
+' ' Text.Whitespace
+'Optimization' Keyword.Pseudo
+' ' Text.Whitespace
+'true' Name.Constant
+',' Punctuation
+' ' Text.Whitespace
+'Inlining' Keyword.Pseudo
+' ' Text.Whitespace
+'true' Name.Constant
+'\n ' Text.Whitespace
+'Timing' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'Inlining' Keyword.Pseudo
+' ' Text.Whitespace
+'289.335' Literal.Number.Float
+' ' Text.Whitespace
+'ms' Punctuation
+',' Punctuation
+' ' Text.Whitespace
+'Optimization' Keyword.Pseudo
+' ' Text.Whitespace
+'2473.925' Literal.Number.Float
+' ' Text.Whitespace
+'ms' Punctuation
+',' Punctuation
+' ' Text.Whitespace
+'Total' Keyword.Pseudo
+' ' Text.Whitespace
+'4530.841' Literal.Number.Float
+' ' Text.Whitespace
+'ms' Punctuation
+',' Punctuation
+' ' Text.Whitespace
+'Generation' Keyword.Pseudo
+' ' Text.Whitespace
+'43.386' Literal.Number.Float
+' ' Text.Whitespace
+'ms' Punctuation
+',' Punctuation
+' ' Text.Whitespace
+'Emission' Keyword.Pseudo
+' ' Text.Whitespace
+'1724.195' Literal.Number.Float
+' ' Text.Whitespace
+'ms' Punctuation
+'\n' Text.Whitespace
+
+'Execution time' Comment.Preproc
+':' Punctuation
+' ' Text.Whitespace
+'206882.405' Literal.Number.Float
+' ' Text.Whitespace
+'ms' Punctuation
+'\n' Text.Whitespace