mirror of
https://github.com/postgres/postgres.git
synced 2025-07-09 22:41:56 +03:00
Move strip_implicit_coercions() from optimizer to nodeFuncs.c.
Use of this function has spread into the parser and rewriter, so it seems like time to pull it out of the optimizer and put it into the more central nodeFuncs module. This eliminates the need to #include optimizer/clauses.h in most of the calling files, demonstrating that this function was indeed a bit outside the normal code reference patterns.
This commit is contained in:
src
backend
nodes
optimizer
util
parser
rewrite
utils
adt
include
@ -571,6 +571,65 @@ relabel_to_typmod(Node *expr, int32 typmod)
|
||||
COERCE_EXPLICIT_CAST);
|
||||
}
|
||||
|
||||
/*
|
||||
* strip_implicit_coercions: remove implicit coercions at top level of tree
|
||||
*
|
||||
* This doesn't modify or copy the input expression tree, just return a
|
||||
* pointer to a suitable place within it.
|
||||
*
|
||||
* Note: there isn't any useful thing we can do with a RowExpr here, so
|
||||
* just return it unchanged, even if it's marked as an implicit coercion.
|
||||
*/
|
||||
Node *
|
||||
strip_implicit_coercions(Node *node)
|
||||
{
|
||||
if (node == NULL)
|
||||
return NULL;
|
||||
if (IsA(node, FuncExpr))
|
||||
{
|
||||
FuncExpr *f = (FuncExpr *) node;
|
||||
|
||||
if (f->funcformat == COERCE_IMPLICIT_CAST)
|
||||
return strip_implicit_coercions(linitial(f->args));
|
||||
}
|
||||
else if (IsA(node, RelabelType))
|
||||
{
|
||||
RelabelType *r = (RelabelType *) node;
|
||||
|
||||
if (r->relabelformat == COERCE_IMPLICIT_CAST)
|
||||
return strip_implicit_coercions((Node *) r->arg);
|
||||
}
|
||||
else if (IsA(node, CoerceViaIO))
|
||||
{
|
||||
CoerceViaIO *c = (CoerceViaIO *) node;
|
||||
|
||||
if (c->coerceformat == COERCE_IMPLICIT_CAST)
|
||||
return strip_implicit_coercions((Node *) c->arg);
|
||||
}
|
||||
else if (IsA(node, ArrayCoerceExpr))
|
||||
{
|
||||
ArrayCoerceExpr *c = (ArrayCoerceExpr *) node;
|
||||
|
||||
if (c->coerceformat == COERCE_IMPLICIT_CAST)
|
||||
return strip_implicit_coercions((Node *) c->arg);
|
||||
}
|
||||
else if (IsA(node, ConvertRowtypeExpr))
|
||||
{
|
||||
ConvertRowtypeExpr *c = (ConvertRowtypeExpr *) node;
|
||||
|
||||
if (c->convertformat == COERCE_IMPLICIT_CAST)
|
||||
return strip_implicit_coercions((Node *) c->arg);
|
||||
}
|
||||
else if (IsA(node, CoerceToDomain))
|
||||
{
|
||||
CoerceToDomain *c = (CoerceToDomain *) node;
|
||||
|
||||
if (c->coercionformat == COERCE_IMPLICIT_CAST)
|
||||
return strip_implicit_coercions((Node *) c->arg);
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
/*
|
||||
* expression_returns_set
|
||||
* Test whether an expression returns a set result.
|
||||
|
Reference in New Issue
Block a user