From: <ro...@us...> - 2014-04-04 06:39:13
|
Revision: 59351 http://sourceforge.net/p/firebird/code/59351 Author: robocop Date: 2014-04-04 06:39:09 +0000 (Fri, 04 Apr 2014) Log Message: ----------- The 0th generator becomes unnamed. Only internal requests can access it (zero length names are not allowed from outside). RDB$GENERATORS is no longer a reserved name.System generators cannot be changed by user requests, but can be queried with gen_id(g, 0) if the permissions (ACL) allow that. We don't track dependencies on sys generators, it's not necessary. 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/ExprNodes.cpp firebird/trunk/src/dsql/ExprNodes.h firebird/trunk/src/dsql/StmtNodes.cpp firebird/trunk/src/dsql/StmtNodes.h 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/Attachment.h firebird/trunk/src/jrd/constants.h firebird/trunk/src/jrd/dfw.epp firebird/trunk/src/jrd/ini.epp firebird/trunk/src/jrd/jrd.cpp firebird/trunk/src/jrd/met.epp firebird/trunk/src/jrd/met_proto.h firebird/trunk/src/jrd/vio.cpp 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 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/lang_helpers/gds_codes.ftn 2014-04-04 06:39:09 UTC (rev 59351) @@ -1562,6 +1562,8 @@ PARAMETER (GDS__forupdate_systbl = 335545074) INTEGER*4 GDS__forupdate_temptbl PARAMETER (GDS__forupdate_temptbl = 335545075) + INTEGER*4 GDS__cant_modify_sysobj + PARAMETER (GDS__cant_modify_sysobj = 335545076) INTEGER*4 GDS__gfix_db_name PARAMETER (GDS__gfix_db_name = 335740929) INTEGER*4 GDS__gfix_invalid_sw @@ -1822,6 +1824,8 @@ PARAMETER (GDS__dyn_alter_user_no_clause = 336068891) INTEGER*4 GDS__dyn_duplicate_package_item PARAMETER (GDS__dyn_duplicate_package_item = 336068894) + INTEGER*4 GDS__dyn_cant_modify_sysobj + PARAMETER (GDS__dyn_cant_modify_sysobj = 336068895) 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 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/lang_helpers/gds_codes.pas 2014-04-04 06:39:09 UTC (rev 59351) @@ -788,6 +788,7 @@ gds_forupdate_virtualtbl = 335545073; gds_forupdate_systbl = 335545074; gds_forupdate_temptbl = 335545075; + gds_cant_modify_sysobj = 335545076; gds_gfix_db_name = 335740929; gds_gfix_invalid_sw = 335740930; gds_gfix_incmp_sw = 335740932; @@ -918,6 +919,7 @@ gds_dyn_domain_used_function = 336068890; gds_dyn_alter_user_no_clause = 336068891; gds_dyn_duplicate_package_item = 336068894; + gds_dyn_cant_modify_sysobj = 336068895; 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 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/dsql/DdlNodes.epp 2014-04-04 06:39:09 UTC (rev 59351) @@ -4881,6 +4881,8 @@ bool CreateAlterSequenceNode::executeAlter(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction) { + bool forbidden = false; + if (legacy) { // The only need for this code is that for the sake of backward compatibility @@ -4889,10 +4891,13 @@ // that the generator created in another transaction can be found here. This is done // using MET_lookup_generator() which works in the system transaction. - const SLONG id = MET_lookup_generator(tdbb, name); + const SLONG id = MET_lookup_generator(tdbb, name, &forbidden); if (id < 0) return false; + if (forbidden) + status_exception::raise(Arg::Gds(isc_dyn_cant_modify_sysobj) << "generator" << Arg::Str(name)); + executeDdlTrigger(tdbb, dsqlScratch, transaction, DTW_BEFORE, DDL_TRIGGER_ALTER_SEQUENCE, name); fb_assert(value.specified); @@ -4918,6 +4923,12 @@ { executeDdlTrigger(tdbb, dsqlScratch, transaction, DTW_BEFORE, DDL_TRIGGER_ALTER_SEQUENCE, name); + if (!X.RDB$SYSTEM_FLAG.NULL && X.RDB$SYSTEM_FLAG == 1) + { + forbidden = true; + break; + } + const SLONG id = X.RDB$GENERATOR_ID; const SINT64 val = value.specified ? value.value : (!X.RDB$INITIAL_VALUE.NULL ? X.RDB$INITIAL_VALUE : 0); @@ -4933,6 +4944,9 @@ } END_FOR + if (forbidden) + status_exception::raise(Arg::Gds(isc_dyn_cant_modify_sysobj) << "generator" << Arg::Str(name)); + return found; } @@ -4952,7 +4966,7 @@ { try { - SINT64 id = DYN_UTIL_gen_unique_id(tdbb, drq_g_nxt_gen_id, "RDB$GENERATORS"); + SINT64 id = DYN_UTIL_gen_unique_id(tdbb, drq_g_nxt_gen_id, MASTER_GENERATOR); id %= MAX_SSHORT + 1; if (id == 0) Modified: firebird/trunk/src/dsql/ExprNodes.cpp =================================================================== --- firebird/trunk/src/dsql/ExprNodes.cpp 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/dsql/ExprNodes.cpp 2014-04-04 06:39:09 UTC (rev 59351) @@ -5615,7 +5615,8 @@ : TypedNode<ValueExprNode, ExprNode::TYPE_GEN_ID>(pool), dialect1(aDialect1), generator(pool, name), - arg(aArg) + arg(aArg), + sysGen(false) { addChildNode(arg, arg); } @@ -5628,7 +5629,16 @@ GenIdNode* const node = FB_NEW(pool) GenIdNode(pool, (csb->blrVersion == 4), name, PAR_parse_value(tdbb, csb)); - if (!MET_load_generator(tdbb, node->generator)) + // This check seems faster than ==, but assumes the special generator is named "" + if (name.length() == 0) //(name == MASTER_GENERATOR) + { + fb_assert(!MASTER_GENERATOR[0]); + if (!(csb->csb_g_flags & csb_internal)) + PAR_error(csb, Arg::Gds(isc_gennotdef) << Arg::Str(name)); + + node->generator.id = 0; + } + else if (!MET_load_generator(tdbb, node->generator, &node->sysGen)) PAR_error(csb, Arg::Gds(isc_gennotdef) << Arg::Str(name)); if (csb->csb_g_flags & csb_get_dependencies) @@ -5652,6 +5662,7 @@ GenIdNode* const node = FB_NEW(getPool()) GenIdNode(getPool(), dialect1, generator.name, doDsqlPass(dsqlScratch, arg)); node->generator = generator; + node->sysGen = sysGen; return node; } @@ -5699,6 +5710,7 @@ GenIdNode* const node = FB_NEW(*tdbb->getDefaultPool()) GenIdNode( *tdbb->getDefaultPool(), dialect1, generator.name, copier.copy(tdbb, arg)); node->generator = generator; + node->sysGen = sysGen; return node; } @@ -5755,8 +5767,19 @@ if (request->req_flags & req_null) return NULL; - const SINT64 new_val = DPM_gen_id(tdbb, generator.id, false, MOV_get_int64(value, 0)); + const SINT64 change = MOV_get_int64(value, 0); + if (sysGen && change != 0) + { + const ULONG aflags = ATT_gbak_attachment | ATT_creator; + if (!request->hasInternalStatement() && + (tdbb->getAttachment()->att_flags & aflags) != aflags) + { + status_exception::raise(Arg::Gds(isc_cant_modify_sysobj) << "generator" << generator.name); + } + } + const SINT64 new_val = DPM_gen_id(tdbb, generator.id, false, change); + if (dialect1) impure->make_long((SLONG) new_val); else Modified: firebird/trunk/src/dsql/ExprNodes.h =================================================================== --- firebird/trunk/src/dsql/ExprNodes.h 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/dsql/ExprNodes.h 2014-04-04 06:39:09 UTC (rev 59351) @@ -679,6 +679,8 @@ bool dialect1; GeneratorItem generator; NestConst<ValueExprNode> arg; +private: + bool sysGen; }; Modified: firebird/trunk/src/dsql/StmtNodes.cpp =================================================================== --- firebird/trunk/src/dsql/StmtNodes.cpp 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/dsql/StmtNodes.cpp 2014-04-04 06:39:09 UTC (rev 59351) @@ -6513,9 +6513,13 @@ GenIdNode* const genNode = FB_NEW(csb->csb_pool) GenIdNode(csb->csb_pool, (csb->blrVersion == 4), generatorName, literal); - if (!MET_load_generator(tdbb, genNode->generator)) + bool sysGen = false; + if (!MET_load_generator(tdbb, genNode->generator, &sysGen)) PAR_error(csb, Arg::Gds(isc_gennotdef) << Arg::Str(generatorName)); + if (sysGen) + PAR_error(csb, Arg::Gds(isc_cant_modify_sysobj) << "generator" << generatorName); + assign->asgnFrom = genNode; } else //if (value) @@ -7139,9 +7143,13 @@ SetGeneratorNode* const node = FB_NEW(pool) SetGeneratorNode(pool, name); - if (!MET_load_generator(tdbb, node->generator)) + bool sysGen = false; + if (!MET_load_generator(tdbb, node->generator, &sysGen)) PAR_error(csb, Arg::Gds(isc_gennotdef) << Arg::Str(name)); + if (sysGen) + PAR_error(csb, Arg::Gds(isc_cant_modify_sysobj) << "generator" << name); + node->value = PAR_parse_value(tdbb, csb); return node; Modified: firebird/trunk/src/dsql/StmtNodes.h =================================================================== --- firebird/trunk/src/dsql/StmtNodes.h 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/dsql/StmtNodes.h 2014-04-04 06:39:09 UTC (rev 59351) @@ -1321,7 +1321,7 @@ public: SetGeneratorNode(MemoryPool& pool, const Firebird::MetaName& name, ValueExprNode* aValue = NULL) : TypedNode<StmtNode, StmtNode::TYPE_SET_GENERATOR>(pool), - generator(pool, name), value(aValue) + generator(pool, name), value(aValue), sysGen(false) { } @@ -1343,6 +1343,9 @@ public: GeneratorItem generator; NestConst<ValueExprNode> value; + +private: + bool sysGen; }; Modified: firebird/trunk/src/include/gen/codetext.h =================================================================== --- firebird/trunk/src/include/gen/codetext.h 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/include/gen/codetext.h 2014-04-04 06:39:09 UTC (rev 59351) @@ -777,6 +777,7 @@ {"forupdate_virtualtbl", 335545073}, {"forupdate_systbl", 335545074}, {"forupdate_temptbl", 335545075}, + {"cant_modify_sysobj", 335545076}, {"gfix_db_name", 335740929}, {"gfix_invalid_sw", 335740930}, {"gfix_incmp_sw", 335740932}, @@ -907,6 +908,7 @@ {"dyn_domain_used_function", 336068890}, {"dyn_alter_user_no_clause", 336068891}, {"dyn_duplicate_package_item", 336068894}, + {"dyn_cant_modify_sysobj", 336068895}, {"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 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/include/gen/iberror.h 2014-04-04 06:39:09 UTC (rev 59351) @@ -811,6 +811,7 @@ const ISC_STATUS isc_forupdate_virtualtbl = 335545073L; const ISC_STATUS isc_forupdate_systbl = 335545074L; const ISC_STATUS isc_forupdate_temptbl = 335545075L; +const ISC_STATUS isc_cant_modify_sysobj = 335545076L; const ISC_STATUS isc_gfix_db_name = 335740929L; const ISC_STATUS isc_gfix_invalid_sw = 335740930L; const ISC_STATUS isc_gfix_incmp_sw = 335740932L; @@ -941,6 +942,7 @@ const ISC_STATUS isc_dyn_domain_used_function = 336068890L; const ISC_STATUS isc_dyn_alter_user_no_clause = 336068891L; const ISC_STATUS isc_dyn_duplicate_package_item = 336068894L; +const ISC_STATUS isc_dyn_cant_modify_sysobj = 336068895L; 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; @@ -1257,7 +1259,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 = 1201; +const ISC_STATUS isc_err_max = 1203; #else /* c definitions */ @@ -2038,6 +2040,7 @@ #define isc_forupdate_virtualtbl 335545073L #define isc_forupdate_systbl 335545074L #define isc_forupdate_temptbl 335545075L +#define isc_cant_modify_sysobj 335545076L #define isc_gfix_db_name 335740929L #define isc_gfix_invalid_sw 335740930L #define isc_gfix_incmp_sw 335740932L @@ -2168,6 +2171,7 @@ #define isc_dyn_domain_used_function 336068890L #define isc_dyn_alter_user_no_clause 336068891L #define isc_dyn_duplicate_package_item 336068894L +#define isc_dyn_cant_modify_sysobj 336068895L #define isc_gbak_unknown_switch 336330753L #define isc_gbak_page_size_missing 336330754L #define isc_gbak_page_size_toobig 336330755L @@ -2484,7 +2488,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 1201 +#define isc_err_max 1203 #endif Modified: firebird/trunk/src/include/gen/msgs.h =================================================================== --- firebird/trunk/src/include/gen/msgs.h 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/include/gen/msgs.h 2014-04-04 06:39:09 UTC (rev 59351) @@ -780,6 +780,7 @@ {335545073, "Cannot select virtual table @1 for update WITH LOCK"}, /* forupdate_virtualtbl */ {335545074, "Cannot select system table @1 for update WITH LOCK"}, /* forupdate_systbl */ {335545075, "Cannot select temporary table @1 for update WITH LOCK"}, /* forupdate_temptbl */ + {335545076, "System @1 @2 cannot be modified"}, /* cant_modify_sysobj */ {335740929, "data base file name (@1) already given"}, /* gfix_db_name */ {335740930, "invalid switch @1"}, /* gfix_invalid_sw */ {335740932, "incompatible switch combination"}, /* gfix_incmp_sw */ @@ -910,6 +911,7 @@ {336068890, "Domain @1 is used in function @2 (parameter name @3) and cannot be dropped"}, /* dyn_domain_used_function */ {336068891, "ALTER USER requires at least one clause to be specified"}, /* dyn_alter_user_no_clause */ {336068894, "Duplicate @1 @2"}, /* dyn_duplicate_package_item */ + {336068895, "System @1 @2 cannot be modified"}, /* dyn_cant_modify_sysobj */ {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 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/include/gen/sql_code.h 2014-04-04 06:39:09 UTC (rev 59351) @@ -776,6 +776,7 @@ {335545073, -901}, /* 753 forupdate_virtualtbl */ {335545074, -901}, /* 754 forupdate_systbl */ {335545075, -901}, /* 755 forupdate_temptbl */ + {335545076, -901}, /* 756 cant_modify_sysobj */ {335740929, -901}, /* 1 gfix_db_name */ {335740930, -901}, /* 2 gfix_invalid_sw */ {335740932, -901}, /* 4 gfix_incmp_sw */ @@ -906,6 +907,7 @@ {336068890, -901}, /* 282 dyn_domain_used_function */ {336068891, -901}, /* 283 dyn_alter_user_no_clause */ {336068894, -901}, /* 286 dyn_duplicate_package_item */ + {336068895, -901}, /* 287 dyn_cant_modify_sysobj */ {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 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/include/gen/sql_state.h 2014-04-04 06:39:09 UTC (rev 59351) @@ -776,6 +776,7 @@ {335545073, "HY000"}, // 753 forupdate_virtualtbl {335545074, "HY000"}, // 754 forupdate_systbl {335545075, "HY000"}, // 755 forupdate_temptbl + {335545076, "42000"}, // 756 cant_modify_sysobj {335740929, "00000"}, // 1 gfix_db_name {335740930, "00000"}, // 2 gfix_invalid_sw {335740932, "00000"}, // 4 gfix_incmp_sw @@ -906,6 +907,7 @@ {336068890, "HY000"}, // 282 dyn_domain_used_function {336068891, "42000"}, // 283 dyn_alter_user_no_clause {336068894, "42000"}, // 286 dyn_duplicate_package_item + {336068895, "42000"}, // 287 dyn_cant_modify_sysobj {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/Attachment.h =================================================================== --- firebird/trunk/src/jrd/Attachment.h 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/jrd/Attachment.h 2014-04-04 06:39:09 UTC (rev 59351) @@ -391,6 +391,7 @@ const ULONG ATT_async_manual_lock = 0x08000L; // Async mutex was locked manually const ULONG ATT_purge_started = 0x10000L; // Purge already started - avoid 2 purges at once const ULONG ATT_system = 0x20000L; // Special system attachment +const ULONG ATT_creator = 0x40000L; // This attachment created the DB. const ULONG ATT_NO_CLEANUP = (ATT_no_cleanup | ATT_notify_gc); Modified: firebird/trunk/src/jrd/constants.h =================================================================== --- firebird/trunk/src/jrd/constants.h 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/jrd/constants.h 2014-04-04 06:39:09 UTC (rev 59351) @@ -123,6 +123,10 @@ const char* const IMPLICIT_PK_PREFIX = "RDB$PRIMARY"; const int IMPLICIT_PK_PREFIX_LEN = 11; +// The invisible "id zero" generator. +const char* const MASTER_GENERATOR = ""; //Was "RDB$GENERATORS"; + + // Automatically created security classes for SQL objects. // Keep in sync with trig.h const char* const DEFAULT_CLASS = "SQL$DEFAULT"; Modified: firebird/trunk/src/jrd/dfw.epp =================================================================== --- firebird/trunk/src/jrd/dfw.epp 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/jrd/dfw.epp 2014-04-04 06:39:09 UTC (rev 59351) @@ -3573,6 +3573,10 @@ DPM_gen_id(tdbb, id, true, value); } } +#ifdef DEV_BUILD + else // This is a test only + status_exception::raise(Arg::Gds(isc_cant_modify_sysobj) << "generator" << work->dfw_name); +#endif } break; } Modified: firebird/trunk/src/jrd/ini.epp =================================================================== --- firebird/trunk/src/jrd/ini.epp 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/jrd/ini.epp 2014-04-04 06:39:09 UTC (rev 59351) @@ -398,8 +398,9 @@ for (const gen* generator = generators; generator->gen_name; generator++) store_generator(tdbb, generator, handle1, ownerName); + // Redundant, VIO_store does the job. // Adjust the value of the hidden generator RDB$GENERATORS - DPM_gen_id(tdbb, 0, true, FB_NELEM(generators) - 1); + //DPM_gen_id(tdbb, 0, true, FB_NELEM(generators) - 1); // store system-defined triggers Modified: firebird/trunk/src/jrd/jrd.cpp =================================================================== --- firebird/trunk/src/jrd/jrd.cpp 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/jrd/jrd.cpp 2014-04-04 06:39:09 UTC (rev 59351) @@ -950,7 +950,7 @@ Jrd::Attachment* attachment, Database* dbb); static JAttachment* init(thread_db*, const PathName&, const PathName&, RefPtr<Config>, bool, const DatabaseOptions&, RefMutexUnlock&, IPluginConfig*); -static JAttachment* create_attachment(const PathName&, Database*, const DatabaseOptions&); +static JAttachment* create_attachment(const PathName&, Database*, const DatabaseOptions&, bool newDb); static void prepare_tra(thread_db*, jrd_tra*, USHORT, const UCHAR*); static void start_transaction(thread_db* tdbb, bool transliterate, jrd_tra** tra_handle, Jrd::Attachment* attachment, unsigned int tpb_length, const UCHAR* tpb); @@ -5906,7 +5906,7 @@ fb_assert(!(dbb->dbb_flags & DBB_new)); tdbb->setDatabase(dbb); - jAtt = create_attachment(alias_name, dbb, options); + jAtt = create_attachment(alias_name, dbb, options, !attach_flag); if (dbb->dbb_linger_timer) dbb->dbb_linger_timer->reset(); @@ -5960,9 +5960,9 @@ dbbGuard.lock(SYNC_EXCLUSIVE); tdbb->setDatabase(dbb); - jAtt = create_attachment(alias_name, dbb, options); + jAtt = create_attachment(alias_name, dbb, options, !attach_flag); tdbb->setAttachment(jAtt->getHandle()); - } + } // end scope // provide context pool for the rest stuff Jrd::ContextPoolHolder context(tdbb, dbb->dbb_permanent); @@ -6003,7 +6003,8 @@ static JAttachment* create_attachment(const PathName& alias_name, Database* dbb, - const DatabaseOptions& options) + const DatabaseOptions& options, + bool newDb) { /************************************** * @@ -6045,6 +6046,8 @@ jAtt->addRef(); // See also REF_NO_INCR RefPtr in unwindAttach() attachment->att_interface = jAtt; jAtt->manualLock(attachment->att_flags); + if (newDb) + attachment->att_flags |= ATT_creator; return jAtt; } Modified: firebird/trunk/src/jrd/met.epp =================================================================== --- firebird/trunk/src/jrd/met.epp 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/jrd/met.epp 2014-04-04 06:39:09 UTC (rev 59351) @@ -2271,7 +2271,7 @@ } -bool MET_load_generator(thread_db* tdbb, GeneratorItem& item) +bool MET_load_generator(thread_db* tdbb, GeneratorItem& item, bool* sysGen) { /************************************** * @@ -2286,9 +2286,11 @@ SET_TDBB(tdbb); Attachment* attachment = tdbb->getAttachment(); - if (item.name == "RDB$GENERATORS") + if (item.name == MASTER_GENERATOR) { item.id = 0; + if (sysGen) + *sysGen = true; return true; } @@ -2299,6 +2301,8 @@ { item.id = X.RDB$GENERATOR_ID; item.secName = X.RDB$SECURITY_CLASS; + if (sysGen) + *sysGen = (!X.RDB$SYSTEM_FLAG.NULL && X.RDB$SYSTEM_FLAG == 1); return true; } END_FOR @@ -2306,7 +2310,7 @@ return false; } -SLONG MET_lookup_generator(thread_db* tdbb, const MetaName& name) +SLONG MET_lookup_generator(thread_db* tdbb, const MetaName& name, bool* sysGen) { /************************************** * @@ -2321,14 +2325,21 @@ SET_TDBB(tdbb); Attachment* attachment = tdbb->getAttachment(); - if (name == "RDB$GENERATORS") + if (name == MASTER_GENERATOR) + { + if (sysGen) + *sysGen = true; return 0; + } AutoCacheRequest request(tdbb, irq_l_gen_id, IRQ_REQUESTS); FOR(REQUEST_HANDLE request) X IN RDB$GENERATORS WITH X.RDB$GENERATOR_NAME EQ name.c_str() { + if (sysGen) + *sysGen = (!X.RDB$SYSTEM_FLAG.NULL && X.RDB$SYSTEM_FLAG == 1); + return X.RDB$GENERATOR_ID; } END_FOR @@ -2336,7 +2347,7 @@ return -1; } -void MET_lookup_generator_id(thread_db* tdbb, SLONG gen_id, MetaName& name) +bool MET_lookup_generator_id(thread_db* tdbb, SLONG gen_id, MetaName& name, bool* sysGen) { /************************************** * @@ -2352,11 +2363,7 @@ SET_TDBB (tdbb); Attachment* attachment = tdbb->getAttachment(); - if (!gen_id) - { - name = "RDB$GENERATORS"; - return; - } + fb_assert(gen_id != 0); name = ""; @@ -2365,9 +2372,14 @@ FOR (REQUEST_HANDLE request) X IN RDB$GENERATORS WITH X.RDB$GENERATOR_ID EQ gen_id { + if (sysGen) + *sysGen = (!X.RDB$SYSTEM_FLAG.NULL && X.RDB$SYSTEM_FLAG == 1); + name = X.RDB$GENERATOR_NAME; } END_FOR + + return name.length() != 0; } void MET_lookup_index(thread_db* tdbb, @@ -5012,11 +5024,14 @@ case obj_field: dpdo_name = dependency.name; break; - // CVC: Here I'm going to track those pesky things named generators and UDFs. case obj_generator: { + // CVC: Here I'm going to track those pesky things named generators and UDFs. + // But don't track sys gens. + bool sysGen = false; const SLONG number = dependency.number; - MET_lookup_generator_id (tdbb, number, name); + if (number == 0 || !MET_lookup_generator_id(tdbb, number, name, &sysGen) || sysGen) + continue; dpdo_name = &name; } break; Modified: firebird/trunk/src/jrd/met_proto.h =================================================================== --- firebird/trunk/src/jrd/met_proto.h 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/jrd/met_proto.h 2014-04-04 06:39:09 UTC (rev 59351) @@ -91,9 +91,9 @@ void MET_lookup_exception(Jrd::thread_db*, SLONG, /* OUT */ Firebird::MetaName&, /* OUT */ Firebird::string*); int MET_lookup_field(Jrd::thread_db*, Jrd::jrd_rel*, const Firebird::MetaName&); Jrd::BlobFilter* MET_lookup_filter(Jrd::thread_db*, SSHORT, SSHORT); -bool MET_load_generator(Jrd::thread_db*, Jrd::GeneratorItem&); -SLONG MET_lookup_generator(Jrd::thread_db*, const Firebird::MetaName&); -void MET_lookup_generator_id(Jrd::thread_db*, SLONG, Firebird::MetaName&); +bool MET_load_generator(Jrd::thread_db*, Jrd::GeneratorItem&, bool* sysGen = 0); +SLONG MET_lookup_generator(Jrd::thread_db*, const Firebird::MetaName&, bool* sysGen = 0); +bool MET_lookup_generator_id(Jrd::thread_db*, SLONG, Firebird::MetaName&, bool* sysGen = 0); void MET_lookup_index(Jrd::thread_db*, Firebird::MetaName&, const Firebird::MetaName&, USHORT); SLONG MET_lookup_index_name(Jrd::thread_db*, const Firebird::MetaName&, SLONG*, SSHORT*); bool MET_lookup_partner(Jrd::thread_db*, Jrd::jrd_rel*, struct Jrd::index_desc*, const TEXT*); Modified: firebird/trunk/src/jrd/vio.cpp =================================================================== --- firebird/trunk/src/jrd/vio.cpp 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/jrd/vio.cpp 2014-04-04 06:39:09 UTC (rev 59351) @@ -3145,7 +3145,7 @@ EVL_field(0, rpb->rpb_record, f_gen_name, &desc); EVL_field(0, rpb->rpb_record, f_gen_id, &desc2); object_id = set_metadata_id(tdbb, rpb->rpb_record, - f_gen_id, drq_g_nxt_gen_id, "RDB$GENERATORS"); + f_gen_id, drq_g_nxt_gen_id, MASTER_GENERATOR); transaction->getGenIdCache()->put(object_id, 0); DFW_post_work(transaction, dfw_set_generator, &desc, object_id); set_system_flag(tdbb, rpb->rpb_record, f_gen_sys_flag); @@ -5323,7 +5323,7 @@ if (force_flag || (!(attachment->att_flags & ATT_gbak_attachment) && - !(request->getStatement()->flags & JrdStatement::FLAG_INTERNAL))) + !request->hasInternalStatement())) { fb_assert(relation->rel_flags & REL_scanned); Modified: firebird/trunk/src/msgs/facilities2.sql =================================================================== --- firebird/trunk/src/msgs/facilities2.sql 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/msgs/facilities2.sql 2014-04-04 06:39:09 UTC (rev 59351) @@ -1,12 +1,12 @@ /* MAX_NUMBER is the next number to be used, always one more than the highest message number. */ set bulk_insert INSERT INTO FACILITIES (LAST_CHANGE, FACILITY, FAC_CODE, MAX_NUMBER) VALUES (?, ?, ?, ?); -- -('2014-03-26 22:42:01', 'JRD', 0, 756) +('2014-03-31 20:48:34', 'JRD', 0, 757) ('2012-01-23 20:10:30', 'QLI', 1, 532) ('2013-11-13 15:59:10', 'GFIX', 3, 122) ('1996-11-07 13:39:40', 'GPRE', 4, 1) ('2012-08-27 21:26:00', 'DSQL', 7, 33) -('2014-03-26 12:27:00', 'DYN', 8, 287) +('2014-03-31 18:46:42', 'DYN', 8, 288) ('1996-11-07 13:39:40', 'INSTALL', 10, 1) ('1996-11-07 13:38:41', 'TEST', 11, 4) ('2014-03-03 19:17:14', 'GBAK', 12, 353) Modified: firebird/trunk/src/msgs/messages2.sql =================================================================== --- firebird/trunk/src/msgs/messages2.sql 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/msgs/messages2.sql 2014-04-04 06:39:09 UTC (rev 59351) @@ -863,6 +863,7 @@ ('forupdate_virtualtbl', 'PAR_rse', 'par.cpp', NULL, 0, 753, NULL, 'Cannot select virtual table @1 for update WITH LOCK', NULL, NULL) ('forupdate_systbl', 'PAR_rse', 'par.cpp', NULL, 0, 754, NULL, 'Cannot select system table @1 for update WITH LOCK', NULL, NULL) ('forupdate_temptbl', 'PAR_rse', 'par.cpp', NULL, 0, 755, NULL, 'Cannot select temporary table @1 for update WITH LOCK', NULL, NULL) +('cant_modify_sysobj', NULL, 'ExprNodes.cpp', NULL, 0, 756, NULL, 'System @1 @2 cannot be modified', NULL, 'Ex: System generator rdb$... cannot be modified') -- QLI (NULL, NULL, NULL, NULL, 1, 0, NULL, 'expected type', NULL, NULL); (NULL, NULL, NULL, NULL, 1, 1, NULL, 'bad block type', NULL, NULL); @@ -1911,6 +1912,7 @@ (NULL, 'DYN_delete_role', 'dyn_del.epp', NULL, 8, 284, NULL, 'Cannot delete system SQL role @1', NULL, NULL); (NULL, 'DdlNodes.epp', 'AlterRelationNode::modifyField', NULL, 8, 285, NULL, 'Column @1 is not an identity column', NULL, NULL); ('dyn_duplicate_package_item', NULL, 'PackageNodes.epp', NULL, 8, 286, NULL, 'Duplicate @1 @2', NULL, NULL); +('dyn_cant_modify_sysobj', NULL, 'DdlNodes.epp', NULL, 8, 287, NULL, 'System @1 @2 cannot be modified', NULL, 'Ex: System generator rdb$... cannot be modified'); 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 2014-04-03 12:33:08 UTC (rev 59350) +++ firebird/trunk/src/msgs/system_errors2.sql 2014-04-04 06:39:09 UTC (rev 59351) @@ -762,6 +762,7 @@ (-901, 'HY', '000', 0, 753, 'forupdate_virtualtbl', NULL, NULL) (-901, 'HY', '000', 0, 754, 'forupdate_systbl', NULL, NULL) (-901, 'HY', '000', 0, 755, 'forupdate_temptbl', NULL, NULL) +(-901, '42', '000', 0, 756, 'cant_modify_sysobj', NULL, NULL) -- GFIX (-901, '00', '000', 3, 1, 'gfix_db_name', NULL, NULL) (-901, '00', '000', 3, 2, 'gfix_invalid_sw', NULL, NULL) @@ -895,6 +896,7 @@ (-901, 'HY', '000', 8, 282, 'dyn_domain_used_function', NULL, NULL) (-901, '42', '000', 8, 283, 'dyn_alter_user_no_clause', NULL, NULL) (-901, '42', '000', 8, 286, 'dyn_duplicate_package_item', NULL, NULL) +(-901, '42', '000', 8, 287, 'dyn_cant_modify_sysobj', 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. |