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
|
* 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;
|
int rtoffset;
|
||||||
} fix_upper_expr_context;
|
} 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) \
|
#define fix_scan_list(glob, lst, rtoffset) \
|
||||||
((List *) fix_scan_expr(glob, (Node *) (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;
|
Const *con = (Const *) node;
|
||||||
|
|
||||||
/* Check for regclass reference */
|
/* Check for regclass reference */
|
||||||
if (con->consttype == REGCLASSOID && !con->constisnull)
|
if (ISREGCLASSCONST(con))
|
||||||
context->glob->relationOids =
|
context->glob->relationOids =
|
||||||
lappend_oid(context->glob->relationOids,
|
lappend_oid(context->glob->relationOids,
|
||||||
DatumGetObjectId(con->constvalue));
|
DatumGetObjectId(con->constvalue));
|
||||||
@ -722,7 +733,7 @@ fix_scan_expr_walker(Node *node, fix_scan_expr_context *context)
|
|||||||
Const *con = (Const *) node;
|
Const *con = (Const *) node;
|
||||||
|
|
||||||
/* Check for regclass reference */
|
/* Check for regclass reference */
|
||||||
if (con->consttype == REGCLASSOID && !con->constisnull)
|
if (ISREGCLASSCONST(con))
|
||||||
context->glob->relationOids =
|
context->glob->relationOids =
|
||||||
lappend_oid(context->glob->relationOids,
|
lappend_oid(context->glob->relationOids,
|
||||||
DatumGetObjectId(con->constvalue));
|
DatumGetObjectId(con->constvalue));
|
||||||
@ -1391,7 +1402,7 @@ fix_join_expr_mutator(Node *node, fix_join_expr_context *context)
|
|||||||
Const *con = (Const *) node;
|
Const *con = (Const *) node;
|
||||||
|
|
||||||
/* Check for regclass reference */
|
/* Check for regclass reference */
|
||||||
if (con->consttype == REGCLASSOID && !con->constisnull)
|
if (ISREGCLASSCONST(con))
|
||||||
context->glob->relationOids =
|
context->glob->relationOids =
|
||||||
lappend_oid(context->glob->relationOids,
|
lappend_oid(context->glob->relationOids,
|
||||||
DatumGetObjectId(con->constvalue));
|
DatumGetObjectId(con->constvalue));
|
||||||
@ -1489,7 +1500,7 @@ fix_upper_expr_mutator(Node *node, fix_upper_expr_context *context)
|
|||||||
Const *con = (Const *) node;
|
Const *con = (Const *) node;
|
||||||
|
|
||||||
/* Check for regclass reference */
|
/* Check for regclass reference */
|
||||||
if (con->consttype == REGCLASSOID && !con->constisnull)
|
if (ISREGCLASSCONST(con))
|
||||||
context->glob->relationOids =
|
context->glob->relationOids =
|
||||||
lappend_oid(context->glob->relationOids,
|
lappend_oid(context->glob->relationOids,
|
||||||
DatumGetObjectId(con->constvalue));
|
DatumGetObjectId(con->constvalue));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user