2017-03-03 19:42 GMT+01:00 Pavel Stehule <pavel.steh...@gmail.com>:

>
>
> 2017-03-03 19:15 GMT+01:00 Alvaro Herrera <alvhe...@2ndquadrant.com>:
>
>> Pavel Stehule wrote:
>>
>> > attached update with fixed tests
>>
>> Heh, I noticed that you removed the libxml "context" lines that
>> differentiate xml.out from xml_2.out when doing this.  My implementation
>> emits those lines, so it was failing for me.  I restored them.
>>
>> I also changed a few things to avoid copying into TableFuncScanState
>> things that come from the TableFunc itself, since the executor state
>> node can grab them from the plan node.  Let's do that.  So instead of
>> "evalcols" the code now checks that the column list is empty; and also,
>> read the ordinality column number from the plan node.
>>
>> I have to bounce this back to you one more time, hopefully the last one
>> I hope.  Two things:
>>
>> 1. Please verify that pg_stat_statements behaves correctly.  The patch
>> doesn't have changes to contrib/ so without testing I'm guessing that it
>> doesn't work.  I think something very simple should do.
>>
>> 2. As I've complained many times, I find the way we manage an empty
>> COLUMNS clause pretty bad.  The standard doesn't require that syntax
>> (COLUMNS is required), and I don't like the implementation, so why not
>> provide the feature in a different way?  My proposal is to change the
>> column options in gram.y to be something like this:
>
>
> The clause COLUMNS is optional on Oracle and DB2
>
> So I prefer a Oracle, DB2 design. If you are strongly against it, then we
> can remove it to be ANSI/SQL only.
>
> I am don't see an good idea to introduce third syntax.
>
>
>> xmltable_column_option_el:
>>                         IDENT b_expr
>>                                 { $$ = makeDefElem($1, $2, @1); }
>>                         | DEFAULT b_expr
>>                                 { $$ = makeDefElem("default", $2, @1); }
>>                         | FULL VALUE_P
>>                                 { $$ = makeDefElem("full_value", NULL,
>> @1); }
>>                         | NOT NULL_P
>>                                 { $$ = makeDefElem("is_not_null", (Node
>> *) makeInteger(true), @1); }
>>                         | NULL_P
>>                                 { $$ = makeDefElem("is_not_null", (Node
>> *) makeInteger(false), @1); }
>>                 ;
>>
>> Note the FULL VALUE.  Then we can process it like
>>
>>                         else if (strcmp(defel->defname, "full_value") ==
>> 0)
>>                         {
>>                                 if (fc->colexpr != NULL)
>>                                         ereport(ERROR,
>>
>> (errcode(ERRCODE_SYNTAX_ERROR),
>>                                                          errmsg("FULL ROW
>> may not be specified together with PATH"),
>>
>>  parser_errposition(defel->location)));
>>                                 fc->full_row = true;
>>                         }
>>
>> So if you want the full XML value of the row, you have to specify it,
>>
>>  .. XMLTABLE ( ... COLUMNS ..., whole_row xml FULL VALUE, ... )
>>
>> This has the extra feature that you can add, say, an ORDINALITY column
>> together with the XML value, something that you cannot do with the
>> current implementation.
>>
>> It doesn't have to be FULL VALUE, but I couldn't think of anything
>> better.  (I didn't want to add any new keywords for this.)  If you have
>> a better idea, let's discuss.
>>
>
> I don't see a introduction own syntax as necessary solution here - use
> Oracle, DB2 compatible syntax, or ANSI.
>
> It is partially corner case - the benefit of this case is almost bigger
> compatibility with mentioned databases.
>
>
>>
>> Code-wise, this completely removes the "else" block in
>> transformRangeTableFunc
>> which I marked with an XXX comment.  That's a good thing -- let's get
>> rid of that.  Also, it should remove the need for the separate "if
>> !columns" case in tfuncLoadRows.  All those cases would become part of
>> the normal code path instead of special cases.  I think
>> XmlTableSetColumnFilter doesn't need any change (we just don't call if
>> for the FULL VALUE row); and XmlTableGetValue needs a special case that
>> if the column filter is NULL (i.e. SetColumnFilter wasn't called for
>> that column) then return the whole row.
>>
>>
>> Of course, this opens an implementation issue: how do you annotate
>> things from parse analysis till execution?  The current TableFunc
>> structure doesn't help, because there are only lists of column names and
>> expressions; and we can't use the case of a NULL colexpr, because that
>> case is already used by the column filter being the column name (a
>> feature required by the standard).  A simple way would be to have a new
>> "colno" struct member, to store a column number for the column marked
>> FULL VALUE (just like ordinalitycol).  This means you can't have more
>> than one of those FULL VALUE columns, but that seems okay.
>>
>>
>> (Of course, this means that the two cases that have no COLUMNS in the
>> "xmltable" production in gram.y should go away).
>>
>
> You are commiter, and you should to decide - as first I prefer current
> state, as second a remove this part - it should be good for you too,
> because code that you don't like will be left.
>
> I dislike introduce new syntax - this case is not too important for this.
>
>
I am able to prepare reduced version if we do a agreement

Regards

Pavel


> Regards
>
> Pavel
>
>
>> --
>> Álvaro Herrera                https://www.2ndQuadrant.com/
>> PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
>>
>
>

Reply via email to