.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, 1999
SAP Database Technology
 
Release :      Date : 2000-04-11
*****************************************************
modname : VAK685
changed : 2000-04-11
module  : Join2_Select_help_routines
 
Author  : ElkeZ
Created : 1985-10-16
Pretty  : 2002-08-23
*****************************************************
 
Purpose : This module completes the Join messbuffers that have
          been half-built by VAK680
 
Define  :
 
        PROCEDURE
              a685next_key_length (
                    VAR dmli   : tak_dml_info;
                    VAR jinfos : tak68_joininfos);
 
        PROCEDURE
              a685last_key_len (
                    VAR acv     : tak_all_command_glob;
                    VAR jinfos  : tak68_joininfos;
                    VAR key_pos : tsp_int2);
 
        PROCEDURE
              a685olast_order_fields (
                    VAR acv     : tak_all_command_glob;
                    VAR jinfos  : tak68_joininfos;
                    VAR njrec   : tgg07_NextJoins);
 
        PROCEDURE
              a685pack_record (
                    VAR acv    : tak_all_command_glob;
                    pos        : integer;
                    VAR dmli   : tak_dml_info;
                    VAR jinfos : tak68_joininfos;
                    mj_pos     : integer);
 
        FUNCTION
              a685stentry_found_in_outplist (
                    VAR jinfos : tak68_joininfos;
                    VAR mj_pos : integer;
                    VAR dmli   : tak_dml_info;
                    VAR st_en  : tgg_stack_entry) : boolean;
 
        PROCEDURE
              a685set_st_type (
                    VAR st : tgg_stack_entry;
                    outpos : integer);
 
        PROCEDURE
              a685copy_old_output_fields (
                    VAR acv          : tak_all_command_glob;
                    VAR dmli         : tak_dml_info;
                    VAR jinfos       : tak68_joininfos;
                    outer_join_activ : boolean);
 
        PROCEDURE
              a685clast_copy_old_outp_fields (
                    VAR acv          : tak_all_command_glob;
                    VAR dmli         : tak_dml_info;
                    VAR jinfos       : tak68_joininfos;
                    VAR r_len        : tsp_int2;
                    outer_join_activ : boolean);
 
        FUNCTION
              a685evaluate_new_ecol_pos (
                    VAR dmli      : tak_dml_info;
                    VAR jinfos    : tak68_joininfos;
                    curr_st_entry : integer;
                    len_var       : integer) : integer;
 
        PROCEDURE
              a685build_next_key (
                    VAR acv    : tak_all_command_glob;
                    VAR dmli   : tak_dml_info;
                    VAR jinfos : tak68_joininfos);
 
        PROCEDURE
              a685kcopy_keyfields (
                    VAR acv    : tak_all_command_glob;
                    VAR dmli   : tak_dml_info;
                    VAR jinfos : tak68_joininfos);
 
.CM *-END-* define --------------------------------------
Use     :
 
        FROM
              Kernel_move_and_fill : VGG10;
 
        PROCEDURE
              g10mv (mod_id      : tsp_c6;
                    mod_intern_num : tsp_int4;
                    source_upb     : tsp_int4;       destin_upb : tsp_int4;
                    VAR source     : tgg_stack_list; source_pos : tsp_int4;
                    VAR destin     : tgg_stack_list; destin_pos : tsp_int4;
                    length         : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mvr (mod_id      : tsp_c6;
                    mod_intern_num : tsp_int4;
                    source_upb     : tsp_int4;       destin_upb : tsp_int4;
                    VAR source     : tgg_stack_list; source_pos : tsp_int4;
                    VAR destin     : tgg_stack_list; destin_pos : tsp_int4;
                    length         : tsp_int4;
                    VAR e          : tgg_basis_error);
&       ifdef TRACE
 
      ------------------------------ 
 
        FROM
              join_trace_routines : VAK683;
 
        PROCEDURE
              a683_one_join_entry(
                    debug    : tgg00_Debug;
                    VAR dmli : tak_dml_info;
                    index    : integer);
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01qual1 (debug : tgg00_Debug;
                    nam       : tsp00_Sname;
                    VAR part1 : tgg00_QualBuf);
 
        PROCEDURE
              t01bool (
                    debug    : tgg00_Debug;
                    nam      : tsp00_Sname;
                    curr_bool: boolean);
 
        PROCEDURE
              t01name (
                    debug : tgg00_Debug;
                    nam   : tsp00_Name);
 
        PROCEDURE
              t01stackdesc (debug  : tgg00_Debug;
                    nam            : tsp00_Sname;
                    stack_addr     : tgg00_StackListPtr;
                    VAR stack_desc : tgg00_StackDesc);
 
        PROCEDURE
              t01qual (level : tgg00_Debug;
                    VAR q_buf : tgg00_QualBuf);
 
        PROCEDURE
              t01int4 (debug : tgg00_Debug;
                    nam      : tsp00_Sname;
                    int      : tsp00_Int4);
 
        PROCEDURE
              t01stackentry (layer : tgg00_Debug;
                    VAR st      : tgg00_StackEntry;
                    entry_index : integer);
&       endif
 
.CM *-END-* use -----------------------------------------
Synonym :
 
        PROCEDURE
              g10mv;
 
              tsp_moveobj tgg_stack_list
 
        PROCEDURE
              g10mvr;
 
              tsp_moveobj tgg_stack_list
 
.CM *-END-* synonym -------------------------------------
***********************************************************
Specification:
 
.CM *-END-* specification -------------------------------
***********************************************************
Description:
 
LAST_ORDER_FIELDS.
 
The specification of DISTINCT means that, in each Join step, DISTINCT is
performed for the table that is to be resorted on the right, i.e. that there
must be space in the key for the 2 bytes necessary for this purpose (in
addition to the usual 4 bytes counter).
The number of output stack entries is known; an entry can be made in the
Jump stack entry.
The qualification that has been determined for this table in VAK68 is
transferred to the new Mess-Buffer (GET_QUALIFICATION).
By means of BUILD_STRAT_INFO, the Join strategies are built and are entered
in the Mess-Buffer.
These Join strategies and their storing in the Mess-Buffer are described in
VKB74, Specification.
The Mess-Buffer must now also be stored in 1-2 system information records of
type emessbuf (or evmessbuf for Join Views). Since VAK68 has already created a
half-filled Mess-Buffer (with the qualification), there is already a first
buffer for each table, which just needs to be extended and replaced.
 
A685OLAST_ORDER_FIELDS
 
In the last Join step, fields that were specified in ORDER BY are handled as if
they were necessary in the key for the next Join step, i.e. information on them
is given to KB in njrec.n_j_arr.
In TRANSFER_OUTPUT_FIELDS, in the original Mess-Buffer, it was entered in
ecol_pos in the output stack entries for these ORDER-BY fields at what position
in the info part of the result record they can be found. Information must now
also be built as to from where (see ecol_pos) to where they are to be copied in
the key (old epos entry minus length of the start of the record (=4)). If
sorting is to be descending (op_output_order), the field value must be
converted during copying. The need for conversion is indicated by a negative
jfrom.
.CM *-END-* description ---------------------------------
***********************************************************
.CM -lll-
Code    :
 
 
(*------------------------------*) 
 
PROCEDURE
      a685build_next_key (
            VAR acv    : tak_all_command_glob;
            VAR dmli   : tak_dml_info;
            VAR jinfos : tak68_joininfos);
 
VAR
      _i             : integer;
      _j             : integer;
      _k             : integer;
      _l             : integer;
      _is_join_value : boolean;
 
BEGIN
&ifdef TRACE
t01qual (ak_join, acv.a_mblock.mb_qual^);
t01stackdesc (ak_join, 'ji_stack_des', jinfos.ji_st_addr, jinfos.ji_stack_desc);
t01int4 (ak_join, 'nk_len      ', jinfos.ji_nxtjinfo.nj_nk_len);
&endif
_l := 1;
_i := 0;
WHILE ((_l < jinfos.ji_nxtjinfo.nj_nk_len)
      AND
      (jinfos.ji_nxtjinfo.nj_not_copied_keyfields_cnt > 0)
      AND
      (_i < dmli.d_joins.jrc_cnt)) DO
    BEGIN
&   ifdef TRACE
    t01int4 (ak_join, 'i           ', _i);
    t01int4 (ak_join, 'l           ', _l);
    t01int4 (ak_join, 'jrc_cnt     ', dmli.d_joins.jrc_cnt);
&   endif
    _is_join_value :=
          ( dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ 1 ].jop_tableno =
          jinfos.ji_nxtjinfo.nj_nxttabno )
          AND
          ( dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ 2 ].jop_tableno =
          cak68_join_value );
    FOR _j := 1 TO 2 DO
        IF  (dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _j ].jop_tableno =
            jinfos.ji_nxtjinfo.nj_nxttabno)
        THEN
            BEGIN
            CASE _j OF
                1 :
                    _k := 2;
                2 :
                    _k := 1;
                END;
            (*ENDCASE*) 
            IF  _is_join_value
            THEN
                BEGIN
                _k := 2;
                END;
            (*ENDIF*) 
            WITH dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _k ] DO
                BEGIN
&               ifdef TRACE
                t01int4 (ak_join, 'jop_startsta', jop_startstack);
