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/24 19:13:20 UTC

incubator-hawq git commit: HAWQ-997. HAWQ doesn't send PXF data type with precision.

Repository: incubator-hawq
Updated Branches:
  refs/heads/master aa7a5d2ad -> c2280debb


HAWQ-997. HAWQ doesn't send PXF data type with precision.


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

Branch: refs/heads/master
Commit: c2280debbd7971c227ca6a357375cf7bd91f43ef
Parents: aa7a5d2
Author: Oleksandr Diachenko <od...@pivotal.io>
Authored: Wed Aug 24 12:11:34 2016 -0700
Committer: Oleksandr Diachenko <od...@pivotal.io>
Committed: Wed Aug 24 12:11:34 2016 -0700

----------------------------------------------------------------------
 src/backend/access/external/pxfheaders.c | 84 ++++++++++++++++++++++++++-
 1 file changed, 82 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/c2280deb/src/backend/access/external/pxfheaders.c
----------------------------------------------------------------------
diff --git a/src/backend/access/external/pxfheaders.c b/src/backend/access/external/pxfheaders.c
index 49dd966..bafbae3 100644
--- a/src/backend/access/external/pxfheaders.c
+++ b/src/backend/access/external/pxfheaders.c
@@ -124,12 +124,14 @@ static void add_alignment_size_httpheader(CHURL_HEADERS headers)
 
 /* 
  * Report tuple description to remote component 
- * Currently, number of attributes, attributes names and types 
+ * Currently, number of attributes, attributes names, types and types modifiers
  * Each attribute has a pair of key/value 
  * where X is the number of the attribute
  * X-GP-ATTR-NAMEX - attribute X's name 
  * X-GP-ATTR-TYPECODEX - attribute X's type OID (e.g, 16)
  * X-GP-ATTR-TYPENAMEX - attribute X's type name (e.g, "boolean")
+ * optional - X-GP-ATTR-TYPEMODX-COUNT - total number of modifier for attribute X
+ * optional - X-GP-ATTR-TYPEMODX-Y - attribute X's modifiers Y (types which have precision info, like numeric(p,s))
  */
 static void add_tuple_desc_httpheader(CHURL_HEADERS headers, Relation rel)
 {	
@@ -164,7 +166,85 @@ static void add_tuple_desc_httpheader(CHURL_HEADERS headers, Relation rel)
         resetStringInfo(&formatter);
         appendStringInfo(&formatter, "X-GP-ATTR-TYPENAME%u", i);
         churl_headers_append(headers, formatter.data, TypeOidGetTypename(tuple->attrs[i]->atttypid));
-    }
+
+		/* Add attribute type modifiers if any*/
+		if (tuple->attrs[i]->atttypmod > -1)
+		{
+			switch (tuple->attrs[i]->atttypid)
+			{
+				case NUMERICOID:
+				{
+					resetStringInfo(&formatter);
+					appendStringInfo(&formatter, "X-GP-ATTR-TYPEMOD%u-COUNT", i);
+					pg_ltoa(2, long_number);
+					churl_headers_append(headers, formatter.data, long_number);
+
+
+					/* precision */
+					resetStringInfo(&formatter);
+					appendStringInfo(&formatter, "X-GP-ATTR-TYPEMOD%u-%u", i, 0);
+					pg_ltoa((tuple->attrs[i]->atttypmod >> 16) & 0xffff, long_number);
+					churl_headers_append(headers, formatter.data, long_number);
+
+					/* scale */
+					resetStringInfo(&formatter);
+					appendStringInfo(&formatter, "X-GP-ATTR-TYPEMOD%u-%u", i, 1);
+					pg_ltoa((tuple->attrs[i]->atttypmod - VARHDRSZ) & 0xffff, long_number);
+					churl_headers_append(headers, formatter.data, long_number);
+					break;
+				}
+				case CHAROID:
+				case BPCHAROID:
+				case VARCHAROID:
+				{
+					resetStringInfo(&formatter);
+					appendStringInfo(&formatter, "X-GP-ATTR-TYPEMOD%u-COUNT", i);
+					pg_ltoa(1, long_number);
+					churl_headers_append(headers, formatter.data, long_number);
+
+					resetStringInfo(&formatter);
+					appendStringInfo(&formatter, "X-GP-ATTR-TYPEMOD%u-%u", i, 0);
+					pg_ltoa((tuple->attrs[i]->atttypmod - VARHDRSZ), long_number);
+					churl_headers_append(headers, formatter.data, long_number);
+					break;
+				}
+				case VARBITOID:
+				case BITOID:
+				case TIMESTAMPOID:
+				case TIMESTAMPTZOID:
+				case TIMEOID:
+				case TIMETZOID:
+				{
+					resetStringInfo(&formatter);
+					appendStringInfo(&formatter, "X-GP-ATTR-TYPEMOD%u-COUNT", i);
+					pg_ltoa(1, long_number);
+					churl_headers_append(headers, formatter.data, long_number);
+
+					resetStringInfo(&formatter);
+					appendStringInfo(&formatter, "X-GP-ATTR-TYPEMOD%u-%u", i, 0);
+					pg_ltoa((tuple->attrs[i]->atttypmod), long_number);
+					churl_headers_append(headers, formatter.data, long_number);
+					break;
+				}
+				case INTERVALOID:
+				{
+					resetStringInfo(&formatter);
+					appendStringInfo(&formatter, "X-GP-ATTR-TYPEMOD%u-COUNT", i);
+					pg_ltoa(1, long_number);
+					churl_headers_append(headers, formatter.data, long_number);
+
+					resetStringInfo(&formatter);
+					appendStringInfo(&formatter, "X-GP-ATTR-TYPEMOD%u-%u", i, 0);
+					pg_ltoa(INTERVAL_PRECISION(tuple->attrs[i]->atttypmod), long_number);
+					churl_headers_append(headers, formatter.data, long_number);
+					break;
+				}
+				default:
+					elog(DEBUG5, "add_tuple_desc_httpheader: unsupported type %d ", tuple->attrs[i]->atttypid);
+					break;
+			}
+		}
+	}
 	
 	pfree(formatter.data);
 }