You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hawq.apache.org by od...@apache.org on 2016/08/19 00:01:04 UTC

incubator-hawq git commit: HAWQ-975. Added support for IS (NOT) NULL.

Repository: incubator-hawq
Updated Branches:
  refs/heads/HAWQ-967 36f68c2af -> d0e541938


HAWQ-975. Added support for IS (NOT) NULL.


Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/d0e54193
Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/d0e54193
Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/d0e54193

Branch: refs/heads/HAWQ-967
Commit: d0e541938c60698c46669c56af7bcf212a3de970
Parents: 36f68c2
Author: Oleksandr Diachenko <od...@pivotal.io>
Authored: Thu Aug 18 17:00:43 2016 -0700
Committer: Oleksandr Diachenko <od...@pivotal.io>
Committed: Thu Aug 18 17:00:43 2016 -0700

----------------------------------------------------------------------
 src/backend/access/external/pxffilters.c | 116 ++++++++++++++++++--------
 1 file changed, 82 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/d0e54193/src/backend/access/external/pxffilters.c
----------------------------------------------------------------------
diff --git a/src/backend/access/external/pxffilters.c b/src/backend/access/external/pxffilters.c
index 9120bb7..4ec8dde 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, bool extractAttrs);
+static List* pxf_make_filter_list(List* quals);
 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, bool extractAttrs)
+pxf_make_filter_list(List *quals)
 {
 	List			*result = NIL;
 	ListCell		*lc = NULL;
@@ -197,10 +197,9 @@ pxf_make_filter_list(List *quals, bool extractAttrs)
 						tag, boolType, boolType==AND_EXPR ? "(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)
+				if (expr->boolop == AND_EXPR)
 				{
-					List *inner_result = pxf_make_filter_list(expr->args, extractAttrs);
+					List *inner_result = pxf_make_filter_list(expr->args);
 					elog(DEBUG5, "pxf_make_filter_list: inner result size %d", list_length(inner_result));
 					result = list_concat(result, inner_result);
 				}
@@ -452,6 +451,43 @@ opexpr_to_pxffilter(OpExpr *expr, PxfFilterDesc *filter)
 	return false;
 }
 
+List* append_attr_from_var(Var* var, List* attrs)
+{
+	AttrNumber varattno = var->varattno;
+	/* system attr not supported */
+	if (varattno > InvalidAttrNumber)
+		return lappend_int(attrs, varattno - 1);
+
+	return attrs;
+}
+
+static List*
+get_attrs_from_opexpr(OpExpr *expr)
+{
+	Node	*leftop 	= NULL;
+	Node	*rightop	= NULL;
+	List	*attrs = NIL;
+
+	if ((!expr))
+		return attrs;
+
+	leftop = get_leftop((Expr*)expr);
+	rightop	= get_rightop((Expr*)expr);
+
+	/* arguments must be VAR and CONST */
+	if (IsA(leftop, Var))
+	{
+		attrs = append_attr_from_var((Var *) leftop, attrs);
+	}
+	if (IsA(leftop, Const))
+	{
+		attrs = append_attr_from_var((Var *) rightop, attrs);
+	}
+
+	return attrs;
+
+}
+
 /*
  * supported_filter_type
  *
@@ -538,32 +574,6 @@ const_to_str(Const *constval, StringInfo buf)
 }
 
 
-static List*
-pxf_extract_attributes(List *filters) {
-	ListCell *lc = NULL;
-	List *result = NIL;
-
-	if (list_length(filters) == 0)
-		return NIL;
-
-	foreach (lc, filters)
-	{
-		PxfFilterDesc *filter = (PxfFilterDesc *) lfirst(lc);
-		PxfOperand l = filter->l;
-		PxfOperand r = filter->r;
-
-		if (pxfoperand_is_attr(l)) {
-			result = lappend_int(result, l.attnum - 1);
-		}
-
-		if (pxfoperand_is_attr(r)) {
-			result = lappend_int(result, r.attnum - 1);
-		}
-	}
-
-	return result;
-}
-
 /*
  * serializePxfFilterQuals
  *
@@ -581,7 +591,7 @@ char *serializePxfFilterQuals(List *quals)
 
 	if (pxf_enable_filter_pushdown)
 	{
-		List *filters = pxf_make_filter_list(quals, false);
+		List *filters = pxf_make_filter_list(quals);
 
 		result  = pxf_serialize_filter_list(filters);
 		pxf_free_filter_list(filters);
@@ -591,12 +601,50 @@ char *serializePxfFilterQuals(List *quals)
 	return result;
 }
 
+
+
 List* extractPxfAttributes(List* quals)
 {
 
-	List *filters = pxf_make_filter_list(quals, true);
+	ListCell		*lc = NULL;
+	List *attributes = NIL;
 
-	List *attributes = pxf_extract_attributes(filters);
+	if (list_length(quals) == 0)
+		return NIL;
+
+	foreach (lc, quals)
+	{
+		Node *node = (Node *) lfirst(lc);
+		NodeTag tag = nodeTag(node);
+
+		switch (tag)
+		{
+			case T_OpExpr:
+			{
+				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);
+				break;
+			}
+			case T_BoolExpr:
+			{
+				BoolExpr	*expr = (BoolExpr *) node;
+				List *inner_result = extractPxfAttributes(expr->args);
+				attributes = list_concat(attributes, inner_result);
+				break;
+			}
+			default:
+				/* expression not supported */
+				elog(ERROR, "pxf_make_filter_list: unsupported node tag %d", tag);
+				break;
+		}
+	}
 
 	return attributes;
 }