Repository: incubator-hawq Updated Branches: refs/heads/HAWQ-967 d0e541938 -> f40b2918e
HAWQ-975. Added support for IN, BETWEEN, LIKE. Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/f40b2918 Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/f40b2918 Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/f40b2918 Branch: refs/heads/HAWQ-967 Commit: f40b2918eca1fb1293781354cef8c1d216b07b30 Parents: d0e5419 Author: Oleksandr Diachenko <[email protected]> Authored: Fri Aug 19 14:40:22 2016 -0700 Committer: Oleksandr Diachenko <[email protected]> Committed: Fri Aug 19 14:40:22 2016 -0700 ---------------------------------------------------------------------- src/backend/access/external/pxffilters.c | 44 ++++++++++++++++----------- 1 file changed, 27 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/f40b2918/src/backend/access/external/pxffilters.c ---------------------------------------------------------------------- diff --git a/src/backend/access/external/pxffilters.c b/src/backend/access/external/pxffilters.c index 4ec8dde..bd7588b 100644 --- a/src/backend/access/external/pxffilters.c +++ b/src/backend/access/external/pxffilters.c @@ -38,6 +38,7 @@ static char* pxf_serialize_filter_list(List *filters); static bool opexpr_to_pxffilter(OpExpr *expr, PxfFilterDesc *filter); static bool supported_filter_type(Oid type); static void const_to_str(Const *constval, StringInfo buf); +static List* append_attr_from_var(Var* var, List* attrs); /* * All supported HAWQ operators, and their respective HFDS operator code. @@ -196,7 +197,7 @@ pxf_make_filter_list(List *quals) elog(DEBUG5, "pxf_make_filter_list: node tag %d (T_BoolExpr), bool node type %d %s", tag, boolType, boolType==AND_EXPR ? "(AND_EXPR)" : ""); - /* only AND_EXPR is supported for filter push-down*/ + /* only AND_EXPR is supported */ if (expr->boolop == AND_EXPR) { List *inner_result = pxf_make_filter_list(expr->args); @@ -451,7 +452,8 @@ opexpr_to_pxffilter(OpExpr *expr, PxfFilterDesc *filter) return false; } -List* append_attr_from_var(Var* var, List* attrs) +static List* +append_attr_from_var(Var* var, List* attrs) { AttrNumber varattno = var->varattno; /* system attr not supported */ @@ -462,7 +464,7 @@ List* append_attr_from_var(Var* var, List* attrs) } static List* -get_attrs_from_opexpr(OpExpr *expr) +get_attrs_from_expr(Expr *expr) { Node *leftop = NULL; Node *rightop = NULL; @@ -471,10 +473,17 @@ get_attrs_from_opexpr(OpExpr *expr) if ((!expr)) return attrs; - leftop = get_leftop((Expr*)expr); - rightop = get_rightop((Expr*)expr); + if (IsA(expr, OpExpr)) + { + leftop = get_leftop(expr); + rightop = get_rightop(expr); + } else if (IsA(expr, ScalarArrayOpExpr)) + { + ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) expr; + leftop = (Node *) linitial(saop->args); + rightop = (Node *) lsecond(saop->args); + } - /* arguments must be VAR and CONST */ if (IsA(leftop, Var)) { attrs = append_attr_from_var((Var *) leftop, attrs); @@ -620,28 +629,29 @@ List* extractPxfAttributes(List* quals) switch (tag) { case T_OpExpr: + case T_ScalarArrayOpExpr: { - OpExpr *expr = (OpExpr *) node; - List *attrs = get_attrs_from_opexpr(expr); - attributes = lappend(attributes, attrs); - break; - } - case T_NullTest: - { - NullTest *expr = (NullTest *) node; - attributes = append_attr_from_var((Var *) expr->arg, attributes); + Expr* expr = (Expr *) node; + List *attrs = get_attrs_from_expr(expr); + attributes = list_concat(attributes, attrs); break; } case T_BoolExpr: { - BoolExpr *expr = (BoolExpr *) node; + BoolExpr* expr = (BoolExpr *) node; List *inner_result = extractPxfAttributes(expr->args); attributes = list_concat(attributes, inner_result); break; } + case T_NullTest: + { + NullTest* expr = (NullTest *) node; + attributes = append_attr_from_var((Var *) expr->arg, attributes); + break; + } default: /* expression not supported */ - elog(ERROR, "pxf_make_filter_list: unsupported node tag %d", tag); + elog(ERROR, "extractPxfAttributes: unsupported node tag %d, unable to extract column from WHERE clause", tag); break; } }
