From: <asf...@us...> - 2014-07-27 03:05:54
|
Revision: 59913 http://sourceforge.net/p/firebird/code/59913 Author: asfernandes Date: 2014-07-27 03:05:44 +0000 (Sun, 27 Jul 2014) Log Message: ----------- Improvement CORE-4484 - Description (COMMENT ON) for package procedures and functions, and its parameters. Modified Paths: -------------- firebird/trunk/doc/sql.extensions/README.ddl.txt firebird/trunk/src/common/classes/QualifiedName.h firebird/trunk/src/dsql/DdlNodes.epp firebird/trunk/src/dsql/DdlNodes.h firebird/trunk/src/dsql/parse.y firebird/trunk/src/isql/show.epp Modified: firebird/trunk/doc/sql.extensions/README.ddl.txt =================================================================== --- firebird/trunk/doc/sql.extensions/README.ddl.txt 2014-07-26 20:29:52 UTC (rev 59912) +++ firebird/trunk/doc/sql.extensions/README.ddl.txt 2014-07-27 03:05:44 UTC (rev 59913) @@ -136,7 +136,8 @@ COMMENT ON DATABASE IS {'txt'|NULL}; COMMENT ON <basic_type> name IS {'txt'|NULL}; COMMENT ON COLUMN table_or_view_name.field_name IS {'txt'|NULL}; -COMMENT ON PARAMETER procedure_name.param_name IS {'txt'|NULL}; +COMMENT ON {PROCEDURE | FUNCTION} [<package_name> .] name.param_name IS {'txt'|NULL}; +COMMENT ON [PROCEDURE | FUNCTION] PARAMETER [<package_name> .] name.param_name IS {'txt'|NULL}; An empty literal string '' will act as NULL since the internal code (DYN in this case) works this way with blobs. Modified: firebird/trunk/src/common/classes/QualifiedName.h =================================================================== --- firebird/trunk/src/common/classes/QualifiedName.h 2014-07-26 20:29:52 UTC (rev 59912) +++ firebird/trunk/src/common/classes/QualifiedName.h 2014-07-27 03:05:44 UTC (rev 59913) @@ -47,6 +47,12 @@ { } + QualifiedName(MemoryPool& p, const MetaName& aIdentifier) + : identifier(p, aIdentifier), + package(p) + { + } + explicit QualifiedName(const MetaName& aIdentifier) : identifier(aIdentifier) { Modified: firebird/trunk/src/dsql/DdlNodes.epp =================================================================== --- firebird/trunk/src/dsql/DdlNodes.epp 2014-07-26 20:29:52 UTC (rev 59912) +++ firebird/trunk/src/dsql/DdlNodes.epp 2014-07-27 03:05:44 UTC (rev 59913) @@ -1054,7 +1054,7 @@ " objType: %s\n" " objName: %s\n" " text: %s\n", - objType, objName.c_str(), this->text.c_str()); + objType, objName.toString().c_str(), this->text.c_str()); } bool CommentOnNode::checkPermission(thread_db* tdbb, jrd_tra* transaction) @@ -1078,54 +1078,52 @@ const char* subColumnClause = NULL; const char* addWhereClause = NULL; Arg::StatusVector status; + string objNameStr = objName.toString(); if (objType == obj_parameter) { fb_assert(subName.hasData()); - PreparedStatement::Builder sql; - sql << "select 1 from rdb$procedures p join rdb$procedure_parameters pp using (rdb$procedure_name)" << - "where p.rdb$procedure_name =" << objName << - "and p.rdb$package_name is null and pp.rdb$package_name is null" << - "and pp.rdb$parameter_name =" << subName << - "union all" << - "select 2 from rdb$functions f join rdb$function_arguments fa using (rdb$function_name)" << - "where f.rdb$function_name =" << objName << - "and f.rdb$package_name is null and fa.rdb$package_name is null" << - "and fa.rdb$argument_name =" << subName; + AutoRequest requestHandle; - AutoPreparedStatement ps(attachment->prepareStatement(tdbb, transaction, sql)); - AutoResultSet rs(ps->executeQuery(tdbb, transaction)); - - if (!rs->fetch(tdbb)) + FOR (REQUEST_HANDLE requestHandle TRANSACTION_HANDLE transaction) + FUN IN RDB$FUNCTIONS CROSS + ARG IN RDB$FUNCTION_ARGUMENTS + WITH FUN.RDB$FUNCTION_NAME EQ objName.identifier.c_str() AND + FUN.RDB$PACKAGE_NAME EQUIV NULLIF(objName.package.c_str(), '') AND + ARG.RDB$FUNCTION_NAME EQ FUN.RDB$FUNCTION_NAME AND + ARG.RDB$PACKAGE_NAME EQUIV FUN.RDB$PACKAGE_NAME AND + ARG.RDB$ARGUMENT_NAME EQ subName.c_str() { - status_exception::raise(Arg::Gds(isc_dyn_routine_param_not_found) << - Arg::Str(subName) << Arg::Str(objName)); + objType = obj_udf; } + END_FOR - fb_assert(!rs->isNull(1)); - dsc& desc = rs->getDesc(1); - fb_assert(desc.dsc_dtype == dtype_long); - const SLONG result = *reinterpret_cast<SLONG*>(desc.dsc_address); + requestHandle.reset(); - switch (result) + FOR (REQUEST_HANDLE requestHandle TRANSACTION_HANDLE transaction) + PRC IN RDB$PROCEDURES CROSS + PRM IN RDB$PROCEDURE_PARAMETERS + WITH PRC.RDB$PROCEDURE_NAME EQ objName.identifier.c_str() AND + PRC.RDB$PACKAGE_NAME EQUIV NULLIF(objName.package.c_str(), '') AND + PRM.RDB$PROCEDURE_NAME EQ PRC.RDB$PROCEDURE_NAME AND + PRM.RDB$PACKAGE_NAME EQUIV PRC.RDB$PACKAGE_NAME AND + PRM.RDB$PARAMETER_NAME EQ subName.c_str() { - case 1: + if (objType == obj_parameter) objType = obj_procedure; - break; - - case 2: - objType = obj_udf; - break; - - default: - fb_assert(false); + else + { + status_exception::raise(Arg::Gds(isc_dyn_routine_param_ambiguous) << + Arg::Str(subName) << Arg::Str(objNameStr)); + } } + END_FOR - if (rs->fetch(tdbb)) + if (objType == obj_parameter) { - status_exception::raise(Arg::Gds(isc_dyn_routine_param_ambiguous) << - Arg::Str(subName) << Arg::Str(objName)); + status_exception::raise(Arg::Gds(isc_dyn_routine_param_not_found) << + Arg::Str(subName) << Arg::Str(objNameStr)); } } @@ -1147,13 +1145,13 @@ tableClause = "rdb$relation_fields"; subColumnClause = "rdb$field_name"; status << Arg::Gds(isc_dyn_column_does_not_exist) << - Arg::Str(subName) << Arg::Str(objName); + Arg::Str(subName) << Arg::Str(objNameStr); } else { tableClause = "rdb$relations"; addWhereClause = "rdb$view_blr is null"; - status << Arg::Gds(isc_dyn_table_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_table_not_found) << Arg::Str(objNameStr); } columnClause = "rdb$relation_name"; break; @@ -1161,7 +1159,7 @@ case obj_view: tableClause = "rdb$relations"; columnClause = "rdb$relation_name"; - status << Arg::Gds(isc_dyn_view_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_view_not_found) << Arg::Str(objNameStr); addWhereClause = "rdb$view_blr is not null"; break; @@ -1171,22 +1169,21 @@ tableClause = "rdb$procedure_parameters"; subColumnClause = "rdb$parameter_name"; status << Arg::Gds(isc_dyn_proc_param_not_found) << - Arg::Str(subName) << Arg::Str(objName); + Arg::Str(subName) << Arg::Str(objNameStr); } else { tableClause = "rdb$procedures"; - status << Arg::Gds(isc_dyn_proc_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_proc_not_found) << Arg::Str(objNameStr); } - addWhereClause = "rdb$package_name is null"; columnClause = "rdb$procedure_name"; break; case obj_trigger: tableClause = "rdb$triggers"; columnClause = "rdb$trigger_name"; - status << Arg::Gds(isc_dyn_trig_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_trig_not_found) << Arg::Str(objNameStr); break; case obj_udf: @@ -1195,70 +1192,69 @@ tableClause = "rdb$function_arguments"; subColumnClause = "rdb$argument_name"; status << Arg::Gds(isc_dyn_func_param_not_found) << - Arg::Str(subName) << Arg::Str(objName); + Arg::Str(subName) << Arg::Str(objNameStr); } else { tableClause = "rdb$functions"; - status << Arg::Gds(isc_dyn_func_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_func_not_found) << Arg::Str(objNameStr); } - addWhereClause = "rdb$package_name is null"; columnClause = "rdb$function_name"; break; case obj_blob_filter: tableClause = "rdb$filters"; columnClause = "rdb$function_name"; - status << Arg::Gds(isc_dyn_filter_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_filter_not_found) << Arg::Str(objNameStr); break; case obj_exception: tableClause = "rdb$exceptions"; columnClause = "rdb$exception_name"; - status << Arg::Gds(isc_dyn_exception_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_exception_not_found) << Arg::Str(objNameStr); break; case obj_generator: tableClause = "rdb$generators"; columnClause = "rdb$generator_name"; - status << Arg::Gds(isc_dyn_gen_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_gen_not_found) << Arg::Str(objNameStr); break; case obj_index: tableClause = "rdb$indices"; columnClause = "rdb$index_name"; - status << Arg::Gds(isc_dyn_index_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_index_not_found) << Arg::Str(objNameStr); break; case obj_sql_role: tableClause = "rdb$roles"; columnClause = "rdb$role_name"; - status << Arg::Gds(isc_dyn_role_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_role_not_found) << Arg::Str(objNameStr); break; case obj_charset: tableClause = "rdb$character_sets"; columnClause = "rdb$character_set_name"; - status << Arg::Gds(isc_dyn_charset_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_charset_not_found) << Arg::Str(objNameStr); break; case obj_collation: tableClause = "rdb$collations"; columnClause = "rdb$collation_name"; - status << Arg::Gds(isc_dyn_collation_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_collation_not_found) << Arg::Str(objNameStr); break; case obj_package_header: tableClause = "rdb$packages"; columnClause = "rdb$package_name"; - status << Arg::Gds(isc_dyn_package_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_package_not_found) << Arg::Str(objNameStr); break; case obj_schema: tableClause = "rdb$schemas"; columnClause = "rdb$schema_name"; - status << Arg::Gds(isc_dyn_schema_not_found) << Arg::Str(objName); + status << Arg::Gds(isc_dyn_schema_not_found) << Arg::Str(objNameStr); break; default: @@ -1271,16 +1267,19 @@ description = text; PreparedStatement::Builder sql; - sql << "update" << tableClause << "set rdb$description =" << description; + sql << "update" << tableClause << "set rdb$description =" << description << "where 1 = 1"; if (columnClause) { - sql << "where" << columnClause << "=" << objName; + sql << "and" << columnClause << "=" << objName.identifier; if (subColumnClause) sql << "and" << subColumnClause << "=" << subName; } + if (objType == obj_procedure || objType == obj_udf) + sql << "and rdb$package_name is not distinct from nullif(" << objName.package << ", '')"; + if (addWhereClause) sql << "and" << addWhereClause; Modified: firebird/trunk/src/dsql/DdlNodes.h =================================================================== --- firebird/trunk/src/dsql/DdlNodes.h 2014-07-26 20:29:52 UTC (rev 59912) +++ firebird/trunk/src/dsql/DdlNodes.h 2014-07-27 03:05:44 UTC (rev 59913) @@ -220,7 +220,7 @@ { public: CommentOnNode(MemoryPool& pool, int aObjType, - const Firebird::MetaName& aObjName, const Firebird::MetaName& aSubName, + const Firebird::QualifiedName& aObjName, const Firebird::MetaName& aSubName, const Firebird::string aText) : DdlNode(pool), objType(aObjType), @@ -238,18 +238,21 @@ protected: virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector) { - /*** ASF: FIXME: When returning, str is destroyed but its pointer is recorded. - Firebird::string str(objName.c_str()); + Firebird::string str(objName.toString()); + if (subName.hasData()) str.append(".").append(subName.c_str()); - statusVector << Firebird::Arg::Gds(isc_dsql_comment_on_failed) << str; - ***/ - statusVector << Firebird::Arg::Gds(isc_dsql_comment_on_failed) << objName; + + //// ASF: What a hack, as StatusVector does not save the pointer content! + const char* p = Firebird::MasterInterfacePtr()->circularAlloc(str.c_str(), str.length(), + (intptr_t) getThreadId()); + + statusVector << Firebird::Arg::Gds(isc_dsql_comment_on_failed) << p; } private: int objType; - Firebird::MetaName objName; + Firebird::QualifiedName objName; Firebird::MetaName subName; Firebird::string text; }; Modified: firebird/trunk/src/dsql/parse.y =================================================================== --- firebird/trunk/src/dsql/parse.y 2014-07-26 20:29:52 UTC (rev 59912) +++ firebird/trunk/src/dsql/parse.y 2014-07-27 03:05:44 UTC (rev 59913) @@ -619,6 +619,7 @@ Firebird::MetaName* metaNamePtr; Firebird::ObjectsArray<Firebird::MetaName>* metaNameArray; Firebird::PathName* pathNamePtr; + Firebird::QualifiedName* qualifiedNamePtr; Firebird::string* stringPtr; Jrd::IntlString* intlStringPtr; Jrd::DbFileClause* dbFileClause; @@ -4723,11 +4724,15 @@ %type <ddlNode> comment comment : COMMENT ON ddl_type0 IS ddl_desc - { $$ = newNode<CommentOnNode>($3, "", "", *$5); } + { $$ = newNode<CommentOnNode>($3, QualifiedName(""), "", *$5); } | COMMENT ON ddl_type1 symbol_ddl_name IS ddl_desc - { $$ = newNode<CommentOnNode>($3, *$4, "", *$6); } + { $$ = newNode<CommentOnNode>($3, QualifiedName(*$4), "", *$6); } | COMMENT ON ddl_type2 symbol_ddl_name ddl_subname IS ddl_desc + { $$ = newNode<CommentOnNode>($3, QualifiedName(*$4), *$5, *$7); } + | COMMENT ON ddl_type3 ddl_qualified_name ddl_subname IS ddl_desc { $$ = newNode<CommentOnNode>($3, *$4, *$5, *$7); } + | COMMENT ON ddl_type4 ddl_qualified_name IS ddl_desc + { $$ = newNode<CommentOnNode>($3, *$4, "", *$6); } | COMMENT ON USER symbol_user_name IS ddl_desc { CreateAlterUserNode* node = @@ -4748,10 +4753,7 @@ : KW_DOMAIN { $$ = obj_field; } | TABLE { $$ = obj_relation; } | VIEW { $$ = obj_view; } - | PROCEDURE { $$ = obj_procedure; } | TRIGGER { $$ = obj_trigger; } - | EXTERNAL FUNCTION { $$ = obj_udf; } - | FUNCTION { $$ = obj_udf; } | FILTER { $$ = obj_blob_filter; } | EXCEPTION { $$ = obj_exception; } | GENERATOR { $$ = obj_generator; } @@ -4769,21 +4771,39 @@ %type <intVal> ddl_type2 ddl_type2 : COLUMN { $$ = obj_relation; } - | ddl_param_opt PARAMETER { $$ = $1; } ; -%type <intVal> ddl_param_opt -ddl_param_opt - : { $$ = obj_parameter; } - | PROCEDURE { $$ = obj_procedure; } - | FUNCTION { $$ = obj_udf; } +%type <intVal> ddl_type3 +ddl_type3 + : PARAMETER { $$ = obj_parameter; } + | PROCEDURE PARAMETER { $$ = obj_procedure; } + | FUNCTION PARAMETER { $$ = obj_udf; } ; +%type <intVal> ddl_type4 +ddl_type4 + : PROCEDURE { $$ = obj_procedure; } + | EXTERNAL FUNCTION { $$ = obj_udf; } + | FUNCTION { $$ = obj_udf; } + ; + %type <metaNamePtr> ddl_subname ddl_subname : '.' symbol_ddl_name { $$ = $2; } ; +%type <metaNamePtr> ddl_subname_opt +ddl_subname_opt + : /* nothing */ { $$ = NULL; } + | ddl_subname + ; + +%type <qualifiedNamePtr> ddl_qualified_name +ddl_qualified_name + : symbol_ddl_name { $$ = newNode<QualifiedName>(*$1); } + | symbol_ddl_name '.' symbol_ddl_name { $$ = newNode<QualifiedName>(*$3, *$1); } + ; + %type <stringPtr> ddl_desc ddl_desc : utf_string { $$ = $1; } Modified: firebird/trunk/src/isql/show.epp =================================================================== --- firebird/trunk/src/isql/show.epp 2014-07-26 20:29:52 UTC (rev 59912) +++ firebird/trunk/src/isql/show.epp 2014-07-27 03:05:44 UTC (rev 59913) @@ -85,7 +85,7 @@ static void show_charsets(const SCHAR*, const SCHAR*, const bool, bool, bool, bool); static processing_state show_check(const SCHAR*); static processing_state show_collations(const SCHAR*, SSHORT sys_flag, const char* msg = 0, bool compact = false); -static void show_comment(const char* objtype, char* name1, char* name2, +static void show_comment(const char* objtype, char* packageName, char* name1, char* name2, ISC_QUAD* blobfld, const commentMode showextract, const char* banner); static processing_state show_comments(const commentMode showextract, const char* banner); static void show_db(); @@ -2668,7 +2668,7 @@ // Helper that displays in correct syntax the COMMENT ON command for each object. // It escapes identifiers with embedded double quotes and escapes the comment // itself if it contains single quotes when we are honoring script extraction. -static void show_comment(const char* objtype, char* name1, char* name2, +static void show_comment(const char* objtype, char* packageName, char* name1, char* name2, ISC_QUAD* blobfld, const commentMode showextract, const char* banner) { const bool escape_quotes = showextract == cmmExtract; @@ -2676,19 +2676,30 @@ if (escape_quotes && banner) isqlGlob.prints(banner); + if (packageName) + fb_utils::exact_name(packageName); if (name1) fb_utils::exact_name(name1); if (name2) fb_utils::exact_name(name2); + char packageNameBuffer[BUFFER_LENGTH128]; char SQL_identifier2[BUFFER_LENGTH128]; + if (escape_quotes && isqlGlob.db_SQL_dialect > SQL_DIALECT_V6_TRANSITION) { + if (packageName) + { + IUTILS_copy_SQL_id (packageName, packageNameBuffer, DBL_QUOTE); + packageName = packageNameBuffer; + } + if (name1) { IUTILS_copy_SQL_id (name1, SQL_identifier, DBL_QUOTE); name1 = SQL_identifier; } + if (name2) { IUTILS_copy_SQL_id (name2, SQL_identifier2, DBL_QUOTE); @@ -2698,13 +2709,22 @@ const char* quot = escape_quotes ? "'" : ""; - if (!name1) - isqlGlob.printf("COMMENT ON %-12s IS %s", objtype, quot); - else if (!name2) - isqlGlob.printf("COMMENT ON %-12s %s IS %s", objtype, name1, quot); - else - isqlGlob.printf("COMMENT ON %-12s %s.%s IS %s", objtype, name1, name2, quot); + isqlGlob.printf("COMMENT ON %-12s", objtype); + if (packageName || name1 || name2) + isqlGlob.printf(" "); + + if (packageName) + isqlGlob.printf("%s.", packageName); + + if (name1) + isqlGlob.printf("%s", name1); + + if (name2) + isqlGlob.printf(".%s", name2); + + isqlGlob.printf(" IS %s", quot); + SHOW_print_metadata_text_blob(isqlGlob.Out, blobfld, escape_quotes); isqlGlob.printf("%s%s%s", quot, isqlGlob.global_Term, NEWLINE); } @@ -2740,7 +2760,7 @@ FOR FIRST 1 DT IN RDB$DATABASE WITH DT.RDB$DESCRIPTION NOT MISSING - show_comment("DATABASE", 0, 0, &DT.RDB$DESCRIPTION, showextract, first ? banner : 0); + show_comment("DATABASE", NULL, NULL, NULL, &DT.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR ON_ERROR @@ -2754,7 +2774,7 @@ AND DM.RDB$DESCRIPTION NOT MISSING SORTED BY DM.RDB$FIELD_NAME - show_comment("DOMAIN", DM.RDB$FIELD_NAME, 0, &DM.RDB$DESCRIPTION, + show_comment("DOMAIN", NULL, DM.RDB$FIELD_NAME, NULL, &DM.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR @@ -2770,7 +2790,7 @@ if (!RL.RDB$DESCRIPTION.NULL && !UserBlob::blobIsNull(RL.RDB$DESCRIPTION)) { - show_comment("TABLE", RL.RDB$RELATION_NAME, 0, &RL.RDB$DESCRIPTION, + show_comment("TABLE", NULL, RL.RDB$RELATION_NAME, NULL, &RL.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; } @@ -2780,7 +2800,7 @@ AND RF.RDB$DESCRIPTION NOT MISSING SORTED BY RF.RDB$FIELD_POSITION - show_comment(" COLUMN", RL.RDB$RELATION_NAME, RF.RDB$FIELD_NAME, + show_comment(" COLUMN", NULL, RL.RDB$RELATION_NAME, RF.RDB$FIELD_NAME, &RF.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR @@ -2802,7 +2822,7 @@ if (!VW.RDB$DESCRIPTION.NULL && !UserBlob::blobIsNull(VW.RDB$DESCRIPTION)) { - show_comment("VIEW", VW.RDB$RELATION_NAME, 0 , &VW.RDB$DESCRIPTION, + show_comment("VIEW", NULL, VW.RDB$RELATION_NAME, NULL, &VW.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; } @@ -2812,7 +2832,7 @@ AND RF.RDB$DESCRIPTION NOT MISSING SORTED BY RF.RDB$FIELD_POSITION - show_comment(" COLUMN", VW.RDB$RELATION_NAME, RF.RDB$FIELD_NAME, + show_comment(" COLUMN", NULL, VW.RDB$RELATION_NAME, RF.RDB$FIELD_NAME, &RF.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR @@ -2829,24 +2849,24 @@ FOR PR IN RDB$PROCEDURES WITH (PR.RDB$SYSTEM_FLAG EQ 0 OR PR.RDB$SYSTEM_FLAG MISSING) - AND PR.RDB$PACKAGE_NAME MISSING SORTED BY PR.RDB$PROCEDURE_NAME if (!PR.RDB$DESCRIPTION.NULL && !UserBlob::blobIsNull(PR.RDB$DESCRIPTION)) { - show_comment("PROCEDURE", PR.RDB$PROCEDURE_NAME, 0, &PR.RDB$DESCRIPTION, - showextract, first ? banner : 0); + show_comment("PROCEDURE", (PR.RDB$PACKAGE_NAME.NULL ? NULL : PR.RDB$PACKAGE_NAME), + PR.RDB$PROCEDURE_NAME, NULL, &PR.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; } FOR PA IN RDB$PROCEDURE_PARAMETERS WITH PA.RDB$PROCEDURE_NAME = PR.RDB$PROCEDURE_NAME - AND PA.RDB$PACKAGE_NAME MISSING + AND PA.RDB$PACKAGE_NAME EQUIV NULLIF(PR.RDB$PACKAGE_NAME, '') AND PA.RDB$DESCRIPTION NOT MISSING SORTED BY PA.RDB$PARAMETER_TYPE, PA.RDB$PARAMETER_NUMBER - show_comment(" PARAMETER", PR.RDB$PROCEDURE_NAME, PA.RDB$PARAMETER_NAME, - &PA.RDB$DESCRIPTION, showextract, first ? banner : 0); + show_comment(" PROCEDURE PARAMETER", + (PR.RDB$PACKAGE_NAME.NULL ? NULL : PR.RDB$PACKAGE_NAME), PR.RDB$PROCEDURE_NAME, + PA.RDB$PARAMETER_NAME, &PA.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR ON_ERROR @@ -2865,7 +2885,7 @@ AND (TR.RDB$SYSTEM_FLAG EQ 0 OR TR.RDB$SYSTEM_FLAG MISSING) SORTED BY TR.RDB$TRIGGER_NAME - show_comment("TRIGGER", TR.RDB$TRIGGER_NAME, 0, &TR.RDB$DESCRIPTION, + show_comment("TRIGGER", NULL, TR.RDB$TRIGGER_NAME, NULL, &TR.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR @@ -2877,7 +2897,6 @@ FOR UD IN RDB$FUNCTIONS WITH UD.RDB$DESCRIPTION NOT MISSING AND (UD.RDB$SYSTEM_FLAG EQ 0 OR UD.RDB$SYSTEM_FLAG MISSING) - AND UD.RDB$PACKAGE_NAME MISSING SORTED BY UD.RDB$FUNCTION_NAME // Avoid syntax error when extracting scripts due to an historical bug in gbak. @@ -2885,9 +2904,26 @@ if (UserBlob::blobIsNull(UD.RDB$DESCRIPTION)) continue; - show_comment("EXTERNAL FUNCTION", UD.RDB$FUNCTION_NAME, 0, + show_comment("FUNCTION", + (UD.RDB$PACKAGE_NAME.NULL ? NULL : UD.RDB$PACKAGE_NAME), UD.RDB$FUNCTION_NAME, NULL, &UD.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; + + FOR ARG IN RDB$FUNCTION_ARGUMENTS + WITH ARG.RDB$FUNCTION_NAME = UD.RDB$FUNCTION_NAME + AND ARG.RDB$PACKAGE_NAME EQUIV NULLIF(UD.RDB$PACKAGE_NAME, '') + AND ARG.RDB$DESCRIPTION NOT MISSING + SORTED BY ARG.RDB$ARGUMENT_POSITION + + show_comment(" FUNCTION PARAMETER", + (ARG.RDB$PACKAGE_NAME.NULL ? NULL : ARG.RDB$PACKAGE_NAME), ARG.RDB$FUNCTION_NAME, + ARG.RDB$ARGUMENT_NAME, &ARG.RDB$DESCRIPTION, showextract, first ? banner : 0); + first = false; + END_FOR + ON_ERROR + ISQL_errmsg(fbStatus); + return ps_ERR; + END_ERROR END_FOR ON_ERROR ISQL_errmsg(fbStatus); @@ -2899,7 +2935,7 @@ AND (BF.RDB$SYSTEM_FLAG EQ 0 OR BF.RDB$SYSTEM_FLAG MISSING) SORTED BY BF.RDB$FUNCTION_NAME - show_comment("FILTER", BF.RDB$FUNCTION_NAME, 0, &BF.RDB$DESCRIPTION, + show_comment("FILTER", NULL, BF.RDB$FUNCTION_NAME, NULL, &BF.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR @@ -2913,7 +2949,7 @@ AND (XC.RDB$SYSTEM_FLAG EQ 0 OR XC.RDB$SYSTEM_FLAG MISSING) SORTED BY XC.RDB$EXCEPTION_NAME - show_comment("EXCEPTION", XC.RDB$EXCEPTION_NAME, 0, &XC.RDB$DESCRIPTION, + show_comment("EXCEPTION", NULL, XC.RDB$EXCEPTION_NAME, NULL, &XC.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR @@ -2929,7 +2965,7 @@ AND (GR.RDB$SYSTEM_FLAG EQ 0 OR GR.RDB$SYSTEM_FLAG MISSING) SORTED BY GR.RDB$GENERATOR_NAME - show_comment("GENERATOR", GR.RDB$GENERATOR_NAME, 0, &GR.RDB$DESCRIPTION, + show_comment("GENERATOR", NULL, GR.RDB$GENERATOR_NAME, NULL, &GR.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR @@ -2944,7 +2980,7 @@ AND (IX.RDB$SYSTEM_FLAG EQ 0 OR IX.RDB$SYSTEM_FLAG MISSING) SORTED BY IX.RDB$INDEX_NAME - show_comment("INDEX", IX.RDB$INDEX_NAME, 0, &IX.RDB$DESCRIPTION, + show_comment("INDEX", NULL, IX.RDB$INDEX_NAME, NULL, &IX.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR @@ -2960,7 +2996,7 @@ AND (RO.RDB$SYSTEM_FLAG EQ 0 OR RO.RDB$SYSTEM_FLAG MISSING) SORTED BY RO.RDB$ROLE_NAME - show_comment("ROLE", RO.RDB$ROLE_NAME, 0, &RO.RDB$DESCRIPTION, + show_comment("ROLE", NULL, RO.RDB$ROLE_NAME, NULL, &RO.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR @@ -2977,7 +3013,7 @@ AND (PACK.RDB$SYSTEM_FLAG EQ 0 OR PACK.RDB$SYSTEM_FLAG MISSING) SORTED BY PACK.RDB$PACKAGE_NAME - show_comment("PACKAGE", PACK.RDB$PACKAGE_NAME, 0, &PACK.RDB$DESCRIPTION, + show_comment("PACKAGE", NULL, PACK.RDB$PACKAGE_NAME, NULL, &PACK.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR @@ -2992,7 +3028,7 @@ AND (CH.RDB$SYSTEM_FLAG EQ 0 OR CH.RDB$SYSTEM_FLAG MISSING) SORTED BY CH.RDB$CHARACTER_SET_NAME - show_comment("CHARACTER SET", CH.RDB$CHARACTER_SET_NAME, 0, + show_comment("CHARACTER SET", NULL, CH.RDB$CHARACTER_SET_NAME, NULL, &CH.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR @@ -3006,7 +3042,7 @@ AND (CL.RDB$SYSTEM_FLAG EQ 0 OR CL.RDB$SYSTEM_FLAG MISSING) SORTED BY CL.RDB$COLLATION_NAME - show_comment("COLLATION", CL.RDB$COLLATION_NAME, 0, &CL.RDB$DESCRIPTION, + show_comment("COLLATION", NULL, CL.RDB$COLLATION_NAME, NULL, &CL.RDB$DESCRIPTION, showextract, first ? banner : 0); first = false; END_FOR This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |