8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-24 12:03:02 +01:00

Fix for bug CORE-2956 : Problems with requests of procedure's parameters.

To be reviewed by Dmitry.
This commit is contained in:
hvlad 2010-04-12 21:19:55 +00:00
parent 2adf49090a
commit bef8ae7376

View File

@ -118,7 +118,6 @@ static bool get_type(thread_db*, USHORT*, const UCHAR*, const TEXT*);
static void lookup_view_contexts(thread_db*, jrd_rel*); static void lookup_view_contexts(thread_db*, jrd_rel*);
static void make_relation_scope_name(const TEXT*, const USHORT, Firebird::string& str); static void make_relation_scope_name(const TEXT*, const USHORT, Firebird::string& str);
static jrd_nod* parse_field_blr(thread_db* tdbb, bid* blob_id, const Firebird::MetaName name = Firebird::MetaName()); static jrd_nod* parse_field_blr(thread_db* tdbb, bid* blob_id, const Firebird::MetaName name = Firebird::MetaName());
static jrd_nod* parse_param_blr(thread_db*, jrd_prc*, bid*, CompilerScratch*);
static void parse_procedure_blr(thread_db*, jrd_prc*, bid*, CompilerScratch*, bool); static void parse_procedure_blr(thread_db*, jrd_prc*, bid*, CompilerScratch*, bool);
static void par_messages(thread_db*, const UCHAR* const, USHORT, jrd_prc*, CompilerScratch*); static void par_messages(thread_db*, const UCHAR* const, USHORT, jrd_prc*, CompilerScratch*);
static bool resolve_charset_and_collation(thread_db*, USHORT*, const UCHAR*, const UCHAR*); static bool resolve_charset_and_collation(thread_db*, USHORT*, const UCHAR*, const UCHAR*);
@ -3166,7 +3165,7 @@ jrd_prc* MET_procedure(thread_db* tdbb, int id, bool noscan, USHORT flags)
const SSHORT pa_collation_id_null = PA.RDB$COLLATION_ID.NULL; const SSHORT pa_collation_id_null = PA.RDB$COLLATION_ID.NULL;
const SSHORT pa_collation_id = PA.RDB$COLLATION_ID; const SSHORT pa_collation_id = PA.RDB$COLLATION_ID;
const SSHORT pa_default_value_null = PA.RDB$DEFAULT_VALUE.NULL; const SSHORT pa_default_value_null = PA.RDB$DEFAULT_VALUE.NULL;
bid pa_default_value = PA.RDB$DEFAULT_VALUE; bid pa_default_value = pa_default_value_null ? F.RDB$DEFAULT_VALUE : PA.RDB$DEFAULT_VALUE;
Array<Parameter*>& paramArray = PA.RDB$PARAMETER_TYPE ? Array<Parameter*>& paramArray = PA.RDB$PARAMETER_TYPE ?
procedure->prc_output_fields : procedure->prc_input_fields; procedure->prc_output_fields : procedure->prc_input_fields;
@ -3193,22 +3192,22 @@ jrd_prc* MET_procedure(thread_db* tdbb, int id, bool noscan, USHORT flags)
(fb_utils::implicit_domain(F.RDB$FIELD_NAME) && !F.RDB$DEFAULT_VALUE.NULL))) (fb_utils::implicit_domain(F.RDB$FIELD_NAME) && !F.RDB$DEFAULT_VALUE.NULL)))
{ {
procedure->prc_defaults++; procedure->prc_defaults++;
Jrd::ContextPoolHolder context(tdbb, dbb->createPool()); MemoryPool* pool = dbb->createPool();
CompilerScratch* csb = CompilerScratch::newCsb(*tdbb->getDefaultPool(), 5); Jrd::ContextPoolHolder context(tdbb, pool);
// CVC: It seems we need another try/catch block here.
if (!pa_default_value_null) try
{ {
parameter->prm_default_value = parameter->prm_default_value =
parse_param_blr(tdbb, procedure, &pa_default_value, csb); MET_parse_blob(tdbb, NULL, &pa_default_value, NULL, NULL, false);
} }
else catch(const Exception&)
{ {
parameter->prm_default_value = // Here we loose pools created for previous defaults.
parse_param_blr(tdbb, procedure, &F.RDB$DEFAULT_VALUE, csb); // Probably we should use common pool for defaults and procedure itself.
}
delete csb; dbb->deletePool(pool);
throw;
}
} }
END_FOR; END_FOR;
@ -4559,28 +4558,6 @@ static jrd_nod* parse_field_blr(thread_db* tdbb, bid* blob_id, const Firebird::M
} }
static jrd_nod* parse_param_blr(thread_db* tdbb, jrd_prc* procedure, bid* blob_id,
CompilerScratch* csb)
{
SET_TDBB(tdbb);
Jrd::Attachment* attachment = tdbb->getAttachment();
blb* blob = BLB_open(tdbb, attachment->getSysTransaction(), blob_id);
SLONG length = blob->blb_length + 10;
Firebird::HalfStaticArray<UCHAR, 512> temp;
length = BLB_get_data(tdbb, blob, temp.getBuffer(length), length);
jrd_req* request = procedure->getRequest();
jrd_nod* node = PAR_blr(tdbb, NULL, temp.begin(), length, NULL, &csb,
&request, false, 0);
procedure->setRequest(request);
csb->csb_blr_reader = BlrReader();
return node;
}
// Generate BLR message for external procedures // Generate BLR message for external procedures
static void gen_ext_message(Firebird::UCharBuffer& blr, UCHAR message, static void gen_ext_message(Firebird::UCharBuffer& blr, UCHAR message,
const Array<Parameter*>& parameters) const Array<Parameter*>& parameters)