@@ -235,6 +235,7 @@ void setParamsDateDiff(DataTypeUtilBase* dataTypeUtil, const SysFunction* functi
235235void setParamsEncrypt (DataTypeUtilBase*, const SysFunction*, int argsCount, dsc** args);
236236void setParamsFirstLastDay (DataTypeUtilBase* dataTypeUtil, const SysFunction* function, int argsCount, dsc** args);
237237void setParamsGetSetContext (DataTypeUtilBase* dataTypeUtil, const SysFunction* function, int argsCount, dsc** args);
238+ void setParamsResetContext (DataTypeUtilBase* dataTypeUtil, const SysFunction* function, int argsCount, dsc** args);
238239void setParamsHash (DataTypeUtilBase*, const SysFunction*, int argsCount, dsc** args);
239240void setParamsMakeDbkey (DataTypeUtilBase* dataTypeUtil, const SysFunction* function, int argsCount, dsc** args);
240241void setParamsOverlay (DataTypeUtilBase* dataTypeUtil, const SysFunction* function, int argsCount, dsc** args);
@@ -327,6 +328,7 @@ dsc* evlFloor(thread_db* tdbb, const SysFunction* function, const NestValueArray
327328dsc* evlGenUuid (thread_db* tdbb, const SysFunction* function, const NestValueArray& args, impure_value* impure);
328329dsc* evlGetContext (thread_db* tdbb, const SysFunction* function, const NestValueArray& args, impure_value* impure);
329330dsc* evlSetContext (thread_db* tdbb, const SysFunction* function, const NestValueArray& args, impure_value* impure);
331+ dsc* evlResetContext (thread_db* tdbb, const SysFunction* function, const NestValueArray& args, impure_value* impure);
330332dsc* evlGetTranCN (thread_db* tdbb, const SysFunction* function, const NestValueArray& args, impure_value* impure);
331333dsc* evlHash (thread_db* tdbb, const SysFunction* function, const NestValueArray& args, impure_value* impure);
332334dsc* evlLeft (thread_db* tdbb, const SysFunction* function, const NestValueArray& args, impure_value* impure);
@@ -358,7 +360,8 @@ dsc* evlUuidToChar(thread_db* tdbb, const SysFunction* function, const NestValue
358360// System context function names
359361const char
360362 RDB_GET_CONTEXT[] = " RDB$GET_CONTEXT" ,
361- RDB_SET_CONTEXT[] = " RDB$SET_CONTEXT" ;
363+ RDB_SET_CONTEXT[] = " RDB$SET_CONTEXT" ,
364+ RDB_RESET_CONTEXT[] = " RDB$RESET_CONTEXT" ;
362365
363366// Context namespace names
364367const char
@@ -845,6 +848,18 @@ void setParamsGetSetContext(DataTypeUtilBase*, const SysFunction*, int argsCount
845848}
846849
847850
851+ void setParamsResetContext (DataTypeUtilBase*, const SysFunction*, int argsCount, dsc** args)
852+ {
853+ fb_assert (argsCount == 1 );
854+
855+ if (args[0 ]->isUnknown ())
856+ {
857+ args[0 ]->makeVarying (80 , ttype_none);
858+ args[0 ]->setNullable (true );
859+ }
860+ }
861+
862+
848863void setParamsHash (DataTypeUtilBase*, const SysFunction*, int argsCount, dsc** args)
849864{
850865 fb_assert (argsCount == 1 || argsCount == 2 );
@@ -4961,6 +4976,58 @@ dsc* evlSetContext(thread_db* tdbb, const SysFunction*, const NestValueArray& ar
49614976}
49624977
49634978
4979+ dsc* evlResetContext (thread_db* tdbb, const SysFunction* function, const NestValueArray& args, impure_value* impure)
4980+ {
4981+ fb_assert (args.getCount () == 1 );
4982+
4983+ Attachment* const attachment = tdbb->getAttachment ();
4984+ jrd_tra* const transaction = tdbb->getTransaction ();
4985+ Request* request = tdbb->getRequest ();
4986+
4987+ const dsc* nameSpace = EVL_expr (tdbb, request, args[0 ]);
4988+ if (!nameSpace) // Complain if namespace is null
4989+ ERR_post (Arg::Gds (isc_ctx_bad_argument) << Arg::Str (RDB_RESET_CONTEXT));
4990+
4991+ const string nameSpaceStr (MOV_make_string2 (tdbb, nameSpace, ttype_none));
4992+
4993+ StringMap* contextVars = nullptr ;
4994+
4995+ if (nameSpaceStr == USER_SESSION_NAMESPACE)
4996+ {
4997+ if (!attachment)
4998+ {
4999+ fb_assert (false );
5000+ return nullptr ;
5001+ }
5002+
5003+ contextVars = &attachment->att_context_vars ;
5004+ }
5005+ else if (nameSpaceStr == USER_TRANSACTION_NAMESPACE)
5006+ {
5007+ if (!transaction)
5008+ {
5009+ fb_assert (false );
5010+ return nullptr ;
5011+ }
5012+
5013+ contextVars = &transaction->tra_context_vars ;
5014+ }
5015+ else
5016+ {
5017+ // "Invalid namespace name %s passed to %s"
5018+ ERR_post (Arg::Gds (isc_ctx_namespace_invalid) <<
5019+ Arg::Str (nameSpaceStr) << Arg::Str (RDB_RESET_CONTEXT));
5020+ }
5021+
5022+ impure->vlu_desc .makeLong (0 , &impure->vlu_misc .vlu_long );
5023+ impure->vlu_misc .vlu_long = (SLONG) contextVars->count ();
5024+
5025+ contextVars->clear ();
5026+
5027+ return &impure->vlu_desc ;
5028+ }
5029+
5030+
49645031dsc* evlGetTranCN (thread_db* tdbb, const SysFunction* function, const NestValueArray& args,
49655032 impure_value* impure)
49665033{
@@ -6958,6 +7025,7 @@ const SysFunction SysFunction::functions[] =
69587025 {RDB_GET_CONTEXT, 2 , 2 , true , setParamsGetSetContext, makeGetSetContext, evlGetContext, NULL },
69597026 {" RDB$GET_TRANSACTION_CN" , 1 , 1 , false , setParamsInt64, makeGetTranCN, evlGetTranCN, NULL },
69607027 {" RDB$ROLE_IN_USE" , 1 , 1 , true , setParamsAsciiVal, makeBooleanResult, evlRoleInUse, NULL },
7028+ {RDB_RESET_CONTEXT, 1 , 1 , false , setParamsResetContext, makeLongResult, evlResetContext, NULL },
69617029 {RDB_SET_CONTEXT, 3 , 3 , false , setParamsGetSetContext, makeGetSetContext, evlSetContext, NULL },
69627030 {" RDB$SYSTEM_PRIVILEGE" , 1 , 1 , true , NULL , makeBooleanResult, evlSystemPrivilege, NULL },
69637031 {" REPLACE" , 3 , 3 , true , setParamsFromList, makeReplace, evlReplace, NULL },
0 commit comments