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

Reply via email to