Repository: incubator-hawq
Updated Branches:
  refs/heads/master 402e08da6 -> 55f0ff7e4


HAWQ-1103. Send constant datatype and length in filter to PXF.


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

Branch: refs/heads/master
Commit: 55f0ff7e4e03f5d90dc963f287a78a426f66495d
Parents: 402e08d
Author: Oleksandr Diachenko <[email protected]>
Authored: Mon Oct 24 12:36:29 2016 -0700
Committer: Oleksandr Diachenko <[email protected]>
Committed: Mon Oct 24 12:36:48 2016 -0700

----------------------------------------------------------------------
 src/backend/access/external/pxffilters.c        | 58 +++++++++++++++-----
 .../access/external/test/pxffilters_test.c      | 33 ++++++-----
 src/include/access/pxffilters.h                 |  9 ++-
 3 files changed, 68 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/55f0ff7e/src/backend/access/external/pxffilters.c
----------------------------------------------------------------------
diff --git a/src/backend/access/external/pxffilters.c 
b/src/backend/access/external/pxffilters.c
index 56aea55..f06b07f 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_expression_items_list(List *quals, Node *parent, bool 
*logicalOpsNum);
+static List* pxf_make_expression_items_list(List *quals, Node *parent, int 
*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);
@@ -193,7 +193,6 @@ Oid pxf_supported_types[] =
 static void
 pxf_free_expression_items_list(List *expressionItems, bool freeBoolExprNodes)
 {
-       ListCell                *lc     = NULL;
        ExpressionItem  *expressionItem = NULL;
        int previousLength;
 
@@ -228,7 +227,7 @@ pxf_free_expression_items_list(List *expressionItems, bool 
freeBoolExprNodes)
  *
  */
 static List *
-pxf_make_expression_items_list(List *quals, Node *parent, bool *logicalOpsNum)
+pxf_make_expression_items_list(List *quals, Node *parent, int *logicalOpsNum)
 {
        ExpressionItem *expressionItem = NULL;
        List                    *result = NIL;
@@ -330,7 +329,27 @@ pxf_free_filter(PxfFilterDesc* filter)
  *
  * Yields the following serialized string:
  *
- * a0c1o2a0c5o1o7a2c"third"o5o7
+ * a0c23s1d1o2a1c23s1d5o1a2c25s5dthirdo5l0l0
+ *
+ * Where:
+ *
+ * a0     - first column of table
+ * c23    - scalar constant with type oid 23(INT4)
+ * s1     - size of constant in bytes
+ * d1     - serialized constant value
+ * o2     - greater than operation
+ * a1     - second column of table
+ * c23    - scalar constant with type oid 23(INT4)
+ * s1     - size of constant in bytes
+ * d5     - serialized constant value
+ * o1     - less than operation
+ * a2     - third column of table
+ * c25    - scalar constant with type oid 25(TEXT)
+ * s5     - size of constant in bytes
+ * dthird - serialized constant value
+ * o5     - equals operation
+ * l0     - AND operator
+ * l0     - AND operator
  *
  */
 static char *
@@ -369,14 +388,18 @@ pxf_serialize_filter_list(List *expressionItems)
                                        PxfOperatorCode o = filter->op;
                                        if (pxfoperand_is_attr(l) && 
pxfoperand_is_const(r))
                                        {
-                                               appendStringInfo(resbuf, 
"%c%d%c%s",
+                                               appendStringInfo(resbuf, 
"%c%d%c%d%c%lu%c%s",
                                                                                
                 PXF_ATTR_CODE, l.attnum - 1, /* Java attrs are 0-based */
-                                                                               
                 PXF_CONST_CODE, (r.conststr)->data);
+                                                                               
                 PXF_CONST_CODE, r.consttype,
+                                                                               
                 PXF_SIZE_BYTES, strlen(r.conststr->data),
+                                                                               
                 PXF_CONST_DATA, (r.conststr)->data);
                                        }
                                        else if (pxfoperand_is_const(l) && 
pxfoperand_is_attr(r))
                                        {
-                                               appendStringInfo(resbuf, 
"%c%s%c%d",
-                                                                               
                 PXF_CONST_CODE, (l.conststr)->data,
+                                               appendStringInfo(resbuf, 
"%c%d%c%lu%c%s%c%d",
+                                                                               
                 PXF_CONST_CODE, l.consttype,
+                                                                               
                 PXF_SIZE_BYTES, strlen(l.conststr->data),
+                                                                               
                 PXF_CONST_DATA, (l.conststr)->data,
                                                                                
                 PXF_ATTR_CODE, r.attnum - 1); /* Java attrs are 0-based */
                                        }
                                        else
@@ -406,6 +429,10 @@ pxf_serialize_filter_list(List *expressionItems)
                                appendStringInfo(resbuf, "%c%d", 
PXF_LOGICAL_OPERATOR_CODE, boolType);
                                break;
                        }
+                       default:
+                       {
+                               elog(DEBUG5, "Skipping tag: %d", tag);
+                       }
                }
        }
 
@@ -468,6 +495,7 @@ opexpr_to_pxffilter(OpExpr *expr, PxfFilterDesc *filter)
        {
                filter->l.opcode = PXF_ATTR_CODE;
                filter->l.attnum = ((Var *) leftop)->varattno;
+               filter->l.consttype = InvalidOid;
                if (filter->l.attnum <= InvalidAttrNumber)
                        return false; /* system attr not supported */
 
@@ -476,6 +504,7 @@ opexpr_to_pxffilter(OpExpr *expr, PxfFilterDesc *filter)
                filter->r.conststr = makeStringInfo();
                initStringInfo(filter->r.conststr);
                const_to_str((Const *)rightop, filter->r.conststr);
+               filter->r.consttype = ((Const *)rightop)->consttype;
        }
        else if (IsA(leftop, Const) && IsA(rightop, Var))
        {
@@ -484,9 +513,11 @@ opexpr_to_pxffilter(OpExpr *expr, PxfFilterDesc *filter)
                filter->l.conststr = makeStringInfo();
                initStringInfo(filter->l.conststr);
                const_to_str((Const *)leftop, filter->l.conststr);
+               filter->l.consttype = ((Const *)leftop)->consttype;
 
                filter->r.opcode = PXF_ATTR_CODE;
                filter->r.attnum = ((Var *) rightop)->varattno;
+               filter->r.consttype = InvalidOid;
                if (filter->r.attnum <= InvalidAttrNumber)
                        return false; /* system attr not supported */
        }
@@ -632,9 +663,6 @@ const_to_str(Const *constval, StringInfo buf)
                case FLOAT4OID:
                case FLOAT8OID:
                case NUMERICOID:
-                       appendStringInfo(buf, "%s", extval);
-                       break;
-
                case TEXTOID:
                case VARCHAROID:
                case BPCHAROID:
@@ -642,14 +670,14 @@ const_to_str(Const *constval, StringInfo buf)
                case BYTEAOID:
                case DATEOID:
                case TIMESTAMPOID:
-                       appendStringInfo(buf, "\\\"%s\\\"", extval);
+                       appendStringInfo(buf, "%s", extval);
                        break;
 
                case BOOLOID:
                        if (strcmp(extval, "t") == 0)
-                               appendStringInfo(buf, "\"true\"");
+                               appendStringInfo(buf, "true");
                        else
-                               appendStringInfo(buf, "\"false\"");
+                               appendStringInfo(buf, "false");
                        break;
 
                default:
@@ -721,7 +749,7 @@ void enrich_trivial_expression(List *expressionItems) {
 
                andExpr->boolop = AND_EXPR;
 
-               andExpressionItem->node = andExpr;
+               andExpressionItem->node = (Node *) andExpr;
                andExpressionItem->parent = NULL;
                andExpressionItem->processed = false;
 

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/55f0ff7e/src/backend/access/external/test/pxffilters_test.c
----------------------------------------------------------------------
diff --git a/src/backend/access/external/test/pxffilters_test.c 
b/src/backend/access/external/test/pxffilters_test.c
index 76be330..fa1db94 100644
--- a/src/backend/access/external/test/pxffilters_test.c
+++ b/src/backend/access/external/test/pxffilters_test.c
@@ -183,19 +183,19 @@ test__const_to_str__int(void **state)
 void
 test__const_to_str__text(void **state)
 {
-       verify__const_to_str(false, "that", TEXTOID, "\\\"that\\\"");
-       verify__const_to_str(false, "joke", VARCHAROID, "\\\"joke\\\"");
-       verify__const_to_str(false, "isn't", BPCHAROID, "\\\"isn't\\\"");
-       verify__const_to_str(false, "funny", CHAROID, "\\\"funny\\\"");
-       verify__const_to_str(false, "anymore", BYTEAOID, "\\\"anymore\\\"");
-       verify__const_to_str(false, "iamdate", DATEOID, "\\\"iamdate\\\"");
+       verify__const_to_str(false, "that", TEXTOID, "that");
+       verify__const_to_str(false, "joke", VARCHAROID, "joke");
+       verify__const_to_str(false, "isn't", BPCHAROID, "isn't");
+       verify__const_to_str(false, "funny", CHAROID, "funny");
+       verify__const_to_str(false, "anymore", BYTEAOID, "anymore");
+       verify__const_to_str(false, "iamdate", DATEOID, "iamdate");
 }
 
 void
 test__const_to_str__boolean(void **state)
 {
-       verify__const_to_str(false, "t", BOOLOID, "\"true\"");
-       verify__const_to_str(false, "f", BOOLOID, "\"false\"");
+       verify__const_to_str(false, "t", BOOLOID, "true");
+       verify__const_to_str(false, "f", BOOLOID, "false");
 }
 
 void
@@ -499,7 +499,7 @@ void test__pxf_serialize_filter_list__oneFilter(void 
**state) {
        expressionItems = lappend(expressionItems, filterExpressionItem);
 
        char* result = pxf_serialize_filter_list(expressionItems);
-       assert_string_equal(result, "a0c\\\"1984\\\"o5");
+       assert_string_equal(result, "a0c25s4d1984o5");
 
        pxf_free_expression_items_list(expressionItems, true);
        expressionItems = NIL;
@@ -514,23 +514,28 @@ test__pxf_serialize_filter_list__manyFilters(void **state)
        List* expressionItems = NIL;
 
        ExpressionItem* expressionItem1 = build_expression_item(1, TEXTOID, 
"1984", TEXTOID, TextEqualOperator);
-       ExpressionItem* expressionItem2 = build_expression_item(2, TEXTOID, 
"\"George Orwell\"", TEXTOID, TextEqualOperator);
-       ExpressionItem* expressionItem3 = build_expression_item(3, TEXTOID, 
"\"Winston\"", TEXTOID, TextEqualOperator);
-       ExpressionItem* expressionItem4 = build_expression_item(4, TEXTOID, 
"\"Eric-%\"", TEXTOID, 1209);
+       ExpressionItem* expressionItem2 = build_expression_item(2, TEXTOID, 
"George Orwell", TEXTOID, TextEqualOperator);
+       ExpressionItem* expressionItem3 = build_expression_item(3, TEXTOID, 
"Winston", TEXTOID, TextEqualOperator);
+       ExpressionItem* expressionItem4 = build_expression_item(4, TEXTOID, 
"Eric-%", TEXTOID, 1209);
+       ExpressionItem* expressionItem5 = build_expression_item(5, TEXTOID, 
"\"Ugly\" string with quotes", TEXTOID, TextEqualOperator);
+       ExpressionItem* expressionItem6 = build_expression_item(6, TEXTOID, "", 
TEXTOID, TextEqualOperator);
 
 
        expressionItems = lappend(expressionItems, expressionItem1);
        expressionItems = lappend(expressionItems, expressionItem2);
        expressionItems = lappend(expressionItems, expressionItem3);
        expressionItems = lappend(expressionItems, expressionItem4);
+       expressionItems = lappend(expressionItems, expressionItem5);
+       expressionItems = lappend(expressionItems, expressionItem6);
 
        result = pxf_serialize_filter_list(expressionItems);
-       assert_string_equal(result, "a0c\\\"1984\\\"o5a1c\\\"\"George 
Orwell\"\\\"o5a2c\\\"\"Winston\"\\\"o5a3c\\\"\"Eric-%\"\\\"o7");
+       assert_string_equal(result, "a0c25s4d1984o5a1c25s13dGeorge 
Orwello5a2c25s7dWinstono5a3c25s6dEric-%o7a4c25s25d\"Ugly\" string with 
quoteso5a5c25s0do5");
        pfree(result);
 
+       int trivialExpressionItems = expressionItems->length;
        enrich_trivial_expression(expressionItems);
 
-       assert_int_equal(expressionItems->length, 7);
+       assert_int_equal(expressionItems->length, 2*trivialExpressionItems - 1);
 
        pxf_free_expression_items_list(expressionItems, true);
        expressionItems = NIL;

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/55f0ff7e/src/include/access/pxffilters.h
----------------------------------------------------------------------
diff --git a/src/include/access/pxffilters.h b/src/include/access/pxffilters.h
index 894337b..00c77d3 100644
--- a/src/include/access/pxffilters.h
+++ b/src/include/access/pxffilters.h
@@ -53,9 +53,11 @@ typedef enum PxfOperatorCode
  * by a code that will describe the operator type in the final serialized
  * string that gets pushed down.
  */
-#define PXF_ATTR_CODE          'a'
-#define PXF_CONST_CODE         'c'
-#define PXF_OPERATOR_CODE      'o'
+#define PXF_ATTR_CODE                          'a'
+#define PXF_CONST_CODE                         'c'
+#define PXF_SIZE_BYTES                         's'
+#define PXF_CONST_DATA                         'd'
+#define PXF_OPERATOR_CODE                      'o'
 #define PXF_LOGICAL_OPERATOR_CODE      'l'
 
 /*
@@ -68,6 +70,7 @@ typedef struct PxfOperand
        char            opcode;         /* PXF_ATTR_CODE or PXF_CONST_CODE*/
        AttrNumber      attnum;         /* used when opcode is PXF_ATTR_CODE */
        StringInfo      conststr;       /* used when opcode is PXF_CONST_CODE */
+       Oid             consttype;      /* used when opcode is PXF_CONST_CODE */
 
 } PxfOperand;
 

Reply via email to