.nf
 
 
    ========== licence begin  GPL
    Copyright (c) 2000-2004 SAP AG
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    ========== licence end
 
.fo
*****************************************************
Copyright (c) 2000-2004 SAP AG
SAP Database Technology
 
Release :      Date : 2000-11-21
*****************************************************
modname : VAK507
changed : 2000-11-01
module  : Executing_finish
 
Author  : ElkeZ
Created : 1985-10-16
*****************************************************
 
Purpose : Module, which outputs the resuult, destroys
          mess-buffer and so on.
 
Define  :
 
        PROCEDURE
              a507last_command_part (
                    VAR acv        : tak_all_command_glob;
                    VAR dmli       : tak_dml_info;
                    VAR change_rec : tak_changerecord;
                    VAR parsk      : tak_parskey;
                    VAR resnam     : tsp00_KnlIdentifier;
                    VAR w_link     : boolean;
                    qbufp          : tak_sysbufferaddress;
                    VAR ssr_rec    : tak70_select_strat_rec;
                    pos            : integer;
                    mtype          : tgg00_MessType;
                    m2type         : tgg00_MessType2;
                    output_wanted  : boolean);
 
        PROCEDURE
              a507select_part (
                    VAR acv        : tak_all_command_glob;
                    pos            : integer;
                    qbufp          : tak_sysbufferaddress;
                    VAR parsk      : tak_parskey;
                    VAR dmli       : tak_dml_info;
                    VAR ssr_rec    : tak70_select_strat_rec);
 
        PROCEDURE
              a507_putval (
                    VAR acv               : tak_all_command_glob;
                    startpos              : integer;
                    intern_call           : boolean;
                    VAR not_finished_long : tsp00_LongDescriptor);
 
        PROCEDURE
              a507_literal (
                    VAR acv             : tak_all_command_glob;
                    VAR longliteralrec  : tak_longliteral_rec;
                    useliteralbuf       : boolean);
 
        FUNCTION
              a507optim_select_fetch (
                    VAR acv   : tak_all_command_glob;
                    prepare   : boolean;
                    info_byte : tsp00_Uint1;
                    loop_cnt  : integer) : boolean;
 
.CM *-END-* define --------------------------------------
 
***********************************************************
 
 
 
