void ExecuteStatement::execute(Jrd::thread_db* tdbb, jrd_req* request, DSC* desc) { SET_TDBB(tdbb); Attachment* attachment = tdbb->getAttachment(); jrd_tra* const transaction = tdbb->getTransaction(); if (transaction->tra_callback_count >= MAX_CALLBACKS) { ERR_post(Arg::Gds(isc_exec_sql_max_call_exceeded)); } Firebird::string sqlStatementText; getString(tdbb, sqlStatementText, desc, request); transaction->tra_callback_count++; try { AutoPtr<PreparedStatement> stmt(attachment->prepareStatement( tdbb, *tdbb->getDefaultPool(), transaction, sqlStatementText)); // Other requests appear to be incorrect in this context const long requests = (1 << REQ_INSERT) | (1 << REQ_DELETE) | (1 << REQ_UPDATE) | (1 << REQ_DDL) | (1 << REQ_SET_GENERATOR) | (1 << REQ_EXEC_PROCEDURE) | (1 << REQ_EXEC_BLOCK); if (!((1 << stmt->getRequest()->req_type) & requests)) { ERR_post(Arg::Gds(isc_sqlerr) << Arg::Num(-902) << Arg::Gds(isc_exec_sql_invalid_req) << Arg::Str(sqlStatementText)); } stmt->execute(tdbb, transaction); fb_assert(transaction == tdbb->getTransaction()); } catch (const Firebird::Exception&) { transaction->tra_callback_count--; throw; } transaction->tra_callback_count--; }