.nf
 
 
    ========== licence begin  GPL
    Copyright (c) 2000-2004 SAP AG
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    ========== licence end
 
.fo
*****************************************************
Copyright (c) 2000-2004 SAP AG
SAP Database Technology
 
Release :      Date : 2000-11-21
*****************************************************
modname : VAK721
changed : 2000-11-21
module  : Build_Strategy_4
 
Author  : GertG / HolgerB
Created : 1985-10-16
*****************************************************
 
Purpose : module for searching for a strategy in executing time
 
Define  :
 
        PROCEDURE
              a721strategy (
                    VAR acv           : tak_all_command_glob;
                    VAR dmli          : tak_dml_info;
                    VAR gg_strategy   : tgg07_StrategyInfo;
                    VAR StratInfo_len : tsp00_Int2;
                    VAR parsk         : tak_parskey;
                    config            : tak00_access_configuration);
 
        PROCEDURE
              a721transfer_parse_info (
                    VAR acv           : tak_all_command_glob;
                    VAR access_info   : tak70_strategy_record;
                    VAR L1_terms      : tak70_term;
                    VAR order_fields  : tak00_ord_fields;
                    work_kind         : tak70_backup);
 
.CM *-END-* define --------------------------------------
 
Use     :
 
        FROM
              Scanner : VAK01;
 
        VAR
              a01sysnullkey          : tgg00_SysInfoKey;
              a01defaultkey          : tgg00_SysInfoKey;
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01vtrace    : tgg00_VtraceState;
 
        FUNCTION
              g01optimize_cache : boolean;
 
      ------------------------------ 
 
        FROM
              Trace_Help_Procedures : VGG041;
 
        PROCEDURE
              g041name_to_trace (
                    VAR t  : tgg00_TransContext;
                    name   : tsp00_Name);
 
      ------------------------------ 
 
        FROM
              AK_universal_semantic_tools : VAK06;
 
        PROCEDURE
              a06_systable_get (
                    VAR acv      : tak_all_command_glob;
                    dstate       : tak_directory_state;
                    VAR tableid  : tgg00_Surrogate;
                    VAR base_ptr : tak_sysbufferaddress;
                    get_all      : boolean;
                    VAR ok       : boolean);
 
      ------------------------------ 
 
        FROM
              AK_error_handling : VAK07;
 
        PROCEDURE
              a07_b_put_error (
                    VAR acv : tak_all_command_glob;
                    b_err   : tgg00_BasisError;
                    err_code : tsp00_Int4);
 
        PROCEDURE
              a07ak_system_error (
                    VAR acv  : tak_all_command_glob;
                    modul_no : integer;
                    id       : integer);
 
      ------------------------------ 
 
        FROM
              Systeminfo_cache : VAK10;
 
        PROCEDURE
              a10get_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syskey   : tgg00_SysInfoKey;
                    dstate       : tak_directory_state;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg00_BasisError);
 
        PROCEDURE
              a10rel_sysinfo (syspointer : tak_sysbufferaddress);
 
        PROCEDURE
              a10_nil_get_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syskey   : tgg00_SysInfoKey;
                    dstate       : tak_directory_state;
                    syslen       : tsp00_Int2;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg00_BasisError);
 
        PROCEDURE
              a10add_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg00_BasisError);
 
      ------------------------------ 
 
        FROM
              Build_Strategy   : VAK70;
 
        VAR
              a70_glob_zstrat_rec : tak70_strategy_record;
 
        PROCEDURE
              a70L1_strat_search (
                    VAR acv          : tak_all_command_glob;
                    VAR sparr        : tak_syspointerarr;
                    VAR access_info  : tak70_strategy_record;
                    VAR gg_strategy  : tgg07_StrategyInfo;
                    VAR StratInfo_len: tsp00_Int2;
                    VAR eval_info    : tak70_page_eval_rec;
                    VAR order_fields : tak00_ord_fields;
                    VAR L1_pageIO    : tsp00_Int4;
                    VAR L1_stratvalue: tsp00_Longreal);
 
        PROCEDURE
              a70L2L3_strat_search (
                    VAR acv          : tak_all_command_glob;
                    VAR dmli         : tak_dml_info;
                    VAR sparr        : tak_syspointerarr;
                    VAR access_info  : tak70_strategy_record;
                    VAR gg_strategy  : tgg07_StrategyInfo;
                    VAR StratInfo_len: tsp00_Int2;
                    morestratpos     : tsp00_Int4;
                    VAR eval_info    : tak70_page_eval_rec;
                    VAR L1_terms     : tak70_term;
                    VAR order_fields : tak00_ord_fields;
                    L1_pageIO        : tsp00_Int4;
                    VAR L1_stratvalue: tsp00_Longreal);
 
      ------------------------------ 
 
        FROM
              Build_Strategy_2 : VAK71;
 
        PROCEDURE
              a71set_rescnt(
                    VAR acv         : tak_all_command_glob;
                    VAR sparr       : tak_syspointerarr;
                    datapos         : tsp00_Int2;
                    VAR qprop       : tak70_query_properties);
 
        PROCEDURE
              a71adjust_configuration (
                    VAR dmli        : tak_dml_info;
                    VAR config_qprop : tak70_strategy_record);
 
      ------------------------------ 
 
        FROM
              Build_Strategy_Index_Only : VAK723;
 
        PROCEDURE
              a723only_index_stack (
                    VAR acv           : tak_all_command_glob;
                    VAR tabid         : tgg00_Surrogate;
                    VAR gg_strategy   : tgg07_StrategyInfo);
 
      ------------------------------ 
 
        FROM
              hint_trace_routines : VAK81;
 
        PROCEDURE
              a81trace_access_config (
                    VAR transid     : tgg00_TransContext;
                    VAR config      : tak00_access_configuration);
