Skip to content

Commit 663ee2b

Browse files
committed
Bring back sanity checks and reduce delay for output format
1 parent 18f3f01 commit 663ee2b

File tree

2 files changed

+13
-8
lines changed

2 files changed

+13
-8
lines changed

src/dsql/DsqlRequests.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,9 @@ void DsqlDmlRequest::setDelayedFormat(thread_db* tdbb, IMessageMetadata* metadat
249249
Arg::Gds(isc_req_sync));
250250
}
251251

252+
MessageNode* msg = dsqlStatement->getStatement()->getMessage(dsqlStatement->getReceiveMsg()->msg_number);
253+
metadataToFormat(metadata, msg);
252254
needDelayedFormat = false;
253-
delayedFormat = metadata;
254255
}
255256

256257
// Fetch next record from a dynamic SQL cursor.
@@ -277,15 +278,14 @@ bool DsqlDmlRequest::fetch(thread_db* tdbb, UCHAR* msgBuffer)
277278
Arg::Gds(isc_unprepared_stmt));
278279
}
279280

280-
const dsql_msg* message = dsqlStatement->getReceiveMsg();
281-
MessageNode* msg = dsqlStatement->getStatement()->getMessage(message->msg_number);
282-
283-
if (delayedFormat && message)
281+
// At this point we have to have output metadata from client
282+
if (needDelayedFormat)
284283
{
285-
metadataToFormat(delayedFormat, msg);
286-
delayedFormat = NULL;
284+
ERRD_post(Arg::Gds(isc_dsql_sqlda_err) <<
285+
Arg::Gds(isc_dsql_no_output_sqlda));
287286
}
288287

288+
MessageNode* msg = dsqlStatement->getStatement()->getMessage(dsqlStatement->getReceiveMsg()->msg_number);
289289
const Format* fmt = msg->getFormat(request);
290290

291291
// Set up things for tracing this call
@@ -578,6 +578,12 @@ void DsqlDmlRequest::execute(thread_db* tdbb, jrd_tra** traHandle,
578578
const dsql_msg* message = dsqlStatement->getSendMsg();
579579
if (message)
580580
{
581+
if (!inMetadata)
582+
{
583+
ERRD_post(Arg::Gds(isc_dsql_sqlda_err) <<
584+
Arg::Gds(isc_dsql_no_input_sqlda));
585+
}
586+
581587
// If this is not first call of execute(), metadata most likely is already converted to message
582588
// but there is no easy way to check if they match so conversion is unconditional.
583589
// Even if value of inMetadata is the same, other instance could be placed in the same memory.

src/dsql/DsqlRequests.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,6 @@ class DsqlDmlRequest final : public DsqlRequest
196196
bool singleton, bool exec, bool fetch);
197197

198198
private:
199-
Firebird::RefPtr<Firebird::IMessageMetadata> delayedFormat;
200199
Request* request = nullptr;
201200
bool needDelayedFormat = false;
202201
bool firstRowFetched = false;

0 commit comments

Comments
 (0)