From: <asf...@us...> - 2012-08-28 01:03:03
|
Revision: 57059 http://firebird.svn.sourceforge.net/firebird/?rev=57059&view=rev Author: asfernandes Date: 2012-08-28 01:02:56 +0000 (Tue, 28 Aug 2012) Log Message: ----------- Feature CORE-3291 - New pseudocolumn to get number of transaction that created this record version. Modified Paths: -------------- firebird/trunk/lang_helpers/gds_codes.ftn firebird/trunk/lang_helpers/gds_codes.pas firebird/trunk/src/dsql/ExprNodes.cpp firebird/trunk/src/dsql/ExprNodes.h firebird/trunk/src/dsql/dsql.h firebird/trunk/src/dsql/parse.y 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/blp.h firebird/trunk/src/jrd/blr.h firebird/trunk/src/jrd/constants.h firebird/trunk/src/msgs/facilities2.sql firebird/trunk/src/msgs/messages2.sql firebird/trunk/src/msgs/system_errors2.sql firebird/trunk/src/yvalve/keywords.cpp Modified: firebird/trunk/lang_helpers/gds_codes.ftn =================================================================== --- firebird/trunk/lang_helpers/gds_codes.ftn 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/lang_helpers/gds_codes.ftn 2012-08-28 01:02:56 UTC (rev 57059) @@ -1616,6 +1616,8 @@ PARAMETER (GDS__dsql_incompatible_trigger_type = 336003102) INTEGER*4 GDS__dsql_db_trigger_type_cant_change PARAMETER (GDS__dsql_db_trigger_type_cant_change = 336003103) + INTEGER*4 GDS__dsql_record_version_table + PARAMETER (GDS__dsql_record_version_table = 336003104) INTEGER*4 GDS__dyn_filter_not_found PARAMETER (GDS__dyn_filter_not_found = 336068645) INTEGER*4 GDS__dyn_func_not_found Modified: firebird/trunk/lang_helpers/gds_codes.pas =================================================================== --- firebird/trunk/lang_helpers/gds_codes.pas 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/lang_helpers/gds_codes.pas 2012-08-28 01:02:56 UTC (rev 57059) @@ -815,6 +815,7 @@ gds_upd_ins_with_complex_view = 336003101; gds_dsql_incompatible_trigger_type = 336003102; gds_dsql_db_trigger_type_cant_change = 336003103; + gds_dsql_record_version_table = 336003104; gds_dyn_filter_not_found = 336068645; gds_dyn_func_not_found = 336068649; gds_dyn_index_not_found = 336068656; Modified: firebird/trunk/src/dsql/ExprNodes.cpp =================================================================== --- firebird/trunk/src/dsql/ExprNodes.cpp 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/dsql/ExprNodes.cpp 2012-08-28 01:02:56 UTC (rev 57059) @@ -5684,7 +5684,8 @@ RecordKeyNode* recNode; if (!sub->is<FieldNode>() && - (!(recNode = sub->as<RecordKeyNode>()) || recNode->blrOp != blr_dbkey)) + (!(recNode = sub->as<RecordKeyNode>()) || + (recNode->blrOp != blr_dbkey && recNode->blrOp != blr_record_version2))) { ValueExprNodeStack stack; CMP_expand_view_nodes(tdbb, csb, stream, stack, blr_dbkey, true); @@ -6707,6 +6708,7 @@ const DsqlAliasNode* aliasNode; const LiteralNode* literalNode; const DerivedFieldNode* derivedField; + const RecordKeyNode* dbKeyNode; if ((aggNode = ExprNode::as<AggNode>(nestNode))) aggNode->setParameterName(parameter); @@ -6718,8 +6720,8 @@ } else if ((literalNode = ExprNode::as<LiteralNode>(nestNode))) literalNode->setParameterName(parameter); - else if (ExprNode::is<RecordKeyNode>(nestNode)) - nameAlias = DB_KEY_NAME; + else if ((dbKeyNode = ExprNode::as<RecordKeyNode>(nestNode))) + nameAlias = dbKeyNode->getAlias(false); else if ((derivedField = ExprNode::as<DerivedFieldNode>(nestNode))) { parameter->par_alias = derivedField->name; @@ -7836,6 +7838,7 @@ static RegisterNode<RecordKeyNode> regRecordKeyNodeDbKey(blr_dbkey); static RegisterNode<RecordKeyNode> regRecordKeyNodeRecordVersion(blr_record_version); +static RegisterNode<RecordKeyNode> regRecordKeyNodeRecordVersion2(blr_record_version2); RecordKeyNode::RecordKeyNode(MemoryPool& pool, UCHAR aBlrOp, const MetaName& aDsqlQualifier) : TypedNode<ValueExprNode, ExprNode::TYPE_RECORD_KEY>(pool), @@ -7845,7 +7848,7 @@ recStream(0), aggregate(false) { - fb_assert(blrOp == blr_dbkey || blrOp == blr_record_version); + fb_assert(blrOp == blr_dbkey || blrOp == blr_record_version || blrOp == blr_record_version2); addDsqlChildNode(dsqlRelation); } @@ -7865,7 +7868,10 @@ void RecordKeyNode::print(string& text) const { - text.printf("RecordKeyNode (%s)", (blrOp == blr_dbkey ? "dbkey" : "record_version")); + text.printf("RecordKeyNode (%s)", + (blrOp == blr_dbkey ? "dbkey" : + blrOp == blr_record_version2 ? "record_version2" : "record_version")); + ExprNode::print(text); } @@ -7893,15 +7899,12 @@ dsql_ctx* context = contexts.object(); if (!context->ctx_relation) - { - ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-607) << - Arg::Gds(isc_dsql_dbkey_from_non_table)); - } + raiseError(context); if (context->ctx_flags & CTX_null) return FB_NEW(*tdbb->getDefaultPool()) NullNode(*tdbb->getDefaultPool()); - PASS1_ambiguity_check(dsqlScratch, "RDB$DB_KEY", contexts); + PASS1_ambiguity_check(dsqlScratch, getAlias(true), contexts); RelationSourceNode* relNode = FB_NEW(getPool()) RelationSourceNode(getPool()); relNode->dsqlContext = context; @@ -7933,10 +7936,7 @@ } if (!context->ctx_relation) - { - ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-607) << - Arg::Gds(isc_dsql_dbkey_from_non_table)); - } + raiseError(context); if (context->ctx_flags & CTX_null) return FB_NEW(*tdbb->getDefaultPool()) NullNode(*tdbb->getDefaultPool()); @@ -7958,7 +7958,7 @@ } // Field unresolved. - PASS1_field_unknown((dsqlQualifier.hasData() ? dsqlQualifier.c_str() : NULL), DB_KEY_NAME, this); + PASS1_field_unknown(dsqlQualifier.nullStr(), getAlias(false), this); return NULL; } @@ -8000,7 +8000,7 @@ void RecordKeyNode::setParameterName(dsql_par* parameter) const { - parameter->par_name = parameter->par_alias = DB_KEY_NAME; + parameter->par_name = parameter->par_alias = getAlias(false); dsql_ctx* context = dsqlRelation->dsqlContext; @@ -8030,28 +8030,35 @@ void RecordKeyNode::make(DsqlCompilerScratch* /*dsqlScratch*/, dsc* desc) { - fb_assert(blrOp == blr_dbkey); + fb_assert(blrOp == blr_dbkey || blrOp == blr_record_version2); // Fix for bug 10072 check that the target is a relation - dsql_rel* relation; + dsql_rel* relation = dsqlRelation->dsqlContext->ctx_relation; - if (dsqlRelation && (relation = dsqlRelation->dsqlContext->ctx_relation)) + if (relation) { - desc->dsc_dtype = dtype_text; + USHORT dbKeyLength = (relation->rel_flags & REL_creating ? 8 : relation->rel_dbkey_length); - if (relation->rel_flags & REL_creating) - desc->dsc_length = 8; - else - desc->dsc_length = relation->rel_dbkey_length; - - desc->dsc_flags = DSC_nullable; - desc->dsc_ttype() = ttype_binary; + if (blrOp == blr_dbkey) + { + desc->dsc_dtype = dtype_text; + desc->dsc_length = dbKeyLength; + desc->dsc_flags = DSC_nullable; + desc->dsc_ttype() = ttype_binary; + } + else // blr_record_version2 + { + if (dbKeyLength == 8) + { + desc->makeLong(0); + desc->setNullable(true); + } + else + raiseError(dsqlRelation->dsqlContext); + } } else - { - ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-607) << - Arg::Gds(isc_dsql_dbkey_from_non_table)); - } + raiseError(dsqlRelation->dsqlContext); } bool RecordKeyNode::jrdStreamFinder(StreamType findStream) @@ -8108,6 +8115,8 @@ desc->dsc_scale = 0; desc->dsc_flags = 0; } + else if (blrOp == blr_record_version2) + desc->makeLong(0); } ValueExprNode* RecordKeyNode::copy(thread_db* tdbb, NodeCopier& copier) const @@ -8340,7 +8349,7 @@ // If the current transaction has updated the record, the record version // coming in from DSQL will have the original transaction # (or current // transaction if the current transaction updated the record in a different - // request.). In these cases, mark the request so that the boolean + // request). In these cases, mark the request so that the boolean // to check equality of record version will be forced to evaluate to true. if (request->req_transaction->tra_number == rpb->rpb_transaction_nr) @@ -8365,7 +8374,21 @@ impure->vlu_desc.dsc_length = 4; impure->vlu_desc.dsc_ttype() = ttype_binary; } + else if (blrOp == blr_record_version2) + { + const jrd_rel* relation = rpb->rpb_relation; + // If it doesn't point to a valid record, return NULL. + if (!rpb->rpb_number.isValid() || !relation || relation->isVirtual() || relation->rel_file) + { + request->req_flags |= req_null; + return NULL; + } + + impure->vlu_misc.vlu_long = rpb->rpb_transaction_nr; + impure->vlu_desc.makeLong(0, &impure->vlu_misc.vlu_long); + } + return &impure->vlu_desc; } @@ -8387,7 +8410,32 @@ return concatNode; } +void RecordKeyNode::raiseError(dsql_ctx* context) const +{ + if (blrOp != blr_record_version2) + { + status_exception::raise( + Arg::Gds(isc_sqlerr) << Arg::Num(-607) << + Arg::Gds(isc_dsql_dbkey_from_non_table)); + } + string name = context->getObjectName(); + const string& alias = context->ctx_internal_alias; + + if (alias.hasData() && name != alias) + { + if (name.hasData()) + name += " (alias " + alias + ")"; + else + name = alias; + } + + status_exception::raise( + Arg::Gds(isc_sqlerr) << Arg::Num(-607) << + Arg::Gds(isc_dsql_record_version_table) << name); +} + + //-------------------- Modified: firebird/trunk/src/dsql/ExprNodes.h =================================================================== --- firebird/trunk/src/dsql/ExprNodes.h 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/dsql/ExprNodes.h 2012-08-28 01:02:56 UTC (rev 57059) @@ -1110,9 +1110,23 @@ virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb); virtual dsc* execute(thread_db* tdbb, jrd_req* request) const; + const char* getAlias(bool rdb) const + { + if (blrOp == blr_record_version2) + { + // ASF: It's on purpose that RDB$ prefix is always used here. + // Absense of it with DB_KEY seems more a bug than feature. + return RDB_RECORD_VERSION_NAME; + } + else + return (rdb ? RDB_DB_KEY_NAME : DB_KEY_NAME); + } + private: static ValueExprNode* catenateNodes(thread_db* tdbb, ValueExprNodeStack& stack); + void raiseError(dsql_ctx* context) const; + public: UCHAR blrOp; Firebird::MetaName dsqlQualifier; Modified: firebird/trunk/src/dsql/dsql.h =================================================================== --- firebird/trunk/src/dsql/dsql.h 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/dsql/dsql.h 2012-08-28 01:02:56 UTC (rev 57059) @@ -732,6 +732,16 @@ return *this; } + Firebird::string getObjectName() + { + if (ctx_relation) + return ctx_relation->rel_name.c_str(); + else if (ctx_procedure) + return ctx_procedure->prc_name.toString(); + else + return ""; + } + bool getImplicitJoinField(const Firebird::MetaName& name, NestConst<ValueExprNode>& node); PartitionMap* getPartitionMap(DsqlCompilerScratch* dsqlScratch, ValueListNode* partitionNode, ValueListNode* orderNode); Modified: firebird/trunk/src/dsql/parse.y =================================================================== --- firebird/trunk/src/dsql/parse.y 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/dsql/parse.y 2012-08-28 01:02:56 UTC (rev 57059) @@ -573,11 +573,11 @@ %token <legacyStr> RANK %token <legacyStr> ROW_NUMBER %token <legacyStr> SQLSTATE - %token <legacyStr> KW_BOOLEAN %token <legacyStr> KW_FALSE %token <legacyStr> KW_TRUE %token <legacyStr> UNKNOWN +%token <legacyStr> RDB_RECORD_VERSION // precedence declarations for expression evaluation @@ -5707,10 +5707,10 @@ { $$ = $1; } | internal_info { $$ = $1; } - | DB_KEY - { $$ = newNode<RecordKeyNode>(blr_dbkey); } - | symbol_table_alias_name '.' DB_KEY - { $$ = newNode<RecordKeyNode>(blr_dbkey, toName($1)); } + | recordKeyType + { $$ = newNode<RecordKeyNode>($1); } + | symbol_table_alias_name '.' recordKeyType + { $$ = newNode<RecordKeyNode>($3, toName($1)); } | KW_VALUE { $$ = newNode<DomainValidationNode>(); } | datetime_value_expression @@ -5719,6 +5719,12 @@ { $$ = $1; } ; +%type <blrOp> recordKeyType +recordKeyType + : DB_KEY { $$ = blr_dbkey; } + | RDB_RECORD_VERSION { $$ = blr_record_version2; } + ; + %type <valueExprNode> datetime_value_expression datetime_value_expression : CURRENT_DATE Modified: firebird/trunk/src/include/gen/codetext.h =================================================================== --- firebird/trunk/src/include/gen/codetext.h 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/include/gen/codetext.h 2012-08-28 01:02:56 UTC (rev 57059) @@ -804,6 +804,7 @@ {"upd_ins_with_complex_view", 336003101}, {"dsql_incompatible_trigger_type", 336003102}, {"dsql_db_trigger_type_cant_change", 336003103}, + {"dsql_record_version_table", 336003104}, {"dyn_filter_not_found", 336068645}, {"dyn_func_not_found", 336068649}, {"dyn_index_not_found", 336068656}, Modified: firebird/trunk/src/include/gen/iberror.h =================================================================== --- firebird/trunk/src/include/gen/iberror.h 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/include/gen/iberror.h 2012-08-28 01:02:56 UTC (rev 57059) @@ -838,6 +838,7 @@ const ISC_STATUS isc_upd_ins_with_complex_view = 336003101L; const ISC_STATUS isc_dsql_incompatible_trigger_type = 336003102L; const ISC_STATUS isc_dsql_db_trigger_type_cant_change = 336003103L; +const ISC_STATUS isc_dsql_record_version_table = 336003104L; const ISC_STATUS isc_dyn_filter_not_found = 336068645L; const ISC_STATUS isc_dyn_func_not_found = 336068649L; const ISC_STATUS isc_dyn_index_not_found = 336068656L; @@ -1224,7 +1225,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 = 1168; +const ISC_STATUS isc_err_max = 1169; #else /* c definitions */ @@ -2032,6 +2033,7 @@ #define isc_upd_ins_with_complex_view 336003101L #define isc_dsql_incompatible_trigger_type 336003102L #define isc_dsql_db_trigger_type_cant_change 336003103L +#define isc_dsql_record_version_table 336003104L #define isc_dyn_filter_not_found 336068645L #define isc_dyn_func_not_found 336068649L #define isc_dyn_index_not_found 336068656L @@ -2418,7 +2420,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 1168 +#define isc_err_max 1169 #endif Modified: firebird/trunk/src/include/gen/msgs.h =================================================================== --- firebird/trunk/src/include/gen/msgs.h 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/include/gen/msgs.h 2012-08-28 01:02:56 UTC (rev 57059) @@ -807,6 +807,7 @@ {336003101, "UPDATE OR INSERT without MATCHING could not be used with views based on more than one table"}, /* upd_ins_with_complex_view */ {336003102, "Incompatible trigger type"}, /* dsql_incompatible_trigger_type */ {336003103, "Database trigger type can't be changed"}, /* dsql_db_trigger_type_cant_change */ + {336003104, "To be used with RDB$RECORD_VERSION, @1 must be a table or a view of single table"}, /* dsql_record_version_table */ {336068645, "BLOB Filter @1 not found"}, /* dyn_filter_not_found */ {336068649, "Function @1 not found"}, /* dyn_func_not_found */ {336068656, "Index not found"}, /* dyn_index_not_found */ Modified: firebird/trunk/src/include/gen/sql_code.h =================================================================== --- firebird/trunk/src/include/gen/sql_code.h 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/include/gen/sql_code.h 2012-08-28 01:02:56 UTC (rev 57059) @@ -803,6 +803,7 @@ {336003101, -817}, /* 29 upd_ins_with_complex_view */ {336003102, -817}, /* 30 dsql_incompatible_trigger_type */ {336003103, -817}, /* 31 dsql_db_trigger_type_cant_change */ + {336003104, -607}, /* 32 dsql_record_version_table */ {336068645, -901}, /* 37 dyn_filter_not_found */ {336068649, -901}, /* 41 dyn_func_not_found */ {336068656, -901}, /* 48 dyn_index_not_found */ Modified: firebird/trunk/src/include/gen/sql_state.h =================================================================== --- firebird/trunk/src/include/gen/sql_state.h 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/include/gen/sql_state.h 2012-08-28 01:02:56 UTC (rev 57059) @@ -803,6 +803,7 @@ {336003101, "54001"}, // 29 upd_ins_with_complex_view {336003102, "42000"}, // 30 dsql_incompatible_trigger_type {336003103, "42000"}, // 31 dsql_db_trigger_type_cant_change + {336003104, "HY000"}, // 32 dsql_record_version_table {336068645, "42000"}, // 37 dyn_filter_not_found {336068649, "42000"}, // 41 dyn_func_not_found {336068656, "42000"}, // 48 dyn_index_not_found Modified: firebird/trunk/src/jrd/blp.h =================================================================== --- firebird/trunk/src/jrd/blp.h 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/jrd/blp.h 2012-08-28 01:02:56 UTC (rev 57059) @@ -244,5 +244,6 @@ {"subproc", procedure2}, {"subfunc_decl", subfunc_decl}, {"subfunc", function}, + {"record_version2", byte_line}, {0, 0} }; Modified: firebird/trunk/src/jrd/blr.h =================================================================== --- firebird/trunk/src/jrd/blr.h 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/jrd/blr.h 2012-08-28 01:02:56 UTC (rev 57059) @@ -403,5 +403,6 @@ #define blr_subproc (unsigned char) 206 #define blr_subfunc_decl (unsigned char) 207 #define blr_subfunc (unsigned char) 208 +#define blr_record_version2 (unsigned char) 209 #endif // JRD_BLR_H Modified: firebird/trunk/src/jrd/constants.h =================================================================== --- firebird/trunk/src/jrd/constants.h 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/jrd/constants.h 2012-08-28 01:02:56 UTC (rev 57059) @@ -69,6 +69,8 @@ typedef TEXT SqlIdentifier[MAX_SQL_IDENTIFIER_SIZE]; const char* const DB_KEY_NAME = "DB_KEY"; +const char* const RDB_DB_KEY_NAME = "RDB$DB_KEY"; +const char* const RDB_RECORD_VERSION_NAME = "RDB$RECORD_VERSION"; const char* const NULL_STRING_MARK = "*** null ***"; const char* const UNKNOWN_STRING_MARK = "*** unknown ***"; Modified: firebird/trunk/src/msgs/facilities2.sql =================================================================== --- firebird/trunk/src/msgs/facilities2.sql 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/msgs/facilities2.sql 2012-08-28 01:02:56 UTC (rev 57059) @@ -5,7 +5,7 @@ ('2012-01-23 20:10:30', 'QLI', 1, 532) ('2009-07-16 05:26:11', 'GFIX', 3, 121) ('1996-11-07 13:39:40', 'GPRE', 4, 1) -('2005-11-05 13:09:00', 'DSQL', 7, 32) +('2012-08-27 21:26:00', 'DSQL', 7, 33) ('2012-01-13 11:20:16', 'DYN', 8, 285) ('1996-11-07 13:39:40', 'INSTALL', 10, 1) ('1996-11-07 13:38:41', 'TEST', 11, 4) Modified: firebird/trunk/src/msgs/messages2.sql =================================================================== --- firebird/trunk/src/msgs/messages2.sql 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/msgs/messages2.sql 2012-08-28 01:02:56 UTC (rev 57059) @@ -1596,6 +1596,7 @@ ('upd_ins_with_complex_view', 'pass1_update_or_insert', 'pass1.cpp', NULL, 7, 29, NULL, 'UPDATE OR INSERT without MATCHING could not be used with views based on more than one table', NULL, NULL); ('dsql_incompatible_trigger_type', 'define_trigger', 'ddl.cpp', NULL, 7, 30, NULL, 'Incompatible trigger type', NULL, NULL); ('dsql_db_trigger_type_cant_change', 'define_trigger', 'ddl.cpp', NULL, 7, 31, NULL, 'Database trigger type can''t be changed', NULL, NULL); +('dsql_record_version_table', 'MAKE_desc', 'ExprNodes.cpp', NULL, 7, 32, NULL, 'To be used with RDB$RECORD_VERSION, @1 must be a table or a view of single table', NULL, NULL); -- Do not change the arguments of the previous DSQL messages. -- Write the new DSQL messages here. -- DYN Modified: firebird/trunk/src/msgs/system_errors2.sql =================================================================== --- firebird/trunk/src/msgs/system_errors2.sql 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/msgs/system_errors2.sql 2012-08-28 01:02:56 UTC (rev 57059) @@ -791,6 +791,7 @@ (-817, '54', '001', 7, 29, 'upd_ins_with_complex_view', NULL, NULL) (-817, '42', '000', 7, 30, 'dsql_incompatible_trigger_type', NULL, NULL) (-817, '42', '000', 7, 31, 'dsql_db_trigger_type_cant_change', NULL, NULL) +(-607, 'HY', '000', 7, 32, 'dsql_record_version_table', NULL, NULL) -- DYN (-901, '42', '000', 8, 37, 'dyn_filter_not_found', NULL, NULL) (-901, '42', '000', 8, 41, 'dyn_func_not_found', NULL, NULL) Modified: firebird/trunk/src/yvalve/keywords.cpp =================================================================== --- firebird/trunk/src/yvalve/keywords.cpp 2012-08-25 03:42:56 UTC (rev 57058) +++ firebird/trunk/src/yvalve/keywords.cpp 2012-08-28 01:02:56 UTC (rev 57059) @@ -318,6 +318,7 @@ {RANK, "RANK", 2, false}, {DB_KEY, "RDB$DB_KEY", 1, false}, {RDB_GET_CONTEXT, "RDB$GET_CONTEXT", 2, true}, + {RDB_RECORD_VERSION, "RDB$RECORD_VERSION", 2, false}, {RDB_SET_CONTEXT, "RDB$SET_CONTEXT", 2, true}, {READ, "READ", 1, false}, {REAL, "REAL", 1, false}, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |