Skip to content

Commit 8ced7aa

Browse files
committed
Adapt query parameters output in trace
1 parent 09af145 commit 8ced7aa

File tree

8 files changed

+52
-65
lines changed

8 files changed

+52
-65
lines changed

src/dsql/DsqlCursor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ void DsqlCursor::close(thread_db* tdbb, DsqlCursor* cursor)
9090

9191
if (dsqlRequest->req_traced && TraceManager::need_dsql_free(attachment))
9292
{
93-
TraceSQLStatementImpl stmt(dsqlRequest, NULL);
93+
TraceSQLStatementImpl stmt(dsqlRequest, nullptr, nullptr);
9494
TraceManager::event_dsql_free(attachment, &stmt, DSQL_close);
9595
}
9696

src/dsql/DsqlRequests.cpp

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ void DsqlRequest::destroy(thread_db* tdbb, DsqlRequest* dsqlRequest)
204204
const bool need_trace_free = dsqlRequest->req_traced && TraceManager::need_dsql_free(att);
205205
if (need_trace_free)
206206
{
207-
TraceSQLStatementImpl stmt(dsqlRequest, NULL);
207+
TraceSQLStatementImpl stmt(dsqlRequest, nullptr, nullptr);
208208
TraceManager::event_dsql_free(att, &stmt, DSQL_drop);
209209
}
210210

@@ -227,20 +227,8 @@ void DsqlRequest::destroy(thread_db* tdbb, DsqlRequest* dsqlRequest)
227227
// DsqlDmlRequest
228228

229229
DsqlDmlRequest::DsqlDmlRequest(thread_db* tdbb, MemoryPool& pool, dsql_dbb* dbb, DsqlStatement* aStatement)
230-
: DsqlRequest(pool, dbb, aStatement),
231-
req_msg_buffers(pool)
230+
: DsqlRequest(pool, dbb, aStatement)
232231
{
233-
// Create the messages buffers
234-
for (auto message : aStatement->getPorts())
235-
{
236-
// Allocate buffer for message
237-
const ULONG newLen = message->msg_length + FB_DOUBLE_ALIGN - 1;
238-
UCHAR* msgBuffer = FB_NEW_POOL(getPool()) UCHAR[newLen];
239-
msgBuffer = FB_ALIGN(msgBuffer, FB_DOUBLE_ALIGN);
240-
fb_assert(message->msg_buffer_number == req_msg_buffers.getCount());
241-
req_msg_buffers.add(msgBuffer);
242-
}
243-
244232
request = aStatement->getStatement()->findRequest(tdbb);
245233
tdbb->getAttachment()->att_requests.add(request);
246234
}
@@ -602,7 +590,7 @@ void DsqlDmlRequest::execute(thread_db* tdbb, jrd_tra** traHandle,
602590

603591
// we need to set new format before tracing of execution start to let trace
604592
// manager know statement parameters values
605-
TraceDSQLExecute trace(req_dbb->dbb_attachment, this);
593+
TraceDSQLExecute trace(req_dbb->dbb_attachment, this, inMsg);
606594

607595
// Setup and start timeout timer
608596
const bool have_cursor = dsqlStatement->isCursorBased() && !singleton;
@@ -698,7 +686,7 @@ void DsqlDmlRequest::executeReceiveWithRestarts(thread_db* tdbb, jrd_tra** traHa
698686
"\tQuery:\n%s\n", numTries, request->getStatement()->sqlText->c_str() );
699687
}
700688

701-
TraceManager::event_dsql_restart(req_dbb->dbb_attachment, req_transaction, this, numTries);
689+
TraceManager::event_dsql_restart(req_dbb->dbb_attachment, req_transaction, this, inMsg, numTries);
702690

