-
-
Notifications
You must be signed in to change notification settings - Fork 262
Possible fix for #8734 #8735
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Possible fix for #8734 #8735
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -596,19 +596,28 @@ void DsqlDmlRequest::doExecute(thread_db* tdbb, jrd_tra** traHandle, | |
|
|
||
| // if this is a singleton select that return some data, make sure there's in fact one record | ||
|
|
||
| if (singleton && (request->req_flags & req_active) && outMsgLength > 0) | ||
| if (singleton) | ||
| { | ||
| // Create a temp message buffer and try one more receive. | ||
| // If it succeed then the next record exists. | ||
| if (outMsgLength > 0) | ||
| { | ||
| // No record returned though expected | ||
| if (!(request->req_flags & req_active)) | ||
| { | ||
| status_exception::raise(Arg::Gds(isc_stream_eof)); | ||
| } | ||
|
|
||
| std::unique_ptr<UCHAR[]> message_buffer(new UCHAR[outMsgLength]); | ||
| // Create a temp message buffer and try one more receive. | ||
| // If it succeed then the next record exists. | ||
|
|
||
| JRD_receive(tdbb, request, message->msg_number, outMsgLength, message_buffer.get()); | ||
| std::unique_ptr<UCHAR[]> message_buffer(new UCHAR[outMsgLength]); | ||
|
||
|
|
||
| // Still active request means that second record exists | ||
| if ((request->req_flags & req_active)) | ||
| { | ||
| status_exception::raise(Arg::Gds(isc_sing_select_err)); | ||
| JRD_receive(tdbb, request, message->msg_number, outMsgLength, message_buffer.get()); | ||
|
|
||
| // Still active request means that second record exists | ||
| if ((request->req_flags & req_active)) | ||
| { | ||
| status_exception::raise(Arg::Gds(isc_sing_select_err)); | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't understand why there is check for
outMsgLength > 0- is it possible to be false whensingleton == true?Even if out message with zero length is possible (???), what should happens for the
singleton && outMsgLength == 0case ?This place is very unclear for me.
In v5 there was just check for
singleton == true, btwThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just in case. If the function was called with
outMetadata == nullptr- just assume success. The difference from v5 is that buffers here are provided by application rather than of engine itself.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it possible to have
singleton == true && outMetadata == nullptr?In any case, why two nested
ifhere ?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Initially check for request's activity was out of inner
if. Then I realized that some BLR code can intentionally run to the end without enteringblr_sendand an application aware of it can provide no output buffer.If you are sure that I'm wrong feel free to change this piece later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm sure that this code is not clear. And you changed it this way.
Formally,
is the same as
thus I ask why you choose first one. If there is no real reason, change it.
If there is a reasons - provide it, and put in comments to avoid similar misunderstanding for the future readers.