You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hawq.apache.org by ka...@apache.org on 2017/02/24 17:28:06 UTC
incubator-hawq git commit: HAWQ-944. Implement new pg_ltoa function
as per postgres
Repository: incubator-hawq
Updated Branches:
refs/heads/master 6bc9fd7aa -> 6508ebb84
HAWQ-944. Implement new pg_ltoa function as per postgres
Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/6508ebb8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/6508ebb8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/6508ebb8
Branch: refs/heads/master
Commit: 6508ebb846ee00c94bcd7ebe6c21e52c65d49b61
Parents: 6bc9fd7
Author: Kavinder Dhaliwal <ka...@gmail.com>
Authored: Wed Jul 20 16:14:10 2016 -0700
Committer: Kavinder Dhaliwal <ka...@gmail.com>
Committed: Fri Feb 24 09:27:06 2017 -0800
----------------------------------------------------------------------
configure | 5 +
configure.in | 4 +
src/backend/access/external/pxfheaders.c | 5 +-
src/backend/access/external/pxfutils.c | 2 +-
.../access/external/test/ha_config_test.c | 4 +-
src/backend/commands/copy.c | 2 +-
src/backend/commands/tablecmds.c | 4 +-
src/backend/utils/adt/numutils.c | 112 +++++++++----------
src/include/pg_config.h.in | 3 +
9 files changed, 71 insertions(+), 70 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/6508ebb8/configure
----------------------------------------------------------------------
diff --git a/configure b/configure
index b5dca4f..14f88e4 100755
--- a/configure
+++ b/configure
@@ -15105,6 +15105,11 @@ cat >>confdefs.h <<_ACEOF
_ACEOF
+# Define the length of char bytes needed to represent int32
+
+$as_echo "#define INT32_CHAR_SIZE 12" >>confdefs.h
+
+
# Now we have checked all the reasons to replace snprintf
if test $pgac_need_repl_snprintf = yes; then
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/6508ebb8/configure.in
----------------------------------------------------------------------
diff --git a/configure.in b/configure.in
index 2f35e16..14e2f6a 100644
--- a/configure.in
+++ b/configure.in
@@ -1898,6 +1898,10 @@ AC_DEFINE_UNQUOTED(INT64_FORMAT, $INT64_FORMAT,
AC_DEFINE_UNQUOTED(UINT64_FORMAT, $UINT64_FORMAT,
[Define to the appropriate snprintf format for unsigned 64-bit ints, if any.])
+# Define the length of char bytes needed to represent int32
+AC_DEFINE(INT32_CHAR_SIZE, 12,
+ [Define number of bytes required to represent an Int32 in Char format])
+
# Now we have checked all the reasons to replace snprintf
if test $pgac_need_repl_snprintf = yes; then
AC_DEFINE(USE_REPL_SNPRINTF, 1, [Use replacement snprintf() functions.])
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/6508ebb8/src/backend/access/external/pxfheaders.c
----------------------------------------------------------------------
diff --git a/src/backend/access/external/pxfheaders.c b/src/backend/access/external/pxfheaders.c
index a60dc48..8e91644 100644
--- a/src/backend/access/external/pxfheaders.c
+++ b/src/backend/access/external/pxfheaders.c
@@ -140,9 +140,8 @@ static void add_alignment_size_httpheader(CHURL_HEADERS headers)
*/
static void add_tuple_desc_httpheader(CHURL_HEADERS headers, Relation rel)
{
- char long_number[sizeof(int32) * 8];
-
- StringInfoData formatter;
+ char long_number[INT32_CHAR_SIZE];
+ StringInfoData formatter;
TupleDesc tuple;
initStringInfo(&formatter);
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/6508ebb8/src/backend/access/external/pxfutils.c
----------------------------------------------------------------------
diff --git a/src/backend/access/external/pxfutils.c b/src/backend/access/external/pxfutils.c
index fec3223..fb6b799 100644
--- a/src/backend/access/external/pxfutils.c
+++ b/src/backend/access/external/pxfutils.c
@@ -43,7 +43,7 @@ bool are_ips_equal(char *ip1, char *ip2)
/* override port str with given new port int */
void port_to_str(char **port, int new_port)
{
- char tmp[10];
+ char tmp[INT32_CHAR_SIZE];
if (!port)
elog(ERROR, "unexpected internal error in pxfutils.c");
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/6508ebb8/src/backend/access/external/test/ha_config_test.c
----------------------------------------------------------------------
diff --git a/src/backend/access/external/test/ha_config_test.c b/src/backend/access/external/test/ha_config_test.c
index 424c7ed..ddb8cbe 100644
--- a/src/backend/access/external/test/ha_config_test.c
+++ b/src/backend/access/external/test/ha_config_test.c
@@ -154,7 +154,7 @@ test__GPHD_HA_load_nodes__PxfServicePortIsAssigned(void **state)
{
unsigned int numn = 2;
Namenode nns[] = { {"mdw:2080", "mdw:50070"}, {"smdw:2080", "smdw:50070"}};
- char strPort[30] = {0};
+ char strPort[INT32_CHAR_SIZE] = {0};
pg_ltoa(pxf_service_port, strPort);
will_return(hdfsGetHANamenodes, nns);
@@ -188,7 +188,7 @@ test__GPHD_HA_load_nodes__HostMissing(void **state)
{
unsigned int numn = 2;
Namenode nns[] = { {":2080", "mdw:50070"}, {"smdw:2080", "smdw:50070"}};
- char strPort[30] = {0};
+ char strPort[INT32_CHAR_SIZE] = {0};
pg_ltoa(pxf_service_port, strPort);
will_return(hdfsGetHANamenodes, nns);
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/6508ebb8/src/backend/commands/copy.c
----------------------------------------------------------------------
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index ccdd169..d500d11 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -2520,7 +2520,7 @@ CopyOneRowTo(CopyState cstate, Oid tupleOid, Datum *values, bool *isnulls)
if (out_functions[attnum -1].fn_oid == 39 || /* int2out or int4out */
out_functions[attnum -1].fn_oid == 43 )
{
- char tmp[33];
+ char tmp[INT32_CHAR_SIZE];
/*
* The standard postgres way is to call the output function, but that involves one or more pallocs,
* and a call to sprintf, followed by a conversion to client charset.
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/6508ebb8/src/backend/commands/tablecmds.c
----------------------------------------------------------------------
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index f4ce8e6..eb6944e 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -869,7 +869,7 @@ static Datum AddDefaultPageRowGroupSize(Datum relOptions, List *defList){
text *t;
const char *name = "pagesize";
Size len;
- char value[20];
+ char value[INT32_CHAR_SIZE];
pg_ltoa(DEFAULT_PARQUET_PAGE_SIZE_PARTITION, value);
len = VARHDRSZ + strlen(name) + 1 + strlen(value);
@@ -885,7 +885,7 @@ static Datum AddDefaultPageRowGroupSize(Datum relOptions, List *defList){
if(rowgroupSizeSet == false){
text *t;
const char *name = "rowgroupsize";
- char value[20];
+ char value[INT32_CHAR_SIZE];
Size len;
pg_ltoa(DEFAULT_PARQUET_ROWGROUP_SIZE_PARTITION, value);
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/6508ebb8/src/backend/utils/adt/numutils.c
----------------------------------------------------------------------
diff --git a/src/backend/utils/adt/numutils.c b/src/backend/utils/adt/numutils.c
index aed3e3e..0d3863b 100644
--- a/src/backend/utils/adt/numutils.c
+++ b/src/backend/utils/adt/numutils.c
@@ -112,81 +112,71 @@ pg_atoi(char *s, int size, int c)
}
/*
- * pg_itoa - converts a short int to its string representation
+ * pg_itoa: converts a signed 16-bit integer to its string representation
*
- * Note:
- * previously based on ~ingres/source/gutil/atoi.c
- * now uses vendor's sprintf conversion
+ * Caller must ensure that 'a' points to enough memory to hold the result
+ * (at least 7 bytes, counting a leading sign and trailing NUL).
+ *
+ * It doesn't seem worth implementing this separately.
*/
void
pg_itoa(int16 i, char *a)
{
- /*
- * The standard postgres way is to sprintf, but that uses a lot of cpu.
- * Do a fast conversion to string instead.
- */
- char tmp[33];
- char *tp = tmp;
- char *sp;
- int ii = 0;
- unsigned long v;
- long value = i;
- bool sign = (value < 0);;
- if (sign)
- v = -value;
- else
- v = (unsigned long)value;
- while (v || tp == tmp)
- {
- ii = v % 10;
- v = v / 10;
- *tp++ = ii+'0';
- }
- sp = a;
- if (sign)
- *sp++ = '-';
- while (tp > tmp)
- *sp++ = *--tp;
- *sp = 0;
-
+ pg_ltoa((int32)i, a);
}
/*
- * pg_ltoa - converts a long int to its string representation
+ * pg_ltoa: converts a signed 32-bit integer to its string representation
*
- * Note:
- * previously based on ~ingres/source/gutil/atoi.c
- * now uses vendor's sprintf conversion
+ * Caller must ensure that 'a' points to enough memory to hold the result
+ * (at least 12 bytes, counting a leading sign and trailing NUL).
+ *
+ * This is ported from Postgres commit #4fc115b. The previous implementation
+ * in HAWQ allocated a 33 byte char[] when converting but an int32's string
+ * representation requires only a maximum 12.
*/
void
pg_ltoa(int32 l, char *a)
{
- /*
- * The standard postgres way is to sprintf, but that uses a lot of cpu.
- * Do a fast conversion to string instead.
+ char *start = a;
+ bool neg = false;
+
+ /*
+ * Avoid problems with the most negative integer not being representable
+ * as a positive integer.
*/
- char tmp[33];
- char *tp = tmp;
- char *sp;
- int ii = 0;
- unsigned long v;
- long value = l;
- bool sign = (value < 0);;
- if (sign)
- v = -value;
- else
- v = (unsigned long)value;
- while (v || tp == tmp)
+ if (l == INT32_MIN)
+ {
+ memcpy(a, "-2147483648", 12);
+ return;
+ }
+ else if (l < 0)
+ {
+ l = -l;
+ neg = true;
+ }
+
+ /* Compute the result backwards. */
+ do
{
- ii = v % 10;
- v = v / 10;
- *tp++ = ii+'0';
+ int32 remainder;
+ int32 oldval = l;
+ l /= 10;
+ remainder = oldval - l * 10;
+ *a++ = '0' + remainder;
+ } while (l != 0);
+ if (neg)
+ *a++ = '-';
+
+ /* Add trailing NUL byte. */
+ *a-- = '\0';
+
+ /* reverse string */
+ while (start < a)
+ {
+ char swap = *start;
+ *start++ = *a;
+ *a-- = swap;
}
- sp = a;
- if (sign)
- *sp++ = '-';
- while (tp > tmp)
- *sp++ = *--tp;
- *sp = 0;
-
+
}
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/6508ebb8/src/include/pg_config.h.in
----------------------------------------------------------------------
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 10cb221..0b1ccd3 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -704,6 +704,9 @@
/* HAWQ version as a number */
#undef HQ_VERSION_NUM
+/* Define number of bytes required to represent an Int32 in Char format */
+#undef INT32_CHAR_SIZE
+
/* Define to the appropriate snprintf format for 64-bit ints, if any. */
#undef INT64_FORMAT