@@ -2929,39 +2929,85 @@ static void transaction_options(thread_db* tdbb,
29292929 {
29302930 case isc_tpb_consistency:
29312931 if (!isolation.assignOnce (true ))
2932+ {
29322933 ERR_post (Arg::Gds (isc_bad_tpb_content) <<
29332934 Arg::Gds (isc_tpb_multiple_txn_isolation));
2935+ }
2936+
2937+ if (read_consistency.isAssigned ())
2938+ {
2939+ ERR_post (Arg::Gds (isc_bad_tpb_content) <<
2940+ // 'Option @1 is not valid if @2 was used previously in TPB'
2941+ Arg::Gds (isc_tpb_conflicting_options) <<
2942+ Arg::Str (" isc_tpb_consistency" ) << Arg::Str (" isc_tpb_read_consistency" ));
2943+ }
2944+
2945+ if (rec_version.isAssigned ())
2946+ {
2947+ const auto tpbStr = rec_version.asBool () ?
2948+ " isc_tpb_rec_version" : " isc_tpb_no_rec_version" ;
2949+
2950+ ERR_post (Arg::Gds (isc_bad_tpb_content) <<
2951+ // 'Option @1 is not valid if @2 was used previously in TPB'
2952+ Arg::Gds (isc_tpb_conflicting_options) <<
2953+ Arg::Str (" isc_tpb_consistency" ) << Arg::Str (tpbStr) );
2954+ }
29342955
29352956 if (shared_snapshot)
29362957 {
29372958 ERR_post (
29382959 Arg::Gds (isc_bad_tpb_content) <<
2960+ // 'Option @1 is not valid if @2 was used previously in TPB'
29392961 Arg::Gds (isc_tpb_conflicting_options) <<
29402962 Arg::Str (" isc_tpb_consistency" ) << Arg::Str (" isc_tpb_at_snapshot_number" ));
29412963 }
29422964
29432965 transaction->tra_flags |= TRA_degree3;
2944- transaction->tra_flags &= ~TRA_read_committed;
2966+ transaction->tra_flags &= ~( TRA_read_committed | TRA_read_consistency | TRA_rec_version) ;
29452967 break ;
29462968
29472969 case isc_tpb_concurrency:
29482970 if (!isolation.assignOnce (true ))
2971+ {
29492972 ERR_post (Arg::Gds (isc_bad_tpb_content) <<
29502973 Arg::Gds (isc_tpb_multiple_txn_isolation));
2974+ }
2975+
2976+ if (read_consistency.isAssigned ())
2977+ {
2978+ ERR_post (Arg::Gds (isc_bad_tpb_content) <<
2979+ // 'Option @1 is not valid if @2 was used previously in TPB'
2980+ Arg::Gds (isc_tpb_conflicting_options) <<
2981+ Arg::Str (" isc_tpb_concurrency" ) << Arg::Str (" isc_tpb_read_consistency" ));
2982+ }
2983+
2984+ if (rec_version.isAssigned ())
2985+ {
2986+ const auto tpbStr = rec_version.asBool () ?
2987+ " isc_tpb_rec_version" : " isc_tpb_no_rec_version" ;
2988+
2989+ ERR_post (Arg::Gds (isc_bad_tpb_content) <<
2990+ // 'Option @1 is not valid if @2 was used previously in TPB'
2991+ Arg::Gds (isc_tpb_conflicting_options) <<
2992+ Arg::Str (" isc_tpb_concurrency" ) << Arg::Str (tpbStr) );
2993+ }
29512994
29522995 transaction->tra_flags &= ~TRA_degree3;
2953- transaction->tra_flags &= ~TRA_read_committed;
2996+ transaction->tra_flags &= ~( TRA_read_committed | TRA_read_consistency | TRA_rec_version) ;
29542997 break ;
29552998
29562999 case isc_tpb_read_committed:
29573000 if (!isolation.assignOnce (true ))
3001+ {
29583002 ERR_post (Arg::Gds (isc_bad_tpb_content) <<
29593003 Arg::Gds (isc_tpb_multiple_txn_isolation));
3004+ }
29603005
29613006 if (shared_snapshot)
29623007 {
29633008 ERR_post (
29643009 Arg::Gds (isc_bad_tpb_content) <<
3010+ // 'Option @1 is not valid if @2 was used previously in TPB'
29653011 Arg::Gds (isc_tpb_conflicting_options) <<
29663012 Arg::Str (" isc_tpb_read_committed" ) << Arg::Str (" isc_tpb_at_snapshot_number" ));
29673013 }
@@ -3066,14 +3112,16 @@ static void transaction_options(thread_db* tdbb,
30663112
30673113 if (rec_version.isAssigned ())
30683114 {
3115+ const auto tpbStr = rec_version.asBool () ?
3116+ " isc_tpb_rec_version" : " isc_tpb_no_rec_version" ;
3117+
30693118 ERR_post (Arg::Gds (isc_bad_tpb_content) <<
30703119 // 'Option @1 is not valid if @2 was used previously in TPB'
30713120 Arg::Gds (isc_tpb_conflicting_options) <<
3072- Arg::Str (" isc_tpb_read_consistency" ) << (rec_version.asBool () ?
3073- Arg::Str (" isc_tpb_rec_version" ) : Arg::Str (" isc_tpb_no_rec_version" )) );
3121+ Arg::Str (" isc_tpb_read_consistency" ) << Arg::Str (tpbStr) );
30743122 }
30753123
3076- transaction->tra_flags |= TRA_read_consistency | TRA_rec_version;
3124+ transaction->tra_flags |= TRA_read_committed | TRA_read_consistency | TRA_rec_version;
30773125 break ;
30783126
30793127 case isc_tpb_nowait:
@@ -3479,24 +3527,12 @@ static void transaction_options(thread_db* tdbb,
34793527 }
34803528 }
34813529
3482- if (rec_version.isAssigned () && !(transaction->tra_flags & TRA_read_committed))
3483- {
3484- if (rec_version.asBool ())
3485- {
3486- ERR_post (Arg::Gds (isc_bad_tpb_content) <<
3487- Arg::Gds (isc_tpb_option_without_rc) << Arg::Str (" isc_tpb_rec_version" ));
3488- }
3489- else
3490- {
3491- ERR_post (Arg::Gds (isc_bad_tpb_content) <<
3492- Arg::Gds (isc_tpb_option_without_rc) << Arg::Str (" isc_tpb_no_rec_version" ));
3493- }
3494- }
3495-
3496- if ((transaction->tra_flags & TRA_read_committed) && !(tdbb->tdbb_flags & TDBB_sweeper))
3530+ if ((transaction->tra_flags & TRA_read_committed) &&
3531+ !(transaction->tra_flags & TRA_read_consistency) &&
3532+ !(tdbb->tdbb_flags & TDBB_sweeper) &&
3533+ tdbb->getDatabase ()->dbb_config ->getReadConsistency ())
34973534 {
3498- if (tdbb->getDatabase ()->dbb_config ->getReadConsistency ())
3499- transaction->tra_flags |= TRA_read_consistency | TRA_rec_version;
3535+ transaction->tra_flags |= TRA_read_consistency | TRA_rec_version;
35003536 }
35013537
35023538 if (transaction->tra_attachment ->isGbak ())
0 commit comments