From: <asf...@us...> - 2011-11-09 15:30:12
|
Revision: 53620 http://firebird.svn.sourceforge.net/firebird/?rev=53620&view=rev Author: asfernandes Date: 2011-11-09 15:30:00 +0000 (Wed, 09 Nov 2011) Log Message: ----------- Apply CORE-3114 patch (Attempt to drop non-existing generator produces bad error) with some modifications. 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/DdlNodes.h firebird/trunk/src/dsql/ddl.cpp firebird/trunk/src/dsql/node.h firebird/trunk/src/dsql/parse.y firebird/trunk/src/dsql/pass1.cpp 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/dyn.epp firebird/trunk/src/jrd/dyn_del.epp firebird/trunk/src/jrd/dyn_dl_proto.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-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/lang_helpers/gds_codes.ftn 2011-11-09 15:30:00 UTC (rev 53620) @@ -2114,6 +2114,8 @@ PARAMETER (GDS__dsql_recreate_view_failed = 336397301) INTEGER*4 GDS__dsql_drop_view_failed PARAMETER (GDS__dsql_drop_view_failed = 336397302) + INTEGER*4 GDS__dsql_drop_sequence_failed + PARAMETER (GDS__dsql_drop_sequence_failed = 336397303) INTEGER*4 GDS__gsec_cant_open_db PARAMETER (GDS__gsec_cant_open_db = 336723983) INTEGER*4 GDS__gsec_switches_error Modified: firebird/trunk/lang_helpers/gds_codes.pas =================================================================== --- firebird/trunk/lang_helpers/gds_codes.pas 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/lang_helpers/gds_codes.pas 2011-11-09 15:30:00 UTC (rev 53620) @@ -1064,6 +1064,7 @@ gds_dsql_create_alter_view_failed = 336397300; gds_dsql_recreate_view_failed = 336397301; gds_dsql_drop_view_failed = 336397302; + gds_dsql_drop_sequence_failed = 336397303; gds_gsec_cant_open_db = 336723983; gds_gsec_switches_error = 336723984; gds_gsec_no_op_spec = 336723985; Modified: firebird/trunk/src/dsql/DdlNodes.epp =================================================================== --- firebird/trunk/src/dsql/DdlNodes.epp 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/dsql/DdlNodes.epp 2011-11-09 15:30:00 UTC (rev 53620) @@ -4716,26 +4716,59 @@ //---------------------- +void DropSequenceNode::print(string& text, Array<dsql_nod*>& nodes) const +{ + text.printf( + "DropSequenceNode\n" + " name: %s\n", + name.c_str()); +} -// Delete a record from RDB$GENERATORS. Return true if succeeded. -bool DropSequenceNode::deleteGenerator(thread_db* tdbb, jrd_tra* transaction, const MetaName& name) +void DropSequenceNode::execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction) { - AutoCacheRequest request(tdbb, drq_e_ident_gens, DYN_REQUESTS); + AutoCacheRequest request(tdbb, drq_e_gens, DYN_REQUESTS); bool found = false; FOR (REQUEST_HANDLE request TRANSACTION_HANDLE transaction) GEN IN RDB$GENERATORS WITH GEN.RDB$GENERATOR_NAME EQ name.c_str() { + if (!GEN.RDB$SYSTEM_FLAG.NULL && GEN.RDB$SYSTEM_FLAG != 0) + { + // msg 272: "Cannot delete system generator @1" + status_exception::raise(Arg::Gds(ENCODE_ISC_MSG(272, DYN_MSG_FAC)) << name); + } + + executeDdlTrigger(tdbb, dsqlScratch, transaction, DTW_BEFORE, + DDL_TRIGGER_DROP_SEQUENCE, name); + ERASE GEN; found = true; } END_FOR - return found; + if (found) + executeDdlTrigger(tdbb, dsqlScratch, transaction, DTW_AFTER, DDL_TRIGGER_DROP_SEQUENCE, name); + else + status_exception::raise(Arg::Gds(isc_gennotdef) << Arg::Str(name)); } +// Delete a record from RDB$GENERATORS, without verifying RDB$SYSTEM_FLAG. +void DropSequenceNode::deleteIdentity(thread_db* tdbb, jrd_tra* transaction, const MetaName& name) +{ + AutoCacheRequest request(tdbb, drq_e_ident_gens, DYN_REQUESTS); + + FOR (REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + GEN IN RDB$GENERATORS + WITH GEN.RDB$GENERATOR_NAME EQ name.c_str() + { + ERASE GEN; + } + END_FOR +} + + //---------------------- @@ -5036,7 +5069,7 @@ RFR.RDB$RELATION_NAME EQ relationName.c_str() { if (!RFR.RDB$GENERATOR_NAME.NULL) - DropSequenceNode::deleteGenerator(tdbb, transaction, RFR.RDB$GENERATOR_NAME); + DropSequenceNode::deleteIdentity(tdbb, transaction, RFR.RDB$GENERATOR_NAME); ERASE RFR; @@ -7230,7 +7263,7 @@ WITH RFR.RDB$RELATION_NAME EQ name.c_str() { if (!RFR.RDB$GENERATOR_NAME.NULL) - DropSequenceNode::deleteGenerator(tdbb, transaction, RFR.RDB$GENERATOR_NAME); + DropSequenceNode::deleteIdentity(tdbb, transaction, RFR.RDB$GENERATOR_NAME); ERASE RFR; Modified: firebird/trunk/src/dsql/DdlNodes.h =================================================================== --- firebird/trunk/src/dsql/DdlNodes.h 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/dsql/DdlNodes.h 2011-11-09 15:30:00 UTC (rev 53620) @@ -893,11 +893,30 @@ }; -class DropSequenceNode +class DropSequenceNode : public DdlNode { public: - static bool deleteGenerator(thread_db* tdbb, jrd_tra* transaction, + DropSequenceNode(MemoryPool& pool, const Firebird::MetaName&aName) + : DdlNode(pool), + name(pool, aName) + { + } + + static void deleteIdentity(thread_db* tdbb, jrd_tra* transaction, const Firebird::MetaName& name); + +public: + virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const; + virtual void execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction); + +protected: + virtual void putErrorPrefix(Firebird::Arg::StatusVector& statusVector) + { + statusVector << Firebird::Arg::Gds(isc_dsql_drop_sequence_failed) << name; + } + +private: + Firebird::MetaName name; }; Modified: firebird/trunk/src/dsql/ddl.cpp =================================================================== --- firebird/trunk/src/dsql/ddl.cpp 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/dsql/ddl.cpp 2011-11-09 15:30:00 UTC (rev 53620) @@ -1041,12 +1041,6 @@ define_filter(dsqlScratch); break; - case nod_del_generator: - string = (dsql_str*) node->nod_arg[0]; - dsqlScratch->appendNullString(isc_dyn_delete_generator, string->str_data); - dsqlScratch->appendUChar(isc_dyn_end); - break; - case nod_del_filter: string = (dsql_str*) node->nod_arg[0]; dsqlScratch->appendNullString(isc_dyn_delete_filter, string->str_data); Modified: firebird/trunk/src/dsql/node.h =================================================================== --- firebird/trunk/src/dsql/node.h 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/dsql/node.h 2011-11-09 15:30:00 UTC (rev 53620) @@ -69,7 +69,6 @@ nod_def_index, nod_del_index, nod_def_constraint, - nod_del_generator, nod_def_filter, nod_del_filter, nod_def_shadow, Modified: firebird/trunk/src/dsql/parse.y =================================================================== --- firebird/trunk/src/dsql/parse.y 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/dsql/parse.y 2011-11-09 15:30:00 UTC (rev 53620) @@ -3528,9 +3528,9 @@ | ROLE symbol_role_name { $$ = make_node (nod_del_role, (int) 1, $2); } | GENERATOR symbol_generator_name - { $$ = make_node (nod_del_generator, (int) 1, $2); } + { $$ = makeClassNode(FB_NEW(getPool()) DropSequenceNode(getPool(), toName($2))); } | SEQUENCE symbol_generator_name - { $$ = make_node (nod_del_generator, (int) 1, $2); } + { $$ = makeClassNode(FB_NEW(getPool()) DropSequenceNode(getPool(), toName($2))); } | COLLATION symbol_collation_name { $$ = makeClassNode(newNode<DropCollationNode>(toName($2))); } | USER drop_user_clause Modified: firebird/trunk/src/dsql/pass1.cpp =================================================================== --- firebird/trunk/src/dsql/pass1.cpp 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/dsql/pass1.cpp 2011-11-09 15:30:00 UTC (rev 53620) @@ -902,7 +902,6 @@ case nod_grant: case nod_revoke: case nod_mod_database: - case nod_del_generator: case nod_def_role: case nod_del_role: case nod_def_filter: @@ -4777,9 +4776,6 @@ case nod_del_filter: verb = "delete filter"; break; - case nod_del_generator: - verb = "delete generator"; - break; case nod_del_index: verb = "delete index"; break; Modified: firebird/trunk/src/include/gen/codetext.h =================================================================== --- firebird/trunk/src/include/gen/codetext.h 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/include/gen/codetext.h 2011-11-09 15:30:00 UTC (rev 53620) @@ -1053,6 +1053,7 @@ {"dsql_create_alter_view_failed", 336397300}, {"dsql_recreate_view_failed", 336397301}, {"dsql_drop_view_failed", 336397302}, + {"dsql_drop_sequence_failed", 336397303}, {"gsec_cant_open_db", 336723983}, {"gsec_switches_error", 336723984}, {"gsec_no_op_spec", 336723985}, Modified: firebird/trunk/src/include/gen/iberror.h =================================================================== --- firebird/trunk/src/include/gen/iberror.h 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/include/gen/iberror.h 2011-11-09 15:30:00 UTC (rev 53620) @@ -1087,6 +1087,7 @@ const ISC_STATUS isc_dsql_create_alter_view_failed = 336397300L; const ISC_STATUS isc_dsql_recreate_view_failed = 336397301L; const ISC_STATUS isc_dsql_drop_view_failed = 336397302L; +const ISC_STATUS isc_dsql_drop_sequence_failed = 336397303L; const ISC_STATUS isc_gsec_cant_open_db = 336723983L; const ISC_STATUS isc_gsec_switches_error = 336723984L; const ISC_STATUS isc_gsec_no_op_spec = 336723985L; @@ -1188,7 +1189,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 = 1132; +const ISC_STATUS isc_err_max = 1133; #else /* c definitions */ @@ -2245,6 +2246,7 @@ #define isc_dsql_create_alter_view_failed 336397300L #define isc_dsql_recreate_view_failed 336397301L #define isc_dsql_drop_view_failed 336397302L +#define isc_dsql_drop_sequence_failed 336397303L #define isc_gsec_cant_open_db 336723983L #define isc_gsec_switches_error 336723984L #define isc_gsec_no_op_spec 336723985L @@ -2346,7 +2348,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 1132 +#define isc_err_max 1133 #endif Modified: firebird/trunk/src/include/gen/msgs.h =================================================================== --- firebird/trunk/src/include/gen/msgs.h 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/include/gen/msgs.h 2011-11-09 15:30:00 UTC (rev 53620) @@ -1056,6 +1056,7 @@ {336397300, "CREATE OR ALTER VIEW @1 failed"}, /* dsql_create_alter_view_failed */ {336397301, "RECREATE VIEW @1 failed"}, /* dsql_recreate_view_failed */ {336397302, "DROP VIEW @1 failed"}, /* dsql_drop_view_failed */ + {336397303, "DROP SEQUENCE @1 failed"}, /* dsql_drop_sequence_failed */ {336723983, "unable to open database"}, /* gsec_cant_open_db */ {336723984, "error in switch specifications"}, /* gsec_switches_error */ {336723985, "no operation specified"}, /* gsec_no_op_spec */ Modified: firebird/trunk/src/include/gen/sql_code.h =================================================================== --- firebird/trunk/src/include/gen/sql_code.h 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/include/gen/sql_code.h 2011-11-09 15:30:00 UTC (rev 53620) @@ -1052,6 +1052,7 @@ {336397300, -901}, /* 1012 dsql_create_alter_view_failed */ {336397301, -901}, /* 1013 dsql_recreate_view_failed */ {336397302, -901}, /* 1014 dsql_drop_view_failed */ + {336397303, -901}, /* 1015 dsql_drop_sequence_failed */ {336723983, -901}, /* 15 gsec_cant_open_db */ {336723984, -901}, /* 16 gsec_switches_error */ {336723985, -901}, /* 17 gsec_no_op_spec */ Modified: firebird/trunk/src/include/gen/sql_state.h =================================================================== --- firebird/trunk/src/include/gen/sql_state.h 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/include/gen/sql_state.h 2011-11-09 15:30:00 UTC (rev 53620) @@ -1052,6 +1052,7 @@ {336397300, "42000"}, // 1012 dsql_create_alter_view_failed {336397301, "42000"}, // 1013 dsql_recreate_view_failed {336397302, "42000"}, // 1014 dsql_drop_view_failed + {336397303, "42000"}, // 1015 dsql_drop_sequence_failed {336723983, "00000"}, // 15 gsec_cant_open_db {336723984, "00000"}, // 16 gsec_switches_error {336723985, "00000"}, // 17 gsec_no_op_spec Modified: firebird/trunk/src/jrd/dyn.epp =================================================================== --- firebird/trunk/src/jrd/dyn.epp 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/jrd/dyn.epp 2011-11-09 15:30:00 UTC (rev 53620) @@ -392,10 +392,6 @@ DYN_modify_function(gbl, ptr); break; - case isc_dyn_delete_generator: - DYN_delete_generator(gbl, ptr); - break; - case isc_dyn_def_sql_role: DYN_define_role(gbl, ptr); break; Modified: firebird/trunk/src/jrd/dyn_del.epp =================================================================== --- firebird/trunk/src/jrd/dyn_del.epp 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/jrd/dyn_del.epp 2011-11-09 15:30:00 UTC (rev 53620) @@ -121,67 +121,6 @@ } -void DYN_delete_generator(Global* gbl, const UCHAR**ptr) -{ -/************************************** - * - * D Y N _ d e l e t e _ g e n e r a t o r - * - ************************************** - * - * Functional description - * Execute a dynamic ddl statement that - * deletes a generator from rdb$generator but the - * space allocated in the page won't be released. - * - **************************************/ - thread_db* tdbb = JRD_get_thread_data(); - - bool found = false; - Firebird::MetaName t; - GET_STRING(ptr, t); - - try - { - AutoCacheRequest request(tdbb, drq_e_gens, DYN_REQUESTS); - - found = false; - FOR (REQUEST_HANDLE request TRANSACTION_HANDLE gbl->gbl_transaction) - X IN RDB$GENERATORS - WITH X.RDB$GENERATOR_NAME EQ t.c_str() - { - if (X.RDB$SYSTEM_FLAG != 0) - DYN_error_punt(false, 272); // msg 272: "Cannot delete system generator" - - found = true; - - DdlNode::executeDdlTrigger(tdbb, gbl->gbl_transaction, DdlNode::DTW_BEFORE, - DDL_TRIGGER_DROP_SEQUENCE, t, gbl->sqlText); - - ERASE X; - } - END_FOR - } - catch (const Firebird::Exception& ex) - { - Firebird::stuff_exception(tdbb->tdbb_status_vector, ex); - DYN_error_punt(true, 213); - // msg 213: "ERASE GENERATOR failed" - } - - if (found) - { - DdlNode::executeDdlTrigger(tdbb, gbl->gbl_transaction, DdlNode::DTW_AFTER, - DDL_TRIGGER_DROP_SEQUENCE, t, gbl->sqlText); - } - else - { - DYN_error_punt(false, 214, t.c_str()); - // msg 214: "Generator %s not found" - } -} - - void DYN_delete_index( Global* gbl, const UCHAR** ptr) { /************************************** Modified: firebird/trunk/src/jrd/dyn_dl_proto.h =================================================================== --- firebird/trunk/src/jrd/dyn_dl_proto.h 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/jrd/dyn_dl_proto.h 2011-11-09 15:30:00 UTC (rev 53620) @@ -25,7 +25,6 @@ #define JRD_DYN_DL_PROTO_H void DYN_delete_filter(Jrd::Global*, const UCHAR**); -void DYN_delete_generator(Jrd::Global*, const UCHAR**); void DYN_delete_index(Jrd::Global*, const UCHAR**); void DYN_delete_role(Jrd::Global*, const UCHAR**); void DYN_delete_shadow(Jrd::Global*, const UCHAR**); Modified: firebird/trunk/src/msgs/facilities2.sql =================================================================== --- firebird/trunk/src/msgs/facilities2.sql 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/msgs/facilities2.sql 2011-11-09 15:30:00 UTC (rev 53620) @@ -20,7 +20,7 @@ ('1996-11-07 13:39:40', 'INSTALL', 10, 1) ('1996-11-07 13:38:41', 'TEST', 11, 4) ('2011-06-01 12:57:44', 'GBAK', 12, 351) -('2010-08-01 13:05:00', 'SQLERR', 13, 1015) +('2010-08-01 13:05:00', 'SQLERR', 13, 1016) ('1996-11-07 13:38:42', 'SQLWARN', 14, 613) ('2006-09-10 03:04:31', 'JRD_BUGCHK', 15, 307) -- Modified: firebird/trunk/src/msgs/messages2.sql =================================================================== --- firebird/trunk/src/msgs/messages2.sql 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/msgs/messages2.sql 2011-11-09 15:30:00 UTC (rev 53620) @@ -1846,7 +1846,7 @@ ('dyn_package_body_exists', NULL, 'DdlNodes.epp/PackageNodes.epp', NULL, 8, 269, NULL, 'Package body @1 already exists', NULL, NULL); ('dyn_invalid_ddl_func', 'CreateAlterFunctionNode::compile', 'DdlNodes.epp', NULL, 8, 270, NULL, 'Invalid DDL statement for function @1', NULL, NULL); ('dyn_newfc_oldsyntax', 'DYN_modify_function', 'dyn_mod.epp', NULL, 8, 271, NULL, 'Cannot alter new style function @1 with ALTER EXTERNAL FUNCTION. Use ALTER FUNCTION instead.', NULL, NULL); -(NULL, 'DYN_delete_generator', 'dyn_del.epp', NULL, 8, 272, NULL, 'Cannot delete system generator', NULL, NULL); +(NULL, 'DYN_delete_generator', 'dyn_del.epp', NULL, 8, 272, NULL, 'Cannot delete system generator @1', NULL, NULL); (NULL, 'DYN_define_sql_field', 'dyn_def.epp', NULL, 8, 273, NULL, 'Identity column @1 of table @2 must be of exact number type with zero scale', NULL, NULL); (NULL, 'DYN_modify_local_field', 'dyn_mod.epp', NULL, 8, 274, NULL, 'Identity column @1 of table @2 cannot be changed to NULLable', NULL, NULL); (NULL, 'DYN_modify_sql_field', 'dyn_mod.epp', NULL, 8, 275, NULL, 'Identity column @1 of table @2 cannot have default value', NULL, NULL); @@ -2482,6 +2482,7 @@ ('dsql_create_alter_view_failed', 'getMainErrorCode', 'DdlNodes.h', NULL, 13, 1012, NULL, 'CREATE OR ALTER VIEW @1 failed', NULL, NULL); ('dsql_recreate_view_failed', 'getMainErrorCode', 'DdlNodes.h', NULL, 13, 1013, NULL, 'RECREATE VIEW @1 failed', NULL, NULL); ('dsql_drop_view_failed', 'getMainErrorCode', 'DdlNodes.h', NULL, 13, 1014, NULL, 'DROP VIEW @1 failed', NULL, NULL); +('dsql_drop_sequence_failed', 'getMainErrorCode', 'DdlNodes.h', NULL, 13, 1015, NULL, 'DROP SEQUENCE @1 failed', NULL, NULL); -- SQLWARN (NULL, NULL, NULL, NULL, 14, 100, NULL, 'Row not found for fetch, update or delete, or the result of a query is an empty table.', NULL, NULL); (NULL, NULL, NULL, NULL, 14, 101, NULL, 'segment buffer length shorter than expected', NULL, NULL); Modified: firebird/trunk/src/msgs/system_errors2.sql =================================================================== --- firebird/trunk/src/msgs/system_errors2.sql 2011-11-09 13:31:27 UTC (rev 53619) +++ firebird/trunk/src/msgs/system_errors2.sql 2011-11-09 15:30:00 UTC (rev 53620) @@ -1045,6 +1045,7 @@ (-901, '42', '000', 13, 1012, 'dsql_create_alter_view_failed', NULL, NULL); (-901, '42', '000', 13, 1013, 'dsql_recreate_view_failed', NULL, NULL); (-901, '42', '000', 13, 1014, 'dsql_drop_view_failed', NULL, NULL); +(-901, '42', '000', 13, 1015, 'dsql_drop_sequence_failed', NULL, NULL); -- GSEC (-901, '00', '000', 18, 15, 'gsec_cant_open_db', NULL, NULL) (-901, '00', '000', 18, 16, 'gsec_switches_error', NULL, NULL) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |