From 10a509d82956dee14eb2011bd266cd3c728ae188 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 23 Jul 2013 18:21:19 -0400 Subject: [PATCH] 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. --- src/backend/nodes/nodeFuncs.c | 59 ++++++++++++++++++++++++++++ src/backend/optimizer/util/clauses.c | 56 -------------------------- src/backend/parser/parse_clause.c | 1 - src/backend/parser/parse_relation.c | 1 - src/backend/rewrite/rewriteHandler.c | 1 - src/backend/utils/adt/ruleutils.c | 1 - src/include/nodes/nodeFuncs.h | 1 + src/include/optimizer/clauses.h | 2 - 8 files changed, 60 insertions(+), 62 deletions(-) diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index a896d763b8..908f397d50 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -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. diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index 7ec6b0b30b..506e9d49fc 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -2070,62 +2070,6 @@ CommuteRowCompareExpr(RowCompareExpr *clause) clause->rargs = temp; } -/* - * strip_implicit_coercions: remove implicit coercions at top level of tree - * - * 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; -} - /* * Helper for eval_const_expressions: check that datatype of an attribute * is still what it was when the expression was parsed. This is needed to diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index cbfb43188c..ea90e58f71 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -21,7 +21,6 @@ #include "commands/defrem.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" -#include "optimizer/clauses.h" #include "optimizer/tlist.h" #include "parser/analyze.h" #include "parser/parsetree.h" diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 42de89f510..b2b88fc6a9 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -24,7 +24,6 @@ #include "funcapi.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" -#include "optimizer/clauses.h" #include "parser/parsetree.h" #include "parser/parse_relation.h" #include "parser/parse_type.h" diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index 3c7974adc7..5c6763e17b 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -19,7 +19,6 @@ #include "foreign/fdwapi.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" -#include "optimizer/clauses.h" #include "parser/analyze.h" #include "parser/parse_coerce.h" #include "parser/parsetree.h" diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 762be4e846..e6a20e3821 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -38,7 +38,6 @@ #include "funcapi.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" -#include "optimizer/clauses.h" #include "optimizer/tlist.h" #include "parser/keywords.h" #include "parser/parse_func.h" diff --git a/src/include/nodes/nodeFuncs.h b/src/include/nodes/nodeFuncs.h index d4901caefa..fe7cfd3880 100644 --- a/src/include/nodes/nodeFuncs.h +++ b/src/include/nodes/nodeFuncs.h @@ -30,6 +30,7 @@ extern Oid exprType(const Node *expr); extern int32 exprTypmod(const Node *expr); extern bool exprIsLengthCoercion(const Node *expr, int32 *coercedTypmod); extern Node *relabel_to_typmod(Node *expr, int32 typmod); +extern Node *strip_implicit_coercions(Node *node); extern bool expression_returns_set(Node *clause); extern Oid exprCollation(const Node *expr); diff --git a/src/include/optimizer/clauses.h b/src/include/optimizer/clauses.h index 586f8c8881..a08799957a 100644 --- a/src/include/optimizer/clauses.h +++ b/src/include/optimizer/clauses.h @@ -77,8 +77,6 @@ extern int NumRelids(Node *clause); extern void CommuteOpExpr(OpExpr *clause); extern void CommuteRowCompareExpr(RowCompareExpr *clause); -extern Node *strip_implicit_coercions(Node *node); - extern Node *eval_const_expressions(PlannerInfo *root, Node *node); extern Node *estimate_expression_value(PlannerInfo *root, Node *node); -- 2.40.0