diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index c386be1..76c2ec8 100644 --- a/src/backend/executor/execQual.c +++ b/src/backend/executor/execQual.c @@ -4505,8 +4505,18 @@ ExecEvalCurrentOfExpr(ExprState *exprstate, ExprContext *econtext, } /* ---------------------------------------------------------------- - * ExecEvalTableExpr + * ExecEvalTableExprProtected and ExecEvalTableExpr * + * Evaluate a TableExpr node. ExecEvalTableExprProtected is called + * from ExecEvalTableExpr from PG_TRY(), PG_CATCH() block be ensured + * all allocated memory be released. + * + * It creates TableExprBuilder object, does all necessary settings and + * reads all tuples from this object. Is possible to go over this + * cycle more times per query - when LATERAL JOIN is used. On the end + * of cycle, the TableExprBuilder object is destroyed, state pointer + * to this object is cleaned, and related memory context is resetted. + * New call starts new cycle. * ---------------------------------------------------------------- */ static Datum @@ -4682,6 +4692,12 @@ ExecEvalTableExprProtected(TableExprState * tstate, return result; } +/* + * ExecEvalTableExpr - this is envelop of ExecEvalTableExprProtected() function. + * + * This function ensures releasing all TableBuilder context and related + * memory context, when ExecEvalTableExprProtected fails on exception. + */ static Datum ExecEvalTableExpr(TableExprState * tstate, ExprContext *econtext, diff --git a/src/include/executor/tableexpr.h b/src/include/executor/tableexpr.h index ad5d8e2..3056317 100644 --- a/src/include/executor/tableexpr.h +++ b/src/include/executor/tableexpr.h @@ -20,27 +20,37 @@ * for generating content of table-expression functions like * XMLTABLE. * - * CreateContext is called before execution and it does query level - * initialization. Returns pointer to private TableExprBuilder data - * (context). A query context should be active in call time. A param - * missing_columns is true, when a user doesn't specify returned - * columns. + * The TableBuilder is initialized by calling CreateContext function + * at evaluation time. First parameter - tuple descriptor describes + * produced (expected) table. in_functions is a array of FmgrInfo input + * functions for types of columns of produced table. The typioparams + * is a array of typio Oids for types of columns of produced table. + * The created context is living in special memory context passed + * as last parameter. * - * AddNs add namespace info when namespaces are is supported. - * then passed namespace is default namespace. Namespaces should be - * passed before Row/Column Paths setting. When name is NULL, then - * related uri is default namespace. + * The SetContent function is used for passing input document to + * table builder. The table builder handler knows expected format + * and it can do some additional transformations that are not propagated + * out from table builder. * - * SetRowPath sets a row generating filter. + * The AddNs add namespace info when namespaces are supported. + * Namespaces should be passed before Row/Column Paths setting. + * When name is NULL, then related uri is default namespace. * - * SetColumnPath sets a column generating filter. + * The SetRowPath sets a row generating filter. This filter is used + * for separation of rows from document. Passed as cstring. * - * FetchRow ensure loading row raleted data. Returns false, when - * document doesn't containt any next data. + * The SetColumnPath sets a column generating filter. This filter is + * used for separating nth value from row. Passed as cstring. * - * GetValue returns a value related to colnum column. + * The FetchRow ensure loading row raleted data. Returns false, when + * document doesn't containt any next row. * - * DestroyContext - release all memory + * The GetValue returns a value related to colnum column. + * + * The DestroyContext - should to release all sources related to + * processing the document. Called when all rows are fetched or + * when a error is catched. */ typedef struct TableExprBuilder {