diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index a823c1b370e..9247da6b2bd 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -56,6 +56,8 @@ sortby_nulls_hook_type sortby_nulls_hook = NULL; optimize_explicit_cast_hook_type optimize_explicit_cast_hook = NULL; +pre_transform_openxml_columns_hook_type pre_transform_openxml_columns_hook = NULL; + static int extractRemainingColumns(ParseState *pstate, ParseNamespaceColumn *src_nscolumns, List *src_colnames, @@ -711,6 +713,13 @@ transformRangeTableFunc(ParseState *pstate, RangeTableFunc *rtf) constructName = "XMLTABLE"; docType = XMLOID; + /* + * Hook to allow extensions to pre-process OPENXML column definitions + * before standard XMLTABLE transformation. + */ + if (pre_transform_openxml_columns_hook && tf->functype == TFT_XMLTABLE) + pre_transform_openxml_columns_hook(pstate, rtf); + /* * We make lateral_only names of this level visible, whether or not the * RangeTableFunc is explicitly marked LATERAL. This is needed for SQL diff --git a/src/include/parser/parse_clause.h b/src/include/parser/parse_clause.h index d307e4dbdc9..ca3e0d3eb2c 100644 --- a/src/include/parser/parse_clause.h +++ b/src/include/parser/parse_clause.h @@ -62,4 +62,8 @@ extern PGDLLEXPORT optimize_explicit_cast_hook_type optimize_explicit_cast_hook; /* functions in parse_jsontable.c */ extern ParseNamespaceItem *transformJsonTable(ParseState *pstate, JsonTable *jt); +/* Hook for preprocessing OPENXML column definitions before XMLTABLE transformation */ +typedef void (*pre_transform_openxml_columns_hook_type) (ParseState *pstate, RangeTableFunc *rtf); +extern PGDLLIMPORT pre_transform_openxml_columns_hook_type pre_transform_openxml_columns_hook; + #endif /* PARSE_CLAUSE_H */