Skip to content
Merged
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 94 additions & 1 deletion src/query.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,15 @@ void extractClauseFromScalarArrayOpExpr(
ScalarArrayOpExpr *node,
List **quals);

char *getOperatorString(Oid opoid);
void extractClauseFromBooleanTest(Relids base_relids, BooleanTest *node, List **quals);

void extractClauseFromVar(
#if PG_VERSION_NUM >= 140000
PlannerInfo *root,
#endif
Relids base_relids, Var *node, List **quals);

char *getOperatorString(Oid opoid);

MulticornBaseQual *makeQual(AttrNumber varattno, char *opname, Expr *value,
bool isarray,
Expand Down Expand Up @@ -319,6 +327,19 @@ extractRestrictions(
#endif
base_relids, (ScalarArrayOpExpr *) node, quals);
break;

case T_BooleanTest:
extractClauseFromBooleanTest(base_relids, (BooleanTest *) node, quals);
break;

case T_Var:
extractClauseFromVar(
#if PG_VERSION_NUM >= 140000
(PlannerInfo *) root,
#endif
base_relids, (Var *) node, quals);
break;

default:
{
ereport(WARNING,
Expand Down Expand Up @@ -446,7 +467,79 @@ extractClauseFromNullTest(Relids base_relids,
}
}

/*
* Convert a "BoolExpr" (IS TRUE, IS FALSE, IS NOT TRUE, IS NOT FALSE)
* to the corresponding qualifier.
*/
void extractClauseFromBooleanTest(Relids base_relids, BooleanTest *node, List **quals)
{
elog(DEBUG3, "entering extractClauseFromBooleanTest()");
if (IsA(node->arg, Var))
{
Var *var = (Var *) node->arg;
MulticornBaseQual *result;
char *opname = NULL;
Expr *val;

if (var->varattno < 1)
{
return;
}
switch (node->booltesttype)
{
case IS_TRUE:
opname = "IS";
val = (Expr *) makeConst(BOOLOID, -1, InvalidOid, sizeof(bool), BoolGetDatum(true), false, true);
break;
case IS_FALSE:
opname = "IS";
val = (Expr *) makeConst(BOOLOID, -1, InvalidOid, sizeof(bool), BoolGetDatum(false), false, true);
break;
case IS_NOT_TRUE:
opname = "IS NOT";
val = (Expr *) makeConst(BOOLOID, -1, InvalidOid, sizeof(bool), BoolGetDatum(true), false, true);
break;
case IS_NOT_FALSE:
opname = "IS NOT";
val = (Expr *) makeConst(BOOLOID, -1, InvalidOid, sizeof(bool), BoolGetDatum(true), false, true);
break;
default:
/* IS UNKNOWN, IS NOT UNKNOWN */
elog(ERROR, "unsupported boolean test type %d", node->booltesttype);
}
result = makeQual(var->varattno, opname,
(Expr *) val, false, false);
*quals = lappend(*quals, result);
}
}

void extractClauseFromVar(
#if PG_VERSION_NUM >= 140000
PlannerInfo *root,
#endif
Relids base_relids, Var *var, List **quals)
{
MulticornBaseQual *result;
Expr *true_expr;
if (!bms_is_subset(pull_varnos(
#if PG_VERSION_NUM >= 140000
root,
#endif
(Node *) var), base_relids)) {
return;
}

true_expr = (Expr *) makeConst(BOOLOID, // Type OID for boolean
-1, // typmod
InvalidOid, // collation
sizeof(bool), // constlen
BoolGetDatum(true), // the actual value
false, // isnull
true); // constbyval

result = makeQual(var->varattno, "=", true_expr, false, false);
*quals = lappend(*quals, result);
}

/*
* Returns a "Value" node containing the string name of the column from a var.
Expand Down