703691
// When restart we must execute query
704692
exec = true;
@@ -778,7 +766,7 @@ void DsqlDdlRequest::execute(thread_db* tdbb, jrd_tra** traHandle,
778766
IMessageMetadata* outMetadata, UCHAR* outMsg,
779767
bool singleton)
780768
{
781-
TraceDSQLExecute trace(req_dbb->dbb_attachment, this);
769+
TraceDSQLExecute trace(req_dbb->dbb_attachment, this, inMsg);
782770

783771
fb_utils::init_status(tdbb->tdbb_status_vector);
784772

@@ -825,11 +813,11 @@ DsqlTransactionRequest::DsqlTransactionRequest(MemoryPool& pool, dsql_dbb* dbb,
825813

826814
// Execute a dynamic SQL statement.
827815
void DsqlTransactionRequest::execute(thread_db* tdbb, jrd_tra** traHandle,
828-
IMessageMetadata* /*inMetadata*/, const UCHAR* /*inMsg*/,
816+
IMessageMetadata* /*inMetadata*/, const UCHAR* inMsg,
829817
IMessageMetadata* /*outMetadata*/, UCHAR* /*outMsg*/,
830818
bool /*singleton*/)
831819
{
832-
TraceDSQLExecute trace(req_dbb->dbb_attachment, this);
820+
TraceDSQLExecute trace(req_dbb->dbb_attachment, this, inMsg);
833821
node->execute(tdbb, this, traHandle);
834822
trace.finish(false, ITracePlugin::RESULT_SUCCESS);
835823
}
@@ -861,7 +849,7 @@ void DsqlSessionManagementRequest::execute(thread_db* tdbb, jrd_tra** traHandle,
861849
IMessageMetadata* outMetadata, UCHAR* outMsg,
862850
bool singleton)
863851
{
864-
TraceDSQLExecute trace(req_dbb->dbb_attachment, this);
852+
TraceDSQLExecute trace(req_dbb->dbb_attachment, this, inMsg);
865853
node->execute(tdbb, this, traHandle);
866854
trace.finish(false, ITracePlugin::RESULT_SUCCESS);
867855
}

src/dsql/DsqlRequests.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,6 @@ class DsqlDmlRequest final : public DsqlRequest
195195
Firebird::IMessageMetadata* outMetadata, UCHAR* outMsg,
196196
bool singleton, bool exec, bool fetch);
197197

198-
public:
199-
Firebird::Array<UCHAR*> req_msg_buffers;
200-
201198
private:
202199
Firebird::RefPtr<Firebird::IMessageMetadata> delayedFormat;
203200
Request* request = nullptr;

src/jrd/trace/TraceDSQLHelpers.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class TraceDSQLPrepare
8585

8686
if ((result == ITracePlugin::RESULT_SUCCESS) && m_request)
8787
{
88-
TraceSQLStatementImpl stmt(m_request, NULL);
88+
TraceSQLStatementImpl stmt(m_request, nullptr, nullptr);
8989
TraceManager::event_dsql_prepare(m_attachment, m_transaction, &stmt, millis, result);
9090
}
9191
else
@@ -111,16 +111,17 @@ class TraceDSQLPrepare
111111
class TraceDSQLExecute
112112
{
113113
public:
114-
TraceDSQLExecute(Attachment* attachment, DsqlRequest* dsqlRequest) :
114+
TraceDSQLExecute(Attachment* attachment, DsqlRequest* dsqlRequest, const UCHAR* data) :
115115
m_attachment(attachment),
116-
m_dsqlRequest(dsqlRequest)
116+
m_dsqlRequest(dsqlRequest),
117+
m_data(data)
117118
{
118119
m_need_trace = m_dsqlRequest->req_traced && TraceManager::need_dsql_execute(m_attachment);
119120
if (!m_need_trace)
120121
return;
121122

122123
{ // scope
123-
TraceSQLStatementImpl stmt(dsqlRequest, NULL);
124+
TraceSQLStatementImpl stmt(dsqlRequest, nullptr, m_data);
124125
TraceManager::event_dsql_execute(m_attachment, dsqlRequest->req_transaction, &stmt, true,
125126
ITracePlugin::RESULT_SUCCESS);
126127
}
@@ -156,7 +157,7 @@ class TraceDSQLExecute
156157
fb_utils::query_performance_counter() - m_start_clock,
157158
m_dsqlRequest->req_fetch_rowcount);
158159

159-
TraceSQLStatementImpl stmt(m_dsqlRequest, stats.getPerf());
160+
TraceSQLStatementImpl stmt(m_dsqlRequest, stats.getPerf(), m_data);
160161
TraceManager::event_dsql_execute(m_attachment, m_dsqlRequest->req_transaction, &stmt, false, result);
161162

162163
m_dsqlRequest->req_fetch_baseline = NULL;
@@ -172,6 +173,7 @@ class TraceDSQLExecute
172173
Attachment* const m_attachment;
173174
DsqlRequest* const m_dsqlRequest;
174175
SINT64 m_start_clock;
176+
const UCHAR* m_data;
175177
};
176178

177179
class TraceDSQLFetch
@@ -215,7 +217,7 @@ class TraceDSQLFetch
215217
&m_dsqlRequest->getRequest()->req_stats, m_dsqlRequest->req_fetch_elapsed,
216218
m_dsqlRequest->req_fetch_rowcount);
217219