&               endif
                IF  ((jop_tableno in jinfos.ji_nxtjinfo.nj_left_side)
                    OR
                    (jop_tableno = jinfos.ji_acttabno)
                    OR
                    ( jop_tableno = cak68_join_value))
                THEN
                    BEGIN
&                   ifdef TRACE
                    t01int4 (ak_join, 'l output *w*', _l);
                    t01int4 (ak_join, 'jop_startsta', jop_startstack);
                    t01int4 (ak_join, 'jop_cntstack', jop_cntstack);
                    t01stackentry (ak_join, jinfos.ji_st_addr^[ jop_startstack ],
                          jop_startstack);
&                   endif
                    IF  (jinfos.ji_st_addr^[ jop_startstack ].eop = op_join_key) AND
                        (NOT _is_join_value)
                    THEN
                        BEGIN
                        jinfos.ji_st_addr^[ jop_startstack ].eop := op_none;
                        jinfos.ji_nxtjinfo.nj_not_copied_keyfields_cnt :=
                              pred (jinfos.ji_nxtjinfo.nj_not_copied_keyfields_cnt);
                        jinfos.ji_nxtjinfo.nj_nxt_klen_filled := jinfos.ji_nxtjinfo.nj_nxt_klen_filled +
                              jop_inoutlen;
                        IF  (jop_tableno = jinfos.ji_acttabno)
                        THEN
                            _k := ord (jinfos.ji_st_addr^[ jop_startstack ].ecol_tab[ 1 ])
                        ELSE
                            BEGIN
                            _k := acv.a_mblock.mb_qual^.mfirst_free;
                            IF  jop_outer_join
                            THEN
                                acv.a_mblock.mb_st^[ _k ].eop := op_outer_join
                            ELSE
                                acv.a_mblock.mb_st^[ _k ].eop := op_none;
                            (*ENDIF*) 
                            acv.a_mblock.mb_st^[ _k ].etype    := st_output;
                            acv.a_mblock.mb_st^[ _k ].epos     := jinfos.ji_st_addr^[ jop_startstack ].epos;
                            acv.a_mblock.mb_st^[ _k ].elen_var := jop_inoutlen;
                            acv.a_mblock.mb_st^[ _k ].ecol_pos := 0;
                            acv.a_mblock.mb_qual^.mfirst_free := succ (acv.a_mblock.mb_qual^.mfirst_free);
                            END;
                        (*ENDIF*) 
                        a685set_st_type (acv.a_mblock.mb_st^[ _k ],
                              _l + cgg_rec_key_offset);
                        END
                    ELSE
                        ak685pack_join_output (acv);
                    (*ENDIF*) 
                    _l := _l + jop_inoutlen;
                    END;
                (*ENDIF*) 
                END;
            (*ENDWITH*) 
            END;
        (*ENDIF*) 
    (*ENDFOR*) 
    _i := succ(_i);
    END;
(*ENDWHILE*) 
&ifdef TRACE
t01qual (ak_join, acv.a_mblock.mb_qual^);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      a685clast_copy_old_outp_fields (
            VAR acv          : tak_all_command_glob;
            VAR dmli         : tak_dml_info;
            VAR jinfos       : tak68_joininfos;
            VAR r_len        : tsp_int2;
            outer_join_activ : boolean);
 
VAR
      _stops                : integer;
      _i                    : integer;
      _j                    : integer;
      _fpos                 : integer;
      _tpos                 : integer;
      _is_outer_join_output : boolean;
 
BEGIN
_fpos := 0;
_tpos := 0;
_i    := jinfos.ji_stack_desc.mqual_pos;
_is_outer_join_output := false;
IF  jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].etype = st_jump_output
THEN
    _stops := jinfos.ji_stack_desc.mqual_pos +
          jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].epos - 2
ELSE
    _stops := _i;
(*ENDIF*) 
_i := succ(_i);
_j := acv.a_mblock.mb_qual^.mfirst_free - 1;
&ifdef TRACE
t01int4 (ak_join, 'ji_acttabno ', jinfos.ji_acttabno);
t01int4 (ak_join, 'r_len     = ', r_len);
t01int4 (ak_join, 'j         = ', _j);
t01int4 (ak_join, 'stops     = ', _stops);
t01stackdesc (ak_join, 'ji_stack_des', jinfos.ji_st_addr, jinfos.ji_stack_desc);
&endif
WHILE (_i <= _stops) DO
    (* loop over output columns of original stack *)
    BEGIN
&   ifdef TRACE
    t01int4 (ak_join, 'i vor while ', _i);
    t01stackentry (ak_join, jinfos.ji_st_addr^[ _i ], _i);
&   endif
    (* step to column of i.th tab *)
    WHILE (
          (_i <= _stops)
          AND
          NOT ((jinfos.ji_st_addr^[ _i ].etype
          in [ st_fixcol, st_fixkey, st_varcol, st_varkey, st_varlongchar ]) AND
          ((ord(jinfos.ji_st_addr^[ _i ].ecol_tab[ 2 ])        <> jinfos.ji_acttabno) AND
          ((ord(jinfos.ji_st_addr^[ _i ].ecol_tab[ 2 ]) - 100) <> jinfos.ji_acttabno)))
          ) DO
        _i := succ(_i);
    (*ENDWHILE*) 
&   ifdef TRACE
    t01stackentry (ak_join, jinfos.ji_st_addr^[ _i ], _i);
&   endif
    IF  (_i <= _stops) AND acv.a_outer_join
    THEN
        _is_outer_join_output := outer_join_activ
              AND
              ((ord(jinfos.ji_st_addr^[ _i ].ecol_tab[ 2 ]) in dmli.d_oj_tables)
              OR
              ((ord(jinfos.ji_st_addr^[ _i ].ecol_tab[ 2 ]) - 100) in dmli.d_oj_tables));
    (*ENDIF*) 
    ;
    (* step to output stack entry *)
    WHILE ((_i <= _stops)
          AND
          (NOT (jinfos.ji_st_addr^[ _i ].etype in [ st_output, st_output_join ]))) DO
        _i := succ(_i);
    (*ENDWHILE*) 
    IF  ((_i <= _stops) 
        AND 
        (jinfos.ji_st_addr^[ _i ].etype = st_output_join))
    THEN
        BEGIN
        IF  (_j > 0)
        THEN
            BEGIN
            _fpos := acv.a_mblock.mb_st^[ _j ].elen_var +
                  acv.a_mblock.mb_st^[ _j ].epos;
            _tpos := acv.a_mblock.mb_st^[ _j ].elen_var +
                  acv.a_mblock.mb_st^[ _j ].ecol_pos;
            END;
        (*ENDIF*) 
        IF  ((_j >= acv.a_mblock.mb_qual^.mfirst_free)
            AND
            ((_tpos = jinfos.ji_st_addr^[ _i ].epos)
            AND
            (_fpos = jinfos.ji_st_addr^[ _i ].ecol_pos))
            AND
            (NOT outer_join_activ))
        THEN
            acv.a_mblock.mb_st^[ _j ].elen_var :=
                  acv.a_mblock.mb_st^[ _j ].elen_var +
                  jinfos.ji_st_addr^[ _i ].elen_var
        ELSE
            BEGIN
            g10mv ('VAK685',   1,    
                  (jinfos.ji_stack_desc.mst_max * mxgg_stack_entry),
                  acv.a_mblock.mb_st_size,
                  jinfos.ji_st_addr^, (_i - 1) * mxgg_stack_entry + 1,
                  acv.a_mblock.mb_st^, _j * mxgg_stack_entry + 1,
                  mxgg_stack_entry, acv.a_return_segm^.sp1r_returncode);
            _j := succ(_j);
            acv.a_mblock.mb_st^[ _j ].epos :=
                  acv.a_mblock.mb_st^[ _j ].ecol_pos;
            IF  _is_outer_join_output
            THEN
                acv.a_mblock.mb_st^[ _j ].eop_out := op_o_output_outer_join
            ELSE
                acv.a_mblock.mb_st^[ _j ].eop := op_none;
            (*ENDIF*) 
            acv.a_mblock.mb_st^[ _j ].ecol_pos := jinfos.ji_st_addr^[ _i ].epos;
            END;
        (*ENDIF*) 
        IF  (r_len < (acv.a_mblock.mb_st^[ _j ].ecol_pos +
            acv.a_mblock.mb_st^[ _j ].elen_var))
        THEN
            r_len := acv.a_mblock.mb_st^[ _j ].ecol_pos +
                  acv.a_mblock.mb_st^[ _j ].elen_var - 1;
        (*ENDIF*) 
        IF  (jinfos.ji_st_addr^[ _i ].eop_out IN
            [ op_o_output, op_o_output_no_oflw, op_o_output_order ]) AND
            (jinfos.ji_st_addr^[ _i ].etype in [ st_output, st_output_join ])
        THEN
            jinfos.ji_st_addr^[ _i ].ecol_pos := jinfos.ji_st_addr^[ _i ].epos;
        (*ENDIF*) 
        IF  ((_i < _stops) AND
            (jinfos.ji_st_addr^[ _i ].eop_out = op_o_output_hold) AND
            (jinfos.ji_st_addr^[ _i ].etype in [ st_output, st_output_join ]))
        THEN
            _i := succ(_i); (* skip "order by" & "order by desc" *)
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    _i := succ(_i);
    END;
