Skip to content

add functions to extract clause from boolean expressions #162

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all 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
91 changes: 91 additions & 0 deletions src/query.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,18 @@ void extractClauseFromScalarArrayOpExpr(Relids base_relids,
ScalarArrayOpExpr *node,
List **quals);

void extractClauseFromBooleanTest(Relids base_relids,
BooleanTest *node,
List **quals);

void extractClauseFromBoolExpr(Relids base_relids,
BoolExpr *node,
List **quals);

void extractClauseFromVar(Relids base_relids,
Var *node,
List **quals);

char *getOperatorString(Oid opoid);

MulticornBaseQual *makeQual(AttrNumber varattno, char *opname, Expr *value,
Expand Down Expand Up @@ -304,6 +316,17 @@ extractRestrictions(Relids base_relids,
(ScalarArrayOpExpr *) node,
quals);
break;
case T_BooleanTest:
extractClauseFromBooleanTest(base_relids,
(BooleanTest *) node, quals);
break;
case T_BoolExpr:
extractClauseFromBoolExpr(base_relids,
(BoolExpr *) node, quals);
break;
case T_Var:
extractClauseFromVar(base_relids, (Var *) node, quals);
break;
default:
{
ereport(WARNING,
Expand Down Expand Up @@ -412,7 +435,75 @@ extractClauseFromNullTest(Relids base_relids,
}
}

/*
* Convert a "BooleanTest" (IS TRUE, IS FALSE, IS NOT FALSE, IS NOT TRUE,
* IS UNKNOWN or IS NOT UNKNOWN) to a suitable intermediate representation.
*/
void
extractClauseFromBooleanTest(Relids base_relids,
BooleanTest *node,
List **quals)
{
if (IsA(node->arg, Var))
{
Var *var = (Var *) node->arg;
char *opname = NULL;

switch (node->booltesttype)
{
case IS_TRUE:
case IS_NOT_FALSE:
case IS_NOT_UNKNOWN:
opname = "=";
break;
default:
opname = "<>";
break;
}

*quals = lappend(*quals,
makeQual(var->varattno, opname,
(Expr *) makeBoolConst(true, false),
false, false));
}
}

/*
* Convert a "BoolExpr" (operator NOT)
* to a suitable intermediate representation.
*/
void
extractClauseFromBoolExpr(Relids base_relids,
BoolExpr *node,
List **quals)
{
if (node->boolop == NOT_EXPR)
{
Var *var = list_nth(node->args, 0);

*quals = lappend(*quals,
makeQual(var->varattno, "<>",
(Expr *) makeBoolConst(true, false),
false, false));
}
}

/*
* Convert a "Var" to a suitable intermediate representation.
*/
void
extractClauseFromVar(Relids base_relids,
Var *node,
List **quals)
{
if (node->vartype == BOOLOID)
{
*quals = lappend(*quals,
makeQual(node->varattno, "=",
(Expr *) makeBoolConst(true, false),
false, false));
}
}

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