218-
TraceSQLStatementImpl stmt(m_dsqlRequest, stats.getPerf());
220+
TraceSQLStatementImpl stmt(m_dsqlRequest, stats.getPerf(), nullptr);
219221

220222
TraceManager::event_dsql_execute(m_attachment, m_dsqlRequest->req_transaction,
221223
&stmt, false, result);

src/jrd/trace/TraceManager.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -436,11 +436,11 @@ void TraceManager::event_dsql_execute(Attachment* att, jrd_tra* transaction,
436436
}
437437

438438
void TraceManager::event_dsql_restart(Attachment* att, jrd_tra* transaction,
439-
DsqlRequest* statement, int number)
439+
DsqlRequest* statement, const UCHAR* data, int number)
440440
{
441441
TraceConnectionImpl conn(att);
442442
TraceTransactionImpl tran(transaction);
443-
TraceSQLStatementImpl stmt(statement, NULL);
443+
TraceSQLStatementImpl stmt(statement, nullptr, data);
444444

445445
att->att_trace_manager->event_dsql_restart(&conn, transaction ? &tran : NULL, &stmt,
446446
(unsigned) number);

src/jrd/trace/TraceManager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ class TraceManager
179179
static void event_dsql_execute(Attachment* att, jrd_tra* transaction, Firebird::ITraceSQLStatement* statement,
180180
bool started, ntrace_result_t req_result);
181181

182-
static void event_dsql_restart(Attachment* att, jrd_tra* transaction, DsqlRequest* statement,
182+
static void event_dsql_restart(Attachment* att, jrd_tra* transaction, DsqlRequest* statement, const UCHAR* data,
183183
int number);
184184

185185
static void shutdown();

src/jrd/trace/TraceObjects.cpp

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -221,48 +221,50 @@ ITraceParams* TraceSQLStatementImpl::getInputs()
221221

222222
void TraceSQLStatementImpl::DSQLParamsImpl::fillParams()
223223
{
224-
if (m_descs.getCount() || !m_params || m_params->getCount() == 0)
224+
if (m_descs.getCount() || !m_buffer)
225225
return;
226226

227-
if (!m_stmt->getDsqlStatement()->isDml())
227+
auto stmt = m_stmt->getDsqlStatement();
228+
if (!stmt->isDml())
228229
{
229230
fb_assert(false);
230231
return;
231232
}
232233

233-
const auto dmlRequest = (DsqlDmlRequest*) m_stmt;
234+
dsql_msg* msg = stmt->getSendMsg();
235+
if (!msg)
236+
return;
237+
238+
const auto params = msg->msg_parameters;
239+
if (params.getCount() == 0)
240+
return;
234241

235-
USHORT first_index = 0;
236-
for (FB_SIZE_T i = 0 ; i < m_params->getCount(); ++i)
242+
const Request* req = m_stmt->getRequest();
243+
const Format* fmt = stmt->getStatement()->messages[msg->msg_number]->getFormat(req);
244+
245+
for (FB_SIZE_T i = 0 ; i < params.getCount(); ++i)
237246
{
238-
const dsql_par* parameter = (*m_params)[i];
247+
const dsql_par* parameter = params[i];
239248

240249
if (parameter->par_index)
241250
{
242-
// Use descriptor for nulls signaling
243-
USHORT null_flag = 0;
244-
if (parameter->par_null)
245-
{
246-
const UCHAR* msgBuffer =
247-
dmlRequest->req_msg_buffers[parameter->par_null->par_message->msg_buffer_number];
248-
249-
if (*(SSHORT*) (msgBuffer + (IPTR) parameter->par_null->par_desc.dsc_address))
250-
null_flag = DSC_null;
251-
}
252-
253-
dsc* desc = NULL;
254-
255251
const FB_SIZE_T idx = parameter->par_index - 1;
256252
if (idx >= m_descs.getCount())
257253
m_descs.getBuffer(idx + 1);
258254

259-
desc = &m_descs[idx];
255+
dsc& desc = m_descs[idx];
260256

261-
*desc = parameter->par_desc;
262-
desc->dsc_flags |= null_flag;
263-
264-
UCHAR* msgBuffer = dmlRequest->req_msg_buffers[parameter->par_message->msg_buffer_number];
265-
desc->dsc_address = msgBuffer + (IPTR) desc->dsc_address;
257+
desc = fmt->fmt_desc[parameter->par_parameter];
258+
// Use descriptor for nulls signaling
259+
if (parameter->par_null)
260+
{
261+
if (*(SSHORT*) (m_buffer + (IPTR) fmt->fmt_desc[parameter->par_null->par_parameter].dsc_address))
262+
desc.dsc_flags |= DSC_null;
263+
}
264+
// Even if plugin try to change data in buffer (which is pointless)
265+
// most likely it is safe because client buffer is writeble though
266+
// in EXE_send() it is declared as const.
267+
desc.dsc_address = const_cast<UCHAR*>(m_buffer) + (IPTR) desc.dsc_address;
266268
}
267269
}
268270
}

src/jrd/trace/TraceObjects.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,11 @@ class TraceSQLStatementImpl :
221221
public StatementHolder
222222
{
223223
public:
224-
TraceSQLStatementImpl(DsqlRequest* stmt, Firebird::PerformanceInfo* perf) :
224+
TraceSQLStatementImpl(DsqlRequest* stmt, Firebird::PerformanceInfo* perf, const UCHAR* inputBuffer) :
225225
StatementHolder(stmt ? stmt->getStatement() : nullptr),
226226
m_stmt(stmt),
227227
m_perf(perf),
228-
m_inputs(stmt)
228+
m_inputs(stmt, inputBuffer)
229229
{}
230230

231231
// TraceSQLStatement implementation
@@ -250,11 +250,9 @@ class TraceSQLStatementImpl :
250250
public Firebird::AutoIface<Firebird::ITraceParamsImpl<DSQLParamsImpl, Firebird::CheckStatusWrapper> >
251251
{
252252
public:
253-
explicit DSQLParamsImpl(DsqlRequest* const stmt) :
254-
m_stmt(stmt)
253+
explicit DSQLParamsImpl(DsqlRequest* const stmt, const UCHAR* const inputBuffer) :
254+
m_stmt(stmt), m_buffer(inputBuffer)
255255
{
256-
if (const auto msg = m_stmt->getDsqlStatement()->getSendMsg())
257-
m_params = &msg->msg_parameters;
258256
}
259257

260258
FB_SIZE_T getCount();
@@ -265,7 +263,7 @@ class TraceSQLStatementImpl :
265263
void fillParams();
266264

267265
DsqlRequest* const m_stmt;
268-
const Firebird::Array<dsql_par*>* m_params = nullptr;
266+
const UCHAR* m_buffer;
269267
Firebird::HalfStaticArray<dsc, 16> m_descs;
270268
Firebird::string temp_utf8_text;
271269
};

0 commit comments

Comments
 (0)