(*ENDWHILE*) 
acv.a_mblock.mb_qual^.mfirst_free := succ(_j);
&ifdef TRACE
t01qual (ak_join, acv.a_mblock.mb_qual^);
t01stackdesc (ak_join, 'ji_stack_des', jinfos.ji_st_addr, jinfos.ji_stack_desc);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      a685copy_old_output_fields (
            VAR acv          : tak_all_command_glob;
            VAR dmli         : tak_dml_info;
            VAR jinfos       : tak68_joininfos;
            outer_join_activ : boolean);
 
VAR
      _stops                : integer;
      _i                    : integer;
      _j                    : integer;
      _l                    : integer;
      _tpos                 : integer;
      _fpos                 : integer;
      _tab_no               : integer;
      _is_outer_join_output : boolean;
 
BEGIN
(* look for columns in i.th temporary result record which to be copied to *)
(* i+1.th temporary result record *)
(* mark this information as INVISIBLE COLUMNS beween mqual_pos + mqual_cnt *)
(* and mfirst_free *)
_tab_no   := 0;
_tpos     := 0;
_fpos     := 0;
_i        := jinfos.ji_stack_desc.mqual_pos;
_is_outer_join_output := false;
IF  jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].etype = st_jump_output
THEN
    _stops := jinfos.ji_stack_desc.mqual_pos +
          jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].epos - 2
ELSE
    _stops := _i;
(*ENDIF*) 
_i := succ(_i);
_j := acv.a_mblock.mb_qual^.mfirst_free - 1;
&ifdef TRACE
t01int4 (ak_join, 'j         = ', _j);
t01int4 (ak_join, 'stops     = ', _stops);
t01stackdesc (ak_join, 'ji_stack_des', jinfos.ji_st_addr, jinfos.ji_stack_desc);
t01qual (ak_join, acv.a_mblock.mb_qual^);
&endif
WHILE (_i <= _stops) DO
    (* loop over output columns of original stack *)
    BEGIN
    (* step to already processed tables (i-x.th tab ) *)
    WHILE (
          (_i <= _stops)
          AND
          (NOT
          ((jinfos.ji_st_addr^[ _i ].etype in [ st_fixcol, st_fixkey,
          st_varcol, st_varkey, st_varlongchar ]) AND
          ((ord(jinfos.ji_st_addr^[ _i ].ecol_tab[ 2 ])
          in jinfos.ji_nxtjinfo.nj_left_side) OR
          (( ord(jinfos.ji_st_addr^[ _i ].ecol_tab[ 2 ]) - 100) in
          jinfos.ji_nxtjinfo.nj_left_side))))
          ) DO
        _i := succ(_i);
    (*ENDWHILE*) 
    _l := _i; (* mark colunm position *)
    IF  (_i <= _stops)
        (* real entry found *)
        AND
        acv.a_outer_join
    THEN
        _is_outer_join_output :=
              ((ord(jinfos.ji_st_addr^[ _i ].ecol_tab[ 2 ]) in dmli.d_oj_tables)
              OR
              ((ord(jinfos.ji_st_addr^[ _i ].ecol_tab[ 2 ]) - 100) in dmli.d_oj_tables));
    (*ENDIF*) 
    ;
    (* step to output column *)
    WHILE ((_i <= _stops) AND
          (NOT (jinfos.ji_st_addr^[ _i ].etype in
          [ st_output, st_output_join, st_outp_cp_join ]))) DO
        _i := succ(_i);
    (*ENDWHILE*) 
&   ifdef TRACE
    t01int4 (ak_join, 'i+1+x.th tab', _l);
    t01stackentry (ak_join, jinfos.ji_st_addr^[ _l ], _l);
    t01stackentry (ak_join, jinfos.ji_st_addr^[ _i ], _i);
&   endif
    IF  (_i <= _stops)
        (* real stack entry found *)
        AND
        (
        ((jinfos.ji_st_addr^[ _i ].etype = st_output_join)
        ) OR
        ((jinfos.ji_st_addr^[ _i ].etype = st_output) AND
        (jinfos.ji_st_addr^[ _i ].eop_out in
        [ op_o_output, op_o_output_no_oflw, op_o_output_order ]))
        )
    THEN
        BEGIN
        _l := a685evaluate_new_ecol_pos (dmli, jinfos,
              _l, jinfos.ji_st_addr^[ _i ].elen_var);
        IF  ((_j >= acv.a_mblock.mb_qual^.mfirst_free)
            AND
            (_tpos = _l)
            AND
            (_fpos = jinfos.ji_st_addr^[ _i ].ecol_pos)
            AND
            (NOT outer_join_activ))
        THEN
            BEGIN
            jinfos.ji_st_addr^[ _i ].ecol_pos :=
                  acv.a_mblock.mb_st^[ _j ].ecol_pos +
                  acv.a_mblock.mb_st^[ _j ].elen_var;
            acv.a_mblock.mb_st^[ _j ].elen_var := acv.a_mblock.mb_st^[ _j ].elen_var +
                  jinfos.ji_st_addr^[ _i ].elen_var;
            END
        ELSE
            BEGIN
            (* put INVISIBLE stack entry *)
            g10mv ('VAK685',   2,    
                  (jinfos.ji_stack_desc.mst_max * mxgg_stack_entry),
                  acv.a_mblock.mb_st_size,
                  jinfos.ji_st_addr^, 
                  (_i - 1) * mxgg_stack_entry + 1,
                  acv.a_mblock.mb_st^, 
                  _j * mxgg_stack_entry + 1,
                  mxgg_stack_entry * 1, 
                  acv.a_return_segm^.sp1r_returncode);
            _j := succ(_j);
            acv.a_mblock.mb_st^[ _j ].etype := st_output_join;
            acv.a_mblock.mb_st^[ _j ].epos  :=
                  acv.a_mblock.mb_st^[ _j ].ecol_pos;
            IF  _is_outer_join_output
            THEN
                acv.a_mblock.mb_st^[ _j ].eop_out := op_o_output_outer_join
            ELSE
                acv.a_mblock.mb_st^[ _j ].eop := op_none;
            (*ENDIF*) 
            acv.a_mblock.mb_st^[ _j ].ecol_pos := _l;
            jinfos.ji_st_addr^[ _i ].ecol_pos  :=
                  acv.a_mblock.mb_st^[ _j ].ecol_pos;
            END;
        (*ENDIF*) 
        (* *** mark stackentry as copied *** *)
        jinfos.ji_st_addr^[ _i ].etype    := st_outp_cp_join;
        _fpos := acv.a_mblock.mb_st^[ _j ].elen_var +
              acv.a_mblock.mb_st^[ _j ].epos;
        _tpos := jinfos.ji_st_addr^[ _i ].ecol_pos + jinfos.ji_st_addr^[ _i ].elen_var;
        END;
    (*ENDIF*) 
    _i := succ(_i);
    END;
(*ENDWHILE*) 
acv.a_mblock.mb_qual^.mfirst_free := succ(_j);
&ifdef TRACE
t01qual1 (ak_join, 'end copy_old', acv.a_mblock.mb_qual^);
t01stackdesc (ak_join, 'ji_stack_des', jinfos.ji_st_addr, jinfos.ji_stack_desc);
&endif
END;
 
(*------------------------------*) 
 
FUNCTION
      a685evaluate_new_ecol_pos (
            VAR dmli      : tak_dml_info;
            VAR jinfos    : tak68_joininfos;
            curr_st_entry : integer;
            len_var       : integer) : integer;
 
VAR
      _i             : integer;
      _j             : integer;
      _k             : integer;
      _l             : integer;
      _new_ecol_pos  : integer;
      _found         : boolean;
      (* *** C.N. copied from vak680 24.10.95 *** *)
      _cc93_comp_int: integer; (* cc from 1993 otherwise produces *)
      (*                         wrong code *)
 
BEGIN
(* precondition ji_act_join < dmli.d_cntfromtab !! *)
(* evaluate position in i+1.th temporary result record *)
_l := 1;
_found  := false;
&ifdef TRACE
t01name(ak_join, 'orig. stackentry :');
t01stackentry (ak_join, jinfos.ji_st_addr^[ curr_st_entry ], curr_st_entry);
t01int4 (ak_join, 'len_var     ', len_var);
t01int4 (ak_join, 'r_len       ', jinfos.ji_nxtjinfo.nj_r_len);
t01int4 (ak_join, 'nk_len      ', jinfos.ji_nxtjinfo.nj_nk_len);
t01int4 (ak_join, 'nxt_klen_fil', jinfos.ji_nxtjinfo.nj_nxt_klen_filled);
&endif
IF  (len_var < jinfos.ji_nxtjinfo.nj_nk_len)
THEN
    BEGIN
    _i := 0;
    WHILE ((NOT _found) AND (_l < jinfos.ji_nxtjinfo.nj_nk_len) AND
          (_i < dmli.d_joins.jrc_cnt)) DO
        BEGIN
        (* loop over dmli.d_joins.jrc_joinarr *)
        FOR _j := 1 TO 2 DO
            IF  dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _j ].jop_tableno =
                jinfos.ji_nxtjinfo.nj_nxttabno
            THEN
                BEGIN
                CASE _j OF
                    1 :
                        _k := 2;
                    2 :
                        _k := 1;
                    END;
                (*ENDCASE*) 
                IF  (dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _k ].
                    jop_tableno in jinfos.ji_nxtjinfo.nj_left_side)
                    (* columns already in i.th temporary result *)
                    (* i+1.th tab = i-x.th tab *)
                    OR
                    (dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _k ].
                    jop_tableno = jinfos.ji_acttabno)
                    (* join with actual table, not yet in jinfos.ji_nxtjinfo.nj_left_side! *)
                    (* i+1.th tab = i.th tab *)
                    OR
                    (dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _k ].
                    jop_tableno = cak68_join_value)
                    (* i+1.tab = <value> *)
                THEN
                    BEGIN
                    _cc93_comp_int := ord (jinfos.ji_st_addr^
                          [ dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _k ].
                          jop_startstack ].ecol_tab[ 2 ]) MOD 100;
                    (* is opposite part given stack entry ? *)
                    IF  (len_var = dmli.d_joins.jrc_joinarr[ _i ].
                        jo_recs[ _k ].jop_inoutlen)
                        AND
                        ((jinfos.ji_st_addr^[ dmli.d_joins.
                        jrc_joinarr[ _i ].jo_recs[ _k ].jop_startstack ].
                        etype =
                        jinfos.ji_st_addr^[ curr_st_entry ].
                        etype)
                        AND
                        (jinfos.ji_st_addr^[ dmli.d_joins.
                        jrc_joinarr[ _i ].jo_recs[ _k ].jop_startstack ].
                        epos =
                        jinfos.ji_st_addr^[ curr_st_entry ].
                        epos)
                        AND
                        (jinfos.ji_st_addr^[ dmli.d_joins.
                        jrc_joinarr[ _i ].jo_recs[ _k ].jop_startstack ].
                        elen_var =
                        jinfos.ji_st_addr^[ curr_st_entry ].
                        elen_var)
                        AND
                        ((jinfos.ji_st_addr^[ dmli.d_joins.
                        jrc_joinarr[ _i ].jo_recs[ _k ].jop_startstack ].
                        ecol_tab[ 1 ] =
                        jinfos.ji_st_addr^[ curr_st_entry ].
                        ecol_tab[ 1 ])
                        OR
                        (jinfos.ji_st_addr^[ curr_st_entry ].
                        ecol_tab[ 1 ] <> chr (0)))
                        AND
                        (_cc93_comp_int =
                        ord (jinfos.ji_st_addr^[ curr_st_entry ].
                        ecol_tab[ 2 ]) MOD 100)
                        AND
                        ak685_first_use (jinfos, curr_st_entry))
                    THEN
                        BEGIN
                        _new_ecol_pos := cgg_rec_key_offset + _l;
                        jinfos.ji_nxtjinfo.nj_nxt_klen_filled :=
                              jinfos.ji_nxtjinfo.nj_nxt_klen_filled +
                              dmli.d_joins.jrc_joinarr[ _i ].
                              jo_recs[ _k ].jop_inoutlen;
                        _found := true;
                        END
                    ELSE
                        _l := _l + dmli.d_joins.jrc_joinarr[ _i ].
                              jo_recs[ _k ].jop_inoutlen;
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
                END;
            (*ENDIF*) 
        (*ENDFOR*) 
        _i := succ(_i);
        END;
    (*ENDWHILE*) 
    END;
(*ENDIF*) 
IF  NOT _found
THEN
    BEGIN
    (* append new column to record for later usage for later usage *)
    _new_ecol_pos := succ (jinfos.ji_nxtjinfo.nj_r_len);
    jinfos.ji_nxtjinfo.nj_r_len := jinfos.ji_nxtjinfo.nj_r_len + len_var;
&   ifdef TRACE
    t01int4 (ak_join, 'r_len       ', jinfos.ji_nxtjinfo.nj_r_len);
&   endif
    END;
&ifdef TRACE
(*ENDIF*) 
t01int4 (ak_join, 'new_ecol_pos', _new_ecol_pos);
t01int4 (ak_join, 'nxt_klen_fil', jinfos.ji_nxtjinfo.nj_nxt_klen_filled);
&endif
a685evaluate_new_ecol_pos := _new_ecol_pos;
END;
 
(*------------------------------*) 
 
PROCEDURE
      a685kcopy_keyfields (
            VAR acv    : tak_all_command_glob;
            VAR dmli   : tak_dml_info;
            VAR jinfos : tak68_joininfos);
 
VAR
      _i         : integer;
      _j         : integer;
      _k         : integer;
      _field_cnt : integer;
 
BEGIN
_field_cnt := jinfos.ji_nxtjinfo.nj_not_copied_keyfields_cnt;
&ifdef TRACE
t01qual (ak_join, acv.a_mblock.mb_qual^);
&endif
_i := 0;
WHILE ((_i < dmli.d_joins.jrc_cnt) AND (_field_cnt > 0)) DO
    BEGIN
    (* loop over join array *)
    FOR _j := 1 TO 2 DO
        IF  (
            (dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _j ].jop_tableno
            in jinfos.ji_nxtjinfo.nj_left_side) OR
            (* i-x.th tab = ??? *)
            (dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _j ].
            jop_tableno = jinfos.ji_acttabno)
            (* i.th tab = ??? *)
            )
            AND
            (
            (jinfos.ji_st_addr^[ dmli.d_joins.jrc_joinarr[ _i ].
            jo_recs[ _j ].jop_startstack ].eop = op_join_key)
            AND
            (jinfos.ji_st_addr^[ dmli.d_joins.jrc_joinarr[ _i ].
            jo_recs[ _j ].jop_startstack ].etype = st_fixcol)
            )
        THEN
            BEGIN
            _field_cnt := pred (_field_cnt);
            IF  (dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _j ].
                jop_tableno = jinfos.ji_acttabno)
            THEN
                _k := ord (jinfos.ji_st_addr^
                      [ dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _j ].
                      jop_startstack ].ecol_tab[ 1 ])
            ELSE
                BEGIN
                _k := acv.a_mblock.mb_qual^.mfirst_free;
                IF  dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _j ].
                    jop_outer_join
                THEN
                    acv.a_mblock.mb_st^[ _k ].eop_out := op_o_output_outer_join
                ELSE
                    acv.a_mblock.mb_st^[ _k ].eop_out := op_o_none;
                (*ENDIF*) 
                acv.a_mblock.mb_st^[ _k ].etype    := st_output;
                acv.a_mblock.mb_st^[ _k ].epos     := jinfos.ji_st_addr^
                      [ dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _j ].
                      jop_startstack ].epos;
                acv.a_mblock.mb_st^[ _k ].elen_var := dmli.d_joins.
                      jrc_joinarr[ _i ].jo_recs[ _j ].jop_inoutlen;
                acv.a_mblock.mb_st^[ _k ].ecol_pos := 0;
                acv.a_mblock.mb_qual^.mfirst_free  :=
                      succ (acv.a_mblock.mb_qual^.mfirst_free);
                END;
            (*ENDIF*) 
            a685set_st_type (acv.a_mblock.mb_st^[ _k ],
                  succ (jinfos.ji_nxtjinfo.nj_r_len));
            jinfos.ji_st_addr^[ dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _j ].
                  jop_startstack ].epos := acv.a_mblock.mb_st^[ _k ].ecol_pos;
            ak685pack_join_output (acv);
            jinfos.ji_nxtjinfo.nj_r_len := jinfos.ji_nxtjinfo.nj_r_len +
                  dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _j ].jop_inoutlen;
            END;
        (*ENDIF*) 
    (*ENDFOR*) 
    _i := succ(_i);
    END;
(*ENDWHILE*) 
&ifdef TRACE
t01int4 (ak_join, 'field_cnt   ', _field_cnt);
t01int4 (ak_join, 'not_cop_kfil', jinfos.ji_nxtjinfo.nj_not_copied_keyfields_cnt);
t01qual (ak_join, acv.a_mblock.mb_qual^);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      a685last_key_len (
            VAR acv     : tak_all_command_glob;
            VAR jinfos  : tak68_joininfos;
            VAR key_pos : tsp_int2);
 
VAR
      _stops : integer;
      _i     : integer;
 
BEGIN
_i := 1;
IF  jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].etype = st_jump_output
THEN
    _stops := jinfos.ji_stack_desc.mqual_pos +
          jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].epos - 2
ELSE
    _stops := _i + 2;
(*ENDIF*) 
WHILE _i <= _stops DO
    (* loop over original stack code *)
    BEGIN
    (* look for ORDER BY stackentries ? *)
    WHILE ((_i <= _stops)
          AND
          ((NOT (jinfos.ji_st_addr^[ _i ].etype in [ st_output, st_output_join ]))
          OR (NOT (jinfos.ji_st_addr^[ _i ].eop_out
          in [ op_o_output, op_o_output_no_oflw, op_o_output_order,
          op_o_output_oflw ])) OR
          ((jinfos.ji_st_addr^[ _i ].eop_out = op_o_output_oflw)
          AND
          (NOT (jinfos.ji_st_addr^[ _i - 1 ].etype
          in [ st_output, st_output_join ]))))) DO
        _i := succ(_i);
    (*ENDWHILE*) 
    IF  (_i <= _stops)
    THEN
        BEGIN
&       ifdef trace
        t01stackentry( ak_join, jinfos.ji_st_addr^[ _i ], _i );
