further_eval_const_expressions_processing_on_partial_indexes.patch

application/octet-stream

Filename: further_eval_const_expressions_processing_on_partial_indexes.patch
Type: application/octet-stream
Part: 0
Message: Re: BUG #19007: Planner fails to choose partial index with spurious 'not null'

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
File+
src/backend/optimizer/util/plancat.c 10 0
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index c6a58afc5e5..a80506a5879 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -435,6 +435,16 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
 			if (info->indpred && varno != 1)
 				ChangeVarNodes((Node *) info->indpred, 1, varno, 0);
 
+			info->indpred = (List *) eval_const_expressions(root, (Node *) info->indpred);
+			if (list_length(info->indpred) == 1 &&
+				IsA(linitial(info->indpred), Const))
+			{
+				Const *expr = (Const *) linitial(info->indpred);
+
+				if (!expr->constisnull && DatumGetBool(expr->constvalue))
+					info->indpred = NIL;
+			}
+
 			/* Build targetlist using the completed indexprs data */
 			info->indextlist = build_index_tlist(root, info, relation);