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 21:40:31 UTC

incubator-hawq git commit: HAWQ-975. Added support for IN, BETWEEN, LIKE.

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 <od...@pivotal.io>
Authored: Fri Aug 19 14:40:22 2016 -0700
Committer: Oleksandr Diachenko <od...@pivotal.io>
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;
 		}
 	}