&       endif
        key_pos := key_pos + jinfos.ji_st_addr^[ _i ].elen_var;
        END;
    (*ENDIF*) 
    _i := succ(_i)
    END;
(*ENDWHILE*) 
&ifdef trace
t01int4 (ak_join, 'key_pos     ', key_pos);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      a685next_key_length (
            VAR dmli   : tak_dml_info;
            VAR jinfos : tak68_joininfos);
 
VAR
      _i : integer;
      _j : integer;
      _k : integer;
 
BEGIN
(* precondition ji_act_join < dmli.d_cntfromtab *)
jinfos.ji_nxtjinfo.nj_nk_len := mxgg_rescnt;
&ifdef TRACE
t01int4 (ak_join, 'JOIN STEP   ', jinfos.ji_act_join);
t01int4 (ak_join, 'ji_acttabno ', jinfos.ji_acttabno);
t01int4 (ak_join, 'nj_nxttabno ', jinfos.ji_nxtjinfo.nj_nxttabno);
&endif
FOR _i := 0 TO (dmli.d_joins.jrc_cnt - 1) DO
    BEGIN
    FOR _j := 1 TO 2 DO
        (* look on left and right side of an join *)
        IF  dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _j ].
            jop_tableno = jinfos.ji_nxtjinfo.nj_nxttabno
        THEN
            (* i+1.tab = ???? found *)
            BEGIN
&           ifdef trace
            a683_one_join_entry( ak_join, dmli, _i );
&           endif
            CASE _j OF
                1 :
                    _k := 2;
                2 :
                    _k := 1;
                END;
            (*ENDCASE*) 
            IF  (dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _k ].
                jop_tableno in (jinfos.ji_nxtjinfo.nj_left_side))
                (* corresponding table already processed *)
                (* i+1.th tab = i-x.th tab *)
                OR
                ((dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _k ].
                jop_tableno = jinfos.ji_acttabno)
                (* i+1.th tab = i.th tab *)
                OR
                (dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _k ].
                jop_tableno = cak68_join_value)  )
                (* i+1.th tab = <value> *)
            THEN
                BEGIN
                jinfos.ji_nxtjinfo.nj_nk_len :=
                      jinfos.ji_nxtjinfo.nj_nk_len +
                      dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _k ].
                      jop_inoutlen;
&               ifdef TRACE
                t01stackentry (ak_join, jinfos.ji_st_addr^
                      [ dmli.d_joins.jrc_joinarr[ _i ].jo_recs[ _k ].
                      jop_startstack ], dmli.d_joins.jrc_joinarr[ _i ].
                      jo_recs[ _k ].jop_startstack);
&               endif
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
    (*ENDFOR*) 
    END;
(*ENDFOR*) 
&ifdef trace
t01int4 (ak_join, 'nk_len      ', jinfos.ji_nxtjinfo.nj_nk_len);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      a685olast_order_fields (
            VAR acv     : tak_all_command_glob;
            VAR jinfos  : tak68_joininfos;
            VAR njrec   : tgg07_NextJoins);
 
VAR
      _stops : integer;
      _i     : integer;
 
BEGIN
_i := jinfos.ji_stack_desc.mqual_pos;
IF  jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].etype = st_jump_output
THEN
    _stops := jinfos.ji_stack_desc.mqual_pos +
          jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].epos - 2
ELSE
    _stops := _i + 2;
(*ENDIF*) 
WHILE _i <= _stops DO
    (* loop over original stack *)
    BEGIN
    (* step to order field *)
    WHILE ((_i <= _stops)
          AND
          (
          (NOT (jinfos.ji_st_addr^[ _i ].etype in [ st_output,
          st_output_join ])) OR
          (NOT (jinfos.ji_st_addr^[ _i ].eop_out
          in [ op_o_output, op_o_output_no_oflw, op_o_output_order,
          op_o_output_oflw ])) OR
          ((jinfos.ji_st_addr^[ _i ].eop_out = op_o_output_oflw) AND
          (NOT (jinfos.ji_st_addr^[ _i - 1 ].etype in [ st_output, st_output_join ])))
          )
          )    DO
        _i := succ(_i);
    (*ENDWHILE*) 
    IF  (_i <= _stops)
    THEN
        BEGIN
        njrec.n_j_cnt := succ(njrec.n_j_cnt);
        IF  ((jinfos.ji_st_addr^[ _i ].ecol_pos = 0)
            OR
            (jinfos.ji_st_addr^[ _i ].etype = st_output))
        THEN
            jinfos.ji_st_addr^[ _i ].ecol_pos :=
                  jinfos.ji_st_addr^[ _i ].epos;
        (*ENDIF*) 
        IF  ((jinfos.ji_st_addr^[ _i ].eop_out = op_o_output_order)
            AND
            (jinfos.ji_st_addr^[ _i - 1 ].etype IN [ st_output, st_output_join ]))
        THEN
            njrec.n_j_arr[ njrec.n_j_cnt ].jfrom := -jinfos.ji_st_addr^[ _i ].ecol_pos
        ELSE
            njrec.n_j_arr[ njrec.n_j_cnt ].jfrom := jinfos.ji_st_addr^[ _i ].ecol_pos;
        (*ENDIF*) 
        njrec.n_j_arr[ njrec.n_j_cnt ].jto  := jinfos.ji_st_addr^[ _i ].epos;
        njrec.n_j_arr[ njrec.n_j_cnt ].jlen := jinfos.ji_st_addr^[ _i ].elen_var;
&       ifdef TRACE
        t01int4 (ak_join, 'last_o njcnt', njrec.n_j_cnt);
        t01int4 (ak_join, 'last_o jfrom', njrec.n_j_arr[ njrec.n_j_cnt ].jfrom);
        t01int4 (ak_join, 'last_o jto  ', njrec.n_j_arr[ njrec.n_j_cnt ].jto);
        t01int4 (ak_join, 'last_o jlen ', njrec.n_j_arr[ njrec.n_j_cnt ].jlen);
        t01bool (ak_join, 'storno******',
              ((njrec.n_j_arr[ njrec.n_j_cnt ].jfrom =
              njrec.n_j_arr[ njrec.n_j_cnt ].jto)
              OR
              (njrec.n_j_arr[ njrec.n_j_cnt ].jfrom =
              -njrec.n_j_arr[ njrec.n_j_cnt ].jto)));
&       endif
        IF  ((njrec.n_j_arr[ njrec.n_j_cnt ].jfrom =
            njrec.n_j_arr[ njrec.n_j_cnt ].jto) OR
            (njrec.n_j_arr[ njrec.n_j_cnt ].jfrom =
            -njrec.n_j_arr[ njrec.n_j_cnt ].jto))
        THEN
            njrec.n_j_cnt := pred (njrec.n_j_cnt);
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    _i := succ(_i)
    END
(*ENDWHILE*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a685pack_record (
            VAR acv    : tak_all_command_glob;
            pos        : integer;
            VAR dmli   : tak_dml_info;
            VAR jinfos : tak68_joininfos;
            mj_pos     : integer);
 
VAR
      _i      : integer;
      _j      : integer;
      _starts : integer;
      _equal  : boolean;
 
BEGIN
_i      := mj_pos;
_starts := jinfos.ji_stack_desc.mmult_pos + 1;
&ifdef TRACE
t01int4 (ak_join, 'starts      ', _starts);
t01int4 (ak_join, '       pos= ', pos);
t01stackentry (ak_join, acv.a_mblock.mb_st^[ pos ], pos);
t01int4 (ak_join, '        i = ', _i);
t01stackentry (ak_join, jinfos.ji_st_addr^[ _i ], _i);
t01int4 (ak_join, 'r_len     = ', jinfos.ji_nxtjinfo.nj_r_len);
t01qual (ak_join, acv.a_mblock.mb_qual^);
t01stackdesc (ak_join, 'ji_stack_des', jinfos.ji_st_addr, jinfos.ji_stack_desc);
&endif
_j     := 1;
_equal := true;
IF  ((jinfos.ji_st_addr^[ _i + _j ].etype  = st_output) AND
    (jinfos.ji_st_addr^[ _i + _j ].eop_out = op_o_output_hold))
THEN
    BEGIN
    REPEAT
        IF  (jinfos.ji_act_join > 1)
        THEN
            BEGIN
            IF  (_j > 1)
            THEN
                BEGIN
                acv.a_mblock.mb_qual^.mqual_cnt   :=
                      succ(acv.a_mblock.mb_qual^.mqual_cnt);
                acv.a_mblock.mb_qual^.mfirst_free :=
                      succ(acv.a_mblock.mb_qual^.mfirst_free);
                END;
            (*ENDIF*) 
            IF  (jinfos.ji_st_addr^[ _i + _j + 1 ].etype IN
                [ st_output, st_output_join ])
            THEN
                a685set_st_type (acv.a_mblock.mb_st^[ pos + _j ],
                      a685evaluate_new_ecol_pos(dmli, jinfos, pos,
                      acv.a_mblock.mb_st^[ pos + _j ].elen_var))
            ELSE
                a685set_st_type (acv.a_mblock.mb_st^[ pos + _j ],
                      acv.a_mblock.mb_st^[ pos + _j ].epos);
            (*ENDIF*) 
            a685set_st_type (jinfos.ji_st_addr^[ _i + _j ],
                  acv.a_mblock.mb_st^[ pos + _j ].ecol_pos);
            END
        ELSE
            a685set_st_type (jinfos.ji_st_addr^[ _i + _j ],
                  acv.a_mblock.mb_st^[ pos + _j ].epos);
        (*ENDIF*) 
&       ifdef TRACE
        t01stackentry (ak_join, jinfos.ji_st_addr^[ _i + _j ], _i + _j);
        IF  (jinfos.ji_act_join > 1)
        THEN
            t01stackentry (ak_join, acv.a_mblock.mb_st^[ pos + _j ], pos + _j);
&       endif
        (*ENDIF*) 
        _j := succ(_j);
        a685set_st_type (jinfos.ji_st_addr^[ _i + _j ],
              jinfos.ji_st_addr^[ _i + _j - 1 ].epos);
&       ifdef TRACE
        t01stackentry (ak_join, jinfos.ji_st_addr^[ _i + _j ], _i + _j);
        t01qual (ak_join, acv.a_mblock.mb_qual^);
&       endif
    UNTIL
        ((jinfos.ji_st_addr^[ _i + _j ].etype <> st_output) OR
        (jinfos.ji_st_addr^[ _i + _j ].eop_out <> op_o_output_hold));
    (*ENDREPEAT*) 
    END;
(*ENDIF*) 
_equal := jinfos.ji_st_addr^[ _i + _j ].etype IN
      [ st_output, st_output_join ];
&ifdef TRACE
t01int4 (ak_join, 'j **********', _j);
t01int4 (ak_join, 'equal       ', ord (_equal));
&endif
IF  (_equal AND
    ((jinfos.ji_stack_desc.mfirst_free + _j + 1) <=
    jinfos.ji_stack_desc.mst_max))
THEN
    BEGIN
&   ifdef TRACE
    t01int4 (ak_join, 'j         = ', _j);
    t01int4 (ak_join, 'equal pos = ', pos);
    t01stackentry (ak_join, jinfos.ji_st_addr^[ _i ], _i);
    t01stackentry (ak_join, jinfos.ji_st_addr^[ _i + _j - 1 ], _i + _j - 1);
    t01stackentry (ak_join, jinfos.ji_st_addr^[ _i + _j ], _i + _j);
    t01stackentry (ak_join, acv.a_mblock.mb_st^[ pos ], pos);
    t01stackentry (ak_join, acv.a_mblock.mb_st^[ pos + _j - 1 ], pos + _j - 1);
    t01stackentry (ak_join, acv.a_mblock.mb_st^[ pos + _j ], pos + _j);
    t01int4 (ak_join, 'r_len     = ', jinfos.ji_nxtjinfo.nj_r_len);
&   endif
    IF  ((jinfos.ji_act_join > 1)
        OR
        (NOT ((jinfos.ji_st_addr^[ _i + _j ].eop_out = op_o_output_order)
        AND
        (jinfos.ji_st_addr^[ _i + _j ].etype in
        [ st_output, st_output_join ]))))
    THEN
        acv.a_mblock.mb_st^[ pos + _j ].eop :=
              jinfos.ji_st_addr^[ _i + _j ].eop;
    (*ENDIF*) 
    IF  (acv.a_mblock.mb_st^[ pos + _j ].etype = st_output) OR
        (acv.a_mblock.mb_st^[ pos + _j ].etype = st_output_join)
    THEN
        BEGIN
        IF  (jinfos.ji_act_join > 1)
        THEN
            BEGIN
            IF  (jinfos.ji_act_join = dmli.d_cntfromtab)
            THEN
                BEGIN
                a685set_st_type (jinfos.ji_st_addr^[ _i + _j ],
                      acv.a_mblock.mb_st^[ pos + _j ].epos);
                a685set_st_type (acv.a_mblock.mb_st^[ pos + _j ],
                      jinfos.ji_st_addr^[ _i + _j ].epos);
                END
            ELSE
                BEGIN
                IF  (NOT ((jinfos.ji_st_addr^[ _i + _j ].eop_out in
                    [ op_o_output_order, op_o_output, op_o_output_no_oflw ])
                    AND
                    (jinfos.ji_st_addr^[ _i + _j ].etype in [ st_output,
                    st_output_join ])))
                THEN
                    BEGIN
                    a685set_st_type (jinfos.ji_st_addr^[ _i + _j ],
                          a685evaluate_new_ecol_pos (dmli, jinfos,
                          _i, jinfos.ji_st_addr^[ _i + _j ].elen_var));
                    a685set_st_type (acv.a_mblock.mb_st^[ pos + _j ],
                          jinfos.ji_st_addr^[ _i + _j ].ecol_pos);
                    END;
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            END
        ELSE
            a685set_st_type (jinfos.ji_st_addr^[ _i + _j ],
                  acv.a_mblock.mb_st^[ pos + _j ].epos);
        (*ENDIF*) 
        END;
&   ifdef TRACE
    (*ENDIF*) 
    IF  (jinfos.ji_act_join > 1)
    THEN
        t01stackentry (ak_join, acv.a_mblock.mb_st^[ pos + _j ], pos + _j);
&   endif
    (*ENDIF*) 
    IF  (jinfos.ji_act_join = dmli.d_cntfromtab)
    THEN
        IF  (jinfos.ji_nxtjinfo.nj_r_len <
            (acv.a_mblock.mb_st^[ pos + _j ].ecol_pos +
            acv.a_mblock.mb_st^[ pos + _j ].elen_var))
        THEN
            jinfos.ji_nxtjinfo.nj_r_len :=
                  acv.a_mblock.mb_st^[ pos + _j ].ecol_pos +
                  acv.a_mblock.mb_st^[ pos + _j ].elen_var - 1;
&       ifdef TRACE
        (*ENDIF*) 
    (*ENDIF*) 
    t01int4 (ak_join, 'r_len     = ', jinfos.ji_nxtjinfo.nj_r_len);
&   endif
    g10mvr ('VAK685',   3,    
          (jinfos.ji_stack_desc.mst_max * mxgg_stack_entry),
          (jinfos.ji_stack_desc.mst_max * mxgg_stack_entry),
          jinfos.ji_st_addr^, (_starts - 1) * mxgg_stack_entry + 1,
          jinfos.ji_st_addr^, (_starts + _j) * mxgg_stack_entry + 1,
          (jinfos.ji_stack_desc.mfirst_free - _starts + 1) * mxgg_stack_entry,
          acv.a_return_segm^.sp1r_returncode);
&   ifdef TRACE
    t01stackentry (ak_join, jinfos.ji_st_addr^[ _starts ], _starts);
    t01stackentry (ak_join, jinfos.ji_st_addr^[ _starts + _j + 1 ],
          _starts + _j + 1);
    t01int4 (ak_join, 'size back = ',
          jinfos.ji_stack_desc.mfirst_free - _starts + 1);
    t01stackdesc (ak_join, 'ji_stack_des', jinfos.ji_st_addr, jinfos.ji_stack_desc);
&   endif
    g10mv ('VAK685',   4,    
          (jinfos.ji_stack_desc.mst_max * mxgg_stack_entry),
          (jinfos.ji_stack_desc.mst_max * mxgg_stack_entry),
          jinfos.ji_st_addr^, (_i + _j) * mxgg_stack_entry + 1,
          jinfos.ji_st_addr^, (_starts - 1) * mxgg_stack_entry + 1,
          (_j + 1) * mxgg_stack_entry,
          acv.a_return_segm^.sp1r_returncode);
&   ifdef TRACE
    t01stackentry (ak_join, jinfos.ji_st_addr^[ _i + _j ], _i + _j);
    t01stackentry (ak_join, jinfos.ji_st_addr^[ _starts ], _starts);
    t01int4 (ak_join, 'size      = ', _j + 1);
&   endif
    g10mv ('VAK685',   5,    
          (jinfos.ji_stack_desc.mst_max * mxgg_stack_entry),
          (jinfos.ji_stack_desc.mst_max * mxgg_stack_entry),
          jinfos.ji_st_addr^, (_i + 2 * _j + 1) * mxgg_stack_entry + 1,
          jinfos.ji_st_addr^, (_i + _j) * mxgg_stack_entry + 1,
          (jinfos.ji_stack_desc.mfirst_free - _j - _i - 1) * mxgg_stack_entry,
          acv.a_return_segm^.sp1r_returncode);
&   ifdef TRACE
    t01stackentry (ak_join, jinfos.ji_st_addr^[ _i + 2 * _j + 1 ],
          _i + 2 * _j + 1);
    t01stackentry (ak_join, jinfos.ji_st_addr^[ _i + _j ], _i + _j);
    t01int4 (ak_join, 'size      = ',
          jinfos.ji_stack_desc.mfirst_free - _j - _i - 1);
&   endif
    jinfos.ji_stack_desc.mmult_pos := _starts + _j;
&   ifdef TRACE
    t01int4 (ak_join, 'r_len     = ', jinfos.ji_nxtjinfo.nj_r_len);
    t01int4 (ak_join, 'i         = ', _i);
    t01int4 (ak_join, 'j         = ', _j);
    t01int4 (ak_join, 'mmult_pos = ', jinfos.ji_stack_desc.mmult_pos);
&   endif
    END
ELSE
    BEGIN
    IF  a685stentry_found_in_outplist (jinfos, _i, dmli, acv.a_mblock.mb_st^[ pos ])
    THEN
        a685pack_record (acv, pos, dmli, jinfos, _i);
    (*ENDIF*) 
    END;
(*ENDIF*) 
&ifdef TRACE
t01qual (ak_join, acv.a_mblock.mb_qual^);
t01stackdesc (ak_join, 'ji_stack_des', jinfos.ji_st_addr, jinfos.ji_stack_desc);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      a685set_st_type (
            VAR st : tgg_stack_entry;
            outpos : integer);
 
BEGIN
(* makr as positined in i+1.th temporary result record *)
st.etype := st_output_join;
IF  outpos > 0
THEN
    st.ecol_pos := outpos;
&ifdef trace
(*ENDIF*) 
t01int4 (ak_join, 'result pos  ', outpos);
&endif
END;
 
(*------------------------------*) 
 
FUNCTION
      a685stentry_found_in_outplist (
            VAR jinfos : tak68_joininfos;
            VAR mj_pos : integer;
            VAR dmli   : tak_dml_info;
            VAR st_en  : tgg_stack_entry) : boolean;
 
VAR
      _starts : integer;
      _stops  : integer;
      _i      : integer;
      _j      : integer;
      _k      : integer;
      _found  : boolean;
      _b_err  : tgg_basis_error;
 
BEGIN
IF  (mj_pos = 0)
THEN
    _starts := jinfos.ji_stack_desc.mmult_pos
ELSE
    _starts := mj_pos;
(*ENDIF*) 
IF  jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].etype = st_jump_output
THEN
    _stops := jinfos.ji_stack_desc.mqual_pos +
          jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].epos - 2
ELSE
    _stops := _starts;
(*ENDIF*) 
_starts := succ (_starts);
_b_err  := e_ok;
mj_pos := 0;
_found  := false;
_i      := _starts;
WHILE ((_i <= _stops) AND NOT _found) DO
    BEGIN
    WHILE ((_i <= _stops)
          AND
          (NOT
          ((st_en.etype            = jinfos.ji_st_addr^[ _i ].etype)
          AND
          (st_en.ecol_tab[ 2 ]     = jinfos.ji_st_addr^[ _i ].ecol_tab[ 2 ])
          AND
          (st_en.eop               = jinfos.ji_st_addr^[ _i ].eop)
          AND
          (jinfos.ji_st_addr^[ _i + 1 ].etype = st_output)                ))) DO
        _i := succ(_i);
    (*ENDWHILE*) 
    IF  (_i < _stops)
    THEN
        IF  (jinfos.ji_st_addr^[ _i + 1 ].etype   = st_output) AND
            (jinfos.ji_st_addr^[ _i + 1 ].eop_out <> op_o_output_hold)
        THEN
            BEGIN
            IF  (st_en.epos = jinfos.ji_st_addr^[ _i ].epos)
            THEN
                BEGIN
                IF  (st_en.elen_var = jinfos.ji_st_addr^[ _i ].elen_var)
                THEN
                    BEGIN
                    (* *** stack_entries are equal (len, pos, type) *** *)
                    _found  := true;
                    mj_pos := _i;
                    END
                ELSE
                    IF  ((st_en.elen_var < jinfos.ji_st_addr^[ _i ].elen_var)
                        AND
                        (st_en.etype in [ st_fixcol, st_fixkey ]))
                    THEN
                        BEGIN
                        (* *** stack_entries are equal (pos, type) *** *)
                        IF  ((jinfos.ji_stack_desc.mfirst_free + 2) <=
                            jinfos.ji_stack_desc.mst_max)
                        THEN
                            BEGIN
                            g10mvr ('VAK685',   6,    
                                  (jinfos.ji_stack_desc.mst_max *
                                  mxgg_stack_entry),
                                  (jinfos.ji_stack_desc.mst_max *
                                  mxgg_stack_entry),
                                  jinfos.ji_st_addr^,
                                  (_i - 1) * mxgg_stack_entry + 1,
                                  jinfos.ji_st_addr^,
                                  (_i + 1) * mxgg_stack_entry + 1,
                                  (jinfos.ji_stack_desc.mfirst_free -
                                  _i + 1) * mxgg_stack_entry,
                                  _b_err);
                            jinfos.ji_stack_desc.mfirst_free  := jinfos.ji_stack_desc.mfirst_free + 2;
                            jinfos.ji_stack_desc.mqual_cnt :=
                                  jinfos.ji_stack_desc.mqual_cnt + 2;
                            jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].epos :=
                                  jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].epos + 2;
                            _found        := true;
                            mj_pos       := _i;
                            FOR _j := 0 TO (dmli.d_joins.jrc_cnt - 1) DO
                                FOR _k := 1 TO 2 DO
                                    WITH dmli.d_joins.jrc_joinarr[ _j ], jo_recs[ _k ] DO
                                        jop_startstack := jop_startstack + 2;
                                    (*ENDWITH*) 
                                (*ENDFOR*) 
                            (*ENDFOR*) 
                            (* *** 1. fixcol, fixkey *** *)
                            jinfos.ji_st_addr^[ _i ].elen_var := st_en.elen_var;
                            _i := succ(_i);
                            (* *** 1. output **** *)
                            jinfos.ji_st_addr^[ _i ].elen_var := st_en.elen_var;
                            _i := succ(_i);
                            (* *** 2. fixcol, fixkey *** *)
                            jinfos.ji_st_addr^[ _i ].elen_var :=
                                  jinfos.ji_st_addr^[ _i ].elen_var - st_en.elen_var;
                            jinfos.ji_st_addr^[ _i ].epos     :=
                                  jinfos.ji_st_addr^[ _i ].epos + st_en.elen_var;
                            _i := succ(_i);
                            (* *** 2. output **** *)
                            jinfos.ji_st_addr^[ _i ].elen_var :=
                                  jinfos.ji_st_addr^[ _i ].elen_var - st_en.elen_var;
                            jinfos.ji_st_addr^[ _i ].epos     :=
                                  jinfos.ji_st_addr^[ _i ].epos + st_en.elen_var;
                            END;
                        (*ENDIF*) 
                        END
                    (*ENDIF*) 
                (*ENDIF*) 
                END
            ELSE
                BEGIN
                (* h.b. PTS 1106252 *)
                IF  (st_en.etype in [ st_fixcol, st_fixkey ])
                THEN
                    IF  (st_en.epos > jinfos.ji_st_addr^[ _i ].epos)
                    THEN
                        BEGIN
                        IF  ((st_en.epos + st_en.elen_var) <
                            (jinfos.ji_st_addr^[ _i ].epos +
                            jinfos.ji_st_addr^[ _i ].elen_var))
                        THEN
                            BEGIN
                            IF  ((jinfos.ji_stack_desc.mfirst_free + 4) <=
                                jinfos.ji_stack_desc.mst_max)
                            THEN
                                BEGIN
                                g10mvr ('VAK685',   7,    
                                      (jinfos.ji_stack_desc.mst_max *
                                      mxgg_stack_entry),
                                      (jinfos.ji_stack_desc.mst_max *
                                      mxgg_stack_entry),
                                      jinfos.ji_st_addr^,
                                      (_i - 1) * mxgg_stack_entry + 1,
                                      jinfos.ji_st_addr^,
                                      (_i + 3) * mxgg_stack_entry + 1,
                                      (jinfos.ji_stack_desc.mfirst_free -
                                      _i + 1) * mxgg_stack_entry,
                                      _b_err);
                                g10mvr ('VAK685',   8,    
                                      (jinfos.ji_stack_desc.mst_max *
                                      mxgg_stack_entry),
                                      (jinfos.ji_stack_desc.mst_max *
                                      mxgg_stack_entry),
                                      jinfos.ji_st_addr^,
                                      (_i - 1) * mxgg_stack_entry + 1,
                                      jinfos.ji_st_addr^,
                                      (_i + 1) * mxgg_stack_entry + 1,
                                      2 * mxgg_stack_entry,
                                      _b_err);
                                jinfos.ji_stack_desc.mfirst_free  := jinfos.ji_stack_desc.mfirst_free + 4;
                                jinfos.ji_stack_desc.mqual_cnt    :=
                                      jinfos.ji_stack_desc.mqual_cnt + 4;
                                jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].epos :=
                                      jinfos.ji_st_addr^[ jinfos.ji_stack_desc.mqual_pos ].epos + 4;
                                _found        := true;
                                FOR _j := 0 TO (dmli.d_joins.jrc_cnt - 1) DO
                                    FOR _k := 1 TO 2 DO
                                        WITH dmli.d_joins.jrc_joinarr[ _j ], jo_recs[ _k ] DO
                                            jop_startstack := jop_startstack + 4;
                                        (*ENDWITH*) 
                                    (*ENDFOR*) 
                                (*ENDFOR*) 
                                (* *** 1. fixcol, fixkey *** *)
                                jinfos.ji_st_addr^[ _i ].elen_var :=
                                      st_en.epos - jinfos.ji_st_addr^[ _i ].epos;
                                _i := succ(_i);
                                (* *** 1. output **** *)
                                jinfos.ji_st_addr^[ _i ].elen_var :=
                                      jinfos.ji_st_addr^[ _i - 1 ].elen_var;
                                _i := succ(_i);
                                (* *** 2. fixcol, fixkey *** *)
                                jinfos.ji_st_addr^[ _i ].elen_var := st_en.elen_var;
                                jinfos.ji_st_addr^[ _i ].epos     :=
                                      jinfos.ji_st_addr^[ _i ].epos
                                      + jinfos.ji_st_addr^[ _i - 1 ].elen_var;
                                _i      := succ(_i);
                                mj_pos := _i;
                                (* *** 2. output **** *)
                                jinfos.ji_st_addr^[ _i ].elen_var := st_en.elen_var;
                                jinfos.ji_st_addr^[ _i ].epos     :=
                                      jinfos.ji_st_addr^[ _i ].epos +
                                      jinfos.ji_st_addr^[ _i - 2 ].elen_var;
                                _i := succ(_i);
                                (* *** 3. fixcol, fixkey *** *)
                                jinfos.ji_st_addr^[ _i ].elen_var :=
                                      jinfos.ji_st_addr^[ _i ].epos +
                                      jinfos.ji_st_addr^[ _i ].elen_var -
                                      jinfos.ji_st_addr^[ _i - 2 ].epos -
                                      jinfos.ji_st_addr^[ _i - 2 ].elen_var;
                                jinfos.ji_st_addr^[ _i ].epos     :=
                                      jinfos.ji_st_addr^[ _i - 2 ].epos +
                                      jinfos.ji_st_addr^[ _i - 2 ].elen_var;
                                _i := succ(_i);
                                (* *** 3. output **** *)
                                jinfos.ji_st_addr^[ _i ].elen_var :=
                                      jinfos.ji_st_addr^[ _i ].epos +
                                      jinfos.ji_st_addr^[ _i ].elen_var -
                                      jinfos.ji_st_addr^[ _i - 2 ].epos -
                                      jinfos.ji_st_addr^[ _i - 2 ].elen_var;
                                jinfos.ji_st_addr^[ _i ].epos     :=
                                      jinfos.ji_st_addr^[ _i - 2 ].epos +
                                      jinfos.ji_st_addr^[ _i - 2 ].elen_var;
                                END;
                            (*ENDIF*) 
                            END
                        ELSE
                            IF   ((st_en.epos + st_en.elen_var) = (jinfos.ji_st_addr^[ _i ].epos +
                                jinfos.ji_st_addr^[ _i ].elen_var))
                            THEN
                                BEGIN
                                (* stack_entries are equal (pos+len, type) *)
                                IF  ((jinfos.ji_stack_desc.mfirst_free + 2) <= jinfos.ji_stack_desc.mst_max)
                                THEN
                                    BEGIN
                                    g10mvr ('VAK685',   9,    
                                          (jinfos.ji_stack_desc.mst_max * mxgg_stack_entry),
                                          (jinfos.ji_stack_desc.mst_max * mxgg_stack_entry),
                                          jinfos.ji_st_addr^,
                                          (_i - 1) * mxgg_stack_entry + 1,
                                          jinfos.ji_st_addr^,
                                          (_i + 1) * mxgg_stack_entry + 1,
                                          (jinfos.ji_stack_desc.mfirst_free - _i + 1)
                                          * mxgg_stack_entry, _b_err);
                                    jinfos.ji_stack_desc.mfirst_free  :=
                                          jinfos.ji_stack_desc.mfirst_free + 2;
                                    jinfos.ji_stack_desc.mqual_cnt :=
                                          jinfos.ji_stack_desc.mqual_cnt + 2;
                                    jinfos.ji_st_addr^
                                          [ jinfos.ji_stack_desc.mqual_pos ].epos :=
                                          jinfos.ji_st_addr^
                                          [ jinfos.ji_stack_desc.mqual_pos ].epos + 2;
                                    _found := true;
                                    FOR _j := 0 TO (dmli.d_joins.jrc_cnt - 1) DO
                                        FOR _k := 1 TO 2 DO
                                            WITH dmli.d_joins.jrc_joinarr[ _j ],
                                                 jo_recs[ _k ] DO
                                                jop_startstack :=
                                                      jop_startstack + 2;
                                            (*ENDWITH*) 
                                        (*ENDFOR*) 
                                    (*ENDFOR*) 
                                    (* *** 1. fixcol, fixkey *** *)
                                    jinfos.ji_st_addr^[ _i ].elen_var :=
                                          jinfos.ji_st_addr^[ _i ].elen_var - st_en.elen_var;
                                    _i := succ(_i);
                                    (* *** 1. output **** *)
                                    jinfos.ji_st_addr^[ _i ].elen_var :=
                                          jinfos.ji_st_addr^[ _i ].elen_var - st_en.elen_var;
                                    _i      := succ(_i);
                                    mj_pos := _i;
                                    (* *** 2. fixcol, fixkey *** *)
                                    jinfos.ji_st_addr^[ _i ].elen_var := st_en.elen_var;
                                    jinfos.ji_st_addr^[ _i ].epos     :=
                                          jinfos.ji_st_addr^[ _i - 2 ].epos +
                                          jinfos.ji_st_addr^[ _i - 2 ].elen_var;
                                    _i := succ(_i);
                                    (* *** 2. output **** *)
                                    jinfos.ji_st_addr^[ _i ].elen_var := st_en.elen_var;
                                    jinfos.ji_st_addr^[ _i ].epos     :=
                                          jinfos.ji_st_addr^[ _i - 2 ].epos +
                                          jinfos.ji_st_addr^[ _i - 2 ].elen_var;
                                    END;
                                (*ENDIF*) 
                                END;
                            (*ENDIF*) 
                        (*ENDIF*) 
                        END;
                    (*ENDIF*) 
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
    (*ENDIF*) 
    _i := succ(_i);
    END;
(*ENDWHILE*) 
a685stentry_found_in_outplist := _found;
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak685pack_join_output (VAR acv : tak_all_command_glob);
 
VAR
      _i : integer;
 
BEGIN
_i := acv.a_mblock.mb_qual^.mfirst_free - 1;
IF  (acv.a_mblock.mb_st^[ _i - 1 ].etype = st_output_join )
    AND
    (acv.a_mblock.mb_st^[ _i - 1 ].eop_out <> op_o_output_outer_join)
    AND
    (acv.a_mblock.mb_st^[ _i - 1 ].epos +
    acv.a_mblock.mb_st^[ _i - 1 ].elen_var = acv.a_mblock.mb_st^[_i].epos )
    AND
    (acv.a_mblock.mb_st^[ _i - 1 ].ecol_pos +
    acv.a_mblock.mb_st^[ _i - 1 ].elen_var = acv.a_mblock.mb_st^[_i].ecol_pos)
THEN
    BEGIN
    acv.a_mblock.mb_st^[ _i - 1 ].elen_var :=
          acv.a_mblock.mb_st^[ _i - 1 ].elen_var +
          acv.a_mblock.mb_st^[_i].elen_var;
    acv.a_mblock.mb_qual^.mfirst_free := pred (acv.a_mblock.mb_qual^.mfirst_free)
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
FUNCTION
      ak685_first_use (
            VAR jinfos    : tak68_joininfos;
            curr_st_entry : integer) : boolean;
 
VAR
      _first_use     : boolean;
      _i             : integer;
      _max_st_entry  : integer;
      (* *** C.N. copied form vak680 24.10.95 *** *)
      _cc93_comp_int: integer; (* cc from 1993 otherwise produces *)
      (*                         wrong code *)
 
BEGIN
_first_use     := true;
_max_st_entry  := curr_st_entry - 1;
IF  jinfos.ji_st_addr^[ curr_st_entry ].etype <> st_value
THEN
    BEGIN
    _i := succ (jinfos.ji_stack_desc.mqual_pos);
    (* *** searching current stackentry in outputlist *** *)
    WHILE (_i < curr_st_entry) DO
        BEGIN
        _cc93_comp_int :=
              ord (jinfos.ji_st_addr^[ _i ].ecol_tab[ 2 ]) MOD 100;
        IF  (jinfos.ji_st_addr^[ _i ].etype =
            jinfos.ji_st_addr^[ curr_st_entry ].etype)
            AND
            (jinfos.ji_st_addr^[ _i ].epos  =
            jinfos.ji_st_addr^[ curr_st_entry ].epos)
            AND
            (jinfos.ji_st_addr^[ _i ].elen_var =
            jinfos.ji_st_addr^[ curr_st_entry ].elen_var)
            AND
            (_cc93_comp_int =
            ord (jinfos.ji_st_addr^[ curr_st_entry ].ecol_tab[ 2 ]) MOD 100)
        THEN
            (* stackentry in output found *)
            BEGIN
            _first_use :=
                  (jinfos.ji_st_addr^[ _i + 1 ].etype <> st_output_join)
                  AND
                  (jinfos.ji_st_addr^[ _i + 1 ].etype <> st_outp_cp_join);
            IF  NOT _first_use
            THEN
                (* *** exit while *** *)
                _i := curr_st_entry;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        _i := succ(_i);
        END;
    (*ENDWHILE*) 
    END;
(*ENDIF*) 
;
&ifdef TRACE
t01int4 (ak_join, 'curr_st_entr', curr_st_entry);
&endif
ak685_first_use := _first_use;
END;
 
.CM *-END-* code---------------
.SP 2 
***********************************************************
*-PRETTY-*  statements    :        449
*-PRETTY-*  lines of code :       1535        PRETTYX 3.10 
*-PRETTY-*  lines in file :       1793         1997-12-10 
.PA 
