.pb '~'
.ad 8
.ll 72
.bm 3
.fm 2
.bt $Copyright by SAP AG, 2002$$Page %$
.tm 5
.hm 2
.hs 3
.tt 1 $SQL$Project Distributed Database System$VBD37$
.tt 2 $$$
.tt 3 $ThomasA$BD_modify_table$2001-03-30$
***********************************************************
.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
.nf
.sp
Module  :  BD_modify_table
=========
.sp
Purpose : modify record layout of a base table
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :
 
        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);
 
        PROCEDURE
              b37table_modify (VAR t  : tgg00_TransContext;
                    ignore_err        : boolean;
                    is_sorted         : boolean;
                    VAR source_id     : tgg00_FileId;
                    VAR source_index  : tgg00_FileId;
                    VAR target_id     : tgg00_FileId;
                    source_stack      : tgg00_StackListPtr (*ptocSynonym const tgg00_StackEntry**);
                    src_col_cnt       : integer;
                    target_stack      : tgg00_StackListPtr (*ptocSynonym const tgg00_StackEntry**);
                    trunc_pos         : integer;
                    trunc_cnt         : integer;
                    pResultSampleInfo : tgg00_SampleInfoPtr);
 
        PROCEDURE
              b37_unload_rewrite_table (
                    VAR t           : tgg00_TransContext;
                    VAR treeid      : tgg00_FileId;
                    unload_info     : tgg03_unloadInfoPtr;
                    ret_buf_size    : tsp00_Int4;
                    VAR ret_buf     : tsp00_MoveObj;
                    VAR ret_buf_len : tsp00_Int4);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              KB_change_key : VKB66;
 
        PROCEDURE
              k66move_and_map (map_info : integer;
                    VAR source_buf : tsp00_Buf;
                    src_col_pos    : integer;
                    src_col_len    : integer;
                    VAR target_buf : tsp00_Buf;
                    tar_col_pos    : integer;
                    VAR moved_len  : tsp00_Int4;
                    VAR e          : tgg00_BasisError);
 
        PROCEDURE
              k66pre_fetch (VAR t : tgg00_TransContext;
                    VAR tree_id   : tgg00_FileId;
                    pno           : tsp00_PageNo);
 
      ------------------------------ 
 
        FROM
              KB_get : VKB71;
 
        PROCEDURE
              k71num_err_to_b_err (num_err : tsp_num_error;
                    VAR e : tgg_basis_error);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_1 : VBD01;
 
        VAR
              b01fullkey : tsp00_Key;
 
        FUNCTION
              b01no_of_data_devs : tsp00_Int4;
 
        FUNCTION
              b01rec_align (len : tsp00_Int4): tsp00_Int4;
 
      ------------------------------ 
 
        FROM
              filesysteminterface_2 : VBD02;
 
        PROCEDURE
              b02add_record (VAR t : tgg00_TransContext;
                    VAR file_id    : tgg00_FileId;
                    VAR b          : tgg00_Rec);
 
        PROCEDURE
              b02eval_page_count (VAR t : tgg00_TransContext;
                    VAR file_id      : tgg00_FileId;
                    VAR startkey     : tgg00_Lkey;
                    VAR stopkey      : tgg00_Lkey;
                    count_records    : boolean;
                    VAR page_count   : tsp00_Int4;
                    VAR all_page_cnt : tsp00_Int4;
                    VAR record_cnt   : tsp00_Int4);
 
        PROCEDURE
              b02init_load (VAR t      : tgg00_TransContext;
                    VAR file_id        : tgg00_FileId;
                    set_read_only      : boolean;
                    VAR rightmost_leaf : tsp00_PageNo);
 
        PROCEDURE
              b02repl_record (VAR t : tgg00_TransContext;
                    VAR file_id     : tgg00_FileId;
                    VAR b           : tgg00_Rec);
 
        PROCEDURE
              b02u_init_unload (VAR t : tgg00_TransContext;
                    VAR file_id : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_3 : VBD03;
 
        PROCEDURE
              b03select_invrec (VAR t : tgg00_TransContext;
                    VAR file_ids     : tgg00_TwoFileIds;
                    VAR keypair      : tgg00_TwoKeys;
                    VAR stop_keypair : tgg00_TwoKeys;
                    VAR start_key    : tgg00_Lkey;
                    VAR invrange_set : tgg00_BdInvSet;
                    recbuf_size      : tsp00_Int4;
                    recbuf_ptr       : tsp00_MoveObjPtr;
                    VAR sel          : tgg00_SelectFieldsParam;
                    VAR stack_desc   : tgg00_StackDesc;
                    VAR granted_lock : tgg00_LockReqMode;
                    count_usage      : boolean);
 
      ------------------------------ 
 
        FROM
              error_text_handling : VBD06;
 
&       ifdef vers80
        PROCEDURE
              b06record_check (
                    VAR rec    : tgg00_Rec;
                    VAR fileId : tgg00_FileId;
                    VAR b_err  : tgg00_BasisError);
&       endif
 
        PROCEDURE
              b06dump_bad_page (pid : tsp00_TaskId;
                    page_type_flag : char;
                    file_ext       : tsp00_C4;
                    bad_pno        : tsp00_Int4;
                    buf_ptr        : tbd_nodeptr;
                    curr_buf_cnt   : integer);
 
      ------------------------------ 
 
        FROM
              nodehandling : VBD13;
 
        PROCEDURE
              bd13GetNode (VAR Current : tbd_current_tree;
                    Pno          : tsp00_PageNo;
                    PageLockMode : tbd00_PageLockMode;
                    NodeReq      : tbd_node_request;
                    VAR Nptrs    : tbd_node_ptrs);
 
        PROCEDURE
              b13init_default_data_page (
                    VAR Trans   : tgg00_TransContext;
                    VAR FileId  : tgg00_FileId;
                    Level       : tsp00_Int2;
                    NewPno      : tsp00_PageNo;
                    VAR Nptrs   : tbd_node_ptrs);
 
        PROCEDURE
              b13new_node (lno  : tsp00_Int2;
                    VAR nptr    : tbd_node_ptrs;
                    VAR current : tbd_current_tree);
 
        PROCEDURE
              b13r_release_node (VAR nptr : tbd_node_ptrs;
                    VAR current : tbd_current_tree;
                    lru_info    : tbd_lru_info);
 
        PROCEDURE
              b13w_release_node (VAR nptr : tbd_node_ptrs;
                    VAR current      : tbd_current_tree);
 
      ------------------------------ 
 
        FROM
              treehandling         : VBD30;
 
        PROCEDURE
              b30cinit_current (VAR t : tgg00_TransContext;
                    VAR current : tbd_current_tree);
 
        PROCEDURE
              b30load_table (VAR lnptr : tbd_node_ptrs;
                    VAR nptr           : tbd_node_ptrs;
                    only_left          : boolean;
                    VAR current        : tbd_current_tree);
 
        PROCEDURE
              b30save_quick (VAR pno : tsp00_PageNo;
                    VAR nptr    : tbd_node_ptrs;
                    VAR current : tbd_current_tree);
 
      ------------------------------ 
 
        FROM
              concurrency : VBD75;
 
        PROCEDURE
              b75tldelete_lock_tree (VAR current : tbd_current_tree;
                    ignore_svp     : boolean;
                    suspend_reason : tsp00_Int2);
 
        PROCEDURE
              b75tudelete_unlock_tree (VAR current : tbd_current_tree);
 
      ------------------------------ 
 
        FROM
              BD_Wrapper : VBD999;
 
        PROCEDURE
              bd999CheckSpace(
                    VAR Trans         : tgg00_TransContext;
                    NumPagesRequestes : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01nil_sel        : tgg_sfp_init_part;
              g01nil_stack_desc : tgg_stack_desc;
 
      ------------------------------ 
 
        FROM
              Check-Date-Time : VGG03;
 
        PROCEDURE
              g03fdcheck_date (VAR sbuf : tsp00_Buf;
                    VAR dbuf  : tsp00_Buf;
                    spos      : tsp_int4;
                    dpos      : tsp_int4;
                    actlen    : integer;
                    format    : tgg_datetimeformat;
                    ch_code   : boolean;
                    VAR b_err : tgg_basis_error);
 
        PROCEDURE
              g03ftcheck_time (VAR sbuf : tsp00_Buf;
                    VAR dbuf  : tsp00_Buf;
                    spos      : tsp_int4;
                    dpos      : tsp_int4;
                    actlen    : integer;
                    format    : tgg_datetimeformat;
                    ch_code   : boolean;
                    VAR b_err : tgg_basis_error);
 
        PROCEDURE
              g03ftscheck_timestamp (VAR sbuf : tsp00_Buf;
                    VAR dbuf  : tsp00_Buf;
                    spos      : tsp_int4;
                    dpos      : tsp_int4;
                    actlen    : integer;
                    format    : tgg_datetimeformat;
                    language  : tsp_c3;
                    ch_code   : boolean;
                    VAR b_err : tgg_basis_error);
 
      ------------------------------ 
 
        FROM
              Select_Help_Procedures : VGG04;
 
        PROCEDURE
              g04locate_col (VAR st : tgg_stack_entry;
                    rec_buf        : tgg00_RecPtr;
                    VAR varcol_pos : tgg_varcol_pos_list;
                    VAR col_pos    : integer;
                    VAR col_len    : integer);
 
      ------------------------------ 
 
        FROM
              GG_cpp_auxiliary_functions : VGG06;
 
        FUNCTION
              gg06PnoGet (VAR Cint4 : tgg90_Cint4): tsp00_Int4;
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG10;
 
        PROCEDURE
              g10fil (mod_id : tsp_c6;            mod_num  : tsp_int4;
                    obj_upb  : tsp_int4;
                    VAR obj  : tsp00_Buf;         obj_pos  : tsp_int4;
                    length   : tsp_int4;          fillchar : char;
                    VAR err  : tgg_basis_error);
 
        PROCEDURE
              g10fil1 (mod_id : tsp_c6;             mod_num  : tsp_int4;
                    obj_upb   : tsp_int4;
                    VAR obj   : tgg00_SampleInfo;   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_Buf;       obj_pos  : tsp_int4;
                    length      : tsp_int4;        fillchar : tsp_c2;
                    VAR err     : tgg_basis_error);
 
        PROCEDURE
              g10mv1 (mod_id   : tsp_c6;          mod_num    : tsp_int4;
                    source_upb : tsp_int4;        destin_upb : tsp_int4;
                    VAR source : tgg00_Surrogate; source_pos : tsp_int4;
                    VAR destin : tsp00_Buf;       destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv2 (mod_id   : tsp_c6;          mod_num    : tsp_int4;
                    source_upb : tsp_int4;        destin_upb : tsp_int4;
                    VAR source : tsp00_Buf;       source_pos : tsp_int4;
                    VAR destin : tsp00_Number;    destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv3 (mod_id   : tsp_c6;          mod_num    : tsp_int4;
                    source_upb : tsp_int4;        destin_upb : tsp_int4;
                    VAR source : tsp00_Buf;       source_pos : tsp_int4;
                    VAR destin : tbd_node;        destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv4 (mod_id   : tsp_c6;          mod_num    : tsp_int4;
                    source_upb : tsp_int4;        destin_upb : tsp_int4;
                    VAR source : tsp00_Buf;       source_pos : tsp_int4;
                    VAR destin : tsp00_Buf;       destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-30 : VSP30;
 
        FUNCTION
              s30lnr_defbyte (str : tsp00_BufAddr;
                    defbyte   : char;
                    start_pos : tsp_int4;
                    length    : tsp_int4) : tsp_int4;
 
        PROCEDURE
              s30surrogate_incr (VAR surrogate : tgg00_Surrogate);
 
      ------------------------------ 
 
        FROM
              PUTSTRING-Conversions : VSP43;
 
        PROCEDURE
              s43lfrac (
                    VAR source  : tsp00_Buf;
                    spos        : tsp_int4;
                    slen        : integer;
                    VAR diglen  : integer;
                    VAR digfrac : integer;
                    VAR bytelen : integer);
&       ifdef trace
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01buf (layer : tgg00_Debug;
                    VAR buf : tsp00_Buf;
                    start_p : integer;
                    stop_p  : integer);
 
        PROCEDURE
              t01int4 (layer : tgg00_Debug;
                    nam : tsp00_Sname;
                    int : tsp00_Int4);
 
        PROCEDURE
              t01name (layer : tgg00_Debug;
                    nam : tsp00_Name);
&       endif
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
        PROCEDURE
              g03fdcheck_date;
 
              tsp_moveobj tsp00_Buf
 
        PROCEDURE
              g03ftcheck_time;
 
              tsp_moveobj tsp00_Buf
 
        PROCEDURE
              g03ftscheck_timestamp;
 
              tsp_moveobj tsp00_Buf
 
        PROCEDURE
              g10fil;
 
              tsp_moveobj tsp00_Buf
 
        PROCEDURE
              g10fil1;
 
              tsp_moveobj tgg00_SampleInfo
 
        PROCEDURE
              g10filuni;
 
              tsp_moveobj tsp00_Buf
 
        PROCEDURE
              g10mv1;
 
              tsp_moveobj tgg00_Surrogate
              tsp_moveobj tsp00_Buf
 
        PROCEDURE
              g10mv2;
 
              tsp_moveobj tsp00_Buf
              tsp_moveobj tsp00_Number
 
        PROCEDURE
              g10mv3;
 
              tsp_moveobj tsp00_Buf
              tsp_moveobj tbd_node
 
        PROCEDURE
              g10mv4;
 
              tsp_moveobj tsp00_Buf
              tsp_moveobj tsp00_Buf
 
        FUNCTION
              s30lnr_defbyte;
 
              tsp_moveobj_ptr tsp00_BufAddr
 
        PROCEDURE
              s30surrogate_incr;
 
              tsp_c8 tgg00_Surrogate
 
        PROCEDURE
              s43lfrac;
 
              tsp_moveobj tsp00_Buf
 
        PROCEDURE
              b06dump_bad_page;
 
              tbd_univ_ptr tbd_nodeptr
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : JuergenP / ThomasA
.sp
.cp 3
Created : 1993-06-01
.sp
.cp 3
Version : 2002-08-26
Version : 2002-07-29
.sp
.cp 3
Release :      Date : 2000-05-17
.sp
***********************************************************
.sp
.cp 8
.fo
.oc _/1
Specification:
 
.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
 
.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.cp 8
.nf
.oc _/1
Structure:
 
.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 15
.nf
.oc _/1
.CM -lll-
Code    :
 
 
CONST
      c_uni_to_ascii       = 128;
      c_ascii_to_uni       = 129;
      c_uni_to_ebcdic      = 130;
      c_ebcdic_to_uni      = 131;
      c_only_left          = true;
      c_ignore_svp         = true;  (* PTS 1106631 TS 2000-05-17 *)
      c_no_usage_count     = false;
      c_undefined          = MAX_INT2_SP00;
 
TYPE
 
      tbd37prefetch_context = RECORD
            pf_pno            : tsp00_PageNo;
            pf_leftmost_pno   : tsp00_PageNo;
            pf_nptr           : tbd_node_ptrs;
            pf_curr_index     : integer;
            pf_max_index      : integer;
            pf_prefetch_start : boolean;
            pf_prefetch_end   : boolean;
      END;
 
 
 
(*------------------------------*) 
 
PROCEDURE
      b37table_modify (VAR t  : tgg00_TransContext;
            ignore_err        : boolean;
            is_sorted         : boolean;
            VAR source_id     : tgg00_FileId;
            VAR source_index  : tgg00_FileId;
            VAR target_id     : tgg00_FileId;
            source_stack      : tgg00_StackListPtr;
            src_col_cnt       : integer;
            target_stack      : tgg00_StackListPtr;
            trunc_pos         : integer;
            trunc_cnt         : integer;
            pResultSampleInfo : tgg00_SampleInfoPtr);
 
CONST
      c_work_st_max   = 2;
 
VAR
      use_index      : boolean;
      dummy_mode     : tgg00_LockReqMode;
      key_len        : tsp00_IntMapC2;
      nil_set        : tgg00_BdInvSet;
      records        : tsp00_Int4;
      leafnodes      : tsp00_Int4;
      page_pos       : integer;
      page_space     : integer;
      curr_index     : integer;
      MaxRecIndex    : tsp00_Int4;
      FixedColLength : integer;
      pno            : tsp00_PageNo;
      source_ptr     : tsp00_BufAddr;
      src_nptr       : tbd_node_ptrs;
      target_nptr    : tbd_node_ptrs;
      prev_nptr      : tbd_node_ptrs;
      source_current : tbd_current_tree;
      target_current : tbd_current_tree;
      syskey         : tgg00_Surrogate;
      start_key      : tgg00_Lkey;
      source_ids     : tgg00_TwoFileIds;
      start_keys     : tgg00_TwoKeys;
      stop_keys      : tgg00_TwoKeys;
      stack_desc     : tgg00_StackDesc;
      stack_entry    : tgg00_StackEntry;
      source_buf     : tgg00_Rec;
      target_buf     : tgg00_Rec;
      prefetch_ctxt  : tbd37prefetch_context;
      work_st        : ARRAY[1..c_work_st_max ] OF tgg00_StackEntry;
      not_null_col   : tgg03_not_null; (* PTS 1116259 M.Ki. *)
      code_tab       : tgg03_colinf;
      trunc_col      : tgg03_colinf;
      frac_col       : tgg03_colinf;
      check_col      : tgg03_check_col;
      sel            : tgg00_SelectFieldsParam;
 
BEGIN
(* *)
bd37check_space (t, source_id); (* PTS 1106631 TS 2000-05-17 *)
(* *)
bd37pf_context_init (prefetch_ctxt);
t.trError_gg00   := e_ok;
syskey     := cgg_zero_id;
records    := 0;
leafnodes  := 0;
page_pos   := 1;
page_space := MAX_RECLEN_GG00;
use_index  := source_index.fileTfn_gg00 = tfnAux_egg00;
IF  use_index
THEN
    BEGIN
    source_ids.file_id   := source_id;
    source_ids.inv_id    := source_index;
    stack_desc           := g01nil_stack_desc;
    stack_desc.mst_addr  := @stack_entry;
    stack_desc.mst_max   := 1;
    stack_desc.mqual_cnt := 1;
    stack_desc.mqual_pos := 1;
    WITH stack_desc.mst_addr^[1] DO
        BEGIN
        etype    := st_rec_output;
        eop      := op_none;
        epos     := 0;
        elen_var := 0;
        ecol_tab := cgg_zero_c2
        END;
    (*ENDWITH*) 
    start_keys.listkey.keyLen_gg00 := 0;
    start_keys.reckey.keyLen_gg00  := 0;
    stop_keys.listkey.keyLen_gg00  := 0;
    stop_keys.reckey.keyLen_gg00   := 0;
    start_key.keyLen_gg00          := 0;
    sel.sfp_init_part              := g01nil_sel;
    WITH sel DO
        BEGIN
        sfp_bd_mess_type  := m_select;
        sfp_bd_mess2_type := mm_next;
        sfp_m_result_addr := @source_buf;
        sfp_m_result_size := sizeof (source_buf);
        sfp_work_st_addr  := @work_st;
        sfp_work_st_max   := c_work_st_max;
        sfp_work_st_size  := c_work_st_max * sizeof (tgg00_StackEntry);
        sfp_workbuf_addr  := NIL;
        sfp_workbuf_size  := 0
        END
    (*ENDWITH*) 
    END;
(*ENDIF*) 
;
(* PTS 1116259 M.Ki. *)
b37_init_conversion_info (t, ignore_err, source_stack, src_col_cnt,
      target_stack, trunc_pos, trunc_cnt, is_sorted, FixedColLength,
      code_tab, trunc_col, frac_col, not_null_col, check_col);
source_buf.recKeyLen_gg00 := 0;
target_id.fileBdUse_gg00  := [ ];
src_nptr.np_ptr           := NIL;
src_nptr.np_cbptr         := NIL;
prev_nptr.np_ptr          := NIL;
(* PTS 1103286 E.Z. *)
IF  (NOT use_index) AND (t.trError_gg00 = e_ok)
THEN
    BEGIN
    b02u_init_unload (t, source_id);
    IF  (t.trError_gg00 = e_file_not_found) AND ignore_err
    THEN
        t.trError_gg00 := e_no_next_record
    ELSE
        BEGIN
        b30cinit_current (t, source_current);
        source_current.curr_tree_id := source_id;
        pno                         := source_id.fileRoot_gg00;
        curr_index                  := FIRST_REC_INDEX_BD00;
        MaxRecIndex                 := FIRST_REC_INDEX_BD00
        END
    (*ENDIF*) 
    END
ELSE
    source_ptr := @source_buf.recBuf_gg00;
(*ENDIF*) 
is_sorted := is_sorted OR use_index;
IF  is_sorted
THEN
    bd37init_target (t, target_id, target_nptr, target_current);
(*ENDIF*) 
WHILE t.trError_gg00 = e_ok DO
    BEGIN
    IF  use_index
    THEN
        BEGIN
        nil_set := [ ];
        sel.sfp_m_result_addr := @source_buf;
        sel.sfp_m_result_size := sizeof (source_buf);
        (* h.b. PTS 1104210 *)
        b03select_invrec (t, source_ids, start_keys, stop_keys,
              start_key, nil_set, 0, NIL, sel, stack_desc,
              dummy_mode, c_no_usage_count);
        key_len.mapInt_sp00 := source_buf.recKeyLen_gg00;
        END
    ELSE
        BEGIN
        curr_index := curr_index + 1;
        IF  curr_index > MaxRecIndex
        THEN
            BEGIN
            IF  pno = NIL_PAGE_NO_GG00
            THEN
                t.trError_gg00 := e_no_next_record
            ELSE
                BEGIN
                b30save_quick (pno, src_nptr, source_current);
                IF  src_nptr.np_ptr = NIL
                THEN
                    t.trError_gg00 := e_no_next_record
                ELSE
                    IF  t.trError_gg00 = e_ok
                    THEN
                        IF  src_nptr.np_ptr^.nd_bottom = BODY_BEG_BD00
                        THEN
                            t.trError_gg00 := e_no_next_record
                        ELSE
                            BEGIN
                            IF  prefetch_ctxt.pf_prefetch_start
                            THEN
                                bd37prefetch_init (t,
                                      prefetch_ctxt, source_current)
                            ELSE
                                bd37prefetch (t,
                                      prefetch_ctxt, source_current);
                            (*ENDIF*) 
                            curr_index  := FIRST_REC_INDEX_BD00;
                            MaxRecIndex := src_nptr.np_ptr^.nd_record_cnt - 1
                            END
                        (*ENDIF*) 
                    (*ENDIF*) 
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        IF  t.trError_gg00 = e_ok
        THEN
            BEGIN
            source_ptr := @src_nptr.np_ptr^.nd_body[
                  src_nptr.np_ptr^.nd_pointer_list[MAX_POINTERINDEX_BD00 - curr_index]];
            key_len.mapC2_sp00[1] := source_ptr^[3];
            key_len.mapC2_sp00[2] := source_ptr^[4]
            END
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  t.trRteCommPtr_gg00^.to_cancel
    THEN
        t.trError_gg00 := e_cancelled
    ELSE
        IF  t.trError_gg00 = e_key_not_found
        THEN
            t.trError_gg00 := e_ok;
        (*ENDIF*) 
    (*ENDIF*) 
    ;
    (* PTS 1116259 M.Ki. *)
    bd37rewrite_record (t, target_buf, source_stack, source_ptr,
          src_col_cnt, target_stack, key_len, syskey, FixedColLength,
          code_tab, trunc_col, frac_col, not_null_col, check_col);
    IF  t.trError_gg00 = e_ok
    THEN
        BEGIN
        records := records + 1;
&       ifdef vers80
        b06record_check (target_buf, target_current.curr_tree_id, t.trError_gg00);
        IF  t.trError_gg00 = e_ok
        THEN
&           endif
            IF  is_sorted
            THEN
                bd37append_record (prev_nptr, target_nptr, leafnodes,
                      target_buf, target_current)
            ELSE
                BEGIN
                page_pos := page_pos + target_buf.recLen_gg00;
                IF  page_pos > page_space
                THEN
                    BEGIN
                    leafnodes  := leafnodes + 1;
                    page_pos   := 1;
                    page_space := MAX_RECLEN_GG00
                    END
                ELSE
                    page_space := page_space - 2;
                (*ENDIF*) 
                b02add_record (t, target_id, target_buf);
                IF  ignore_err AND (t.trError_gg00 = e_duplicate_key)
                THEN
                    b02repl_record (t, target_id, target_buf)
                (*ENDIF*) 
                END
            (*ENDIF*) 
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END;
(*ENDWHILE*) 
IF  prefetch_ctxt.pf_nptr.np_ptr <> NIL
THEN
    b13r_release_node (prefetch_ctxt.pf_nptr, source_current,
          lru_normal);
(*ENDIF*) 
IF  src_nptr.np_ptr <> NIL
THEN
    b13r_release_node (src_nptr, source_current, lru_normal);
(*ENDIF*) 
IF  t.trError_gg00 = e_no_next_record
THEN
    t.trError_gg00 := e_ok;
(*ENDIF*) 
IF  is_sorted
THEN
    bd37finish_target (prev_nptr, target_nptr, target_current);
(*ENDIF*) 
IF  (t.trError_gg00 = e_ok) AND NOT ignore_err AND (pResultSampleInfo <> NIL)
THEN
    BEGIN
    g10fil1 ('VBD37 ',   1,    
          sizeof (pResultSampleInfo^), pResultSampleInfo^, 1,
          sizeof (pResultSampleInfo^), chr(0), t.trError_gg00);
    IF  records = 0
    THEN
        records := 1;
    (*ENDIF*) 
    IF  leafnodes = 0
    THEN
        leafnodes := 1;
    (*ENDIF*) 
    pResultSampleInfo^.records   := records;
    pResultSampleInfo^.leafnodes := leafnodes
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      bd37append_record (VAR prev_nptr   : tbd_node_ptrs;
            VAR target_nptr : tbd_node_ptrs;
            VAR leafnodes   : tsp00_Int4;
            VAR RecBuf      : tgg00_Rec;
            VAR current     : tbd_current_tree);
 
VAR
      RecIndex : tsp00_Int4;
 
BEGIN
&ifdef trace
t01name (bi, '====> bd37 app rec');
t01buf  (bi, RecBuf.recBuf_gg00, 1, RecBuf.recLen_gg00);
&endif
WITH current.curr_trans^ DO   (* PTS 1103797 AK 28-08-1999 *)
    BEGIN
    IF  (target_nptr.np_ptr^.nd_bottom + RecBuf.recLen_gg00) >
        MAX_BOTTOM_BD00 - ((target_nptr.np_ptr^.nd_record_cnt+1) * POINTERSIZE_BD00)
    THEN
        BEGIN (* page overflow ==> new page required *)
        leafnodes := leafnodes + 1;
        IF  prev_nptr.np_ptr <> NIL
        THEN
            b30load_table (prev_nptr, target_nptr, NOT c_only_left, current)
        ELSE
            prev_nptr := target_nptr;
        (*ENDIF*) 
        b13new_node (LEAF_LEVEL_BD00, target_nptr, current)
        END;
    (*ENDIF*) 
    IF  (trError_gg00 = e_ok) AND (target_nptr.np_ptr <> NIL)
    THEN
        WITH target_nptr.np_ptr^ DO   (* PTS 1103797 AK 28-08-1999 *)
            BEGIN
            g10mv3 ('VBD37 ',   2,    
                  sizeof (RecBuf.recBuf_gg00), sizeof (target_nptr.np_ptr^),
                  RecBuf.recBuf_gg00, 1, target_nptr.np_ptr^,
                  nd_bottom, RecBuf.recLen_gg00, trError_gg00);
            IF  trError_gg00 = e_ok
            THEN
                (*  pointer list update *)
                BEGIN
                nd_record_cnt := nd_record_cnt + 1;
                RecIndex      := nd_record_cnt - 1;
                nd_pointer_list [MAX_POINTERINDEX_BD00 - RecIndex] := nd_bottom;
                nd_bottom     := nd_bottom + b01rec_align (RecBuf.recLen_gg00)
                END
            (*ENDIF*) 
            END
        (*ENDWITH*) 
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(* PTS 1106631 TS 2000-05-17 *)
(*------------------------------*) 
 
PROCEDURE
      bd37check_space (
            VAR t         : tgg00_TransContext;
            VAR source_id : tgg00_FileId);
 
CONST
      c_count_records = true;
 
VAR
      all_page_count  : tsp00_Int4;
      page_count      : tsp00_Int4;
      record_count    : tsp00_Int4;
      source_current  : tbd_current_tree;
      startkey        : tgg00_Lkey;
      stopkey         : tgg00_Lkey;
 
BEGIN
all_page_count       := 0;
page_count           := MAX_INT4_SP00;
record_count         := 0;
startkey.keyLen_gg00 := 0;
stopkey.keyLen_gg00  := MAX_KEYLEN_GG00;
stopkey.keyVal_gg00  := b01fullkey;
b02eval_page_count (t, source_id, startkey, stopkey,
      NOT c_count_records, page_count, all_page_count, record_count);
IF  (t.trError_gg00 = e_ok)
THEN
    BEGIN
    b30cinit_current (t, source_current);
    source_current.curr_tree_id := source_id;
    bd999CheckSpace (t, all_page_count);
    END;
(*ENDIF*) 
END;
 
(* PTS 1106631 *)
(*------------------------------*) 
 
PROCEDURE
      bd37init_target (VAR t : tgg00_TransContext;
            VAR target_id      : tgg00_FileId;
            VAR target_nptr    : tbd_node_ptrs;
            VAR target_current : tbd_current_tree);
 
CONST
      c_set_read_only = true;
 
VAR
      rightmost_leaf : tsp00_PageNo;
 
BEGIN
target_nptr.np_ptr := NIL;
IF  t.trError_gg00 = e_ok
THEN
    b02init_load (t, target_id, NOT c_set_read_only, rightmost_leaf);
(*ENDIF*) 
IF  t.trError_gg00 = e_ok
THEN
    BEGIN
    b30cinit_current (t, target_current);
    target_current.curr_tree_id := target_id;
    END;
(*ENDIF*) 
IF  t.trError_gg00 = e_ok
THEN
    BEGIN
    b75tldelete_lock_tree (target_current, c_ignore_svp, 80); (* PTS 1106631 TS 2000-05-17 *)
    bd13GetNode (target_current, rightmost_leaf, plmNoLock_ebd00,
          nr_for_update, target_nptr);
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      bd37finish_target (VAR lnptr   : tbd_node_ptrs;
            VAR nptr    : tbd_node_ptrs;
            VAR current : tbd_current_tree);
 
BEGIN
IF  lnptr.np_ptr <> NIL
THEN
    BEGIN
    IF  current.curr_trans^.trError_gg00 = e_ok
    THEN
        BEGIN
        b30load_table (lnptr, nptr, NOT c_only_left, current);
        nptr := lnptr
        END
    ELSE
        b13w_release_node (lnptr, current);
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  nptr.np_ptr <> NIL
THEN
    b13w_release_node (nptr, current);
(*ENDIF*) 
IF  current.curr_lockstate = d_lock_tree
THEN
    b75tudelete_unlock_tree (current)
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      bd37pf_context_init (VAR prefetch_context : tbd37prefetch_context);
 
BEGIN
prefetch_context.pf_prefetch_start := true;
prefetch_context.pf_prefetch_end   := false;
prefetch_context.pf_pno            := NIL_PAGE_NO_GG00;
prefetch_context.pf_leftmost_pno   := NIL_PAGE_NO_GG00;
prefetch_context.pf_curr_index     := -1;
prefetch_context.pf_max_index      := MAX_INT2_SP00;
prefetch_context.pf_nptr.np_ptr    := NIL
END;
 
(*------------------------------*) 
 
PROCEDURE
      bd37prefetch (VAR t : tgg00_TransContext;
            VAR prefetch_context : tbd37prefetch_context;
            VAR current          : tbd_current_tree);
 
VAR
      exit_loop    : boolean;
      pos          : integer;
      prefetch_pno : tsp00_PageNo;
      pRec         : tgg00_RecPtr;
 
BEGIN
IF  NOT prefetch_context.pf_prefetch_end
THEN
    BEGIN
    exit_loop := true;
    REPEAT
        IF  prefetch_context.pf_curr_index > prefetch_context.pf_max_index
        THEN
            BEGIN
            IF  prefetch_context.pf_pno <> NIL_PAGE_NO_GG00
            THEN
                BEGIN
                prefetch_context.pf_pno :=
                      prefetch_context.pf_nptr.np_ptr^.nd_right;
                b13r_release_node (prefetch_context.pf_nptr,
                      current, lru_normal);
                IF  prefetch_context.pf_pno = NIL_PAGE_NO_GG00
                THEN
                    prefetch_context.pf_prefetch_end := true
                (*ENDIF*) 
                END
            ELSE
                BEGIN
                prefetch_context.pf_pno          := current.curr_lvl_1_pno;
                prefetch_context.pf_leftmost_pno := current.curr_lvl_1_pno
                END;
            (*ENDIF*) 
            IF  prefetch_context.pf_pno <> NIL_PAGE_NO_GG00
            THEN
                BEGIN
                bd13GetNode (current, prefetch_context.pf_pno, plmNoLock_ebd00,
                      nr_for_read, prefetch_context.pf_nptr);
                IF  current.curr_trans^.trError_gg00 = e_ok
                THEN
                    BEGIN
                    IF  prefetch_context.pf_pno =
                        prefetch_context.pf_leftmost_pno
                    THEN
                        prefetch_context.pf_curr_index :=
                              FIRST_REC_INDEX_BD00 + 1
                    ELSE
                        prefetch_context.pf_curr_index := FIRST_REC_INDEX_BD00;
                    (*ENDIF*) 
                    prefetch_context.pf_max_index  :=
                          prefetch_context.pf_nptr.np_ptr^.nd_record_cnt - 1;
                    IF  (prefetch_context.pf_curr_index >
                        prefetch_context.pf_max_index)
                        AND
                        (prefetch_context.pf_pno =
                        prefetch_context.pf_leftmost_pno)
                    THEN (* leftmost level 1 page contains only one seperator *)
                        exit_loop := false
                    (*ENDIF*) 
                    END
                ELSE
                    BEGIN
                    prefetch_context.pf_pno          := NIL_PAGE_NO_GG00;
                    prefetch_context.pf_prefetch_end := true
                    END
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
    UNTIL
        exit_loop;
    (*ENDREPEAT*) 
    END;
(*ENDIF*) 
IF  prefetch_context.pf_pno <> NIL_PAGE_NO_GG00
THEN
    WITH prefetch_context.pf_nptr.np_ptr^ DO
        BEGIN
        pos  := nd_pointer_list[MAX_POINTERINDEX_BD00 - prefetch_context.pf_curr_index];
        pRec := @nd_body[pos];
        IF  (pos < BODY_BEG_BD00) OR (pos > nd_bottom)
        THEN
            BEGIN
            t.trError_gg00 := e_data_page_corrupted;
            b06dump_bad_page (t.trTaskId_gg00, 'd',
                  FILE_EXT_COR_BD00, nd_id, prefetch_context.pf_nptr.np_ptr, 1)
            END
        ELSE
            BEGIN
            prefetch_pno := gg06PnoGet (pRec^.recPno_gg00);
            prefetch_context.pf_curr_index := prefetch_context.pf_curr_index + 1;
            k66pre_fetch (t, current.curr_tree_id, prefetch_pno)
            END
        (*ENDIF*) 
        END;
    (*ENDWITH*) 
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      bd37prefetch_init (t : tgg00_TransContext;
            VAR prefetch_context : tbd37prefetch_context;
            VAR current          : tbd_current_tree);
 
VAR
      ix : integer;
 
BEGIN
prefetch_context.pf_prefetch_start := false;
IF  current.curr_lvl_1_pno <> NIL_PAGE_NO_GG00
THEN
    BEGIN
    prefetch_context.pf_pno         := NIL_PAGE_NO_GG00;
    prefetch_context.pf_curr_index  := -1;
    prefetch_context.pf_max_index   := MAX_INT2_SP00;
    prefetch_context.pf_nptr.np_ptr := NIL;
    FOR ix := 1 TO b01no_of_data_devs DO
        bd37prefetch (t, prefetch_context, current)
    (*ENDFOR*) 
    END
ELSE
    prefetch_context.pf_prefetch_end := true
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
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);
 
TYPE
 
      t_char_map_datatype = RECORD
            CASE boolean OF
                true :
                    (c : tsp00_C1);
                false :
                    (d : tsp00_DataType);
                END;
            (*ENDCASE*) 
 
 
VAR
      col            : integer;
      target_dtype   : t_char_map_datatype;
      source_dtype   : t_char_map_datatype;
      (* PTS 1116259 M.Ki. *)
 
BEGIN
FixedColLength := 0;
FOR col := 1 TO src_col_cnt DO
    BEGIN
    IF  target_stack^[col].etype = st_fixcol
    THEN
        FixedColLength := FixedColLength + target_stack^[col].elen_var;
    (*ENDIF*) 
    not_null_col[col] :=
          (target_stack^[col].etype in [st_fixkey, st_varkey])
          OR
          (target_stack^[col].eop = op_not_null);
    trunc_col[col]    := c_undefined;
    code_tab [col]    := 0;
    check_col[col]    := check_none_egg03;
    target_dtype.c[1] := target_stack^[col].ecol_tab[2];
    source_dtype.c[1] := source_stack^[col].ecol_tab[2];
    IF  target_dtype.d <> source_dtype.d
    THEN
        BEGIN
        CASE target_dtype.d OF
            dcha :
                CASE source_dtype.d OF
                    dche     :
                        code_tab[col] := cgg_to_ascii;
                    dunicode :
                        code_tab[col] := c_uni_to_ascii;
                    ddate, dtime, dtimestamp :
                        BEGIN
                        END;
                    OTHERWISE
                        t.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            dchb :
                CASE source_dtype.d OF
                    dcha, dche, ddate, dtime, dtimestamp :
                        BEGIN
                        END;
                    OTHERWISE
                        t.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            dche :
                CASE source_dtype.d OF
                    dcha, ddate, dtime, dtimestamp :
                        code_tab[col] := cgg_to_ebcdic;
                    dunicode :
                        code_tab[col] := c_uni_to_ebcdic;
                    OTHERWISE
                        t.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            dfixed :
                CASE source_dtype.d OF
                    dfixed, dfloat, dinteger, dsmallint :
                        BEGIN
                        END;
                    OTHERWISE
                        t.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            dfloat :
                CASE source_dtype.d OF
                    dfixed, dfloat :
                        BEGIN
                        END;
                    OTHERWISE
                        t.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            dunicode :
                CASE source_dtype.d OF
                    dche :
                        code_tab[col] := c_ebcdic_to_uni;
                    dcha :
                        code_tab[col] := c_ascii_to_uni;
                    OTHERWISE
                        t.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            ddate :
                IF  source_dtype.d <> ddate
                THEN
                    BEGIN
                    check_col[col] := check_date_egg03;
                    IF  source_dtype.d = dche
                    THEN
                        code_tab[col] := cgg_to_ascii
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
            dtime :
                IF  source_dtype.d <> dtime
                THEN
                    BEGIN
                    check_col[col] := check_time_egg03;
                    IF  source_dtype.d = dche
                    THEN
                        code_tab[col] := cgg_to_ascii
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
            dtimestamp :
                IF  source_dtype.d <> dtimestamp
                THEN
                    BEGIN
                    check_col[col] := check_timestamp_egg03;
                    IF  source_dtype.d = dche
                    THEN
                        code_tab[col] := cgg_to_ascii
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
            dinteger :
                check_col[col] := check_int_egg03;
            dsmallint :
                check_col[col] := check_smallint_egg03;
            OTHERWISE
                t.trError_gg00 := e_not_implemented;
            END;
        (*ENDCASE*) 
        IF  ignore_err
        THEN
            check_col[col] := check_none_egg03;
        (*ENDIF*) 
        IF  (code_tab[col] in [cgg_to_ascii, cgg_to_ebcdic, c_uni_to_ebcdic])
            AND
            (source_stack^[col].etype in [st_fixkey, st_varkey])
        THEN
            is_sorted := false
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDFOR*) 
FOR col := trunc_pos TO trunc_pos + trunc_cnt - 1 DO
    WITH target_stack^[col] DO
        BEGIN
        IF  etype in [st_fixkey, st_varkey]
        THEN
            is_sorted := false;
        (*ENDIF*) 
        trunc_col[ecol_pos] := epos;
        frac_col [ecol_pos] := elen_var
        END;
    (*ENDWITH*) 
(*ENDFOR*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      bd37rewrite_record(
            VAR t              : tgg00_TransContext;
            VAR target_buf     : tgg00_Rec;
            source_stack       : tgg00_StackListPtr;
            source_ptr         : tsp00_BufAddr;
            src_col_cnt        : integer;
            target_stack       : tgg00_StackListPtr;
            key_len            : tsp00_IntMapC2;
            VAR syskey         : tgg00_Surrogate;
            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);
 
CONST
      c_change_code   = true;
 
VAR
      is_undef       : boolean;
      col            : integer;
      src_col_pos    : integer;
      src_col_len    : tsp00_Int4;
      tar_col_pos    : integer;
      bytelen        : integer;
      diglen         : integer;
      digfrac        : integer;
      len_pos        : integer;
      dt_format      : tgg00_DateTimeFormat;
      pre_dt_format  : tgg00_DateTimeFormat;
      i2             : tsp00_IntMapC2;
      number         : tsp00_Number;
      source_st_ptr  : tgg00_StEntryAddr;
      target_st_ptr  : tgg00_StEntryAddr;
      seldummy       : tgg00_SelectFieldsParam;
      (* PTS 1116259 M.Ki. *)
 
BEGIN
col                              := 1;
tar_col_pos                      := 1 + cgg_rec_key_offset;
target_buf.recVarcolCnt_gg00     := 0;
seldummy.sfp_varcol_pos.vpl_last := -1;
dt_format  := dtf_normal;
WHILE (col <= src_col_cnt) AND (t.trError_gg00 = e_ok) DO
    BEGIN
    source_st_ptr := @source_stack^[col];
    target_st_ptr := @target_stack^[col];
    IF  source_st_ptr^.etype = st_old_varkey
    THEN (* copy key *)
        is_undef := false
    ELSE
        IF  source_st_ptr^.etype <> st_rowno
        THEN
            BEGIN
            g04locate_col (source_st_ptr^, @(source_ptr^),
                  seldummy.sfp_varcol_pos, src_col_pos, src_col_len);
            IF  src_col_len > 0
            THEN
                BEGIN
                is_undef := source_ptr^[src_col_pos] = csp_undef_byte;
                IF  trunc_col[col] <> c_undefined
                THEN
                    IF  frac_col[col] > 0
                    THEN
                        BEGIN
                        IF  NOT is_undef
                        THEN
                            BEGIN
                            s43lfrac (source_ptr^, src_col_pos + 1,
                                  src_col_len-1, diglen, digfrac,
                                  bytelen);
&                           ifdef trace
                            t01int4 (bi, 'diglen      ', diglen);
                            t01int4 (bi, 'digfrac     ', digfrac);
                            t01int4 (bi, 'trunc_col   ', trunc_col[col]);
                            t01int4 (bi, 'frac_col    ', frac_col[col]);
&                           endif
                            IF  (diglen > trunc_col[col]) OR
                                (digfrac > frac_col[col] - 1)
                            THEN
                                k71num_err_to_b_err (
                                      num_overflow, t.trError_gg00)
                            (*ENDIF*) 
                            END;
                        (*ENDIF*) 
                        src_col_len := trunc_col[col] DIV 2 + 2
                        END
                    ELSE
                        BEGIN
                        IF  source_st_ptr^.etype in
                            [st_fixkey, st_fixcol]
                        THEN
                            src_col_len :=
                                  1 + s30lnr_defbyte (source_ptr,
                                  source_ptr^ [src_col_pos],
                                  src_col_pos + 1, src_col_len - 1);
                        (*ENDIF*) 
                        IF  src_col_len > trunc_col[col]
                        THEN
                            BEGIN
                            src_col_len := trunc_col[col];
                            IF  NOT is_undef
                            THEN
                                IF  ord (source_st_ptr^.ecol_tab[2])
                                    in [ord (dfixed), ord(dinteger),
                                    ord (dsmallint), ord (dfloat)]
                                THEN
                                    t.trError_gg00 := e_num_overflow
                                ELSE
                                    t.trError_gg00 := e_column_trunc
                                (*ENDIF*) 
                            (*ENDIF*) 
                            END;
                        (*ENDIF*) 
                        END;
                    (*ENDIF*) 
                (*ENDIF*) 
                END
            ELSE
                is_undef := true;
            (*ENDIF*) 
            END
        ELSE
            is_undef := false;
        (*ENDIF*) 
    (*ENDIF*) 
    IF  (is_undef AND not_null_col[col]) OR (t.trError_gg00 <> e_ok)
    THEN
        BEGIN
        IF  t.trError_gg00 = e_ok
        THEN
            IF  target_st_ptr^.etype in [st_fixkey, st_varkey]
            THEN
                t.trError_gg00 := e_null_value_illegal
            ELSE
                t.trError_gg00 := e_null_not_allowed
            (*ENDIF*) 
        (*ENDIF*) 
        END
    ELSE
        BEGIN
        CASE target_st_ptr^.etype OF
            st_fixkey, st_fixcol :
                BEGIN
                k66move_and_map (code_tab[col],
                      source_ptr^, src_col_pos, src_col_len,
                      target_buf.recBuf_gg00, tar_col_pos,
                      src_col_len, t.trError_gg00);
                IF  (target_st_ptr^.elen_var > src_col_len)
                    AND (t.trError_gg00 = e_ok)
                THEN
                    BEGIN
                    IF  is_undef
                    THEN
                        g10fil ('VBD37 ',   3,    
                              sizeof (target_buf.recBuf_gg00),
                              target_buf.recBuf_gg00,
                              tar_col_pos + src_col_len,
                              target_st_ptr^.elen_var
                              - src_col_len, csp_defined_byte,
                              t.trError_gg00)
                    ELSE
                        IF  (code_tab[col] in
                            [c_ascii_to_uni, c_ebcdic_to_uni])
                            (* PTS 1115628 E.Z. *)
                            OR
                            (ord (target_st_ptr^.ecol_tab[2]) = ord (dunicode))
                        THEN
                            g10filuni ('VBD37 ',   4,    
                                  sizeof (target_buf), target_buf.recBuf_gg00,
                                  tar_col_pos + src_col_len,
                                  target_st_ptr^.elen_var - src_col_len,
                                  csp_unicode_blank,
                                  t.trError_gg00)
                        ELSE
                            g10fil ('VBD37 ',   5,    
                                  sizeof (target_buf.recBuf_gg00),
                                  target_buf.recBuf_gg00,
                                  tar_col_pos + src_col_len,
                                  target_st_ptr^.elen_var
                                  - src_col_len,
                                  target_buf.recBuf_gg00[tar_col_pos],
                                  t.trError_gg00);
                        (*ENDIF*) 
                    (*ENDIF*) 
                    src_col_len := target_st_ptr^.elen_var
                    END
                (*ENDIF*) 
                END;
            st_varkey :
                IF  source_st_ptr^.etype = st_rowno
                THEN
                    BEGIN
                    s30surrogate_incr (syskey);
                    target_buf.recBuf_gg00[tar_col_pos] := csp_defined_byte;
                    g10mv1 ('VBD37 ',   6,    
                          sizeof(syskey), sizeof(target_buf.recBuf_gg00),
                          syskey, 1, target_buf.recBuf_gg00, tar_col_pos+1,
                          sizeof (syskey), t.trError_gg00);
                    src_col_len := 1 + sizeof (syskey);
                    target_buf.recKeyLen_gg00 := 1 + SURROGATE_MXGG00
                    END
                ELSE
                    BEGIN
                    IF  (source_st_ptr^.etype = st_fixkey)
                        OR
                        (source_st_ptr^.etype = st_fixcol)
                    THEN
                        src_col_len :=
                              1 + s30lnr_defbyte (source_ptr,
                              source_ptr^ [src_col_pos],
                              src_col_pos + 1, src_col_len - 1);
                    (*ENDIF*) 
                    k66move_and_map (code_tab[col],
                          source_ptr^, src_col_pos, src_col_len,
                          target_buf.recBuf_gg00, tar_col_pos,
                          src_col_len, t.trError_gg00);
                    target_buf.recKeyLen_gg00 := tar_col_pos +
                          src_col_len - cgg_rec_key_offset - 1
                    END;
                (*ENDIF*) 
            st_varcol :
                BEGIN
                target_buf.recVarcolCnt_gg00 := target_buf.recVarcolCnt_gg00 + 1;
                IF  is_undef
                THEN
                    BEGIN
                    target_buf.recBuf_gg00[tar_col_pos  ]:= chr (1);
                    target_buf.recBuf_gg00[tar_col_pos+1]:= csp_undef_byte;
                    src_col_len := 2
                    END
                ELSE
                    BEGIN
                    IF  source_st_ptr^.etype in
                        [st_fixkey, st_fixcol]
                    THEN
                        src_col_len := 1 +
                              s30lnr_defbyte (source_ptr,
                              source_ptr^ [src_col_pos],
                              src_col_pos + 1, src_col_len - 1);
                    (*ENDIF*) 
                    k66move_and_map (code_tab[col],
                          source_ptr^, src_col_pos, src_col_len,
                          target_buf.recBuf_gg00, tar_col_pos + 1,
                          src_col_len, t.trError_gg00);
                    target_buf.recBuf_gg00[tar_col_pos] := chr(src_col_len);
                    tar_col_pos := tar_col_pos + 1
                    END
                (*ENDIF*) 
                END;
            st_varlongchar :
                BEGIN
                IF  NOT is_undef AND
                    (source_st_ptr^.etype in
                    [st_fixkey, st_fixcol])
                THEN
                    src_col_len := 1 +
                          s30lnr_defbyte (source_ptr,
                          source_ptr^ [src_col_pos],
                          src_col_pos + 1, src_col_len - 1);
                (*ENDIF*) 
                len_pos     := tar_col_pos;
                tar_col_pos := tar_col_pos + 2;
                IF  is_undef
                THEN
                    BEGIN
                    target_buf.recBuf_gg00[tar_col_pos] := csp_undef_byte;
                    src_col_len := 1
                    END
                ELSE
                    k66move_and_map (code_tab[col],
                          source_ptr^, src_col_pos, src_col_len,
                          target_buf.recBuf_gg00, tar_col_pos,
                          src_col_len, t.trError_gg00);
                (*ENDIF*) 
                i2.mapInt_sp00 := src_col_len;
                target_buf.recBuf_gg00[len_pos  ] := i2.mapC2_sp00 [1];
                target_buf.recBuf_gg00[len_pos+1] := i2.mapC2_sp00 [2];
                END;
            st_old_varkey :
                BEGIN
                src_col_len               := key_len.mapInt_sp00;
                target_buf.recKeyLen_gg00 := src_col_len;
                g10mv4 ('VBD37 ',   7,    
                      sizeof (source_ptr^), sizeof (target_buf.recBuf_gg00),
                      source_ptr^, cgg_rec_key_offset + 1, target_buf.recBuf_gg00, cgg_rec_key_offset + 1,
                      src_col_len, t.trError_gg00);
                END
            END;
        (*ENDCASE*) 
        IF  (check_col[col] <> check_none_egg03) AND
            NOT is_undef AND (t.trError_gg00 <> e_move_error)
        THEN
            CASE check_col[col] OF
                check_date_egg03, check_time_egg03, check_timestamp_egg03 :
                    BEGIN
                    pre_dt_format := dt_format;
                    REPEAT
                        CASE check_col[col] OF
                            check_date_egg03 :
                                g03fdcheck_date (target_buf.recBuf_gg00,
                                      target_buf.recBuf_gg00,
                                      tar_col_pos+1, tar_col_pos+1,
                                      src_col_len - 1, dt_format,
                                      c_change_code, t.trError_gg00);
                            check_time_egg03 :
                                g03ftcheck_time (target_buf.recBuf_gg00,
                                      target_buf.recBuf_gg00,
                                      tar_col_pos+1, tar_col_pos+1,
                                      src_col_len - 1, dt_format,
                                      c_change_code, t.trError_gg00);
                            check_timestamp_egg03 :
                                g03ftscheck_timestamp
                                      (target_buf.recBuf_gg00,
                                      target_buf.recBuf_gg00,
                                      tar_col_pos+1, tar_col_pos+1,
                                      src_col_len - 1, dt_format,
                                      'ENG', c_change_code,
                                      t.trError_gg00);
                            END;
                        (*ENDCASE*) 
                        IF  t.trError_gg00 <> e_ok
                        THEN
                            IF  dt_format = dtf_ts_eur
                            THEN
                                dt_format := dtf_normal
                            ELSE
                                dt_format := succ (dt_format);
                            (*ENDIF*) 
                        (*ENDIF*) 
                    UNTIL
                        (dt_format = pre_dt_format)
                        OR
                        ((t.trError_gg00 <> e_invalid_date     ) AND
                        ( t.trError_gg00 <> e_invalid_time     ) AND
                        ( t.trError_gg00 <> e_invalid_timestamp))
                    (*ENDREPEAT*) 
                    END;
                check_int_egg03 :
                    BEGIN
                    number := csp_null_number;
                    g10mv2 ('VBD37 ',   8,    
                          sizeof (target_buf.recBuf_gg00),
                          sizeof (number), target_buf.recBuf_gg00,
                          tar_col_pos + 1, number, 1,
                          src_col_len - 1, t.trError_gg00);
                    IF  ((number < csp_minlint) OR
                        ( number > csp_maxlint))
                        AND
                        (t.trError_gg00 = e_ok)
                    THEN
                        t.trError_gg00 := e_range_violation
                    (*ENDIF*) 
                    END;
                check_smallint_egg03 :
                    BEGIN
                    number := csp_null_number;
                    g10mv2 ('VBD37 ',   9,    
                          sizeof (target_buf.recBuf_gg00),
                          sizeof (number), target_buf.recBuf_gg00,
                          tar_col_pos + 1, number, 1,
                          src_col_len - 1, t.trError_gg00);
                    IF  ((number < csp_minsint) OR
                        ( number > csp_maxsint))
                        AND
                        (t.trError_gg00 = e_ok)
                    THEN
                        t.trError_gg00 := e_range_violation
                    (*ENDIF*) 
                    END;
                OTHERWISE
                    t.trError_gg00 := e_not_implemented;
                END;
            (*ENDCASE*) 
        (*ENDIF*) 
        tar_col_pos := tar_col_pos + src_col_len
        END;
    (*ENDIF*) 
    col := col + 1
    END;
(*ENDWHILE*) 
target_buf.recVarcolOffset_gg00 := FixedColLength;
target_buf.recLen_gg00          := tar_col_pos - 1;
END;
 
(*------------------------------*) 
 
PROCEDURE
      b37_unload_rewrite_table (
            VAR t           : tgg00_TransContext;
            VAR treeid      : tgg00_FileId;
            unload_info     : tgg03_unloadInfoPtr;
            ret_buf_size    : tsp00_Int4;
            VAR ret_buf     : tsp00_MoveObj;
            VAR ret_buf_len : tsp00_Int4);
 
VAR
      ret_buf_full   : boolean;
      key_len        : tsp00_IntMapC2;
      curr_index     : integer;
      start_recind   : integer;
      rec_index      : integer;
      ret_buf_pos    : tsp00_Int4;
      MaxRecIndex    : tsp00_Int4;
      pno            : tsp00_PageNo;
      source_ptr     : tsp00_BufAddr;
      src_nptr       : tbd_node_ptrs;
      target_nptr    : tbd_node_ptrs;
      syskey         : tgg00_Surrogate;
      source_current : tbd_current_tree;
      new_record     : tgg00_Rec;
      (* PTS 1116259 M.Ki. *)
 
BEGIN
(* rewrite/clean up records during unload *)
src_nptr.np_ptr    := NIL;
src_nptr.np_cbptr  := NIL;
ret_buf_pos        := 1;
ret_buf_len        := ret_buf_pos + sizeof (tbd_node) - 1;
target_nptr.np_ptr := @ret_buf[ 1 ];
syskey             := cgg_zero_id; (* not used *)
b13init_default_data_page (t, treeid,
      LEAF_LEVEL_BD00, unload_info^.ui_tar_pageno,
      target_nptr);
unload_info^.ui_tar_pageno := succ (unload_info^.ui_tar_pageno);
(* last page we were working on: *)
pno                         := unload_info^.ui_src_pageno;
(* record on that page we have to start with: *)
start_recind                := unload_info^.ui_src_recind;
curr_index                  := FIRST_REC_INDEX_BD00;
MaxRecIndex                 := FIRST_REC_INDEX_BD00;
ret_buf_full                := false;
b30cinit_current (t, source_current);
source_current.curr_tree_id := treeid;
&ifdef TRACE
t01int4 (bi, 'start_recind', start_recind);
&endif
WHILE NOT ret_buf_full AND (t.trError_gg00 = e_ok) DO
    BEGIN
    curr_index := curr_index + 1;
    IF  curr_index > MaxRecIndex
    THEN
        BEGIN
        IF  pno = NIL_PAGE_NO_GG00
        THEN
            t.trError_gg00 := e_no_next_record
        ELSE
            BEGIN
            b30save_quick (pno, src_nptr, source_current);
            IF  src_nptr.np_ptr = NIL
            THEN
                t.trError_gg00 := e_no_next_record
            ELSE
                IF  t.trError_gg00 = e_ok
                THEN
                    IF  src_nptr.np_ptr^.nd_bottom = BODY_BEG_BD00
                    THEN
                        t.trError_gg00 := e_no_next_record
                    ELSE
                        BEGIN
                        curr_index  := FIRST_REC_INDEX_BD00;
                        MaxRecIndex := src_nptr.np_ptr^.nd_record_cnt - 1;
                        END
                    (*ENDIF*) 
                (*ENDIF*) 
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  t.trError_gg00 = e_ok
    THEN
        BEGIN
        source_ptr := @src_nptr.np_ptr^.nd_body[
              src_nptr.np_ptr^.nd_pointer_list[MAX_POINTERINDEX_BD00 - curr_index]];
        key_len.mapC2_sp00[1] := source_ptr^[3];
        key_len.mapC2_sp00[2] := source_ptr^[4]
        END;
    (*ENDIF*) 
    IF  t.trRteCommPtr_gg00^.to_cancel
    THEN
        t.trError_gg00 := e_cancelled;
    (*ENDIF*) 
    ;
    IF  (curr_index >= start_recind) AND (t.trError_gg00 = e_ok)
    THEN
        WITH unload_info^ DO
            BEGIN
            bd37rewrite_record (t, new_record, ui_src_st_ptr, source_ptr,
                  ui_src_col_cnt, ui_tar_st_ptr, key_len, syskey,
                  ui_fixedcollen, ui_code_tab, ui_trunc_col, ui_frac_col,
                  ui_not_null, ui_check_col);
            start_recind := FIRST_REC_INDEX_BD00;
            IF  t.trError_gg00 = e_ok
            THEN
                BEGIN
                IF  (target_nptr.np_ptr^.nd_bottom + new_record.recLen_gg00) >
                    MAX_BOTTOM_BD00 - ((target_nptr.np_ptr^.nd_record_cnt+1)
                    * POINTERSIZE_BD00)
                THEN
                    BEGIN
                    (* record does not fit into page, check if another *)
                    (* page will fit into return buffer                *)
                    ret_buf_pos := ret_buf_pos + sizeof (tbd_node);
                    IF  (ret_buf_pos + sizeof (tbd_node)) > ret_buf_size
                    THEN
                        BEGIN (* new page would not fit into return buffer *)
                        ret_buf_full := true;
                        start_recind := curr_index;
                        END
                    ELSE
                        BEGIN (* page fits *)
                        ret_buf_len := ret_buf_pos + sizeof (tbd_node) - 1;
                        target_nptr.np_ptr := @ret_buf[ ret_buf_pos ];
                        b13init_default_data_page (t, treeid,
                              LEAF_LEVEL_BD00, unload_info^.ui_tar_pageno,
                              target_nptr);
                        unload_info^.ui_tar_pageno :=
                              succ (unload_info^.ui_tar_pageno);
                        END;
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
                IF  NOT ret_buf_full
                THEN
                    WITH target_nptr, np_ptr^ DO (* PTS 1103797 AK 28-08-1999 *)
                        BEGIN (* add record to page *)
                        g10mv3 ('VBD37 ',  10,    
                              sizeof (new_record.recBuf_gg00), sizeof (np_ptr^),
                              new_record.recBuf_gg00, 1, np_ptr^,
                              nd_bottom, new_record.recLen_gg00, t.trError_gg00);
                        IF  t.trError_gg00 = e_ok
                        THEN
                            (*  pointer list update *)
                            BEGIN
                            nd_record_cnt := nd_record_cnt + 1;
                            rec_index     := nd_record_cnt - 1;
                            nd_pointer_list [MAX_POINTERINDEX_BD00 - rec_index] := nd_bottom;
                            nd_bottom     := nd_bottom + b01rec_align (new_record.recLen_gg00)
                            END
                        (*ENDIF*) 
                        END
                    (*ENDWITH*) 
                (*ENDIF*) 
                END
            (*ENDIF*) 
            END;
        (*ENDWITH*) 
    (*ENDIF*) 
    ;
    END;
(*ENDWHILE*) 
unload_info^.ui_src_pageno := src_nptr.np_ptr^.nd_id;
unload_info^.ui_src_recind := start_recind;
&ifdef TRACE
t01int4 (bi, 'ret_buf_len ', ret_buf_len);
&endif
IF  src_nptr.np_ptr <> NIL
THEN
    b13r_release_node (src_nptr, source_current, lru_normal);
(*ENDIF*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
*-PRETTY-*  statements    :        443
*-PRETTY-*  lines of code :       1388        PRETTYX 3.10 
*-PRETTY-*  lines in file :       1983         1997-12-10 
.PA 
