From: <di...@us...> - 2011-07-15 11:52:23
|
Revision: 53313 http://firebird.svn.sourceforge.net/firebird/?rev=53313&view=rev Author: dimitr Date: 2011-07-15 11:52:16 +0000 (Fri, 15 Jul 2011) Log Message: ----------- Completed some missing parts of the PSQL functions implementation. Adriano, please review. Modified Paths: -------------- firebird/trunk/lang_helpers/gds_codes.ftn firebird/trunk/lang_helpers/gds_codes.pas firebird/trunk/src/dsql/DdlNodes.epp firebird/trunk/src/dsql/PackageNodes.epp firebird/trunk/src/include/gen/codetext.h firebird/trunk/src/include/gen/iberror.h firebird/trunk/src/include/gen/msgs.h firebird/trunk/src/include/gen/sql_code.h firebird/trunk/src/include/gen/sql_state.h firebird/trunk/src/jrd/drq.h firebird/trunk/src/msgs/facilities2.sql firebird/trunk/src/msgs/messages2.sql firebird/trunk/src/msgs/system_errors2.sql Modified: firebird/trunk/lang_helpers/gds_codes.ftn =================================================================== --- firebird/trunk/lang_helpers/gds_codes.ftn 2011-07-15 11:24:00 UTC (rev 53312) +++ firebird/trunk/lang_helpers/gds_codes.ftn 2011-07-15 11:52:16 UTC (rev 53313) @@ -1716,6 +1716,10 @@ PARAMETER (GDS__dyn_routine_param_not_found = 336068887) INTEGER*4 GDS__dyn_routine_param_ambiguous PARAMETER (GDS__dyn_routine_param_ambiguous = 336068888) + INTEGER*4 GDS__dyn_coll_used_function + PARAMETER (GDS__dyn_coll_used_function = 336068889) + INTEGER*4 GDS__dyn_domain_used_function + PARAMETER (GDS__dyn_domain_used_function = 336068890) INTEGER*4 GDS__gbak_unknown_switch PARAMETER (GDS__gbak_unknown_switch = 336330753) INTEGER*4 GDS__gbak_page_size_missing Modified: firebird/trunk/lang_helpers/gds_codes.pas =================================================================== --- firebird/trunk/lang_helpers/gds_codes.pas 2011-07-15 11:24:00 UTC (rev 53312) +++ firebird/trunk/lang_helpers/gds_codes.pas 2011-07-15 11:52:16 UTC (rev 53313) @@ -865,6 +865,8 @@ gds_dyn_func_param_not_found = 336068886; gds_dyn_routine_param_not_found = 336068887; gds_dyn_routine_param_ambiguous = 336068888; + gds_dyn_coll_used_function = 336068889; + gds_dyn_domain_used_function = 336068890; gds_gbak_unknown_switch = 336330753; gds_gbak_page_size_missing = 336330754; gds_gbak_page_size_toobig = 336330755; Modified: firebird/trunk/src/dsql/DdlNodes.epp =================================================================== --- firebird/trunk/src/dsql/DdlNodes.epp 2011-07-15 11:24:00 UTC (rev 53312) +++ firebird/trunk/src/dsql/DdlNodes.epp 2011-07-15 11:52:16 UTC (rev 53313) @@ -3433,6 +3433,25 @@ } END_FOR + request2.reset(tdbb, drq_l_arg_coll, DYN_REQUESTS); + + FOR (REQUEST_HANDLE request2 TRANSACTION_HANDLE transaction) + ARG IN RDB$FUNCTION_ARGUMENTS CROSS F IN RDB$FIELDS + WITH ARG.RDB$FIELD_SOURCE EQ F.RDB$FIELD_NAME AND + F.RDB$CHARACTER_SET_ID EQ COLL.RDB$CHARACTER_SET_ID AND + ARG.RDB$COLLATION_ID EQ COLL.RDB$COLLATION_ID + { + fb_utils::exact_name_limit(ARG.RDB$ARGUMENT_NAME, sizeof(ARG.RDB$ARGUMENT_NAME)); + + status_exception::raise( + Arg::Gds(isc_dyn_coll_used_function) << + COLL.RDB$COLLATION_NAME << + QualifiedName(ARG.RDB$FUNCTION_NAME, + (ARG.RDB$PACKAGE_NAME.NULL ? NULL : ARG.RDB$PACKAGE_NAME)).toString().c_str() << + ARG.RDB$ARGUMENT_NAME); + } + END_FOR + request2.reset(tdbb, drq_l_fld_coll, DYN_REQUESTS); FOR (REQUEST_HANDLE request2 TRANSACTION_HANDLE transaction) @@ -4408,7 +4427,24 @@ } END_FOR - //// FIXME: Check domain usage in functions. + request.reset(tdbb, drq_l_arg_src, DYN_REQUESTS); + + FOR(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + X IN RDB$FUNCTION_ARGUMENTS + WITH X.RDB$FIELD_SOURCE EQ name.c_str() + { + fb_utils::exact_name_limit(X.RDB$FIELD_SOURCE, sizeof(X.RDB$FIELD_SOURCE)); + fb_utils::exact_name_limit(X.RDB$FUNCTION_NAME, sizeof(X.RDB$FUNCTION_NAME)); + fb_utils::exact_name_limit(X.RDB$ARGUMENT_NAME, sizeof(X.RDB$ARGUMENT_NAME)); + + // msg 239: "Domain %s is used in function %s (parameter name %s) and cannot be dropped" + status_exception::raise( + Arg::Gds(isc_dyn_domain_used_function) << X.RDB$FIELD_SOURCE << + QualifiedName(X.RDB$FUNCTION_NAME, + (X.RDB$PACKAGE_NAME.NULL ? NULL : X.RDB$PACKAGE_NAME)).toString().c_str() << + X.RDB$ARGUMENT_NAME); + } + END_FOR } @@ -6970,7 +7006,19 @@ } END_FOR - //// FIXME: Check usage in functions. + request2.reset(); + + FOR(REQUEST_HANDLE request2 TRANSACTION_HANDLE transaction) + ARG IN RDB$FUNCTION_ARGUMENTS + WITH ARG.RDB$RELATION_NAME = name.c_str() AND + ARG.RDB$FIELD_NAME = field->fld_name.c_str() + { + MODIFY ARG USING + strcpy(ARG.RDB$FIELD_SOURCE, RFR.RDB$FIELD_SOURCE); + END_MODIFY + } + END_FOR + } END_FOR @@ -7013,8 +7061,10 @@ FLD.RDB$FIELD_NAME STARTING WITH IMPLICIT_DOMAIN_PREFIX AND (NOT ANY RFR IN RDB$RELATION_FIELDS WITH RFR.RDB$FIELD_SOURCE EQ FLD.RDB$FIELD_NAME) AND - (NOT ANY PRC IN RDB$PROCEDURE_PARAMETERS WITH - PRC.RDB$FIELD_SOURCE EQ FLD.RDB$FIELD_NAME) + (NOT ANY PRM IN RDB$PROCEDURE_PARAMETERS WITH + PRM.RDB$FIELD_SOURCE EQ FLD.RDB$FIELD_NAME) AND + (NOT ANY ARG IN RDB$FUNCTION_ARGUMENTS WITH + ARG.RDB$FIELD_SOURCE EQ FLD.RDB$FIELD_NAME) { DropDomainNode::deleteDimensionRecords(tdbb, transaction, globalName); ERASE FLD; Modified: firebird/trunk/src/dsql/PackageNodes.epp =================================================================== --- firebird/trunk/src/dsql/PackageNodes.epp 2011-07-15 11:24:00 UTC (rev 53312) +++ firebird/trunk/src/dsql/PackageNodes.epp 2011-07-15 11:52:16 UTC (rev 53313) @@ -960,7 +960,7 @@ } } - // Lets recreate default of public procedure parameters + // Lets recreate default of public procedure/function parameters requestHandle.reset(tdbb, drq_m_pkg_prm_defs, DYN_REQUESTS); @@ -993,6 +993,36 @@ } END_FOR + requestHandle.reset(tdbb, drq_m_pkg_arg_defs, DYN_REQUESTS); + + FOR (REQUEST_HANDLE requestHandle TRANSACTION_HANDLE transaction) + ARG IN RDB$FUNCTION_ARGUMENTS + WITH ARG.RDB$PACKAGE_NAME EQ name.c_str() + { + size_t pos; + if (existingFuncs.find(Signature(getPool(), MetaName(ARG.RDB$FUNCTION_NAME)), pos)) + { + const Signature& func = existingFuncs[pos]; + + ParameterInfo paramKey(getPool()); + paramKey.number = ARG.RDB$ARGUMENT_POSITION; + + if (func.parameters.find(paramKey, pos)) + { + const ParameterInfo& param = func.parameters[pos]; + + MODIFY ARG + ARG.RDB$DEFAULT_SOURCE = param.defaultSource; + ARG.RDB$DEFAULT_SOURCE.NULL = param.defaultSource.isEmpty(); + + ARG.RDB$DEFAULT_VALUE = param.defaultValue; + ARG.RDB$DEFAULT_VALUE.NULL = param.defaultValue.isEmpty(); + END_MODIFY + } + } + } + END_FOR + executeDdlTrigger(tdbb, dsqlScratch, transaction, DTW_AFTER, DDL_TRIGGER_CREATE_PACKAGE_BODY, name); Modified: firebird/trunk/src/include/gen/codetext.h =================================================================== --- firebird/trunk/src/include/gen/codetext.h 2011-07-15 11:24:00 UTC (rev 53312) +++ firebird/trunk/src/include/gen/codetext.h 2011-07-15 11:52:16 UTC (rev 53313) @@ -854,6 +854,8 @@ {"dyn_func_param_not_found", 336068886}, {"dyn_routine_param_not_found", 336068887}, {"dyn_routine_param_ambiguous", 336068888}, + {"dyn_coll_used_function", 336068889}, + {"dyn_domain_used_function", 336068890}, {"gbak_unknown_switch", 336330753}, {"gbak_page_size_missing", 336330754}, {"gbak_page_size_toobig", 336330755}, Modified: firebird/trunk/src/include/gen/iberror.h =================================================================== --- firebird/trunk/src/include/gen/iberror.h 2011-07-15 11:24:00 UTC (rev 53312) +++ firebird/trunk/src/include/gen/iberror.h 2011-07-15 11:52:16 UTC (rev 53313) @@ -888,6 +888,8 @@ const ISC_STATUS isc_dyn_func_param_not_found = 336068886L; const ISC_STATUS isc_dyn_routine_param_not_found = 336068887L; const ISC_STATUS isc_dyn_routine_param_ambiguous = 336068888L; +const ISC_STATUS isc_dyn_coll_used_function = 336068889L; +const ISC_STATUS isc_dyn_domain_used_function = 336068890L; const ISC_STATUS isc_gbak_unknown_switch = 336330753L; const ISC_STATUS isc_gbak_page_size_missing = 336330754L; const ISC_STATUS isc_gbak_page_size_toobig = 336330755L; @@ -1185,7 +1187,7 @@ const ISC_STATUS isc_trace_switch_param_miss = 337182758L; const ISC_STATUS isc_trace_param_act_notcompat = 337182759L; const ISC_STATUS isc_trace_mandatory_switch_miss = 337182760L; -const ISC_STATUS isc_err_max = 1129; +const ISC_STATUS isc_err_max = 1131; #else /* c definitions */ @@ -2043,6 +2045,8 @@ #define isc_dyn_func_param_not_found 336068886L #define isc_dyn_routine_param_not_found 336068887L #define isc_dyn_routine_param_ambiguous 336068888L +#define isc_dyn_coll_used_function 336068889L +#define isc_dyn_domain_used_function 336068890L #define isc_gbak_unknown_switch 336330753L #define isc_gbak_page_size_missing 336330754L #define isc_gbak_page_size_toobig 336330755L @@ -2340,7 +2344,7 @@ #define isc_trace_switch_param_miss 337182758L #define isc_trace_param_act_notcompat 337182759L #define isc_trace_mandatory_switch_miss 337182760L -#define isc_err_max 1129 +#define isc_err_max 1131 #endif Modified: firebird/trunk/src/include/gen/msgs.h =================================================================== --- firebird/trunk/src/include/gen/msgs.h 2011-07-15 11:24:00 UTC (rev 53312) +++ firebird/trunk/src/include/gen/msgs.h 2011-07-15 11:52:16 UTC (rev 53313) @@ -854,9 +854,11 @@ {336068877, "Package body @1 already exists"}, /* dyn_package_body_exists */ {336068878, "Invalid DDL statement for function @1"}, /* dyn_invalid_ddl_func */ {336068879, "Cannot alter new style function @1 with ALTER EXTERNAL FUNCTION. Use ALTER FUNCTION instead."}, /* dyn_newfc_oldsyntax */ - {336068886, "Parameter @1 in function @2 is not found"}, /* dyn_func_param_not_found */ - {336068887, "Parameter @1 of routine @2 is not found"}, /* dyn_routine_param_not_found */ + {336068886, "Parameter @1 in function @2 not found"}, /* dyn_func_param_not_found */ + {336068887, "Parameter @1 of routine @2 not found"}, /* dyn_routine_param_not_found */ {336068888, "Parameter @1 of routine @2 is ambiguous (found in both procedures and functions). Use a specifier keyword."}, /* dyn_routine_param_ambiguous */ + {336068889, "Collation @1 is used in function @2 (parameter name @3) and cannot be dropped"}, /* dyn_coll_used_function */ + {336068890, "Domain @1 is used in function @2 (parameter name @3) and cannot be dropped"}, /* dyn_domain_used_function */ {336330753, "found unknown switch"}, /* gbak_unknown_switch */ {336330754, "page size parameter missing"}, /* gbak_page_size_missing */ {336330755, "Page size specified (@1) greater than limit (16384 bytes)"}, /* gbak_page_size_toobig */ Modified: firebird/trunk/src/include/gen/sql_code.h =================================================================== --- firebird/trunk/src/include/gen/sql_code.h 2011-07-15 11:24:00 UTC (rev 53312) +++ firebird/trunk/src/include/gen/sql_code.h 2011-07-15 11:52:16 UTC (rev 53313) @@ -853,6 +853,8 @@ {336068886, -901}, /* 278 dyn_func_param_not_found */ {336068887, -901}, /* 279 dyn_routine_param_not_found */ {336068888, -901}, /* 280 dyn_routine_param_ambiguous */ + {336068889, -901}, /* 281 dyn_coll_used_function */ + {336068890, -901}, /* 282 dyn_domain_used_function */ {336330753, -901}, /* 1 gbak_unknown_switch */ {336330754, -901}, /* 2 gbak_page_size_missing */ {336330755, -901}, /* 3 gbak_page_size_toobig */ Modified: firebird/trunk/src/include/gen/sql_state.h =================================================================== --- firebird/trunk/src/include/gen/sql_state.h 2011-07-15 11:24:00 UTC (rev 53312) +++ firebird/trunk/src/include/gen/sql_state.h 2011-07-15 11:52:16 UTC (rev 53313) @@ -853,6 +853,8 @@ {336068886, "42000"}, // 278 dyn_func_param_not_found {336068887, "42000"}, // 279 dyn_routine_param_not_found {336068888, "42000"}, // 280 dyn_routine_param_ambiguous + {336068889, "HY000"}, // 281 dyn_coll_used_function + {336068890, "HY000"}, // 282 dyn_domain_used_function {336330753, "00000"}, // 1 gbak_unknown_switch {336330754, "00000"}, // 2 gbak_page_size_missing {336330755, "00000"}, // 3 gbak_page_size_toobig Modified: firebird/trunk/src/jrd/drq.h =================================================================== --- firebird/trunk/src/jrd/drq.h 2011-07-15 11:24:00 UTC (rev 53312) +++ firebird/trunk/src/jrd/drq.h 2011-07-15 11:52:16 UTC (rev 53313) @@ -162,7 +162,9 @@ drq_l_rfld_coll, // lookup relation field collation drq_l_fld_coll, // lookup field collation drq_l_prp_src, // lookup a procedure parameter source + drq_l_arg_src, // lookup a function argument source drq_l_prm_coll, // lookup procedure parameter collation + drq_l_arg_coll, // lookup function argument collation drq_m_map, // modify os=>db names mapping drq_l_idx_name, // lookup index name drq_l_collation, // DSQL/DdlNodes: lookup collation @@ -206,6 +208,7 @@ drq_s_pkg_usr_prvs, // store package privileges drq_e_pkg_prv, // erase package privileges drq_m_pkg_prm_defs, // modify packaged procedure parameters defaults + drq_m_pkg_arg_defs, // modify packaged function arguments defaults drq_s2_difference, // Store backup difference file, DYN_mod's change_backup_mode drq_l_relation, // lookup relation before erase drq_l_fun_name, // lookup function name Modified: firebird/trunk/src/msgs/facilities2.sql =================================================================== --- firebird/trunk/src/msgs/facilities2.sql 2011-07-15 11:24:00 UTC (rev 53312) +++ firebird/trunk/src/msgs/facilities2.sql 2011-07-15 11:52:16 UTC (rev 53313) @@ -13,7 +13,7 @@ --('1996-11-07 13:39:40', 'GRST', 6, 1) -- ('2005-11-05 13:09:00', 'DSQL', 7, 32) -('2011-07-15 12:08:00', 'DYN', 8, 281) +('2011-07-15 12:08:00', 'DYN', 8, 283) -- --('1996-11-07 13:39:40', 'FRED', 9, 1) -- Modified: firebird/trunk/src/msgs/messages2.sql =================================================================== --- firebird/trunk/src/msgs/messages2.sql 2011-07-15 11:24:00 UTC (rev 53312) +++ firebird/trunk/src/msgs/messages2.sql 2011-07-15 11:52:16 UTC (rev 53313) @@ -1854,6 +1854,8 @@ ('dyn_func_param_not_found', 'OnCommentNode::execute', 'DdlNodes.epp', NULL, 8, 278, NULL, 'Parameter @1 in function @2 not found', NULL, NULL); ('dyn_routine_param_not_found', 'OnCommentNode::execute', 'DdlNodes.epp', NULL, 8, 279, NULL, 'Parameter @1 of routine @2 not found', NULL, NULL); ('dyn_routine_param_ambiguous', 'OnCommentNode::execute', 'DdlNodes.epp', NULL, 8, 280, NULL, 'Parameter @1 of routine @2 is ambiguous (found in both procedures and functions). Use a specifier keyword.', NULL, NULL); +('dyn_coll_used_function', 'DropCollationNode::execute', 'DdlNodes.epp', NULL, 8, 281, NULL, 'Collation @1 is used in function @2 (parameter name @3) and cannot be dropped', NULL, NULL); +('dyn_domain_used_function', 'DropDomainNode', 'DdlNodes.epp', NULL, 8, 282, NULL, 'Domain @1 is used in function @2 (parameter name @3) and cannot be dropped', NULL, NULL); COMMIT WORK; -- TEST (NULL, 'main', 'test.c', NULL, 11, 0, NULL, 'This is a modified text message', NULL, NULL); Modified: firebird/trunk/src/msgs/system_errors2.sql =================================================================== --- firebird/trunk/src/msgs/system_errors2.sql 2011-07-15 11:24:00 UTC (rev 53312) +++ firebird/trunk/src/msgs/system_errors2.sql 2011-07-15 11:52:16 UTC (rev 53313) @@ -841,6 +841,8 @@ (-901, '42', '000', 8, 278, 'dyn_func_param_not_found', NULL, NULL) (-901, '42', '000', 8, 279, 'dyn_routine_param_not_found', NULL, NULL) (-901, '42', '000', 8, 280, 'dyn_routine_param_ambiguous', NULL, NULL) +(-901, 'HY', '000', 8, 281, 'dyn_coll_used_function', NULL, NULL) +(-901, 'HY', '000', 8, 282, 'dyn_domain_used_function', NULL, NULL) -- GBAK (-901, '00', '000', 12, 1, 'gbak_unknown_switch', NULL, NULL) (-901, '00', '000', 12, 2, 'gbak_page_size_missing', NULL, NULL) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |