.nf
 
 
    ========== licence begin  GPL
    Copyright (C) 2000 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 by SAP AG, 2000
SAP Database Technology
 
Release :      Date : 2000-11-27
*****************************************************
modname : VAK725
changed : 2000-11-27
module  : Trace_Strategy_1
 
Author  : GertG
Created : 2000-03-08
Pretty  : 2002-08-05
*****************************************************
 
Purpose : module for tracing of strategy information
 
Define  :
 
&       ifdef TRACE
        PROCEDURE
              a725output_access_info (
                    debug           : tgg_debug;
                    nam             : tsp00_Sname;
                    VAR access_info : tak70_strategy_record);
 
        PROCEDURE
              a725L1_terms_output (
                    debug        : tgg_debug;
                    VAR L1_terms : tak70_term);
 
        PROCEDURE
              a725output_involved_cols (
                    debug   : tgg00_Debug;
                    nam     : tsp00_Sname;
                    ic_info : tak70_involved_columns);
 
        PROCEDURE
              a725output_eval (
                    debug         : tgg_debug;
                    nam           : tsp00_Sname;
                    VAR eval_stat : tak70_page_eval_rec);
 
        PROCEDURE
              a725output_one_strat (
                    layer           : tgg_debug;
                    VAR one_strat   : tak70_one_strat);
 
        PROCEDURE
              a725output_gg_strat (
                    debug         : tgg_debug;
                    nam           : tsp00_Sname;
                    VAR gg_strat  : tgg07_StrategyInfo;
                    StratInfo_len : tsp_int2);
 
        PROCEDURE
              a725output_colposarr (
                    debug       : tgg_debug;
                    nam         : tsp00_Sname;
                    VAR keypos  : tgg07_ColPosArr);
 
        PROCEDURE
              a725output_colposarr_ex (
                    debug       : tgg_debug;
                    nam         : tsp00_Sname;
                    VAR keypos  : tgg07_ColPosArr;
                    length      : tsp_int2);
 
        PROCEDURE
              a725output_invposarr (
                    debug       : tgg_debug;
                    nam         : tsp00_Sname;
                    VAR invpos  : tak70_Invposarr);
 
        PROCEDURE
              a725output_invstrat(
                    debug         : tgg_debug;
                    nam           : tsp00_Sname;
                    VAR inv_strat : tgg07_StrInvInRange);
 
        PROCEDURE
              a725output_end_strat(
                    debug             : tgg_debug;
                    nam               : tsp00_Sname;
                    VAR gg_strategy   : tgg07_StrategyInfo;
                    VAR eval_info     : tak70_page_eval_rec;
                    VAR StratInfo_len : tsp_int2);
 
        PROCEDURE
              a725output_config (
                    debug   : tgg00_Debug;
                    config  : tak70_configuration);
 
        PROCEDURE
              a725output_query_prop (
                    debug   : tgg00_Debug;
                    qprop   : tak70_query_properties);
 
        PROCEDURE
              a725output_more_strat(
                    VAR acv         : tak_all_command_glob;
                    debug           : tgg00_Debug;
                    VAR gg_strategy : tgg07_StrategyInfo;
                    VAR all_strats  : tak70_all_strat);
 
        PROCEDURE
              a725output_explain(
                    debug    : tgg_debug;
                    VAR expl : tak_explain_rec);
 
        PROCEDURE
              a725output_col_cluster (
                    debug           : tgg_debug;
                    nam             : tsp00_Sname;
                    VAR col_cluster : tak70_sort_col_arr;
                    array_len       : tsp_int2);
&       endif
 
.CM *-END-* define --------------------------------------
***********************************************************
 
Use     :
 
&       ifdef TRACE
        FROM
              Syntax-Tree-Printer : VAK99;
 
        VAR
              a99blankline : tsp_line;
 
        PROCEDURE
              a99putint  (
                    VAR lineinfo : tsp_dataline;
                    integervalue : integer;
                    fieldlength  : tsp_fieldrange);
 
        PROCEDURE
              a99put4int  (
                    VAR data : tsp_dataline;
                    i      : tsp_int4;
                    fl     : tsp_fieldrange);
&       endif
 
      ------------------------------ 
 
        FROM
              Build_Strategy : VAK70;
 
        VAR
              a70glob_key_strats        : tgg07_StratEnumSet;
              a70glob_inv_strats        : tgg07_StratEnumSet;
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG10;
 
        PROCEDURE
              g10mv2  (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    source_upb     : tsp_int4;
                    destin_upb     : tsp_int4;
                    VAR source     : tsp_moveobj;
                    source_pos     : tsp_int4;
                    VAR destin     : tgg07_StrRaw;
                    destin_pos     : tsp_int4;
                    length         : tsp_int4;
                    VAR e          : tgg_basis_error);
 
      ------------------------------ 
 
        FROM
              GG_edit_routines : VGG17;
 
        PROCEDURE
              g17nameto_line (n : tsp00_Name;
                    VAR ln_len  : integer;
                    VAR ln      : tsp00_Line);
 
        PROCEDURE
              g17sname_to_line (
                    n             : tsp00_Sname;
                    VAR ln_len    : integer;
                    VAR ln        : tsp00_Line);
 
        PROCEDURE
              g17trimint4_to_line (
                    int4       : tsp00_Int4;
                    VAR ln_len : integer;
                    VAR ln     : tsp00_Line);
&       ifdef TRACE
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01knl_identifier (
                    debug      : tgg00_Debug;
                    nam        : tsp00_Sname;
                    identifier : tsp00_KnlIdentifier);
 
        PROCEDURE
              t01treeid (
                    debug      : tgg00_Debug;
                    nam        : tsp00_Sname;
                    VAR treeid : tgg00_FileId);
 
        PROCEDURE
              t01bool (
                    debug    : tgg00_Debug;
                    nam      : tsp00_Sname;
                    curr_bool: boolean);
 
        PROCEDURE
              t01sname (
                    debug    : tgg00_Debug;
                    nam      : tsp00_Sname);
 
        PROCEDURE
              t01int4 (
                    debug    : tgg00_Debug;
                    nam      : tsp00_Sname;
                    int      : tsp00_Int4);
 
        PROCEDURE
              t01line (
                    level  : tgg00_Debug;
                    VAR ln : tsp00_Line);
 
        PROCEDURE
              t01name (
                    level : tgg00_Debug;
                    nam : tsp00_Name);
 
        PROCEDURE
              t01strat_enum (
                    debug : tgg00_Debug;
                    nam   : tsp00_Sname;
                    strat : tgg07_StratEnum);
 
        FUNCTION
              t01trace (layer : tgg00_Debug) : boolean;
 
        PROCEDURE
              t01write_line (VAR ln : tsp00_Line);
 
        PROCEDURE
              t01qual_kind (
                    debug     : tgg00_Debug;
                    nam       : tsp00_Sname;
                    qual_kind : tgg00_QualKind);
 
        PROCEDURE
              t01subq_kind (
                    debug     : tgg00_Debug;
                    nam       : tsp00_Sname;
                    subq_kind : tgg07_SubqKind);
 
        PROCEDURE
              t01distinct_kind (
                    debug     : tgg00_Debug;
                    nam       : tsp00_Sname;
                    dist_kind : tgg00_Distinct);
 
        PROCEDURE
              t01basis_error (
                    debug : tgg00_Debug;
                    nam   : tsp00_Sname;
                    b_err : tgg00_BasisError);
 
        PROCEDURE
              t01c40 (
                    debug : tgg00_Debug;
                    msg   : tsp00_C40);
&       endif
 
.CM *-END-* use -----------------------------------------
***********************************************************
 
Synonym :
 
        PROCEDURE
              g10mv2;
 
              tsp_moveobj tgg07_StrRaw
 
.CM *-END-* synonym -------------------------------------
***********************************************************
.CM -lll-
Code    :
 
 
&ifdef TRACE
(*------------------------------*) 
 
PROCEDURE
      a725output_access_info (
            debug           : tgg_debug;
            nam             : tsp00_Sname;
            VAR access_info : tak70_strategy_record);
 
VAR
      _line     : tsp00_Line;
      _ln_len   : integer;
 
BEGIN
IF  t01trace (debug)
THEN
    BEGIN
    _line   := a99blankline;
    _ln_len := 0;
    g17sname_to_line( nam, _ln_len, _line );
    _ln_len := sizeof( nam ) + 2;
    _line[ _ln_len ] := ':';
    t01line( debug, _line );
    t01name( ak_strat, '-- ACCESS INFO -- ' );
    ak725output_keyaccess( debug, 'KEY ACCESS  ', access_info.srec_keyaccess );
    ak725output_invaccess( debug, 'INV ACCESS  ', access_info.srec_invaccess );
    ;
    a725output_config( debug, access_info.srec_config );
    a725output_query_prop( debug, access_info.srec_query_prop );
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a725L1_terms_output (
            debug        : tgg_debug;
            VAR L1_terms : tak70_term);
 
VAR
      l1term     : tsp_int2;
      preds     : tsp_int2;
      t     : tsp_int2;
      dt    : tsp_dataline;
 
BEGIN
IF  t01trace(debug)
THEN
    BEGIN
    t01name( debug, '---- L1 terms ----' );
    t01int4( debug, 'L1term cnt  ', L1_terms.trm_L1termcnt );
    l1term := 0;
    WHILE ( l1term <= L1_terms.trm_L1termcnt - 1 ) AND
          ( l1term <= cak70_max_L1terms - 1 ) DO
        BEGIN
        WITH L1_terms.trm_L1terms[ l1term ] DO
            IF  l1t_is_usable
            THEN
                BEGIN
                IF  ( l1t_L2pL3tcnt > 0 )
                THEN
                    BEGIN
                    t01int4( debug, 'L2pL3term   ', l1t_L2pL3tcnt );
                    t := 1;
                    WHILE ( t <= l1t_L2pL3tcnt ) DO
                        BEGIN
                        WITH l1t_L2terms[ t - 1 ], dt DO
                            BEGIN
                            dt.text       := a99blankline;
                            dt.text[ 1 ]  := 'L';
                            dt.text[ 2 ]  := '1';
                            dt.text[ 3 ]  := 'T';
                            dt.text[ 4 ]  := 'E';
                            dt.text[ 5 ]  := 'R';
                            dt.text[ 6 ]  := 'M';
                            dt.text[ 7 ]  := chr( l1term + ord( '0' ) );
                            dt.text[ 9 ]  := 'T';
                            dt.text[ 10 ] := 'E';
                            dt.text[ 11 ] := 'R';
                            dt.text[ 12 ] := 'M';
                            IF  ( t < 10 )
                            THEN
                                dt.text[ 13 ] := chr( t + ord('0') )
                            ELSE
                                BEGIN
                                dt.text[ 13 ] :=
                                      chr( ( t DIV 10 ) + ord( '0' ) );
                                dt.text[ 14 ] :=
                                      chr( ( t MOD 10 ) + ord( '0' ) )
                                END;
                            (*ENDIF*) 
                            t01line( debug, dt.text );
                            preds := 1;
                            WHILE ( preds <= l2l3p_predcnt ) DO
                                WITH l2l3p_preds[ preds - 1 ] DO
                                    BEGIN
                                    dt.text := a99blankline;
                                    dt.text[ 12 ] := 'P';
                                    dt.text[ 13 ] := 'R';
                                    dt.text[ 14 ] := 'E';
                                    dt.text[ 15 ] := 'D';
                                    dt.text[ 17 ] :=
                                          chr( preds + ord( '0' ) );
                                    pos    := 19;
                                    length := 21;
                                    a99putint(dt, pred_start, 3);
                                    pos    := 23;
                                    length := 25;
                                    a99putint( dt, pred_stop, 3 );
                                    IF  pred_key
                                    THEN
                                        dt.text[ 29 ] := 'K';
                                    (*ENDIF*) 
                                    IF  pred_inv
                                    THEN
                                        dt.text[ 31 ] := 'I';
                                    (*ENDIF*) 
                                    pos    := 33;
                                    length := 42;
                                    a99put4int( dt, 100, 10 );
                                    t01line( debug, dt.text );
                                    preds := succ( preds );
                                    END;
                                (*ENDWITH*) 
                            (*ENDWHILE*) 
                            t01line( debug, a99blankline );
                            END;
                        (*ENDWITH*) 
                        t := succ( t );
                        END;
                    (*ENDWHILE*) 
                    t01line( debug, a99blankline );
                    END;
                (*ENDIF*) 
                END
            ELSE
                BEGIN
                t01int4( debug, 'L1 term unus', l1term );
                END;
            (*ENDIF*) 
        (*ENDWITH*) 
        l1term := succ(l1term);
        END;
    (*ENDWHILE*) 
    t01name( ak_strat, '------------------' );
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a725output_involved_cols (
            debug   : tgg00_Debug;
            nam     : tsp00_Sname;
            ic_info : tak70_involved_columns);
 
BEGIN
IF  t01trace(debug)
THEN
    WITH ic_info DO
        BEGIN
        t01sname( debug, nam );
        ak725output_colsequence_ex( debug, 'index output',
              ic_i_outp_cols, ic_i_outp_cnt );
        a725output_colposarr_ex( debug,    'key   output',
              ic_k_outp_cols, ic_k_outp_cnt );
        ak725output_colsequence_ex( debug, 'index qual  ',
              ic_i_qual_cols, ic_i_qual_cnt );
        a725output_colposarr_ex( debug,    'key   qual  ',
              ic_k_qual_cols, ic_k_qual_cnt );
        END;
    (*ENDWITH*) 
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a725output_eval (
            debug         : tgg_debug;
            nam           : tsp00_Sname;
            VAR eval_stat : tak70_page_eval_rec);
 
VAR
      ln_len       : integer;
      ln           : tsp00_Line;
 
BEGIN
IF  t01trace(debug)
THEN
    BEGIN
    ln          := a99blankline;
    ln[ 1 ]     := '-';
    ln[ 2 ]     := '-';
    ln_len      := 3;
    g17sname_to_line( nam, ln_len, ln );
    ln[ ln_len + 2 ] := '-';
    ln[ ln_len + 3 ] := '-';
    t01line( debug, ln );
    t01int4( debug, 'cost   pages', eval_stat.pev_cost_pages );
    t01int4( debug, 'result pages', eval_stat.pev_result_pages );
    t01int4( debug, 'result rows ', eval_stat.pev_result_rows );
    t01sname( debug, '------------' );
    END;
(*ENDIF*) 
END;
 
&endif
&ifdef trace
(*------------------------------*) 
 
PROCEDURE
      a725output_one_strat (
            layer           : tgg_debug;
            VAR one_strat   : tak70_one_strat);
 
BEGIN
IF  ( t01trace( layer ) )
THEN
    BEGIN
    t01name( layer, '-- ONE STRATEGY --' );
    t01strat_enum( layer, 'strategy is ',    one_strat.ostr_strategy );
    a725output_colposarr( layer, 'key start   ',
          one_strat.ostr_key_in_range.skir_keystart );
    a725output_colposarr( layer, 'key stop    ',
          one_strat.ostr_key_in_range.skir_keystop );
    IF  one_strat.ostr_strategy in a70glob_key_strats
    THEN
        BEGIN
        IF  one_strat.ostr_strategy = strat_key_in
        THEN
            BEGIN
            t01int4( layer, 'IN stackpos ', one_strat.ostr_key_in_range.skir_IN_SUBQ_stpos );
            t01int4( layer, 'IN elem cnt ', one_strat.ostr_key_in_range.skir_inelemcnt );
            END;
        (*ENDIF*) 
        END
    ELSE
        BEGIN
        IF  one_strat.ostr_strategy in a70glob_inv_strats
        THEN
            BEGIN
            a725output_invstrat( layer, 'inv data    ',
                  one_strat.ostr_inv_in_range );
            END
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    t01int4( ak_strat, 'cost   pages', one_strat.ostr_cost_pages );
    t01int4( ak_strat, 'result pages', one_strat.ostr_result_pages );
    t01int4( ak_strat, 'result rows ', one_strat.ostr_result_rows );
    t01name( layer, '------------------' );
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a725output_gg_strat (
            debug         : tgg_debug;
            nam           : tsp00_Sname;
            VAR gg_strat  : tgg07_StrategyInfo;
            StratInfo_len : tsp_int2);
 
VAR
      _ln_len   : integer;
      _line     : tsp_line;
 
BEGIN
IF  t01trace( debug )
THEN
    BEGIN
    _line   := a99blankline;
    _ln_len := 0;
    g17sname_to_line( nam, _ln_len, _line );
    _ln_len := sizeof( nam ) + 2;
    _line[ _ln_len ] := ':';
    t01line( debug, _line );
    WITH gg_strat DO
        BEGIN
        t01name      (debug, '-- GG STRATEGY ---');
        t01strat_enum(debug, 'strategy    ',    str_strategy          );
        t01treeid    (debug, 'result_id   ',    str_result_id         );
        t01bool      (debug, 'build_result',    str_build_result      );
        t01distinct_kind(debug, 'distinct    ', str_distinc           );
        t01bool      (debug, 'ordering    ',    str_ordering          );
        t01bool      (debug, 'use_rowno   ',    str_use_rowno         );
        t01subq_kind (debug, 'use_subquery',    str_use_subquery      );
        t01bool      (debug, 'corr_single ',    str_corr_single       );
        t01int4      (debug, 'union_kind  ',    str_union_kind        );
        t01bool      (debug, 'res_possible',    str_res_possible      );
        t01bool      (debug, 'use_order   ',    str_use_order         );
        t01qual_kind (debug, 'qual_kind   ',    str_qual_kind         );
        t01int4      (debug, 'cnt_strat   ',    str_cnt_strat         );
        IF  (abs(str_maxresults) >= cgg_valid_rowno_pos)
        THEN
            t01int4(debug, 'maxresults  ',    str_maxresults        )
        ELSE
            BEGIN
            _line   := a99blankline;
            _ln_len := 0;
            g17sname_to_line( 'maxresults  ', _ln_len, _line );
            _line[sizeof(tsp00_Sname) + 2] := ':';
            _ln_len := sizeof( tsp00_Sname ) + 3;
            CASE str_maxresults OF
                cgg_one_record_at_most_internal:
                    BEGIN
                    g17nameto_line( 'one row at most   ', _ln_len, _line );
                    g17nameto_line( ' internal         ', _ln_len, _line );
                    END;
                cgg_one_record_at_most_oracle:
                    BEGIN
                    g17nameto_line( 'one row at most   ', _ln_len, _line );
                    g17nameto_line( ' oracle           ', _ln_len, _line );
                    END;
                cgg_subquery_one_record:
                    g17nameto_line( 'subquery one row  ', _ln_len, _line );
                cgg_no_rowno_predicate:
                    g17nameto_line( 'no ROWNO predicate', _ln_len, _line );
                cgg_at_least_one_record:
                    g17nameto_line( 'at least one row  ', _ln_len, _line );
                OTHERWISE
                    BEGIN
                    g17sname_to_line( 'unknown :   ', _ln_len, _line );
                    _ln_len := _ln_len + 2;
                    g17trimint4_to_line( str_maxresults, _ln_len, _line );
                    END;
                END;
            (*ENDCASE*) 
            t01line( debug, _line );
            END;
        (*ENDIF*) 
        t01int4      (debug, 'foundresults',    str_foundresults      );
        t01int4      (debug, 'key_len     ',    str_key_len           );
        t01int4      (debug, 'rec_len     ',    str_rec_len           );
        t01int4      (debug, 'union_key_cn',str_union_key_cnt_offs    );
        t01bool      (debug, 'search_first',    str_search_first      );
        t01bool      (debug, 'all_files   ',    str_all_files         );
        t01bool      (debug, 'key order   ',    str_key_order_support );
        t01int4      (debug, 'out keyseq  ',    str_out_keyseqlen     );
        IF  StratInfo_len > STRATEGY_START_MXGG07
        THEN
            BEGIN
            a725output_colposarr( debug, 'keystart    ',
                  str_key_in_range.skir_keystart );
            a725output_colposarr( debug, 'keystop     ',
                  str_key_in_range.skir_keystop );
            IF  ( str_strategy in a70glob_inv_strats )
            THEN
                BEGIN
                a725output_invstrat( debug, 'inv data    ', str_inv_in_range );
                END
            ELSE
                BEGIN
                IF  ( str_strategy in a70glob_key_strats )
                THEN
                    BEGIN
                    IF  str_strategy in
                        [ strat_key_in, strat_key_equal_sub, strat_key_range_sub ]
                    THEN
                        BEGIN
                        t01int4( debug, 'IN/SUBQ stpo', str_key_in_range.skir_IN_SUBQ_stpos );
                        t01int4( debug, 'inelemcnt   ', str_key_in_range.skir_inelemcnt );
                        END;
                    (*ENDIF*) 
                    END
                ELSE
                    BEGIN
                    t01strat_enum(debug, 'unknown stra', str_strategy );
                    END;
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        t01name( debug, '------------------' );
        END
    (*ENDWITH*) 
    END;
(*ENDIF*) 
END;
 
&endif
&ifdef trace
(*------------------------------*) 
 
PROCEDURE
      a725output_colposarr (
            debug       : tgg_debug;
            nam         : tsp00_Sname;
            VAR keypos  : tgg07_ColPosArr);
 
BEGIN
IF  t01trace( debug )
THEN
    BEGIN
    a725output_colposarr_ex( debug, nam, keypos, MAX_STRATEGY_KEYS_GG00 );
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a725output_colposarr_ex (
            debug       : tgg_debug;
            nam         : tsp00_Sname;
            VAR keypos  : tgg07_ColPosArr;
            length      : tsp_int2);
 
VAR
      _ix       : tsp_int2;
      _ln_len   : integer;
      _line     : tsp_line;
 
BEGIN
IF  t01trace( debug )
THEN
    BEGIN
    _line   := a99blankline;
    _ln_len := 0;
    g17sname_to_line( nam, _ln_len, _line );
    _ln_len := sizeof( nam ) + 2;
    _line[ _ln_len ] := ':';
    _ln_len := _ln_len + 2;
    IF  length = 0
    THEN
        BEGIN
        g17sname_to_line( 'NONE        ', _ln_len, _line );
        END
    ELSE
        FOR _ix := 0 TO length - 1 DO
            BEGIN
            g17trimint4_to_line( keypos[ _ix ], _ln_len, _line );
            _ln_len := succ( _ln_len );
            IF  ( _ln_len > 70 ) AND ( _ix < MAX_COLPOSARR_IDX_GG07 )
            THEN
                BEGIN
                t01line( debug, _line );
                _line := a99blankline;
                _ln_len := sizeof( nam ) + 4;
                END
            (*ENDIF*) 
            END;
        (*ENDFOR*) 
    (*ENDIF*) 
    t01line( debug, _line );
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak725output_keyaccess (
            debug           : tgg_debug;
            nam             : tsp00_Sname;
            VAR keyaccess   : tak70_key_access);
 
VAR
      _ln_len   : integer;
      _line     : tsp_line;
 
BEGIN
IF  t01trace( debug )
THEN
    BEGIN
    _line   := a99blankline;
    _ln_len := 0;
    g17sname_to_line( nam, _ln_len, _line );
    _ln_len := sizeof( nam ) + 2;
    _line[ _ln_len ] := ':';
    t01line( debug, _line );
    a725output_colposarr_ex( debug, 'start fields',
          keyaccess.ka_startfields, keyaccess.ka_startcnt );
    a725output_colposarr_ex( debug, 'stop fields ',
          keyaccess.ka_stopfields, keyaccess.ka_stopcnt );
    IF  keyaccess.ka_infield.in_stpos <> 0
    THEN
        BEGIN
        t01int4( debug, 'IN stack pos', keyaccess.ka_infield.in_stpos );
        t01int4( debug, 'IN elem cnt ', keyaccess.ka_infield.in_elemcnt );
        END;
    (*ENDIF*) 
    END;
(*ENDIF*) 
END;
 
&endif
&ifdef trace
(*------------------------------*) 
 
PROCEDURE
      a725output_invposarr (
            debug       : tgg_debug;
            nam         : tsp00_Sname;
            VAR invpos  : tak70_Invposarr);
 
BEGIN
IF  t01trace( debug )
THEN
    BEGIN
    ak725output_invposarr_ex( debug, nam, invpos, MAX_QUALIFICATIONS_GG00 );
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak725output_invposarr_ex (
            debug       : tgg_debug;
            nam         : tsp00_Sname;
            VAR invpos  : tak70_Invposarr;
            length      : tsp_int2);
 
VAR
      _ix       : tsp_int2;
      _ln_len   : integer;
      _line     : tsp_line;
 
BEGIN
IF  t01trace( debug )
THEN
    BEGIN
    _line   := a99blankline;
    _ln_len := 0;
    g17sname_to_line( nam, _ln_len, _line );
    _ln_len := sizeof( nam ) + 2;
    _line[ _ln_len ] := ':';
    _ln_len := _ln_len + 2;
    IF  length = 0
    THEN
        BEGIN
        g17sname_to_line( 'NONE        ', _ln_len, _line );
        END
    ELSE
        FOR _ix := 0 TO length - 1 DO
            BEGIN
            g17trimint4_to_line( invpos[ _ix ], _ln_len, _line );
            _ln_len := succ( _ln_len );
            IF  ( _ln_len > 70 ) AND ( _ix < length - 1 )
            THEN
                BEGIN
                t01line( debug, _line );
                _line := a99blankline;
                _ln_len := sizeof( nam ) + 4;
                END
            (*ENDIF*) 
            END;
        (*ENDFOR*) 
    (*ENDIF*) 
    t01line( debug, _line );
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak725output_invinposarr_ex (
            debug       : tgg_debug;
            nam         : tsp00_Sname;
            VAR invpos  : tak70_InvInposarr;
            length      : tsp_int2);
 
VAR
      _ix       : tsp_int2;
      _ln_len   : integer;
      _line     : tsp_line;
 
BEGIN
IF  t01trace( debug )
THEN
    BEGIN
    _line   := a99blankline;
    _ln_len := 0;
    g17sname_to_line( nam, _ln_len, _line );
    _ln_len := sizeof( nam ) + 2;
    _line[ _ln_len ] := ':';
    _ln_len := _ln_len + 2;
    IF  length = 0
    THEN
        BEGIN
        g17sname_to_line( 'NONE        ', _ln_len, _line );
        END
    ELSE
        FOR _ix := 0 TO length - 1 DO
            BEGIN
            g17trimint4_to_line( invpos[ _ix ].in_stpos, _ln_len, _line );
            _ln_len := succ( _ln_len );
            _line[ _ln_len ] := '[';
            _ln_len := succ( _ln_len );
            g17trimint4_to_line( invpos[ _ix ].in_elemcnt, _ln_len, _line );
            _ln_len := succ( _ln_len );
            _line[ _ln_len ] := ']';
            _ln_len := succ( _ln_len );
            IF  ( _ln_len > 70 ) AND ( _ix < length - 1 )
            THEN
                BEGIN
                t01line( debug, _line );
                _line := a99blankline;
                _ln_len := sizeof( nam ) + 4;
                END
            (*ENDIF*) 
            END;
        (*ENDFOR*) 
    (*ENDIF*) 
    t01line( debug, _line );
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak725output_invaccess (
            debug           : tgg_debug;
            nam             : tsp00_Sname;
            VAR invaccess   : tak70_index_access);
 
VAR
      _ln_len   : integer;
      _line     : tsp_line;
 
BEGIN
IF  t01trace( debug )
THEN
    BEGIN
    _line   := a99blankline;
    _ln_len := 0;
    g17sname_to_line( nam, _ln_len, _line );
    _ln_len := sizeof( nam ) + 2;
    _line[ _ln_len ] := ':';
    t01line( debug, _line );
    ak725output_invposarr_ex( debug, 'start fields',
          invaccess.ia_startfields, invaccess.ia_startcnt );
    ak725output_invposarr_ex( debug, 'stop fields ',
          invaccess.ia_stopfields, invaccess.ia_stopcnt );
    ak725output_invinposarr_ex( debug, 'in fields   ',
          invaccess.ia_infields, invaccess.ia_incnt );
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak725output_colsequence_ex (
            debug       : tgg_debug;
            nam         : tsp00_Sname;
            VAR colseq  : tak_colsequence;
            length      : tsp_int2);
 
VAR
      _ix       : tsp_int2;
      _ln_len   : integer;
      _line     : tsp_line;
 
BEGIN
IF  t01trace( debug )
THEN
    BEGIN
    _line   := a99blankline;
    _ln_len := 0;
    g17sname_to_line( nam, _ln_len, _line );
    _ln_len := sizeof( nam ) + 2;
    _line[ _ln_len ] := ':';
    _ln_len := _ln_len + 2;
    IF  length = 0
    THEN
        BEGIN
        g17sname_to_line( 'NONE        ', _ln_len, _line );
        END
    ELSE
        FOR _ix := 1 TO length DO
            BEGIN
            g17trimint4_to_line( colseq[ _ix ], _ln_len, _line );
            _ln_len := succ( _ln_len );
            IF  ( _ln_len > 70 ) AND ( _ix < MAX_COL_SEQUENCE_GG00 )
            THEN
                BEGIN
                t01line( debug, _line );
                _line := a99blankline;
                _ln_len := sizeof( nam ) + 4;
                END
            (*ENDIF*) 
            END;
        (*ENDFOR*) 
    (*ENDIF*) 
    t01line( debug, _line );
    END;
(*ENDIF*) 
END;
 
&endif
&ifdef trace
(*------------------------------*) 
 
PROCEDURE
      a725output_invstrat(
            debug         : tgg_debug;
            nam           : tsp00_Sname;
            VAR inv_strat : tgg07_StrInvInRange);
 
VAR
      _ln_len   : integer;
      _line     : tsp_line;
 
BEGIN
IF  t01trace( debug )
THEN
    BEGIN
    _line   := a99blankline;
    _ln_len := 0;
    g17sname_to_line( nam, _ln_len, _line );
    _ln_len := sizeof( nam ) + 2;
    _line[ _ln_len ] := ':';
    _ln_len := _ln_len + 2;
    t01line (debug, _line );
    WITH inv_strat DO
        BEGIN
        t01name( debug, '------------------');
        t01int4( debug, 'index_no    ', inv_strat.siir_indexno );
        t01int4( debug, 'icount      ', inv_strat.siir_icount );
        IF  ( isp_unique_idx in inv_strat.siir_strat_props )
        THEN
            t01sname( debug, 'iunique     ' );
        (*ENDIF*) 
        t01int4( debug, 'invlen      ', inv_strat.siir_invlen );
        IF  ( isp_inv_only in inv_strat.siir_strat_props )
        THEN
            t01sname( debug, 'inv only    ' );
        (*ENDIF*) 
        ak725InvColSet( debug, 'invcoldesc  ', inv_strat.siir_invcoldesc );
        IF  ( isp_exact_match in inv_strat.siir_strat_props )
        THEN
            t01sname( debug, 'exact match ' );
        (*ENDIF*) 
        t01int4( debug, 'IN/SUBQ stpo', inv_strat.siir_IN_SUBQ_stpos );
        t01int4( debug, 'inelemcnt   ', inv_strat.siir_inelemcnt );
        t01int4( debug, 'subq idx    ', inv_strat.siir_subq_idx );
        t01int4( debug, 'out invseq  ', inv_strat.siir_out_invseqlen );
        IF  ( isp_order_support in inv_strat.siir_strat_props )
        THEN
            t01sname( debug, 'order suppor' );
        (*ENDIF*) 
        IF  ( isp_listmerge_allowed in inv_strat.siir_strat_props )
        THEN
            t01sname( debug, 'merge possib' );
        (*ENDIF*) 
        a725output_colposarr_ex( debug, 'inv start   ',
              inv_strat.siir_invstart, inv_strat.siir_startcnt );
        a725output_colposarr_ex( debug, 'inv stop    ',
              inv_strat.siir_invstop, inv_strat.siir_stopcnt );
        END;
    (*ENDWITH*) 
    END;
(*ENDIF*) 
END;
 
&endif
&ifdef trace
(*------------------------------*) 
 
PROCEDURE
      a725output_end_strat(
            debug             : tgg_debug;
            nam               : tsp00_Sname;
            VAR gg_strategy   : tgg07_StrategyInfo;
            VAR eval_info     : tak70_page_eval_rec;
            VAR StratInfo_len : tsp_int2);
 
VAR
      ln     : tsp00_Line;
      ln_len : integer;
 
BEGIN
ln          := a99blankline;
ln[ 1 ]     := '-';
ln[ 2 ]     := '-';
ln_len      := 3;
g17sname_to_line( nam, ln_len, ln );
ln[ ln_len + 2 ] := '-';
ln[ ln_len + 3 ] := '-';
t01line( debug, ln );
t01strat_enum( debug, 'strategy    ', gg_strategy.str_strategy );
a725output_gg_strat( debug, 'strat data  ', gg_strategy, StratInfo_len );
t01int4( debug, 'strategy len', StratInfo_len );
a725output_eval( debug, 'eval info   ', eval_info );
END;
 
(*------------------------------*) 
 
PROCEDURE
      a725output_config (
            debug   : tgg00_Debug;
            config  : tak70_configuration);
 
VAR
      _first_entry  : boolean;
      _ln_len       : integer;
      _ln           : tsp00_Line;
      _msg          : tsp00_Sname;
 
BEGIN
IF  ( t01trace( debug ) )
THEN
    BEGIN
    t01name( debug, '----- CONFIG -----' );
    _first_entry := true;
    (**************************************)
    (* trace, indexaccess, keyaccess, keyscan, indexscan *)
    _ln           := a99blankline;
    _ln_len       := 0;
    IF  ( cs_trace in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'trace       ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( cs_indexaccess in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'indexaccess ', _ln_len, _ln );
        IF  ( config.cfg_indexno <> 0 )
        THEN
            BEGIN
            _ln_len := succ( _ln_len );
            _msg := 'indexno:    ';
            g17sname_to_line( _msg, _ln_len, _ln );
            _ln_len := succ( _ln_len );
            g17trimint4_to_line( config.cfg_indexno, _ln_len, _ln );
            END;
        (*ENDIF*) 
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( cs_keyaccess in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'keyaccess   ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( cs_keyscan in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'keyscan     ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( cs_indexscan in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'indexscan   ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    t01write_line( _ln );
    _first_entry := true;
    (**************************************)
    (* disable_inv_only, check order, count records, costcheck *)
    _ln          := a99blankline;
    _ln_len      := 0;
    IF  ( cs_disable_inv_only in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'dis invonly ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( cs_check_order in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'check order ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( cs_count_records in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'count record', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( cs_costcheck in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'cost check  ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    t01write_line( _ln );
    _first_entry := true;
    (**************************************)
    (* enable merge, build result *)
    _ln          := a99blankline;
    _ln_len      := 0;
    IF  ( cs_enable_merge in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'enable merge', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( cs_build_result in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'buildresult ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    t01write_line( _ln );
    _first_entry := true;
    (**************************************)
    (* L1 strat, L2 strat, L2more strat, L2rnge strat, L2 no optim *)
    _ln          := a99blankline;
    _ln_len      := 0;
    IF  ( cs_L1_strategy in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'L1 strat    ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( cs_L2_strategy in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'L2 strat    ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( cs_L2_more_strategies in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'L2more strat', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( cs_L2_range_strategy in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'L2rnge strat', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( cs_L2_strat_no_optim in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'L2 no optim ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    t01write_line( _ln );
    _first_entry := true;
    (**************************************)
    (* IN strat, SUBQ strat *)
    _ln          := a99blankline;
    _ln_len      := 0;
    IF  ( cs_IN_strategy in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'IN strat    ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( cs_SUBQ_strategy in config.cfg_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'SUBQ strat  ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    t01write_line( _ln );
    _first_entry := true;
    (**************************************)
    t01name( debug, '------------------' );
    END
(*ENDIF*) 
END;
 
&endif
&ifdef trace
(*------------------------------*) 
 
PROCEDURE
      a725output_more_strat(
            VAR acv         : tak_all_command_glob;
            debug           : tgg00_Debug;
            VAR gg_strategy : tgg07_StrategyInfo;
            VAR all_strats  : tak70_all_strat);
 
VAR
      _iy            : tsp_int2;
      _ix            : tsp_int2;
      _one_strat     : tak70_one_strat;
      _err           : tgg00_BasisError;
      _StratInfo_len : tsp_int2;
 
      _str       : RECORD
            CASE boolean OF
                true  :
                    (strat_char : tsp_c1);
                false :
                    (strat_enum : tgg07_StratEnum);
                END;
            (*ENDCASE*) 
 
 
BEGIN
IF  ( t01trace( debug ) )
THEN
    BEGIN
    a725output_gg_strat( debug, 'invariant   ', gg_strategy,
          STRATEGY_START_MXGG07 );
    t01int4( debug, 'strat count ', all_strats.ast_cntstrats );
    t01int4( debug, 'cost   pages', all_strats.ast_cost_pages );
    t01int4( debug, 'result pages', all_strats.ast_result_pages );
    IF  ( all_strats.ast_cntstrats > 1 )
    THEN
        BEGIN
        _err := e_ok;
        _iy  := 1;
        WHILE ( _iy <= all_strats.ast_cntstrats ) AND ( _err = e_ok ) DO
            BEGIN
            t01int4( debug, 'one stratpos',
                  all_strats.ast_strats[ _iy ].osr_stratpos );
            _str.strat_char[ 1 ] := acv.a_mblock.mb_strat^[
                  all_strats.ast_strats[ _iy ].osr_stratpos ];
            _one_strat.ostr_cost_pages  := 0;
            _one_strat.ostr_strategy    := _str.strat_enum;
            _StratInfo_len := all_strats.ast_strats[ _iy ].osr_stratlen;
            t01int4( debug, 'stratlen 1  ', _StratInfo_len );
            t01int4( debug, 'stratlen 2  ',
                  ord( acv.a_mblock.mb_strat^[
                  all_strats.ast_strats[ _iy ].osr_stratpos + 1 ] ) );
            FOR _ix := 1 TO MAX_COLPOSARR_IDX_GG07 DO
                BEGIN
                _one_strat.ostr_key_in_range.skir_keystart[ _ix ] := 0;
                _one_strat.ostr_key_in_range.skir_keystop [ _ix ] := 0;
                END;
            (*ENDFOR*) 
            g10mv2 ('VAK725',   1,    
                  acv.a_mblock.mb_strat_size, sizeof( _one_strat.ostr_raw ),
                  acv.a_mblock.mb_strat^,
                  all_strats.ast_strats[ _iy ].osr_stratpos + 2,
                  _one_strat.ostr_raw, 1,
                  _StratInfo_len,
                  _err);
            IF  ( _err = e_ok )
            THEN
                a725output_one_strat( debug, _one_strat );
            (*ENDIF*) 
            _iy := succ( _iy );
            END;
        (*ENDWHILE*) 
        IF  ( _err <> e_ok )
        THEN
            t01basis_error( debug, 'error occure', _err );
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak725InvColSet (
            debug           : tgg00_Debug;
            nam             : tsp00_Sname;
            invcolset       : tgg07_InvColSet);
 
VAR
      _ix       : tsp_int2;
      _ln_len   : integer;
      _line     : tsp_line;
 
BEGIN
IF  t01trace( debug )
THEN
    BEGIN
    _line   := a99blankline;
    _ln_len := 0;
    g17sname_to_line( nam, _ln_len, _line );
    _ln_len := sizeof( nam ) + 2;
    _line[ _ln_len ] := ':';
    _ln_len := _ln_len + 2;
    IF  ( invcolset = [] )
    THEN
        BEGIN
        g17sname_to_line( 'EMPTY       ', _ln_len, _line );
        END
    ELSE
        FOR _ix := 1 TO MAX_COL_SEQUENCE_GG00 DO
            BEGIN
            IF  ( _ix in invcolset )
            THEN
                BEGIN
                g17trimint4_to_line( _ix, _ln_len, _line );
                _ln_len := succ( _ln_len );
                IF  ( _ln_len > 70 ) AND ( _ix < MAX_COL_SEQUENCE_GG00 )
                THEN
                    BEGIN
                    t01line( debug, _line );
                    _line   := a99blankline;
                    _ln_len := sizeof( nam ) + 4;
                    END
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            END;
        (*ENDFOR*) 
    (*ENDIF*) 
    t01line( debug, _line );
    END;
(*ENDIF*) 
END;
 
&endif
&ifdef trace
(*------------------------------*) 
 
PROCEDURE
      a725output_explain(
            debug    : tgg_debug;
            VAR expl : tak_explain_rec);
 
VAR
      flags   : tsp00_Sname;
 
BEGIN
IF  t01trace( debug )
THEN
    BEGIN
    t01knl_identifier( debug, 'USER        ', expl.exp_user );
    t01knl_identifier( debug, 'TABLE       ', expl.exp_table );
    t01knl_identifier( debug, 'COLUMN      ', expl.exp_column );
    t01c40( debug , expl.exp_strat );
    t01int4( debug, 'PAGECOUNT   ', expl.exp_pagecount );
    flags := '|          |';
    flags[ 2  ] := expl.exp_only_index[ 1 ];
    flags[ 5  ] := expl.exp_distinct_opt[ 1 ];
    flags[ 8  ] := expl.exp_temp_inv[ 1 ];
    flags[ 11 ] := expl.exp_more_qual[ 1 ];
    t01sname( debug, flags );
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a725output_query_prop (
            debug   : tgg00_Debug;
            qprop   : tak70_query_properties);
 
VAR
      _first_entry  : boolean;
      _ln_len       : integer;
      _ln           : tsp00_Line;
 
BEGIN
IF  ( t01trace( debug ) )
THEN
    BEGIN
    t01name( debug, '--- QUERY PROP ---' );
    _first_entry := true;
    (**************************************)
    (* qp_build_result, qp_no_result_set, qp_exact_match, qp_missing_value *)
    _ln           := a99blankline;
    _ln_len       := 0;
    IF  ( qp_build_result in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'buildresult ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( qp_no_result_set in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'no result   ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( qp_exact_match in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'exact match ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( qp_missing_value in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'missing valu', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    t01write_line( _ln );
    _first_entry := true;
    (**************************************)
    (* qp_exact_IN_SUBQ_match *)
    _ln          := a99blankline;
    _ln_len      := 0;
    IF  ( qp_exact_IN_SUBQ_match in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'exact INSUBQ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    t01write_line( _ln );
    _first_entry := true;
    (**************************************)
    (* qp_given_rescnt, qp_given_rescnt_param, qp_inv_only_impossible, qp_exact_IN_SUBQ_match *)
    _ln          := a99blankline;
    _ln_len      := 0;
    IF  ( qp_given_rescnt in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'gvn rescnt: ', _ln_len, _ln );
        _ln_len := succ( _ln_len );
        g17trimint4_to_line( qprop.qps_rescnt, _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( qp_given_rescnt_param in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'rescnt param', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( qp_inv_only_impossible in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'invo imposs ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    t01write_line( _ln );
    _first_entry := true;
    (**************************************)
    (* qp_IN_usage_start, qp_IN_usage_stop, qp_IN_usage   *)
    (* qp_SUBQ_usage_start, qp_SUBQ_usage_stop, qp_SUBQ_usage *)
    _ln          := a99blankline;
    _ln_len      := 0;
    IF  ( qp_SUBQ_usage_start in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'SUBQ start  ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( qp_SUBQ_usage_stop in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'SUBQ stop   ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( qp_SUBQ_usage in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'SUBQ usage  ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( qp_IN_usage_start in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'IN start    ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( qp_IN_usage_stop in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'IN stop     ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    IF  ( qp_IN_usage in qprop.qps_switches )
    THEN
        BEGIN
        IF  ( NOT _first_entry )
        THEN
            BEGIN
            _ln[ _ln_len + 1 ] := ',';
            _ln_len := _ln_len + 2;
            END;
        (*ENDIF*) 
        g17sname_to_line( 'IN usage    ', _ln_len, _ln );
        _first_entry  := false;
        END;
    (*ENDIF*) 
    t01write_line( _ln );
    _first_entry := true;
    (**************************************)
    t01name( debug, '------------------' );
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a725output_col_cluster (
            debug           : tgg_debug;
            nam             : tsp00_Sname;
            VAR col_cluster : tak70_sort_col_arr;
            array_len       : tsp_int2);
 
VAR
      _ix       : tsp_int2;
      _colpos   : tsp_int2;
      _colcnt   : tsp_int2;
      _ln_len   : integer;
      _line     : tsp00_Line;
 
BEGIN
IF  t01trace( debug )
THEN
    BEGIN
    _line   := a99blankline;
    _ln_len := 0;
    g17sname_to_line( nam, _ln_len, _line );
    _ln_len := sizeof( nam ) + 2;
    _line[ _ln_len ] := ':';
    _colpos := 0;
    _colcnt := 0;
    _ix     := 1;
    IF  ( array_len = 0 ) OR ( array_len = IS_UNDEFINED_GG07 )
    THEN
        BEGIN
        g17sname_to_line( '  NONE      ', _ln_len, _line );
        END
    ELSE
        WHILE _ix <= array_len DO
            BEGIN
            IF  _colpos = col_cluster[ _ix ].col_id
            THEN
                BEGIN
                IF  col_cluster[ _ix ].col_stpos <> 0
                THEN
                    CASE col_cluster[ _ix ].col_eop OF
                        op_eq, op_eq_all:
                            BEGIN
                            IF  _ln_len + 12 <= sizeof( tsp00_Line )
                            THEN
                                BEGIN
                                IF  col_cluster[ _ix ].col_eop = op_eq_all
                            THEN
                                    BEGIN
                                    g17nameto_line( 'all               ', _ln_len, _line );
                                    _ln_len := succ(_ln_len);
                                    END;
                                (*ENDIF*) 
                                IF  NOT col_cluster[ _ix ].col_subq
                                THEN
                                    BEGIN
                                    _line[ _ln_len + 1 ] := '=';
                                    _line[ _ln_len + 2 ] := '(';
                                    _ln_len := _ln_len + 2;
                                    g17trimint4_to_line( col_cluster[ _ix ].col_stpos,
                                          _ln_len, _line );
                                    _line[ _ln_len + 1 ] := ')';
                                    _ln_len := _ln_len + 2;
                                    END
                                ELSE
                                    BEGIN
                                    _line[ _ln_len + 1 ] := 'S';
                                    _line[ _ln_len + 2 ] := 'U';
                                    _line[ _ln_len + 3 ] := 'B';
                                    _line[ _ln_len + 4 ] := 'Q';
                                    _line[ _ln_len + 5 ] := '(';
                                    _ln_len := _ln_len + 5;
                                    g17trimint4_to_line( col_cluster[ _ix ].col_stpos,
                                          _ln_len, _line );
                                    _line[ _ln_len + 1 ] := ')';
                                    _ln_len := _ln_len + 2;
                                    END;
                                (*ENDIF*) 
                                END;
                            (*ENDIF*) 
                            END;
                        op_gt:
                            BEGIN
                            IF  _ln_len + 8 <= sizeof( tsp00_Line )
                            THEN
                                BEGIN
                                _line[ _ln_len + 1 ] := '>';
                                _line[ _ln_len + 2 ] := '(';
                                _ln_len := _ln_len + 2;
                                g17trimint4_to_line( col_cluster[ _ix ].col_stpos,
                                      _ln_len, _line );
                                _line[ _ln_len + 1 ] := ')';
                                _ln_len := _ln_len + 2;
                                END;
                            (*ENDIF*) 
                            END;
                        op_ge:
                            BEGIN
                            IF  _ln_len + 9 <= sizeof( tsp00_Line )
                            THEN
                                BEGIN
                                _line[ _ln_len + 1 ] := '>';
                                _line[ _ln_len + 2 ] := '=';
                                _line[ _ln_len + 3 ] := '(';
                                _ln_len := _ln_len + 3;
                                g17trimint4_to_line( col_cluster[ _ix ].col_stpos,
                                      _ln_len, _line );
                                _line[ _ln_len + 1 ] := ')';
                                _ln_len := _ln_len + 2;
                                END;
                            (*ENDIF*) 
                            END;
                        op_lt:
                            BEGIN
                            IF  _ln_len + 8 <= sizeof( tsp00_Line )
                            THEN
                                BEGIN
                                _line[ _ln_len + 1 ] := '<';
                                _line[ _ln_len + 2 ] := '(';
                                _ln_len := _ln_len + 2;
                                g17trimint4_to_line( col_cluster[ _ix ].col_stpos,
                                      _ln_len, _line );
                                _line[ _ln_len + 1 ] := ')';
                                _ln_len := _ln_len + 2;
                                END;
                            (*ENDIF*) 
                            END;
                        op_le:
                            BEGIN
                            IF  _ln_len + 9 <= sizeof( tsp00_Line )
                            THEN
                                BEGIN
                                _line[ _ln_len + 1 ] := '<';
                                _line[ _ln_len + 2 ] := '=';
                                _line[ _ln_len + 3 ] := '(';
                                _ln_len := _ln_len + 3;
                                g17trimint4_to_line( col_cluster[ _ix ].col_stpos,
                                      _ln_len, _line );
                                _line[ _ln_len + 1 ] := ')';
                                _ln_len := _ln_len + 2;
                                END;
                            (*ENDIF*) 
                            END;
                        op_between:
                            IF  _ln_len + 11 <= sizeof( tsp00_Line )
                            THEN
                                BEGIN
                                g17sname_to_line( 'BTWN        ', _ln_len, _line );
                                _line[ _ln_len + 1 ] := '(';
                                _ln_len := succ( _ln_len );
                                g17trimint4_to_line( col_cluster[ _ix ].col_stpos,
                                      _ln_len, _line );
                                _line[ _ln_len + 1 ] := ')';
                                _ln_len := _ln_len + 2;
                                END;
                            (*ENDIF*) 
                        op_like:
                            IF  _ln_len + 11 <= sizeof( tsp00_Line )
                            THEN
                                BEGIN
                                g17sname_to_line( 'LIKE        ', _ln_len, _line );
                                _line[ _ln_len + 1 ] := '(';
                                _ln_len := succ( _ln_len );
                                g17trimint4_to_line( col_cluster[ _ix ].col_stpos,
                                      _ln_len, _line );
                                _line[ _ln_len + 1 ] := ')';
                                _ln_len := _ln_len + 2;
                                END;
                            (*ENDIF*) 
                        op_in:
                            IF  _ln_len + 8 <= sizeof( tsp00_Line )
                            THEN
                                BEGIN
                                g17sname_to_line( 'IN          ', _ln_len, _line );
                                _line[ _ln_len + 1 ] := '(';
                                _ln_len := succ( _ln_len );
                                g17trimint4_to_line( col_cluster[ _ix ].col_stpos,
                                      _ln_len, _line );
                                _line[ _ln_len + 1 ] := ')';
                                _ln_len := _ln_len + 2;
                                END;
                            (*ENDIF*) 
                        OTHERWISE
                            BEGIN
                            IF  _ln_len + 8 <= sizeof( tsp00_Line )
                            THEN
                                BEGIN
                                _line[ _ln_len + 1 ] := '?';
                                _line[ _ln_len + 2 ] := '(';
                                _ln_len := _ln_len + 2;
                                g17trimint4_to_line( col_cluster[ _ix ].col_stpos,
                                      _ln_len, _line );
                                _line[ _ln_len + 1 ] := ')';
                                _ln_len := _ln_len + 2;
                                END;
                            (*ENDIF*) 
                            END;
                        END;
                    (*ENDCASE*) 
                (*ENDIF*) 
                _ix := succ( _ix );
                END
            ELSE
                BEGIN
                t01line (debug, _line );
                _colcnt := succ( _colcnt );
                _colpos := col_cluster[ _ix ].col_id;
                _line   := a99blankline;
                _ln_len := 0;
                g17sname_to_line( 'Key         ', _ln_len, _line );
                _ln_len := succ( _ln_len );
                g17trimint4_to_line( _colcnt, _ln_len, _line );
                _ln_len := _ln_len + 2;
                _line[ _ln_len ] := ':';
                _ln_len := _ln_len + 2;
                END;
            (*ENDIF*) 
            END;
        (*ENDWHILE*) 
    (*ENDIF*) 
    t01line (debug, _line );
    END;
(*ENDIF*) 
END;
 
&endif
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
*-PRETTY-*  statements    :        711
*-PRETTY-*  lines of code :       1745        PRETTYX 3.10 
*-PRETTY-*  lines in file :       2072         1997-12-10 
.PA 
