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 <[email protected]> Authored: Wed Aug 24 12:11:34 2016 -0700 Committer: Oleksandr Diachenko <[email protected]> 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); }
