From: <asf...@us...> - 2011-06-18 18:50:04
|
Revision: 53192 http://firebird.svn.sourceforge.net/firebird/?rev=53192&view=rev Author: asfernandes Date: 2011-06-18 18:49:58 +0000 (Sat, 18 Jun 2011) Log Message: ----------- Backported fix for CORE-3140 - Preserve comments for parameters after altering procedures. Modified Paths: -------------- firebird/branches/B2_5_Release/doc/WhatsNew firebird/branches/B2_5_Release/src/dsql/ddl.cpp firebird/branches/B2_5_Release/src/dsql/metd.epp firebird/branches/B2_5_Release/src/dsql/metd_proto.h firebird/branches/B2_5_Release/src/jrd/irq.h Modified: firebird/branches/B2_5_Release/doc/WhatsNew =================================================================== --- firebird/branches/B2_5_Release/doc/WhatsNew 2011-06-17 15:34:37 UTC (rev 53191) +++ firebird/branches/B2_5_Release/doc/WhatsNew 2011-06-18 18:49:58 UTC (rev 53192) @@ -498,6 +498,11 @@ Contributor(s): Adriano dos Santos Fernandes <adrianosf at uol.com.br> + * Bugfix CORE-3140 + Preserve comments for parameters after altering procedures. + Contributor(s): + Adriano dos Santos Fernandes <adrianosf at uol.com.br> + * Bugfix CORE-3138 Internal error or crash occurs when accessing any MON$ table after altering its structure Contributor(s): Modified: firebird/branches/B2_5_Release/src/dsql/ddl.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/ddl.cpp 2011-06-17 15:34:37 UTC (rev 53191) +++ firebird/branches/B2_5_Release/src/dsql/ddl.cpp 2011-06-18 18:49:58 UTC (rev 53192) @@ -2473,6 +2473,20 @@ statement->append_number(isc_dyn_prm_number, position); statement->append_number(isc_dyn_prm_type, 0); + if (op == nod_mod_procedure && !modifyInputs.exist(field->fld_name)) + { + UCharBuffer description; + + METD_get_procedure_parameter(statement, procedure_name->str_data, field->fld_name, + description); + + if (description.hasData()) + { + statement->append_string(isc_dyn_description, + (const char*) description.begin(), description.getCount()); + } + } + DDL_resolve_intl_type(statement, field, reinterpret_cast<const dsql_str*>(parameter->nod_arg[e_dfl_collate])); put_field(statement, field, false); Modified: firebird/branches/B2_5_Release/src/dsql/metd.epp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/metd.epp 2011-06-17 15:34:37 UTC (rev 53191) +++ firebird/branches/B2_5_Release/src/dsql/metd.epp 2011-06-18 18:49:58 UTC (rev 53192) @@ -1367,6 +1367,46 @@ } +// Get the description of a procedure parameter. The description is returned in the client charset. +void METD_get_procedure_parameter(CompiledStatement* statement, const MetaName& procedure, + const MetaName& parameter, UCharBuffer& buffer) +{ + thread_db* tdbb = JRD_get_thread_data(); + + dsql_dbb* dbb = statement->req_dbb; + + MutexHolder holder(statement); + + validateTransaction(statement); + + buffer.clear(); + + jrd_req* handle = CMP_find_request(tdbb, irq_parameters_description, IRQ_REQUESTS); + + FOR(REQUEST_HANDLE handle TRANSACTION_HANDLE statement->req_transaction) + X IN RDB$PROCEDURE_PARAMETERS + WITH X.RDB$PROCEDURE_NAME EQ procedure.c_str() AND + X.RDB$PARAMETER_NAME EQ parameter.c_str() AND + X.RDB$DESCRIPTION NOT MISSING + { + if (!DSQL_REQUEST(irq_parameters_description)) + DSQL_REQUEST(irq_parameters_description) = handle; + + UCharBuffer bpb; + BLB_gen_bpb(isc_blob_text, isc_blob_text, CS_METADATA, CS_dynamic, bpb); + + blb* blob = BLB_open2(tdbb, statement->req_transaction, &X.RDB$DESCRIPTION, + bpb.getCount(), bpb.begin()); + buffer.resize(blob->blb_length); + BLB_get_data(tdbb, blob, buffer.begin(), buffer.getCount()); + } + END_FOR + + if (!DSQL_REQUEST(irq_parameters_description)) + DSQL_REQUEST(irq_parameters_description) = handle; +} + + dsql_rel* METD_get_relation(CompiledStatement* statement, const char* name) { /************************************** Modified: firebird/branches/B2_5_Release/src/dsql/metd_proto.h =================================================================== --- firebird/branches/B2_5_Release/src/dsql/metd_proto.h 2011-06-17 15:34:37 UTC (rev 53191) +++ firebird/branches/B2_5_Release/src/dsql/metd_proto.h 2011-06-18 18:49:58 UTC (rev 53192) @@ -57,6 +57,9 @@ Jrd::dsql_udf* METD_get_function(Jrd::dsql_req*, const Jrd::dsql_str*); Jrd::dsql_nod* METD_get_primary_key(Jrd::dsql_req*, const Jrd::dsql_str*); Jrd::dsql_prc* METD_get_procedure(Jrd::CompiledStatement*, const Jrd::dsql_str*); +void METD_get_procedure_parameter(Jrd::CompiledStatement* statement, + const Firebird::MetaName& procedure, const Firebird::MetaName& parameter, + Firebird::UCharBuffer& buffer); Jrd::dsql_rel* METD_get_relation(Jrd::CompiledStatement*, const char*); bool METD_get_trigger(Jrd::dsql_req*, const Jrd::dsql_str*, Jrd::dsql_str**, USHORT*); bool METD_get_type(Jrd::dsql_req*, const Jrd::dsql_str*, const char*, SSHORT*); Modified: firebird/branches/B2_5_Release/src/jrd/irq.h =================================================================== --- firebird/branches/B2_5_Release/src/jrd/irq.h 2011-06-17 15:34:37 UTC (rev 53191) +++ firebird/branches/B2_5_Release/src/jrd/irq.h 2011-06-18 18:49:58 UTC (rev 53192) @@ -141,6 +141,7 @@ irq_procedure, // DSQL/METD: lookup a stored procedure irq_parameters, // DSQL/METD: lookup a procedure's parameters irq_parameters2, // DSQL/METD: lookup a procedure's parameters (ODS 11.1) + irq_parameters_description, // DSQL/METD: lookup a procedure's parameters description irq_collation, // DSQL/METD: lookup a collation name irq_charset, // DSQL/METD: lookup a character set irq_trigger, // DSQL/METD: lookup a trigger This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |