On 06/16/2009 09:51 PM, Robert Haas wrote:
On Tue, Jun 16, 2009 at 2:12 PM, Tom Lane<t...@sss.pgh.pa.us> wrote:
The main point here is that we have a pretty good idea of what
general-purpose client code is likely to want to do with the data,
and in a lot of cases that does not translate to having to know
each node type explicitly, so long as it can be categorized.
I agree. I'm just not seeing the need for an *explicit*
categorization contained within the data itself. For one thing,
AIUI, that's the job of things like an XML Schema, which Andres
Freund has already agreed to write, and I would expect that would be
of some value to tool-writers, else why are we creating it?
It defines how exactly the output has to look - thats not easily
readable out of explain.c - so anything that could be created and
validated with that schema should be acceptable by $tool - even if
explain may not create it.
Just like EBNF or similar for other languages.
It does not help categorizing values in planner/execution/whatever
categories automatedly by some tool though.
I attached a simple relaxng schema - if somebody likes another format
that should be generatable out of that (using trang). It surely could
use some more work, but I think its detailed enough for now.
I also think scalars and lists are recognizable without any
particular additional markup at all, just by introspection of the
contents.
That somewhat defies the usage of a strictly structured format? Perhaps
I am misunderstanding you though.
On another note it may be interesting to emit the current options to
explain in xml/json format - although that depends whether the option
syntax will be accepted.
Writing the schema I noticed something else I did not like about the
current format:
<Triggers>
<Trigger>
<Trigger>Name</Trigger>
or:
<Constraint>ConstraintName</Constraint>
</Trigger>
</Triggers>
The double usage of "<Trigger/>" seems to be somewhat ugly. Renaming it
to <TriggerName>/<ConstraintName> seems to be a good idea - at least
when staying at the current tag oriented style.
Andres
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
ns="http://www.postgresql.org/2009/explain">
<start>
<element name="explain">
<choice>
<ref name="QueryType"/>
<ref name="NotifyType"/>
<ref name="UtilityType"/>
</choice>
</element>
</start>
<define name="QueryType">
<element name="Query">
<ref name="PlanType"/>
<optional>
<ref name="TriggersType"/>
</optional>
<optional>
<element name="Total-Runtime"><text/></element>
</optional>
</element>
</define>
<define name="PlanType">
<element name="Plan">
<element name="Node-Type"> <text/></element>
<interleave>
<optional>
<element name="Join-Type">
<text/></element>
</optional>
<optional>
<element
name="Parent-Relationship"><text/></element>
</optional>
<optional>
<element
name="Parent-Label"><text/></element>
</optional>
<optional>
<element
name="Relation-Name"><text/></element>
</optional>
<optional>
<element name="Alias"><text/></element>
</optional>
<optional>
<element
name="Startup-Cost"><text/></element>
</optional>
<optional>
<element
name="Strategy"><text/></element>
</optional>
<optional>
<element
name="Total-Cost"><text/></element>
</optional>
<optional>
<element
name="Plan-Rows"><text/></element>
</optional>
<optional>
<element
name="Plan-Width"><text/></element>
</optional>
<optional>
<element
name="Actual-Startup-Time"><text/></element>
</optional>
<optional>
<element
name="Actual-Total-Time"><text/></element>
</optional>
<optional>
<element
name="Actual-Rows"><text/></element>
</optional>
<optional>
<element
name="Actual-Loops"><text/></element>
</optional>
<optional>
<element
name="Scan-Direction"><text/></element>
</optional>
<optional>
<element
name="Index-Name"><text/></element>
</optional>
<optional>
<element
name="Index-Cond"><text/></element>
</optional>
<optional>
<element
name="Tid-Cond"><text/></element>
</optional>
<optional>
<element
name="Hash-Cond"><text/></element>
</optional>
<optional>
<element
name="Recheck-Cond"><text/></element>
</optional>
<optional>
<element
name="Merge-Cond"><text/></element>
</optional>
<optional>
<element name="Filter"><text/></element>
</optional>
<optional>
<element
name="Join-Filter"><text/></element>
</optional>
<optional>
<element
name="One-Time-Filter"><text/></element>
</optional>
<optional>
<element
name="Sort-Method"><text/></element>
</optional>
<optional>
<element
name="Sort-Space-Used"><text/></element>
</optional>
<optional>
<element name="Sort-Keys">
<ref name="ItemListType"/>
</element>
</optional>
<optional>
<element name="Output">
<ref name="ItemListType"/>
</element>
</optional>
</interleave>
<optional>
<element name="Plans">
<oneOrMore>
<ref name="PlanType"/>
</oneOrMore>
</element>
</optional>
</element>
</define>
<define name="ItemListType">
<oneOrMore>
<element name="Item">
<text/>
</element>
</oneOrMore>
</define>
<define name="TriggersType">
<element name="Triggers">
<oneOrMore>
<element name="Trigger">
<choice>
<element
name="Constraint"><text/></element>
<element
name="Trigger"><text/></element>
</choice>
<element
name="Relation"><text/></element>
<element name="Time"><text/></element>
<element name="Calls"><text/></element>
</element>
</oneOrMore>
</element>
</define>
<define name="NotifyType">
<element name="Notify">
<empty/>
</element>
</define>
<define name="UtilityType">
<element name="Utility-Statement">
<empty/>
</element>
</define>
</grammar>
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers