diff options
Diffstat (limited to 'src/backend/tcop')
| -rw-r--r-- | src/backend/tcop/fastpath.c | 89 | ||||
| -rw-r--r-- | src/backend/tcop/postgres.c | 128 |
2 files changed, 115 insertions, 102 deletions
diff --git a/src/backend/tcop/fastpath.c b/src/backend/tcop/fastpath.c index f9a5d7116b..c9fa715600 100644 --- a/src/backend/tcop/fastpath.c +++ b/src/backend/tcop/fastpath.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tcop/fastpath.c,v 1.85 2006/03/05 15:58:40 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/fastpath.c,v 1.86 2006/04/04 19:35:35 tgl Exp $ * * NOTES * This cruft is the server side of PQfn. @@ -154,8 +154,7 @@ SendFunctionResult(Datum retval, bool isnull, Oid rettype, int16 format) char *outputstr; getTypeOutputInfo(rettype, &typoutput, &typisvarlena); - outputstr = DatumGetCString(OidFunctionCall1(typoutput, - retval)); + outputstr = OidOutputFunctionCall(typoutput, retval); pq_sendcountedtext(&buf, outputstr, strlen(outputstr), false); pfree(outputstr); } @@ -166,9 +165,7 @@ SendFunctionResult(Datum retval, bool isnull, Oid rettype, int16 format) bytea *outputbytes; getTypeBinaryOutputInfo(rettype, &typsend, &typisvarlena); - outputbytes = DatumGetByteaP(OidFunctionCall1(typsend, - retval)); - /* We assume the result will not have been toasted */ + outputbytes = OidSendFunctionCall(typsend, retval); pq_sendint(&buf, VARSIZE(outputbytes) - VARHDRSZ, 4); pq_sendbytes(&buf, VARDATA(outputbytes), VARSIZE(outputbytes) - VARHDRSZ); @@ -433,23 +430,25 @@ parse_fcall_arguments(StringInfo msgBuf, struct fp_info * fip, if (argsize == -1) { fcinfo->argnull[i] = true; - continue; } - fcinfo->argnull[i] = false; - if (argsize < 0) - ereport(ERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("invalid argument size %d in function call message", - argsize))); - - /* Reset abuf to empty, and insert raw data into it */ - abuf.len = 0; - abuf.data[0] = '\0'; - abuf.cursor = 0; - - appendBinaryStringInfo(&abuf, - pq_getmsgbytes(msgBuf, argsize), - argsize); + else + { + fcinfo->argnull[i] = false; + if (argsize < 0) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("invalid argument size %d in function call message", + argsize))); + + /* Reset abuf to empty, and insert raw data into it */ + abuf.len = 0; + abuf.data[0] = '\0'; + abuf.cursor = 0; + + appendBinaryStringInfo(&abuf, + pq_getmsgbytes(msgBuf, argsize), + argsize); + } if (numAFormats > 1) aformat = aformats[i]; @@ -472,31 +471,36 @@ parse_fcall_arguments(StringInfo msgBuf, struct fp_info * fip, * have to do encoding conversion before calling the typinput * routine, though. */ - pstring = pg_client_to_server(abuf.data, argsize); - fcinfo->arg[i] = - OidFunctionCall3(typinput, - CStringGetDatum(pstring), - ObjectIdGetDatum(typioparam), - Int32GetDatum(-1)); + if (argsize == -1) + pstring = NULL; + else + pstring = pg_client_to_server(abuf.data, argsize); + + fcinfo->arg[i] = OidInputFunctionCall(typinput, pstring, + typioparam, -1); /* Free result of encoding conversion, if any */ - if (pstring != abuf.data) + if (pstring && pstring != abuf.data) pfree(pstring); } else if (aformat == 1) { Oid typreceive; Oid typioparam; + StringInfo bufptr; /* Call the argument type's binary input converter */ getTypeBinaryInputInfo(fip->argtypes[i], &typreceive, &typioparam); - fcinfo->arg[i] = OidFunctionCall3(typreceive, - PointerGetDatum(&abuf), - ObjectIdGetDatum(typioparam), - Int32GetDatum(-1)); + if (argsize == -1) + bufptr = NULL; + else + bufptr = &abuf; + + fcinfo->arg[i] = OidReceiveFunctionCall(typreceive, bufptr, + typioparam, -1); /* Trouble if it didn't eat the whole buffer */ - if (abuf.cursor != abuf.len) + if (argsize != -1 && abuf.cursor != abuf.len) ereport(ERROR, (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("incorrect binary data format in function argument %d", @@ -552,18 +556,22 @@ parse_fcall_arguments_20(StringInfo msgBuf, struct fp_info * fip, Oid typreceive; Oid typioparam; + getTypeBinaryInputInfo(fip->argtypes[i], &typreceive, &typioparam); + argsize = pq_getmsgint(msgBuf, 4); if (argsize == -1) { fcinfo->argnull[i] = true; + fcinfo->arg[i] = OidReceiveFunctionCall(typreceive, NULL, + typioparam, -1); continue; } fcinfo->argnull[i] = false; if (argsize < 0) ereport(ERROR, (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("invalid argument size %d in function call message", - argsize))); + errmsg("invalid argument size %d in function call message", + argsize))); /* Reset abuf to empty, and insert raw data into it */ abuf.len = 0; @@ -574,13 +582,8 @@ parse_fcall_arguments_20(StringInfo msgBuf, struct fp_info * fip, pq_getmsgbytes(msgBuf, argsize), argsize); - /* Call the argument type's binary input converter */ - getTypeBinaryInputInfo(fip->argtypes[i], &typreceive, &typioparam); - - fcinfo->arg[i] = OidFunctionCall3(typreceive, - PointerGetDatum(&abuf), - ObjectIdGetDatum(typioparam), - Int32GetDatum(-1)); + fcinfo->arg[i] = OidReceiveFunctionCall(typreceive, &abuf, + typioparam, -1); /* Trouble if it didn't eat the whole buffer */ if (abuf.cursor != abuf.len) diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 78cb8c3f81..df9ef8983a 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.482 2006/03/14 22:48:21 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.483 2006/04/04 19:35:35 tgl Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -1486,6 +1486,9 @@ exec_bind_message(StringInfo input_message) Oid ptype = lfirst_oid(l); int32 plength; bool isNull; + StringInfoData pbuf; + char csave; + int16 pformat; plength = pq_getmsgint(input_message, 4); isNull = (plength == -1); @@ -1493,16 +1496,6 @@ exec_bind_message(StringInfo input_message) if (!isNull) { const char *pvalue = pq_getmsgbytes(input_message, plength); - int16 pformat; - StringInfoData pbuf; - char csave; - - if (numPFormats > 1) - pformat = pformats[i]; - else if (numPFormats > 0) - pformat = pformats[0]; - else - pformat = 0; /* default = text */ /* * Rather than copying data around, we just set up a phony @@ -1519,63 +1512,80 @@ exec_bind_message(StringInfo input_message) csave = pbuf.data[plength]; pbuf.data[plength] = '\0'; + } + else + { + pbuf.data = NULL; /* keep compiler quiet */ + csave = 0; + } - if (pformat == 0) - { - Oid typinput; - Oid typioparam; - char *pstring; + if (numPFormats > 1) + pformat = pformats[i]; + else if (numPFormats > 0) + pformat = pformats[0]; + else + pformat = 0; /* default = text */ - getTypeInputInfo(ptype, &typinput, &typioparam); + if (pformat == 0) + { + Oid typinput; + Oid typioparam; + char *pstring; - /* - * We have to do encoding conversion before calling the - * typinput routine. - */ + getTypeInputInfo(ptype, &typinput, &typioparam); + + /* + * We have to do encoding conversion before calling the + * typinput routine. + */ + if (isNull) + pstring = NULL; + else pstring = pg_client_to_server(pbuf.data, plength); - params[i].value = - OidFunctionCall3(typinput, - CStringGetDatum(pstring), - ObjectIdGetDatum(typioparam), - Int32GetDatum(-1)); - /* Free result of encoding conversion, if any */ - if (pstring != pbuf.data) - pfree(pstring); - } - else if (pformat == 1) - { - Oid typreceive; - Oid typioparam; - /* - * Call the parameter type's binary input converter - */ - getTypeBinaryInputInfo(ptype, &typreceive, &typioparam); - - params[i].value = - OidFunctionCall3(typreceive, - PointerGetDatum(&pbuf), - ObjectIdGetDatum(typioparam), - Int32GetDatum(-1)); - - /* Trouble if it didn't eat the whole buffer */ - if (pbuf.cursor != pbuf.len) - ereport(ERROR, - (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), - errmsg("incorrect binary data format in bind parameter %d", - i + 1))); - } + params[i].value = OidInputFunctionCall(typinput, pstring, + typioparam, -1); + /* Free result of encoding conversion, if any */ + if (pstring && pstring != pbuf.data) + pfree(pstring); + } + else if (pformat == 1) + { + Oid typreceive; + Oid typioparam; + StringInfo bufptr; + + /* + * Call the parameter type's binary input converter + */ + getTypeBinaryInputInfo(ptype, &typreceive, &typioparam); + + if (isNull) + bufptr = NULL; else - { + bufptr = &pbuf; + + params[i].value = OidReceiveFunctionCall(typreceive, bufptr, + typioparam, -1); + + /* Trouble if it didn't eat the whole buffer */ + if (!isNull && pbuf.cursor != pbuf.len) ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("unsupported format code: %d", - pformat))); - } + (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), + errmsg("incorrect binary data format in bind parameter %d", + i + 1))); + } + else + { + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unsupported format code: %d", + pformat))); + } - /* Restore message buffer contents */ + /* Restore message buffer contents */ + if (!isNull) pbuf.data[plength] = csave; - } params[i].kind = PARAM_NUM; params[i].id = i + 1; |
