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);
}