Portability concerns over pq_sendbyte?
In PG11, pq_sendbyte got changed from taking an int parameter to taking
an int8.
While that seems to work in general, it does mean that there are now
several places in the code that do the equivalent of:
unsigned char x = 128;
pq_sendbyte(&buf, x);
which I believe is not well-defined since pq_sendbyte takes an int8, and
conversions of unrepresentable values to _signed_ integer types are
(iirc) implementation-dependent.
There are also some cases where pq_sendint16 is being called for an
unsigned value or a value that might exceed 32767.
Would it be better for these to take unsigned values, or have unsigned
variants?
--
Andrew (irc:RhodiumToad)
On Thu, May 24, 2018 at 06:13:23PM +0100, Andrew Gierth wrote:
In PG11, pq_sendbyte got changed from taking an int parameter to taking
an int8.
From 1de09ad8.
While that seems to work in general, it does mean that there are now
several places in the code that do the equivalent of:unsigned char x = 128;
pq_sendbyte(&buf, x);which I believe is not well-defined since pq_sendbyte takes an int8, and
conversions of unrepresentable values to _signed_ integer types are
(iirc) implementation-dependent.
Good point.
There are also some cases where pq_sendint16 is being called for an
unsigned value or a value that might exceed 32767.
If kept, some safeguards based on PG_INT*_[MIN|MAX] could be
appropriate.
Would it be better for these to take unsigned values, or have unsigned
variants?
It seems to me that it is not too late to change those interfaces so
as they use unsigned values in input so as they are consistent, it would
be dangerous on the contrary to keep those as they are.
--
Michael
On 2018-May-24, Andrew Gierth wrote:
In PG11, pq_sendbyte got changed from taking an int parameter to taking
an int8.
Would it be better for these to take unsigned values, or have unsigned
variants?
Do you have an answer to this question? Does anybody else?
(My guts tell me it'd be better to change these routines to take
unsigned values, without creating extra variants. But guts frequently
misspeak.)
Andres, you own this open item, unless one of the other committers who
have participated in this thread would like to take it as their own.
--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
On Wed, Jun 06, 2018 at 12:27:58PM -0400, Alvaro Herrera wrote:
Do you have an answer to this question? Does anybody else?
(My guts tell me it'd be better to change these routines to take
unsigned values, without creating extra variants. But guts frequently
misspeak.)
My guts are telling me as well to not have more variants. On top of
that it seems to me that we'd want to rename any new routines to include
"uint" in their name instead of "int", and for compatibility with past
code pq_sendint should not be touched.
--
Michael
On Mon, Jun 11, 2018 at 02:25:44PM +0900, Michael Paquier wrote:
On Wed, Jun 06, 2018 at 12:27:58PM -0400, Alvaro Herrera wrote:
Do you have an answer to this question? Does anybody else?
(My guts tell me it'd be better to change these routines to take
unsigned values, without creating extra variants. But guts frequently
misspeak.)My guts are telling me as well to not have more variants. On top of
that it seems to me that we'd want to rename any new routines to include
"uint" in their name instead of "int", and for compatibility with past
code pq_sendint should not be touched.
And also pq_sendint64 needs to be kept around for compatibility. I have
quickly looked at how much code would be involved here and there are
quite close to 240 code paths which involve the new routines. Please
see attached for reference, I have not put much thoughts into it to be
honest, so that's really at an early stage.
--
Michael
Attachments:
pq-send-uint-v1.patchtext/x-diff; charset=us-asciiDownload
diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c
index 745497c76f..7c8da5bf22 100644
--- a/contrib/hstore/hstore_io.c
+++ b/contrib/hstore/hstore_io.c
@@ -1234,23 +1234,23 @@ hstore_send(PG_FUNCTION_ARGS)
pq_begintypsend(&buf);
- pq_sendint32(&buf, count);
+ pq_senduint32(&buf, count);
for (i = 0; i < count; i++)
{
int32 keylen = HSTORE_KEYLEN(entries, i);
- pq_sendint32(&buf, keylen);
+ pq_senduint32(&buf, keylen);
pq_sendtext(&buf, HSTORE_KEY(entries, base, i), keylen);
if (HSTORE_VALISNULL(entries, i))
{
- pq_sendint32(&buf, -1);
+ pq_senduint32(&buf, -1);
}
else
{
int32 vallen = HSTORE_VALLEN(entries, i);
- pq_sendint32(&buf, vallen);
+ pq_senduint32(&buf, vallen);
pq_sendtext(&buf, HSTORE_VAL(entries, base, i), vallen);
}
}
diff --git a/src/backend/access/common/printsimple.c b/src/backend/access/common/printsimple.c
index 3c4d227712..c5aade3e44 100644
--- a/src/backend/access/common/printsimple.c
+++ b/src/backend/access/common/printsimple.c
@@ -34,19 +34,19 @@ printsimple_startup(DestReceiver *self, int operation, TupleDesc tupdesc)
int i;
pq_beginmessage(&buf, 'T'); /* RowDescription */
- pq_sendint16(&buf, tupdesc->natts);
+ pq_senduint16(&buf, tupdesc->natts);
for (i = 0; i < tupdesc->natts; ++i)
{
Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
pq_sendstring(&buf, NameStr(attr->attname));
- pq_sendint32(&buf, 0); /* table oid */
- pq_sendint16(&buf, 0); /* attnum */
- pq_sendint32(&buf, (int) attr->atttypid);
- pq_sendint16(&buf, attr->attlen);
- pq_sendint32(&buf, attr->atttypmod);
- pq_sendint16(&buf, 0); /* format code */
+ pq_senduint32(&buf, 0); /* table oid */
+ pq_senduint16(&buf, 0); /* attnum */
+ pq_senduint32(&buf, (uint32) attr->atttypid);
+ pq_senduint16(&buf, attr->attlen);
+ pq_senduint32(&buf, attr->atttypmod);
+ pq_senduint16(&buf, 0); /* format code */
}
pq_endmessage(&buf);
@@ -67,7 +67,7 @@ printsimple(TupleTableSlot *slot, DestReceiver *self)
/* Prepare and send message */
pq_beginmessage(&buf, 'D');
- pq_sendint16(&buf, tupdesc->natts);
+ pq_senduint16(&buf, tupdesc->natts);
for (i = 0; i < tupdesc->natts; ++i)
{
@@ -76,7 +76,7 @@ printsimple(TupleTableSlot *slot, DestReceiver *self)
if (slot->tts_isnull[i])
{
- pq_sendint32(&buf, -1);
+ pq_senduint32(&buf, -1);
continue;
}
diff --git a/src/backend/access/common/printtup.c b/src/backend/access/common/printtup.c
index a1d4415704..8b85e34baf 100644
--- a/src/backend/access/common/printtup.c
+++ b/src/backend/access/common/printtup.c
@@ -203,7 +203,7 @@ SendRowDescriptionMessage(StringInfo buf, TupleDesc typeinfo,
/* tuple descriptor message type */
pq_beginmessage_reuse(buf, 'T');
/* # of attrs in tuples */
- pq_sendint16(buf, natts);
+ pq_senduint16(buf, natts);
if (proto >= 3)
SendRowDescriptionCols_3(buf, typeinfo, targetlist, formats);
@@ -280,12 +280,12 @@ SendRowDescriptionCols_3(StringInfo buf, TupleDesc typeinfo, List *targetlist, i
format = 0;
pq_writestring(buf, NameStr(att->attname));
- pq_writeint32(buf, resorigtbl);
- pq_writeint16(buf, resorigcol);
- pq_writeint32(buf, atttypid);
- pq_writeint16(buf, att->attlen);
- pq_writeint32(buf, atttypmod);
- pq_writeint16(buf, format);
+ pq_writeuint32(buf, resorigtbl);
+ pq_writeuint16(buf, resorigcol);
+ pq_writeuint32(buf, atttypid);
+ pq_writeuint16(buf, att->attlen);
+ pq_writeuint32(buf, atttypmod);
+ pq_writeuint16(buf, format);
}
}
@@ -309,9 +309,9 @@ SendRowDescriptionCols_2(StringInfo buf, TupleDesc typeinfo, List *targetlist, i
pq_sendstring(buf, NameStr(att->attname));
/* column ID only info appears in protocol 3.0 and up */
- pq_sendint32(buf, atttypid);
- pq_sendint16(buf, att->attlen);
- pq_sendint32(buf, atttypmod);
+ pq_senduint32(buf, atttypid);
+ pq_senduint16(buf, att->attlen);
+ pq_senduint32(buf, atttypmod);
/* format info only appears in protocol 3.0 and up */
}
}
@@ -395,7 +395,7 @@ printtup(TupleTableSlot *slot, DestReceiver *self)
*/
pq_beginmessage_reuse(buf, 'D');
- pq_sendint16(buf, natts);
+ pq_senduint16(buf, natts);
/*
* send the attributes of this tuple
@@ -407,7 +407,7 @@ printtup(TupleTableSlot *slot, DestReceiver *self)
if (slot->tts_isnull[i])
{
- pq_sendint32(buf, -1);
+ pq_senduint32(buf, -1);
continue;
}
@@ -436,7 +436,7 @@ printtup(TupleTableSlot *slot, DestReceiver *self)
bytea *outputbytes;
outputbytes = SendFunctionCall(&thisState->finfo, attr);
- pq_sendint32(buf, VARSIZE(outputbytes) - VARHDRSZ);
+ pq_senduint32(buf, VARSIZE(outputbytes) - VARHDRSZ);
pq_sendbytes(buf, VARDATA(outputbytes),
VARSIZE(outputbytes) - VARHDRSZ);
}
@@ -494,13 +494,13 @@ printtup_20(TupleTableSlot *slot, DestReceiver *self)
k >>= 1;
if (k == 0) /* end of byte? */
{
- pq_sendint8(buf, j);
+ pq_senduint8(buf, j);
j = 0;
k = 1 << 7;
}
}
if (k != (1 << 7)) /* flush last partial byte */
- pq_sendint8(buf, j);
+ pq_senduint8(buf, j);
/*
* send the attributes of this tuple
@@ -679,13 +679,13 @@ printtup_internal_20(TupleTableSlot *slot, DestReceiver *self)
k >>= 1;
if (k == 0) /* end of byte? */
{
- pq_sendint8(buf, j);
+ pq_senduint8(buf, j);
j = 0;
k = 1 << 7;
}
}
if (k != (1 << 7)) /* flush last partial byte */
- pq_sendint8(buf, j);
+ pq_senduint8(buf, j);
/*
* send the attributes of this tuple
@@ -702,7 +702,7 @@ printtup_internal_20(TupleTableSlot *slot, DestReceiver *self)
Assert(thisState->format == 1);
outputbytes = SendFunctionCall(&thisState->finfo, attr);
- pq_sendint32(buf, VARSIZE(outputbytes) - VARHDRSZ);
+ pq_senduint32(buf, VARSIZE(outputbytes) - VARHDRSZ);
pq_sendbytes(buf, VARDATA(outputbytes),
VARSIZE(outputbytes) - VARHDRSZ);
}
diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c
index 1d631b7275..f5168a8e50 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -1281,8 +1281,8 @@ ParallelWorkerMain(Datum main_arg)
* in this case.
*/
pq_beginmessage(&msgbuf, 'K');
- pq_sendint32(&msgbuf, (int32) MyProcPid);
- pq_sendint32(&msgbuf, (int32) MyCancelKey);
+ pq_senduint32(&msgbuf, (uint32) MyProcPid);
+ pq_senduint32(&msgbuf, (uint32) MyCancelKey);
pq_endmessage(&msgbuf);
/*
diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c
index ee7c6d41b4..3747faf89c 100644
--- a/src/backend/commands/async.c
+++ b/src/backend/commands/async.c
@@ -2100,7 +2100,7 @@ NotifyMyFrontEnd(const char *channel, const char *payload, int32 srcPid)
StringInfoData buf;
pq_beginmessage(&buf, 'A');
- pq_sendint32(&buf, srcPid);
+ pq_senduint32(&buf, srcPid);
pq_sendstring(&buf, channel);
if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3)
pq_sendstring(&buf, payload);
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 3a66cb5025..abbc0f4bfa 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -357,9 +357,9 @@ SendCopyBegin(CopyState cstate)
pq_beginmessage(&buf, 'H');
pq_sendbyte(&buf, format); /* overall format */
- pq_sendint16(&buf, natts);
+ pq_senduint16(&buf, natts);
for (i = 0; i < natts; i++)
- pq_sendint16(&buf, format); /* per-column formats */
+ pq_senduint16(&buf, format); /* per-column formats */
pq_endmessage(&buf);
cstate->copy_dest = COPY_NEW_FE;
}
@@ -390,9 +390,9 @@ ReceiveCopyBegin(CopyState cstate)
pq_beginmessage(&buf, 'G');
pq_sendbyte(&buf, format); /* overall format */
- pq_sendint16(&buf, natts);
+ pq_senduint16(&buf, natts);
for (i = 0; i < natts; i++)
- pq_sendint16(&buf, format); /* per-column formats */
+ pq_senduint16(&buf, format); /* per-column formats */
pq_endmessage(&buf);
cstate->copy_dest = COPY_NEW_FE;
cstate->fe_msgbuf = makeStringInfo();
diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c
index 63f37902e6..1727c4d692 100644
--- a/src/backend/libpq/auth.c
+++ b/src/backend/libpq/auth.c
@@ -621,7 +621,7 @@ sendAuthRequest(Port *port, AuthRequest areq, const char *extradata, int extrale
CHECK_FOR_INTERRUPTS();
pq_beginmessage(&buf, 'R');
- pq_sendint32(&buf, (int32) areq);
+ pq_senduint32(&buf, (uint32) areq);
if (extralen > 0)
pq_sendbytes(&buf, extradata, extralen);
diff --git a/src/backend/libpq/pqformat.c b/src/backend/libpq/pqformat.c
index 1c7e99019d..dc15f3798a 100644
--- a/src/backend/libpq/pqformat.c
+++ b/src/backend/libpq/pqformat.c
@@ -149,13 +149,13 @@ pq_sendcountedtext(StringInfo buf, const char *str, int slen,
if (p != str) /* actual conversion has been done? */
{
slen = strlen(p);
- pq_sendint32(buf, slen + extra);
+ pq_senduint32(buf, slen + extra);
appendBinaryStringInfoNT(buf, p, slen);
pfree(p);
}
else
{
- pq_sendint32(buf, slen + extra);
+ pq_senduint32(buf, slen + extra);
appendBinaryStringInfoNT(buf, str, slen);
}
}
@@ -260,7 +260,7 @@ pq_sendfloat4(StringInfo buf, float4 f)
} swap;
swap.f = f;
- pq_sendint32(buf, swap.i);
+ pq_senduint32(buf, swap.i);
}
/* --------------------------------
@@ -284,7 +284,7 @@ pq_sendfloat8(StringInfo buf, float8 f)
} swap;
swap.f = f;
- pq_sendint64(buf, swap.i);
+ pq_senduint64(buf, swap.i);
}
/* --------------------------------
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index a4b53b33cd..46c5cf8890 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -2249,8 +2249,8 @@ SendNegotiateProtocolVersion(List *unrecognized_protocol_options)
ListCell *lc;
pq_beginmessage(&buf, 'v'); /* NegotiateProtocolVersion */
- pq_sendint32(&buf, PG_PROTOCOL_LATEST);
- pq_sendint32(&buf, list_length(unrecognized_protocol_options));
+ pq_senduint32(&buf, PG_PROTOCOL_LATEST);
+ pq_senduint32(&buf, list_length(unrecognized_protocol_options));
foreach(lc, unrecognized_protocol_options)
pq_sendstring(&buf, lfirst(lc));
pq_endmessage(&buf);
diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c
index 5688cbe2e9..44fabc862e 100644
--- a/src/backend/replication/basebackup.c
+++ b/src/backend/replication/basebackup.c
@@ -307,7 +307,7 @@ perform_base_backup(basebackup_options *opt)
/* Send CopyOutResponse message */
pq_beginmessage(&buf, 'H');
pq_sendbyte(&buf, 0); /* overall format */
- pq_sendint16(&buf, 0); /* natts */
+ pq_senduint16(&buf, 0); /* natts */
pq_endmessage(&buf);
if (ti->path == NULL)
@@ -771,7 +771,7 @@ send_int8_string(StringInfoData *buf, int64 intval)
char is[32];
sprintf(is, INT64_FORMAT, intval);
- pq_sendint32(buf, strlen(is));
+ pq_senduint32(buf, strlen(is));
pq_sendbytes(buf, is, strlen(is));
}
@@ -783,34 +783,34 @@ SendBackupHeader(List *tablespaces)
/* Construct and send the directory information */
pq_beginmessage(&buf, 'T'); /* RowDescription */
- pq_sendint16(&buf, 3); /* 3 fields */
+ pq_senduint16(&buf, 3); /* 3 fields */
/* First field - spcoid */
pq_sendstring(&buf, "spcoid");
- pq_sendint32(&buf, 0); /* table oid */
- pq_sendint16(&buf, 0); /* attnum */
- pq_sendint32(&buf, OIDOID); /* type oid */
- pq_sendint16(&buf, 4); /* typlen */
- pq_sendint32(&buf, 0); /* typmod */
- pq_sendint16(&buf, 0); /* format code */
+ pq_senduint32(&buf, 0); /* table oid */
+ pq_senduint16(&buf, 0); /* attnum */
+ pq_senduint32(&buf, OIDOID); /* type oid */
+ pq_senduint16(&buf, 4); /* typlen */
+ pq_senduint32(&buf, 0); /* typmod */
+ pq_senduint16(&buf, 0); /* format code */
/* Second field - spcpath */
pq_sendstring(&buf, "spclocation");
- pq_sendint32(&buf, 0);
- pq_sendint16(&buf, 0);
- pq_sendint32(&buf, TEXTOID);
- pq_sendint16(&buf, -1);
- pq_sendint32(&buf, 0);
- pq_sendint16(&buf, 0);
+ pq_senduint32(&buf, 0);
+ pq_senduint16(&buf, 0);
+ pq_senduint32(&buf, TEXTOID);
+ pq_senduint16(&buf, -1);
+ pq_senduint32(&buf, 0);
+ pq_senduint16(&buf, 0);
/* Third field - size */
pq_sendstring(&buf, "size");
- pq_sendint32(&buf, 0);
- pq_sendint16(&buf, 0);
- pq_sendint32(&buf, INT8OID);
- pq_sendint16(&buf, 8);
- pq_sendint32(&buf, 0);
- pq_sendint16(&buf, 0);
+ pq_senduint32(&buf, 0);
+ pq_senduint16(&buf, 0);
+ pq_senduint32(&buf, INT8OID);
+ pq_senduint16(&buf, 8);
+ pq_senduint32(&buf, 0);
+ pq_senduint16(&buf, 0);
pq_endmessage(&buf);
foreach(lc, tablespaces)
@@ -819,28 +819,28 @@ SendBackupHeader(List *tablespaces)
/* Send one datarow message */
pq_beginmessage(&buf, 'D');
- pq_sendint16(&buf, 3); /* number of columns */
+ pq_senduint16(&buf, 3); /* number of columns */
if (ti->path == NULL)
{
- pq_sendint32(&buf, -1); /* Length = -1 ==> NULL */
- pq_sendint32(&buf, -1);
+ pq_senduint32(&buf, -1); /* Length = -1 ==> NULL */
+ pq_senduint32(&buf, -1);
}
else
{
Size len;
len = strlen(ti->oid);
- pq_sendint32(&buf, len);
+ pq_senduint32(&buf, len);
pq_sendbytes(&buf, ti->oid, len);
len = strlen(ti->path);
- pq_sendint32(&buf, len);
+ pq_senduint32(&buf, len);
pq_sendbytes(&buf, ti->path, len);
}
if (ti->size >= 0)
send_int8_string(&buf, ti->size / 1024);
else
- pq_sendint32(&buf, -1); /* NULL */
+ pq_senduint32(&buf, -1); /* NULL */
pq_endmessage(&buf);
}
@@ -861,42 +861,42 @@ SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli)
Size len;
pq_beginmessage(&buf, 'T'); /* RowDescription */
- pq_sendint16(&buf, 2); /* 2 fields */
+ pq_senduint16(&buf, 2); /* 2 fields */
/* Field headers */
pq_sendstring(&buf, "recptr");
- pq_sendint32(&buf, 0); /* table oid */
- pq_sendint16(&buf, 0); /* attnum */
- pq_sendint32(&buf, TEXTOID); /* type oid */
- pq_sendint16(&buf, -1);
- pq_sendint32(&buf, 0);
- pq_sendint16(&buf, 0);
+ pq_senduint32(&buf, 0); /* table oid */
+ pq_senduint16(&buf, 0); /* attnum */
+ pq_senduint32(&buf, TEXTOID); /* type oid */
+ pq_senduint16(&buf, -1);
+ pq_senduint32(&buf, 0);
+ pq_senduint16(&buf, 0);
pq_sendstring(&buf, "tli");
- pq_sendint32(&buf, 0); /* table oid */
- pq_sendint16(&buf, 0); /* attnum */
+ pq_senduint32(&buf, 0); /* table oid */
+ pq_senduint16(&buf, 0); /* attnum */
/*
* int8 may seem like a surprising data type for this, but in theory int4
* would not be wide enough for this, as TimeLineID is unsigned.
*/
- pq_sendint32(&buf, INT8OID); /* type oid */
- pq_sendint16(&buf, -1);
- pq_sendint32(&buf, 0);
- pq_sendint16(&buf, 0);
+ pq_senduint32(&buf, INT8OID); /* type oid */
+ pq_senduint16(&buf, -1);
+ pq_senduint32(&buf, 0);
+ pq_senduint16(&buf, 0);
pq_endmessage(&buf);
/* Data row */
pq_beginmessage(&buf, 'D');
- pq_sendint16(&buf, 2); /* number of columns */
+ pq_senduint16(&buf, 2); /* number of columns */
len = snprintf(str, sizeof(str),
"%X/%X", (uint32) (ptr >> 32), (uint32) ptr);
- pq_sendint32(&buf, len);
+ pq_senduint32(&buf, len);
pq_sendbytes(&buf, str, len);
len = snprintf(str, sizeof(str), "%u", tli);
- pq_sendint32(&buf, len);
+ pq_senduint32(&buf, len);
pq_sendbytes(&buf, str, len);
pq_endmessage(&buf);
diff --git a/src/backend/replication/logical/proto.c b/src/backend/replication/logical/proto.c
index 19451714da..9cf3d46f86 100644
--- a/src/backend/replication/logical/proto.c
+++ b/src/backend/replication/logical/proto.c
@@ -48,9 +48,9 @@ logicalrep_write_begin(StringInfo out, ReorderBufferTXN *txn)
pq_sendbyte(out, 'B'); /* BEGIN */
/* fixed fields */
- pq_sendint64(out, txn->final_lsn);
- pq_sendint64(out, txn->commit_time);
- pq_sendint32(out, txn->xid);
+ pq_senduint64(out, txn->final_lsn);
+ pq_senduint64(out, txn->commit_time);
+ pq_senduint32(out, txn->xid);
}
/*
@@ -83,9 +83,9 @@ logicalrep_write_commit(StringInfo out, ReorderBufferTXN *txn,
pq_sendbyte(out, flags);
/* send fields */
- pq_sendint64(out, commit_lsn);
- pq_sendint64(out, txn->end_lsn);
- pq_sendint64(out, txn->commit_time);
+ pq_senduint64(out, commit_lsn);
+ pq_senduint64(out, txn->end_lsn);
+ pq_senduint64(out, txn->commit_time);
}
/*
@@ -116,7 +116,7 @@ logicalrep_write_origin(StringInfo out, const char *origin,
pq_sendbyte(out, 'O'); /* ORIGIN */
/* fixed fields */
- pq_sendint64(out, origin_lsn);
+ pq_senduint64(out, origin_lsn);
/* origin string */
pq_sendstring(out, origin);
@@ -148,7 +148,7 @@ logicalrep_write_insert(StringInfo out, Relation rel, HeapTuple newtuple)
rel->rd_rel->relreplident == REPLICA_IDENTITY_INDEX);
/* use Oid as relation identifier */
- pq_sendint32(out, RelationGetRelid(rel));
+ pq_senduint32(out, RelationGetRelid(rel));
pq_sendbyte(out, 'N'); /* new tuple follows */
logicalrep_write_tuple(out, rel, newtuple);
@@ -192,7 +192,7 @@ logicalrep_write_update(StringInfo out, Relation rel, HeapTuple oldtuple,
rel->rd_rel->relreplident == REPLICA_IDENTITY_INDEX);
/* use Oid as relation identifier */
- pq_sendint32(out, RelationGetRelid(rel));
+ pq_senduint32(out, RelationGetRelid(rel));
if (oldtuple != NULL)
{
@@ -261,7 +261,7 @@ logicalrep_write_delete(StringInfo out, Relation rel, HeapTuple oldtuple)
pq_sendbyte(out, 'D'); /* action DELETE */
/* use Oid as relation identifier */
- pq_sendint32(out, RelationGetRelid(rel));
+ pq_senduint32(out, RelationGetRelid(rel));
if (rel->rd_rel->relreplident == REPLICA_IDENTITY_FULL)
pq_sendbyte(out, 'O'); /* old tuple follows */
@@ -309,17 +309,17 @@ logicalrep_write_truncate(StringInfo out,
pq_sendbyte(out, 'T'); /* action TRUNCATE */
- pq_sendint32(out, nrelids);
+ pq_senduint32(out, nrelids);
/* encode and send truncate flags */
if (cascade)
flags |= TRUNCATE_CASCADE;
if (restart_seqs)
flags |= TRUNCATE_RESTART_SEQS;
- pq_sendint8(out, flags);
+ pq_senduint8(out, flags);
for (i = 0; i < nrelids; i++)
- pq_sendint32(out, relids[i]);
+ pq_senduint32(out, relids[i]);
}
/*
@@ -358,7 +358,7 @@ logicalrep_write_rel(StringInfo out, Relation rel)
pq_sendbyte(out, 'R'); /* sending RELATION */
/* use Oid as relation identifier */
- pq_sendint32(out, RelationGetRelid(rel));
+ pq_senduint32(out, RelationGetRelid(rel));
/* send qualified relation name */
logicalrep_write_namespace(out, RelationGetNamespace(rel));
@@ -415,7 +415,7 @@ logicalrep_write_typ(StringInfo out, Oid typoid)
typtup = (Form_pg_type) GETSTRUCT(tup);
/* use Oid as relation identifier */
- pq_sendint32(out, typoid);
+ pq_senduint32(out, typoid);
/* send qualified type name */
logicalrep_write_namespace(out, typtup->typnamespace);
@@ -457,7 +457,7 @@ logicalrep_write_tuple(StringInfo out, Relation rel, HeapTuple tuple)
continue;
nliveatts++;
}
- pq_sendint16(out, nliveatts);
+ pq_senduint16(out, nliveatts);
/* try to allocate enough memory from the get-go */
enlargeStringInfo(out, tuple->t_len +
@@ -577,7 +577,7 @@ logicalrep_write_attrs(StringInfo out, Relation rel)
continue;
nliveatts++;
}
- pq_sendint16(out, nliveatts);
+ pq_senduint16(out, nliveatts);
/* fetch bitmap of REPLICATION IDENTITY attributes */
replidentfull = (rel->rd_rel->relreplident == REPLICA_IDENTITY_FULL);
@@ -606,10 +606,10 @@ logicalrep_write_attrs(StringInfo out, Relation rel)
pq_sendstring(out, NameStr(att->attname));
/* attribute type id */
- pq_sendint32(out, (int) att->atttypid);
+ pq_senduint32(out, (int) att->atttypid);
/* attribute mode */
- pq_sendint32(out, att->atttypmod);
+ pq_senduint32(out, att->atttypmod);
}
bms_free(idattrs);
diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c
index 0d2b795e39..d05e267607 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -1394,10 +1394,10 @@ send_feedback(XLogRecPtr recvpos, bool force, bool requestReply)
resetStringInfo(reply_message);
pq_sendbyte(reply_message, 'r');
- pq_sendint64(reply_message, recvpos); /* write */
- pq_sendint64(reply_message, flushpos); /* flush */
- pq_sendint64(reply_message, writepos); /* apply */
- pq_sendint64(reply_message, now); /* sendTime */
+ pq_senduint64(reply_message, recvpos); /* write */
+ pq_senduint64(reply_message, flushpos); /* flush */
+ pq_senduint64(reply_message, writepos); /* apply */
+ pq_senduint64(reply_message, now); /* sendTime */
pq_sendbyte(reply_message, requestReply); /* replyRequested */
elog(DEBUG2, "sending feedback (force %d) to recv %X/%X, write %X/%X, flush %X/%X",
diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index 987bb84683..1dec647871 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -1164,10 +1164,10 @@ XLogWalRcvSendReply(bool force, bool requestReply)
resetStringInfo(&reply_message);
pq_sendbyte(&reply_message, 'r');
- pq_sendint64(&reply_message, writePtr);
- pq_sendint64(&reply_message, flushPtr);
- pq_sendint64(&reply_message, applyPtr);
- pq_sendint64(&reply_message, GetCurrentTimestamp());
+ pq_senduint64(&reply_message, writePtr);
+ pq_senduint64(&reply_message, flushPtr);
+ pq_senduint64(&reply_message, applyPtr);
+ pq_senduint64(&reply_message, GetCurrentTimestamp());
pq_sendbyte(&reply_message, requestReply ? 1 : 0);
/* Send it */
@@ -1285,11 +1285,11 @@ XLogWalRcvSendHSFeedback(bool immed)
/* Construct the message and send it. */
resetStringInfo(&reply_message);
pq_sendbyte(&reply_message, 'h');
- pq_sendint64(&reply_message, GetCurrentTimestamp());
- pq_sendint32(&reply_message, xmin);
- pq_sendint32(&reply_message, xmin_epoch);
- pq_sendint32(&reply_message, catalog_xmin);
- pq_sendint32(&reply_message, catalog_xmin_epoch);
+ pq_senduint64(&reply_message, GetCurrentTimestamp());
+ pq_senduint32(&reply_message, xmin);
+ pq_senduint32(&reply_message, xmin_epoch);
+ pq_senduint32(&reply_message, catalog_xmin);
+ pq_senduint32(&reply_message, catalog_xmin_epoch);
walrcv_send(wrconn, reply_message.data, reply_message.len);
if (TransactionIdIsValid(xmin) || TransactionIdIsValid(catalog_xmin))
master_has_standby_xmin = true;
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index e47ddca6bc..0e4669dab2 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -445,32 +445,32 @@ SendTimeLineHistory(TimeLineHistoryCmd *cmd)
/* Send a RowDescription message */
pq_beginmessage(&buf, 'T');
- pq_sendint16(&buf, 2); /* 2 fields */
+ pq_senduint16(&buf, 2); /* 2 fields */
/* first field */
pq_sendstring(&buf, "filename"); /* col name */
- pq_sendint32(&buf, 0); /* table oid */
- pq_sendint16(&buf, 0); /* attnum */
- pq_sendint32(&buf, TEXTOID); /* type oid */
- pq_sendint16(&buf, -1); /* typlen */
- pq_sendint32(&buf, 0); /* typmod */
- pq_sendint16(&buf, 0); /* format code */
+ pq_senduint32(&buf, 0); /* table oid */
+ pq_senduint16(&buf, 0); /* attnum */
+ pq_senduint32(&buf, TEXTOID); /* type oid */
+ pq_senduint16(&buf, -1); /* typlen */
+ pq_senduint32(&buf, 0); /* typmod */
+ pq_senduint16(&buf, 0); /* format code */
/* second field */
pq_sendstring(&buf, "content"); /* col name */
- pq_sendint32(&buf, 0); /* table oid */
- pq_sendint16(&buf, 0); /* attnum */
- pq_sendint32(&buf, BYTEAOID); /* type oid */
- pq_sendint16(&buf, -1); /* typlen */
- pq_sendint32(&buf, 0); /* typmod */
- pq_sendint16(&buf, 0); /* format code */
+ pq_senduint32(&buf, 0); /* table oid */
+ pq_senduint16(&buf, 0); /* attnum */
+ pq_senduint32(&buf, BYTEAOID); /* type oid */
+ pq_senduint16(&buf, -1); /* typlen */
+ pq_senduint32(&buf, 0); /* typmod */
+ pq_senduint16(&buf, 0); /* format code */
pq_endmessage(&buf);
/* Send a DataRow message */
pq_beginmessage(&buf, 'D');
- pq_sendint16(&buf, 2); /* # of columns */
+ pq_senduint16(&buf, 2); /* # of columns */
len = strlen(histfname);
- pq_sendint32(&buf, len); /* col1 len */
+ pq_senduint32(&buf, len); /* col1 len */
pq_sendbytes(&buf, histfname, len);
fd = OpenTransientFile(path, O_RDONLY | PG_BINARY);
@@ -490,7 +490,7 @@ SendTimeLineHistory(TimeLineHistoryCmd *cmd)
(errcode_for_file_access(),
errmsg("could not seek to beginning of file \"%s\": %m", path)));
- pq_sendint32(&buf, histfilelen); /* col2 len */
+ pq_senduint32(&buf, histfilelen); /* col2 len */
bytesleft = histfilelen;
while (bytesleft > 0)
@@ -647,7 +647,7 @@ StartReplication(StartReplicationCmd *cmd)
/* Send a CopyBothResponse message, and start streaming */
pq_beginmessage(&buf, 'W');
pq_sendbyte(&buf, 0);
- pq_sendint16(&buf, 0);
+ pq_senduint16(&buf, 0);
pq_endmessage(&buf);
pq_flush();
@@ -1066,7 +1066,7 @@ StartLogicalReplication(StartReplicationCmd *cmd)
/* Send a CopyBothResponse message, and start streaming */
pq_beginmessage(&buf, 'W');
pq_sendbyte(&buf, 0);
- pq_sendint16(&buf, 0);
+ pq_senduint16(&buf, 0);
pq_endmessage(&buf);
pq_flush();
@@ -1132,14 +1132,14 @@ WalSndPrepareWrite(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xi
resetStringInfo(ctx->out);
pq_sendbyte(ctx->out, 'w');
- pq_sendint64(ctx->out, lsn); /* dataStart */
- pq_sendint64(ctx->out, lsn); /* walEnd */
+ pq_senduint64(ctx->out, lsn); /* dataStart */
+ pq_senduint64(ctx->out, lsn); /* walEnd */
/*
* Fill out the sendtime later, just as it's done in XLogSendPhysical, but
* reserve space here.
*/
- pq_sendint64(ctx->out, 0); /* sendtime */
+ pq_senduint64(ctx->out, 0); /* sendtime */
}
/*
@@ -1165,7 +1165,7 @@ WalSndWriteData(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid,
*/
resetStringInfo(&tmpbuf);
now = GetCurrentTimestamp();
- pq_sendint64(&tmpbuf, now);
+ pq_senduint64(&tmpbuf, now);
memcpy(&ctx->out->data[1 + sizeof(int64) + sizeof(int64)],
tmpbuf.data, sizeof(int64));
@@ -2701,9 +2701,9 @@ XLogSendPhysical(void)
resetStringInfo(&output_message);
pq_sendbyte(&output_message, 'w');
- pq_sendint64(&output_message, startptr); /* dataStart */
- pq_sendint64(&output_message, SendRqstPtr); /* walEnd */
- pq_sendint64(&output_message, 0); /* sendtime, filled in last */
+ pq_senduint64(&output_message, startptr); /* dataStart */
+ pq_senduint64(&output_message, SendRqstPtr); /* walEnd */
+ pq_senduint64(&output_message, 0); /* sendtime, filled in last */
/*
* Read the log directly into the output buffer to avoid extra memcpy
@@ -2718,7 +2718,7 @@ XLogSendPhysical(void)
* Fill the send timestamp last, so that it is taken as late as possible.
*/
resetStringInfo(&tmpbuf);
- pq_sendint64(&tmpbuf, GetCurrentTimestamp());
+ pq_senduint64(&tmpbuf, GetCurrentTimestamp());
memcpy(&output_message.data[1 + sizeof(int64) + sizeof(int64)],
tmpbuf.data, sizeof(int64));
@@ -3339,8 +3339,8 @@ WalSndKeepalive(bool requestReply)
/* construct the message... */
resetStringInfo(&output_message);
pq_sendbyte(&output_message, 'k');
- pq_sendint64(&output_message, sentPtr);
- pq_sendint64(&output_message, GetCurrentTimestamp());
+ pq_senduint64(&output_message, sentPtr);
+ pq_senduint64(&output_message, GetCurrentTimestamp());
pq_sendbyte(&output_message, requestReply ? 1 : 0);
/* ... and send it wrapped in CopyData */
diff --git a/src/backend/tcop/fastpath.c b/src/backend/tcop/fastpath.c
index d16ba5ec92..0be7749063 100644
--- a/src/backend/tcop/fastpath.c
+++ b/src/backend/tcop/fastpath.c
@@ -143,7 +143,7 @@ SendFunctionResult(Datum retval, bool isnull, Oid rettype, int16 format)
if (isnull)
{
if (newstyle)
- pq_sendint32(&buf, -1);
+ pq_senduint32(&buf, -1);
}
else
{
@@ -169,7 +169,7 @@ SendFunctionResult(Datum retval, bool isnull, Oid rettype, int16 format)
getTypeBinaryOutputInfo(rettype, &typsend, &typisvarlena);
outputbytes = OidSendFunctionCall(typsend, retval);
- pq_sendint32(&buf, VARSIZE(outputbytes) - VARHDRSZ);
+ pq_senduint32(&buf, VARSIZE(outputbytes) - VARHDRSZ);
pq_sendbytes(&buf, VARDATA(outputbytes),
VARSIZE(outputbytes) - VARHDRSZ);
pfree(outputbytes);
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index f4133953be..ff20f5b156 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -2382,13 +2382,13 @@ exec_describe_statement_message(const char *stmt_name)
*/
pq_beginmessage_reuse(&row_description_buf, 't'); /* parameter description
* message type */
- pq_sendint16(&row_description_buf, psrc->num_params);
+ pq_senduint16(&row_description_buf, psrc->num_params);
for (i = 0; i < psrc->num_params; i++)
{
Oid ptype = psrc->param_types[i];
- pq_sendint32(&row_description_buf, (int) ptype);
+ pq_senduint32(&row_description_buf, (uint32) ptype);
}
pq_endmessage_reuse(&row_description_buf);
@@ -3826,8 +3826,8 @@ PostgresMain(int argc, char *argv[],
StringInfoData buf;
pq_beginmessage(&buf, 'K');
- pq_sendint32(&buf, (int32) MyProcPid);
- pq_sendint32(&buf, (int32) MyCancelKey);
+ pq_senduint32(&buf, (uint32) MyProcPid);
+ pq_senduint32(&buf, (uint32) MyCancelKey);
pq_endmessage(&buf);
/* Need not flush since ReadyForQuery will do it. */
}
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 0cbdbe5587..8209203bcd 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -1590,13 +1590,13 @@ array_send(PG_FUNCTION_ARGS)
pq_begintypsend(&buf);
/* Send the array header information */
- pq_sendint32(&buf, ndim);
- pq_sendint32(&buf, AARR_HASNULL(v) ? 1 : 0);
- pq_sendint32(&buf, element_type);
+ pq_senduint32(&buf, ndim);
+ pq_senduint32(&buf, AARR_HASNULL(v) ? 1 : 0);
+ pq_senduint32(&buf, element_type);
for (i = 0; i < ndim; i++)
{
- pq_sendint32(&buf, dim[i]);
- pq_sendint32(&buf, lb[i]);
+ pq_senduint32(&buf, dim[i]);
+ pq_senduint32(&buf, lb[i]);
}
/* Send the array elements using the element's own sendproc */
@@ -1614,14 +1614,14 @@ array_send(PG_FUNCTION_ARGS)
if (isnull)
{
/* -1 length means a NULL */
- pq_sendint32(&buf, -1);
+ pq_senduint32(&buf, -1);
}
else
{
bytea *outputbytes;
outputbytes = SendFunctionCall(&my_extra->proc, itemvalue);
- pq_sendint32(&buf, VARSIZE(outputbytes) - VARHDRSZ);
+ pq_senduint32(&buf, VARSIZE(outputbytes) - VARHDRSZ);
pq_sendbytes(&buf, VARDATA(outputbytes),
VARSIZE(outputbytes) - VARHDRSZ);
pfree(outputbytes);
diff --git a/src/backend/utils/adt/cash.c b/src/backend/utils/adt/cash.c
index c787dd3419..2e4d8022bb 100644
--- a/src/backend/utils/adt/cash.c
+++ b/src/backend/utils/adt/cash.c
@@ -527,7 +527,7 @@ cash_send(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint64(&buf, arg1);
+ pq_senduint64(&buf, arg1);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c
index 87146a2161..94d878f8c4 100644
--- a/src/backend/utils/adt/date.c
+++ b/src/backend/utils/adt/date.c
@@ -237,7 +237,7 @@ date_send(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint32(&buf, date);
+ pq_senduint32(&buf, date);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
@@ -1341,7 +1341,7 @@ time_send(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint64(&buf, time);
+ pq_senduint64(&buf, time);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
@@ -2113,8 +2113,8 @@ timetz_send(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint64(&buf, time->time);
- pq_sendint32(&buf, time->zone);
+ pq_senduint64(&buf, time->time);
+ pq_senduint32(&buf, time->zone);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c
index f57380a4df..a9d59612f8 100644
--- a/src/backend/utils/adt/geo_ops.c
+++ b/src/backend/utils/adt/geo_ops.c
@@ -1432,7 +1432,7 @@ path_send(PG_FUNCTION_ARGS)
pq_begintypsend(&buf);
pq_sendbyte(&buf, path->closed ? 1 : 0);
- pq_sendint32(&buf, path->npts);
+ pq_senduint32(&buf, path->npts);
for (i = 0; i < path->npts; i++)
{
pq_sendfloat8(&buf, path->p[i].x);
@@ -3513,7 +3513,7 @@ poly_send(PG_FUNCTION_ARGS)
int32 i;
pq_begintypsend(&buf);
- pq_sendint32(&buf, poly->npts);
+ pq_senduint32(&buf, poly->npts);
for (i = 0; i < poly->npts; i++)
{
pq_sendfloat8(&buf, poly->p[i].x);
diff --git a/src/backend/utils/adt/int.c b/src/backend/utils/adt/int.c
index 02783d8d6f..5c901e961e 100644
--- a/src/backend/utils/adt/int.c
+++ b/src/backend/utils/adt/int.c
@@ -97,7 +97,7 @@ int2send(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint16(&buf, arg1);
+ pq_senduint16(&buf, arg1);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
@@ -302,7 +302,7 @@ int4send(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint32(&buf, arg1);
+ pq_senduint32(&buf, arg1);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c
index 96686ccb2c..0ce9994cf3 100644
--- a/src/backend/utils/adt/int8.c
+++ b/src/backend/utils/adt/int8.c
@@ -175,7 +175,7 @@ int8send(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint64(&buf, arg1);
+ pq_senduint64(&buf, arg1);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c
index 6940b11c29..9e4a25a73c 100644
--- a/src/backend/utils/adt/jsonb.c
+++ b/src/backend/utils/adt/jsonb.c
@@ -155,7 +155,7 @@ jsonb_send(PG_FUNCTION_ARGS)
(void) JsonbToCString(jtext, &jb->root, VARSIZE(jb));
pq_begintypsend(&buf);
- pq_sendint8(&buf, version);
+ pq_senduint8(&buf, version);
pq_sendtext(&buf, jtext->data, jtext->len);
pfree(jtext->data);
pfree(jtext);
diff --git a/src/backend/utils/adt/nabstime.c b/src/backend/utils/adt/nabstime.c
index fae97135db..c45122a59a 100644
--- a/src/backend/utils/adt/nabstime.c
+++ b/src/backend/utils/adt/nabstime.c
@@ -315,7 +315,7 @@ abstimesend(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint32(&buf, time);
+ pq_senduint32(&buf, time);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
@@ -674,7 +674,7 @@ reltimesend(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint32(&buf, time);
+ pq_senduint32(&buf, time);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
@@ -794,9 +794,9 @@ tintervalsend(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint32(&buf, tinterval->status);
- pq_sendint32(&buf, tinterval->data[0]);
- pq_sendint32(&buf, tinterval->data[1]);
+ pq_senduint32(&buf, tinterval->status);
+ pq_senduint32(&buf, tinterval->data[0]);
+ pq_senduint32(&buf, tinterval->data[1]);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c
index 074294cbcc..6a12ba8cb7 100644
--- a/src/backend/utils/adt/numeric.c
+++ b/src/backend/utils/adt/numeric.c
@@ -877,12 +877,12 @@ numeric_send(PG_FUNCTION_ARGS)
pq_begintypsend(&buf);
- pq_sendint16(&buf, x.ndigits);
- pq_sendint16(&buf, x.weight);
- pq_sendint16(&buf, x.sign);
- pq_sendint16(&buf, x.dscale);
+ pq_senduint16(&buf, x.ndigits);
+ pq_senduint16(&buf, x.weight);
+ pq_senduint16(&buf, x.sign);
+ pq_senduint16(&buf, x.dscale);
for (i = 0; i < x.ndigits; i++)
- pq_sendint16(&buf, x.digits[i]);
+ pq_senduint16(&buf, x.digits[i]);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
@@ -3781,19 +3781,19 @@ numeric_avg_serialize(PG_FUNCTION_ARGS)
pq_begintypsend(&buf);
/* N */
- pq_sendint64(&buf, state->N);
+ pq_senduint64(&buf, state->N);
/* sumX */
pq_sendbytes(&buf, VARDATA_ANY(sumX), VARSIZE_ANY_EXHDR(sumX));
/* maxScale */
- pq_sendint32(&buf, state->maxScale);
+ pq_senduint32(&buf, state->maxScale);
/* maxScaleCount */
- pq_sendint64(&buf, state->maxScaleCount);
+ pq_senduint64(&buf, state->maxScaleCount);
/* NaNcount */
- pq_sendint64(&buf, state->NaNcount);
+ pq_senduint64(&buf, state->NaNcount);
result = pq_endtypsend(&buf);
@@ -3900,7 +3900,7 @@ numeric_serialize(PG_FUNCTION_ARGS)
pq_begintypsend(&buf);
/* N */
- pq_sendint64(&buf, state->N);
+ pq_senduint64(&buf, state->N);
/* sumX */
pq_sendbytes(&buf, VARDATA_ANY(sumX), VARSIZE_ANY_EXHDR(sumX));
@@ -3909,13 +3909,13 @@ numeric_serialize(PG_FUNCTION_ARGS)
pq_sendbytes(&buf, VARDATA_ANY(sumX2), VARSIZE_ANY_EXHDR(sumX2));
/* maxScale */
- pq_sendint32(&buf, state->maxScale);
+ pq_senduint32(&buf, state->maxScale);
/* maxScaleCount */
- pq_sendint64(&buf, state->maxScaleCount);
+ pq_senduint64(&buf, state->maxScaleCount);
/* NaNcount */
- pq_sendint64(&buf, state->NaNcount);
+ pq_senduint64(&buf, state->NaNcount);
result = pq_endtypsend(&buf);
@@ -4307,7 +4307,7 @@ numeric_poly_serialize(PG_FUNCTION_ARGS)
pq_begintypsend(&buf);
/* N */
- pq_sendint64(&buf, state->N);
+ pq_senduint64(&buf, state->N);
/* sumX */
pq_sendbytes(&buf, VARDATA_ANY(sumX), VARSIZE_ANY_EXHDR(sumX));
@@ -4523,7 +4523,7 @@ int8_avg_serialize(PG_FUNCTION_ARGS)
pq_begintypsend(&buf);
/* N */
- pq_sendint64(&buf, state->N);
+ pq_senduint64(&buf, state->N);
/* sumX */
pq_sendbytes(&buf, VARDATA_ANY(sumX), VARSIZE_ANY_EXHDR(sumX));
diff --git a/src/backend/utils/adt/oid.c b/src/backend/utils/adt/oid.c
index b0670e0d9f..5a0a206c6a 100644
--- a/src/backend/utils/adt/oid.c
+++ b/src/backend/utils/adt/oid.c
@@ -154,7 +154,7 @@ oidsend(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint32(&buf, arg1);
+ pq_senduint32(&buf, arg1);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
diff --git a/src/backend/utils/adt/pg_lsn.c b/src/backend/utils/adt/pg_lsn.c
index f4eae9d83d..ea6ceb294f 100644
--- a/src/backend/utils/adt/pg_lsn.c
+++ b/src/backend/utils/adt/pg_lsn.c
@@ -93,7 +93,7 @@ pg_lsn_send(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint64(&buf, lsn);
+ pq_senduint64(&buf, lsn);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c
index 5a5d0a0b8f..acdbaa3ff7 100644
--- a/src/backend/utils/adt/rangetypes.c
+++ b/src/backend/utils/adt/rangetypes.c
@@ -272,7 +272,7 @@ range_send(PG_FUNCTION_ARGS)
uint32 bound_len = VARSIZE(bound) - VARHDRSZ;
char *bound_data = VARDATA(bound);
- pq_sendint32(buf, bound_len);
+ pq_senduint32(buf, bound_len);
pq_sendbytes(buf, bound_data, bound_len);
}
@@ -283,7 +283,7 @@ range_send(PG_FUNCTION_ARGS)
uint32 bound_len = VARSIZE(bound) - VARHDRSZ;
char *bound_data = VARDATA(bound);
- pq_sendint32(buf, bound_len);
+ pq_senduint32(buf, bound_len);
pq_sendbytes(buf, bound_data, bound_len);
}
diff --git a/src/backend/utils/adt/rowtypes.c b/src/backend/utils/adt/rowtypes.c
index 5f729342f8..50c15a7cc5 100644
--- a/src/backend/utils/adt/rowtypes.c
+++ b/src/backend/utils/adt/rowtypes.c
@@ -718,7 +718,7 @@ record_send(PG_FUNCTION_ARGS)
if (!TupleDescAttr(tupdesc, i)->attisdropped)
validcols++;
}
- pq_sendint32(&buf, validcols);
+ pq_senduint32(&buf, validcols);
for (i = 0; i < ncolumns; i++)
{
@@ -732,12 +732,12 @@ record_send(PG_FUNCTION_ARGS)
if (att->attisdropped)
continue;
- pq_sendint32(&buf, column_type);
+ pq_senduint32(&buf, column_type);
if (nulls[i])
{
/* emit -1 data length to signify a NULL */
- pq_sendint32(&buf, -1);
+ pq_senduint32(&buf, -1);
continue;
}
@@ -756,7 +756,7 @@ record_send(PG_FUNCTION_ARGS)
attr = values[i];
outputbytes = SendFunctionCall(&column_info->proc, attr);
- pq_sendint32(&buf, VARSIZE(outputbytes) - VARHDRSZ);
+ pq_senduint32(&buf, VARSIZE(outputbytes) - VARHDRSZ);
pq_sendbytes(&buf, VARDATA(outputbytes),
VARSIZE(outputbytes) - VARHDRSZ);
}
diff --git a/src/backend/utils/adt/tid.c b/src/backend/utils/adt/tid.c
index 41d540b46e..0e91944ce9 100644
--- a/src/backend/utils/adt/tid.c
+++ b/src/backend/utils/adt/tid.c
@@ -149,8 +149,8 @@ tidsend(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint32(&buf, ItemPointerGetBlockNumberNoCheck(itemPtr));
- pq_sendint16(&buf, ItemPointerGetOffsetNumberNoCheck(itemPtr));
+ pq_senduint32(&buf, ItemPointerGetBlockNumberNoCheck(itemPtr));
+ pq_senduint16(&buf, ItemPointerGetOffsetNumberNoCheck(itemPtr));
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
index 1d75caebe1..c224cbb324 100644
--- a/src/backend/utils/adt/timestamp.c
+++ b/src/backend/utils/adt/timestamp.c
@@ -276,7 +276,7 @@ timestamp_send(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint64(&buf, timestamp);
+ pq_senduint64(&buf, timestamp);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
@@ -826,7 +826,7 @@ timestamptz_send(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint64(&buf, timestamp);
+ pq_senduint64(&buf, timestamp);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
@@ -1008,9 +1008,9 @@ interval_send(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint64(&buf, interval->time);
- pq_sendint32(&buf, interval->day);
- pq_sendint32(&buf, interval->month);
+ pq_senduint64(&buf, interval->time);
+ pq_senduint32(&buf, interval->day);
+ pq_senduint32(&buf, interval->month);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c
index 7b9dbfef0c..55f92d4fc4 100644
--- a/src/backend/utils/adt/tsquery.c
+++ b/src/backend/utils/adt/tsquery.c
@@ -1180,22 +1180,22 @@ tsquerysend(PG_FUNCTION_ARGS)
pq_begintypsend(&buf);
- pq_sendint32(&buf, query->size);
+ pq_senduint32(&buf, query->size);
for (i = 0; i < query->size; i++)
{
- pq_sendint8(&buf, item->type);
+ pq_senduint8(&buf, item->type);
switch (item->type)
{
case QI_VAL:
- pq_sendint8(&buf, item->qoperand.weight);
- pq_sendint8(&buf, item->qoperand.prefix);
+ pq_senduint8(&buf, item->qoperand.weight);
+ pq_senduint8(&buf, item->qoperand.prefix);
pq_sendstring(&buf, GETOPERAND(query) + item->qoperand.distance);
break;
case QI_OPR:
- pq_sendint8(&buf, item->qoperator.oper);
+ pq_senduint8(&buf, item->qoperator.oper);
if (item->qoperator.oper == OP_PHRASE)
- pq_sendint16(&buf, item->qoperator.distance);
+ pq_senduint16(&buf, item->qoperator.distance);
break;
default:
elog(ERROR, "unrecognized tsquery node type: %d", item->type);
diff --git a/src/backend/utils/adt/tsvector.c b/src/backend/utils/adt/tsvector.c
index 7a27bd12a3..630dade232 100644
--- a/src/backend/utils/adt/tsvector.c
+++ b/src/backend/utils/adt/tsvector.c
@@ -410,7 +410,7 @@ tsvectorsend(PG_FUNCTION_ARGS)
pq_begintypsend(&buf);
- pq_sendint32(&buf, vec->size);
+ pq_senduint32(&buf, vec->size);
for (i = 0; i < vec->size; i++)
{
uint16 npos;
@@ -423,14 +423,14 @@ tsvectorsend(PG_FUNCTION_ARGS)
pq_sendbyte(&buf, '\0');
npos = POSDATALEN(vec, weptr);
- pq_sendint16(&buf, npos);
+ pq_senduint16(&buf, npos);
if (npos > 0)
{
WordEntryPos *wepptr = POSDATAPTR(vec, weptr);
for (j = 0; j < npos; j++)
- pq_sendint16(&buf, wepptr[j]);
+ pq_senduint16(&buf, wepptr[j]);
}
weptr++;
}
diff --git a/src/backend/utils/adt/txid.c b/src/backend/utils/adt/txid.c
index 7974c0bd3d..d5210c6554 100644
--- a/src/backend/utils/adt/txid.c
+++ b/src/backend/utils/adt/txid.c
@@ -640,11 +640,11 @@ txid_snapshot_send(PG_FUNCTION_ARGS)
uint32 i;
pq_begintypsend(&buf);
- pq_sendint32(&buf, snap->nxip);
- pq_sendint64(&buf, snap->xmin);
- pq_sendint64(&buf, snap->xmax);
+ pq_senduint32(&buf, snap->nxip);
+ pq_senduint64(&buf, snap->xmin);
+ pq_senduint64(&buf, snap->xmax);
for (i = 0; i < snap->nxip; i++)
- pq_sendint64(&buf, snap->xip[i]);
+ pq_senduint64(&buf, snap->xip[i]);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
diff --git a/src/backend/utils/adt/varbit.c b/src/backend/utils/adt/varbit.c
index 6ba400b699..739c248f72 100644
--- a/src/backend/utils/adt/varbit.c
+++ b/src/backend/utils/adt/varbit.c
@@ -666,7 +666,7 @@ varbit_send(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint32(&buf, VARBITLEN(s));
+ pq_senduint32(&buf, VARBITLEN(s));
pq_sendbytes(&buf, (char *) VARBITS(s), VARBITBYTES(s));
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
diff --git a/src/backend/utils/adt/xid.c b/src/backend/utils/adt/xid.c
index 1e811faa9c..9ec288d86e 100644
--- a/src/backend/utils/adt/xid.c
+++ b/src/backend/utils/adt/xid.c
@@ -68,7 +68,7 @@ xidsend(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint32(&buf, arg1);
+ pq_senduint32(&buf, arg1);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
@@ -196,7 +196,7 @@ cidsend(PG_FUNCTION_ARGS)
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendint32(&buf, arg1);
+ pq_senduint32(&buf, arg1);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
diff --git a/src/include/libpq/pqformat.h b/src/include/libpq/pqformat.h
index 57bde691e8..cb2570569e 100644
--- a/src/include/libpq/pqformat.h
+++ b/src/include/libpq/pqformat.h
@@ -47,41 +47,41 @@ extern void pq_sendfloat8(StringInfo buf, float8 f);
* overly picky and demanding a * before a restrict.
*/
static inline void
-pq_writeint8(StringInfoData *pg_restrict buf, int8 i)
+pq_writeuint8(StringInfoData *pg_restrict buf, uint8 i)
{
int8 ni = i;
- Assert(buf->len + (int) sizeof(int8) <= buf->maxlen);
- memcpy((char *pg_restrict) (buf->data + buf->len), &ni, sizeof(int8));
- buf->len += sizeof(int8);
+ Assert(buf->len + (int) sizeof(uint8) <= buf->maxlen);
+ memcpy((char *pg_restrict) (buf->data + buf->len), &ni, sizeof(uint8));
+ buf->len += sizeof(uint8);
}
/*
- * Append an int16 to a StringInfo buffer, which already has enough space
+ * Append an uint16 to a StringInfo buffer, which already has enough space
* preallocated.
*/
static inline void
-pq_writeint16(StringInfoData *pg_restrict buf, int16 i)
+pq_writeuint16(StringInfoData *pg_restrict buf, uint16 i)
{
- int16 ni = pg_hton16(i);
+ uint16 ni = pg_hton16(i);
- Assert(buf->len + (int) sizeof(int16) <= buf->maxlen);
- memcpy((char *pg_restrict) (buf->data + buf->len), &ni, sizeof(int16));
- buf->len += sizeof(int16);
+ Assert(buf->len + (int) sizeof(uint16) <= buf->maxlen);
+ memcpy((char *pg_restrict) (buf->data + buf->len), &ni, sizeof(uint16));
+ buf->len += sizeof(uint16);
}
/*
- * Append an int32 to a StringInfo buffer, which already has enough space
+ * Append an uint32 to a StringInfo buffer, which already has enough space
* preallocated.
*/
static inline void
-pq_writeint32(StringInfoData *pg_restrict buf, int32 i)
+pq_writeuint32(StringInfoData *pg_restrict buf, uint32 i)
{
- int32 ni = pg_hton32(i);
+ uint32 ni = pg_hton32(i);
- Assert(buf->len + (int) sizeof(int32) <= buf->maxlen);
- memcpy((char *pg_restrict) (buf->data + buf->len), &ni, sizeof(int32));
- buf->len += sizeof(int32);
+ Assert(buf->len + (int) sizeof(uint32) <= buf->maxlen);
+ memcpy((char *pg_restrict) (buf->data + buf->len), &ni, sizeof(uint32));
+ buf->len += sizeof(uint32);
}
/*
@@ -89,13 +89,13 @@ pq_writeint32(StringInfoData *pg_restrict buf, int32 i)
* preallocated.
*/
static inline void
-pq_writeint64(StringInfoData *pg_restrict buf, int64 i)
+pq_writeuint64(StringInfoData *pg_restrict buf, uint64 i)
{
- int64 ni = pg_hton64(i);
+ uint64 ni = pg_hton64(i);
- Assert(buf->len + (int) sizeof(int64) <= buf->maxlen);
- memcpy((char *pg_restrict) (buf->data + buf->len), &ni, sizeof(int64));
- buf->len += sizeof(int64);
+ Assert(buf->len + (int) sizeof(uint64) <= buf->maxlen);
+ memcpy((char *pg_restrict) (buf->data + buf->len), &ni, sizeof(uint64));
+ buf->len += sizeof(uint64);
}
/*
@@ -127,43 +127,51 @@ pq_writestring(StringInfoData *pg_restrict buf, const char *pg_restrict str)
pfree(p);
}
-/* append a binary int8 to a StringInfo buffer */
+/* append a binary uint8 to a StringInfo buffer */
static inline void
-pq_sendint8(StringInfo buf, int8 i)
+pq_senduint8(StringInfo buf, uint8 i)
{
- enlargeStringInfo(buf, sizeof(int8));
- pq_writeint8(buf, i);
+ enlargeStringInfo(buf, sizeof(uint8));
+ pq_writeuint8(buf, i);
}
-/* append a binary int16 to a StringInfo buffer */
+/* append a binary uint16 to a StringInfo buffer */
static inline void
-pq_sendint16(StringInfo buf, int16 i)
+pq_senduint16(StringInfo buf, uint16 i)
{
- enlargeStringInfo(buf, sizeof(int16));
- pq_writeint16(buf, i);
+ enlargeStringInfo(buf, sizeof(uint16));
+ pq_writeuint16(buf, i);
}
-/* append a binary int32 to a StringInfo buffer */
+/* append a binary uint32 to a StringInfo buffer */
static inline void
-pq_sendint32(StringInfo buf, int32 i)
+pq_senduint32(StringInfo buf, uint32 i)
{
- enlargeStringInfo(buf, sizeof(int32));
- pq_writeint32(buf, i);
+ enlargeStringInfo(buf, sizeof(uint32));
+ pq_writeuint32(buf, i);
}
-/* append a binary int64 to a StringInfo buffer */
+/* append a binary uint64 to a StringInfo buffer */
+static inline void
+pq_senduint64(StringInfo buf, uint64 i)
+{
+ enlargeStringInfo(buf, sizeof(uint64));
+ pq_writeuint64(buf, i);
+}
+
+/* append a binary int64 to a StringInfo buffer, kept for compatibility */
static inline void
pq_sendint64(StringInfo buf, int64 i)
{
enlargeStringInfo(buf, sizeof(int64));
- pq_writeint64(buf, i);
+ pq_writeuint64(buf, (uint64) i);
}
/* append a binary byte to a StringInfo buffer */
static inline void
-pq_sendbyte(StringInfo buf, int8 byt)
+pq_sendbyte(StringInfo buf, uint8 byt)
{
- pq_sendint8(buf, byt);
+ pq_senduint8(buf, byt);
}
/*
@@ -177,13 +185,13 @@ pq_sendint(StringInfo buf, int i, int b)
switch (b)
{
case 1:
- pq_sendint8(buf, (int8) i);
+ pq_senduint8(buf, (uint8) i);
break;
case 2:
- pq_sendint16(buf, (int16) i);
+ pq_senduint16(buf, (uint16) i);
break;
case 4:
- pq_sendint32(buf, (int32) i);
+ pq_senduint32(buf, (uint32) i);
break;
default:
elog(ERROR, "unsupported integer size %d", b);
Hi,
On 2018-05-24 18:13:23 +0100, Andrew Gierth wrote:
In PG11, pq_sendbyte got changed from taking an int parameter to taking
an int8.While that seems to work in general, it does mean that there are now
several places in the code that do the equivalent of:unsigned char x = 128;
pq_sendbyte(&buf, x);which I believe is not well-defined since pq_sendbyte takes an int8, and
conversions of unrepresentable values to _signed_ integer types are
(iirc) implementation-dependent.
It's not implementation defined in postgres' dialect of C - we rely on
accurate signed->unsigned conversions in a number of places. But I
doin't think we should increase that reliance, so I think you're right
we should do something about this.
There are also some cases where pq_sendint16 is being called for an
unsigned value or a value that might exceed 32767.
Hm, which case were you thinking of here? The calls usually are exactly
the types that the wire protocol expects, no?
Would it be better for these to take unsigned values, or have unsigned
variants?
I wonder if we should just take 'int' out of the name. Say,
pg_send{8,16,32,64}(unsigned ...).
Greetings,
Andres Freund
On 2018-06-13 14:10:37 +0900, Michael Paquier wrote:
On Mon, Jun 11, 2018 at 02:25:44PM +0900, Michael Paquier wrote:
On Wed, Jun 06, 2018 at 12:27:58PM -0400, Alvaro Herrera wrote:
Do you have an answer to this question? Does anybody else?
(My guts tell me it'd be better to change these routines to take
unsigned values, without creating extra variants. But guts frequently
misspeak.)My guts are telling me as well to not have more variants.
Agreed.
On top of that it seems to me that we'd want to rename any new
routines to include "uint" in their name instead of "int", and for
compatibility with past code pq_sendint should not be touched.
I'm very doubtful about this one, unless you mean that just the
signature shouldn't be touched. Otherwise we'll just increase code
duplication unnecessarily?
And also pq_sendint64 needs to be kept around for compatibility.
:(. Wonder if it's better to just break people's code.
Greetings,
Andres Freund
"Andres" == Andres Freund <andres@anarazel.de> writes:
unsigned char x = 128;
pq_sendbyte(&buf, x);which I believe is not well-defined since pq_sendbyte takes an int8,
and conversions of unrepresentable values to _signed_ integer types
are (iirc) implementation-dependent.
Andres> It's not implementation defined in postgres' dialect of C - we
Andres> rely on accurate signed->unsigned conversions in a number of
Andres> places.
Converting signed integer to unsigned is ok as I understand it - what's
happening here is the reverse, converting an unrepresentable unsigned
value to a signed type.
There are also some cases where pq_sendint16 is being called for an
unsigned value or a value that might exceed 32767.
Andres> Hm, which case were you thinking of here? The calls usually are
Andres> exactly the types that the wire protocol expects, no?
There are cases where it's not actually clear what the wire protocol
expects - I'm thinking in particular of the number of entries in a list
of parameter types/formats.
--
Andrew (irc:RhodiumToad)
Hi,
On 2018-06-13 22:02:13 +0100, Andrew Gierth wrote:
"Andres" == Andres Freund <andres@anarazel.de> writes:
unsigned char x = 128;
pq_sendbyte(&buf, x);which I believe is not well-defined since pq_sendbyte takes an int8,
and conversions of unrepresentable values to _signed_ integer types
are (iirc) implementation-dependent.Andres> It's not implementation defined in postgres' dialect of C - we
Andres> rely on accurate signed->unsigned conversions in a number of
Andres> places.Converting signed integer to unsigned is ok as I understand it - what's
happening here is the reverse, converting an unrepresentable unsigned
value to a signed type.
Err, yes, I was thinking about that conversion. Sorry for the confusion.
There are also some cases where pq_sendint16 is being called for an
unsigned value or a value that might exceed 32767.Andres> Hm, which case were you thinking of here? The calls usually are
Andres> exactly the types that the wire protocol expects, no?There are cases where it's not actually clear what the wire protocol
expects - I'm thinking in particular of the number of entries in a list
of parameter types/formats.
But that didn't change around the pq_send* changes? So I'm not sure I
understand how this is related? I mean I'm all for documenting the wire
protocol more extensively, but we can't just change the width?
Greetings,
Andres Freund
On Wed, Jun 13, 2018 at 11:53:21AM -0700, Andres Freund wrote:
On 2018-06-13 14:10:37 +0900, Michael Paquier wrote:
On Mon, Jun 11, 2018 at 02:25:44PM +0900, Michael Paquier wrote:
On top of that it seems to me that we'd want to rename any new
routines to include "uint" in their name instead of "int", and for
compatibility with past code pq_sendint should not be touched.I'm very doubtful about this one, unless you mean that just the
signature shouldn't be touched. Otherwise we'll just increase code
duplication unnecessarily?
Yeah, actually that would be assuming that many modules use it, but that
does not seem to be much the case, at least from github's point of view.
And also pq_sendint64 needs to be kept around for compatibility.
:(. Wonder if it's better to just break people's code.
Indeed. At least breaking compilation has the advantage of making
people directly aware of the change and think hopefully about them.
A research on github shows a bunch of people having copied of pqformat.h
as there are a bunch of copies of Postgres so with this much noise it is
not easy to find out what would be broken. In-core contrib and test
modules don't make use of those interfaces as well, except for hstore.
So that could be acceptable.
For pq_sendint there are many matches with printsimple.c.
--
Michael
Hello
How about not renaming the functions, but just change argument types?
Having to change all callsites to cope with some new naming convention
does not strike me as a great idea ... it may collide with any
backpatching in the area, for one.
--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Alvaro Herrera <alvherre@2ndquadrant.com> writes:
How about not renaming the functions, but just change argument types?
Yeah, I didn't understand why anything else would be on the table.
We already changed their arg types for 11, no? This is just second
thoughts about what to change them to.
regards, tom lane
Hi,
On 2018-06-14 16:17:28 -0400, Tom Lane wrote:
Alvaro Herrera <alvherre@2ndquadrant.com> writes:
How about not renaming the functions, but just change argument types?
Yea, I'm in favor of this. I don't think the 'u' in there would benefit
us, and the cast from signed to unsigned is well defined, so it's safe
to call the functions with signed input.
Yeah, I didn't understand why anything else would be on the table.
Because it sounds a bit weird for a function with just 'int' in the name
to take unsigned ints as a parameter? I don't think that's enough
justification to rename everything, but it's not completely crazy either.
We already changed their arg types for 11, no?
No, not really. We added new functions.
Greetings,
Andres Freund
Hi,
On 2018-06-14 13:25:30 -0700, Andres Freund wrote:
On 2018-06-14 16:17:28 -0400, Tom Lane wrote:
Alvaro Herrera <alvherre@2ndquadrant.com> writes:
How about not renaming the functions, but just change argument types?
Yea, I'm in favor of this. I don't think the 'u' in there would benefit
us, and the cast from signed to unsigned is well defined, so it's safe
to call the functions with signed input.
Nobody argued against, thus I've pushed a patch doing so.
Looking at surrounding code I found a few more oddities, but of older
vintage:
- pq_sendfloat4 uses an uint32 in the union, but float8 uses a int64.
- same with pq_getmsgfloat[48]
- pq_getmsgint64 returns a int64, should probably also be uint64
Given they're practially harmless I'm inclined to only fix them in
master?
Greetings,
Andres Freund
On Tue, Jun 26, 2018 at 11:51:49PM -0700, Andres Freund wrote:
Looking at surrounding code I found a few more oddities, but of older
vintage:
- pq_sendfloat4 uses an uint32 in the union, but float8 uses a int64.
- same with pq_getmsgfloat[48]
- pq_getmsgint64 returns a int64, should probably also be uint64Given they're practially harmless I'm inclined to only fix them in
master?
Doing those three things on HEAD only looks like a good plan to me. I
have not spotted more inconsistencies in pqformat.c.
--
Michael