@@ -36,6 +36,12 @@ void extractClauseFromScalarArrayOpExpr(
3636
3737void extractClauseFromBooleanTest (Relids base_relids , BooleanTest * node , List * * quals );
3838
39+ void extractClauseFromBoolExpr (
40+ #if PG_VERSION_NUM >= 140000
41+ PlannerInfo * root ,
42+ #endif
43+ Relids base_relids , BoolExpr * node , List * * quals );
44+
3945void extractClauseFromVar (
4046#if PG_VERSION_NUM >= 140000
4147 PlannerInfo * root ,
@@ -340,6 +346,13 @@ extractRestrictions(
340346 base_relids , (Var * ) node , quals );
341347 break ;
342348
349+ case T_BoolExpr :
350+ extractClauseFromBoolExpr (
351+ #if PG_VERSION_NUM >= 140000
352+ root ,
353+ #endif
354+ base_relids , (BoolExpr * ) node , quals );
355+ break ;
343356 default :
344357 {
345358 ereport (WARNING ,
@@ -548,6 +561,35 @@ void extractClauseFromVar(
548561 * quals = lappend (* quals , result );
549562}
550563
564+ void extractClauseFromBoolExpr (
565+ #if PG_VERSION_NUM >= 140000
566+ PlannerInfo * root ,
567+ #endif
568+ Relids base_relids , BoolExpr * bexpr , List * * quals )
569+ {
570+ if (!bms_is_subset (pull_varnos (
571+ #if PG_VERSION_NUM >= 140000
572+ root ,
573+ #endif
574+ (Node * ) bexpr ), base_relids )) {
575+ return ;
576+ }
577+
578+ if (bexpr -> boolop == NOT_EXPR &&
579+ list_length (bexpr -> args ) == 1 &&
580+ IsA (linitial (bexpr - > args ), Var )) {
581+
582+ Var * var = (Var * ) linitial (bexpr -> args );
583+ Expr * true_expr = (Expr * ) makeConst (
584+ BOOLOID , -1 , InvalidOid , sizeof (bool ),
585+ BoolGetDatum (true), false, true);
586+
587+ MulticornBaseQual * result = makeQual (
588+ var -> varattno , "<>" , true_expr , false, false);
589+
590+ * quals = lappend (* quals , result );
591+ }}
592+
551593/*
552594 * Returns a "Value" node containing the string name of the column from a var.
553595 */
0 commit comments