mirror of
https://github.com/postgres/postgres.git
synced 2025-11-04 20:11:56 +03:00
Support XMLTABLE query expression
XMLTABLE is defined by the SQL/XML standard as a feature that allows turning XML-formatted data into relational form, so that it can be used as a <table primary> in the FROM clause of a query. This new construct provides significant simplicity and performance benefit for XML data processing; what in a client-side custom implementation was reported to take 20 minutes can be executed in 400ms using XMLTABLE. (The same functionality was said to take 10 seconds using nested PostgreSQL XPath function calls, and 5 seconds using XMLReader under PL/Python). The implemented syntax deviates slightly from what the standard requires. First, the standard indicates that the PASSING clause is optional and that multiple XML input documents may be given to it; we make it mandatory and accept a single document only. Second, we don't currently support a default namespace to be specified. This implementation relies on a new executor node based on a hardcoded method table. (Because the grammar is fixed, there is no extensibility in the current approach; further constructs can be implemented on top of this such as JSON_TABLE, but they require changes to core code.) Author: Pavel Stehule, Álvaro Herrera Extensively reviewed by: Craig Ringer Discussion: https://postgr.es/m/CAFj8pRAgfzMD-LoSmnMGybD0WsEznLHWap8DO79+-GTRAPR4qA@mail.gmail.com
This commit is contained in:
@@ -554,6 +554,39 @@ typedef struct RangeFunction
|
||||
* of function returning RECORD */
|
||||
} RangeFunction;
|
||||
|
||||
/*
|
||||
* RangeTableFunc - raw form of "table functions" such as XMLTABLE
|
||||
*/
|
||||
typedef struct RangeTableFunc
|
||||
{
|
||||
NodeTag type;
|
||||
bool lateral; /* does it have LATERAL prefix? */
|
||||
Node *docexpr; /* document expression */
|
||||
Node *rowexpr; /* row generator expression */
|
||||
List *namespaces; /* list of namespaces as ResTarget */
|
||||
List *columns; /* list of RangeTableFuncCol */
|
||||
Alias *alias; /* table alias & optional column aliases */
|
||||
int location; /* token location, or -1 if unknown */
|
||||
} RangeTableFunc;
|
||||
|
||||
/*
|
||||
* RangeTableFuncCol - one column in a RangeTableFunc->columns
|
||||
*
|
||||
* If for_ordinality is true (FOR ORDINALITY), then the column is an int4
|
||||
* column and the rest of the fields are ignored.
|
||||
*/
|
||||
typedef struct RangeTableFuncCol
|
||||
{
|
||||
NodeTag type;
|
||||
char *colname; /* name of generated column */
|
||||
TypeName *typeName; /* type of generated column */
|
||||
bool for_ordinality; /* does it have FOR ORDINALITY? */
|
||||
bool is_not_null; /* does it have NOT NULL? */
|
||||
Node *colexpr; /* column filter expression */
|
||||
Node *coldefexpr; /* column default value expression */
|
||||
int location; /* token location, or -1 if unknown */
|
||||
} RangeTableFuncCol;
|
||||
|
||||
/*
|
||||
* RangeTableSample - TABLESAMPLE appearing in a raw FROM clause
|
||||
*
|
||||
@@ -871,6 +904,7 @@ typedef enum RTEKind
|
||||
RTE_SUBQUERY, /* subquery in FROM */
|
||||
RTE_JOIN, /* join */
|
||||
RTE_FUNCTION, /* function in FROM */
|
||||
RTE_TABLEFUNC, /* TableFunc(.., column list) */
|
||||
RTE_VALUES, /* VALUES (<exprlist>), (<exprlist>), ... */
|
||||
RTE_CTE /* common table expr (WITH list element) */
|
||||
} RTEKind;
|
||||
@@ -931,6 +965,11 @@ typedef struct RangeTblEntry
|
||||
List *functions; /* list of RangeTblFunction nodes */
|
||||
bool funcordinality; /* is this called WITH ORDINALITY? */
|
||||
|
||||
/*
|
||||
* Fields valid for a TableFunc RTE (else NULL):
|
||||
*/
|
||||
TableFunc *tablefunc;
|
||||
|
||||
/*
|
||||
* Fields valid for a values RTE (else NIL):
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user