Repository: incubator-hawq Updated Branches: refs/heads/HAWQ-964 73273c2cc -> a14076c2e
HAWQ-1048. Fixed filter builder for ORCA/default optimizer. Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/071c3008 Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/071c3008 Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/071c3008 Branch: refs/heads/HAWQ-964 Commit: 071c300808f4f35c254f9b66e8e4ddde8e8483d4 Parents: 2ebc98a Author: Oleksandr Diachenko <[email protected]> Authored: Fri Oct 7 17:41:17 2016 -0700 Committer: Oleksandr Diachenko <[email protected]> Committed: Fri Oct 7 17:42:13 2016 -0700 ---------------------------------------------------------------------- src/backend/access/external/hd_work_mgr.c | 2 +- src/backend/access/external/pxffilters.c | 64 ++++++++++++++++++++------ 2 files changed, 52 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/071c3008/src/backend/access/external/hd_work_mgr.c ---------------------------------------------------------------------- diff --git a/src/backend/access/external/hd_work_mgr.c b/src/backend/access/external/hd_work_mgr.c index e7314f7..6829de5 100644 --- a/src/backend/access/external/hd_work_mgr.c +++ b/src/backend/access/external/hd_work_mgr.c @@ -158,7 +158,7 @@ char** map_hddata_2gp_segments(char* uri, int total_segs, int working_segs, Rela inputData.headers = client_context.http_headers; inputData.gphduri = hadoop_uri; inputData.rel = relation; - inputData.filterstr = NULL; /* We do not supply filter data to the HTTP header */ + inputData.filterstr = serializePxfFilterQuals(quals); /* We do supply filter data to the HTTP header */ generate_delegation_token(&inputData); build_http_header(&inputData); http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/071c3008/src/backend/access/external/pxffilters.c ---------------------------------------------------------------------- diff --git a/src/backend/access/external/pxffilters.c b/src/backend/access/external/pxffilters.c index 154babf..fda341d 100644 --- a/src/backend/access/external/pxffilters.c +++ b/src/backend/access/external/pxffilters.c @@ -31,13 +31,14 @@ #include "utils/guc.h" #include "utils/lsyscache.h" -static List* pxf_make_expression_items_list(List *quals, Node *parent); +static List* pxf_make_expression_items_list(List *quals, Node *parent, bool *logicalOpsNum); static void pxf_free_filter(PxfFilterDesc* filter); 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); +static void enrichTrivialExpression(List *expressionItems); /* * All supported HAWQ operators, and their respective HFDS operator code. @@ -150,15 +151,16 @@ dbop_pxfop_map pxf_supported_opr[] = {1060 /* bpchargt */, PXFOP_GT}, {1059 /* bpcharle */, PXFOP_LE}, {1061 /* bpcharge */, PXFOP_GE}, - {1057 /* bpcharne */, PXFOP_NE}, + {1057 /* bpcharne */, PXFOP_NE} /* bytea */ - {ByteaEqualOperator /* byteaeq */, PXFOP_EQ}, - {1957 /* bytealt */, PXFOP_LT}, - {1959 /* byteagt */, PXFOP_GT}, - {1958 /* byteale */, PXFOP_LE}, - {1960 /* byteage */, PXFOP_GE}, - {1956 /* byteane */, PXFOP_NE} + // TODO: uncomment ocne HAWQ-1085 is done + //,{ByteaEqualOperator /* byteaeq */, PXFOP_EQ}, + //{1957 /* bytealt */, PXFOP_LT}, + //{1959 /* byteagt */, PXFOP_GT}, + //{1958 /* byteale */, PXFOP_LE}, + //{1960 /* byteage */, PXFOP_GE}, + //{1956 /* byteane */, PXFOP_NE} }; @@ -181,7 +183,7 @@ Oid pxf_supported_types[] = }; static void -pxf_free_filter_list(List *expressionItems) +pxf_free_filter_list(List *expressionItems, bool isTrivialExpression) { ListCell *lc = NULL; ExpressionItem *expressionItem = NULL; @@ -190,6 +192,10 @@ pxf_free_filter_list(List *expressionItems) while (list_length(expressionItems) > 0) { expressionItem = (ExpressionItem *) lfirst(list_head(expressionItems)); + if (isTrivialExpression) + { + pfree((BoolExpr *)expressionItem->node); + } pfree(expressionItem); /* to avoid freeing already freed items - delete all occurrences of current expression*/ @@ -214,7 +220,7 @@ pxf_free_filter_list(List *expressionItems) * */ static List * -pxf_make_expression_items_list(List *quals, Node *parent) +pxf_make_expression_items_list(List *quals, Node *parent, bool *logicalOpsNum) { ExpressionItem *expressionItem = NULL; List *result = NIL; @@ -242,8 +248,9 @@ pxf_make_expression_items_list(List *quals, Node *parent) } case T_BoolExpr: { + (*logicalOpsNum)++; BoolExpr *expr = (BoolExpr *) node; - List *inner_result = pxf_make_expression_items_list(expr->args, node); + List *inner_result = pxf_make_expression_items_list(expr->args, node, logicalOpsNum); result = list_concat(result, inner_result); int childNodesNum = 0; @@ -669,9 +676,18 @@ char *serializePxfFilterQuals(List *quals) if (pxf_enable_filter_pushdown) { - List *expressionItems = pxf_make_expression_items_list(quals, NULL); + int logicalOpsNum = 0; + List *expressionItems = pxf_make_expression_items_list(quals, NULL, &logicalOpsNum); + + //Trivial expression means list of OpExpr implicitly ANDed + bool isTrivialExpression = logicalOpsNum ==0 && expressionItems && expressionItems->length > 1; + + if (isTrivialExpression) + { + enrichTrivialExpression(expressionItems); + } result = pxf_serialize_filter_list(expressionItems); - pxf_free_filter_list(expressionItems); + pxf_free_filter_list(expressionItems, isTrivialExpression); } @@ -680,6 +696,28 @@ char *serializePxfFilterQuals(List *quals) return result; } +/* + * Takes list of expression items which supposed to be just a list of OpExpr + * and adds needed number of AND items + * + */ +void enrichTrivialExpression(List *expressionItems) { + + ExpressionItem *andExpressionItem = (ExpressionItem *) palloc0(sizeof(ExpressionItem)); + BoolExpr *andExpr = makeNode(BoolExpr); + + andExpr->boolop = AND_EXPR; + + andExpressionItem->node = andExpr; + andExpressionItem->parent = NULL; + andExpressionItem->processed = false; + + int logicalOpsNumNeeded = expressionItems->length - 1; + + for (int i = 0; i < logicalOpsNumNeeded; i++) { + expressionItems = lappend(expressionItems, andExpressionItem); + } +} /* * Returns a list of attributes, extracted from quals.
