.nf
 
 
    ========== licence begin  GPL
    Copyright (C) 2000 SAP AG
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    ========== licence end
 
.fo
*****************************************************
Copyright by SAP AG, 2000
SAP Database Technology
 
Release :      Date : 2000-11-22
*****************************************************
modname : VAK17
changed : 2000-11-22
module  : AK_SAVE_RESTORE_LOAD
 
Author  : ThomasA
Created : 1987-09-22
*****************************************************
 
Purpose : support of save/restore/unload/reload table
 
Define  :
 
        PROCEDURE
              a17beginload_save_nolog (
                    VAR acv      : tak_all_command_glob;
                    VAR a11v     : tak_a11_glob);
 
        PROCEDURE
              a17call_semantic (VAR acv : tak_all_command_glob);
 
        PROCEDURE
              a17describe (
                    VAR acv    : tak_all_command_glob;
                    VAR a11v   : tak_a11_glob);
 
        PROCEDURE
              a17endload (
                    VAR acv  : tak_all_command_glob;
                    VAR a11v : tak_a11_glob);
 
        PROCEDURE
              a17end_incopy_table (
                    VAR acv  : tak_all_command_glob;
                    VAR a11v : tak_a11_glob);
 
        PROCEDURE
              a17incopy (
                    VAR acv  : tak_all_command_glob;
                    VAR a11v : tak_a11_glob);
 
        PROCEDURE
              a17saveinit (
                    VAR acv         : tak_all_command_glob;
                    VAR a11v        : tak_a11_glob;
                    is_short_string : boolean);
 
        PROCEDURE
              a17table_describe (
                    VAR acv    : tak_all_command_glob;
                    VAR a11v   : tak_a11_glob;
                    table_load : boolean);
 
        PROCEDURE
              a17unload_table (
                    VAR acv      : tak_all_command_glob;
                    VAR a11v     : tak_a11_glob);
 
.CM *-END-* define --------------------------------------
***********************************************************
 
Use     :
 
        FROM
              Select_Help_Procedures : VGG04;
 
        PROCEDURE
              g04build_temp_tree_id (
                    VAR curr : tgg00_FileId;
                    VAR t : tgg00_TransContext);
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG10;
 
        PROCEDURE
              g10fil (
                    mod_id   : tsp_c6;
                    mod_num  : tsp_int4;
                    obj_upb  : tsp_int4;
                    VAR obj  : tsp_moveobj;
                    obj_pos  : tsp_int4;
                    length   : tsp_int4;
                    fillchar : char;
                    VAR e    : tgg_basis_error);
              (* PTS 1107617 E.Z. *)
 
        PROCEDURE
              g10fil1 (
                    mod_id   : tsp_c6;
                    mod_num  : tsp_int4;
                    obj_upb  : tsp_int4;
                    VAR obj  : tsp00_C132;
                    obj_pos  : tsp_int4;
                    length   : tsp_int4;
                    fillchar : char;
                    VAR e    : tgg_basis_error);
 
        PROCEDURE
              g10filuni (
                    mod_id      : tsp_c6;           mod_num  : tsp_int4;
                    obj_upb     : tsp_int4;
                    VAR obj     : tsp00_C132;       obj_pos  : tsp_int4;
                    length      : tsp_int4;         fillchar : tsp_c2;
                    VAR e       : tgg_basis_error);
 
        PROCEDURE
              g10mv   (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    source_upb     : tsp_int4;
                    destin_upb     : tsp_int4;
                    VAR source     : tsp_knl_identifier;
                    source_pos     : tsp_int4;
                    VAR destin     : tsp_moveobj;
                    destin_pos     : tsp_int4;
                    length         : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv1   (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    source_upb     : tsp_int4;
                    destin_upb     : tsp_int4;
                    VAR source     : tgg00_StackList;
                    source_pos     : tsp_int4;
                    VAR destin     : tgg00_StackList;
                    destin_pos     : tsp_int4;
                    length         : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv2   (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    source_upb     : tsp_int4;
                    destin_upb     : tsp_int4;
                    VAR source     : tsp_moveobj;
                    source_pos     : tsp_int4;
                    VAR destin     : tsp_knl_identifier;
                    destin_pos     : tsp_int4;
                    length         : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv3   (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    source_upb     : tsp_int4;
                    destin_upb     : tsp_int4;
                    VAR source     : tsp_moveobj;
                    source_pos     : tsp_int4;
                    VAR destin     : tak_systembuffer;
                    destin_pos     : tsp_int4;
                    length         : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv4  (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    source_upb     : tsp_int4;
                    destin_upb     : tsp_int4;
                    VAR source     : tsp_moveobj;
                    source_pos     : tsp_int4;
                    VAR destin     : tsp_moveobj;
                    destin_pos     : tsp_int4;
                    length         : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv5  (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    source_upb     : tsp_int4;
                    destin_upb     : tsp_int4;
                    VAR source     : tak_systembuffer;
                    source_pos     : tsp_int4;
                    VAR destin     : tak_systembuffer;
                    destin_pos     : tsp_int4;
                    length         : tsp_int4;
                    VAR e          : tgg_basis_error);
&       ifdef trace
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01int4 (
                    debug    : tgg00_Debug;
                    nam      : tsp00_Sname;
                    int      : tsp00_Int4);
 
        PROCEDURE
              t01treeid (
                    layer      : tgg00_Debug;
                    nam        : tsp00_Sname;
                    VAR treeid : tgg00_FileId);
 
        PROCEDURE
              t01moveobj (
                    debug    : tgg00_Debug;
                    VAR buf  : tsp00_MoveObj;
                    startpos : tsp00_Int4;
                    endpos   : tsp00_Int4);
&       endif
 
      ------------------------------ 
 
        FROM
              Scanner : VAK01;
 
        VAR
              a01defaultkey       : tgg_sysinfokey;
              a01_i_sysmessages   : tsp_knl_identifier;
              a01_il_b_identifier : tsp_knl_identifier;
 
        FUNCTION
              a01swap_int2 (old : tsp_int2): tsp_int2;
 
      ------------------------------ 
 
        FROM
              AK_universal_semantic_tools : VAK06;
 
        PROCEDURE
              a06determine_username (
                    VAR acv       : tak_all_command_glob;
                    VAR userid    : tgg_surrogate;
                    VAR user_name : tsp_knl_identifier);
 
        PROCEDURE
              a06extcolno (
                    VAR baserec  : tak_baserecord;
                    extcolno     : integer;
                    VAR col_ptr  : tak00_colinfo_ptr);
 
        PROCEDURE
              a06finish_curr_retpart (
                    VAR acv   : tak_all_command_glob;
                    part_kind : tsp1_part_kind;
                    arg_count : tsp_int2);
 
        PROCEDURE
              a06inc_linkage (VAR linkage : tsp_c2);
 
        PROCEDURE
              a06init_curr_retpart (VAR acv : tak_all_command_glob);
 
        PROCEDURE
              a06retpart_move (
                    VAR acv     : tak_all_command_glob;
                    moveobj_ptr : tsp_moveobj_ptr;
                    move_len    : tsp_int4);
 
        PROCEDURE
              a06rsend_mess_buf (
                    VAR acv     : tak_all_command_glob;
                    VAR mblock  : tgg_mess_block;
                    result_req  : boolean;
                    VAR e       : tgg_basis_error);
 
        PROCEDURE
              a06a_mblock_init (
                    VAR acv         : tak_all_command_glob;
                    mtype           : tgg_message_type;
                    m2type          : tgg_message2_type;
                    VAR tree        : tgg00_FileId);
 
        PROCEDURE
              a06_systable_get (
                    VAR acv      : tak_all_command_glob;
                    dstate       : tak_directory_state;
                    VAR tableid  : tgg_surrogate;
                    VAR base_ptr : tak_sysbufferaddress;
                    get_all      : boolean;
                    VAR ok       : boolean);
 
      ------------------------------ 
 
        FROM
              AK_Identifier_Handling : VAK061;
 
        PROCEDURE
              a061add_name (
                    VAR acv      : tak_all_command_glob;
                    VAR base_rec : tak_baserecord;
                    VAR name     : tsp_knl_identifier;
                    VAR p        : tsp_knl_identifier_ptr);
 
        PROCEDURE
              a061app_columnname (
                    VAR acv               : tak_all_command_glob;
                    VAR base_rec          : tak_baserecord;
                    VAR column            : tsp_knl_identifier;
                    VAR index             : integer);
 
        FUNCTION
              a061exist_columnname (
                    VAR base_rec    : tak_baserecord;
                    VAR column      : tsp_knl_identifier;
                    VAR colinfo_ptr : tak00_colinfo_ptr) : boolean;
 
        PROCEDURE
              a061get_colname (
                    VAR col_info : tak00_columninfo;
                    VAR colname  : tsp_knl_identifier);
 
        FUNCTION
              a061identifier_len (VAR id : tsp_knl_identifier) : integer;
 
      ------------------------------ 
 
        FROM
              AK_semantic_scanner_tools : VAK05;
 
        PROCEDURE
              a05_stamp_get (
                    VAR acv    : tak_all_command_glob;
                    VAR dest   : tsp_key;
                    destpos    : integer;
                    mv_dest    : integer);
 
        PROCEDURE
              a05_unsigned_int2_get (
                    VAR acv  : tak_all_command_glob;
                    pos      : integer;
                    l        : tsp_int2;
                    err_code : tsp_int4;
                    VAR int  : tsp_int2);
 
        PROCEDURE
              a05identifier_get (
                    VAR acv     : tak_all_command_glob;
                    tree_index  : integer;
                    obj_len     : integer;
                    VAR moveobj : tsp_knl_identifier);
 
        PROCEDURE
              a05serial (
                    VAR acv        : tak_all_command_glob;
                    VAR colinfo    : tak00_columninfo;
                    VAR treeid     : tgg00_FileId;
                    VAR moveobj    : tsp_moveobj;
                    moveobj_size   : tsp_int4;
                    number_pos     : tsp_int4;
                    VAR number_len : integer;
                    with_retpart   : boolean);
 
      ------------------------------ 
 
        FROM
              AK_error_handling : VAK07;
 
        PROCEDURE
              a07ak_system_error (
                    VAR acv  : tak_all_command_glob;
                    modul_no : integer;
                    id       : integer);
 
        PROCEDURE
              a07_b_put_error (
                    VAR acv : tak_all_command_glob;
                    b_err   : tgg_basis_error;
                    err_code : tsp_int4);
 
        PROCEDURE
              a07_nb_put_error (
                    VAR acv : tak_all_command_glob;
                    b_err   : tgg_basis_error;
                    err_code : tsp_int4;
                    VAR n    : tsp_knl_identifier);
 
      ------------------------------ 
 
        FROM
              AK_BD_procedure_interface : VAK09;
 
        PROCEDURE
              a09load_constraint_info (
                    VAR acv         : tak_all_command_glob;
                    last_constraint : boolean;
                    VAR and_cnt     : integer);
 
      ------------------------------ 
 
        FROM
              Systeminfo_cache   : VAK10;
 
        PROCEDURE
              a10_add_repl_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syspoint : tak_sysbufferaddress;
                    add_sysinfo  : boolean;
                    VAR b_err    : tgg_basis_error);
 
        PROCEDURE
              a10add_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg_basis_error);
 
        PROCEDURE
              a10del_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syskey   : tgg_sysinfokey;
                    VAR b_err    : tgg_basis_error);
 
        PROCEDURE
              a10_del_tab_sysinfo  (
                    VAR acv     : tak_all_command_glob;
                    VAR tableid : tgg_surrogate;
                    VAR qual    : tak_del_tab_qual;
                    temp_table  : boolean;
                    VAR b_err   : tgg_basis_error);
 
        PROCEDURE
              a10get_sysinfo (
                    VAR acv    : tak_all_command_glob;
                    VAR syskey : tgg_sysinfokey;
                    dstate     : tak_directory_state;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg_basis_error);
 
        PROCEDURE
              a10_key_del  (
                    VAR acv     : tak_all_command_glob;
                    VAR syskey  : tgg_sysinfokey);
 
        PROCEDURE
              a10key_del  (
                    VAR acv         : tak_all_command_glob;
                    VAR  syspointer : tak_sysbufferaddress);
 
        PROCEDURE
              a10_lock_sysinfo (
                    VAR acv    : tak_all_command_glob;
                    VAR syskey : tgg_sysinfokey;
                    lockm      : tgg00_LockReqMode);
 
        PROCEDURE
              a10repl_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg_basis_error);
 
        PROCEDURE
              a10_fix_len_get_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syskey   : tgg_sysinfokey;
                    dstate       : tak_directory_state;
                    required_len : integer;
                    plus         : integer;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg_basis_error);
 
        PROCEDURE
              a10_version (
                    VAR acv        : tak_all_command_glob;
                    VAR base_rec   : tak_baserecord;
                    m_type         : tgg_message_type;
                    view_scan      : boolean);
 
        PROCEDURE
              a10_nil_get_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syskey   : tgg_sysinfokey;
                    dstate       : tak_directory_state;
                    syslen       : tsp_int2;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg_basis_error);
 
        PROCEDURE
              a10next_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syskey   : tgg_sysinfokey;
                    stop_prefix  : integer;
                    dstate       : tak_directory_state;
                    rec_kind     : tsp_c2;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg_basis_error);
 
      ------------------------------ 
 
        FROM
              AK_Table : VAK11;
 
        PROCEDURE
              a11constraint (
                    VAR acv       : tak_all_command_glob;
                    VAR a11v      : tak_a11_glob;
                    VAR base_rec  : tak_baserecord;
                    constraint_id : integer);
 
        PROCEDURE (* PTS 1107977 *)
              a11init_baserecord (
                    VAR acv    : tak_all_command_glob;
                    VAR a11v   : tak_a11_glob);
 
        PROCEDURE
              a11end_create_table (
                    VAR acv  : tak_all_command_glob;
                    VAR a11v : tak_a11_glob);
 
        PROCEDURE
              a11getconstraintname (
                    VAR constraint_rec  : tak_constraintrecord;
                    VAR constraint_name : tsp_knl_identifier);
 
        FUNCTION
              a11remote_load_possible (
                    VAR acv : tak_all_command_glob;
                    baserec : tak_baserecord) : boolean;
 
        FUNCTION
              a11firstindex (
                    colcount    : integer;
                    VAR baserec : tak_baserecord) : tsp_int2;
 
      ------------------------------ 
 
        FROM
              AK_Alter_Table : VAK13;
 
        PROCEDURE
              a13_build_mapping_stack (
                    VAR acv        : tak_all_command_glob;
                    VAR a11v       : tak_a11_glob;
                    VAR src_st_ptr : tgg00_StackListPtr;
                    VAR tar_st_ptr : tgg00_StackListPtr;
                    VAR src_col_cnt: tsp_int2;
                    VAR new_base   : boolean);
 
        PROCEDURE
              a13_new_catalog_desc (
                    VAR acv        : tak_all_command_glob;
                    VAR a11v       : tak_a11_glob;
                    VAR old_p      : tak_syspointerarr;
                    VAR extcol_map : tgg03_extcol_map;
                    VAR new_base   : boolean);
 
      ------------------------------ 
 
        FROM
              AK_Data_Type_Options : VAK14;
 
        PROCEDURE
              a14default_spec (
                    VAR acv          : tak_all_command_glob;
                    VAR a11v         : tak_a11_glob;
                    VAR col_info     : tak00_columninfo);
              (* PTS 1116675 M.Ki *)
 
        FUNCTION
              a14LengthOfDefaultValue (
                    VAR DefaultRec : tak_defaultrecord) : integer; (* PTS 1108427 *)
 
      ------------------------------ 
 
        FROM
              AK_save_scheme : VAK15;
 
        PROCEDURE
              a15restore_catalog (
                    VAR acv         : tak_all_command_glob;
                    VAR treeid      : tgg00_FileId;
                    VAR viewscanpar : tak_viewscan_par);
 
        PROCEDURE
              a15catalog_save (
                    VAR acv         : tak_all_command_glob;
                    VAR viewscanpar : tak_viewscan_par);
 
      ------------------------------ 
 
        FROM
              AK_Index : VAK24;
 
        PROCEDURE
              a24all_index_drop (
                    VAR acv         : tak_all_command_glob;
                    VAR viewscanpar : tak_viewscan_par);
 
        PROCEDURE
              a24init_index_scan (
                    VAR acv            : tak_all_command_glob;
                    VAR tabid          : tgg_surrogate;
                    VAR index_scan_rec : tak_index_scan_record);
 
        PROCEDURE
              a24get_indexname (
                    VAR acv        : tak_all_command_glob;
                    indexbuf       : tak_sysbufferaddress;
                    index          : integer;
                    VAR index_name : tsp_knl_identifier);
 
        PROCEDURE
              a24finish_index_scan (
                    VAR acv            : tak_all_command_glob;
                    VAR index_scan_rec : tak_index_scan_record);
 
        FUNCTION
              a24next_named_index (
                    VAR acv            : tak_all_command_glob;
                    VAR index_scan_rec : tak_index_scan_record) : boolean;
 
      ------------------------------ 
 
        FROM
              AK_Link : VAK25;
 
        PROCEDURE
              a25linkload_info (VAR acv : tak_all_command_glob);
 
      ------------------------------ 
 
        FROM
              AK_VIEW_SCAN : VAK27;
 
        PROCEDURE
              a27init_viewscanpar (
                    VAR acv         : tak_all_command_glob;
                    VAR viewscanpar : tak_viewscan_par;
                    v_type          : tak_viewscantype);
 
      ------------------------------ 
 
        FROM
              AK_update_statistics : VAK28;
 
        PROCEDURE
              a28table_upd_statistics (
                    VAR acv      : tak_all_command_glob;
                    sample_rows  : tsp_int4;
                    sample_pct   : integer;
                    page_cnt     : tsp_int4;
                    rec_cnt      : tsp_int4;
                    sec_cnt      : tsp_int4;
                    colno        : integer;
                    add          : boolean;
                    commit       : boolean);
 
      ------------------------------ 
 
        FROM
              Deal-With-User-Commands : VAK92;
 
        PROCEDURE
              a92_next_part_get (
                    VAR acv       : tak_all_command_glob;
                    VAR curr_part : tsp1_part_ptr);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_1  : VBD01;
 
        PROCEDURE
              b01empty_file (
                    VAR t       : tgg00_TransContext;
                    VAR file_id : tgg00_FileId);
 
        PROCEDURE
              b01prefix_destroy_files (
                    VAR t         : tgg00_TransContext;
                    VAR prefix_fn : tgg00_Filename;
                    prefix_len    : integer);
 
        PROCEDURE
              b01destroy_file (
                    VAR t       : tgg00_TransContext;
                    VAR file_id : tgg00_FileId);
 
        PROCEDURE
              b01filestate (
                    VAR t       : tgg00_TransContext;
                    VAR file_id : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_2   : VBD02;
 
        PROCEDURE
              b02col_next_stringcol (
                    VAR t             : tgg00_TransContext;
                    VAR file_id       : tgg00_FileId;
                    string_col_cnt    : integer;
                    VAR rk            : tgg00_Lkey;
                    VAR string_col_no : integer;
                    VAR col_id        : tgg00_FileId;
                    VAR file_pos      : tgg00_FilePos);
 
        PROCEDURE
              b02finish_load (
                    VAR t          : tgg00_TransContext;
                    VAR file_id    : tgg00_FileId;
                    rightmost_leaf : tsp00_PageNo);
 
        PROCEDURE
              b02init_load (
                    VAR t              : tgg00_TransContext;
                    VAR file_id        : tgg00_FileId;
                    set_read_only      : boolean;
                    VAR rightmost_leaf : tsp00_PageNo);
 
        PROCEDURE
              b02u_init_unload (
                    VAR t       : tgg00_TransContext;
                    VAR file_id : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              BD_modify_table : VBD37;
 
        PROCEDURE
              b37_init_conversion_info (
                    VAR t              : tgg00_TransContext;
                    ignore_err         : boolean;
                    source_stack       : tgg00_StackListPtr;
                    src_col_cnt        : integer;
                    target_stack       : tgg00_StackListPtr;
                    trunc_pos          : integer;
                    trunc_cnt          : integer;
                    VAR is_sorted      : boolean;
                    VAR FixedColLength : integer;
                    VAR code_tab       : tgg03_colinf;
                    VAR trunc_col      : tgg03_colinf;
                    VAR frac_col       : tgg03_colinf;
                    VAR not_null_col   : tgg03_not_null;
                    VAR check_col      : tgg03_check_col);
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01code           : tgg_code_globals;
              g01glob           : tgg_kernel_globals;
              g01unicode        : boolean;
 
      ------------------------------ 
 
        FROM
              Codetransformation_and_Coding : VGG02;
 
        PROCEDURE
              g02tebcdic_to_ascii (
                    VAR source           : tsp_knl_identifier;
                    VAR dest             : tsp_knl_identifier;
                    length               : tsp_int4);
 
        PROCEDURE
              g02t1ebcdic_to_ascii (
                    VAR source            : tsp_knl_identifier;
                    VAR dest              : tsp_knl_identifier;
                    length                : tsp_int4);
 
        PROCEDURE
              g02tascii_to_ebcdic (
                    VAR source           : tsp_knl_identifier;
                    VAR dest             : tsp_knl_identifier;
                    length               : tsp_int4);
 
        PROCEDURE
              g02t1ascii_to_ebcdic (
                    VAR source            : tsp_knl_identifier;
                    VAR dest              : tsp_knl_identifier;
                    length                : tsp_int4);
 
        PROCEDURE
              g02p1ascii_pos_ebcdic (
                    VAR source : tak_systembuffer;
                    srcind   : tsp_int4;
                    VAR dest : tak_systembuffer;
                    destind  : tsp_int4;
                    length   : tsp_int4);
 
        PROCEDURE
              g02pebcdic_pos_ascii (
                    VAR source : tsp_moveobj;
                    srcind   : tsp_int4;
                    VAR dest : tsp_moveobj;
                    destind  : tsp_int4;
                    length   : tsp_int4);
 
      ------------------------------ 
 
        FROM
              GG_allocator_interface : VGG941;
 
        FUNCTION
              gg941Allocate(VAR TransContext : tgg00_TransContext;
                    wantedBytes : integer) : tsp_moveobj_ptr;
 
        PROCEDURE
              gg941Deallocate(VAR TransContext : tgg00_TransContext;
                    VAR p : tgg03_unloadInfoPtr);
 
      ------------------------------ 
 
        FROM
              RTE_kernel : VEN101;
 
        (* PTS 1107617 E.Z. *)
        PROCEDURE
              vopmsgUnicode(
                    source_encoding : tsp00_Int4;
                    prio        : tsp_int2;
                    msgtype     : tsp_int2;
                    VAR msgline : tsp00_C132);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-10 : VSP10;
 
        PROCEDURE
              s10mv1 (
                    size1    : tsp_int4;        size2 : tsp_int4;
                    VAR b1   : tsp_moveobj;     pos2  : tsp_int4;
                    VAR b2   : tsp_knl_identifier;  pos1  : tsp_int4;
                    move_len : tsp_int4);
 
        PROCEDURE
              s10mv2 (
                    size1    : tsp_int4;            size2 : tsp_int4;
                    VAR b1   : tsp_moveobj;         pos1  : tsp_int4;
                    VAR b2   : tgg00_FileId;         pos2  : tsp_int4;
                    move_len : tsp_int4);
 
        PROCEDURE
              s10mv3 (
                    size1    : tsp_int4;        size2 : tsp_int4;
                    VAR b1   : tsp_moveobj;     pos1  : tsp_int4;
                    VAR b2   : tgg00_FilePos;    pos2  : tsp_int4;
                    move_len : tsp_int4);
 
        PROCEDURE
              s10mv4 (
                    size1    : tsp_int4;       size2 : tsp_int4;
                    VAR b1   : tsp_moveobj;    pos1  : tsp_int4;
                    VAR b2   : tsp_key;        pos2  : tsp_int4;
                    move_len : tsp_int4);
 
        PROCEDURE
              s10mv5 (
                    size1    : tsp_int4;       size2 : tsp_int4;
                    VAR b1   : tsp_moveobj;    pos1  : tsp_int4;
                    VAR b2   : tsp_page_no;    pos2  : tsp_int4;
                    move_len : tsp_int4);
 
      ------------------------------ 
 
        FROM
              GET-Conversions : VSP40;
 
        PROCEDURE
              s40g4int (
                    VAR buf     : tsp_moveobj;
                    pos         : tsp_int4;
                    VAR dest    : tsp_int4;
                    VAR res     : tsp_num_error);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-80 : VSP80;
 
        PROCEDURE
              s80uni_trans
                    (src_ptr        : tsp_moveobj_ptr;
                    src_len         : tsp_int4;
                    src_codeset     : tsp_int2;
                    dest_ptr        : tsp_moveobj_ptr;
                    VAR dest_len    : tsp_int4;
                    dest_codeset    : tsp_int2;
                    trans_options   : tsp8_uni_opt_set;
                    VAR rc          : tsp8_uni_error;
                    VAR err_char_no : tsp_int4);
 
      ------------------------------ 
 
        FROM
              Number-Arithmetic : VSP51;
 
        PROCEDURE
              s51sub (
                    VAR left       : tsp_moveobj;
                    lpos           : tsp_int4;
                    llen           : integer;
                    VAR right      : tsp_number;
                    rpos           : tsp_int4;
                    rlen           : integer;
                    VAR result     : tsp_moveobj;
                    respos         : tsp_int4;
                    reslen         : integer;
                    resfrac        : integer;
                    VAR resbytelen : integer;
                    VAR ret        : tsp_num_error);
 
.CM *-END-* use -----------------------------------------
***********************************************************
 
Synonym :
 
        PROCEDURE
              a05identifier_get;
 
              tsp_moveobj tsp_knl_identifier
 
        PROCEDURE
              a05_stamp_get;
 
              tsp_moveobj tsp_key
 
        PROCEDURE
              a15catalog_save;
 
              tak_save_viewscan_par tak_viewscan_par
 
        PROCEDURE
              a15restore_catalog;
 
              tak_save_viewscan_par tak_viewscan_par
 
        PROCEDURE
              g02tebcdic_to_ascii;
 
              tsp_moveobj tsp_knl_identifier
 
        PROCEDURE
              g02t1ebcdic_to_ascii;
 
              tsp_moveobj tsp_knl_identifier
 
        PROCEDURE
              g02tascii_to_ebcdic;
 
              tsp_moveobj tsp_knl_identifier
 
        PROCEDURE
              g02t1ascii_to_ebcdic;
 
              tsp_moveobj tsp_knl_identifier
 
        PROCEDURE
              g02pebcdic_pos_ascii;
 
              tsp_moveobj tsp_varpart
              tsp_moveobj tsp_varpart
 
        PROCEDURE
              g02p1ascii_pos_ebcdic;
 
              tsp_moveobj tak_systembuffer
              tsp_moveobj tak_systembuffer
              (* PTS 1107617 E.Z. *)
 
        PROCEDURE
              g10fil1;
 
              tsp_moveobj tsp00_C132
 
        PROCEDURE
              g10filuni;
 
              tsp_moveobj tsp00_C132
 
        PROCEDURE
              g10mv;
 
              tsp_moveobj tsp_knl_identifier
 
        PROCEDURE
              g10mv1;
 
              tsp_moveobj tgg00_StackList;
              tsp_moveobj tgg00_StackList;
 
        PROCEDURE
              g10mv2;
 
              tsp_moveobj tsp_knl_identifier
 
        PROCEDURE
              g10mv3;
 
              tsp_moveobj tak_systembuffer
 
        PROCEDURE
              s10mv1;
 
              tsp_moveobj tsp_knl_identifier
 
        PROCEDURE
              s10mv2;
 
              tsp_moveobj tgg00_FileId
 
        PROCEDURE
              s10mv3;
 
              tsp_moveobj tgg00_FilePos
 
        PROCEDURE
              s10mv4;
 
              tsp_moveobj tsp_key
 
        PROCEDURE
              s10mv5;
 
              tsp_moveobj tsp_page_no
 
        PROCEDURE
              g10mv5;
 
              tsp_moveobj tak_systembuffer
              tsp_moveobj tak_systembuffer
 
        PROCEDURE
              s51sub;
 
              tsp_moveobj tsp_number
 
        PROCEDURE
              gg941Allocate;
 
              tsp00_Addr tsp_moveobj_ptr
 
        PROCEDURE
              gg941Deallocate;
 
              tsp00_Addr tgg03_unloadInfoPtr
 
.CM *-END-* synonym -------------------------------------
***********************************************************
.CM -lll-
Code    :
 
 
CONST
      c_outcopy       = true;
      c_set_read_only = true;
      c_all           = true;
      c_with_retpart  = true;
      (* PTS 1111576 E.Z. *)
 
 
(*------------------------------*) 
 
PROCEDURE
      ak17begin_save_string (VAR acv : tak_all_command_glob);
 
VAR
      ok             : boolean;
      i              : integer;
      string_col_cnt : integer;
      string_col_no  : integer;
      col_index      : integer;
      first_fixcolno : integer;
      ic2            : tsp_int_map_c2;
      aux            : tsp_c6;
      treeid         : tgg00_FileId;
      col_id         : tgg00_FileId;
      file_pos       : tgg00_FilePos;
      data_ptr       : tsp1_part_ptr;
      bd_info_ptr    : tsp1_part_ptr;
      dummy_ptr      : tsp1_part_ptr;
      rk             : tgg_lkey;
 
BEGIN
ok := true;
ak17get_part_pointers (acv,
      data_ptr, bd_info_ptr, dummy_ptr, dummy_ptr);
IF  (bd_info_ptr = NIL) OR (data_ptr = NIL)
THEN
    a07_b_put_error (acv, e_too_short_datapart, 1)
ELSE
    WITH acv DO
        BEGIN
        a_ex_kind  := parsing_executing;
        a_init_ddl := no_ddl;
        s10mv2 (bd_info_ptr^.sp1p_buf_size, sizeof(treeid),
              bd_info_ptr^.sp1p_buf, 1, treeid, 1, sizeof(treeid));
        treeid.fileRootCheck_gg00 := ROOT_CHECK_GG00;
        s10mv3 (data_ptr^.sp1p_buf_size, sizeof (file_pos),
              data_ptr^.sp1p_buf, 1, file_pos, 1, mxgg_treepos);
        IF  a_out_packet^.sp1_header.sp1h_mess_swap
            <> g01code.kernel_swap
        THEN
            BEGIN
            ic2.map_c2[ 1 ] := data_ptr^.sp1p_buf[mxgg_treepos + 2];
            ic2.map_c2[ 2 ] := data_ptr^.sp1p_buf[mxgg_treepos + 1];
            string_col_cnt := ic2.map_int;
            ic2.map_c2[ 1 ] := data_ptr^.sp1p_buf[mxgg_treepos + 4];
            ic2.map_c2[ 2 ] := data_ptr^.sp1p_buf[mxgg_treepos + 3];
            string_col_no  := ic2.map_int;
            ic2.map_c2[ 1 ] := data_ptr^.sp1p_buf[mxgg_treepos + 6];
            ic2.map_c2[ 2 ] := data_ptr^.sp1p_buf[mxgg_treepos + 5];
            END
        ELSE
            BEGIN
            ic2.map_c2[ 1 ] := data_ptr^.sp1p_buf[mxgg_treepos + 1];
            ic2.map_c2[ 2 ] := data_ptr^.sp1p_buf[mxgg_treepos + 2];
            string_col_cnt  := ic2.map_int;
            ic2.map_c2[ 1 ] := data_ptr^.sp1p_buf[mxgg_treepos + 3];
            ic2.map_c2[ 2 ] := data_ptr^.sp1p_buf[mxgg_treepos + 4];
            string_col_no   := ic2.map_int;
            ic2.map_c2[ 1 ] := data_ptr^.sp1p_buf[mxgg_treepos + 5];
            ic2.map_c2[ 2 ] := data_ptr^.sp1p_buf[mxgg_treepos + 6];
            END;
        (*ENDIF*) 
        rk.keyLen_gg00          := ic2.map_int;
        s10mv4 (data_ptr^.sp1p_buf_size, sizeof (rk.keyVal_gg00),
              data_ptr^.sp1p_buf, mxgg_treepos + 13,
              rk.keyVal_gg00, 1, rk.keyLen_gg00);
        acv.a_transinf.tri_trans.trError_gg00 := e_ok;
        (* PTS 1116259 M.Ki *)
        a06_systable_get (acv, d_release, treeid.fileTabId_gg00,
              acv.a_p_arr1.pbasep, c_all, ok);
        IF  acv.a_p_arr1.pbasep^.sbase.bcntdropcol > 0
        THEN
            (* string_col_no needs to be mapped to the old record layout,*)
            (* where we might have dropped LONG columns in between valid *)
            (* LONG columns                                              *)
            WITH acv.a_p_arr1.pbasep^.sbase DO
                BEGIN (* adjust string_col_no *)
                col_index      := bcolumn[ blastkeyind ]^.cnextind;
                first_fixcolno := bcolumn[ col_index   ]^.creccolno;
                WHILE col_index <> 0 DO
                    BEGIN
                    IF  (bcolumn[ col_index ]^.cdatatyp in
                        [dstra, dstrb, dstrdb, dstre, dstruni,
                        dlonga, dlongb, dlongdb, dlonge, dlonguni])
                        AND
                        (ctdropped in bcolumn[ col_index ]^.ccolpropset)
                        AND
                        ((bcolumn[ col_index ]^.creccolno-first_fixcolno) <
                        string_col_no)
                    THEN
                        string_col_no := succ (string_col_no);
                    (*ENDIF*) 
                    col_index := bcolumn[ col_index ]^.cnextind;
                    END;
                (*ENDWHILE*) 
                END;
            (*ENDWITH*) 
        (*ENDIF*) 
        IF  ok
        THEN
            b02col_next_stringcol (acv.a_transinf.tri_trans, treeid,
                  acv.a_p_arr1.pbasep^.sbase.bstringcount, rk, string_col_no,
                  col_id, file_pos);
        (*ENDIF*) 
        IF  acv.a_transinf.tri_trans.trError_gg00 = e_ok
        THEN
            b02u_init_unload (acv.a_transinf.tri_trans, col_id);
        (*ENDIF*) 
        IF  acv.a_transinf.tri_trans.trError_gg00 = e_ok
        THEN
            BEGIN
            (* map new string_col_no back to new layout *)
            IF  acv.a_p_arr1.pbasep^.sbase.bcntdropcol > 0
            THEN
                WITH acv.a_p_arr1.pbasep^.sbase DO
                    BEGIN (* map string_col_no back to new layout *)
                    col_index      := bcolumn[ blastkeyind ]^.cnextind;
                    first_fixcolno := bcolumn[ col_index   ]^.creccolno;
                    WHILE col_index <> 0 DO
                        BEGIN
                        IF  (bcolumn[ col_index ]^.cdatatyp in
                            [dstra, dstrb, dstrdb, dstre, dstruni,
                            dlonga, dlongb, dlongdb, dlonge, dlonguni])
                            AND
                            (ctdropped in bcolumn[ col_index ]^.ccolpropset)
                            AND
                            ((bcolumn[ col_index ]^.creccolno-first_fixcolno) <
                            string_col_no)
                        THEN
                            string_col_no := pred (string_col_no);
                        (*ENDIF*) 
                        col_index := bcolumn[ col_index ]^.cnextind;
                        END;
                    (*ENDWHILE*) 
                    END;
                (*ENDWITH*) 
            (*ENDIF*) 
            a06retpart_move (acv, @col_id, sizeof (col_id));
            FOR i := 1 TO 3 DO
                a06retpart_move (acv,
                      @col_id.fileRoot_gg00, sizeof (col_id.fileRoot_gg00));
            (*ENDFOR*) 
            a06finish_curr_retpart (acv, sp1pk_bdinfo, 1);
            a06retpart_move (acv, @file_pos, mxgg_treepos);
            ic2.map_int := string_col_cnt;
            IF  a_out_packet^.sp1_header.sp1h_mess_swap
                <> g01code.kernel_swap
            THEN
                BEGIN
                aux[1] := ic2.map_c2[ 2 ];
                aux[2] := ic2.map_c2[ 1 ];
                END
            ELSE
                BEGIN
                aux[1] := ic2.map_c2[ 1 ];
                aux[2] := ic2.map_c2[ 2 ];
                END;
            (*ENDIF*) 
            ic2.map_int := string_col_no;
            IF  a_out_packet^.sp1_header.sp1h_mess_swap
                <> g01code.kernel_swap
            THEN
                BEGIN
                aux[3] := ic2.map_c2[ 2 ];
                aux[4] := ic2.map_c2[ 1 ];
                END
            ELSE
                BEGIN
                aux[3] := ic2.map_c2[ 1 ];
                aux[4] := ic2.map_c2[ 2 ];
                END;
            (*ENDIF*) 
            ic2.map_int := rk.keyLen_gg00;
            IF  a_out_packet^.sp1_header.sp1h_mess_swap
                <> g01code.kernel_swap
            THEN
                BEGIN
                aux[5] := ic2.map_c2[ 2 ];
                aux[6] := ic2.map_c2[ 1 ];
                END
            ELSE
                BEGIN
                aux[5] := ic2.map_c2[ 1 ];
                aux[6] := ic2.map_c2[ 2 ];
                END;
            (*ENDIF*) 
            a06retpart_move (acv, @aux, sizeof(aux));
            a06retpart_move (acv, @rk.k, rk.keyLen_gg00);
            a06finish_curr_retpart (acv, sp1pk_key, 1)
            END
        ELSE
            a07_b_put_error (acv, acv.a_transinf.tri_trans.trError_gg00, 1)
        (*ENDIF*) 
        END;
    (*ENDWITH*) 
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17clean_up (
            VAR acv   : tak_all_command_glob;
            VAR tabid : tgg_surrogate);
 
VAR
      b_err    : tgg_basis_error;
      ret_code : integer;
      sysk     : tgg_sysinfokey;
      tree     : tgg00_FileId;
 
BEGIN
WITH acv DO
    BEGIN
    sysk             := a01defaultkey;
    sysk.stableid    := tabid;
    ret_code         := a_return_segm^.sp1r_returncode;
    a_return_segm^.sp1r_returncode := 0;
    IF  a_constraint_cnt > 0
    THEN
        BEGIN
        (* destroy temporary constraint information *)
        sysk.sentrytyp   := cak_emessblock;
        sysk.slinkage[2] := chr(1);
        a10del_sysinfo (acv, sysk, b_err)
        END;
    (*ENDIF*) 
    IF  a_fk_check_cnt <> 0
    THEN
        BEGIN
        (* destroy temporary foreign key information *)
        g04build_temp_tree_id (tree, a_transinf.tri_trans);
        tree.fileTfnTemp_gg00 := ttfnLink_egg00;
        b01prefix_destroy_files (a_transinf.tri_trans,
              tree.fileName_gg00, mxgg_tempprefix);
        sysk.sentrytyp := cak_elinkparsinfo;
        sysk.slinkage  := cak_init_linkage;
        WHILE (ord(sysk.slinkage[ 2 ]) <= abs(a_fk_check_cnt)) DO
            BEGIN
            a10del_sysinfo (acv, sysk, b_err);
            a06inc_linkage (sysk.slinkage)
            END;
        (*ENDWHILE*) 
        END;
    (*ENDIF*) 
    a_return_segm^.sp1r_returncode := ret_code
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17code_byte_swap (
            VAR acv             : tak_all_command_glob;
            is_outcopy          : boolean;
            VAR table_desc      : tsp7_table_description;
            transfer_to_ascii   : boolean;
            transfer_to_ebcdic  : boolean);
 
VAR
      uni_e       : tsp8_uni_error;
      err_char_no : tsp_int4;
      BufLen      : tsp00_Int4;
      BufSize     : tsp00_Int4;
      i           : integer;
      packet_ptr  : tsp1_packet_ptr;
 
BEGIN
WITH acv, table_desc DO
    BEGIN
    IF  is_outcopy
    THEN
        packet_ptr := a_out_packet
    ELSE
        packet_ptr := a_in_packet;
    (*ENDIF*) 
    IF  NOT is_outcopy AND
        (a_in_packet^.sp1_header.sp1h_mess_swap <> g01code.kernel_swap)
    THEN
        BEGIN
        sp7t_field_cnt      := a01swap_int2 (sp7t_field_cnt);
        sp7t_constraint_cnt := a01swap_int2 (sp7t_constraint_cnt)
        END;
    (*ENDIF*) 
    FOR i := 1 TO sp7t_field_cnt DO
        WITH sp7t_fields[ i ] DO
            BEGIN
            IF  packet_ptr^.sp1_header.sp1h_mess_swap <>
                g01code.kernel_swap
            THEN
                BEGIN
                sp7fi_def_col_no  := a01swap_int2 (sp7fi_def_col_no);
                sp7fi_stmt_col_no := a01swap_int2 (sp7fi_stmt_col_no);
                sp7fi_len         := a01swap_int2 (sp7fi_len);
                sp7fi_in_out_l    := a01swap_int2 (sp7fi_in_out_l)
                END;
            (*ENDIF*) 
            END;
        (*ENDWITH*) 
    (*ENDFOR*) 
    IF  transfer_to_ascii
    THEN
        BEGIN
        g02tebcdic_to_ascii (sp7t_authid, sp7t_authid, sizeof (sp7t_authid));
        g02t1ebcdic_to_ascii (sp7t_tablename, sp7t_tablename,
              sizeof (sp7t_tablename))
        END
    ELSE
        IF  transfer_to_ebcdic
        THEN
            BEGIN
            g02tascii_to_ebcdic (sp7t_authid,
                  sp7t_authid, sizeof (sp7t_authid));
            g02t1ascii_to_ebcdic (sp7t_tablename, sp7t_tablename,
                  sizeof (sp7t_tablename))
            END
        ELSE
            IF  g01unicode AND
                (a_out_packet^.sp1_header.sp1h_mess_swap  <> sw_normal)
            THEN
                BEGIN
                BufLen  := sizeof(sp7t_authid);
                BufSize := sizeof(sp7t_authid);
                s80uni_trans (@sp7t_authid, sizeof(sp7t_authid),
                      csp_unicode, @sp7t_authid,
                      BufSize, csp_unicode_swap, [ ],
                      uni_e, err_char_no);
                BufLen  := sizeof(sp7t_tablename);
                BufSize := sizeof(sp7t_tablename);
                s80uni_trans (@sp7t_tablename, sizeof(sp7t_tablename),
                      csp_unicode, @sp7t_tablename,
                      BufSize, csp_unicode_swap, [ ],
                      uni_e, err_char_no);
                END;
            (*ENDIF*) 
        (*ENDIF*) 
    (*ENDIF*) 
    IF  is_outcopy AND
        (a_out_packet^.sp1_header.sp1h_mess_swap <> g01code.kernel_swap)
    THEN
        BEGIN
        sp7t_field_cnt      := a01swap_int2 (sp7t_field_cnt);
        sp7t_constraint_cnt := a01swap_int2 (sp7t_constraint_cnt)
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17describe_constraint (
            VAR acv  : tak_all_command_glob;
            VAR a11v : tak_a11_glob);
 
VAR
      new_base        : boolean;
      b_err           : tgg_basis_error;
      i               : integer;
      pos             : integer;
      desc_len        : integer;
      length          : integer;
      sysbuf          : tak_sysbufferaddress;
      constraint_name : tsp_knl_identifier;
      sysk            : tgg_sysinfokey;
      descbuf         : tak_systembuffer;
      oldbase_p  : tak_syspointerarr;
      extcol_map : tgg03_extcol_map;
 
BEGIN
WITH acv, a11v DO
    BEGIN
    new_base         := false;
    sysk             := a_p_arr1.pbasep^.syskey;
    sysk.sentrytyp   := cak_econstraint;
    IF  a_in_packet^.sp1_header.sp1h_mess_swap <> sw_normal
    THEN
        BEGIN
        sysk.slinkage[2] := a_data_ptr^[1];
        sysk.slinkage[1] := a_data_ptr^[2];
        END
    ELSE
        BEGIN
        sysk.slinkage[1] := a_data_ptr^[1];
        sysk.slinkage[2] := a_data_ptr^[2];
        END;
    (*ENDIF*) 
    a10get_sysinfo (acv, sysk, d_release, sysbuf, b_err);
    IF  b_err = e_ok
    THEN
        BEGIN
        a11getconstraintname (sysbuf^.sconstraint, constraint_name);
        a06retpart_move (acv, @constraint_name, sizeof (constraint_name));
        sysk.sentrytyp := cak_eviewdesc;
        a10get_sysinfo (acv, sysk, d_release, sysbuf, b_err)
        END;
    (*ENDIF*) 
    IF  b_err = e_ok
    THEN
        WITH descbuf.sviewdesc DO
            BEGIN
            g10mv5 ('VAK17 ',   1,    
                  sizeof (sysbuf^), sizeof (descbuf),
                  sysbuf^, 1, descbuf, 1, sysbuf^.b_sl, b_err);
            desc_len :=  sizeof (vdesc_cnt) + sizeof (vdesc_next) +
                  sizeof (vdesc_fill1) + sizeof (vdesc_fill2) +
                  vdesc_cnt * sizeof (vdescription[1]) +
                  sizeof (vdescription[1].vfromtabno);
            length   := sysbuf^.b_sl -
                  cak_sysbufferoffset - sizeof (vsegmentid);
            (* PTS 1116259 M.Ki *)
            a13_new_catalog_desc (acv, a11v, oldbase_p,
                  extcol_map, new_base);
            FOR i := 1 TO vdesc_cnt DO
                WITH vdescription[i] DO
                    BEGIN
                    vfromextcolno := acv.a_p_arr1.pbasep^.sbase.bcolumn[
                          extcol_map[vfromextcolno].em_new_colind ]^.cextcolno;
                    vn_pos        := 0;
                    IF  g01code.kernel_swap <> sw_normal
                    THEN
                        BEGIN
                        vfromtabno    := a01swap_int2 (vfromtabno);
                        vfromextcolno := a01swap_int2 (vfromextcolno);
                        vfiller       := false
                        END;
                    (*ENDIF*) 
                    END;
                (*ENDWITH*) 
            (*ENDFOR*) 
            IF  b_err = e_ok
            THEN
                BEGIN
                vdescription[vdesc_cnt + 1].vfromtabno := 0;
                IF  g01code.kernel_swap <> sw_normal
                THEN
                    BEGIN
                    WITH vdescription[vdesc_cnt + 1] DO
                        vfromtabno := a01swap_int2 (vfromtabno);
                    (*ENDWITH*) 
                    vdesc_cnt   := a01swap_int2 (vdesc_cnt);
                    vdesc_fill1 := false;
                    vdesc_fill2 := 0
                    END;
                (*ENDIF*) 
                a06retpart_move (acv,
                      @descbuf.ssysbuf[cak_sysbufferoffset + 3],
                      length);
                IF  g01code.ctype = csp_ebcdic
                THEN
                    BEGIN
                    g02pebcdic_pos_ascii (a_curr_retpart^.sp1p_buf, 1,
                          a_curr_retpart^.sp1p_buf, 1, sizeof (tsp_name));
                    pos := sizeof (tsp_name) + desc_len + 1;
                    g02pebcdic_pos_ascii (a_curr_retpart^.sp1p_buf, pos,
                          a_curr_retpart^.sp1p_buf, pos,
                          a_curr_retpart^.sp1p_buf_len - pos + 1)
                    END;
                (*ENDIF*) 
                a06finish_curr_retpart (acv, sp1pk_data, 1)
                END;
            (*ENDIF*) 
            IF  new_base (* PTS 1116259 M.Ki *)
            THEN
                a10_key_del (acv, acv.a_p_arr1.pbasep^.syskey);
            (*ENDIF*) 
            END;
        (*ENDWITH*) 
    (*ENDIF*) 
    IF  b_err <> e_ok
    THEN
        a07_b_put_error (acv, b_err, 1)
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17describe_default (
            VAR acv  : tak_all_command_glob;
            VAR a11v : tak_a11_glob);
 
VAR
      new_base   : boolean;
      defaultLen : tsp00_Int2;
      b_err      : tgg_basis_error;
      sysk       : tgg_sysinfokey;
      extcolno   : tsp_int2;
      oldbase_p  : tak_syspointerarr;
      extcol_map : tgg03_extcol_map;
 
BEGIN
WITH acv, a11v DO
    BEGIN
    sysk             := a_p_arr1.pbasep^.syskey;
    sysk.sentrytyp   := cak_edefault;
    IF  a_in_packet^.sp1_header.sp1h_mess_swap <> sw_normal
    THEN
        extcolno := ord(a_data_ptr^[1]) + ord(a_data_ptr^[2])*256
    ELSE
        extcolno := ord(a_data_ptr^[2]) + ord(a_data_ptr^[1])*256;
    (*ENDIF*) 
    (* PTS 1116259 M.Ki.: get clean output record map for extcolnos*)
    new_base := false;
    a13_new_catalog_desc (acv, a11v, oldbase_p,
          extcol_map, new_base);
    extcolno := oldbase_p.pbasep^.sbase.bcolumn[
          extcol_map[extcolno].em_old_colind ]^.cextcolno;
    sysk.slinkage[1] := chr (extcolno DIV 256);
    sysk.slinkage[2] := chr (extcolno MOD 256);
    a10get_sysinfo (acv, sysk, d_release, a1valsysp, b_err);
    IF  b_err = e_ok
    THEN
        WITH a1valsysp^.sdefault DO
            BEGIN
            (* PTS 1108427, 1116675 *)
            defaultLen := a14LengthOfDefaultValue(a1valsysp^.sdefault);
            IF  a_out_packet^.sp1_header.sp1h_mess_swap
                <> g01code.kernel_swap
            THEN
                defaultLen := a01swap_int2(defaultLen);
            (*ENDIF*) 
            a06retpart_move (acv, @defaultLen, sizeof(defaultLen));
            a06retpart_move (acv, @dfvalues[2],
                  a14LengthOfDefaultValue(a1valsysp^.sdefault));
            a06finish_curr_retpart (acv, sp1pk_data, 1)
            END
        (*ENDWITH*) 
    ELSE
        a07_b_put_error (acv, b_err, 1);
    (*ENDIF*) 
    IF  new_base
    THEN
        a10_key_del (acv, acv.a_p_arr1.pbasep^.syskey);
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17end_restore (VAR acv : tak_all_command_glob);
 
VAR
      data_ptr       : tsp1_part_ptr;
      bd_info_ptr    : tsp1_part_ptr;
      dummy_ptr      : tsp1_part_ptr;
      rightmost_leaf : tsp_page_no;
      treeid         : tgg00_FileId;
 
BEGIN
ak17get_part_pointers (acv,
      data_ptr, bd_info_ptr, dummy_ptr, dummy_ptr);
WITH acv DO
    IF  bd_info_ptr = NIL
    THEN
        a07_b_put_error (acv, e_too_short_datapart, 1)
    ELSE
        BEGIN
        s10mv2 (bd_info_ptr^.sp1p_buf_size, sizeof(treeid),
              bd_info_ptr^.sp1p_buf, 1, treeid, 1, sizeof(treeid));
        treeid.fileRootCheck_gg00 := ROOT_CHECK_GG00;
        s10mv5 (bd_info_ptr^.sp1p_buf_size, sizeof(rightmost_leaf),
              bd_info_ptr^.sp1p_buf, sizeof(treeid) + 1,
              rightmost_leaf, 1, sizeof(rightmost_leaf));
        acv.a_transinf.tri_trans.trError_gg00 := e_ok;
        b02finish_load (acv.a_transinf.tri_trans,
              treeid, rightmost_leaf);
        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  (treeid.fileTfn_gg00 = tfnTable_egg00) (* PTS 1110396 *)
        THEN
            BEGIN
            IF  (a_restore_with_string > 0)
            THEN (* empty file containing short string columns *)
                b01empty_file (acv.a_transinf.tri_trans, a_into_tree);
            (*ENDIF*) 
            ak17clean_up (acv, treeid.fileTabId_gg00);
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17get_default_range (
            VAR acv              : tak_all_command_glob;
            VAR a11v             : tak_a11_glob;
            VAR sysptr           : tak_syspointerarr; (* PTS 1116259 M.Ki *)
            VAR col_info         : tak00_columninfo;
            VAR def_type         : tsp7_default);
 
VAR
      b_err       : tgg_basis_error;
 
BEGIN
def_type := sp7_no_default;
WITH acv, a11v, a_p_arr1, col_info DO
    BEGIN
    def_type  := sp7_no_default;
    a1valsysp := NIL;
    IF  ctdefault in ccolpropset
    THEN
        BEGIN
        a1valkey := a01defaultkey;
        WITH a1valkey DO
            BEGIN
            stableid    := sysptr.pbasep^.syskey.stableid; (* PTS 1116259 M.Ki *)
            sentrytyp   := cak_edefault;
            slinkage[1] := chr (cextcolno DIV 256);
            slinkage[2] := chr (cextcolno MOD 256)
            END;
        (*ENDWITH*) 
        a10get_sysinfo (acv, a1valkey, d_fix, a1valsysp, b_err);
        IF  b_err = e_ok
        THEN
            WITH a1valsysp^.sdefault DO
                BEGIN
                IF  dfdefault_function > 0
                THEN
                    CASE dfdefault_function OF
                        cak_x_date :
                            def_type := sp7_default_date;
                        cak_x_stamp:
                            def_type := sp7_default_stamp;
                        cak_x_timestamp :
                            def_type := sp7_default_timestamp;
                        cak_x_time :
                            def_type := sp7_default_time;
                        cak_x_user :
                            def_type := sp7_default_user;
                        cak_x_usergroup :
                            def_type := sp7_default_usergroup;
                        cak_x_uid :
                            def_type := sp7_default_uid;
                        cak_x_true :
                            def_type := sp7_default_true;
                        cak_x_false :
                            def_type := sp7_default_false;
                        OTHERWISE
                            a07ak_system_error (acv, 17, 1);
                        END
                    (*ENDCASE*) 
                ELSE
                    def_type := sp7_other_default;
                (*ENDIF*) 
                END
            (*ENDWITH*) 
        ELSE
            a07_b_put_error (acv, b_err, 1)
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17incopy_baserecords (
            VAR acv  : tak_all_command_glob;
            VAR a11v : tak_a11_glob);
 
VAR
      isLongColumn : boolean;
      b_err        : tgg_basis_error;
 
      datatyp_map_c : RECORD
            CASE boolean OF
                true :
                    (c : tsp_c2);
                false :
                    (d : tsp_data_type);
                END;
            (*ENDCASE*) 
 
      keypos      : integer;
      i           : integer;
      p_index     : integer;
      col_index   : integer;
      colname_pos : tsp_int4;
      colname_len : integer;
      colp        : tak00_colinfo_ptr;
      sysk        : tgg_sysinfokey;
      table_desc  : ^tsp7_table_description;
      base        : ^tak_baserecord;
      old_base    : tak_baserecord;
      colname     : tsp_knl_identifier;
 
BEGIN
WITH acv, a11v DO
    BEGIN
&   ifdef trace
    t01moveobj (ak_sem, a_data_ptr^, 1, a_data_length);
&   endif
    table_desc := @a_data_ptr^;
    ak17code_byte_swap (acv, NOT c_outcopy, table_desc^,
          (a_basic_code  = csp_ebcdic) AND
          (g01code.ctype = csp_ascii),
          (a_basic_code  = csp_ascii)  AND
          (g01code.ctype = csp_ebcdic));
    IF  a_p_arr1.pbasep <> NIL (* PTS 1107977 *)
    THEN
        BEGIN
        a1createtab := false;
        old_base    := a_p_arr1.pbasep^.sbase;
        sysk        := a_p_arr1.pbasep^.syskey;
        a10key_del  (acv, a_p_arr1.pbasep);
        a1tableid := a_p_arr1.pbasep^.syskey.stableid;
        a10_nil_get_sysinfo (acv, sysk, d_fix,
              sizeof (tak_baserecord), a_p_arr1.pbasep, b_err);
        IF  b_err <> e_ok
        THEN
            a07_b_put_error (acv, b_err, 1);
        (*ENDIF*) 
        END
    ELSE
        BEGIN
        a1createtab   := true;
        a11v.a1authid := acv.a_curr_user_id;
        a11v.a1tablen := table_desc^.sp7t_tablename;
        a11init_baserecord (acv, a11v)
        END;
    (*ENDIF*) 
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        BEGIN
        keypos                 := 1;
        a1reclen               := 0;
        p_index                := 1;
        base                   := @a_p_arr1.pbasep^.sbase;
        WITH base^ DO
            BEGIN
            IF  table_desc^.sp7t_table_kind = ord(twithkey)
            THEN
                btablekind := twithkey
            ELSE
                btablekind := twithoutkey;
            (*ENDIF*) 
            IF  NOT a1createtab
            THEN
                BEGIN
                base^ := old_base;
                bmaxcol        := 0;
                blenfixedcol   := 1;
                bmaxreclen     := 0;
                bvarcolcount   := 0;
                bcntdropcol    := 0;
                bstringcount   := 0;
                bunloaded      := false;
                bindexexist    := false;
                blongvarcolcnt := 0;
                bnamed_constr  := 0;
                bfirstindex    := a11firstindex (MAX_COL_PER_TAB_GG00, base^);
                blastindex     := bfirstindex - 1;
                battributes    := [];
                bptr           := NIL;
                FOR i := 1 TO sizeof (bcolumn) DIV sizeof (bcolumn[1]) DO
                    bcolumn[i] := NIL;
                (*ENDFOR*) 
                a061add_name (acv, base^, table_desc^.sp7t_tablename, btablen)
                END;
            (*ENDIF*) 
            END;
        (*ENDWITH*) 
        colname_pos :=
              sizeof (table_desc^.sp7t_authid) +
              sizeof (table_desc^.sp7t_tablename       ) +
              sizeof (table_desc^.sp7t_field_cnt       ) +
              sizeof (table_desc^.sp7t_kernel_swap     ) +
              sizeof (table_desc^.sp7t_table_kind      ) +
              sizeof (table_desc^.sp7t_kernel_loc      ) +
              sizeof (table_desc^.sp7t_constraint_cnt  ) +
              table_desc^.sp7t_field_cnt * sizeof (tsp7_ffield_info) + 1;
        WITH table_desc^ DO
            FOR i := 1 TO sp7t_field_cnt DO
                WITH sp7t_fields[ i ] DO
                    BEGIN (* construct column catalog information *)
                    colname     := a01_il_b_identifier;
                    colname_len := ord (a_data_ptr^[colname_pos]);
                    g10mv2 ('VAK17 ',   2,    
                          a_data_length, sizeof (colname),
                          a_data_ptr^, colname_pos + 1, colname, 1,
                          colname_len, a_return_segm^.sp1r_returncode);
                    colname_pos := colname_pos + 1 + colname_len;
                    a061app_columnname (acv, base^,
                          colname, col_index);
                    IF  a_return_segm^.sp1r_returncode = 0
                    THEN
                        BEGIN
                        colp                       := base^.bcolumn[col_index];
                        colp^.cextcolno            := sp7fi_def_col_no;
                        colp^.creccolno            := colp^.cextcolno;
                        colp^.ctabno               := 1;
                        colp^.cbinary              := false;
                        colp^.cdatatyp             := sp7fi_data_type;
                        colp^.cinoutlen            := sp7fi_in_out_l;
                        colp^.cdatalen             := sp7fi_len;
                        IF  colp^.cdatatyp = dfloat
                        THEN
                            colp^.cdatafrac := cak_frac_offset + csp_float_frac
                        ELSE
                            colp^.cdatafrac := sp7fi_frac + cak_frac_offset;
                        (*ENDIF*) 
                        IF  colp^.cdatatyp in
                            [dstra, dstrb, dstrdb, dstre, dstruni,
                            dlonga, dlongb, dlongdb, dlonge, dlonguni]
                        THEN
                            BEGIN
                            isLongColumn  := true;
                            a1strcolcount := a1strcolcount + 1;
                            IF  colp^.cdatatyp in
                                [dlonga, dlongb, dlongdb, dlonge, dlonguni]
                            THEN
                                a1long_col_cnt := a1long_col_cnt + 1;
                            (*ENDIF*) 
                            base^.bstringcount :=
                                  base^.bstringcount + 1
                            END
                        ELSE
                            BEGIN
                            isLongColumn := false;
                            IF  colp^.cdatatyp in [dinteger, dsmallint]
                            THEN
                                BEGIN
                                colp^.cdatatyp := dfixed;
                                colp^.cbinary  := true
                                END;
                            (*ENDIF*) 
                            END;
                        (*ENDIF*) 
                        CASE sp7fi_col_mode OF
                            mod_dropped  :
                                BEGIN
                                colp^.ccolpropset := [ ctdropped ];
                                IF  sp7fi_len_type = sp7_fix_len
                                THEN
                                    colp^.ccolstack.etype := st_fixcol
                                ELSE
                                    colp^.ccolstack.etype := st_varcol
                                (*ENDIF*) 
                                END;
                            mod_key      :
                                BEGIN
                                base^.bkeycolcount := base^.bkeycolcount + 1;
                                colp^.ccolpropset  := [ ctkey ];
                                IF  sp7fi_len_type = sp7_fix_len
                                THEN
                                    colp^.ccolstack.etype := st_fixkey
                                ELSE
                                    colp^.ccolstack.etype := st_varkey
                                (*ENDIF*) 
                                END;
                            mod_syskey   :
                                BEGIN
                                base^.bkeycolcount    := base^.bkeycolcount + 1;
                                colp^.ccolpropset     := [ ctkey, ctopt ];
                                colp^.ccolstack.etype := st_varkey
                                END;
                            mod_optional :
                                BEGIN
                                (* PTS 1116259 M.Ki *)
                                colp^.ccolpropset := [ ctopt ];
                                IF  sp7fi_len_type = sp7_fix_len
                                THEN
                                    colp^.ccolstack.etype := st_fixcol
                                ELSE
                                    colp^.ccolstack.etype := st_varcol
                                (*ENDIF*) 
                                END;
                            OTHERWISE
                                BEGIN
                                colp^.ccolpropset := [  ];
                                IF  sp7fi_len_type = sp7_fix_len
                                THEN
                                    colp^.ccolstack.etype := st_fixcol
                                ELSE
                                    colp^.ccolstack.etype := st_varcol
                                (*ENDIF*) 
                                END;
                            END;
                        (*ENDCASE*) 
                        WITH colp^.ccolstack DO
                            BEGIN
                            eop := op_none;
                            CASE colp^.cdatatyp OF
                                dstra   :
                                    ecol_tab[ 1 ] := chr(1);
                                dstrb   :
                                    ecol_tab[ 1 ] := chr(2);
                                dstrdb  :
                                    ecol_tab[ 1 ] := chr(3);
                                dstruni :
                                    ecol_tab[ 1 ] := chr(4);
                                OTHERWISE
                                    ecol_tab[ 1 ] := chr(0);
                                END;
                            (*ENDCASE*) 
                            a1reclen      := a1reclen + colp^.cinoutlen;
                            ecol_tab[ 2 ] := chr(0);
                            CASE etype OF
                                st_fixkey, st_varkey :
                                    BEGIN
                                    epos     := keypos;
                                    elen_var := colp^.cinoutlen;
                                    keypos   := keypos + colp^.cinoutlen;
&                                   ifdef trace
                                    t01int4 (ak_sem, 'key column  ', epos);
&                                   endif
                                    END;
                                st_fixcol :
                                    BEGIN
                                    IF  a1createtab AND isLongColumn
                                    THEN
                                        epos := (a1strcolcount-1) * colp^.cinoutlen + 1
                                    ELSE
                                        BEGIN
                                        epos     := base^.blenfixedcol;
&                                       ifdef trace
                                        t01int4 (ak_sem, 'fixed column', epos);
&                                       endif
                                        base^.blenfixedcol :=
                                              base^.blenfixedcol + colp^.cinoutlen
                                        END;
                                    (*ENDIF*) 
                                    elen_var := colp^.cinoutlen
                                    END;
                                OTHERWISE
                                    BEGIN
                                    elen_var := colp^.cinoutlen;
&                                   ifdef trace
                                    t01int4 (ak_sem, 'var   column', epos);
&                                   endif
                                    IF  colp^.cdatalen > cak_maxfieldlength
                                    THEN
                                        BEGIN
                                        a1reclen := a1reclen + 2;
                                        etype    := st_varlongchar;
                                        base^.blongvarcolcnt :=
                                              base^.blongvarcolcnt + 1;
                                        ecolno := base^.blongvarcolcnt;
                                        END
                                    ELSE
                                        BEGIN
                                        base^.bvarcolcount :=
                                              base^.bvarcolcount + 1;
                                        ecolno   := base^.bvarcolcount;
                                        a1reclen := a1reclen + 1
                                        END;
                                    (*ENDIF*) 
                                    END;
                                END;
                            (*ENDCASE*) 
                            END;
                        (*ENDWITH*) 
                        IF  sp7fi_default <> sp7_no_default
                        THEN
                            BEGIN
                            IF  sp7fi_default = sp7_default_serial
                            THEN
                                colp^.ccolpropset :=
                                      colp^.ccolpropset + [ctserial]
                            ELSE
                                IF  sp7fi_default <> sp7_other_default
                                THEN
                                    BEGIN
                                    colp^.ccolpropset :=
                                          colp^.ccolpropset + [ ctdefault ];
                                    a1ti := 10;
                                    WITH a_ap_tree^[ 10 ] DO
                                        BEGIN
                                        n_proc     := a14;
                                        n_subproc  := cak_x_default_def;
                                        n_lo_level := 11
                                        END;
                                    (*ENDWITH*) 
                                    WITH a_ap_tree^[ 11 ] DO
                                        BEGIN
                                        n_proc := a14;
                                        CASE sp7fi_default OF
                                            sp7_default_user :
                                                n_subproc := cak_i_user;
                                            sp7_default_usergroup :
                                                n_subproc := cak_i_usergroup;
                                            sp7_default_date :
                                                n_subproc := cak_i_date;
                                            sp7_default_time :
                                                n_subproc := cak_i_time;
                                            sp7_default_timestamp :
                                                n_subproc := cak_i_timestamp;
                                            sp7_default_stamp :
                                                n_subproc := cak_i_stamp;
                                            sp7_default_uid :
                                                n_subproc := cak_i_uid;
                                            sp7_default_true :
                                                n_subproc := cak_i_true;
                                            sp7_default_false :
                                                n_subproc := cak_i_false;
                                            END;
                                        (*ENDCASE*) 
                                        END;
                                    (*ENDWITH*) 
                                    a14default_spec (acv, a11v, colp^)
                                    END;
                                (*ENDIF*) 
                            (*ENDIF*) 
                            END;
                        (*ENDIF*) 
                        END;
                    (*ENDIF*) 
                    END;
                (*ENDWITH*) 
            (*ENDFOR*) 
        (*ENDWITH*) 
        END;
    (*ENDIF*) 
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        BEGIN
        WITH a_p_arr1.pbasep^.sbase DO
            bmaxreclen := a1reclen;
        (*ENDWITH*) 
        a1sort      := true;
        a11end_create_table (acv, a11v)
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17incopy_constraint (
            VAR acv  : tak_all_command_glob;
            VAR a11v : tak_a11_glob);
 
VAR
      b_err        : tgg_basis_error;
      constr_id    : integer;
      ix           : integer;
      pos          : integer;
      required_len : integer;
      buf          : tak_sysbufferaddress;
      sysk         : tgg_sysinfokey;
 
BEGIN
WITH acv, a11v DO
    BEGIN
    IF  a_in_packet^.sp1_header.sp1h_mess_swap <> sw_normal
    THEN
        constr_id := ord(a_data_ptr^[2]) * 256 + ord(a_data_ptr^[1])
    ELSE
        constr_id := ord(a_data_ptr^[1]) * 256 + ord(a_data_ptr^[2]);
    (*ENDIF*) 
    IF  constr_id > cak_max_constraints
    THEN
        a07_b_put_error (acv, e_too_many_constraints, 1)
    ELSE
        BEGIN
        sysk           := a_p_arr1.pbasep^.syskey;
        sysk.sentrytyp := cak_econstraintname;
        s10mv1 (a_data_length, sizeof (a1constraint_name),
              a_data_ptr^, 3, a1constraint_name, 1, sizeof (a1constraint_name));
        IF  g01code.ctype = csp_ebcdic
        THEN (* constraint description is always ascii *)
            g02t1ascii_to_ebcdic (a1constraint_name,
                  a1constraint_name, sizeof (a1constraint_name));
        (*ENDIF*) 
        sysk.sidentifier := a1constraint_name;
        sysk.skeylen     := mxak_standard_sysk + sizeof (sysk.sidentifier);
        a10_nil_get_sysinfo (acv, sysk,
              d_release, sizeof (tak_constraintnamerecord), buf, b_err);
        IF  b_err = e_ok
        THEN
            WITH buf^.sconstrname DO
                BEGIN
                cnsegmentid :=
                      a_p_arr1.pbasep^.sbase.bsegmentid;
                cnid := constr_id;
                a10add_sysinfo (acv, buf, b_err)
                END;
            (*ENDWITH*) 
        (*ENDIF*) 
        sysk.sentrytyp     := cak_eviewdesc;
        IF  a_in_packet^.sp1_header.sp1h_mess_swap <> sw_normal
        THEN
            BEGIN
            sysk.slinkage[2] := a_data_ptr^[1];
            sysk.slinkage[1] := a_data_ptr^[2];
            END
        ELSE
            BEGIN
            sysk.slinkage[1] := a_data_ptr^[1];
            sysk.slinkage[2] := a_data_ptr^[2];
            END;
        (*ENDIF*) 
        sysk.skeylen       := mxak_standard_sysk;
        required_len       := cak_sysbufferoffset + 2 +
              a_data_length - 2 - sizeof (a1constraint_name);
        a10_nil_get_sysinfo (acv, sysk, d_fix,
              required_len, a1valsysp, b_err);
        IF  b_err = e_ok
        THEN
            g10mv3 ('VAK17 ',   3,    
                  a_data_length, sizeof (a1valsysp^), a_data_ptr^,
                  sizeof (a1constraint_name) + 3, a1valsysp^,
                  cak_sysbufferoffset + 3,
                  a_data_length - 2 - sizeof (a1constraint_name), b_err);
        (*ENDIF*) 
        IF  b_err = e_ok
        THEN
            BEGIN
            IF  g01code.kernel_swap <> sw_normal
            THEN
                WITH a1valsysp^.sviewdesc DO
                    BEGIN
                    vdesc_cnt := a01swap_int2 (vdesc_cnt);
                    FOR ix := 1 TO vdesc_cnt DO
                        WITH vdescription[ix] DO
                            BEGIN
                            vfromtabno    := a01swap_int2 (vfromtabno);
                            vn_pos        := a01swap_int2 (vn_pos);
                            vfromextcolno := a01swap_int2 (vfromextcolno); (* PTS 1116259 M.Ki *)
                            END;
                        (*ENDWITH*) 
                    (*ENDFOR*) 
                    WITH vdescription[vdesc_cnt+1] DO
                        vfromtabno := 1;
                    (*ENDWITH*) 
                    END;
                (*ENDWITH*) 
            (*ENDIF*) 
            IF  g01code.ctype = csp_ebcdic
            THEN (* constraint description is always ascii *)
                WITH a1valsysp^.sviewdesc DO
                    BEGIN
                    pos := cak_sysbufferoffset + sizeof (vsegmentid) +
                          sizeof (vdesc_cnt) + sizeof (vdesc_next) +
                          sizeof (vdesc_fill1) + sizeof (vdesc_fill2) +
                          vdesc_cnt * sizeof (vdescription[1]) +
                          sizeof (vdescription[1].vfromtabno) + 1;
                    g02p1ascii_pos_ebcdic (a1valsysp^, pos, a1valsysp^, pos,
                          required_len - pos + 1)
                    END;
                (*ENDWITH*) 
            (*ENDIF*) 
            a1valsysp^.b_sl := required_len;
            a1add_rec       := true;
            a_init_ddl      := ddl_create_table;
            a11constraint (acv, a11v, a_p_arr1.pbasep^.sbase, constr_id);
            a_p_arr1.pbasep^.sbase.bnamed_constr :=
                  a_p_arr1.pbasep^.sbase.bnamed_constr + 1;
            a_init_ddl := no_ddl
            END
        ELSE
            a07_b_put_error (acv, b_err, 1)
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17incopy_default (
            VAR acv    : tak_all_command_glob;
            VAR a11v   : tak_a11_glob);
 
VAR
      b_err        : tgg_basis_error;
      extcolno     : integer;
      col_ptr      : tak00_colinfo_ptr;
      sysk         : tgg_sysinfokey;
      valueLen     : tsp_int_map_c2;
      requiredLen  : integer;
 
BEGIN
(* The variab part contains the following information   *)
(*                                                      *)
(*         +----.....---+--+--+--...----+               *)
(*         |  PART1     |e |l | default |               *)
(*         +----.....---+--+--+--...----+               *)
(*          part1_length 2   2    l                     *)
(*                                                      *)
(* e = external column number                           *)
(* l = length of default value                          *)
WITH acv, a11v DO
    BEGIN
    IF  a_in_packet^.sp1_header.sp1h_mess_swap <> sw_normal
    THEN
        extcolno := ord(a_data_ptr^[2]) * 256 + ord(a_data_ptr^[1])
    ELSE
        extcolno := ord(a_data_ptr^[1]) * 256 + ord(a_data_ptr^[2]);
    (*ENDIF*) 
    a06extcolno (a_p_arr1.pbasep^.sbase, extcolno, col_ptr);
    sysk               := a_p_arr1.pbasep^.syskey;
    IF  a_in_packet^.sp1_header.sp1h_mess_swap <> sw_normal
    THEN
        BEGIN
        sysk.slinkage[2] := a_data_ptr^[1];
        sysk.slinkage[1] := a_data_ptr^[2];
        END
    ELSE
        BEGIN
        sysk.slinkage[1] := a_data_ptr^[1];
        sysk.slinkage[2] := a_data_ptr^[2];
        END;
    (*ENDIF*) 
    (* PTS 1116861 M.Ki *)
    IF  a_out_packet^.sp1_header.sp1h_mess_swap
        <> g01code.kernel_swap
    THEN
        BEGIN
        valueLen.map_c2[2] := a_data_ptr^[3];
        valueLen.map_c2[1] := a_data_ptr^[4];
        END
    ELSE
        BEGIN
        valueLen.map_c2[1] := a_data_ptr^[3];
        valueLen.map_c2[2] := a_data_ptr^[4];
        END;
    (*ENDIF*) 
    IF  valueLen.map_int <> 0
    THEN
        BEGIN (* default value exists, import this value *)
        requiredLen    := cak_sysbufferoffset + 4 + 1 + valueLen.map_int;
        sysk.sentrytyp := cak_edefault;
        a10_fix_len_get_sysinfo (acv, sysk, d_fix,
              requiredLen, 0, a1valsysp, b_err);
        IF  a_return_segm^.sp1r_returncode = 0
        THEN
            BEGIN
            g10mv3 ('VAK17 ',   4,    
                  a_data_length, sizeof (a1valsysp^), a_data_ptr^, 5,
                  a1valsysp^, cak_sysbufferoffset + 6,
                  valueLen.map_int, a_return_segm^.sp1r_returncode);
            col_ptr^.ccolpropset := col_ptr^.ccolpropset + [ ctdefault ];
            IF  col_ptr^.cdatatyp in [dstra, dstrb, dstrdb, dstre, dstruni,
                dlonga, dlongb, dlongdb, dlonge, dlonguni]
            THEN
                a1valsysp^.sdefault.dfdefault_function := cak_x_stamp
            ELSE
                a1valsysp^.sdefault.dfdefault_function := 0;
            (*ENDIF*) 
            a1valsysp^.sdefault.dfreclen     := requiredLen;
            a1valsysp^.sdefault.dfsegment_id :=
                  a_p_arr1.pbasep^.sbase.bsegmentid;
            a10_add_repl_sysinfo (acv, a1valsysp,
                  b_err = e_sysinfo_not_found, b_err);
            IF  b_err <> e_ok
            THEN
                a07_b_put_error (acv, b_err, 1)
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17incopy_table (
            VAR acv  : tak_all_command_glob;
            VAR a11v : tak_a11_glob);
 
VAR
      b_err       : tgg_basis_error;
      i           : integer;
      j           : integer;
      buf         : tak_sysbufferaddress;
      sysk        : tgg_sysinfokey;
      qual        : tak_del_tab_qual;
      viewscanpar : tak_viewscan_par;
 
BEGIN
a27init_viewscanpar(acv, viewscanpar, v_save_scheme);
WITH acv, a11v DO
    BEGIN
    IF  a_p_arr1.pbasep <> NIL (* PTS 1107977 *)
    THEN
        BEGIN
        a1global := false;
        a24all_index_drop (acv, viewscanpar);
        IF  a_return_segm^.sp1r_returncode = 0
        THEN
            BEGIN (* drop default catalog information *)
            i              := 1;
            sysk           := a_p_arr1.pbasep^.syskey;
            sysk.sentrytyp := cak_edefault;
            j := a_p_arr1.pbasep^.sbase.bfirstindex;
            WHILE (j <= a_p_arr1.pbasep^.sbase.blastindex) AND
                  (a_return_segm^.sp1r_returncode = 0) DO
                WITH a_p_arr1.pbasep^.sbase.bcolumn[ j ]^ DO
                    BEGIN
                    IF  ctdefault in ccolpropset
                    THEN
                        BEGIN
                        sysk.slinkage[1] := chr (creccolno DIV 256);
                        sysk.slinkage[2] := chr (creccolno MOD 256);
                        a10del_sysinfo (acv, sysk, b_err);
                        IF  b_err <> e_ok
                        THEN
                            a07_b_put_error (acv, b_err, 1);
                        (*ENDIF*) 
                        END;
                    (*ENDIF*) 
                    j := succ(j)
                    END;
                (*ENDWITH*) 
            (*ENDWHILE*) 
            END;
        (*ENDIF*) 
        i              := 1;
        sysk.sentrytyp := cak_econstraintname;
        sysk.skeylen   := mxgg_surrogate + 2;
        WHILE (i <= a_p_arr1.pbasep^.sbase.bnamed_constr) AND
              (a_return_segm^.sp1r_returncode = 0) DO
            BEGIN
            a10next_sysinfo (acv, sysk, mxgg_surrogate + 2,
                  d_release, cak_econstraintname,
                  buf, b_err);
            IF  b_err = e_ok
            THEN
                a10del_sysinfo (acv, sysk, b_err);
            (*ENDIF*) 
            IF  b_err = e_ok
            THEN
                BEGIN
                qual.del_qual_cnt  := 2;
                qual.del_qual[ 1 ] := cak_econstraint;
                qual.del_qual[ 2 ] := cak_eviewdesc;
                qual.del_colno     := i;
                a10_del_tab_sysinfo (acv,
                      a_p_arr1.pbasep^.syskey.stableid, qual, false, b_err)
                END;
            (*ENDIF*) 
            IF  b_err <> e_ok
            THEN
                a07_b_put_error (acv, b_err, 1);
            (*ENDIF*) 
            i := i + 1
            END;
        (*ENDWHILE*) 
        IF  a_return_segm^.sp1r_returncode = 0
        THEN
            WITH viewscanpar DO
                BEGIN
                vsc_save_into      := false;
                vsc_cmd_cnt        := 0;
                vsc_first_save     := true;
                vsc_last_save      := true;
                vsc_base_tabid     := a_p_arr1.pbasep^.sbase.bsurrogate;
                a15catalog_save (acv, viewscanpar)
                END;
            (*ENDWITH*) 
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        ak17incopy_baserecords (acv, a11v);
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17describe_index (
            VAR acv  : tak_all_command_glob;
            VAR a11v : tak_a11_glob);
 
VAR
      new_base       : boolean;
      i,j            : integer;
      named_indexes  : integer;
      indexname_len  : integer;
      single_set     : tak_columnset;
      index_desc     : ^tsp7_index_description;
      index_name     : tsp_knl_identifier;
      index_scan_rec : tak_index_scan_record;
      oldbase_p      : tak_syspointerarr;
      extcol_map     : tgg03_extcol_map;
 
BEGIN
WITH acv, a_p_arr1, a11v DO
    BEGIN
    new_base := false;
    IF  a_curr_retpart = NIL
    THEN
        a06init_curr_retpart (acv);
    (*ENDIF*) 
    IF  a_curr_retpart <> NIL
    THEN
        BEGIN
        index_desc := @a_curr_retpart^.sp1p_buf;
        g10fil ('VAK17 ',   5,    
              a_curr_retpart^.sp1p_buf_size, a_curr_retpart^.sp1p_buf,
              1, a_curr_retpart^.sp1p_buf_size, chr(0),
              a_return_segm^.sp1r_returncode);
        index_desc^.sp7i_first_mult_index := 0;
        index_desc^.sp7i_single_index_cnt := chr(0);
        index_desc^.sp7i_mult_index_cnt   := 0;
        a_curr_retpart^.sp1p_buf_len      := sizeof (index_desc^) -
              sizeof (index_desc^.sp7i_index_names);
        single_set                        := [  ];
        named_indexes                     := 0;
        IF  pbasep^.sbase.bindexexist
        THEN
            BEGIN
            a24init_index_scan (acv, pbasep^.sbase.bsurrogate,
                  index_scan_rec);
            WHILE a24next_named_index (acv, index_scan_rec) DO
                WITH index_scan_rec, isr_buf^.smindex.indexdef[isr_index] DO
                    BEGIN
                    named_indexes := named_indexes + 1;
                    IF  icount = 1
                    THEN
                        single_set := single_set + [icolseq[1]]
                    (*ENDIF*) 
                    END;
                (*ENDWITH*) 
            (*ENDWHILE*) 
            a24finish_index_scan (acv, index_scan_rec)
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  (pbasep^.sbase.bindexexist) AND
        (a_return_segm^.sp1r_returncode = 0)
    THEN
        WITH index_desc^ DO
            BEGIN
            sp7i_first_mult_index        := sp7i_first_mult_index + 1;
            a_curr_retpart^.sp1p_buf_len :=
                  sizeof (sp7i_single_index_cnt) +
                  sizeof (sp7i_filler           ) +
                  sizeof (sp7i_first_mult_index ) +
                  sizeof (sp7i_mult_index_cnt   ) +
                  (sp7i_first_mult_index + named_indexes - 1) *
                  sizeof (sp7i_mult_index[1]);
            a24init_index_scan (acv, pbasep^.sbase.bsurrogate,
                  index_scan_rec);
            WHILE a24next_named_index (acv, index_scan_rec) DO
                WITH index_scan_rec, isr_buf^.smindex.indexdef[isr_index] DO
                    BEGIN
                    a24get_indexname (acv, isr_buf,
                          isr_index, index_name);
                    indexname_len := a061identifier_len (index_name);
                    ak17move_name (acv, index_name, indexname_len);
                    WITH sp7i_mult_index[sp7i_first_mult_index +
                         sp7i_mult_index_cnt ] DO
                        BEGIN
                        IF  icount = 1
                        THEN
                            sp7mi_index_id := icolseq[ 1 ]
                        ELSE
                            sp7mi_index_id := indexno + MAX_COL_PER_TAB_GG00;
                        (*ENDIF*) 
                        IF  a_out_packet^.sp1_header.sp1h_mess_swap
                            <> g01code.kernel_swap
                        THEN
                            sp7mi_index_id := a01swap_int2 (sp7mi_index_id);
                        (*ENDIF*) 
                        sp7mi_col_cnt    := icount;
                        sp7mi_unique     := iunique;
                        sp7mi_found      := false;
                        sp7mi_filler[ 1 ]:= chr(0);
                        sp7mi_filler[ 2 ]:= chr(0);
                        sp7mi_filler[ 3 ]:= chr(0);
                        FOR j := 1 TO icount DO
                            BEGIN
                            IF  a_out_packet^.sp1_header.sp1h_mess_swap
                                <> g01code.kernel_swap
                            THEN
                                sp7mi_def_col_no[ j ] := a01swap_int2(icolseq[ j ])
                            ELSE
                                sp7mi_def_col_no[ j ] := icolseq[ j ];
                            (*ENDIF*) 
                            sp7mi_descending[ j ] := icolstack[ j ].eop in
                                  [ op_order_desc, op_unique_desc ]
                            END;
                        (*ENDFOR*) 
                        sp7i_mult_index_cnt := sp7i_mult_index_cnt + 1
                        END;
                    (*ENDWITH*) 
                    END;
                (*ENDWITH*) 
            (*ENDWHILE*) 
            a24finish_index_scan (acv, index_scan_rec)
            END;
        (*ENDWITH*) 
    (*ENDIF*) 
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        WITH index_desc^ DO
            BEGIN
            IF  sp7i_mult_index_cnt <> 0
            THEN
                BEGIN
                (* PTS 1116259 M.Ki.: get clean output record map and *)
                (*                    adjust index column numbers     *)
                a13_new_catalog_desc (acv, a11v, oldbase_p,
                      extcol_map, new_base);
                IF  a_return_segm^.sp1r_returncode = 0
                THEN
                    FOR i := 0 TO sp7i_mult_index_cnt-1 DO
                        WITH sp7i_mult_index[sp7i_first_mult_index + i] DO
                            FOR j := 1 TO sp7mi_col_cnt DO
                                IF  a_out_packet^.sp1_header.sp1h_mess_swap
                                    <> g01code.kernel_swap
                                THEN
                                    sp7mi_def_col_no[ j ] := a01swap_int2(acv.a_p_arr1.pbasep^.
                                          sbase.bcolumn[ extcol_map[
                                          sp7mi_def_col_no[j]].em_new_colind ]^.cextcolno)
                                ELSE
                                    sp7mi_def_col_no[ j ] := acv.a_p_arr1.pbasep^.
                                          sbase.bcolumn[ extcol_map[
                                          sp7mi_def_col_no[j]].em_new_colind ]^.cextcolno;
                                (*ENDIF*) 
                            (*ENDFOR*) 
                        (*ENDWITH*) 
                    (*ENDFOR*) 
                (*ENDIF*) 
                IF  new_base
                THEN
                    a10_key_del (acv, acv.a_p_arr1.pbasep^.syskey);
                (*ENDIF*) 
                END
            ELSE
                BEGIN
                index_desc^.sp7i_first_mult_index := 0;
                a_curr_retpart^.sp1p_buf_len  := a_curr_retpart^.sp1p_buf_len +
                      ord (index_desc^.sp7i_single_index_cnt) *
                      sizeof (tsp7_info_single_index)
                END;
            (*ENDIF*) 
&           ifdef trace
            t01moveobj (ak_sem, a_curr_retpart^.sp1p_buf, 1,
                  a_curr_retpart^.sp1p_buf_len);
&           endif
            IF  a_out_packet^.sp1_header.sp1h_mess_swap <> g01code.kernel_swap
            THEN
                BEGIN
                index_desc^.sp7i_first_mult_index := a01swap_int2(index_desc^.sp7i_first_mult_index);
                index_desc^.sp7i_mult_index_cnt   := a01swap_int2(index_desc^.sp7i_mult_index_cnt);
                END;
            (*ENDIF*) 
            a06finish_curr_retpart (acv, sp1pk_data, 1)
            END;
        (*ENDWITH*) 
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(* PTS 1111576 E.Z. *)
(*------------------------------*) 
 
PROCEDURE
      ak17get_part_pointers (
            VAR acv           : tak_all_command_glob;
            VAR data_ptr      : tsp1_part_ptr;
            VAR bd_info_ptr   : tsp1_part_ptr;
            VAR serial_ptr    : tsp1_part_ptr;
            VAR surrogate_ptr : tsp1_part_ptr);
 
VAR
      ix            : integer;
      curr_part_ptr : tsp1_part_ptr;
 
BEGIN
curr_part_ptr := NIL;
data_ptr      := NIL;
bd_info_ptr   := NIL;
serial_ptr    := NIL;
surrogate_ptr := NIL;
FOR ix := 1 TO acv.a_cmd_segm^.sp1s_no_of_parts DO
    BEGIN
    a92_next_part_get (acv, curr_part_ptr);
    IF  curr_part_ptr <> NIL
    THEN
        CASE curr_part_ptr^.sp1p_part_kind OF
            sp1pk_data :
                data_ptr := curr_part_ptr;
            sp1pk_bdinfo :
                bd_info_ptr := curr_part_ptr;
            sp1pk_serial :
                serial_ptr := curr_part_ptr;
            sp1pk_surrogate :
                surrogate_ptr := curr_part_ptr;
            OTHERWISE ;
            END;
        (*ENDCASE*) 
    (*ENDIF*) 
    END;
(*ENDFOR*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17move_name (
            VAR acv     : tak_all_command_glob;
            VAR colname : tsp_knl_identifier;
            name_len    : integer);
 
VAR
      pos : tsp_int4;
 
BEGIN
pos := acv.a_curr_retpart^.sp1p_buf_len + 1;
IF  pos + name_len > acv.a_curr_retpart^.sp1p_buf_size
THEN
    a07_b_put_error (acv, e_too_small_packet_size, 1)
ELSE
    BEGIN
    acv.a_curr_retpart^.sp1p_buf[pos] := chr(name_len);
    g10mv ('VAK17 ',   6,    
          name_len, acv.a_curr_retpart^.sp1p_buf_size,
          colname, 1, acv.a_curr_retpart^.sp1p_buf,
          pos + 1, name_len, acv.a_return_segm^.sp1r_returncode);
    acv.a_curr_retpart^.sp1p_buf_len := pos + name_len
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17put_index_stack_entries (VAR acv : tak_all_command_glob);
 
VAR
      b_err        : tgg_basis_error;
      i            : integer;
      j            : integer;
      mind_buf     : tak_sysbufferaddress;
      sysk         : tgg_sysinfokey;
 
BEGIN
WITH acv, a_mblock, mb_qual^  DO
    BEGIN
    IF  (a_return_segm^.sp1r_returncode = 0) AND
        (a_p_arr1.pbasep^.sbase.bindexexist)
    THEN
        BEGIN
        sysk           := a_p_arr1.pbasep^.syskey;
        sysk.sentrytyp := cak_emindex;
        a10get_sysinfo (acv, sysk, d_release, mind_buf, b_err);
        IF  b_err <> e_ok
        THEN
            a07_b_put_error (acv, b_err, 1);
        (*ENDIF*) 
        IF  a_return_segm^.sp1r_returncode = 0
        THEN
            BEGIN
            mmult_pos := mfirst_free;
            FOR i := 1 TO mind_buf^.smindex.indexcount DO
                WITH mind_buf^.smindex.indexdef[ i ] DO
                    IF  (indexno <> 0) AND
                        (icount <> 1)
                    THEN
                        IF  (mfirst_free + icount - 1 <= mst_max)
                        THEN
                            BEGIN
                            FOR j := 1 TO icount DO
                                BEGIN
                                mb_st^ [mfirst_free]:=icolstack[ j ];
                                mfirst_free := mfirst_free + 1;
                                END;
                            (*ENDFOR*) 
                            mmult_cnt := mmult_cnt + icount;
                            END
                        ELSE
                            a07_b_put_error (acv,
                                  e_too_many_mb_stackentries, 1);
                        (*ENDIF*) 
                    (*ENDIF*) 
                (*ENDWITH*) 
            (*ENDFOR*) 
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17store_constraint_info (
            VAR acv         : tak_all_command_glob;
            VAR a11v        : tak_a11_glob);
 
VAR
      b_err   : tgg_basis_error;
      i       : integer;
      and_cnt : integer;
 
BEGIN
WITH acv, a11v DO
    BEGIN
    a1valkey           := a_p_arr1.pbasep^.syskey;
    a1valkey.sentrytyp := cak_econstraint;
    i       := 1;
    and_cnt := 0;
    a06a_mblock_init (acv,
          m_select, mm_nil, a_p_arr1.pbasep^.sbase.btreeid);
    WHILE i <= a_p_arr1.pbasep^.sbase.bnamed_constr DO
        BEGIN
        a1valkey.slinkage[1] := chr(i DIV 256);
        a1valkey.slinkage[2] := chr(i MOD 256);
        a10get_sysinfo (acv, a1valkey, d_release, a_ptr1, b_err);
        IF  b_err = e_ok
        THEN
            a09load_constraint_info (acv,
                  i = a_p_arr1.pbasep^.sbase.bnamed_constr, and_cnt)
        ELSE
            BEGIN
            a07_b_put_error (acv, b_err, 1);
            i := csp_maxint2 - 1
            END;
        (*ENDIF*) 
        i := i + 1
        END;
    (*ENDWHILE*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17string_beginload (VAR acv  : tak_all_command_glob);
 
VAR
      i              : integer;
      b_err          : tgg_basis_error;
      pos            : integer;
      ic2            : tsp_int_map_c2;
      data_ptr       : tsp1_part_ptr;
      bd_info_ptr    : tsp1_part_ptr;
      dummy_ptr      : tsp1_part_ptr;
      rightmost_leaf : tsp_page_no;
      treeid         : tgg00_FileId;
      col_id         : tgg00_FileId;
      baserec_ptr    : ^tak_baserecord;
 
BEGIN
ak17get_part_pointers (acv,
      data_ptr, bd_info_ptr, dummy_ptr, dummy_ptr);
WITH acv DO
    IF  (bd_info_ptr = NIL) OR (data_ptr = NIL)
    THEN
        a07_b_put_error (acv, e_too_short_datapart, 1)
    ELSE
        BEGIN
        a_ex_kind  := parsing_executing;
        a_init_ddl := no_ddl;
        s10mv2 (bd_info_ptr^.sp1p_buf_size, sizeof(treeid),
              bd_info_ptr^.sp1p_buf, 1, treeid, 1, sizeof(treeid));
        treeid.fileRootCheck_gg00 := ROOT_CHECK_GG00;
        treeid.fileBdUse_gg00 := treeid.fileBdUse_gg00 + [ bd_load_nolog ];
        col_id                := treeid;
        pos                   := 1;
        a06a_mblock_init (acv,
              m_begin, mm_string, treeid);
        IF  a_out_packet^.sp1_header.sp1h_mess_swap
            <> g01code.kernel_swap
        THEN
            BEGIN
            ic2.map_c2[ 2 ] := data_ptr^.sp1p_buf[pos  ];
            ic2.map_c2[ 1 ] := data_ptr^.sp1p_buf[pos+1];
            END
        ELSE
            BEGIN
            ic2.map_c2[ 1 ] := data_ptr^.sp1p_buf[pos  ];
            ic2.map_c2[ 2 ] := data_ptr^.sp1p_buf[pos+1];
            END;
        (*ENDIF*) 
        a_mblock.mb_data^.mbp_keylen := ic2.map_int;
        (* PTS 1117508 *)
        g10mv4 ('VAK17 ',   7,    
              data_ptr^.sp1p_buf_size, a_mblock.mb_data_size,
              data_ptr^.sp1p_buf, pos + 2, a_mblock.mb_data^.mbp_buf,
              cgg_rec_key_offset + 1, a_mblock.mb_data^.mbp_keylen,
              a_return_segm^.sp1r_returncode);
        a_mblock.mb_data_len  := cgg_rec_key_offset +
              a_mblock.mb_data^.mbp_keylen;
        pos := pos + a_mblock.mb_data^.mbp_keylen + 2;
        IF  a_out_packet^.sp1_header.sp1h_mess_swap
            <> g01code.kernel_swap
        THEN
            BEGIN
            ic2.map_c2[ 2 ] := data_ptr^.sp1p_buf[pos  ];
            ic2.map_c2[ 1 ] := data_ptr^.sp1p_buf[pos+1];
            END
        ELSE
            BEGIN
            ic2.map_c2[ 1 ] := data_ptr^.sp1p_buf[pos  ];
            ic2.map_c2[ 2 ] := data_ptr^.sp1p_buf[pos+1];
            END;
        (*ENDIF*) 
        a_mblock.mb_qual^.mcol_pos := ic2.map_int;
        a06rsend_mess_buf (acv, a_mblock,
              NOT cak_return_req, b_err);
        IF  b_err = e_ok
        THEN
            BEGIN
            baserec_ptr        := @a_mblock.mb_data^.mbp_rec;
            col_id.fileTabId_gg00   := baserec_ptr^.bsurrogate;
            col_id.fileTfn_gg00     := tfnColumn_egg00;
            col_id.fileType_gg00    := [ ftsByteStr_egg00, ftsConcurrent_egg00 ];
            col_id.fileRoot_gg00    := NIL_PAGE_NO_GG00;
            col_id.fileVersion_gg00.ci2_gg00  := cgg_dummy_file_version;
            col_id.fileTfnNo_gg00[1]          := chr(0);
            b02init_load (acv.a_transinf.tri_trans, col_id,
                  c_set_read_only, rightmost_leaf);
&           ifdef trace
            t01treeid (ak_sem, 'tree_id     ', col_id);
&           endif
            b_err := acv.a_transinf.tri_trans.trError_gg00;
            IF  b_err = e_ok
            THEN
                BEGIN
                col_id.fileHandling_gg00 := [ hsNoLog_egg00 ];
                a06retpart_move (acv, @col_id, sizeof (col_id));
                FOR i := 1 TO 3 DO
                    a06retpart_move (acv, @rightmost_leaf,
                          sizeof (rightmost_leaf));
                (*ENDFOR*) 
                a06finish_curr_retpart (acv, sp1pk_bdinfo, 1);
                acv.a_pars_last_key.p_kind := m_outcopy;
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        IF  b_err <> e_ok
        THEN
            a07_b_put_error (acv, b_err, 1)
        (*ENDIF*) 
        END;
    (*ENDIF*) 
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a17beginload_save_nolog (
            VAR acv      : tak_all_command_glob;
            VAR a11v     : tak_a11_glob);
 
VAR
      restore_string : boolean;
      beginload      : boolean;
      serial_colptr  : tak00_colinfo_ptr;
      restore_index  : boolean;
      repl_baserec   : boolean;
      with_stamp     : boolean;
      ix             : integer;
      jx             : integer;
      number_len     : integer;
      aux            : tsp_c2;
      b_err          : tgg_basis_error;
      mm_type        : tgg_message2_type;
      index_id       : tsp_int2;
      rightmost_leaf : tsp_page_no;
      treeid         : tgg00_FileId;
      serial_value   : tsp_c40;
      serial_val_ptr : tsp_moveobj_ptr;
      stamp          : tsp_key;
 
BEGIN
WITH acv, a11v, a_p_arr1.pbasep^.sbase DO
    BEGIN
    b_err                     := e_ok;
    repl_baserec              := bunloaded;
    a_fk_check_cnt            := 0;
    a_constraint_cnt          := 0;
    restore_index             := false;
    with_stamp                := false;
    treeid                    := btreeid;
    treeid.fileLeafNodes_gg00 := cgg_nil_leafnodes;
    WITH a_ap_tree^[ a_ap_tree^[ 0 ].n_lo_level ] DO
        BEGIN
        beginload      := n_subproc = cak_x_beginload;
        restore_string := n_subproc = cak_x_restore_string;
        with_stamp     := beginload AND (n_length = cak_i_stamp);
        IF  with_stamp AND NOT bdef_stamp
        THEN
            BEGIN
            bdef_stamp   := true;
            repl_baserec := true
            END;
        (*ENDIF*) 
        END;
    (*ENDWITH*) 
    a_restore_with_string := 0;
    serial_colptr         := NIL;
    FOR jx := a_p_arr1.pbasep^.sbase.bfirstindex TO
          a_p_arr1.pbasep^.sbase.blastindex DO
        BEGIN
        IF  NOT beginload AND
            (a_p_arr1.pbasep^.sbase.bcolumn[jx]^.cdatatyp in
            [dstra, dstre, dstrb, dstrdb, dstruni,
            (* PTS 1116934 M.Ki. *)
            dlonga, dlongb, dlongdb, dlonge, dlonguni])
        THEN
            a_restore_with_string := a_restore_with_string + 1;
        (*ENDIF*) 
        IF   ctserial in a_p_arr1.pbasep^.sbase.bcolumn[jx]^.ccolpropset
        THEN
            serial_colptr := a_p_arr1.pbasep^.sbase.bcolumn[jx]
        (*ENDIF*) 
        END;
    (*ENDFOR*) 
    IF  bunloaded
    THEN
        BEGIN
        bunloaded := false;
        a06a_mblock_init (acv, m_reload, mm_table, treeid);
        ak17put_index_stack_entries (acv);
        a06rsend_mess_buf (acv,
              a_mblock, NOT cak_return_req, b_err)
        END;
    (*ENDIF*) 
    IF  b_err = e_ok
    THEN
        BEGIN
        a_ex_kind              := parsing_executing;
        a_init_ddl             := no_ddl;
        treeid                 := btreeid;
        treeid. fileBdUse_gg00 := treeid. fileBdUse_gg00 + [ bd_load_nolog ];
        IF  (btablekind = twithoutkey) AND beginload
        THEN
            mm_type := mm_nokey
        ELSE
            mm_type := mm_key;
        (*ENDIF*) 
        IF  NOT (beginload)
        THEN
            BEGIN
            a1ti := a_ap_tree^[ a1ti ].n_sa_level;
            IF  a1ti <> 0
            THEN
                BEGIN (* restore index *)
                restore_index                    := true;
                treeid.fileRoot_gg00             := NIL_PAGE_NO_GG00;
                treeid.fileVersion_gg00.ci2_gg00 := cgg_dummy_file_version;
                WITH a_ap_tree^[ a1ti ] DO
                    a05_unsigned_int2_get (acv,
                          n_pos, n_length, e_invalid_unsign_integer, index_id);
                (*ENDWITH*) 
                treeid.fileTfn_gg00      := tfnMulti_egg00;
                treeid.fileTfnNo_gg00[1] := chr (index_id - MAX_COL_PER_TAB_GG00)
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        IF  restore_string
        THEN
            treeid.fileTfn_gg00 := tfnShortScol_egg00;
        (*ENDIF*) 
        a06a_mblock_init (acv,
              m_begin, mm_type, treeid);
        a06rsend_mess_buf (acv,
              a_mblock, NOT cak_return_req, b_err)
        END;
    (*ENDIF*) 
    IF  b_err = e_ok
    THEN
        BEGIN
        IF  beginload
        THEN
            BEGIN
            aux[1] := chr(a_mblock.mb_data^.mbp_keylen DIV 256);
            aux[2] := chr(a_mblock.mb_data^.mbp_keylen MOD 256);
            a06retpart_move (acv, @aux[1], 2);
            a06retpart_move (acv, @a_mblock.mb_data^.mbp_rec.info,
                  a_mblock.mb_data^.mbp_keylen);
            a06finish_curr_retpart (acv, sp1pk_key, 1);
            IF  with_stamp
            THEN
                BEGIN
                a05_stamp_get (acv, stamp, 1, mxsp_key);
                aux[1] := chr (1 + mxgg_surrogate);
                a06retpart_move (acv, @aux[1], 1);
                aux[1] := csp_defined_byte;
                a06retpart_move (acv, @aux[1], 1);
                a06retpart_move (acv, @stamp, mxgg_surrogate);
                a06finish_curr_retpart (acv, sp1pk_surrogate, 1)
                END;
            (*ENDIF*) 
            IF  serial_colptr <> NIL
            THEN
                BEGIN
                serial_value[1] := csp_defined_byte;
                serial_value[2] := csp_zero_exponent;
                serial_val_ptr  := @serial_value;
                a05serial (acv, serial_colptr^, treeid,
                      serial_val_ptr^, sizeof (serial_value), 1, number_len,
                      c_with_retpart);
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        IF  restore_string
        THEN
            treeid := a_into_tree;
        (*ENDIF*) 
        b02init_load (acv.a_transinf.tri_trans, treeid,
              c_set_read_only, rightmost_leaf);
        b_err := acv.a_transinf.tri_trans.trError_gg00;
        IF  b_err = e_ok
        THEN
            BEGIN
            treeid.fileHandling_gg00  := [ hsNoLog_egg00 ];
            treeid.fileLeafNodes_gg00 := cgg_nil_leafnodes;
            a06retpart_move (acv, @treeid,
                  sizeof (treeid));
            FOR ix := 1 TO 3 DO
                a06retpart_move (acv, @rightmost_leaf,
                      sizeof (rightmost_leaf));
            (*ENDFOR*) 
            a06finish_curr_retpart (acv, sp1pk_bdinfo, 1);
            acv.a_pars_last_key.p_kind := m_outcopy
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  (b_err = e_ok) AND (repl_baserec)
    THEN
        a10repl_sysinfo (acv, a_p_arr1.pbasep, b_err);
    (*ENDIF*) 
    IF  b_err <> e_ok
    THEN
        a07_b_put_error (acv, b_err, 1)
    ELSE
        IF  NOT restore_string AND NOT restore_index
        THEN
            BEGIN
            IF  beginload AND
                (a1tablen = a01_i_sysmessages )
            THEN
                IF  a1authname = g01glob.sysuser_name
                THEN
                    a_errormsg_loading := true;
                (*ENDIF*) 
            (*ENDIF*) 
            a_pars_curr.fileHandling_gg00 := a_pars_curr.fileHandling_gg00 - [ hsNoLog_egg00 ];
            IF  is_secondary_table in blinkexist
            THEN
                a25linkload_info (acv);
            (*ENDIF*) 
            IF  beginload
            THEN
                ak17store_constraint_info (acv, a11v)
            ELSE
                a_fk_check_cnt := -a_fk_check_cnt;
            (*ENDIF*) 
            a_pars_curr.fileHandling_gg00 := a_pars_curr.fileHandling_gg00 + [ hsNoLog_egg00 ];
            a_part_rollback               := a_return_segm^.sp1r_returncode <> 0
            END;
        (*ENDIF*) 
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a17call_semantic (VAR acv : tak_all_command_glob);
 
BEGIN
WITH acv DO
    BEGIN
    CASE a_ap_tree^[ a_ap_tree^[ 0 ].n_lo_level ].n_subproc OF
        (* PTS 1111576 E.Z. *)
        cak_x_end_restore :
            ak17end_restore (acv);
        cak_x_save_string :
            ak17begin_save_string (acv);
        cak_x_restore :
            ak17string_beginload (acv);
        (* PTS 1111576 E.Z. *)
        END;
    (*ENDCASE*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a17describe (
            VAR acv    : tak_all_command_glob;
            VAR a11v   : tak_a11_glob);
 
BEGIN
CASE acv.a_ap_tree^[ acv.a_ap_tree^[ 0 ].n_lo_level ].n_length OF
    cak_i_constraint :
        ak17describe_constraint (acv, a11v);
    cak_i_default :
        ak17describe_default (acv, a11v);
    cak_i_index :
        ak17describe_index (acv, a11v);
    cak_i_table, cak_i_except :
        a17table_describe (acv, a11v, false);
    END;
(*ENDCASE*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a17end_incopy_table (
            VAR acv  : tak_all_command_glob;
            VAR a11v : tak_a11_glob);
 
VAR
      b_err       : tgg_basis_error;
      ix          : integer;
      viewscanpar : tak_viewscan_par;
 
BEGIN
a27init_viewscanpar(acv, viewscanpar, v_save_scheme);
WITH acv, a11v, viewscanpar DO
    BEGIN
    WITH a1valkey DO
        BEGIN
        stableid  := a_p_arr1.pbasep^.syskey.stableid;
        sentrytyp := cak_edefault;
        slinkage  := cak_init_linkage;
        skeylen   := mxak_standard_sysk;
        END;
    (*ENDWITH*) 
    ix := a_p_arr1.pbasep^.sbase.bfirstindex;
    WHILE ix <= a_p_arr1.pbasep^.sbase.blastindex DO
        BEGIN
        WITH a_p_arr1.pbasep^.sbase.bcolumn[ix]^ DO
            IF  (ctdefault in ccolpropset)
                AND NOT (ctdropped in ccolpropset)
            THEN
                BEGIN
                a1valkey.slinkage[1] := chr (cextcolno DIV 256);
                a1valkey.slinkage[2] := chr (cextcolno MOD 256);
                a10get_sysinfo (acv, a1valkey, d_release,
                      a1valsysp, b_err);
                IF  b_err <> e_ok
                THEN
                    BEGIN
                    a07_b_put_error (acv,
                          e_column_must_have_default, cextcolno);
                    ix := csp_maxint2 - 1;
                    END;
                (*ENDIF*) 
                END;
            (*ENDIF*) 
        (*ENDWITH*) 
        ix := ix + 1
        END;
    (*ENDWHILE*) 
    a10repl_sysinfo (acv, a_p_arr1.pbasep, b_err);
    IF  b_err <> e_ok
    THEN
        a07_b_put_error (acv, b_err, 1);
    (*ENDIF*) 
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        BEGIN
        vsc_tree_id                  := a_intern_res_tree;
        vsc_tree_id.fileTfnTemp_gg00 := ttfnSaveScheme_egg00;
        vsc_tree_id.fileRoot_gg00    := NIL_PAGE_NO_GG00;
        b01filestate (a_transinf.tri_trans, vsc_tree_id);
        IF  a_transinf.tri_trans.trError_gg00 = e_ok
        THEN
            BEGIN
            vsc_save_into                := false;
            a_internal_sql               := sql_alter_table;
            a15restore_catalog (acv,
                  a_p_arr1.pbasep^.sbase.btreeid, viewscanpar);
            a_internal_sql := no_internal_sql;
            b01destroy_file (a_transinf.tri_trans, vsc_tree_id)
            END
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a17endload (
            VAR acv  : tak_all_command_glob;
            VAR a11v : tak_a11_glob);
 
CONST
      c_undefined   = -1;
      c_100_percent = 100;
 
VAR
      b_err         : tgg_basis_error;
      add           : boolean;
      res           : tsp_num_error;
      ix            : integer;
      key_len       : integer;
      pos           : integer;
      number_len    : integer;
      resbytelen    : integer;
      mm_type       : tgg_message2_type;
      page_cnt      : tsp_int4;
      rec_cnt       : tsp_int4;
      bd_info_ptr   : tsp1_part_ptr;
      data_ptr      : tsp1_part_ptr;
      serial_ptr    : tsp1_part_ptr;
      surrogate_ptr : tsp1_part_ptr;
      one           : tsp_number;
 
BEGIN
WITH acv, a11v, a_p_arr1.pbasep^.sbase DO
    BEGIN
    ak17get_part_pointers (acv,
          data_ptr, bd_info_ptr, serial_ptr, surrogate_ptr);
    IF  (data_ptr = NIL) OR (bd_info_ptr = NIL)
    THEN
        a07_b_put_error (acv, e_invalid_command, 1)
    ELSE
        BEGIN
        pos := data_ptr^.sp1p_buf_len - 2 * mxsp_resnum + 1;
        add := data_ptr^.sp1p_buf[pos] <> chr(1);
        pos := pos + 1;
        s40g4int (data_ptr^.sp1p_buf, pos, page_cnt, res);
        pos := pos + mxsp_resnum;
        IF  res = num_ok
        THEN
            s40g4int (data_ptr^.sp1p_buf, pos, rec_cnt, res);
        (*ENDIF*) 
        IF  (res <> num_ok) OR (page_cnt < 0) OR (rec_cnt < 0)
        THEN
            a07_b_put_error (acv, e_num_overflow, 1)
        ELSE
            a28table_upd_statistics (acv, c_undefined, c_100_percent,
                  page_cnt, rec_cnt, cak_is_undefined, cak_is_undefined,
                  add, false);
        (*ENDIF*) 
        IF  (serial_ptr <> NIL) AND
            (a_return_segm^.sp1r_returncode = 0)
        THEN
            BEGIN
            ix := bfirstindex;
            WHILE ix <= blastindex DO
                IF  ctserial in bcolumn[ix]^.ccolpropset
                THEN
                    BEGIN
                    number_len := serial_ptr^.sp1p_buf_len;
                    one        := csp_one_number;
                    s51sub (serial_ptr^.sp1p_buf, 2, number_len - 1,
                          one, 1, sizeof (one), serial_ptr^.sp1p_buf, 2,
                          (number_len - 2) * 2, 0, resbytelen, res);
                    IF  res <> num_ok
                    THEN
                        a07_b_put_error (acv, e_num_overflow, 1)
                    ELSE
                        a05serial (acv, bcolumn[ix]^, btreeid,
                              serial_ptr^.sp1p_buf, number_len, 1,
                              number_len, NOT c_with_retpart);
                    (*ENDIF*) 
                    ix := blastindex + 1 (* exit loop *)
                    END
                ELSE
                    ix := ix + 1;
                (*ENDIF*) 
            (*ENDWHILE*) 
            END;
        (*ENDIF*) 
        IF  (btablekind = twithoutkey) OR (bdef_stamp)
        THEN
            mm_type := mm_nokey
        ELSE
            mm_type := mm_key;
        (*ENDIF*) 
        a06a_mblock_init (acv, m_mend, mm_type, btreeid);
        IF  (btablekind = twithoutkey) OR (bdef_stamp)
        THEN
            BEGIN
            IF  surrogate_ptr <> NIL
            THEN
                BEGIN
                key_len := surrogate_ptr^.sp1p_buf_len;
                IF  key_len <> 1 + mxgg_surrogate
                THEN
                    a07ak_system_error (acv, 17, 3)
                ELSE
                    g10mv4 ('VAK17 ',   8,    
                          surrogate_ptr^.sp1p_buf_size, a_mblock.mb_data_size,
                          surrogate_ptr^.sp1p_buf, 1,
                          a_mblock.mb_data^.mbp_buf, cgg_rec_key_offset + 1,
                          key_len,  a_return_segm^.sp1r_returncode)
                (*ENDIF*) 
                END
            ELSE
                a07ak_system_error (acv, 17, 2)
            (*ENDIF*) 
            END
        ELSE
            key_len := 0;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        BEGIN
        a_mblock.mb_data^.mbp_keylen := key_len;
        g10mv4 ('VAK17 ',   9,    
              bd_info_ptr^.sp1p_buf_size, a_mblock.mb_data_size,
              bd_info_ptr^.sp1p_buf, 1, a_mblock.mb_data^.mbp_buf,
              cgg_rec_key_offset + key_len + 1, sizeof (tsp7_bdinfo),
              a_return_segm^.sp1r_returncode);
        a_mblock.mb_qual_len  := 0;
        a_mblock.mb_data_len  := cgg_rec_key_offset + key_len +
              sizeof (tsp7_bdinfo);
        a06rsend_mess_buf (acv,
              a_mblock, NOT cak_return_req, b_err);
        IF  b_err <> e_ok
        THEN
            a07_b_put_error (acv, b_err, 1)
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    ak17clean_up (acv, btreeid.fileTabId_gg00);
    a_errormsg_loading := false
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a17incopy (
            VAR acv  : tak_all_command_glob;
            VAR a11v : tak_a11_glob);
 
BEGIN
IF  acv.a_data_ptr = NIL
THEN
    a07_b_put_error (acv, e_too_short_datapart, 1)
ELSE
    CASE acv.a_ap_tree^[ acv.a_ap_tree^[ 0 ].n_lo_level ].n_length OF
        cak_i_constraint :
            ak17incopy_constraint (acv, a11v);
        cak_i_default :
            ak17incopy_default (acv, a11v);
        cak_i_table :
            ak17incopy_table (acv, a11v);
        END;
    (*ENDCASE*) 
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a17saveinit (
            VAR acv         : tak_all_command_glob;
            VAR a11v        : tak_a11_glob;
            is_short_string : boolean);
 
VAR
      new_base    : boolean;
      i           : integer;
      index_id    : tsp_int2;
      unload_info : tgg03_unloadInfoPtr;
      treeid      : tgg00_FileId;
 
BEGIN
WITH acv, a11v, a_p_arr1.pbasep^.sbase DO
    BEGIN
    unload_info := NIL;
    new_base    := false;
    a_ex_kind   := parsing_executing;
    a_init_ddl  := no_ddl;
    treeid      := btreeid;
    a1ti        := a_ap_tree^[ a1ti ].n_sa_level;
    IF  a1ti <> 0
    THEN
        BEGIN (* save init for index *)
        treeid. fileRoot_gg00            := NIL_PAGE_NO_GG00;
        treeid.fileVersion_gg00.ci2_gg00 := cgg_dummy_file_version;
        WITH a_ap_tree^[ a1ti ] DO
            a05_unsigned_int2_get (acv, n_pos, n_length,
                  e_invalid_unsign_integer, index_id);
        (*ENDWITH*) 
        treeid.fileTfn_gg00      := tfnMulti_egg00;
        treeid.fileTfnNo_gg00[1] := chr (index_id - MAX_COL_PER_TAB_GG00);
        END
    ELSE
        IF  is_short_string
        THEN
            BEGIN
            treeid.fileTfn_gg00              := tfnShortScol_egg00;
            treeid.fileVersion_gg00.ci2_gg00 := cgg_dummy_file_version
            END
        ELSE
            BEGIN (* PTS 1116259 M.Ki. *)
            IF  treeid.fileTfn_gg00 = tfnTable_egg00
            THEN
                ak17build_save_mapping_stack (acv, a11v, unload_info,
                      new_base);
            (*ENDIF*) 
            END;
        (*ENDIF*) 
    (*ENDIF*) 
    b02u_init_unload (acv.a_transinf.tri_trans, treeid);
    IF  acv.a_transinf.tri_trans.trError_gg00 = e_ok
    THEN
        BEGIN
        treeid.fileHandling_gg00  := [ hsNoLog_egg00 ];
        treeid.fileLeafNodes_gg00 := cgg_nil_leafnodes;
        a06retpart_move (acv, @treeid, sizeof (treeid));
        IF  treeid.fileTfn_gg00 = tfnTable_egg00
        THEN
            BEGIN
            unload_info^.ui_src_pageno := treeid.fileRoot_gg00;
            FOR i := 1 TO 2 DO
                a06retpart_move (acv, @unload_info, sizeof (unload_info));
            (*ENDFOR*) 
            END
        ELSE
            FOR i := 1 TO 3 DO
                a06retpart_move (acv, @treeid.fileRoot_gg00,
                      sizeof (treeid.fileRoot_gg00));
            (*ENDFOR*) 
        (*ENDIF*) 
        a06finish_curr_retpart (acv, sp1pk_bdinfo, 1);
        acv.a_pars_last_key.p_kind := m_outcopy
        END
    ELSE
        BEGIN
        a07_b_put_error (acv, acv.a_transinf.tri_trans.trError_gg00, 1);
        IF  unload_info <> NIL
        THEN
            gg941Deallocate (acv.a_transinf.tri_trans, unload_info);
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  new_base
    THEN
        a10_key_del (acv, acv.a_p_arr1.pbasep^.syskey);
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a17table_describe (
            VAR acv    : tak_all_command_glob;
            VAR a11v   : tak_a11_glob;
            table_load : boolean);
 
VAR
      migration          : boolean;
      new_base           : boolean;
      error              : tgg_basis_error;
      def_type           : tsp7_default;
      i, j               : integer;
      col_count          : integer;
      col_index          : integer;
      col_ptr            : tak00_colinfo_ptr;
      oldbase_p          : tak_syspointerarr;
      col_name           : tsp_knl_identifier;
      extcolno_colno_arr : ARRAY[ 1..MAX_COL_PER_TAB_GG00 ] OF integer;
      extcol_map         : tgg03_extcol_map; (* PTS 1116259 M.Ki. *)
      table_desc         : ^tsp7_table_description;
      (* PTS 1107617 E.Z. *)
      msg_op             : tsp00_C132;
      columnName         : tsp_knl_identifier;
 
BEGIN
WITH acv, a11v DO
    BEGIN
    new_base  := false;
    migration := a_ap_tree^[ a_ap_tree^[ 0 ].n_lo_level ].n_length =
          cak_i_except;
    IF  migration
    THEN
        BEGIN
        j := 1;
        FOR i := 1 TO sizeof (a1authname) DO
            BEGIN
            msg_op [ j ] := a1authname[ i ];
            j := j + 1
            END;
        (*ENDFOR*) 
        FOR i := 1 TO sizeof (a1tablen) DO
            BEGIN
            msg_op [ j ] := a1tablen[ i ];
            j := j + 1
            END;
        (*ENDFOR*) 
        (* PTS 1107617 E.Z. *)
        IF  g01unicode
        THEN
            BEGIN
            g10filuni ('VAK17 ',  10,    
                  sizeof(msg_op), msg_op,
                  sizeof(a1authname) + sizeof(a1tablen) + 1,
                  sizeof(msg_op) - (sizeof(a1authname) + sizeof(a1tablen)),
                  csp_unicode_blank, error);
            vopmsgUnicode(csp_unicode, 2, 0, msg_op);
            END
        ELSE
            BEGIN
            g10fil1 ('VAK17 ',  11,    
                  sizeof(msg_op), msg_op,
                  sizeof(a1authname) + sizeof(a1tablen) + 1,
                  sizeof(msg_op) - (sizeof(a1authname) + sizeof(a1tablen)),
                  bsp_c1, error);
            vopmsgUnicode(csp_ascii, 2, 0, msg_op);
            END;
        (*ENDIF*) 
        (* END PTS 1107617 E.Z. *)
        END;
    (*ENDIF*) 
    a1ti      := a_ap_tree^[ a1ti ].n_lo_level;
    col_count := 0;
    FOR i := 1 TO MAX_COL_PER_TAB_GG00 DO
        extcolno_colno_arr[ i ] := 0;
    (*ENDFOR*) 
    error    := e_ok;
    WITH a_p_arr1.pbasep^.sbase DO
        BEGIN
        col_index := bfirstcolind;
        IF  table_load
        THEN
            IF  bindexexist
            THEN
                error := e_indexed_table_not_allowed
            ELSE
                IF  ins_trigger in blinkexist
                THEN
                    error := e_missing_privilege;
                (*ENDIF*) 
            (*ENDIF*) 
        (*ENDIF*) 
        IF  error = e_ok
        THEN
            BEGIN
            a1sysk          := a01defaultkey;
            a1sysk.stableid := bsurrogate;
            a10_lock_sysinfo (acv, a1sysk, lckSysExcl_egg00)
            END;
        (* PTS 1116259 M.Ki.: preset extcolno mapping assuming a      *)
        (*                    clean record structure                  *)
        (*ENDIF*) 
        WHILE col_index <> 0 DO
            BEGIN
            extcol_map[ bcolumn[col_index]^.cextcolno ].em_old_colind :=
                  col_index;
            col_index := bcolumn[col_index]^.cnextind;
            END;
        (*ENDWHILE*) 
        END;
    (*ENDWITH*) 
    oldbase_p := acv.a_p_arr1;
    IF  table_load
    THEN
        WHILE (a1ti <> 0) AND (error = e_ok)  DO
            BEGIN
            col_count := succ(col_count);
            WITH a_ap_tree^[ a1ti ] DO
                BEGIN
                a05identifier_get (acv, a1ti,
                      sizeof (col_name), col_name);
                IF  NOT a061exist_columnname (a_p_arr1.pbasep^.sbase,
                    col_name, col_ptr)
                THEN
                    error := e_unknown_columnname
                ELSE
                    WITH col_ptr^ DO
                        IF  extcolno_colno_arr[ cextcolno ] <> 0
                        THEN
                            error := e_duplicate_columnname
                        ELSE
                            BEGIN
                            extcolno_colno_arr[ cextcolno ] :=
                                  col_count;
                            END;
                        (*ENDIF*) 
                    (*ENDWITH*) 
                (*ENDIF*) 
                a1ti := n_sa_level;
                END;
            (*ENDWITH*) 
            END
        (*ENDWHILE*) 
    ELSE (* PTS 1116259: build clean baserecord for output *)
        BEGIN
        a13_new_catalog_desc (acv, a11v, oldbase_p,
              extcol_map, new_base);
        END;
    (*ENDIF*) 
    IF  error <> e_ok
    THEN
        a07_b_put_error (acv, error, 1)
    ELSE
        IF  a_curr_retpart = NIL
        THEN
            BEGIN
            a06init_curr_retpart (acv);
            IF  a_return_segm^.sp1r_returncode = 0
            THEN
                table_desc := @a_curr_retpart^.sp1p_buf
            (*ENDIF*) 
            END;
        (*ENDIF*) 
    (*ENDIF*) 
    IF  (a_return_segm^.sp1r_returncode = 0)
    THEN
        BEGIN
        col_count   := 0;
        a_curr_retpart^.sp1p_buf_len :=
              sizeof (table_desc^.sp7t_authid) +
              sizeof (table_desc^.sp7t_tablename       ) +
              sizeof (table_desc^.sp7t_field_cnt       ) +
              sizeof (table_desc^.sp7t_kernel_swap     ) +
              sizeof (table_desc^.sp7t_table_kind      ) +
              sizeof (table_desc^.sp7t_kernel_loc      ) +
              sizeof (table_desc^.sp7t_constraint_cnt  ) +
              a_p_arr1.pbasep^.sbase.bmaxcol * sizeof (tsp7_ffield_info);
        col_index   := a_p_arr1.pbasep^.sbase.bfirstcolind;
        END;
    (*ENDIF*) 
    WHILE (col_index <> 0) AND (a_return_segm^.sp1r_returncode = 0) DO
        WITH a_p_arr1.pbasep^.sbase, bcolumn[ col_index ]^, table_desc^ DO
            BEGIN
            ak17move_name (acv, ccolumnn, ord (ccolumnn_len));
            col_count := succ(col_count);
            IF  table_load
            THEN
                IF  NOT (ctopt in ccolpropset    ) AND
                    NOT (ctdefault in ccolpropset) AND
                    (extcolno_colno_arr[ cextcolno ] = 0)
                THEN
                    BEGIN
                    (* PTS 1112556 *)
                    a061get_colname (bcolumn[ col_index ]^, columnName);
                    a07_nb_put_error (acv,
                          e_missing_mandatory_recordfield,
                          1, columnName);
                    END;
                (*ENDIF*) 
            (*ENDIF*) 
            IF  a_return_segm^.sp1r_returncode = 0
            THEN
                WITH table_desc^.sp7t_fields[ col_count ] DO
                    BEGIN
                    sp7fi_filler      := '   ';
                    sp7fi_stmt_col_no :=
                          extcolno_colno_arr[ cextcolno ];
                    IF  (ctdropped   in ccolpropset) OR
                        (ctinvisible in ccolpropset)
                    THEN
                        sp7fi_col_mode := mod_dropped
                    ELSE
                        IF  ctkey in ccolpropset
                        THEN
                            IF  btablekind = twithoutkey
                            THEN
                                sp7fi_col_mode := mod_syskey
                            ELSE
                                sp7fi_col_mode := mod_key
                            (*ENDIF*) 
                        ELSE
                            IF  ctopt in ccolpropset
                            THEN
                                sp7fi_col_mode := mod_optional
                            ELSE
                                sp7fi_col_mode := mod_mandatory;
                            (*ENDIF*) 
                        (*ENDIF*) 
                    (*ENDIF*) 
                    IF  (cdatatyp = dfixed) AND cbinary
                    THEN
                        IF  cdatalen = 5
                        THEN
                            sp7fi_data_type := dsmallint
                        ELSE
                            sp7fi_data_type := dinteger
                        (*ENDIF*) 
                    ELSE
                        sp7fi_data_type := cdatatyp;
                    (*ENDIF*) 
                    IF  ord(cdatafrac) > 0
                    THEN
                        sp7fi_frac := cdatafrac - cak_frac_offset
                    ELSE
                        sp7fi_frac := 0;
                    (*ENDIF*) 
                    sp7fi_len      := cdatalen;
                    sp7fi_in_out_l := cinoutlen;
                    IF  (ccolstack.etype in [ st_fixkey, st_fixcol ])
                    THEN
                        sp7fi_len_type := sp7_fix_len
                    ELSE
                        IF  sp7fi_in_out_l > cak_maxfieldlength
                        THEN
                            sp7fi_len_type := sp7_var_len_long
                        ELSE
                            sp7fi_len_type := sp7_var_len;
                        (*ENDIF*) 
                    (*ENDIF*) 
                    IF  migration
                    THEN
                        BEGIN (* default and constraints are not needed *)
                        sp7fi_default := sp7_no_default;
                        END
                    ELSE
                        BEGIN
                        IF  ctserial in ccolpropset
                        THEN
                            def_type := sp7_default_serial
                        ELSE
                            ak17get_default_range (acv,
                                  a11v,
                                  oldbase_p,
                                  oldbase_p.pbasep^.sbase.bcolumn[ extcol_map[cextcolno].em_old_colind ]^ (* PTS 1116259 M.Ki *),
                                  def_type);
                        (*ENDIF*) 
                        sp7fi_default := def_type;
                        END;
                    (*ENDIF*) 
                    sp7fi_def_col_no := cextcolno
                    END;
                (*ENDWITH*) 
            (*ENDIF*) 
            col_index := cnextind;
            END;
        (*ENDWITH*) 
    (*ENDWHILE*) 
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        BEGIN
        WITH a_p_arr1.pbasep^.sbase DO
            BEGIN
            a06determine_username (acv, bauthid, table_desc^.sp7t_authid);
            table_desc^.sp7t_tablename := btablen^;
            IF  migration
            THEN
                table_desc^.sp7t_constraint_cnt := 0
            ELSE
                table_desc^.sp7t_constraint_cnt := bnamed_constr
            (*ENDIF*) 
            END;
        (*ENDWITH*) 
        table_desc^.sp7t_field_cnt    := col_count;
        table_desc^.sp7t_kernel_swap  := g01code.kernel_swap;
        table_desc^.sp7t_table_kind   := ord(a_p_arr1.pbasep^.sbase.btablekind);
        table_desc^.sp7t_kernel_loc   := 0;
&       ifdef trace
        WITH table_desc^ DO
            FOR i := 1 TO sp7t_field_cnt DO
                WITH table_desc^.sp7t_fields[ i ] DO
                    BEGIN
                    t01int4  (ak_sem, 'fi_stmt_c_no', sp7fi_stmt_col_no);
                    t01int4  (ak_sem, 'fi_col_mode ', ord (sp7fi_col_mode));
                    t01int4  (ak_sem, 'fi_data_type', ord (sp7fi_data_type));
                    t01int4  (ak_sem, 'fi_frac     ', sp7fi_frac);
                    t01int4  (ak_sem, 'fi_len      ', sp7fi_len);
                    t01int4  (ak_sem, 'fi_in_out   ', sp7fi_in_out_l);
                    t01int4  (ak_sem, 'fi_fixlen   ', ord (sp7fi_len_type));
                    t01int4  (ak_sem, 'fi_default  ', ord (sp7fi_default));
                    t01int4  (ak_sem, 'fi_def_colno', sp7fi_def_col_no);
                    END;
                (*ENDWITH*) 
            (*ENDFOR*) 
        (*ENDWITH*) 
&       endif
        ak17code_byte_swap (acv, c_outcopy, table_desc^,
              (a_basic_code  = csp_ascii) AND
              (g01code.ctype = csp_ebcdic),
              (a_basic_code  = csp_ebcdic) AND
              (g01code.ctype = csp_ascii));
&       ifdef trace
        t01moveobj (ak_sem, a_curr_retpart^.sp1p_buf, 1,
              a_curr_retpart^.sp1p_buf_len);
&       endif
        a06finish_curr_retpart (acv, sp1pk_data, 1);
        acv.a_init_ddl := no_ddl
        END;
    (*ENDIF*) 
    IF  new_base
    THEN
        a10_key_del (acv, acv.a_p_arr1.pbasep^.syskey);
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a17unload_table (
            VAR acv      : tak_all_command_glob;
            VAR a11v     : tak_a11_glob);
 
VAR
      b_err  : tgg_basis_error;
 
BEGIN
WITH acv, a_p_arr1, a11v DO
    IF  a11remote_load_possible (acv, pbasep^.sbase)
    THEN
        BEGIN
        pbasep^.sbase.bunloaded := true;
        a10_version (acv, a_p_arr1.pbasep^.sbase, m_succ_file_version, true);
        IF  a_return_segm^.sp1r_returncode = 0
        THEN
            BEGIN
            a10repl_sysinfo (acv, pbasep, b_err);
            IF  b_err = e_ok
            THEN
                BEGIN
                a06a_mblock_init (acv,
                      m_unload, mm_table, pbasep^.sbase.btreeid);
                ak17put_index_stack_entries (acv);
                a06rsend_mess_buf (acv,
                      a_mblock, NOT cak_return_req, b_err)
                END;
            (*ENDIF*) 
            IF  b_err <> e_ok
            THEN
                a07_b_put_error (acv, b_err, 1)
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak17build_save_mapping_stack (
            VAR acv         : tak_all_command_glob;
            VAR a11v        : tak_a11_glob;
            VAR unload_info : tgg03_unloadInfoPtr;
            VAR new_base    : boolean);
 
CONST
      c_ignore_err = true;
 
VAR
      is_sorted   : boolean;
      do_mapping  : boolean;
      src_col_cnt : tsp_int2;
      i           : tsp_int2;
      stackpos    : integer;
      req_len     : tsp_int4;
      unload_ptr  : tsp_moveobj_ptr;
      src_st_ptr  : tgg00_StackListPtr;
      tar_st_ptr  : tgg00_StackListPtr;
      (* PTS 1116259 M.Ki. *)
 
BEGIN
(* build mapping stack and info needed for the record conversion    *)
(* save it in freshly allocated memory;                             *)
(* on success unload_info will point to beginning of memory block   *)
a13_build_mapping_stack (acv, a11v, src_st_ptr,
      tar_st_ptr, src_col_cnt, new_base);
do_mapping  := false;
unload_info := NIL;
IF  acv.a_return_segm^.sp1r_returncode = 0
THEN (* check whether mapping is necessary at all *)
    FOR i := 1 TO src_col_cnt DO
        IF  (src_st_ptr^[i].etype    <> tar_st_ptr^[i].etype)    OR
            (src_st_ptr^[i].eop      <> tar_st_ptr^[i].eop)      OR
            (src_st_ptr^[i].epos     <> tar_st_ptr^[i].epos)     OR
            (src_st_ptr^[i].elen_var <> tar_st_ptr^[i].elen_var) OR
            (src_st_ptr^[i].ecol_tab <> tar_st_ptr^[i].ecol_tab)
        THEN
            do_mapping := true;
        (*ENDIF*) 
    (*ENDFOR*) 
(*ENDIF*) 
IF  do_mapping AND (acv.a_return_segm^.sp1r_returncode = 0)
THEN
    WITH acv, a_mblock DO
        BEGIN
        req_len       := sizeof (tgg03_unloadInfo) +
              mb_qual^.mfirst_free * sizeof (tgg00_StackEntry) + 1;
        unload_ptr    := gg941Allocate (a_transinf.tri_trans, req_len);
        IF  unload_ptr = NIL
        THEN
            a07_b_put_error (acv, e_no_more_memory, 1)
        ELSE
            BEGIN
            unload_info                := @unload_ptr^[1];
            unload_info^.ui_do_mapping := true;
            unload_info^.ui_src_pageno := 0;
            unload_info^.ui_tar_pageno := 0;
            unload_info^.ui_src_recind := 0;
            stackpos := sizeof (tgg03_unloadInfo) + 1;
            IF  (stackpos MOD 2) <> 0
            THEN
                stackpos := succ (stackpos);
            (* copy stack and remember positions of source and target stack *)
            (*ENDIF*) 
            unload_info^.ui_stack_ptr  := @unload_ptr^[ stackpos ];
            g10mv1 ('VAK17 ',  12,    
                  sizeof (tgg00_StackList),
                  mb_qual^.mfirst_free * sizeof (tgg00_StackEntry),
                  mb_st^, 1,
                  unload_info^.ui_stack_ptr^, 1,
                  mb_qual^.mfirst_free * sizeof (tgg00_StackEntry),
                  a_return_segm^.sp1r_returncode);
            unload_info^.ui_stack_desc  := mb_qual^.mstack_desc;
            unload_info^.ui_src_st_ptr  := @unload_info^.
                  ui_stack_ptr^[mb_qual^.mresqual_pos];
            unload_info^.ui_tar_st_ptr  := unload_info^.ui_stack_ptr;
            unload_info^.ui_src_col_cnt := src_col_cnt;
            is_sorted := true;
            b37_init_conversion_info (acv.a_transinf.tri_trans,
                  c_ignore_err,
                  unload_info^.ui_src_st_ptr,
                  unload_info^.ui_src_col_cnt,
                  unload_info^.ui_tar_st_ptr,
                  mb_qual^.mqual_pos,
                  mb_qual^.mqual_cnt,
                  is_sorted,
                  unload_info^.ui_fixedcollen,
                  unload_info^.ui_code_tab,
                  unload_info^.ui_trunc_col,
                  unload_info^.ui_frac_col,
                  unload_info^.ui_not_null,
                  unload_info^.ui_check_col);
            END;
        (*ENDIF*) 
        END
    (*ENDWITH*) 
ELSE
    IF  acv.a_return_segm^.sp1r_returncode = 0
    THEN
        BEGIN
        req_len       := sizeof (tgg03_unloadInfo);
        unload_ptr    := gg941Allocate (acv.a_transinf.tri_trans, req_len);
        IF  unload_ptr = NIL
        THEN
            a07_b_put_error (acv, e_no_more_memory, 1)
        ELSE
            BEGIN
            unload_info                := @unload_ptr^[1];
            unload_info^.ui_do_mapping := false;
            unload_info^.ui_src_pageno := 0;
            unload_info^.ui_tar_pageno := 0;
            unload_info^.ui_src_recind := 0;
            unload_info^.ui_stack_ptr  := NIL;
            unload_info^.ui_src_st_ptr := NIL;
            unload_info^.ui_tar_st_ptr := NIL;
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
(*ENDIF*) 
IF  new_base
THEN
    a10_key_del (acv, acv.a_p_arr1.pbasep^.syskey);
&ifdef TRACE
(*ENDIF*) 
t01int4 (ak_sem, 'req_len     ', req_len);
t01int4 (ak_sem, 'do_mapping  ', ord(do_mapping));
&endif
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
