Questions about the internal of fastpath function call

Started by lee Richardover 14 years ago5 messages
#1lee Richard
clipper.kenyon@gmail.com

Hi,

I am reading the source code of fastpath to understand the internal of
fastpath. I can not understand how does it send result to the client, I hope
somebody can help me on this.

I see it call it invoke the function in

HandleFunctionRequest()
-> retval = FunctionCallInvoke(&fcinfo);
-> SendFunctionResult(retval, fcinfo.isnull, fip->rettype, rformat);
->OidOutputFunctionCall()
-> OutputFunctionCall()
-> result =
DatumGetCString(FunctionCall1(flinfo, val));
-> result =
FunctionCallInvoke(&fcinfo);

but I can not see in where it send the tuples to the client, instead it
invoke FunctionCallInvoke again. Can anyone tell me how it copy the tuples
and send it to the client.

Thanks a lot.

Clipper

#2Merlin Moncure
mmoncure@gmail.com
In reply to: lee Richard (#1)
Re: Questions about the internal of fastpath function call

On Sun, May 8, 2011 at 8:01 AM, lee Richard <clipper.kenyon@gmail.com> wrote:

Hi,

I am reading the source code of fastpath to understand the internal of
fastpath. I can not understand how does it send result to the client, I hope
somebody can help me on this.

I see it call it invoke the function in

HandleFunctionRequest()
  -> retval = FunctionCallInvoke(&fcinfo);
  -> SendFunctionResult(retval, fcinfo.isnull, fip->rettype, rformat);
              ->OidOutputFunctionCall()
                      -> OutputFunctionCall()
                               ->  result =
DatumGetCString(FunctionCall1(flinfo, val));
                                       -> result =
FunctionCallInvoke(&fcinfo);

but I can not see in where it send the tuples to the client, instead it
invoke FunctionCallInvoke again. Can anyone tell me how it copy the tuples
and send it to the client.

It can't: the fastpath function can only return a scalar. See the
client side docs. The whole system is a kludge more or less.

merlin

#3lee Richard
clipper.kenyon@gmail.com
In reply to: Merlin Moncure (#2)
Re: Questions about the internal of fastpath function call

Merlin,

Oh, I didnt realized that it does not support to return scalar, thanks a
lot.

When it returns a single value, I see it use the following function,

SendFunctionCall
result = DatumGetByteaP(FunctionCall1(flinfo, val));

I still can not see how it return a single return value to the client, and
why it call FunctionCall1() again when it want to send the result.

Regards
Clipper

2011/5/8 Merlin Moncure <mmoncure@gmail.com>

Show quoted text

On Sun, May 8, 2011 at 8:01 AM, lee Richard <clipper.kenyon@gmail.com>
wrote:

Hi,

I am reading the source code of fastpath to understand the internal of
fastpath. I can not understand how does it send result to the client, I

hope

somebody can help me on this.

I see it call it invoke the function in

HandleFunctionRequest()
-> retval = FunctionCallInvoke(&fcinfo);
-> SendFunctionResult(retval, fcinfo.isnull, fip->rettype, rformat);
->OidOutputFunctionCall()
-> OutputFunctionCall()
-> result =
DatumGetCString(FunctionCall1(flinfo, val));
-> result =
FunctionCallInvoke(&fcinfo);

but I can not see in where it send the tuples to the client, instead it
invoke FunctionCallInvoke again. Can anyone tell me how it copy the

tuples

and send it to the client.

It can't: the fastpath function can only return a scalar. See the
client side docs. The whole system is a kludge more or less.

merlin

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: lee Richard (#3)
Re: Questions about the internal of fastpath function call

lee Richard <clipper.kenyon@gmail.com> writes:

I still can not see how it return a single return value to the client, and
why it call FunctionCall1() again when it want to send the result.

pq_endmessage is where the bytes actually get pushed out to the client,
if that's what you're looking for. The rest of the activity in
SendFunctionResult is just concerned with constructing the message to be
sent within "buf".

regards, tom lane

#5lee Richard
clipper.kenyon@gmail.com
In reply to: Tom Lane (#4)
Re: Questions about the internal of fastpath function call

Tom,

Thanks a lot.

The part I cant understand is I cant see where SendFunctionResult construct
the return value into the buf. I expect it should copy something in retval
to buf, but I cant find any of this in the code, the main logic of
SendFunctionResult is:

00159 getTypeOutputInfo
<http://doxygen.postgresql.org/lsyscache_8c.html#48d637426d06bfdf607eb29da3be558a&gt;(rettype
<http://doxygen.postgresql.org/structfp__info.html#2b1f02caad79fae010cdc5836a2fcb83&gt;,
&typoutput, &typisvarlena);00160 outputstr =
OidOutputFunctionCall
<http://doxygen.postgresql.org/fmgr_8c.html#9b747dd35f098ab369b44e94f4708210&gt;(typoutput,
retval);00161 pq_sendcountedtext
<http://doxygen.postgresql.org/pqformat_8c.html#e6acc43bbc9bee686de201de82a26db5&gt;(&amp;buf,
outputstr, strlen(outputstr), false);00162 pfree
<http://doxygen.postgresql.org/mcxt_8c.html#4de9741ca04b2f01a82d3de16a1d6bf2&gt;(outputstr);

I think it should copy the real result in OidOutputFunctionCall, but
unfortunately I can only find it call FunctionCall1() again. Do I miss
something?

If I copy the tuples returnned from pl module here, is it possible to send a
vector result from fastpath function call?

2011/5/9 Tom Lane <tgl@sss.pgh.pa.us>

Show quoted text

lee Richard <clipper.kenyon@gmail.com> writes:

I still can not see how it return a single return value to the client,

and

why it call FunctionCall1() again when it want to send the result.

pq_endmessage is where the bytes actually get pushed out to the client,
if that's what you're looking for. The rest of the activity in
SendFunctionResult is just concerned with constructing the message to be
sent within "buf".

regards, tom lane