Use     :
 
        FROM
              Scanner : VAK01;
 
        VAR
              a01sysnullkey      : tgg00_SysInfoKey;
              a01diag_monitor_on : boolean;
              a01diag_analyze_on : boolean;
 
        FUNCTION
              a01aligned_cmd_len (len : tsp00_Int4) : tsp00_Int4;
 
      ------------------------------ 
 
        FROM
              AK_universal_semantic_tools : VAK06;
 
        PROCEDURE
              a06init_curr_retpart (VAR acv : tak_all_command_glob);
 
        PROCEDURE
              a06finish_curr_retpart (
                    VAR acv   : tak_all_command_glob;
                    part_kind : tsp1_part_kind;
                    arg_count : tsp00_Int2);
 
        PROCEDURE
              a06retpart_move (
                    VAR acv     : tak_all_command_glob;
                    moveobj_ptr : tsp00_MoveObjPtr;
                    move_len    : tsp00_Int4);
 
        PROCEDURE
              a06a_mblock_init (
                    VAR acv      : tak_all_command_glob;
                    mtype        : tgg00_MessType;
                    m2type       : tgg00_MessType2;
                    VAR tree     : tgg00_FileId);
 
        PROCEDURE
              a06rsend_mess_buf (
                    VAR acv     : tak_all_command_glob;
                    VAR mbuf    : tgg00_MessBlock;
                    return_req  : boolean;
                    VAR e       : tgg00_BasisError);
 
      ------------------------------ 
 
        FROM
              AK_error_handling : VAK07;
 
        PROCEDURE
              a07_b_put_error (
                    VAR acv : tak_all_command_glob;
                    b_err   : tgg00_BasisError;
                    err_code : tsp00_Int4);
 
        PROCEDURE
              a07_hex_uni_error (
                    VAR acv     : tak_all_command_glob;
                    uni_err     : tsp8_uni_error;
                    err_code    : tsp00_Int4;
                    to_unicode  : boolean;
                    bytestr     : tsp00_MoveObjPtr;
                    len         : tsp00_Int4 );
 
      ------------------------------ 
 
        FROM
              AK_BD_procedure_interface : VAK09;
 
        PROCEDURE
              a09activate_lock (
                    VAR t      : tgg00_TransContext;
                    stack_addr : tgg00_StackListPtr;
                    stack_max  : tsp00_Int2;
                    VAR b_err  : tgg00_BasisError);
 
      ------------------------------ 
 
        FROM
              Systeminfo_cache : VAK10;
 
        PROCEDURE
              a10key_del  (
                    VAR acv        : tak_all_command_glob;
                    VAR syspointer : tak_sysbufferaddress);
 
        PROCEDURE
              a10get_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syskey   : tgg00_SysInfoKey;
                    dstate       : tak_directory_state;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg00_BasisError);
 
        PROCEDURE
              a10add_sysinfo (
                    VAR acv       : tak_all_command_glob;
                    VAR syspoint  : tak_sysbufferaddress;
                    VAR b_err     : tgg00_BasisError);
 
        PROCEDURE
              a10_nil_get_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syskey   : tgg00_SysInfoKey;
                    dstate       : tak_directory_state;
                    syslen       : tsp00_Int2;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg00_BasisError);
 
        PROCEDURE
              a10rel_sysinfo (syspointer : tak_sysbufferaddress);
 
        PROCEDURE
              a10repl_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg00_BasisError);
 
        PROCEDURE
              a10cpy_result (
                    VAR acv         : tak_all_command_glob;
                    VAR pars_syskey : tgg00_SysInfoKey;
                    VAR res_syskey  : tgg00_SysInfoKey;
                    rescnt          : tsp00_Int4;
                    VAR b_err       : tgg00_BasisError);
 
      ------------------------------ 
 
        FROM
              AK_Comment : VAK26;
 
        PROCEDURE
              a26add_comment (
                    VAR acv       : tak_all_command_glob;
                    VAR long_desc : tak_long_descriptor);
 
      ------------------------------ 
 
        FROM
              Executing_complex : VAK502;
 
        PROCEDURE
              a502destroy_file (VAR acv : tak_all_command_glob;
                    VAR tree         : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              Long-Support-Getval: VAK508;
 
        PROCEDURE
              a508_unlock_lock_lcolumnid (
                    VAR acv        : tak_all_command_glob;
                    ld_descriptor  : tgg00_Surrogate;
                    mtype          : tgg00_MessType;
                    lock_excl      : boolean);
 
        PROCEDURE
              a508_lget_long_columns (
                    VAR acv             : tak_all_command_glob;
                    VAR change_rec      : tak_changerecord;
                    VAR lcol_lock       : boolean;
                    rec_cnt             : integer;
                    rec_len             : integer;
                    startpos            : integer);
 
        FUNCTION
              a508_lcol_found (
                    VAR acv        : tak_all_command_glob;
                    VAR change_rec : tak_changerecord) : boolean;
 
      ------------------------------ 
 
        FROM
              diagnose analyze : VAK544;
 
        PROCEDURE
              a544get_cmdid(
                    VAR acv     : tak_all_command_glob;
                    VAR parskey : tak_parskey;
                    VAR cmdid   : tgg00_Surrogate);
 
      ------------------------------ 
 
        FROM
              Select_Syntax : VAK60;
 
        PROCEDURE
              a60_change_results (
                    VAR acv        : tak_all_command_glob;
                    VAR data       : tsp00_MoveObj;
                    VAR change_rec : tak_changerecord;
                    startpos       : integer;
                    curr_resreclen : integer);
 
        PROCEDURE
              a60_put_result (
                    VAR acv    : tak_all_command_glob;
                    VAR mblock : tgg00_MessBlock;
                    spos       : integer);
 
        PROCEDURE
              a60rescount (
                    VAR acv  : tak_all_command_glob;
                    rescount : tsp00_Int4);
 
        PROCEDURE
              a60resnum (
                    VAR acv     : tak_all_command_glob;
                    VAR moveobj : tsp00_Buf;
                    startpos    : integer);
 
      ------------------------------ 
 
        FROM
              Part2_Select_Expression : VAK67;
 
        PROCEDURE
              a67_fetchkeys (
                    VAR acv   : tak_all_command_glob;
                    ppoint    : tak_sysbufferaddress;
                    recmaxlen : integer;
                    invmaxlen : integer);
 
        PROCEDURE
              a67_keyspecs (
                    VAR reskeyrec : tak_sysbufferaddress;
                    primlen     : integer;
                    invlen      : integer);
 
      ------------------------------ 
 
        FROM
              Build_Strategy : VAK70;
 
        VAR
              a70glob_fetch_strats      : tgg07_StratEnumSet;
 
        PROCEDURE
              a70_keylengths (
                    VAR acv     : tak_all_command_glob;
                    strategy    : tgg07_StratEnum;
                    primkeylen  : integer;
                    invkeylen   : tsp00_Int2;
                    res_primlen : integer;
                    VAR primlen : integer;
                    VAR invlen  : integer);
 
      ------------------------------ 
 
        FROM
              Fetch_Without_Resulttable : VAK74;
 
        PROCEDURE
              a74_copy_twokeys (
                    VAR acv     : tak_all_command_glob;
                    VAR keysbuf : tak_res_keysbuf;
                    VAR source  : tak_two_keyspecs;
                    VAR dest    : tak_two_keyspecs;
                    res_stat    : tak_sresstate);
 
      ------------------------------ 
 
        FROM
              KB_stringcol_copy_trunc_expand : VKB43;
 
        PROCEDURE
              k43CopyLongColumn (
                    mtrans           : tgg00_TransContextPtr;
                    VAR mheader      : tgg00_MessBufHeader;
                    VAR sourceTabid  : tgg00_Surrogate;
                    VAR sourceLongId : tgg00_Surrogate;
                    VAR destTabid    : tgg00_Surrogate;
                    VAR destLongId   : tgg00_Surrogate;
                    createFile       : boolean);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_1 : VBD01;
 
        VAR
              b01niltree_id : tgg00_FileId;
 
        PROCEDURE
              b01destroy_file (
                    VAR t       : tgg00_TransContext;
                    VAR file_id : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_7 : VBD07;
 
        PROCEDURE
              b07cnext_record (
                    VAR t          : tgg00_TransContext;
                    VAR file_id    : tgg00_FileId;
                    VAR rk         : tgg00_Lkey;
                    VAR set_result : tgg00_BdSetResultRecord;
                    VAR tree_pos   : tgg00_FilePos;
                    VAR b          : tsp00_MoveObj);
 
      ------------------------------ 
 
        FROM
              task_temp_data_cache : VBD21;
 
        PROCEDURE
              b21mp_rows_fetched_put (
                    temp_cache_ptr : tgg00_TempDataCachePtr;
                    rows_fetched : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01code                : tgg04_CodeGlobals;
              g01nil_long_qual       : tgg00_LongQual;
              g01nil_stack_desc      : tgg00_StackDesc;
              g01unicode             : boolean;
 
        PROCEDURE
              g01mblock_init (
                    VAR source_trans : tgg00_TransContext;
                    mess_type  : tgg00_MessType;
                    mess2_type : tgg00_MessType2;
                    VAR mblock : tgg00_MessBlock);
 
        PROCEDURE
              g01stack_init (
                    VAR mblock : tgg00_MessBlock;
                    stack_ptr  : tgg00_StackListPtr;
                    stack_size : tsp00_Int4;
                    qual_ptr   : tgg00_QualBufPtr;
                    qual_size  : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG101;
 
        PROCEDURE
              SAPDB_PascalFill (
                    mod_id      : tsp00_C6;
                    mod_num     : tsp00_Int4;
                    obj_upb     : tsp00_Int4;
                    obj         : tsp00_MoveObjPtr;
                    obj_pos     : tsp00_Int4;
                    length      : tsp00_Int4;
                    fillchar    : char;
                    VAR e       : tgg00_BasisError);
 
        PROCEDURE
              SAPDB_PascalUnicodeFill (
                    mod_id      : tsp00_C6;
                    mod_num     : tsp00_Int4;
                    obj_upb     : tsp00_Int4;
                    obj         : tsp00_MoveObjPtr;
                    obj_pos     : tsp00_Int4;
                    length      : tsp00_Int4;
                    fillchar    : tsp00_C2;
                    VAR e       : tgg00_BasisError);
 
        PROCEDURE
              SAPDB_PascalForcedUnicodeFill (
                    obj_upb     : tsp00_Int4;
                    obj         : tsp00_MoveObjPtr;
                    obj_pos     : tsp00_Int4;
                    length      : tsp00_Int4;
                    fillchar    : tsp00_C2 );
 
        PROCEDURE
              SAPDB_PascalMove (
                    mod_id      : tsp00_C6;
                    mod_num     : tsp00_Int4;
                    source_upb  : tsp00_Int4;
                    dest_upb    : tsp00_Int4;
                    source      : tsp00_MoveObjPtr;
                    src_pos     : tsp00_Int4;
                    destin      : tsp00_MoveObjPtr;
                    dest_pos    : tsp00_Int4;
                    length      : tsp00_Int4;
                    VAR e       : tgg00_BasisError);
 
        PROCEDURE
              SAPDB_PascalOverlappingMove (
                    mod_id      : tsp00_C6;
                    mod_num     : tsp00_Int4;
                    source_upb  : tsp00_Int4;
                    dest_upb    : tsp00_Int4;
                    source      : tsp00_MoveObjPtr;
                    src_pos     : tsp00_Int4;
                    destin      : tsp00_MoveObjPtr;
                    dest_pos    : tsp00_Int4;
                    length      : tsp00_Int4;
                    VAR e       : tgg00_BasisError);
 
        PROCEDURE
              SAPDB_PascalForcedFill (
                    size        : tsp00_Int4;
                    m           : tsp00_MoveObjPtr;
                    pos         : tsp00_Int4;
                    len         : tsp00_Int4;
                    fillchar    : char);
 
        PROCEDURE
              SAPDB_PascalForcedMove (
                    source_upb  : tsp00_Int4;
                    destin_upb  : tsp00_Int4;
                    source      : tsp00_MoveObjPtr;
                    source_pos  : tsp00_Int4;
                    destin      : tsp00_MoveObjPtr;
                    destin_pos  : tsp00_Int4;
                    length      : tsp00_Int4);
 
        PROCEDURE
              SAPDB_PascalForcedOverlappingMove (
                    source_upb  : tsp00_Int4;
                    destin_upb  : tsp00_Int4;
                    source      : tsp00_MoveObjPtr;
                    source_pos  : tsp00_Int4;
                    destin      : tsp00_MoveObjPtr;
                    destin_pos  : tsp00_Int4;
                    length      : tsp00_Int4);
 
        PROCEDURE
              g10mv (
                    mod_id      : tsp00_C6;
                    mod_num     : tsp00_Int4;
                    source_upb  : tsp00_Int4;
                    dest_upb    : tsp00_Int4;
                    source      : tsp00_MoveObjPtr;
                    src_pos     : tsp00_Int4;
                    destin      : tsp00_MoveObjPtr;
                    dest_pos    : tsp00_Int4;
                    length      : tsp00_Int4;
                    VAR e       : tgg00_BasisError);
 
        PROCEDURE
              s10mv (
                    source_upb  : tsp00_Int4;
                    destin_upb  : tsp00_Int4;
                    source      : tsp00_MoveObjPtr;
                    source_pos  : tsp00_Int4;
                    destin      : tsp00_MoveObjPtr;
                    destin_pos  : tsp00_Int4;
                    length      : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              GG_allocator_interface : VGG941;
 
        PROCEDURE
              gg941Deallocate(VAR TransContext : tgg00_TransContext;
                    VAR p : tsp00_Addr);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-20: VSP20;
 
        PROCEDURE
              s20ch4sw (
                    val        : tsp00_Int4;
                    sourceswap : tsp00_SwapKind;
                    VAR dest   : tsp00_Int4;
                    di         : tsp00_Int4;
                    destswap   : tsp00_SwapKind);
 
      ------------------------------ 
 
        FROM
              GET-Conversions : VSP40;
 
        PROCEDURE
              s40g4int (
                    VAR buf  : tsp00_ResNum;
                    pos      : tsp00_Int4;
                    VAR dest : tsp00_Int4;
                    VAR res  : tsp00_NumError);
&       IFDEF TRACE
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01refinfoindex (
                    debug : tgg00_Debug;
                    nam   : tsp00_Sname;
                    idx   : tgg00_RefInfoIndex);
 
        PROCEDURE
              t01strat_enum (
                    debug : tgg00_Debug;
                    nam   : tsp00_Sname;
                    strat : tgg07_StratEnum);
 
        PROCEDURE
              t01int4 (
                    debug    : tgg00_Debug;
                    nam      : tsp00_Sname;
                    int      : tsp00_Int4);
 
        PROCEDURE
              t01surrogate (
                    debug     : tgg00_Debug;
                    nam       : tsp00_Sname;
                    VAR tabid : tgg00_Surrogate);
 
        PROCEDURE
              t01long_qual (
                    debug         : tgg00_Debug;
                    nam           : tsp00_Sname;
                    VAR long_qual : tgg00_LongQual);
 
        PROCEDURE
              t01treeid (
                    layer      : tgg00_Debug;
                    nam        : tsp00_Sname;
                    VAR treeid : tgg00_FileId);
 
        PROCEDURE
              t01moveobj (
                    debug       : tgg00_Debug;
                    VAR moveobj : tsp00_MoveObj;
                    startpos    : tsp00_Int4;
                    endpos      : tsp00_Int4);
 
        PROCEDURE
              t01messblock (
                    debug         : tgg00_Debug;
                    nam           : tsp00_Sname;
                    VAR m         : tgg00_MessBlock);
&       ENDIF
 
      ------------------------------ 
 
        FROM
              RTE-Extension-80: VSP80;
 
        PROCEDURE
              s80uni_trans
                    (src_ptr        : tsp00_MoveObjPtr;
                    src_len         : tsp00_Int4;
                    src_codeset     : tsp00_Int2;
                    dest_ptr        : tsp00_MoveObjPtr;
                    VAR dest_len    : tsp00_Int4;
                    dest_codeset    : tsp00_Int2;
                    trans_options   : tsp8_uni_opt_set;
                    VAR rc          : tsp8_uni_error;
                    VAR err_char_no : tsp00_Int4);
 
.CM *-END-* use -----------------------------------------
 
.sp;.cp 3
 
Synonym :
 
        PROCEDURE
              a60resnum;
 
              tsp00_MoveObj tsp00_Buf
 
        PROCEDURE
              s20ch4sw;
 
              tsp00_MoveObj tsp00_Int4
 
        PROCEDURE
              s40g4int;
 
              tsp00_MoveObj tsp00_ResNum
 
.CM *-END-* synonym -------------------------------------
 
***********************************************************
 
 
 
Description:
 
 
 
A507SELECT_PART
 
-------------------------
 
 
 
This procedure is called at the very end of the execution of a set
 
select.  In it, the system-information records are formed that have
 
as keys the result-set names (and no longer the parse id as after
 
parsing), the number of results found or the keys at which the fetch must
 
begin, etc.
 
 
 
The system information containing all information records relevant for the
 
FETCH, is retrieved.  Space is requested in the cache for this information
 
with the result-set name as key.  The new information is filled
 
with the values of the old information.  The number of results found is
 
taken from part1 of the message buffer.
 
 
 
If a result set was built, the tree description (tree_id) is taken
 
over so that it can be used for the FETCH and it is not necessary to
 
pass via the file directory.
 
 
 
If no result set was built, the start keys and stop keys are transferred.
 
 
 
Res_resstate contains information on whether, for this select, a result set
 
has been built, whether a temporary inversion file
 
(intersect/merge) has been generated and whether an inversion must be
 
used for the search (required for a differentiation in the FETCH
 
(VAK74/VKB75)).  The other information is used to recognize which files
 
must be deleted if the result set is closed.
 
 
 
This system information is stored.
 
 
 
If a SELECT was specified via a join view with FOR UPDATE, the keys of
 
all underlying base records must be stored at the time of each FETCH
 
for the subsequent CURRENT OF.  Whereas a key (single-table select with
 
FOR UPDATE) still fits in the 'normal' system-information record
 
(ereskey, slinkage = '00'), the maximum of 16 keys for a join select must
 
be placed in an extra information record (ereskey, slinkage = '01').
 
The old record is again fetched, space is made for the new record,
 
the old is copied to the new and the new is stored.
 
 
 
Qbufp contains an address in the cache that originates from
 
A53_STRATEGY_SEARCH and that points to a system-information record
 
containing the message buffer
 
necessary for the FETCH (applied to a result set that has not been built).
 
This system information is now stored.
 
 
 
Last of all, the base records for the result set (description of the
 
columns, type eresult) are copied and stored under the result-set
 
name.
 
 
 
The array in which the current result sets are listed stores
 
information on the fact that the SELECT was successfully executed, which
 
parse id it had (each FETCH knows the parse id of the SELECT to which it
 
belongs and can execute checks accordingly), the resstate (see above)
 
and the number of base records (for deleting).
 
 
 
If an error occurs, the system-information records generated up
 
until the time of the error must be deleted.  For this purpose,
 
the value cntokbuf has been incremented within this procedure.  It
 
specifies the types of system information that have already been stored.
 
 
 
A507LAST_COMMAND_PART
 
-------------------------
 
 
 
This procedure is called when the last mess buffer of a command has
 
been processed.
 
 
 
If it was a set select that was the last in a series (not the physical
 
layout of a complicated view), A50_SELECT_PART is called (see that section)
 
in order to complete the system information for the result set.
 
 
 
If it was a single-record select, the result located in part2 must
 
be entered after the result count (= 1) in the SQL_PACKET.
 
 
 
For other commands, the result count located in part1 of the mess
 
buffer is analyzed and either converted to error 100 or shifted to the
 
part2 of the SQL_PACKET.  If there is no result count in the mess
 
buffer, a 1 is written directly to the SQL_PACKET
 
(insert, single update, etc ].
 
 
 
.CM *-END-* description ---------------------------------
 
***********************************************************
 
.CM -lll-
 
Code    :
 
 
CONST
      c_after_select     = true (* ak507store_reskey_rec *);
      c_lock_excl        = true (* a508_unlock_lock_lcolumnid *);
      c_trans_to_uni     = true;   (* a07_hex_uni_err *)
      c_unicode_wid      = 2;      (* a07_hex_uni_err *)
 
 
(*------------------------------*) 
 
PROCEDURE
      ak507putval (
            VAR acv               : tak_all_command_glob;
            startpos              : integer;
            count                 : integer;
            intern_call           : boolean;
            VAR not_finished_long : tsp00_LongDescriptor);
 
VAR
      lock_column      : boolean;
      pos              : integer;
      i                : integer;
      desc_len         : integer;
      defbyte          : tsp00_C1;
      long_desc        : tak_long_descriptor;
 
BEGIN
WITH acv DO
    BEGIN
    (* PTS 1105838 E.Z. *)
    desc_len := sizeof(long_desc.desc);
    pos := startpos;
    i   := 1;
    (* PTS 1116801 E.Z. *)
    WHILE ((a_returncode = 0) AND (i <= count)) DO
        BEGIN
        g10mv ('VAK507',   1,    
              a_data_length, sizeof (long_desc.desc),
              @a_data_ptr^, pos + 1, @long_desc.desc, 1, desc_len,
              a_returncode);
        IF  a_returncode = 0
        THEN
            WITH long_desc, desc DO
                IF  ld_copy in lds_state
                THEN
                    BEGIN
                    k43CopyLongColumn (acv.a_mblock.mb_trns, acv.a_mblock.mb_header,
                          lds_copyTabid, lds_copyLongId,
                          lds_tabid, lds_descriptor, ld_first_insert in lds_state);
                    IF  acv.a_mblock.mb_trns^.trError_gg00 <> e_ok
                    THEN
                        a07_b_put_error (acv, acv.a_mblock.mb_trns^.trError_gg00, 1);
                    (*ENDIF*) 
                    END
                ELSE
                    BEGIN
                    IF  (a_out_packet^.sp1_header.sp1h_mess_swap <>
                        g01code.kernel_swap)
                    THEN
                        BEGIN
                        s20ch4sw (ld_vallen,
                              a_out_packet^.sp1_header.sp1h_mess_swap,
                              ld_vallen, 1, g01code.kernel_swap);
                        s20ch4sw (ld_valpos,
                              a_out_packet^.sp1_header.sp1h_mess_swap,
                              ld_valpos, 1, g01code.kernel_swap);
                        s20ch4sw (ld_intern_pos,
                              a_out_packet^.sp1_header.sp1h_mess_swap,
                              ld_intern_pos, 1, g01code.kernel_swap);
                        END;
                    (*ENDIF*) 
                    ld_valpos := ld_valpos;
                    IF  (ld_unicode in ld_infoset) AND (ld_vallen MOD 2 <> 0)
                        AND
                        (ld_valmode in [vm_alldata, vm_datapart, vm_lastdata])
                    THEN
                        a07_b_put_error (acv, e_st_invalid_length, 0)
                    ELSE
                        BEGIN
&                       ifdef trace
                        t01int4 (ak_sem, 'ld_valmode  ', ord(ld_valmode));
                        t01int4 (ak_sem, 'ld_vallen   ', ld_vallen);
                        t01int4 (ak_sem, 'ld_valpos   ', ld_valpos);
                        t01int4 (ak_sem, 'ld_use_toasc',
                              ord(ld_use_toascii in ld_state));
                        t01int4 (ak_sem, 'ld_swap_ucs2',
                              ord(ld_use_ucs_2_swap in ld_state));
                        t01int4 (ak_sem, 'ld_short_sco',
                              ord(ld_short_scol in ld_state));
&                       endif
                        (* PTS 1113190 E.Z. *)
                        lock_column :=
                              (ld_with_lock IN ld_infoset) AND
                              (ld_valmode in [vm_datapart, vm_alldata]);
                        IF  lock_column
                        THEN
                            a508_unlock_lock_lcolumnid (acv,
                                  long_desc.lds_descriptor,
                                  m_lock, c_lock_excl);
                        (*ENDIF*) 
                        IF  ld_valmode = vm_last_putval
                        THEN
                            BEGIN
                            a_input_data_pos    := pos + desc_len + 1;
                            a_execute_trigger   := ld_ex_trigger in ld_infoset;
                            a_in_internal_subtr := true
                            END;
                        (*ENDIF*) 
                        IF  ld_valmode in [vm_alldata, vm_datapart, vm_lastdata]
                        THEN
                            BEGIN
                            ak507put_val (acv, long_desc);
                            ld_valpos := ld_valpos;
                            IF  lock_column
                            THEN
                                a508_unlock_lock_lcolumnid (acv,
                                      long_desc.lds_descriptor,
                                      m_unlock, c_lock_excl);
                            (*ENDIF*) 
                            END
                        (* PTS 1113250 E.Z. *)
                        ELSE
                            IF  ld_valmode = vm_error
                            THEN
                                BEGIN
                                i := count;
                                a_in_internal_subtr := true;
                                a_part_rollback := true;
                                END;
                            (* PTS 1119422 *)
                            (*ENDIF*) 
                        (*ENDIF*) 
                        IF  (a_out_packet^.sp1_header.sp1h_mess_swap <>
                            g01code.kernel_swap)
                        THEN
                            BEGIN
                            s20ch4sw (ld_vallen, g01code.kernel_swap,
                                  ld_vallen, 1,
                                  a_out_packet^.sp1_header.sp1h_mess_swap);
                            s20ch4sw (ld_valpos, g01code.kernel_swap,
                                  ld_valpos, 1,
                                  a_out_packet^.sp1_header.sp1h_mess_swap);
                            (* PTS 1115845 E.Z. *)
                            s20ch4sw (ld_intern_pos, g01code.kernel_swap,
                                  ld_intern_pos, 1,
                                  a_out_packet^.sp1_header.sp1h_mess_swap);
                            END;
                        (*ENDIF*) 
                        g10mv ('VAK507',   2,    
                              sizeof (long_desc.desc), a_data_length,
                              @long_desc.desc, 1,
                              @a_data_ptr^, pos + 1, desc_len,
                              a_returncode);
                        IF  (ld_valmode = vm_datapart) OR ( ld_valmode = vm_nodata)
                        THEN
                            BEGIN
                            IF  intern_call
                            THEN
                                not_finished_long := long_desc.desc
                            ELSE
                                BEGIN
                                defbyte[ 1 ] := csp_defined_byte;
                                a06retpart_move (acv, @defbyte, sizeof(defbyte));
                                a06retpart_move (acv, @long_desc.desc, desc_len);
                                END;
                            (*ENDIF*) 
                            i := count;
                            END;
                        (*ENDIF*) 
                        END;
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
            (*ENDWITH*) 
        (*ENDIF*) 
        pos := a_input_data_pos;
        i   := succ(i)
        END;
    (*ENDWHILE*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak507put_val (
            VAR acv       : tak_all_command_glob;
            VAR long_desc : tak_long_descriptor);
 
VAR
      b_err        : tgg00_BasisError;
      offset       : tsp00_Int4;
      curr_buf_pos : tsp00_Int4;
      aux_qual     : tgg00_QualBuf;
      mblock       : tgg00_MessBlock;
      e            : tsp8_uni_error;
      err_char_no  : tsp00_Int4;
      outlen       : tsp00_Int4;
 
BEGIN
WITH acv, long_desc, desc DO
    BEGIN
    IF  a_return_segm^.sp1r_function_code > csp1_masscmd_fc_offset
    THEN
        offset := a_data_part^.sp1p_buf_len - a_data_length
    ELSE
        offset := 0;
    (*ENDIF*) 
    IF  a_input_data_pos < ld_valpos - offset + ld_vallen
    THEN
        a_input_data_pos := ld_valpos - offset + ld_vallen;
    (*ENDIF*) 
    IF  ld_is_comment in lds_infoset
    THEN
        BEGIN
        IF  NOT g01unicode
        THEN
            IF  a_out_packet^.sp1_header.sp1h_mess_code = csp_unicode
            THEN
                ld_state := ld_state + [ ld_use_toascii ];
            (*ENDIF*) 
        (*ENDIF*) 
        a26add_comment (acv, long_desc);
        END
    ELSE
        BEGIN
        IF  a_returncode = 0
        THEN
            REPEAT
                curr_buf_pos := ld_valpos - offset;
                IF  ld_without_shortcol IN ld_infoset
                THEN
                    g01mblock_init (a_transinf.tri_trans, m_column, mm_new_write,
                          mblock)
                ELSE
                    g01mblock_init (a_transinf.tri_trans, m_column, mm_write,
                          mblock);
                (*ENDIF*) 
                WITH mblock DO
                    BEGIN
                    mb_struct    := mbs_long;
                    mb_qual      := @aux_qual;
                    mb_qual_size := sizeof (aux_qual);
                    WITH mb_qual^ DO
                        BEGIN
                        mstack_desc    := g01nil_stack_desc;
                        mtree          := b01niltree_id;
                        mtree.fileHandling_gg00 := a_transinf.tri_global_state;
                        ml_long_qual   := g01nil_long_qual;
                        END;
                    (*ENDWITH*) 
                    mb_qual_len  := MB_PART1_HEAD_MXGG00 +
                          sizeof (mb_qual^.ml_long_qual);
                    IF  ld_vallen = 0
                    THEN
                        BEGIN
                        (* may happen with ODBC *)
                        mb_data      := @a_data_ptr^ [ld_valpos - offset];
                        mb_data_len  := ld_vallen;
                        (* a_data_part^.sp1p_buf_size - curr_buf_pos + 1; *)
                        mb_data_size := 0;
                        END
                    ELSE
                        (* PTS 1105838 E.Z. *)
                        IF  (ld_use_toascii in ld_state)
                        THEN
                            BEGIN
                            outlen := ld_vallen;
                            s80uni_trans (@(a_data_ptr^[ld_valpos-offset]), ld_vallen,
                                  a_out_packet^.sp1_header.sp1h_mess_code,
                                  @(a_data_ptr^[ld_valpos-offset]), outlen,
                                  csp_ascii, [ ], e, err_char_no);
                            (* PTS 1107986 E.Z. *)
                            IF  e = uni_ok
                            THEN
                                BEGIN
                                ld_vallen            := outlen;
                                mb_data      := @(a_data_ptr^[ld_valpos-offset]);
                                mb_data_len  := outlen;
                                mb_data_size := outlen;
                                END
                            (* PTS 1107986 E.Z. *)
                            ELSE
                                BEGIN
                                a07_hex_uni_error (acv, e,
                                      err_char_no, NOT c_trans_to_uni,
                                      @(a_data_ptr^[ld_valpos-offset+err_char_no-1]),
                                      c_unicode_wid);
&                               ifdef TRACE
                                t01moveobj (ak_sem, a_data_ptr^, ld_valpos-offset,
                                      ld_valpos-offset+ld_vallen-1);
&                               endif
                                END;
                            (*ENDIF*) 
                            END
                        ELSE
                            (* PTS 1105838 E.Z. *)
                            IF  (ld_use_ucs_2_swap in ld_state)
                            THEN
                                BEGIN
                                outlen := ld_vallen;
                                s80uni_trans (@(a_data_ptr^[ld_valpos-offset]), ld_vallen,
                                      csp_unicode_swap,
                                      @(a_data_ptr^[ld_valpos-offset]), outlen,
                                      csp_unicode, [ ], e, err_char_no);
                                (* PTS 1107986 E.Z. *)
                                IF  e = uni_ok
                                THEN
                                    BEGIN
                                    ld_vallen            := outlen;
                                    mb_data      := @(a_data_ptr^[ld_valpos-offset]);
                                    mb_data_len  := outlen;
                                    mb_data_size := outlen;
                                    END
                                (* PTS 1107986 E.Z. *)
                                ELSE
                                    BEGIN
                                    a07_hex_uni_error (acv, e,
                                          err_char_no, NOT c_trans_to_uni,
                                          @(a_data_ptr^[ld_valpos-offset+err_char_no-1]),
                                          c_unicode_wid);
&                                   ifdef TRACE
                                    t01moveobj (ak_sem, a_data_ptr^, ld_valpos-offset,
                                          ld_valpos-offset+ld_vallen-1);
&                                   endif
                                    END;
                                (*ENDIF*) 
                                END
                            ELSE
                                BEGIN
                                mb_data      := @a_data_ptr^ [ld_valpos - offset];
                                mb_data_len  := ld_vallen;
                                (* a_data_part^.sp1p_buf_size - curr_buf_pos + 1; *)
                                mb_data_size := a_data_part^.sp1p_buf_size -
                                      curr_buf_pos + 1;
                                END;
                            (*ENDIF*) 
                        (*ENDIF*) 
                    (*ENDIF*) 
                    END;
                (*ENDWITH*) 
                (* PTS 1107986 E.Z. *)
                IF  a_returncode = 0
                THEN
                    BEGIN
                    WITH mblock, mb_qual^, ml_long_qual, mb_data^ DO
                        BEGIN
                        mb_qual_len := mb_qual_len + sizeof (mb_qual^.ml_long_qual);
                        mb_qual^.ml_long_qual := g01nil_long_qual;
                        mtree.fileType_gg00  := [ftsPerm_egg00, ftsConcurrent_egg00];
                        mtree.fileTabId_gg00 := ld_descriptor;
                        (* PTS 1113190 E.Z. *)
                        lq_lock_tabid   := long_desc.lds_tabid;
                        (* PTS 1105838 E.Z. *)
                        lq_long_in_file := NOT (ld_short_scol in ld_state);
                        IF  ld_short_scol in ld_state
                        THEN
                            mtree.fileTfn_gg00 := tfnShortScol_egg00
                        ELSE
                            mtree.fileTfn_gg00 := tfnColumn_egg00;
                        (*ENDIF*) 
                        IF  ld_first_insert IN ld_state
                        THEN
                            lq_first_insert := true
                        ELSE
                            lq_first_insert := false;
                        (*ENDIF*) 
                        ld_state := ld_state - [ld_first_insert];
                        lq_pos := ld_intern_pos;
                        IF  ld_intern_pos = -1
                        THEN
                            ld_intern_pos := 1;
                        (*ENDIF*) 
                        lq_data_offset := 0;
                        IF  ld_vallen > mb_data_size
                        THEN
                            lq_len := mb_data_size
                        ELSE
                            lq_len := ld_vallen;
                        (*ENDIF*) 
                        mb_data_len   := lq_len;
                        ld_intern_pos := ld_intern_pos + lq_len;
                        ld_valpos     := ld_valpos + lq_len;
                        ld_vallen     := ld_vallen - lq_len;
                        lq_trunc_req  := ((ld_valmode in [vm_alldata, vm_lastdata]) AND
                              (ld_vallen = 0));
&                       ifdef TRACE
                        t01long_qual (ak_sem, 'putv l_qual ', ml_long_qual);
&                       endif
                        END;
                    (*ENDWITH*) 
                    a06rsend_mess_buf (acv, mblock,
                          cak_return_req, b_err);
                    IF  b_err <> e_ok
                    THEN
                        a07_b_put_error (acv, b_err, 1)
                    ELSE
                        IF  mblock.mb_type = m_return_result
                        THEN
                            BEGIN
                            ld_intern_pos := mblock.mb_qual^.ml_long_qual.lq_pos;
                            (* PTS 1105838 E.Z. *)
                            IF  mblock.mb_qual^.ml_long_qual.lq_long_in_file
                            THEN
                                ld_state := ld_state - [ ld_short_scol ]
                            (*ENDIF*) 
                            END;
                        (*ENDIF*) 
                    (*ENDIF*) 
                    END
                (*ENDIF*) 
            UNTIL
                (ld_vallen = 0) OR
                (a_returncode <> 0);
            (*ENDREPEAT*) 
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a507last_command_part (
            VAR acv        : tak_all_command_glob;
            VAR dmli       : tak_dml_info;
            VAR change_rec : tak_changerecord;
            VAR parsk      : tak_parskey;
            VAR resnam     : tsp00_KnlIdentifier;
            VAR w_link     : boolean;
            qbufp          : tak_sysbufferaddress;
            VAR ssr_rec    : tak70_select_strat_rec;
            pos            : integer;
            mtype          : tgg00_MessType;
            m2type         : tgg00_MessType2;
            output_wanted  : boolean);
 
VAR
      s_select     : boolean;
      lcol_lock    : boolean;
      one_rescount : tsp00_Int4;
      num_err      : tsp00_NumError;
 
BEGIN
WITH acv DO
    BEGIN
    IF  (dmli.d_sparr.px[ 1 ]^.sparsinfo.p_select) AND
        (a_intern_select_cnt = a_max_intern_select)
    THEN
        BEGIN
        IF  (NOT dmli.d_sparr.px[ 1 ]^.sparsinfo.p_single)
        THEN
            a_result_name := resnam;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  (dmli.d_sparr.px[ 1 ]^.sparsinfo.p_select AND
        NOT (dmli.d_sparr.px[ 1 ]^.sparsinfo.p_single) AND
        (parsk.p_kind <> m_insert_select) AND
        (parsk.p_kind <> m_select_row))
    THEN
        BEGIN
        s_select := true;
        IF  (a_intern_select_cnt = a_max_intern_select)
        THEN
            a507select_part (acv, pos, qbufp, parsk, dmli, ssr_rec)
        (*ENDIF*) 
        END
    ELSE
        s_select := false;
    (*ENDIF*) 
&   ifdef trace
    t01int4 (ak_sem, 's_select    ', ord (s_select));
    t01int4 (ak_sem, 'mselect_loop', dmli.d_mselect_loop_cnt);
    t01int4 (ak_sem, 'mselect_resc', dmli.d_mselect_rescnt);
&   endif
    IF  (output_wanted AND
        dmli.d_sparr.px[ 1 ]^.sparsinfo.p_select AND
        dmli.d_sparr.px[ 1 ]^.sparsinfo.p_single)
    THEN
        IF  ((dmli.d_mselect_loop_cnt = cgg04_first_and_only_of_all) AND
            (* no MSELECT INTO *)
            (dmli.d_mselect_rescnt <= 1))
        THEN
            BEGIN
            a60rescount (acv, 1);
            a_long_desc_pos := 0;
            IF  change_rec.cr_colcount > 0
            THEN
                a60_change_results (acv, a_mblock.mb_data^.mbp_buf,
                      change_rec, 0, acv.a_mblock.mb_data_len);
            (*ENDIF*) 
            IF  parsk.p_kind = m_select_row
            THEN
                pos := cgg_rec_key_offset + RESCNT_MXGG04
            ELSE
                pos := cgg_rec_key_offset + acv.a_mblock.mb_data^.mbp_keylen;
            (*ENDIF*) 
            a60_put_result (acv, acv.a_mblock, pos);
            IF  (a_long_desc_pos > 0) AND
                (a_returncode = 0)
            THEN
                BEGIN
&               ifdef TRACE
                t01int4 (ak_sem, 'pos         ', pos);
&               endif
                lcol_lock := true;
                (* PTS 1116801 E.Z. *)
                a508_lget_long_columns (acv, change_rec,
                      lcol_lock, 1, mxsp_long_desc, - pos);
                IF  acv.a_longdemand_data <> NIL
                THEN
                    gg941Deallocate(acv.a_transinf.tri_trans, acv.a_longdemand_data);
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            IF  a_returncode = 0
            THEN
                a06finish_curr_retpart (acv, sp1pk_data, 1)
            (*ENDIF*) 
            END
        ELSE
            BEGIN
            (* MSELECT INTO *)
            a_long_desc_pos := 0;
            IF  change_rec.cr_colcount > 0
            THEN
                a60_change_results (acv, a_mblock.mb_data^.mbp_buf,
                      change_rec, 0, acv.a_mblock.mb_data_len);
            (*ENDIF*) 
            pos := cgg_rec_key_offset +
                  acv.a_mblock.mb_data^.mbp_keylen + 1;
            a06retpart_move (acv, @a_mblock.mb_data^.mbp_buf [ pos ],
                  dmli.d_sparr.px[ 1 ]^.sparsinfo.p_resinfolen);
            IF  (a_returncode = 0) AND
                ((dmli.d_mselect_loop_cnt = cgg04_last_of_this) OR
                ( dmli.d_mselect_loop_cnt = cgg04_first_and_only_of_all) OR
                ( dmli.d_mselect_loop_cnt = cgg04_first_and_only_of_this) OR
                ( dmli.d_mselect_loop_cnt = cgg04_last_of_all))
            THEN
                a06finish_curr_retpart (acv, sp1pk_data,
                      a_curr_retpart^.sp1p_buf_len DIV
                      dmli.d_sparr.px[ 1 ]^.sparsinfo.p_resinfolen);
            (* do not use dmli.d_mselect_rescnt       *)
            (* it only counts real (NOT NULL) results *)
            (*ENDIF*) 
            END
        (*ENDIF*) 
    ELSE
        IF  (acv.a_qualified_jv_upd = no_jv_upd) AND
            ((dmli.d_mselect_loop_cnt = cgg04_last_of_this) OR
            ( dmli.d_mselect_loop_cnt = cgg04_first_and_only_of_all) OR
            ( dmli.d_mselect_loop_cnt = cgg04_first_and_only_of_this) OR
            ( dmli.d_mselect_loop_cnt = cgg04_last_of_all))
        THEN
            WITH a_mblock DO
                BEGIN
                IF  mb_qual_len  > 0
                THEN
                    IF  (( (
                        ((mtype = m_insert_select) AND
                        ( a_sqlmode <> sqlm_oracle)) OR
                        ((mtype in [ m_update, m_delete ]) AND
                        (m2type in [ mm_qual, mm_empty ]))) OR
                        s_select) AND
                        (mb_qual^.mr_resnum = csp_rescnt_zero))
                    THEN
                        BEGIN
                        w_link := false;
                        a07_b_put_error (acv, e_row_not_found, 1)
                        END
                    ELSE
                        BEGIN
                        IF  (a_sqlmode = sqlm_oracle) AND s_select
                        THEN
                            a60rescount (acv, 0)
                        ELSE
                            a60resnum (acv, a_mblock.mb_qual^.buf,
                                  MB_PART1_HEAD_MXGG00 + 1);
                        (*ENDIF*) 
                        END
                    (*ENDIF*) 
                ELSE
                    a60rescount (acv, 1);
                (*ENDIF*) 
                END
            (*ENDWITH*) 
        ELSE
            WITH a_mblock DO
                IF  mb_qual_len  > 0
                THEN
                    BEGIN
                    IF  NOT( (a_sqlmode = sqlm_oracle) AND s_select)
                    THEN
                        BEGIN
                        one_rescount := 0;
                        s40g4int (acv.a_mblock.mb_qual^.mr_resnum, 2,
                              one_rescount, num_err);
                        a_mass_all_rescount := a_mass_all_rescount + one_rescount;
                        END
                    (*ENDIF*) 
                    END
                ELSE
                    a_mass_all_rescount := a_mass_all_rescount + 1;
                (*ENDIF*) 
            (*ENDWITH*) 
        (*ENDIF*) 
    (*ENDIF*) 
    (* PTS 1104055 E.Z. *)
    IF  a_parsing_again
    THEN
        ak507unlock_sys_share (acv);
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(* PTS 1104055 E.Z. *)
(*------------------------------*) 
 
PROCEDURE
      ak507unlock_sys_share (VAR acv : tak_all_command_glob);
 
VAR
      e : tgg00_BasisError;
 
BEGIN
a06a_mblock_init (acv, m_unlock, mm_table, b01niltree_id);
acv.a_mblock.mb_qual^.mlock_cnt := 0;
a06rsend_mess_buf (acv, acv.a_mblock, NOT cak_return_req, e);
END;
 
(*------------------------------*) 
 
PROCEDURE
      a507_putval (
            VAR acv               : tak_all_command_glob;
            startpos              : integer;
            intern_call           : boolean;
            VAR not_finished_long : tsp00_LongDescriptor);
 
BEGIN
WITH acv, a_data_part^ DO
    BEGIN
&   ifdef TRACE
    t01moveobj (ak_sem, a_data_ptr^, 1, a_data_length);
    t01int4 (ak_sem, 'startpos    ', startpos);
    t01int4 (ak_sem, 'longcol_cnt ', sp1p_arg_count);
&   endif
    IF  NOT intern_call
    THEN
        a_input_data_pos := 1;
    (*ENDIF*) 
    IF  ((a_returncode = 0) AND (sp1p_arg_count > 0))
    THEN
        ak507putval (acv, startpos, sp1p_arg_count, intern_call, not_finished_long);
    (*ENDIF*) 
    IF  ((a_returncode <> 0) OR a_part_rollback)
    THEN
        BEGIN
        a_part_rollback     := true;
        a_in_internal_subtr := true
        END
    ELSE
        IF  NOT intern_call AND (a_curr_retpart <> NIL)
        THEN
            IF  a_curr_retpart^.sp1p_buf_len > 0
            THEN
                a06finish_curr_retpart (acv, sp1pk_longdata, 1);
            (*ENDIF*) 
        (*ENDIF*) 
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak507fetchkeys (
            VAR acv   : tak_all_command_glob;
            ppoint    : tak_sysbufferaddress;
            recmaxlen : integer;
            invmaxlen : integer);
 
BEGIN
WITH acv, a_mblock, ppoint^.sreskey, mb_qual^.mf_desc DO
    BEGIN
&   ifdef TRACE
    t01int4 (ak_sem, 'recmaxlen   ', recmaxlen);
    t01int4 (ak_sem, 'invmaxlen   ', invmaxlen);
&   endif
    res_searched_pages := m_searched_pages;
    (* h.b. PTS 1001394
          PTS 1001817 E.Z. *)
    WITH res_startkeys.reckeyspec DO
        BEGIN
        ks_len := m_start.len;
        IF  ks_len > recmaxlen
        THEN
            ks_len := recmaxlen;
        (*ENDIF*) 
        g10mv ('VAK507',   3,    
              sizeof(m_start.k), sizeof(res_keysbuf),
              @m_start.k, 1,
              @res_keysbuf, ks_pos, ks_len,
              a_returncode);
        END;
    (*ENDWITH*) 
    WITH res_nextkeys.reckeyspec DO
        BEGIN
        ks_len := m_startkeys.reckey.len;
        IF  ks_len > recmaxlen
        THEN
            ks_len := recmaxlen;
        (*ENDIF*) 
        g10mv ('VAK507',   4,    
              sizeof(m_startkeys.reckey.k), sizeof(res_keysbuf),
              @m_startkeys.reckey.k, 1,
              @res_keysbuf, ks_pos, ks_len,
              a_returncode);
        END;
    (*ENDWITH*) 
    WITH res_stopkeys.reckeyspec DO
        BEGIN
        ks_len := m_stopkeys.reckey.len;
        IF  ks_len > recmaxlen
        THEN
            ks_len := recmaxlen;
        (*ENDIF*) 
        g10mv ('VAK507',   5,    
              sizeof(m_stopkeys.reckey.k), sizeof(res_keysbuf),
              @m_stopkeys.reckey.k, 1,
              @res_keysbuf, ks_pos, ks_len,
              a_returncode);
        END;
    (*ENDWITH*) 
    WITH res_startkeys.listkeyspec DO
        BEGIN
        ks_len := m_firstkeys.listkey.len;
        IF  ks_len > invmaxlen
        THEN
            ks_len := invmaxlen;
        (*ENDIF*) 
        g10mv ('VAK507',   6,    
              sizeof(m_firstkeys.listkey.k), sizeof(res_keysbuf),
              @m_firstkeys.listkey.k, 1,
              @res_keysbuf, ks_pos, ks_len,
              a_returncode);
        END;
    (*ENDWITH*) 
    WITH res_nextkeys.listkeyspec DO
        BEGIN
        ks_len := m_startkeys.listkey.len;
        IF  ks_len > invmaxlen
        THEN
            ks_len := invmaxlen;
        (*ENDIF*) 
        g10mv ('VAK507',   7,    
              sizeof(m_startkeys.listkey.k), sizeof(res_keysbuf),
              @m_startkeys.listkey.k, 1,
              @res_keysbuf, ks_pos, ks_len,
              a_returncode);
        END;
    (*ENDWITH*) 
    WITH res_stopkeys.listkeyspec DO
        BEGIN
        ks_len := m_stopkeys.listkey.len;
        IF  ks_len > invmaxlen
        THEN
            ks_len := invmaxlen;
        (*ENDIF*) 
        g10mv ('VAK507',   8,    
              sizeof(m_stopkeys.listkey.k), sizeof(res_keysbuf),
              @m_stopkeys.listkey.k, 1,
              @res_keysbuf, ks_pos, ks_len,
              a_returncode);
        END;
    (*ENDWITH*) 
    res_treeids.file_id := m_fns1;
    res_treeids.inv_id  := m_fns2;
    a74_copy_twokeys (acv, res_keysbuf, res_nextkeys, res_prevkeys,
          res_resstate);
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak507store_reskey_rec (
            VAR acv        : tak_all_command_glob;
            pos            : integer;
            VAR parsk      : tak_parskey;
            VAR dmli       : tak_dml_info;
            VAR ssr_rec    : tak70_select_strat_rec;
            VAR newkey     : tgg00_SysInfoKey;
            VAR iresstate  : tak_sresstate;
            after_select   : boolean;
            fetched_records: integer;
            VAR cntresults : tsp00_Int4;
            VAR e          : tgg00_BasisError);
 
VAR
      strat_changed   : boolean;
      recordlen       : integer;
      movelen         : integer;
      primlen         : integer;
      invlen          : integer;
      re              : tsp00_NumError;
      newp            : tak_sysbufferaddress;
      oldp            : tak_sysbufferaddress;
      ke              : tgg00_SysInfoKey;
      strategy        : tgg07_StratEnum;
 
BEGIN
IF  dmli.d_repl_reskey
THEN
    BEGIN
    newkey           := a01sysnullkey;
    WITH acv.a_resname_addr[ pos ]^.sresname.restreeid DO
        BEGIN
        newkey.stempid := fileTempCnt_gg00
        END;
    (*ENDWITH*) 
    newkey.sentrytyp := cak_ereskey;
    a10get_sysinfo (acv, newkey, d_fix, oldp, e);
    IF  e = e_ok
    THEN
        BEGIN
        s40g4int (acv.a_mblock.mb_qual^.mr_resnum, 2,
              oldp^.sreskey.res_actres, re);
        a10repl_sysinfo (acv, oldp, e)
        END;
    (*ENDIF*) 
    IF  e <> e_ok
    THEN
        a07_b_put_error (acv, e, 1);
    (*ENDIF*) 
    END
ELSE
    BEGIN
    ke := a01sysnullkey;
    WITH ke DO
        BEGIN
        sauthid[ 1 ] := cak_tempinfo_byte;
        s10mv (sizeof (parsk), sizeof (sauthid),
              @parsk, 1, @sauthid, 2, mxak_parskey);
        sauthid[ mxak_parskey+1 ] := chr(0);
        sentrytyp := cak_ereskey;
        END;
    (*ENDWITH*) 
    newkey           := a01sysnullkey;
    WITH  acv.a_resname_addr[ pos ]^.sresname.restreeid DO
        BEGIN
        newkey.stempid := fileTempCnt_gg00
        END;
    (*ENDWITH*) 
    a10get_sysinfo (acv, ke, d_fix, oldp, e);
    IF  e <> e_ok
    THEN
        a07_b_put_error (acv, e, 1)
    ELSE
        BEGIN
        newkey.sentrytyp := cak_ereskey;
        recordlen := oldp^.b_sl;
        strategy  := ssr_rec.ssr_old_strategynum;
        (* PTS 1108845 E.Z. *)
        strat_changed := false;
&       ifdef TRACE
        t01strat_enum( ak_sem, 'old_strategy', ssr_rec.ssr_old_strategynum );
&       endif
        WITH oldp^.sreskey DO
            IF  ( strategy = strat_undecided )
                OR
                (* no keys in res_keysbuf ! *)
                (recordlen <= sizeof (oldp^.sreskey) -
                sizeof (res_keysbuf) +
                4 + res_change.cr_colcount*mxak_change_colinfo)
            THEN
                BEGIN
                strategy := ssr_rec.ssr_new_strategynum;
                a70_keylengths (acv, strategy, res_primkeylen,
                      ssr_rec.ssr_invlen, res_keylen, primlen, invlen);
                strategy  := ssr_rec.ssr_old_strategynum;
                recordlen := sizeof( tak_resultkeyrecord ) -
                      mxak_res_keysbuf +
                      4 + res_change.cr_colcount*mxak_change_colinfo +
                      4*primlen + 4*invlen + res_updkey.ks_len;
                (* PTS 1108845 E.Z. *)
                strat_changed := true;
                END
            ELSE
                IF  ( strategy in a70glob_fetch_strats) AND
                    (acv.a_mblock.mb_qual^.mr_res_build)
                    (* strategy was changed from .._fetch to build_result *)
                THEN
                    BEGIN
                    (* every build-strategy has to use res_keylen *)
                    a70_keylengths (acv, strat_key_range, res_primkeylen,
                          ssr_rec.ssr_invlen, res_keylen, primlen, invlen);
                    recordlen := sizeof(tak_resultkeyrecord) -
                          mxak_res_keysbuf +
                          4 + res_change.cr_colcount*mxak_change_colinfo +
                          4*primlen + 4*invlen + res_updkey.ks_len;
                    strat_changed := true;
                    END
                ELSE
                    BEGIN
                    primlen := res_startkeys.listkeyspec.ks_pos -
                          res_startkeys.reckeyspec.ks_pos;
                    invlen := res_stopkeys.reckeyspec.ks_pos -
                          res_startkeys.listkeyspec.ks_pos
                    END;
                (*ENDIF*) 
            (*ENDIF*) 
        (*ENDWITH*) 
        a10_nil_get_sysinfo (acv,
              newkey, d_release, recordlen, newp, e)
        END;
    (*ENDIF*) 
    IF  e = e_ok
    THEN
        BEGIN
        IF  oldp^.b_sl > recordlen
        THEN
            movelen := recordlen
        ELSE
            movelen := oldp^.b_sl;
        (*ENDIF*) 
        g10mv ('VAK507',   9,    
              sizeof (oldp^.sreskey), sizeof (newp^.sreskey),
              @oldp^.sreskey, cak_sysbufferoffset + 1,
              @newp^.sreskey, cak_sysbufferoffset + 1,
              movelen-cak_sysbufferoffset, e);
        IF  e = e_ok
        THEN
            BEGIN
            (* PTS 1108845 E.Z. *)
            IF  strat_changed
            THEN
                BEGIN
                a67_keyspecs (newp, primlen, invlen);
                newp^.sreskey.res_dist_optim := dmli.d_dist_optim;
                newp^.sreskey.res_reverse_access := ssr_rec.ssr_reverse_access;
                END;
            (*ENDIF*) 
            IF  acv.a_union_cnt > 0
            THEN
                newp^.sreskey.res_build := true
            ELSE
                IF  acv.a_mblock.mb_qual^.mr_res_build
                THEN
                    newp^.sreskey.res_build := true
                ELSE
                    newp^.sreskey.res_build := false;
                (*ENDIF*) 
            (*ENDIF*) 
            (* used, if strat=fieldin, although it was fe_eval_strat*)
&           ifdef trace
            t01int4 (ak_sem, 'd_strat_info', ord (dmli.d_strat_info));
            t01refinfoindex (ak_sem, 'r_strat_info', newp^.sreskey.res_strat_info);
            t01int4 (ak_sem, 'd_qual_kind ', ord (dmli.d_qual_kind));
&           endif
            newp^.sreskey.res_qual_kind := dmli.d_qual_kind;
            IF  (dmli.d_strat_info <> ir_v_acc) AND
                (newp^.sreskey.res_strat_info = ir_v_acc)
            THEN
                newp^.sreskey.res_strat_info := dmli.d_strat_info;
            (*ENDIF*) 
            WITH acv.a_mblock, mb_qual^ DO
                BEGIN
&               IFDEF TRACE
                t01messblock (ak_sem, 'MBLOCK 507se', acv.a_mblock);
                t01treeid    (ak_sem, 'mr_restree  ', mr_restree);
                IF  (acv.a_unionrec_ptr <> NIL) AND (acv.a_union_cnt > 0)
                THEN
                    t01treeid (ak_sem, 'ures_tree   ',
                          acv.a_unionrec_ptr^.sunionrec.ures_tree);
&               ENDIF
                (*ENDIF*) 
                s40g4int (mr_resnum, 2,
                      newp^.sreskey.res_actres, re);
                cntresults := newp^.sreskey.res_actres;
                IF  newp^.sreskey.res_build
                THEN
                    BEGIN
                    newp^.sreskey.res_restree := mr_restree;
                    IF  newp^.sreskey.res_updkey.ks_len = 1
                        (* 1 byte for warn2 *)
                    THEN
                        IF  NOT (warn2_null_in_builtin_func
                            in acv.a_transinf.tri_trans.trWarning_gg00)
                        THEN
                            newp^.sreskey.res_updkey.ks_len := 0;
                        (*ENDIF*) 
                    (*ENDIF*) 
                    acv.a_resname_addr[ pos ]^.sresname.
                          restreeid := newp^.sreskey.res_restree;
                    END
                ELSE
                    BEGIN
                    IF  after_select
                    THEN
                        a67_fetchkeys (acv, newp, primlen, invlen)
                    ELSE
                        BEGIN
                        (* the first x results are fetched *)
                        ak507fetchkeys (acv, newp, primlen, invlen);
                        END;
                    (*ENDIF*) 
                    WITH newp^.sreskey DO
                        acv.a_resname_addr[ pos ]^.sresname.resimpl_upd_stat :=
                              ((res_searched_pages > cak68_updstat_minpages) AND
                              (res_searched_pages > res_known_pages * cak68_updstat_factor));
                    (*ENDWITH*) 
                    END
                (*ENDIF*) 
                END;
            (*ENDWITH*) 
            iresstate := newp^.sreskey.res_resstate;
            iresstate := iresstate + [ rs_result ] - [ rs_noresult ]
                  - [ rs_intinvnoresult ] - [ rs_useinv ];
            strategy := ssr_rec.ssr_new_strategynum;
            IF  ( strategy in a70glob_fetch_strats ) OR
                ( strategy = strat_no_result )
            THEN
                BEGIN
                iresstate := iresstate - [ rs_result ];
                CASE strategy OF
                    strat_inv_range_fetch :
                        iresstate := iresstate +
                              [ rs_noresult ] + [ rs_useinv ];
                    strat_inv_range_merge_fetch :
                        iresstate := iresstate +
                              [ rs_intinvnoresult ] + [ rs_useinv ];
                    strat_key_equal_fetch,
                    strat_key_range_fetch,
                    strat_no_result :
                        iresstate := iresstate + [ rs_noresult ];
                    END;
                (*ENDCASE*) 
                END
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        IF  e = e_ok
        THEN
            BEGIN
            newp^.sreskey.res_resstate := iresstate;
            IF  fetched_records > 0
            THEN
                BEGIN
                newp^.sreskey.res_nextpos := fetched_records;
                newp^.sreskey.res_prevpos := fetched_records;
                END;
            (*ENDIF*) 
            newp^.sreskey.res_fullen := recordlen;
            newp^.b_sl := recordlen;
            newp^.b_kl := oldp^.b_kl;
            a10add_sysinfo (acv, newp, e)
            END;
        (*ENDIF*) 
        IF  e = e_ok
        THEN
            BEGIN
            WITH acv.a_resname_addr[ pos ]^.sresname,
                 oldp^.sreskey DO
                BEGIN
                resparsinfobyte   := res_parsinfob;
                resdatetimeformat := res_pars_dt_format;
                resunlocktabid    := res_unlocktab;
                resdecresdel      := res_decresdel;
                IF  a01diag_analyze_on
                THEN
                    a544get_cmdid (acv, parsk, resanalyze_cmdid);
                (*ENDIF*) 
                END;
            (*ENDWITH*) 
            a10rel_sysinfo (oldp)
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
FUNCTION
      a507optim_select_fetch (
            VAR acv   : tak_all_command_glob;
            prepare   : boolean;
            info_byte : tsp00_Uint1;
            loop_cnt  : integer) : boolean;
 
BEGIN
WITH acv DO
    a507optim_select_fetch :=
          NOT (sp1co_selfetch_off in
          a_cmd_segment_header.sp1c_command_options)       AND
          (a_comp_type <> at_unknown)                      AND
          prepare                                          AND
          ((info_byte = csp1_p_mass_select_found)       OR
          ( info_byte = csp1_p_reuse_mass_select_found) OR
          ( info_byte = csp1_p_mselect_found)           OR
          ( info_byte = csp1_p_reuse_mselect_found))       AND
          (a_init_ex_kind = only_executing)                AND
          (a_sqlmode = sqlm_oracle)                        AND
          ((loop_cnt = -1) OR (loop_cnt = 0))
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a507select_part (
            VAR acv        : tak_all_command_glob;
            pos            : integer;
            qbufp          : tak_sysbufferaddress;
            VAR parsk      : tak_parskey;
            VAR dmli       : tak_dml_info;
            VAR ssr_rec    : tak70_select_strat_rec);
 
VAR
      e                   : tgg00_BasisError;
      build               : boolean;
      select_fetch        : tak_select_fetch_type;
      cntresults          : tsp00_Int4;
      re                  : tsp00_NumError;
      iresstate           : tak_sresstate;
      reskeyp             : tak_sysbufferaddress;
      ke                  : tgg00_SysInfoKey;
      ke1                 : tgg00_SysInfoKey;
      set_result          : tgg00_BdSetResultRecord;
      firstres            : boolean;
      direct_retpart_move : boolean;
      i                   : integer;
      start               : tsp00_Int4;
      tree_pos            : tgg00_FilePos;
      lcol_found          : boolean;
      lcol_lock           : boolean;
      bd_lkey             : tgg00_Lkey;
      unused_leng         : integer;
      count1              : tsp00_Int4; (* PTS 1119719 *)
      count2              : integer;
      cnt                 : integer;
      foundrecs           : integer;
      act_cnt             : integer;
      l                   : tsp00_Int2;
      resname_bytes       : tsp00_Int2;
      fetch_desc          : tgg00_FetchDesc;
      m_mb_data           : tgg00_DataPartPtr;
      m_mb_data_size      : tsp00_Int4;
      wanted_result_cnt   : tsp00_Int4;
      initial_parsk       : tak_parskey;
 
BEGIN
WITH acv DO
    IF  a_returncode = 0
    THEN
        BEGIN
        e := e_ok;
        select_fetch := sft_normal_select;
&       ifdef TRACE
        t01int4 (ak_sem, 'union_cnt   ', a_union_cnt);
        t01int4 (ak_sem, 'res_build   ', ord(a_mblock.mb_qual^.mr_res_build));
        t01int4 (ak_sem, 'comp_type   ', ord(a_comp_type));
        t01int4 (ak_sem, 'comp_vers[1]', ord(a_comp_vers[4]));
        t01int4 (ak_sem, 'comp_vers[2]', ord(a_comp_vers[5]));
        t01int4 (ak_sem, 'prepare     ',
              ord(dmli.d_sparr.px[ 1 ]^.sparsinfo.p_prepare));
        t01int4 (ak_sem, 'is_select   ',
              ord(dmli.d_sparr.px[ 1 ]^.sparsinfo.p_precomp_info_byte =
              csp1_p_mass_select_found));
        t01int4 (ak_sem, 'execute     ',
              ord(a_init_ex_kind = only_executing));
&       endif
        build := ((a_union_cnt > 0) OR
              a_mblock.mb_qual^.mr_res_build);
&       ifdef TRACE
        t01int4 (ak_sem, 'build       ', ord(build));
&       endif
        ke1 := a01sysnullkey;
        WITH ke1 DO
            BEGIN
            sauthid[ 1 ] := cak_tempinfo_byte;
            s10mv (sizeof (parsk), sizeof (sauthid),
                  @parsk, 1, @sauthid, 2, mxak_parskey);
            sauthid[ mxak_parskey+1 ] := chr(0);
            sentrytyp := cak_ereskey;
            END;
        (*ENDWITH*) 
        reskeyp := NIL;
        IF  a_initial_segment_header.sp1c_mess_type = sp1m_execute
        THEN
            initial_parsk := dmli.d_initial_ex_parskey
        ELSE
            initial_parsk := parsk;
        (*ENDIF*) 
        IF  a507optim_select_fetch (acv,
            dmli.d_sparr.px[ 1 ]^.sparsinfo.p_prepare,
            dmli.d_sparr.px[ 1 ]^.sparsinfo.p_precomp_info_byte,
            dmli.d_mselect_loop_cnt)
        THEN
            BEGIN
&           ifdef TRACE
            t01int4 (ak_sem, 'SELFET start', 1);
&           endif
            (* h.b. CR 1000072 *)
            wanted_result_cnt := csp_maxint4;
            IF  (a_rescount_part <> NIL) AND
                (a_rescount_part^.sp1p_buf [ 1 ]  = csp_defined_byte)
            THEN
                BEGIN
                s40g4int (a_rescount_part^.sp1p_resnum, 2,
                      wanted_result_cnt, re);
                IF  re <> num_ok
                THEN
                    wanted_result_cnt := csp_maxint4;
                (*ENDIF*) 
                END;
&           ifdef TRACE
            (*ENDIF*) 
            t01int4 (ak_sem, 'wanted_res_c', wanted_result_cnt);
&           endif
            IF  a_mblock.mb_qual^.mr_resnum = csp_rescnt_zero
            THEN
                BEGIN
                select_fetch := sft_select_all_results;
                b01destroy_file (acv.a_transinf.tri_trans,
                      a_mblock.mb_qual^.mr_restree);
                IF  acv.a_transinf.tri_trans.trError_gg00 <> e_ok
                THEN
                    a07_b_put_error (acv, acv.a_transinf.tri_trans.trError_gg00, 1);
                (*ENDIF*) 
                IF  a_returncode = 0
                THEN
                    BEGIN
                    a10get_sysinfo (acv, ke1, d_fix, reskeyp, e);
                    IF  e <> e_ok
                    THEN
                        a07_b_put_error (acv, e, 1)
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
                END
            ELSE
                IF  build
                THEN
                    BEGIN
                    (* aufgebaute Ergmenge *)
                    iresstate := [ ];
                    select_fetch := sft_select_all_results;
                    s40g4int (a_mblock.mb_qual^.mr_resnum, 2,
                          cntresults, re);
                    (* PTS 1103437 E.Z. *)
                    IF  a_mass_all_rescount > 0
                    THEN
                        cntresults := cntresults + a_mass_all_rescount;
                    (*ENDIF*) 
                    lcol_found := false;
                    a09activate_lock (a_transinf.tri_trans, a_work_st_addr,
                          a_work_st_max, e);
                    IF  e = e_rollback_wanted
                    THEN
                        BEGIN
                        a_rollback_info := [ trans_rollback, new_trans ];
                        e := e_work_rolled_back
                        END;
                    (*ENDIF*) 
                    IF  e <> e_ok
                    THEN
                        a07_b_put_error (acv, e, 1);
                    (*ENDIF*) 
                    IF  a_returncode = 0
                    THEN
                        BEGIN
                        WITH a_mblock DO
                            BEGIN
                            a60rescount (acv, 0);
                            IF  a_curr_retpart = NIL
                            THEN
                                a06init_curr_retpart (acv);
                            (*ENDIF*) 
                            e       := e_ok;
                            IF  g01unicode
                            THEN
                                resname_bytes := sizeof(tsp1_part_header) +
                                      a01aligned_cmd_len (sizeof(tsp00_KnlIdentifier) DIV 2 *
                                      a_max_codewidth)
                            ELSE
                                resname_bytes := sizeof(tsp1_part_header) +
                                      a01aligned_cmd_len (sizeof(tsp00_KnlIdentifier));
                            (*ENDIF*) 
                            a_curr_retpart^.sp1p_buf_size :=
                                  a_curr_retpart^.sp1p_buf_size - resname_bytes;
                            unused_leng := a_curr_retpart^.sp1p_buf_size;
                            l := dmli.d_sparr.px[ 1 ]^.sparsinfo.p_resinfolen;
&                           ifdef TRACE
                            t01int4 (ak_sem, 'unused_leng ', unused_leng);
                            t01int4 (ak_sem, 'l           ', l);
&                           endif
                            count1 := unused_leng DIV l;
                            IF  wanted_result_cnt < count1
                            THEN
                                count1 := wanted_result_cnt;
                            (*ENDIF*) 
                            IF  count1 < cntresults
                            THEN
                                BEGIN
                                (* not all results will fit into command segment *)
                                ak507store_reskey_rec (acv, pos, parsk, dmli,
                                      ssr_rec, ke1, iresstate,
                                      c_after_select, count1, cntresults, e);
                                select_fetch := sft_select_some_results;
                                END;
                            (*ENDIF*) 
                            IF  a_returncode = 0
                            THEN
                                BEGIN
                                a10get_sysinfo (acv, ke1, d_fix, reskeyp, e);
                                IF  e <> e_ok
                                THEN
                                    a07_b_put_error (acv, e, 1)
                                (*ENDIF*) 
                                END;
                            (*ENDIF*) 
                            IF  a_returncode = 0
                            THEN
                                BEGIN
                                IF  (reskeyp^.sreskey.res_change.cr_colcount > 0)
                                THEN
                                    lcol_found := a508_lcol_found (acv,
                                          reskeyp^.sreskey.res_change);
                                (*ENDIF*) 
                                WITH set_result DO
                                    BEGIN
                                    bd_key_check_len := 0;
                                    bd_max_rec_cnt   := 1;
                                    bd_max_fill_len  := a_mblock.mb_data_size;
                                    bd_next          := true;
                                    END;
                                (*ENDWITH*) 
                                bd_lkey.len := 0;
                                firstres := true;
                                e    := e_buffer_limit;
                                count2         := 0;
                                tree_pos.tpsPno_gg00 := NIL_PAGE_NO_GG00;
                                WHILE ((a_returncode = 0) AND
                                      (count2 < count1) AND
                                      (e = e_buffer_limit)) DO
                                    BEGIN
                                    set_result.bd_max_rec_cnt := count1-count2;
                                    b07cnext_record (a_transinf.tri_trans,
                                          a_mblock.mb_qual^.mr_restree, bd_lkey,
                                          set_result, tree_pos, mb_data^.mbp_buf);
                                    IF  a_transinf.tri_trans.trError_gg00 = e_key_not_found
                                    THEN
                                        e := e_ok
                                    ELSE
                                        e := a_transinf.tri_trans.trError_gg00;
                                    (*ENDIF*) 
                                    IF  ((e <> e_ok)           AND
                                        ( e <> e_buffer_limit) AND
                                        ( e <> e_no_next_record))
                                    THEN
                                        a07_b_put_error (acv, e, 1)
                                    ELSE
                                        WITH a_mblock, mb_data^ DO
                                            BEGIN
                                            set_result.bd_next := false;
                                            cnt := set_result.bd_rec_cnt;
                                            IF  (firstres AND (cnt > 0))
                                            THEN
                                                WITH reskeyp^.sreskey DO
                                                    IF  res_keylen <> mbp_keylen
                                                    THEN
                                                     a07_b_put_error (acv, e_too_long_key, 1)
                                                    ELSE
                                                     IF  res_reclen <> mbp_reclen
                                                     THEN
                                                      a07_b_put_error (acv, e_too_long_record, 1);
                                                     (*ENDIF*) 
                                                    (*ENDIF*) 
                                                (*ENDWITH*) 
                                            (*ENDIF*) 
                                            firstres                := false;
                                            start := 1;
                                            IF  unused_leng
                                                < a_curr_retpart^.sp1p_buf_len + (cnt * l)
                                            THEN
                                                a07_b_put_error (acv, e_stack_overflow, 1);
                                            (*ENDIF*) 
                                            count2      := count2+cnt;
                                            IF  a_returncode = 0
                                            THEN
                                                WITH reskeyp^.sreskey DO
                                                    BEGIN
                                                    FOR i := 1 TO cnt DO
                                                     BEGIN
                                                     a60_change_results (acv,
                                                        mb_data^.mbp_buf,
                                                        res_change, start - 1,
                                                        l + cgg_rec_key_offset+res_keylen);
                                                     a06retpart_move (acv,
                                                        @mbp_buf [start+cgg_rec_key_offset+res_keylen], l);
                                                     IF  (i = cnt) AND
                                                      (count1 < cntresults)
                                                     THEN
                                                      WITH reskeyp^.sreskey DO
                                                       BEGIN
                                                       res_first_fetch := false;
                                                       g10mv ('VAK507',  10,    
                                                          mb_data_size,
                                                          sizeof(res_keysbuf),
                                                          @mb_data^.mbp_buf, start+cgg_rec_key_offset,
                                                          @res_keysbuf,
                                                          res_nextkeys.reckeyspec.ks_pos,
                                                          res_keylen,
                                                          a_returncode);
                                                       res_nextkeys.reckeyspec.ks_len :=
                                                          res_keylen;
                                                       g10mv ('VAK507',  11,    
                                                          mb_data_size,
                                                          sizeof(res_keysbuf),
                                                          @mb_data^.mbp_buf, start+cgg_rec_key_offset,
                                                          @res_keysbuf,
                                                          res_prevkeys.reckeyspec.ks_pos,
                                                          res_keylen,
                                                          a_returncode);
                                                       res_prevkeys.reckeyspec.ks_len :=
                                                          res_keylen;
                                                       a10repl_sysinfo (acv, reskeyp, e)
                                                       END;
                                                      (*ENDWITH*) 
                                                     (*ENDIF*) 
                                                     start := start+reskeyp^.sreskey.res_reclen
                                                     END
                                                    (*ENDFOR*) 
                                                    END
                                                (*ENDWITH*) 
                                            (*ENDIF*) 
                                            END
                                        (*ENDWITH*) 
                                    (*ENDIF*) 
                                    END;
                                (*ENDWHILE*) 
                                IF  e = e_no_next_record
                                THEN
                                    BEGIN
                                    IF  (count2 > 0)
                                    THEN
                                        e := e_ok
                                    ELSE
                                        a07_b_put_error (acv, e_row_not_found, 1)
                                    (*ENDIF*) 
                                    END;
                                (*ENDIF*) 
                                END;
                            (*ENDIF*) 
                            IF  lcol_found
                            THEN
                                BEGIN
                                IF  cnt > 0
                                THEN
                                    WITH reskeyp^.sreskey DO
                                        BEGIN
                                        fetch_desc := a_mblock.mb_qual^.mf_desc;
                                        lcol_lock := true;
                                        a508_lget_long_columns (acv, res_change,
                                              lcol_lock, count2,
                                              l, - (res_keylen + cgg_rec_key_offset));
                                        a_mblock.mb_qual^.mf_desc := fetch_desc;
                                        END;
                                    (*ENDWITH*) 
                                (*ENDIF*) 
                                a_long_desc_pos := 0;
                                END;
                            (*ENDIF*) 
                            a_curr_retpart^.sp1p_buf_size :=
                                  a_curr_retpart^.sp1p_buf_size + resname_bytes;
                            IF  count1 < cntresults
                            THEN
                                BEGIN
                                (* PTS 1109575 E.Z. *)
                                IF  reskeyp <> NIL
                                THEN
                                    BEGIN
                                    a10repl_sysinfo (acv, reskeyp, e);
                                    IF  e <> e_ok
                                    THEN
                                        a07_b_put_error (acv, e, 1);
                                    (*ENDIF*) 
                                    END
                                (*ENDIF*) 
                                END
                            ELSE
                                BEGIN
                                b01destroy_file (acv.a_transinf.tri_trans,
                                      a_mblock.mb_qual^.mr_restree);
                                IF  acv.a_transinf.tri_trans.trError_gg00 <> e_ok
                                THEN
                                    a07_b_put_error (acv, acv.a_transinf.tri_trans.trError_gg00, 1)
                                (*ENDIF*) 
                                END
                            (*ENDIF*) 
                            END;
                        (*ENDWITH*) 
                        END;
                    (*ENDIF*) 
                    IF  a_returncode = 0
                    THEN
                        BEGIN
                        IF  (count2 = cntresults)
                        THEN
                            a_curr_retpart^.sp1p_attributes := [ sp1pa_last_packet ];
                        (*ENDIF*) 
                        a06finish_curr_retpart (acv, sp1pk_data, count2);
                        IF  a01diag_monitor_on OR a01diag_analyze_on
                        THEN
                            b21mp_rows_fetched_put (acv.a_transinf.tri_trans.trBdTcachePtr_gg00,
                                  count2);
                        (*ENDIF*) 
                        END;
                    (*ENDIF*) 
                    e := e_ok;
                    ke.slinkage[2] := chr(csp_maxint1);
                    END
                ELSE
                    BEGIN
                    (* not build *)
&                   ifdef TRACE
                    t01int4 (ak_sem, 'not build   ', ord(NOT build));
&                   endif
                    select_fetch := sft_select_all_results;
                    lcol_found := false;
                    WITH qbufp^.smessblock.mbr_mess_block,
                         a_mblock.mb_qual^.mf_desc DO
                        BEGIN
                        direct_retpart_move :=
                              (m_keylen + cgg_rec_key_offset -
                              (mb_st^[mb_qual^.mqual_pos].elen_var - 1) = 0);
                        e := e_ok;
                        foundrecs := 0;
                        a60resnum (acv, a_mblock.mb_qual^.buf,
                              MB_PART1_HEAD_MXGG00 + 1);
                        IF  a_curr_retpart = NIL
                        THEN
                            a06init_curr_retpart (acv);
                        (*ENDIF*) 
                        IF  g01unicode
                        THEN
                            resname_bytes := sizeof(tsp1_part_header) +
                                  a01aligned_cmd_len (sizeof(tsp00_KnlIdentifier) DIV 2 *
                                  a_max_codewidth)
                        ELSE
                            resname_bytes := sizeof(tsp1_part_header) +
                                  a01aligned_cmd_len (sizeof(tsp00_KnlIdentifier));
                        (*ENDIF*) 
                        a_curr_retpart^.sp1p_buf_size :=
                              a_curr_retpart^.sp1p_buf_size - resname_bytes;
                        cnt := a_curr_retpart^.sp1p_buf_size DIV m_leng;
                        a10get_sysinfo (acv, ke1, d_fix, reskeyp, e);
                        IF  e <> e_ok
                        THEN
                            a07_b_put_error (acv, e, 1)
                        ELSE
                            (* PTS 1106648 E.Z. *)
                            BEGIN
                            IF  (reskeyp^.sreskey.res_change.cr_colcount > 0)
                            THEN
                                lcol_found := a508_lcol_found (acv,
                                      reskeyp^.sreskey.res_change);
                            (*ENDIF*) 
                            cnt := (a_curr_retpart^.sp1p_buf_size -
                                  (reskeyp^.sreskey.res_reclen -
                                  reskeyp^.sreskey.res_length))
                                  DIV m_leng;
                            END;
                        (*ENDIF*) 
                        m_mb_data      := a_mblock.mb_data;
                        m_mb_data_size := a_mblock.mb_data_size;
                        IF  a_returncode = 0
                        THEN
                            REPEAT
                                a_mblock.mb_type                 := m_fetch;
                                IF  (ssr_rec.ssr_old_strategynum = strat_key_equal_fetch)
                                    OR
                                    ((ssr_rec.ssr_old_strategynum = strat_undecided) AND
                                    (ssr_rec.ssr_new_strategynum = strat_key_equal_fetch))
                                THEN
                                    acv.a_mblock.mb_type2 := mm_direct
                                ELSE
                                    acv.a_mblock.mb_type2 := mm_next;
                                (*ENDIF*) 
                                a_mblock.mb_qual^.mfirst_free    :=
                                      a_mblock.mb_qual^.mstrat_pos;
                                a_mblock.mb_st                   := mb_st;
                                a_mblock.mb_st_size              := mb_st_size;
                                a_mblock.mb_struct               := mbs_stack_addr;
                                a_mblock.mb_qual^.mst_addr       := mb_st;
                                a_mblock.mb_data_len             := mb_data_len;
                                (*IF  direct_retpart_move*)
                                (*THEN*)
                                (*BEGIN*)
                                a_mblock.mb_data := @a_curr_retpart^.sp1p_buf[
                                      a_curr_retpart^.sp1p_buf_len + 1];
                                a_mblock.mb_data_size := a_curr_retpart^.sp1p_buf_size -
                                      a_curr_retpart^.sp1p_buf_len;
                                m_data := mb_data;
                                m_fns1.fileLeafNodes_gg00 := cgg_nil_leafnodes;
                                IF  hsConsistentLock_egg00 in m_fns1.fileHandling_gg00
                                THEN
                                    m_fns1.fileHandling_gg00 := m_fns1.fileHandling_gg00 +
                                          [ hsCollisionTest_egg00 ] - [ hsConsistentLock_egg00 ];
                                (*ENDIF*) 
                                IF  (hsPermLock_egg00 in m_fns1.fileHandling_gg00) AND
                                    NOT (hsIntentExcl_egg00 in m_fns1.fileHandling_gg00)
                                THEN
                                    m_fns1.fileHandling_gg00 := m_fns1.fileHandling_gg00
                                          + [ hsWithoutLock_egg00 ];
                                (* h.b. PTS 1000801 *)
                                (* h.b. PTS 1104018 *)
                                (*ENDIF*) 
                                m_rescnt := reskeyp^.sreskey.res_nextpos;
                                (* h.b. PTS 1001537 *)
                                (* h.b. PTS 1104018 *)
                                m_rowno  := reskeyp^.sreskey.res_rowno;
                                m_cnt    := cnt - foundrecs;
                                act_cnt  := m_cnt;
                                a06rsend_mess_buf (acv, a_mblock,
                                      cak_return_req, e);
                                IF  e <> e_ok
                                THEN
                                    IF  e = e_key_not_found
                                    THEN
                                        mb_trns^.trError_gg00 := e_ok
                                    ELSE
                                        IF  (mb_trns^.trError_gg00 = e_no_next_invkey) OR
                                            (mb_trns^.trError_gg00 = e_no_next_record) OR
                                            (mb_trns^.trError_gg00 = e_no_prev_invkey) OR
                                            (mb_trns^.trError_gg00 = e_no_prev_record)
                                        THEN
                                            mb_trns^.trError_gg00 := e_no_next_record
                                        ELSE
                                            BEGIN
                                            mb_trns^.trError_gg00 := e;
                                            a07_b_put_error (acv, mb_trns^.trError_gg00, 1);
                                            END;
                                        (*ENDIF*) 
                                    (*ENDIF*) 
                                (*ENDIF*) 
                                IF  mb_trns^.trError_gg00 = e_ok
                                THEN
                                    IF  m_cnt = 0
                                    THEN
                                        mb_trns^.trError_gg00 := e_no_next_record;
                                    (*ENDIF*) 
                                (*ENDIF*) 
                                IF  mb_trns^.trError_gg00 = e_ok
                                THEN
                                    BEGIN
                                    IF  direct_retpart_move
                                    THEN
                                        BEGIN
                                        a_curr_retpart^.sp1p_buf_len :=
                                              a_curr_retpart^.sp1p_buf_len +
                                              a_mblock.mb_data_len;
                                        a_curr_retpart^.sp1p_arg_count :=
                                              a_curr_retpart^.sp1p_arg_count + m_cnt;
                                        END
                                    ELSE
                                        a06retpart_move (acv,
                                              @a_mblock.mb_data^.mbp_buf,
                                              m_cnt * m_leng);
                                    (*ENDIF*) 
                                    IF  reskeyp^.sreskey.res_change.cr_colcount > 0
                                    THEN
                                        FOR i := 1 TO m_cnt DO
                                            a60_change_results (acv,
                                                  a_mblock.mb_data^.mbp_buf,
                                                  reskeyp^.sreskey.res_change,
                                                  (i-1) * m_leng-m_keylen-cgg_rec_key_offset,
                                                  cgg_rec_key_offset+m_keylen+m_leng);
                                        (*ENDFOR*) 
                                    (*ENDIF*) 
                                    foundrecs := foundrecs + m_cnt;
                                    END;
                                (*ENDIF*) 
                            UNTIL
                                (foundrecs = cnt) OR
                                (act_cnt > a_mblock.mb_qual^.mf_desc.m_cnt) OR
                                (a_returncode <> 0) OR
                                (mb_trns^.trError_gg00 = e_no_next_record);
                            (*ENDREPEAT*) 
                        (*ENDIF*) 
                        a_mblock.mb_data      := m_mb_data;
                        a_mblock.mb_data_size := m_mb_data_size;
                        IF  foundrecs = 0
                        THEN
                            a_mblock.mb_qual^.mr_resnum := csp_rescnt_zero;
                        (*ENDIF*) 
                        IF  a_returncode = 0
                        THEN
                            BEGIN
                            a_curr_retpart^.sp1p_buf_len := foundrecs * m_leng;
                            IF  lcol_found
                            THEN
                                BEGIN
                                IF  foundrecs > 0
                                THEN
                                    WITH reskeyp^.sreskey DO
                                        BEGIN
                                        fetch_desc := a_mblock.mb_qual^.mf_desc;
                                        lcol_lock := true;
                                        a508_lget_long_columns (acv, res_change,
                                              lcol_lock, foundrecs,
                                              m_leng, - (res_keylen + cgg_rec_key_offset));
                                        a_mblock.mb_qual^.mf_desc := fetch_desc;
                                        END;
                                    (*ENDWITH*) 
                                (*ENDIF*) 
                                a_long_desc_pos := 0;
                                END;
                            (*ENDIF*) 
                            a_curr_retpart^.sp1p_buf_size :=
                                  a_curr_retpart^.sp1p_buf_size + resname_bytes;
                            IF  (mb_trns^.trError_gg00 = e_no_next_record) OR
                                (act_cnt > a_mblock.mb_qual^.mf_desc.m_cnt)
                            THEN
                                BEGIN
                                a_curr_retpart^.sp1p_attributes :=
                                      [ sp1pa_last_packet ];
                                WITH a_resname_addr[ pos ]^.sresname,
                                     reskeyp^.sreskey DO
                                    IF  ((m_searched_pages >
                                        cak68_updstat_minpages) AND
                                        (m_searched_pages > res_known_pages
                                        * cak68_updstat_factor))
                                    THEN
                                        resimpl_upd_stat := true;
                                    (*ENDIF*) 
                                (*ENDWITH*) 
                                IF  (ssr_rec.ssr_new_strategynum = strat_inv_range_merge_fetch) AND
                                    (ftsTemp_egg00 in a_mblock.mb_qual^.mf_desc.m_fns2.fileType_gg00) AND
                                    (a_mblock.mb_qual^.mf_desc.m_fns2.fileTfn_gg00 = tfnTempInv_egg00)
                                THEN
                                    BEGIN
                                    a502destroy_file (acv, a_mblock.mb_qual^.mf_desc.m_fns2);
                                    IF  a_transinf.tri_trans.trError_gg00 = e_file_not_found
                                    THEN
                                        a_transinf.tri_trans.trError_gg00 := e_ok
                                    ELSE
                                        a07_b_put_error (acv, a_transinf.tri_trans.trError_gg00, 1);
                                    (*ENDIF*) 
                                    END
                                (*ENDIF*) 
                                END
                            ELSE
                                BEGIN
                                (* not all results fit in one *)
                                (* command segment            *)
                                select_fetch := sft_select_some_results;
                                ak507store_reskey_rec (acv, pos, parsk, dmli,
                                      ssr_rec, ke1, iresstate,
                                      NOT c_after_select, foundrecs, cntresults, e);
                                IF  a_returncode = 0
                                THEN
                                    BEGIN
                                    a10get_sysinfo (acv, ke1, d_fix, reskeyp, e);
                                    IF  e <> e_ok
                                    THEN
                                        a07_b_put_error (acv, e, 1)
                                    ELSE
                                        BEGIN
                                        WITH reskeyp^.sreskey DO
                                            res_first_fetch := false;
                                        (*ENDWITH*) 
                                        a10repl_sysinfo (acv, reskeyp, e)
                                        END
                                    (*ENDIF*) 
                                    END;
                                (*ENDIF*) 
                                END;
                            (*ENDIF*) 
                            a06finish_curr_retpart (acv, sp1pk_data, foundrecs);
                            IF  a01diag_monitor_on OR a01diag_analyze_on
                            THEN
                                b21mp_rows_fetched_put (acv.a_transinf.tri_trans.trBdTcachePtr_gg00,
                                      foundrecs);
                            (*ENDIF*) 
                            END;
                        (*ENDIF*) 
                        END;
                    (*ENDWITH*) 
                    END
                (*ENDIF*) 
            (*ENDIF*) 
            END
        ELSE
            ak507store_reskey_rec (acv, pos, parsk, dmli, ssr_rec,
                  ke1, iresstate, c_after_select, -1, cntresults, e);
        (*ENDIF*) 
        IF  NOT dmli.d_repl_reskey
        THEN
            BEGIN
            IF  select_fetch <> sft_select_all_results
            THEN
                BEGIN
                IF  e = e_ok
                THEN
                    BEGIN
                    ke := a01sysnullkey;
                    WITH ke DO
                        BEGIN
                        sauthid[ 1 ] := cak_tempinfo_byte;
                        s10mv (sizeof (parsk), sizeof (sauthid),
                              @parsk, 1, @sauthid, 2, mxak_parskey);
                        sauthid[ mxak_parskey+1 ] := chr(0);
                        sentrytyp  := cak_eresult;
                        END;
                    (*ENDWITH*) 
                    ke1 := a01sysnullkey;
                    WITH  a_resname_addr[ pos ]^.sresname.restreeid DO
                        BEGIN
                        ke1.stempid := fileTempCnt_gg00
                        END;
                    (*ENDWITH*) 
                    ke1.sentrytyp := cak_eresult;
                    ke.slinkage   := cak_init_linkage;
                    ke1.slinkage  := cak_init_linkage;
                    a10cpy_result (acv, ke, ke1, cntresults, e)
                    END;
                (*ENDIF*) 
                IF  (e = e_ok) AND NOT build
                THEN
                    a10add_sysinfo (acv, qbufp, e)
                ELSE
                    IF  qbufp <> NIL
                    THEN
                        a10key_del (acv, qbufp);
                    (*ENDIF*) 
                (*ENDIF*) 
                END
            ELSE
                BEGIN
                (* PTS 1109575 E.Z. *)
                IF  reskeyp <> NIL
                THEN
                    WITH a_resname_addr[ pos ]^.sresname,
                         reskeyp^.sreskey DO
                        BEGIN
                        resparsinfobyte   := res_parsinfob;
                        resdatetimeformat := res_pars_dt_format;
                        resunlocktabid    := res_unlocktab;
                        resdecresdel      := res_decresdel;
                        IF  a01diag_analyze_on
                        THEN
                            a544get_cmdid (acv, parsk, resanalyze_cmdid);
                        (*ENDIF*) 
                        a10rel_sysinfo (reskeyp);
                        ke.slinkage[2] := chr(csp_maxint1);
                        END;
                    (*ENDWITH*) 
                (*ENDIF*) 
                IF  qbufp <> NIL
                THEN
                    a10key_del (acv, qbufp);
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            IF  e <> e_ok
            THEN
                a07_b_put_error (acv, e, 1);
            (*ENDIF*) 
            IF  a_returncode = 0
            THEN
                WITH a_resname_addr[ pos ]^.sresname DO
                    BEGIN
                    resexecuted   := true;
                    (* PTS 1000216 E.Z. *)
                    reseparsk        := initial_parsk;
                    resstate         := iresstate;
                    resmaxlinkage    := ord (ke.slinkage[2]);
                    resselect_fetch  := select_fetch;
                    END
                (*ENDWITH*) 
            ELSE
                a_part_rollback := true; (* rollback cache entries *)
            (*ENDIF*) 
            END
        (* PTS 1001114 E.Z. *)
        ELSE
            IF  a_returncode = 0
            THEN
                WITH a_resname_addr[ pos ]^.sresname DO
                    resselect_fetch  := select_fetch;
                (*ENDWITH*) 
            (*ENDIF*) 
        (*ENDIF*) 
        END
    (*ENDIF*) 
(*ENDWITH*) 
END;
 
(* PTS 1116801 E.Z. *)
(*------------------------------*) 
 
PROCEDURE
      a507_literal (
            VAR acv             : tak_all_command_glob;
            VAR longliteralrec  : tak_longliteral_rec;
            useliteralbuf       : boolean);
 
VAR
      b_err        : tgg00_BasisError;
      aux_qual     : tgg00_QualBuf;
      aux_data     : tsp00_Buf;
      mblock       : tgg00_MessBlock;
      current_long : integer;
      mvObjPtr     : tsp00_MoveObjPtr;
 
BEGIN
WITH acv, longliteralrec DO
    BEGIN
&   ifdef TRACE
    t01surrogate (ak_sem, 'littabid    ', littabid);
    FOR current_long := 1 TO litcolcount DO
        WITH litcoldesc [current_long] DO
            BEGIN
            t01int4 (ak_sem, 'colddesc i  ', current_long);
            t01surrogate (ak_sem, 'llclongid   ', llclongid);
            t01int4 (ak_sem, 'llc_data_len', llcdatalen);
            t01int4 (ak_sem, 'llc_data_pos', llcdatapos);
            END;
        (*ENDWITH*) 
    (*ENDFOR*) 
    t01int4 (ak_sem, 'litsize     ', litsize);
    t01moveobj (ak_sem, litdataptr^, 1, litlen);
&   endif
    current_long := 1;
    WHILE (a_returncode = 0) AND
          (litcolcount >= current_long) DO
        WITH litcoldesc [ current_long] DO
            BEGIN
            IF  llcdatapos <> -1
            THEN
                BEGIN
                IF  llwith_shortcol
                THEN
                    BEGIN
                    (* first insert a new short column record *)
                    g01mblock_init (acv.a_transinf.tri_trans,
                          m_insert, mm_nil, mblock);
                    WITH mblock DO
                        BEGIN
                        mb_qual        := @aux_qual;
                        mb_qual_size   := sizeof (aux_qual);
                        mb_qual_len    := 0;
                        mb_data        := @aux_data;
                        mb_data_size   := sizeof (aux_data);
                        mb_data_len    := 0;
                        WITH mb_qual^, ml_long_qual, mb_data^ DO
                            BEGIN
                            g01stack_init (mblock, NIL, 0,
                                  @aux_qual, sizeof (aux_qual));
                            mtree          := b01niltree_id;
                            mtree.fileTabId_gg00    := littabid;
                            mtree.fileHandling_gg00 := a_transinf.tri_global_state;
                            (* PTS 1113190 E.Z. *)
                            mtree.fileType_gg00 := [ftsPerm_egg00, ftsConcurrent_egg00];
                            mtree.fileTfn_gg00  := tfnShortScol_egg00;
                            mtree.fileVersion_gg00.ci2_gg00 := cgg_dummy_file_version;
                            mtree.fileRoot_gg00 := NIL_PAGE_NO_GG00;
                            mb_data_len := cgg_rec_key_offset +
                                  cgg04_str_col_entry_size;
                            mb_data^.mbp_reclen := mb_data_len ;
                            mb_data^.mbp_keylen := cgg04_str_col_entry_size;
                            mb_data^.mbp_varcol_offset := 0;
                            mb_data^.mbp_varcol_cnt    := 0;
                            g10mv  ('VAK507',  12,    
                                  sizeof (llclongid),
                                  mb_data_size, @llclongid, 1,
                                  @mb_data^.mbp_buf, cgg_rec_key_offset + 1,
                                  cgg04_str_col_entry_size,
                                  a_returncode);
                            a06rsend_mess_buf (acv, mblock,
                                  cak_return_req, b_err);
                            IF  b_err <> e_ok
                            THEN
                                a07_b_put_error (acv, b_err, 1)
                            (*ENDIF*) 
                            END;
                        (*ENDWITH*) 
                        END
                    (*ENDWITH*) 
                    END;
                (* ... then insert the long literal into the column *)
                (*ENDIF*) 
                IF  (a_returncode = 0)
                THEN
                    BEGIN
                    IF  llwith_shortcol
                    THEN
                        g01mblock_init (a_transinf.tri_trans, m_column, mm_write,
                              mblock)
                    ELSE
                        g01mblock_init (a_transinf.tri_trans, m_column, mm_new_write,
                              mblock);
                    (*ENDIF*) 
                    WITH mblock DO
                        BEGIN
                        mb_qual        := @aux_qual;
                        mb_qual_size   := sizeof (aux_qual);
                        mb_qual_len    := 0;
                        IF  useliteralbuf (* PTS 1122366 M.Ki *)
                        THEN
                            BEGIN
                            mvObjPtr     := litdataptr;
                            mb_data      := @mvObjPtr^[litcoldesc [ current_long].llcdatapos];
                            mb_data_size := litcoldesc [ current_long].llcdatalen;
                            END
                        ELSE
                            BEGIN
                            mb_data        := @aux_data;
                            mb_data_size   := sizeof (aux_data);
                            SAPDB_PascalMove ('VAK507',  13,    
                                  litlen, mb_data_size,
                                  @litdataptr^, llcdatapos,
                                  @mb_data^.mbp_buf, 1, llcdatalen,
                                  a_returncode);
                            END;
                        (*ENDIF*) 
                        WITH mb_qual^, ml_long_qual, mb_data^ DO
                            BEGIN
                            mb_data_len := llcdatalen;
                            IF  a_returncode = 0
                            THEN
                                BEGIN
                                mb_qual_len  := MB_PART1_HEAD_MXGG00 +
                                      sizeof (mb_qual^.ml_long_qual);
                                mb_struct      := mbs_long;
                                mstack_desc    := g01nil_stack_desc;
                                mtree          := b01niltree_id;
                                WITH litcoldesc [ current_long] DO
                                    mtree.fileTabId_gg00 := llclongid;
                                (*ENDWITH*) 
                                mtree.fileHandling_gg00 := a_transinf.tri_global_state;
                                (* PTS 1113190 E.Z. *)
                                mtree.fileType_gg00 := [ftsPerm_egg00, ftsConcurrent_egg00];
                                mtree.fileTfn_gg00  := tfnShortScol_egg00;
                                ml_long_qual   := g01nil_long_qual;
                                mb_qual_len    := mb_qual_len +
                                      sizeof (mb_qual^.ml_long_qual);
                                lq_lock_tabid   := littabid;
                                IF  llwith_shortcol
                                THEN
                                    BEGIN
                                    lq_long_in_file := false;
                                    lq_pos          := 1;
                                    END
                                ELSE
                                    BEGIN
                                    lq_long_in_file := true;
                                    lq_pos          := -1;
                                    END;
                                (*ENDIF*) 
                                lq_trunc_req    := true;
                                lq_data_offset  := 0;
                                lq_len          := mb_data_len;
                                END;
                            (*ENDIF*) 
                            a06rsend_mess_buf (acv, mblock,
                                  cak_return_req, b_err);
                            IF  b_err <> e_ok
                            THEN
                                a07_b_put_error (acv, b_err, 1);
                            (*ENDIF*) 
                            END;
                        (*ENDWITH*) 
                        END;
                    (*ENDWITH*) 
                    END
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            current_long := succ (current_long);
            END
        (*ENDWITH*) 
    (*ENDWHILE*) 
    END;
(*ENDWITH*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