&       ifdef trace
 
        PROCEDURE
              a81debug_access_config (
                    debug       : tgg00_Debug;
                    VAR config  : tak00_access_configuration);
 
      ------------------------------ 
 
        FROM
              Trace_Strategy_1 : VAK725;
 
        PROCEDURE
              a725output_access_info (
                    level           : tgg00_Debug;
                    nam             : tsp00_Sname;
                    VAR access_info : tak70_strategy_record);
 
        PROCEDURE
              a725L1_terms_output (
                    level        : tgg00_Debug;
                    VAR L1_terms : tak70_term);
 
        PROCEDURE
              a725output_involved_cols (
                    debug   : tgg00_Debug;
                    nam     : tsp00_Sname;
                    ic_info : tak70_involved_columns);
 
        PROCEDURE
              a725output_end_strat(
                    debug             : tgg00_Debug;
                    nam               : tsp00_Sname;
                    VAR gg_strategy   : tgg07_StrategyInfo;
                    VAR eval_info     : tak70_page_eval_rec;
                    VAR StratInfo_len : tsp00_Int2);
 
        PROCEDURE
              a725output_query_prop (
                    debug   : tgg00_Debug;
                    qprop   : tak70_query_properties);
&       endif
 
      ------------------------------ 
 
        FROM
              Trace_Strategy_2 : VAK727;
 
        PROCEDURE
              a727trace_tablename (
                    VAR transid     : tgg00_TransContext;
                    name            : tsp00_Sname;
                    VAR tabname     :tsp00_KnlIdentifier);
 
        PROCEDURE
              a727trace_strategy_text(
                    VAR transid : tgg00_TransContext;
                    name        : tsp00_Sname;
                    strategy    : tgg07_StratEnum);
 
        PROCEDURE
              a727trace_query_prop (
                    VAR transid     : tgg00_TransContext;
                    VAR qprop       : tak70_query_properties);
 
      ------------------------------ 
 
        FROM
              Trace : VBD120;
 
        PROCEDURE
              b120MessBlockTrace (
                    VAR Trans     : tgg00_TransContext;
                    TraceType     : tgg00_VtraceType;
                    VAR MessBlock : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG101;
 
        PROCEDURE
              SAPDB_PascalMove  (
                    mod_id         : tsp00_C6;
                    mod_intern_num : tsp00_Int4;
                    source_upb     : tsp00_Int4;
                    destin_upb     : tsp00_Int4;
                    source         : tsp00_MoveObjPtr;
                    source_pos     : tsp00_Int4;
                    destin         : tsp00_MoveObjPtr;
                    destin_pos     : tsp00_Int4;
                    length         : tsp00_Int4;
                    VAR e          : tgg00_BasisError);
 
        PROCEDURE
              SAPDB_PascalForcedMove  (
                    size1    : tsp00_Int4;
                    size2    : tsp00_Int4;
                    val1     : tsp00_MoveObjPtr;
                    p1       : tsp00_Int4;
                    val2     : tsp00_MoveObjPtr;
                    p2       : tsp00_Int4;
                    cnt      : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              Single_Select : VKB720;
 
        PROCEDURE
              k720ref_statistic (
                    VAR m         : tgg00_MessBlock;
                    VAR arr_index : tgg00_RefInfoIndex;
                    VAR strat     : tgg07_StrategyInfo);
&       ifdef TRACE
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01knl_identifier (
                    debug      : tgg00_Debug;
                    nam        : tsp00_Sname;
                    identifier : tsp00_KnlIdentifier);
 
        PROCEDURE
              t01bool (
                    debug    : tgg00_Debug;
                    nam      : tsp00_Sname;
                    curr_bool: boolean);
 
        PROCEDURE
              t01int4 (
                    debug    : tgg00_Debug;
                    nam      : tsp00_Sname;
                    int      : tsp00_Int4);
 
        PROCEDURE
              t01sname (
                    level : tgg00_Debug;
                    nam : tsp00_Sname);
 
        PROCEDURE
              t01name (
                    level : tgg00_Debug;
                    nam : tsp00_Name);
 
        PROCEDURE
              t01messblock (
                    debug         : tgg00_Debug;
                    nam           : tsp00_Sname;
                    VAR mblock    : tgg00_MessBlock);
 
        PROCEDURE
              t01execution_kind (
                    debug     : tgg00_Debug;
                    nam       : tsp00_Sname;
                    ex_kind   : tak_execution_kind);
&       endif
 
.CM *-END-* use -----------------------------------------
 
Synonym :
 
.CM *-END-* synonym -------------------------------------
***********************************************************
.CM -lll-
Code    :
 
 
(*------------------------------*) 
 
PROCEDURE
      a721strategy (
            VAR acv           : tak_all_command_glob;
            VAR dmli          : tak_dml_info;
            VAR gg_strategy   : tgg07_StrategyInfo;
            VAR StratInfo_len : tsp00_Int2;
            VAR parsk         : tak_parskey;
            config            : tak00_access_configuration);
 
VAR
      _strat_found      : boolean;
      _ok               : boolean;
      _b_err            : tgg00_BasisError;
      _L1_pageIO        : tsp00_Int4;
      _getlen           : tsp00_Int4;
      _stratinfoptr     : ^tak70_stratinforecord ;
      _L1_terms         : tak70_term;
      _ke               : tgg00_SysInfoKey;
      _sbuf             : tak_sysbufferaddress;
      _sparr            : tak_syspointerarr;
      _access_info      : tak70_strategy_record;
      _eval_info        : tak70_page_eval_rec;
      _order_fields     : tak00_ord_fields;
      _aux_treeid       : tgg00_FileId;
      _L1_stratvalue    : tsp00_Longreal;
 
BEGIN
&ifdef TRACE
t01messblock( ak_strat, 'A721STRATEGY', acv.a_mblock );
t01bool( ak_strat, 'a_intern_exp', acv.a_intern_explain );
t01execution_kind( ak_strat, 'init ex kind', acv.a_init_ex_kind );
t01execution_kind( ak_strat, 'exec kind   ', acv.a_ex_kind );
t01int4( ak_strat, 'stratpos    ', acv.a_mblock.mb_qual^.mstrat_pos );
t01int4( ak_strat, 'stratstart  ', acv.a_mblock.
      mb_st^[ acv.a_mblock.mb_qual^.mstrat_pos ].epos );
&endif
IF  ( NOT ( g01vtrace.vtrStrategy_gg00 ) AND ( cs_trace in config.cfg_switches ))
THEN
    BEGIN
    g01vtrace.vtrStrategy_gg00 := true;
    g01vtrace.vtrSession_gg00  := acv.a_transinf.tri_trans.trSessionId_gg00;
    END;
(*ENDIF*) 
_strat_found := false;
_ok          := true;
IF  ( g01optimize_cache ) AND ( gg_strategy.str_use_subquery = no_subquery )
THEN
    BEGIN
&   ifdef trace
    t01sname( ak_strat, 'optim cache ' );
&   endif
    _ke := a01sysnullkey;
    _ke.sauthid[ 1 ] := cak_tempinfo_byte;
    SAPDB_PascalForcedMove( sizeof( parsk ), sizeof( _ke.sauthid ),
          @parsk, 1, @_ke.sauthid, 2, mxak_parskey );
    _ke.sentrytyp := cak_estratinfo;
    ;
    a10get_sysinfo( acv, _ke, d_release, _sbuf, _b_err );
    IF  ( _b_err = e_ok )
    THEN
        BEGIN
        _aux_treeid   := gg_strategy.str_result_id;
        _strat_found  := true;
        _stratinfoptr := @_sbuf^;
&       ifdef trace
        (* initialize cost values *)
        _eval_info.pev_wholeIO_pages:= IS_UNDEFINED_GG07;
        _eval_info.pev_readIO_pages := IS_UNDEFINED_GG07;
        _eval_info.pev_readIO_rows  := IS_UNDEFINED_GG07;
&       endif
        StratInfo_len := _stratinfoptr^.si_reclen - ( sizeof( _stratinfoptr^ ) -
              sizeof( _stratinfoptr^.si_gg_stratinfo ));
        gg_strategy   := _stratinfoptr^.si_gg_stratinfo;
        gg_strategy.str_result_id
              := _aux_treeid;
        IF  ( gg_strategy.str_qual_kind = inv_only )
        THEN
            BEGIN
            ak721systable_get( acv, d_release, acv.a_mblock.mb_qual^.mtree,
                  _sparr.pbasep, _ok );
            IF  _ok AND _sparr.pbasep^.sbase.bindexexist
            THEN
                a723only_index_stack( acv,
                      _sparr.pbasep^.sbase.btreeid.fileTabId_gg00, gg_strategy )
            ELSE
                a07_b_put_error( acv, e_old_fileversion, 1 );
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  ( NOT _strat_found )
THEN
    BEGIN
    StratInfo_len            := STRATEGY_START_MXGG07;
    gg_strategy.str_strategy := strat_undecided;
    ak721systable_get( acv, d_fix, acv.a_mblock.mb_qual^.mtree,
          _sparr.pbasep, _ok );
    IF  ( _ok )
    THEN
        BEGIN
        (* initialize cost values *)
        _eval_info.pev_wholeIO_pages:= IS_UNDEFINED_GG07;
        _eval_info.pev_readIO_pages := IS_UNDEFINED_GG07;
        _eval_info.pev_readIO_rows  := IS_UNDEFINED_GG07;
        ;
        (* initialize central strategy record *)
        _access_info := a70_glob_zstrat_rec;
        _access_info.srec_config := config;
        a71adjust_configuration( dmli, _access_info );
        ;
        IF  ( NOT dmli.d_only_table_scan )
            (* see calculate constant param expression *)
        THEN
            a721transfer_parse_info( acv, _access_info, _L1_terms,
                  _order_fields, bckp_restore );
        (*ENDIF*) 
        ;
        IF  ( qp_given_rescnt_param in
            _access_info.srec_query_prop.qps_switches )
        THEN
            a71set_rescnt( acv, _sparr, gg_strategy.str_rowno,
                  _access_info.srec_query_prop );
        (*ENDIF*) 
        IF  ( gg_strategy.str_build_result )
        THEN
            (* could be set while executing *)
            _access_info.srec_query_prop.qps_switches :=
                  _access_info.srec_query_prop.qps_switches + [ qp_build_result ];
        (*ENDIF*) 
        IF  ( g01vtrace.vtrStrategy_gg00 )
        THEN
            BEGIN
            g041name_to_trace( acv.a_transinf.tri_trans,
                  '>> A721STRATEGY >>' );
            IF  ( _sparr.pbasep^.sbase.btablen <> NIL )
            THEN
                BEGIN
                a727trace_tablename( acv.a_transinf.tri_trans,
                      'base table  ', _sparr.pbasep^.sbase.btablen^ );
                END;
            (*ENDIF*) 
            b120MessBlockTrace(acv.a_transinf.tri_trans, ak_send, acv.a_mblock);
            a81trace_access_config( acv.a_transinf.tri_trans,
                  _access_info.srec_config );
            a727trace_query_prop( acv.a_transinf.tri_trans,
                  _access_info.srec_query_prop );
            END;
        (*ENDIF*) 
        IF  ( acv.a_returncode = 0 )
        THEN
            BEGIN
            a70L1_strat_search( acv, _sparr, _access_info, gg_strategy,
                  StratInfo_len, _eval_info, _order_fields, _L1_pageIO, _L1_stratvalue );
            ;
            IF  ( qp_missing_value in _access_info.srec_query_prop.qps_switches )
            THEN
                BEGIN
                IF  ( acv.a_ex_kind = only_executing ) AND
                    ( dmli.d_corr = no_correlation )
                THEN
                    a07ak_system_error( acv, 721, 3 );
                (*ENDIF*) 
                END
            ELSE
                BEGIN
                a70L2L3_strat_search( acv, dmli, _sparr,
                      _access_info, gg_strategy,
                      StratInfo_len,
                      acv.a_mblock.mb_st^[ acv.a_mblock.mb_qual^.mstrat_pos ].epos +
                      STRATEGY_START_MXGG07,
                      _eval_info, _L1_terms, _order_fields, _L1_pageIO, _L1_stratvalue );
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        ;
        (* free mb_strat if possible *)
        IF  ( gg_strategy.str_strategy <> strat_undecided )
        THEN
            acv.a_mblock.mb_strat_len := 0;
        (*ENDIF*) 
        a10rel_sysinfo( _sparr.pbasep );
        ;
        IF  ( g01optimize_cache ) AND
            ( gg_strategy.str_strategy <> strat_undecided )     AND
            ( gg_strategy.str_strategy <> strat_no_result )     AND
            ( gg_strategy.str_strategy <> strat_more_than_one ) AND
            ( gg_strategy.str_use_subquery = no_subquery )
        THEN
            BEGIN
            _getlen := sizeof( tak70_stratinforecord ) -
                  sizeof( gg_strategy ) + StratInfo_len;
            a10_nil_get_sysinfo( acv, _ke, d_release, _getlen, _sbuf, _b_err );
            ;
            IF  ( _b_err = e_ok )
            THEN
                BEGIN
                SAPDB_PascalMove ('VAK721',   1,
                      sizeof( gg_strategy ), _getlen,
                      @gg_strategy, 1,
                      @_sbuf^,
                      sizeof( tak70_stratinforecord ) - sizeof( gg_strategy ) + 1,
                      StratInfo_len,
                      acv.a_returncode);
                ;
                IF  ( acv.a_returncode = e_ok )
                THEN
                    a10add_sysinfo (acv, _sbuf, _b_err);
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        END
    ELSE
        a07_b_put_error( acv, e_old_fileversion, 1 );
    (*ENDIF*) 
    END;
(*ENDIF*) 
;
IF  ( _ok  AND ( acv.a_returncode = 0 ))
THEN
    BEGIN
    IF  ( gg_strategy.str_strategy <> strat_undecided )
    THEN
        BEGIN
        dmli.d_qual_kind := gg_strategy.str_qual_kind;
        k720ref_statistic( acv.a_mblock, dmli.d_strat_info, gg_strategy );
        END;
    (*ENDIF*) 
    IF  ( gg_strategy.str_use_subquery = normal_subquery )
    THEN
        acv.a_mblock.mb_qual^.msubquery := true;
    (*ENDIF*) 
    ;
&   ifdef trace
    a725output_end_strat( ak_strat, 'ENDSTRAT >>>', gg_strategy,
          _eval_info, StratInfo_len );
&   endif
    END;
(*ENDIF*) 
;
IF  ( g01vtrace.vtrStrategy_gg00 )
THEN
    BEGIN
    a727trace_strategy_text( acv.a_transinf.tri_trans,
          'CHOOSEN     ', gg_strategy.str_strategy );
    g041name_to_trace( acv.a_transinf.tri_trans,
          '<< A721STRATEGY <<' );
    IF  ( cs_trace in config.cfg_switches )
    THEN
        BEGIN
        g01vtrace.vtrStrategy_gg00         := false;
        g01vtrace.vtrSession_gg00.ci4_gg00 := cgg_nil_session;
        END;
    (*ENDIF*) 
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak721systable_get (
            VAR acv      : tak_all_command_glob;
            dstate       : tak_directory_state;
            VAR treeid   : tgg00_FileId;
            VAR base_ptr : tak_sysbufferaddress;
            VAR ok       : boolean);
 
CONST
      c_get_all           = true;
 
VAR
      _b_err : tgg00_BasisError;
      _sysk  : tgg00_SysInfoKey;
      _basetable  : tgg00_Surrogate;
 
BEGIN
ok := false;
IF  (( ftsTemp_egg00 in treeid.fileType_gg00 ) AND
    ( treeid.fileTfn_gg00 = tfnTemp_egg00 )    AND
    ( treeid.fileTfnTemp_gg00 = ttfnTempTable_egg00 ))
THEN
    (* temporary table, i.e. CREATE TABLE Temp.<name> *)
    BEGIN
    ok              := true;
    _sysk           := a01defaultkey;
    _sysk.sentrytyp := cak_eresult;
    _sysk.stableid  := cgg_zero_id;
    _sysk.ssite     := cak_temp_table_site;
    _sysk.stemp     := treeid.fileTempCnt_gg00;
    a10get_sysinfo( acv, _sysk, dstate, base_ptr, _b_err );
    IF  _b_err <> e_ok
    THEN
        ok := false;
    (*ENDIF*) 
    END
ELSE
    a06_systable_get( acv, dstate, treeid.fileTabId_gg00, base_ptr, true, ok );
(*ENDIF*) 
IF  ok AND ( base_ptr^.sbase.btablekind = tonebase )
THEN
    BEGIN
&   ifdef trace
    t01knl_identifier( ak_strat, 'view/table  ', base_ptr^.sbase.btablen^ );
&   endif
    _basetable := base_ptr^.sbase.btreeid.fileTabId_gg00;
    a10rel_sysinfo( base_ptr );
    a06_systable_get( acv, d_fix, _basetable, base_ptr, c_get_all, ok );
    END;
&ifdef trace
(*ENDIF*) 
IF  ok
THEN
    t01knl_identifier( ak_strat, 'base table  ', base_ptr^.sbase.btablen^ );
&endif
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a721transfer_parse_info (
            VAR acv           : tak_all_command_glob;
            VAR access_info   : tak70_strategy_record;
            VAR L1_terms      : tak70_term;
            VAR order_fields  : tak00_ord_fields;
            work_kind         : tak70_backup);
 
VAR
      _used_buffer_len          : tsp00_Int4;
      _in_stpos                 : tsp00_Int2;
 
      _parse_info_ptr           : RECORD
            CASE boolean OF
                true :
                    (struct_ptr : tak70_optimizer_parsinfo_ptr);
                false :
                    (byte_ptr   : tsp00_MoveObjPtr);
                END;
            (*ENDCASE*) 
 
 
BEGIN
&ifdef trace
IF  ( work_kind = bckp_restore )
THEN
    t01sname( ak_strat, 'bckp_restore' )
ELSE
    t01sname( ak_strat, 'bckp_save   ' );
(*ENDIF*) 
&endif
IF  ( acv.a_mblock.mb_strat <> NIL )
    AND
    (( ( acv.a_mblock.mb_strat_len > 0 ) AND ( work_kind = bckp_restore ) ) OR
    (  ( acv.a_mblock.mb_strat_len = 0 ) AND ( work_kind = bckp_save ) ))
THEN
    BEGIN
    _parse_info_ptr.byte_ptr  := acv.a_mblock.mb_strat;
    _used_buffer_len          := 0;
    ;
    (**** CONFIG ****)
    IF  ( work_kind = bckp_save )
    THEN
        BEGIN
        access_info.srec_query_prop.qps_switches :=
              access_info.srec_query_prop.qps_switches -
              [ qp_missing_value ];
&       ifdef trace
        a725output_query_prop( ak_strat, access_info.srec_query_prop );
&       endif
        _parse_info_ptr.struct_ptr^.op_query_prop     :=
              access_info.srec_query_prop;
        END
    ELSE
        BEGIN
        access_info.srec_query_prop      :=
              _parse_info_ptr.struct_ptr^.op_query_prop;
&       ifdef trace
        a81debug_access_config( ak_strat, access_info.srec_config );
        a725output_query_prop( ak_strat, access_info.srec_query_prop );
&       endif
        END
    (*ENDIF*) 
    ;
    (**** ORDER FIELDS ****)
    ak721order_fields_transfer( order_fields,
          _parse_info_ptr.struct_ptr, _used_buffer_len, work_kind );
    ;
    (**** LEVEL1 ACCESS PATH ****)
    ak721L1_accesspath_transfer( acv, access_info,
          _parse_info_ptr.struct_ptr, _used_buffer_len, work_kind );
    ;
    (**** INDEX ONLY INFORMATION ****)
    ak721involved_cols_transfer( acv, access_info.srec_involved_cols,
          _parse_info_ptr.struct_ptr, _used_buffer_len, work_kind );
    ;
    (**** LEVEL2/LEVEL3 ACCESS PATH ****)
    ak721L23_accesspath_transfer( acv, L1_terms,
          _parse_info_ptr.struct_ptr, _used_buffer_len, work_kind );
    ;
    IF  ( work_kind = bckp_save )
    THEN
        BEGIN
        acv.a_mblock.mb_strat_len :=
              OPARSINFO_CONST_PART_AK70 + _used_buffer_len;
        (* align parse info length, because gg_strategy will be moved *)
        (* behind parse info und accessed via pointer                 *)
        IF  (( acv.a_mblock.mb_strat_len MOD ALIGNMENT_GG00 ) <> 0 )
        THEN
            BEGIN
            acv.a_mblock.mb_strat_len := acv.a_mblock.mb_strat_len +
                  ALIGNMENT_GG00 -
                  ( acv.a_mblock.mb_strat_len MOD ALIGNMENT_GG00 );
            END;
        (*ENDIF*) 
        END
    ELSE
        BEGIN
        (* check if sorting in IN conditions are done *)
        IF  ( access_info.srec_keyaccess.ka_infield.in_stpos <> 0 )
        THEN
            BEGIN
&           ifdef trace
            t01sname( ak_strat, 'check IN    ' );
&           endif
            _in_stpos := access_info.srec_keyaccess.ka_infield.in_stpos +
                  access_info.srec_keyaccess.ka_infield.in_elemcnt + 1;
            IF  acv.a_mblock.mb_st^[ _in_stpos ].eop <> op_in
            THEN
                a07ak_system_error( acv, 721, 1 );
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    ;
    IF  ( acv.a_returncode <> 0 )
    THEN
        a07_b_put_error( acv, acv.a_returncode, 1 );
    (*ENDIF*) 
    END
ELSE
    BEGIN
&   ifdef trace
    t01int4(ak_strat, 'mb_strat_len', acv.a_mblock.mb_strat_len);
&   endif
    a07ak_system_error( acv, 721, 2 );
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak721L1_accesspath_transfer (
            VAR acv             : tak_all_command_glob;
            VAR access_info     : tak70_strategy_record;
            parserecord_ptr     : tak70_optimizer_parsinfo_ptr;
            VAR used_buffer_len : tsp00_Int4;
            work_kind           : tak70_backup);
 
VAR
      _move_len  : tsp00_Int2;
      _ix        : tsp00_Int2;
 
BEGIN
&ifdef trace
t01name( ak_strat, 'transfer L1 preds ' );
&endif
WITH access_info, srec_keyaccess, srec_invaccess DO
    BEGIN
    IF  work_kind = bckp_save
    THEN
        BEGIN
&       ifdef trace
        a725output_access_info( ak_strat, 'save        ', access_info );
&       endif
        ;
        (**** KEY ACCESS ****)
        (*** store ka_startcnt ***)
        parserecord_ptr^.op_keystartcnt := ka_startcnt;
        (*** store ka_stopcnt ***)
        parserecord_ptr^.op_keystopcnt  := ka_stopcnt;
        (*** store ka_infield ***)
        parserecord_ptr^.op_keyinfield  := ka_infield;
        ;
        (*** store ka_startfields ***)
        _move_len := ( ka_startcnt ) * sizeof( ka_startfields[ 0 ] );
        SAPDB_PascalMove ('VAK721',   2,
              sizeof( ka_startfields ), sizeof( parserecord_ptr^.op_buffer ),
              @ka_startfields, 1,
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        ;
        (*** store ka_stopfields ***)
        _move_len := ( ka_stopcnt ) * sizeof( ka_stopfields[ 0 ] );
        SAPDB_PascalMove ('VAK721',   3,
              sizeof( ka_stopfields ), sizeof( parserecord_ptr^.op_buffer ),
              @ka_stopfields, 1,
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        ;
        (**** INV ACCESS ****)
        (*** store ia_startcnt ***)
        parserecord_ptr^.op_idx_startcnt  := ia_startcnt;
        (*** store ia_stopcnt ***)
        parserecord_ptr^.op_idx_stopcnt   := ia_stopcnt;
        (*** store ia_incnt ***)
        parserecord_ptr^.op_idx_incnt     := ia_incnt;
        ;
        (*** store ia_startfields ***)
        _move_len := ia_startcnt * sizeof( ia_startfields[ 0 ] );
        SAPDB_PascalMove ('VAK721',   4,
              sizeof( ia_startfields ), sizeof( parserecord_ptr^.op_buffer ),
              @ia_startfields, 1,
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        ;
        (*** store ia_stopfields ***)
        _move_len := ia_stopcnt * sizeof( ia_stopfields[ 0 ] );
        SAPDB_PascalMove ('VAK721',   5,
              sizeof( ia_stopfields ), sizeof( parserecord_ptr^.op_buffer ),
              @ia_stopfields, 1,
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        ;
        (*** store ia_infields ***)
        _move_len := ia_incnt * sizeof( ia_infields[ 0 ] );
        SAPDB_PascalMove ('VAK721',   6,
              sizeof( ia_infields ), sizeof( parserecord_ptr^.op_buffer ),
              @ia_infields, 1,
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        END
    ELSE
        BEGIN
        (**** KEY ACCESS ****)
        (*** restore ka_startcnt ***)
        ka_startcnt := parserecord_ptr^.op_keystartcnt;
        (*** restore ka_stopcnt ***)
        ka_stopcnt  := parserecord_ptr^.op_keystopcnt;
        (*** restore ka_infield ***)
        ka_infield  := parserecord_ptr^.op_keyinfield;
        ;
        (*** restore ka_startfields ***)
        _move_len := ( ka_startcnt ) * sizeof( ka_startfields[ 0 ] );
        SAPDB_PascalMove ('VAK721',   7,
              sizeof( parserecord_ptr^.op_buffer ), sizeof( ka_startfields ),
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              @ka_startfields, 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        FOR _ix := ka_startcnt TO MAX_COLPOSARR_IDX_GG07 DO
            ka_startfields[ _ix ] := 0;
        (*ENDFOR*) 
        ;
        (*** restore ka_stopfields ***)
        _move_len := ( ka_stopcnt ) * sizeof( ka_stopfields[ 0 ] );
        SAPDB_PascalMove ('VAK721',   8,
              sizeof( parserecord_ptr^.op_buffer ), sizeof( ka_stopfields ),
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              @ka_stopfields, 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        FOR _ix := ka_stopcnt TO MAX_COLPOSARR_IDX_GG07 DO
            ka_stopfields[ _ix ] := 0;
        (*ENDFOR*) 
        ;
        (**** INV ACCESS ****)
        (*** restore ia_startcnt ***)
        ia_startcnt := parserecord_ptr^.op_idx_startcnt;
        (*** restore ia_stopcnt ***)
        ia_stopcnt  := parserecord_ptr^.op_idx_stopcnt;
        (*** restore ia_incnt ***)
        ia_incnt    := parserecord_ptr^.op_idx_incnt;
        ;
        (*** restore ia_startfields ***)
        _move_len := ia_startcnt * sizeof( ia_startfields[ 0 ] );
        SAPDB_PascalMove ('VAK721',   9,
              sizeof( parserecord_ptr^.op_buffer ), sizeof( ia_startfields ),
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              @ia_startfields, 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        ;
        (*** restore ia_stopfields ***)
        _move_len := ia_stopcnt * sizeof( ia_stopfields[ 0 ] );
        SAPDB_PascalMove ('VAK721',  10,
              sizeof( parserecord_ptr^.op_buffer ), sizeof( ia_stopfields ),
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              @ia_stopfields, 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        ;
        (*** restore ia_infields ***)
        _move_len := ia_incnt * sizeof( ia_infields[ 0 ] );
        SAPDB_PascalMove ('VAK721',  11,
              sizeof( parserecord_ptr^.op_buffer ), sizeof( ia_infields ),
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              @ia_infields, 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
&       ifdef trace
        a725output_access_info( ak_strat, 'restore     ', access_info );
&       endif
        ;
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak721involved_cols_transfer (
            VAR acv             : tak_all_command_glob;
            VAR ic_info         : tak70_involved_columns;
            parserecord_ptr     : tak70_optimizer_parsinfo_ptr;
            VAR used_buffer_len : tsp00_Int4;
            work_kind           : tak70_backup);
 
VAR
      _move_len   : tsp00_Int2;
      _ix         : tsp00_Int2;
 
BEGIN
WITH ic_info DO
    BEGIN
    IF  work_kind = bckp_save
    THEN
        BEGIN
&       ifdef trace
        a725output_involved_cols( ak_strat, 'save ic_info', ic_info );
&       endif
        (*** store ic_i_outp_cnt ***)
        parserecord_ptr^.op_i_outp_cnt := ic_i_outp_cnt;
        (*** store ic_k_outp_cnt ***)
        parserecord_ptr^.op_k_outp_cnt := ic_k_outp_cnt;
        ;
        (*** store ic_i_outp_cols ***)
        _move_len := ic_i_outp_cnt * sizeof( ic_i_outp_cols[ 1 ] );
        SAPDB_PascalMove ('VAK721',  12,
              sizeof( ic_i_outp_cols ), sizeof( parserecord_ptr^.op_buffer ),
              @ic_i_outp_cols, 1,
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        ;
        (*** store ic_k_outp_cols ***)
        _move_len := ic_k_outp_cnt * sizeof( ic_k_outp_cols[ 0 ] );
        SAPDB_PascalMove ('VAK721',  13,
              sizeof( ic_k_outp_cols ), sizeof( parserecord_ptr^.op_buffer ),
              @ic_k_outp_cols, 1,
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        ;
        (*** store ic_i_qual_cnt ***)
        parserecord_ptr^.op_i_qual_cnt := ic_i_qual_cnt;
        (*** store ic_k_qual_cnt ***)
        parserecord_ptr^.op_k_qual_cnt := ic_k_qual_cnt;
        ;
        (*** store ic_i_qual_cols ***)
        _move_len := ic_i_qual_cnt * sizeof( ic_i_qual_cols[ 1 ] );
        SAPDB_PascalMove ('VAK721',  14,
              sizeof( ic_i_qual_cols ), sizeof( parserecord_ptr^.op_buffer ),
              @ic_i_qual_cols, 1,
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        ;
        (*** store ic_k_qual_cols ***)
        _move_len := ic_k_qual_cnt * sizeof( ic_k_qual_cols[ 0 ] );
        SAPDB_PascalMove ('VAK721',  15,
              sizeof( ic_k_qual_cols ), sizeof( parserecord_ptr^.op_buffer ),
              @ic_k_qual_cols, 1,
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        END
    ELSE
        BEGIN
        (*** restore ic_i_outp_cnt ***)
        ic_i_outp_cnt := parserecord_ptr^.op_i_outp_cnt;
        (*** restore ic_k_outp_cnt ***)
        ic_k_outp_cnt := parserecord_ptr^.op_k_outp_cnt;
        ;
        (*** restore ic_i_outp_cols ***)
        _move_len := ic_i_outp_cnt * sizeof( ic_i_outp_cols[ 1 ] );
        SAPDB_PascalMove ('VAK721',  16,
              sizeof( parserecord_ptr^.op_buffer ), sizeof( ic_i_outp_cols ),
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              @ic_i_outp_cols, 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        FOR _ix := ic_i_outp_cnt + 1 TO MAX_COL_SEQUENCE_GG00 DO
            ic_i_outp_cols[ _ix ] := 0;
        (*ENDFOR*) 
        ;
        (*** restore ic_k_outp_cols ***)
        _move_len := ic_k_outp_cnt * sizeof( ic_k_outp_cols[ 0 ] );
        SAPDB_PascalMove ('VAK721',  17,
              sizeof( parserecord_ptr^.op_buffer ), sizeof( ic_k_outp_cols ),
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              @ic_k_outp_cols, 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        FOR _ix := ic_k_outp_cnt TO MAX_COLPOSARR_IDX_GG07 DO
            ic_k_outp_cols[ _ix ] := 0;
        (*ENDFOR*) 
        ;
        (*** restore ic_i_qual_cnt ***)
        ic_i_qual_cnt := parserecord_ptr^.op_i_qual_cnt;
        (*** restore ic_k_qual_cnt ***)
        ic_k_qual_cnt := parserecord_ptr^.op_k_qual_cnt;
        ;
        (*** restore ic_i_qual_cols ***)
        _move_len := ic_i_qual_cnt * sizeof( ic_i_qual_cols[ 1 ] );
        SAPDB_PascalMove ('VAK721',  18,
              sizeof( parserecord_ptr^.op_buffer ), sizeof( ic_i_qual_cols ),
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              @ic_i_qual_cols, 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        FOR _ix := ic_i_qual_cnt + 1 TO MAX_COL_SEQUENCE_GG00 DO
            ic_i_qual_cols[ _ix ] := 0;
        (*ENDFOR*) 
        ;
        (*** restore ic_k_qual_cols ***)
        _move_len := ic_k_qual_cnt * sizeof( ic_k_qual_cols[ 0 ] );
        SAPDB_PascalMove ('VAK721',  19,
              sizeof( parserecord_ptr^.op_buffer ), sizeof( ic_k_qual_cols ),
              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
              @ic_k_qual_cols, 1,
              _move_len,
              acv.a_returncode);
        used_buffer_len := used_buffer_len + _move_len;
        FOR _ix := ic_k_qual_cnt TO MAX_COLPOSARR_IDX_GG07 DO
            ic_k_qual_cols[ _ix ] := 0;
        (*ENDFOR*) 
&       ifdef trace
        a725output_involved_cols( ak_strat, 'recov ic_inf', ic_info );
&       endif
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak721L23_accesspath_transfer (
            VAR acv             : tak_all_command_glob;
            VAR L1_terms        : tak70_term;
            parserecord_ptr     : tak70_optimizer_parsinfo_ptr;
            VAR used_buffer_len : tsp00_Int4;
            work_kind           : tak70_backup);
 
VAR
      _ic2          : tsp_int_map_c2;
      _ix           : tsp00_Int2;
      _ix_terms     : tsp00_Int2;
      _move_len     : tsp00_Int2;
 
BEGIN
&ifdef trace
t01name( ak_strat, 'trans L2, L3 preds' );
&endif
WITH L1_terms DO
    BEGIN
    IF  work_kind = bckp_restore
    THEN
        BEGIN
        (*** restore L-1-terms count ***)
        trm_L1termcnt := parserecord_ptr^.op_L1termcnt;
        END
    ELSE
        BEGIN
        (*** store L-1-terms count ***)
        parserecord_ptr^.op_L1termcnt := trm_L1termcnt;
        END;
    (*ENDIF*) 
&   ifdef trace
    t01int4( ak_strat, 'L1-term cnt ', parserecord_ptr^.op_L1termcnt );
    t01int4( ak_strat, 'used buf len', used_buffer_len );
&   endif
    _ix := 0;
    WHILE ( _ix <= trm_L1termcnt - 1 ) DO
        (*** (re)store one L-1-term ***)
        WITH trm_L1terms[ _ix ] DO
            BEGIN
            IF  work_kind = bckp_restore
            THEN
                BEGIN
                (*** restore count of L-2-preds and L-3-terms ***)
                _ic2.map_c2[ 1 ] :=
                      parserecord_ptr^.op_buffer[ used_buffer_len + 1 ];
                _ic2.map_c2[ 2 ] :=
                      parserecord_ptr^.op_buffer[ used_buffer_len + 2 ];
                used_buffer_len  := used_buffer_len + 2;
                l1t_L2pL3tcnt    := _ic2.map_int;
                (*** restore useability info ***)
                trm_L1terms[ _ix ].l1t_is_usable :=
                      ( ord( parserecord_ptr^.
                      op_buffer[ used_buffer_len + 1 ] ) = 1 );
                used_buffer_len  := used_buffer_len + 1;
                END
            ELSE
                BEGIN
                (*** store count of L-2-preds / L-3-terms ***)
                _ic2.map_int := trm_L1terms[ _ix ].l1t_L2pL3tcnt;
                parserecord_ptr^.op_buffer[ used_buffer_len + 1 ] :=
                      _ic2.map_c2[ 1 ];
                parserecord_ptr^.op_buffer[ used_buffer_len + 2 ] :=
                      _ic2.map_c2[ 2 ];
                used_buffer_len := used_buffer_len + 2;
                (*** store useability info ***)
                parserecord_ptr^.op_buffer[ used_buffer_len + 1 ] :=
                      chr( ord ( trm_L1terms[ _ix ].l1t_is_usable ) );
                used_buffer_len := used_buffer_len + 1;
                END;
            (*ENDIF*) 
            _ix := succ ( _ix );
            _ix_terms := 1;
            WHILE ( _ix_terms <= l1t_L2pL3tcnt ) DO
                (*** (re)store one L-2-pred / L-3-term ***)
                WITH l1t_L2terms[ _ix_terms - 1 ] DO
                    BEGIN
                    IF  work_kind = bckp_restore
                    THEN
                        BEGIN
                        (*** restore count of predicates ***)
                        _ic2.map_c2[ 1 ] :=
                              parserecord_ptr^.op_buffer[ used_buffer_len + 1 ];
                        _ic2.map_c2[ 2 ] :=
                              parserecord_ptr^.op_buffer[ used_buffer_len + 2 ];
                        used_buffer_len  := used_buffer_len + 2;
                        l2l3p_predcnt    := _ic2.map_int;
                        (*** restore predicates ***)
                        _move_len := l2l3p_predcnt * sizeof( l2l3p_preds[ 0 ] );
                        SAPDB_PascalMove ('VAK721',  20,
                              sizeof( parserecord_ptr^.op_buffer ),
                              _move_len,
                              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
                              @l2l3p_preds[ 0 ], 1,
                              _move_len,
                              acv.a_returncode);
                        used_buffer_len := used_buffer_len + _move_len;
                        END
                    ELSE
                        BEGIN
                        (*** store count of predicates ***)
                        _ic2.map_int := l2l3p_predcnt;
                        parserecord_ptr^.op_buffer[ used_buffer_len + 1 ] :=
                              _ic2.map_c2[ 1 ];
                        parserecord_ptr^.op_buffer[ used_buffer_len + 2 ] :=
                              _ic2.map_c2[ 2 ];
                        used_buffer_len := used_buffer_len + 2;
                        (*** store predicates ***)
                        _move_len := l2l3p_predcnt * sizeof( l2l3p_preds[ 0 ] );
                        SAPDB_PascalMove ('VAK721',  21,
                              _move_len,
                              sizeof( parserecord_ptr^.op_buffer ),
                              @l2l3p_preds[ 0 ], 1,
                              @parserecord_ptr^.op_buffer, used_buffer_len + 1,
                              _move_len,
                              acv.a_returncode);
                        used_buffer_len := used_buffer_len + _move_len;
                        END;
                    (*ENDIF*) 
                    _ix_terms := succ( _ix_terms );
                    END;
                (*ENDWITH*) 
            (*ENDWHILE*) 
            END;
        (*ENDWITH*) 
    (*ENDWHILE*) 
&   ifdef trace
    a725L1_terms_output( ak_strat, L1_terms );
&   endif
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak721order_fields_transfer (
            VAR order_fields    : tak00_ord_fields;
            parserecord_ptr     : tak70_optimizer_parsinfo_ptr;
            VAR used_buffer_len : tsp00_Int4;
            work_kind           : tak70_backup);
 
VAR
      _ix     : tsp00_Int2;
      _ic2    : tsp_int_map_c2;
 
      _asc    : RECORD
            CASE boolean OF
                true :
                    (ofasc  : tak00_ooption);
                false :
                    (byte   : char);
                END;
            (*ENDCASE*) 
 
 
BEGIN
IF  ( work_kind = bckp_save )
THEN
    BEGIN
    parserecord_ptr^.op_ordered_field_cnt := order_fields.ocntord;
    FOR _ix := 1 TO order_fields.ocntord DO
        BEGIN
        (*** store ofstno  ***)
        _ic2.map_int := order_fields.ofield[ _ix ].ofstno;
        parserecord_ptr^.op_buffer[ used_buffer_len + 1 ] := _ic2.map_c2[ 1 ];
        parserecord_ptr^.op_buffer[ used_buffer_len + 2 ] := _ic2.map_c2[ 2 ];
        (*** store ofasc   ***)
        _asc.ofasc := order_fields.ofield[ _ix ].ofasc;
        parserecord_ptr^.op_buffer[ used_buffer_len + 3 ] := _asc.byte;
        (*** store offno   ***)
        _ic2.map_int := order_fields.ofield[ _ix ].offno;
        parserecord_ptr^.op_buffer[ used_buffer_len + 4 ] := _ic2.map_c2[ 1 ];
        parserecord_ptr^.op_buffer[ used_buffer_len + 5 ] := _ic2.map_c2[ 2 ];
        used_buffer_len := used_buffer_len + 5;
        END;
    (*ENDFOR*) 
    END
ELSE
    BEGIN
    order_fields.ocntord := parserecord_ptr^.op_ordered_field_cnt;
    FOR _ix := 1 TO order_fields.ocntord DO
        BEGIN
        (*** restore ofstno  ***)
        _ic2.map_c2[ 1 ] := parserecord_ptr^.op_buffer[ used_buffer_len + 1 ];
        _ic2.map_c2[ 2 ] := parserecord_ptr^.op_buffer[ used_buffer_len + 2 ];
        order_fields.ofield[ _ix ].ofstno := _ic2.map_int;
        (*** restore ofasc   ***)
        _asc.byte := parserecord_ptr^.op_buffer[ used_buffer_len + 3 ];
        order_fields.ofield[ _ix ].ofasc := _asc.ofasc;
        (*** restore offno   ***)
        _ic2.map_c2[ 1 ] := parserecord_ptr^.op_buffer[ used_buffer_len + 4 ];
        _ic2.map_c2[ 2 ] := parserecord_ptr^.op_buffer[ used_buffer_len + 5 ];
        order_fields.ofield[ _ix ].offno := _ic2.map_int;
        used_buffer_len := used_buffer_len + 5;
        END;
    (*ENDFOR*) 
    END;
(*ENDIF*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
