Repository: incubator-hawq Updated Branches: refs/heads/HAWQ-967 64c3af080 -> 36f68c2af
HAWQ-967. Support OR, NOT. Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/36f68c2a Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/36f68c2a Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/36f68c2a Branch: refs/heads/HAWQ-967 Commit: 36f68c2af4bdad75f051161e423ff46670cbf689 Parents: 64c3af0 Author: Oleksandr Diachenko <[email protected]> Authored: Wed Aug 10 18:09:25 2016 -0700 Committer: Oleksandr Diachenko <[email protected]> Committed: Wed Aug 10 18:09:25 2016 -0700 ---------------------------------------------------------------------- src/backend/access/external/pxffilters.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/36f68c2a/src/backend/access/external/pxffilters.c ---------------------------------------------------------------------- diff --git a/src/backend/access/external/pxffilters.c b/src/backend/access/external/pxffilters.c index 056eb44..9120bb7 100644 --- a/src/backend/access/external/pxffilters.c +++ b/src/backend/access/external/pxffilters.c @@ -31,7 +31,7 @@ #include "utils/guc.h" #include "utils/lsyscache.h" -static List* pxf_make_filter_list(List* quals); +static List* pxf_make_filter_list(List* quals, bool extractAttrs); static void pxf_free_filter(PxfFilterDesc* filter); static void pxf_free_filter_list(List *filters); static char* pxf_serialize_filter_list(List *filters); @@ -155,7 +155,7 @@ Oid pxf_supported_types[] = * Caller is responsible for pfreeing the returned PxfFilterDesc List. */ static List * -pxf_make_filter_list(List *quals) +pxf_make_filter_list(List *quals, bool extractAttrs) { List *result = NIL; ListCell *lc = NULL; @@ -196,10 +196,11 @@ 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 */ - if (expr->boolop == AND_EXPR) + /* only AND_EXPR is supported for filter push-down*/ + /* AND_EXPR, OR_EXPR, NOT_EXPR are supported for extracting attributes from WHERE clause*/ + if (expr->boolop == AND_EXPR || extractAttrs) { - List *inner_result = pxf_make_filter_list(expr->args); + List *inner_result = pxf_make_filter_list(expr->args, extractAttrs); elog(DEBUG5, "pxf_make_filter_list: inner result size %d", list_length(inner_result)); result = list_concat(result, inner_result); } @@ -580,7 +581,7 @@ char *serializePxfFilterQuals(List *quals) if (pxf_enable_filter_pushdown) { - List *filters = pxf_make_filter_list(quals); + List *filters = pxf_make_filter_list(quals, false); result = pxf_serialize_filter_list(filters); pxf_free_filter_list(filters); @@ -593,7 +594,7 @@ char *serializePxfFilterQuals(List *quals) List* extractPxfAttributes(List* quals) { - List *filters = pxf_make_filter_list(quals); + List *filters = pxf_make_filter_list(quals, true); List *attributes = pxf_extract_attributes(filters);
