@@ -249,8 +249,9 @@ void DsqlDmlRequest::setDelayedFormat(thread_db* tdbb, IMessageMetadata* metadat
249
249
Arg::Gds (isc_req_sync));
250
250
}
251
251
252
+ MessageNode* msg = dsqlStatement->getStatement ()->getMessage (dsqlStatement->getReceiveMsg ()->msg_number );
253
+ metadataToFormat (metadata, msg);
252
254
needDelayedFormat = false ;
253
- delayedFormat = metadata;
254
255
}
255
256
256
257
// Fetch next record from a dynamic SQL cursor.
@@ -277,15 +278,14 @@ bool DsqlDmlRequest::fetch(thread_db* tdbb, UCHAR* msgBuffer)
277
278
Arg::Gds (isc_unprepared_stmt));
278
279
}
279
280
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)
284
283
{
285
- metadataToFormat (delayedFormat, msg);
286
- delayedFormat = NULL ;
284
+ ERRD_post ( Arg::Gds (isc_dsql_sqlda_err) <<
285
+ Arg::Gds (isc_dsql_no_output_sqlda)) ;
287
286
}
288
287
288
+ MessageNode* msg = dsqlStatement->getStatement ()->getMessage (dsqlStatement->getReceiveMsg ()->msg_number );
289
289
const Format* fmt = msg->getFormat (request);
290
290
291
291
// Set up things for tracing this call
@@ -578,6 +578,12 @@ void DsqlDmlRequest::execute(thread_db* tdbb, jrd_tra** traHandle,
578
578
const dsql_msg* message = dsqlStatement->getSendMsg ();
579
579
if (message)
580
580
{
581
+ if (!inMetadata)
582
+ {
583
+ ERRD_post (Arg::Gds (isc_dsql_sqlda_err) <<
584
+ Arg::Gds (isc_dsql_no_input_sqlda));
585
+ }
586
+
581
587
// If this is not first call of execute(), metadata most likely is already converted to message
582
588
// but there is no easy way to check if they match so conversion is unconditional.
583
589
// Even if value of inMetadata is the same, other instance could be placed in the same memory.
0 commit comments