mirror of https://github.com/postgres/postgres
Fix the code that adds regclass constants to a plan's list of relation OIDs
that it depends on for replan-forcing purposes. We need to consider plain OID constants too, because eval_const_expressions folds a RelabelType atop a Const to just a Const. This change could result in OID values that aren't really for tables getting added to the dependency list, but the worst-case consequence would be occasional useless replans. Per report from Gabriele Messineo.
This commit is contained in:
parent
19a6bace94
commit
2e835a4961
|
@ -9,7 +9,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.141 2008/01/01 19:45:50 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.142 2008/06/17 14:51:32 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -63,6 +63,17 @@ typedef struct
|
|||
int rtoffset;
|
||||
} fix_upper_expr_context;
|
||||
|
||||
/*
|
||||
* Check if a Const node is a regclass value. We accept plain OID too,
|
||||
* since a regclass Const will get folded to that type if it's an argument
|
||||
* to oideq or similar operators. (This might result in some extraneous
|
||||
* values in a plan's list of relation dependencies, but the worst result
|
||||
* would be occasional useless replans.)
|
||||
*/
|
||||
#define ISREGCLASSCONST(con) \
|
||||
(((con)->consttype == REGCLASSOID || (con)->consttype == OIDOID) && \
|
||||
!(con)->constisnull)
|
||||
|
||||
#define fix_scan_list(glob, lst, rtoffset) \
|
||||
((List *) fix_scan_expr(glob, (Node *) (lst), rtoffset))
|
||||
|
||||
|
@ -694,7 +705,7 @@ fix_scan_expr_mutator(Node *node, fix_scan_expr_context *context)
|
|||
Const *con = (Const *) node;
|
||||
|
||||
/* Check for regclass reference */
|
||||
if (con->consttype == REGCLASSOID && !con->constisnull)
|
||||
if (ISREGCLASSCONST(con))
|
||||
context->glob->relationOids =
|
||||
lappend_oid(context->glob->relationOids,
|
||||
DatumGetObjectId(con->constvalue));
|
||||
|
@ -722,7 +733,7 @@ fix_scan_expr_walker(Node *node, fix_scan_expr_context *context)
|
|||
Const *con = (Const *) node;
|
||||
|
||||
/* Check for regclass reference */
|
||||
if (con->consttype == REGCLASSOID && !con->constisnull)
|
||||
if (ISREGCLASSCONST(con))
|
||||
context->glob->relationOids =
|
||||
lappend_oid(context->glob->relationOids,
|
||||
DatumGetObjectId(con->constvalue));
|
||||
|
@ -1391,7 +1402,7 @@ fix_join_expr_mutator(Node *node, fix_join_expr_context *context)
|
|||
Const *con = (Const *) node;
|
||||
|
||||
/* Check for regclass reference */
|
||||
if (con->consttype == REGCLASSOID && !con->constisnull)
|
||||
if (ISREGCLASSCONST(con))
|
||||
context->glob->relationOids =
|
||||
lappend_oid(context->glob->relationOids,
|
||||
DatumGetObjectId(con->constvalue));
|
||||
|
@ -1489,7 +1500,7 @@ fix_upper_expr_mutator(Node *node, fix_upper_expr_context *context)
|
|||
Const *con = (Const *) node;
|
||||
|
||||
/* Check for regclass reference */
|
||||
if (con->consttype == REGCLASSOID && !con->constisnull)
|
||||
if (ISREGCLASSCONST(con))
|
||||
context->glob->relationOids =
|
||||
lappend_oid(context->glob->relationOids,
|
||||
DatumGetObjectId(con->constvalue));
|
||||
|
|
Loading…
Reference in New Issue