Thread: BUG #4294: XML support: name() xpath function not working

BUG #4294: XML support: name() xpath function not working

From
"Enrico Sirola"
Date:
The following bug has been logged online:

Bug reference:      4294
Logged by:          Enrico Sirola
Email address:      enrico.sirola@gmail.com
PostgreSQL version: 8.3
Operating system:   OSX, Linux (RHEL5)
Description:        XML support: name() xpath function not working
Details:

it seems the name() xpath function doesn't work properly. Try, for example,
the following sql script:

create table test (test xml);
insert into test values ('<a
xmlns="http://myns.com/ns"><b>text1</b><c>text2</c></a>');
-- good
select xpath('/my:a/*[last()]', test, ARRAY[ARRAY['my',
'http://myns.com/ns']]) from test;
-- bad
select xpath('name(/my:a/*[last()])', test, ARRAY[ARRAY['my',
'http://myns.com/ns']]) from test;

It seems the libxml2 version and the OS used is not relevant. The problem
affects all pgsql versions >= 8.3.0

Best regards,
Enrico

Re: BUG #4294: XML support: name() xpath function not working

From
Simon Riggs
Date:
On Thu, 2008-07-10 at 08:52 +0000, Enrico Sirola wrote:

> create table test (test xml);
> insert into test values ('<a
> xmlns="http://myns.com/ns"><b>text1</b><c>text2</c></a>');
> -- good
> select xpath('/my:a/*[last()]', test, ARRAY[ARRAY['my',
> 'http://myns.com/ns']]) from test;
> -- bad
> select xpath('name(/my:a/*[last()])', test, ARRAY[ARRAY['my',
> 'http://myns.com/ns']]) from test;

What error messages are you getting?

Why do you think this should work? Best post a test case using another
tool, or a URL to an example.

--
 Simon Riggs           www.2ndQuadrant.com
 PostgreSQL Training, Services and Support

Re: BUG #4294: XML support: name() xpath function not working

From
Tom Lane
Date:
"Enrico Sirola" <enrico.sirola@gmail.com> writes:
> -- bad
> select xpath('name(/my:a/*[last()])', test, ARRAY[ARRAY['my',
> 'http://myns.com/ns']]) from test;

You could barely swat a fly with what I know about XPath ... but I'm
thinking that the culprit here is the crock at lines 3254-3288 of
xml.c, which explains itself thus:

    /*
     * To handle both documents and fragments, regardless of the fact whether
     * the XML datum has a single root (XML well-formedness), we wrap the XML
     * datum in a dummy element (<x>...</x>) and extend the XPath expression
     * accordingly.  To do it, throw away the XML prolog, if any.
     */

This code prefixes the given path expression with "/x", which of course
is going to break any expression that starts with a function name.  It
would have to stick the /x inside the function argument to have any
chance of working.  In general, I think this has zero chance of working
without implementing a pretty complete XPath parser.  We need to find
another way.

            regards, tom lane

Re: BUG #4294: XML support: name() xpath function not working

From
Bruce Momjian
Date:
Is there any TODO here?

---------------------------------------------------------------------------

Tom Lane wrote:
> "Enrico Sirola" <enrico.sirola@gmail.com> writes:
> > -- bad
> > select xpath('name(/my:a/*[last()])', test, ARRAY[ARRAY['my',
> > 'http://myns.com/ns']]) from test;
>
> You could barely swat a fly with what I know about XPath ... but I'm
> thinking that the culprit here is the crock at lines 3254-3288 of
> xml.c, which explains itself thus:
>
>     /*
>      * To handle both documents and fragments, regardless of the fact whether
>      * the XML datum has a single root (XML well-formedness), we wrap the XML
>      * datum in a dummy element (<x>...</x>) and extend the XPath expression
>      * accordingly.  To do it, throw away the XML prolog, if any.
>      */
>
> This code prefixes the given path expression with "/x", which of course
> is going to break any expression that starts with a function name.  It
> would have to stick the /x inside the function argument to have any
> chance of working.  In general, I think this has zero chance of working
> without implementing a pretty complete XPath parser.  We need to find
> another way.
>
>             regards, tom lane
>
> --
> Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-bugs

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +

Re: BUG #4294: XML support: name() xpath function not working

From
Tom Lane
Date:
Bruce Momjian <bruce@momjian.us> writes:
> Is there any TODO here?

It's clearly broken, if that's what you mean.  I don't know enough XPath
to speculate about an appropriate fix.

            regards, tom lane

Re: BUG #4294: XML support: name() xpath function not working

From
Bruce Momjian
Date:
Tom Lane wrote:
> Bruce Momjian <bruce@momjian.us> writes:
> > Is there any TODO here?
>
> It's clearly broken, if that's what you mean.  I don't know enough XPath
> to speculate about an appropriate fix.

The XML wiki already had bug reports about <x> so I added this report to
that list.

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +