.ad 8
.bm 8
.fm 4
.bt $Copyright (c) 2000-2005 SAP AG$$Page %$
.tm 12
.hm 6
.hs 3
.TT 1 $SQL$Project Distributed Database System$VAK201$
.tt 2 $$$
.TT 3 $ThomasA$AK_DDL_Syntaxk$$$$2001-03-21$
***********************************************************
.nf
 
 .nf
 
    ========== licence begin  GPL
    Copyright (c) 2000-2005 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
 
 
.fo
.nf
.sp
MODULE  : DBProc_DDL_Syntax
=========
.sp
Purpose : Computes the syntax tree for all DDl commands.
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :
 
        PROCEDURE
              a201alter_dbproc (VAR acv  : tak_all_command_glob;
                    VAR put_node : tsp00_Int2);
 
        PROCEDURE
              a201alter_trigger_statement (VAR acv     : tak_all_command_glob;
                    VAR put_node : tsp00_Int2);
 
        PROCEDURE
              a201call_proc (VAR acv : tak_all_command_glob;
                    expected_odbc_terminator : tak_odbc_partype;
                    resultNameNode           : integer;
                    VAR put_node             : tsp00_Int2);
 
        PROCEDURE
              a201create_dbproc  (VAR acv : tak_all_command_glob;
                    kw_index       : integer;
                    is_replace     : boolean;
                    VAR put_node   : tsp00_Int2);
 
        PROCEDURE
              a201CreateSystemTriggerStatement (
                    VAR acv      : tak_all_command_glob;
                    VAR put_node : tsp00_Int2);
 
        PROCEDURE
              a201create_trigger_stmt (VAR acv : tak_all_command_glob;
                    is_replace   : boolean;
                    VAR put_node : tsp00_Int2);
 
        PROCEDURE
              a201drop_trigger (VAR acv  : tak_all_command_glob;
                    VAR put_node : tsp00_Int2);
 
        PROCEDURE
              a201ReleaseInternalPackets (VAR acv : tak_all_command_glob);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              Where_Part : VAK63;
 
        PROCEDURE
              a63_asearch_condition (VAR acv : tak_all_command_glob;
                    VAR put_node       : tsp00_Int2;
                    VAR last_node      : tsp00_Int2);
 
        PROCEDURE
              a63_avalue_expression (VAR acv : tak_all_command_glob;
                    VAR put_node  : tsp00_Int2;
                    VAR last_node : tsp00_Int2);
&       ifdef trace
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01int4 (debug : tgg00_Debug;
                    nam      : tsp00_Sname;
                    int      : tsp00_Int4);
 
        PROCEDURE
              t01moveobj (layer : tgg00_Debug;
                    VAR buf  : tsp00_MoveObj;
                    startpos : tsp00_Int4;
                    endpos   : tsp00_Int4);
&       endif
 
      ------------------------------ 
 
        FROM
              Resulttable : VAK73;
 
        PROCEDURE
              a73_aclose_resulttable (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp00_Int2);
 
        PROCEDURE
              a73_afetch_statement (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp00_Int2);
 
      ------------------------------ 
 
        FROM
              Select_Syntax : VAK60;
 
        PROCEDURE
              a60_adeclare (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp00_Int2);
 
      ------------------------------ 
 
        FROM
              DML_Help_Procedures : VAK542;
 
        FUNCTION
              a542GetAndRemovePacket (VAR acv : tak_all_command_glob) : tsp00_MoveObjPtr;
 
        PROCEDURE
              a542internal_packet (VAR acv : tak_all_command_glob;
                    release_internal_packet : boolean;
                    required_len            : tsp00_Int4);
 
        PROCEDURE
              a542pop_packet (VAR acv : tak_all_command_glob);
 
      ------------------------------ 
 
        FROM
              Statement_Syntax : VAK351;
 
        PROCEDURE
              a351check_statement (
                    VAR acv      : tak_all_command_glob;
                    VAR put_node : tsp00_Int2);
 
        PROCEDURE
              a351select_statement (VAR acv : tak_all_command_glob;
                    StmtStartPos : tsp00_Int4;
                    VAR put_node : tsp00_Int2);
 
      ------------------------------ 
 
        FROM
              AK_DDL_Syntax : VAK20;
 
        PROCEDURE
              a20adata_type (VAR acv : tak_all_command_glob;
                    VAR put_node  : tsp00_Int2;
                    VAR last_node : tsp00_Int2;
                    isDBFunction  : boolean;
                    keyw          : integer);
 
        PROCEDURE
              a20create_table_stmt (VAR acv : tak_all_command_glob;
                    inDBProcCompile : boolean; (* PTS 1109247 *)
                    VAR put_node    : tsp00_Int2);
 
        PROCEDURE
              a20info_node (VAR acv : tak_all_command_glob;
                    proc       : tak_procs;
                    subproc    : tsp00_Int2;
                    VAR curr_n : tsp00_Int2;
                    VAR info_n : tsp00_Int2);
 
        PROCEDURE
              a20atable_drop (VAR acv  : tak_all_command_glob;
                    VAR put_node : tsp00_Int2);
 
      ------------------------------ 
 
        FROM
              Systeminfo_cache : VAK10;
 
        PROCEDURE
              a10dispose (VAR acv : tak_all_command_glob;
                    VAR p : tsp00_MoveObjPtr);
 
      ------------------------------ 
 
        FROM
              AK_syntax_values_tools : VAK03;
 
        PROCEDURE
              a03_aliteral (VAR acv     : tak_all_command_glob;
                    VAR put_node  : tsp00_Int2;
                    VAR last_node : tsp00_Int2);
 
        PROCEDURE
              a03_astring_literal (VAR acv : tak_all_command_glob;
                    VAR put_node     : tsp00_Int2;
                    VAR last_node    : tsp00_Int2);
 
      ------------------------------ 
 
        FROM
              AK_syntax_tools : VAK02;
 
        PROCEDURE
              a02_atablename (VAR acv   : tak_all_command_glob;
                    VAR put_node  : tsp00_Int2;
                    VAR last_node : tsp00_Int2);
 
        PROCEDURE
              a02_n_acolumnname  (VAR acv : tak_all_command_glob;
                    VAR put_node    : tsp00_Int2;
                    VAR last_node   : tsp00_Int2);
 
        PROCEDURE
              a02_acolumnspec (VAR acv  : tak_all_command_glob;
                    table_required : boolean;
                    VAR put_node   : tsp00_Int2;
                    VAR last_node  : tsp00_Int2);
 
        PROCEDURE
              a02_l_acolumn_list (VAR acv : tak_all_command_glob;
                    VAR put_node    : tsp00_Int2;
                    VAR last_node   : tsp00_Int2);
 
        PROCEDURE
              a02_put_identifier (VAR acv    : tak_all_command_glob;
                    VAR put_node  : tsp00_Int2;
                    VAR last_node : tsp00_Int2);
 
        PROCEDURE
              a02procedure (VAR acv : tak_all_command_glob;
                    VAR put_node   : tsp00_Int2;
                    VAR last_n     : tsp00_Int2);
 
      ------------------------------ 
 
        FROM
              Scanner : VAK01;
 
        VAR
              a01char_size          : integer;
              a01kw                 : tak_keywordtab;
 
        FUNCTION
              a01is_whitespace_char (
                    VAR m    : tsp00_MoveObj;
                    pos      : tsp00_Int4) : boolean;
 
        PROCEDURE
              a01_is_end_symbol (VAR acv : tak_all_command_glob);
 
        PROCEDURE
              a01_force_symbol (VAR acv : tak_all_command_glob;
                    expected_symbol : tak_sc_symbol;
                    VAR node1       : tsp00_Int2;
                    VAR node2       : tsp00_Int2);
 
        PROCEDURE
              a01_next_symbol (VAR acv : tak_all_command_glob);
 
        PROCEDURE
              a01_put_node (VAR acv  : tak_all_command_glob;
                    VAR curr_n : tsp00_Int2);
 
        PROCEDURE
              a01ptr_put_node (VAR acv : tak_all_command_glob;
                    ptr        : tsp00_MoveObjPtr;
                    VAR curr_n : tsp00_Int2);
 
        PROCEDURE
              a01_call_put (VAR acv  : tak_all_command_glob;
                    proc       : tak_procs;
                    subproc    : tsp00_Int2;
                    VAR curr_n : tsp00_Int2);
 
        PROCEDURE
              a01_get_keyword (VAR acv : tak_all_command_glob;
                    VAR index    : integer;
                    VAR reserved : boolean);
 
        FUNCTION
              a01node_get_ptr (VAR acv : tak_all_command_glob;
                    tree_index : integer) : tsp00_MoveObjPtr;
 
        FUNCTION
              a01_odbc_end_ok (VAR acv : tak_all_command_glob;
                    parstype : tak_odbc_partype) : boolean;
 
        FUNCTION
              a01_eqkey (VAR a : tak_keyword;
                    sqlmode    : tsp00_SqlMode;
                    VAR b      : tsp00_MoveObj;
                    VAR scv    : tak_scanner_glob) : boolean;
 
        FUNCTION
              a01mandatory_keyword (VAR acv : tak_all_command_glob;
                    required_keyword : integer) : boolean;
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG101;
 
        PROCEDURE
              SAPDB_PascalMove (
                    mod_id   : tsp00_C6;
                    mod_num  : tsp00_Int4;
                    src_upb  : tsp00_Int4;
                    dest_upb : tsp00_Int4;
                    src      : tsp00_MoveObjPtr;
                    src_pos  : tsp00_Int4;
                    dest     : tsp00_MoveObjPtr;
                    dest_pos : tsp00_Int4;
                    length   : tsp00_Int4;
                    VAR err  : tgg00_BasisError);
 
      ------------------------------ 
 
        FROM
              AK_error_handling : VAK07;
 
        PROCEDURE
              a07_const_b_put_error (
                    VAR acv    : tak_all_command_glob;
                    b_err      : tgg00_BasisError;
                    err_code   : tsp00_Int4;
                    param_addr : tsp00_MoveObjPtr;
                    const_len  : integer);
 
        PROCEDURE
              a07const_param (
                    VAR acv    : tak_all_command_glob;
                    param_no   : integer;
                    param_addr : tsp00_MoveObjPtr;
                    param_len  : integer);
 
        PROCEDURE
              a07_kw_put_error (
                    VAR acv  : tak_all_command_glob;
                    b_err    : tgg00_BasisError;
                    err_code : tsp00_Int4;
                    kw       : integer);
 
        PROCEDURE
              a07_error (VAR acv   : tak_all_command_glob;
                    err      : tgg00_BasisError;
                    VAR nod1 : tsp00_Int2;
                    VAR nod2 : tsp00_Int2);
 
      ------------------------------ 
 
        FROM
              AK_error_handling : VAK071;
 
        FUNCTION
              a071_return_code (
                    b_err   : tgg00_BasisError;
                    sqlmode : tsp00_SqlMode) : tsp00_Int2;
 
      ------------------------------ 
 
        FROM
              AK_Lock_Commit_Rollback : VAK52;
 
        PROCEDURE
              a52_alock_statement (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp00_Int2);
 
        PROCEDURE
              a52asubtrans_statement (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp00_Int2);
 
      ------------------------------ 
 
        FROM
              AK_Insert : VAK56;
 
        PROCEDURE
              a56_ainsert_statement (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp00_Int2);
 
      ------------------------------ 
 
        FROM
              AK_Update : VAK57;
 
        PROCEDURE
              a57_aupdate_statement (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp00_Int2;
                    kw_index     : integer);
 
      ------------------------------ 
 
        FROM
              AK_Delete : VAK58;
 
        PROCEDURE
              a58_adelete_statement (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp00_Int2);
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01unicode       : boolean;
 
.CM *-END-* use -----------------------------------------
.sp; .cp 3
Synonym :
 
        PROCEDURE
              a10dispose;
 
              tak_sysbufferaddress tsp00_MoveObjPtr
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : ThomasA
.sp
.cp 3
Created : 1979-06-07
.sp
.cp 3
.sp
.cp 3
Release :  7.3    Date : 2001-03-21
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:
 
.sp
.sp 2
.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
 
 
.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.nf
.oc _/1
Structure:
 
.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 10
.nf
.oc _/1
.CM -lll-
Code    :
 
 
CONST
      c_in_dbproc         = true;
 
 
(*------------------------------*) 
 
PROCEDURE
      a201call_proc (VAR acv : tak_all_command_glob;
            expected_odbc_terminator : tak_odbc_partype;
            resultNameNode           : integer;
            VAR put_node             : tsp00_Int2);
 
VAR
      is_instance_call: boolean;
      res_kw          : boolean;
      ex_kind         : tak_execution_kind;
      last_n          : tsp00_Int2;
      curr_n          : tsp00_Int2;
      param_node      : tsp00_Int2;
      dummy_n         : tsp00_Int2;
      kw_index        : integer;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_return_segm^.sp1r_function_code := csp1_pl_sql_execute_fc;
    a01_call_put (acv, a260, 0, put_node);  (* PTS 1104914 T.A. *)
    a_ap_tree^[put_node].n_length := 0;
    a01_call_put (acv, a260, 0, last_n);
    a_ap_tree^[put_node].n_sa_level := last_n;
    a_ap_tree^[last_n].n_lo_level   := resultNameNode;
    a01_next_symbol (acv);
    IF  a01_eqkey (a01kw[ cak_i_system], a_sqlmode,
        a_cmd_part^.sp1p_buf,a_scv)
    THEN
        BEGIN
        a01_next_symbol (acv);
        IF  a01mandatory_keyword (acv, cak_i_trigger)
        THEN
            a_ap_tree^[put_node].n_length := cak_i_system
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    a02procedure (acv,
          a_ap_tree^[last_n].n_sa_level, last_n);
    is_instance_call := false;
    IF  sc_symb = s_method_call
    THEN
        BEGIN
        is_instance_call := true;
        a01_next_symbol (acv);
        a02_put_identifier  (acv,
              acv.a_ap_tree^[ last_n ].n_sa_level, last_n)
        END;
    (*ENDIF*) 
    a01_call_put (acv, a20, cak_i_param, param_node);
    a_ap_tree^[put_node].n_lo_level := param_node;
    last_n := param_node;
    IF  sc_symb = s_leftpar
    THEN (* parameter list *)
        BEGIN
        ex_kind := a_ex_kind;
        IF  a_ex_kind = parsing_executing
        THEN
            a_ex_kind := only_parsing;
        (*ENDIF*) 
        REPEAT
            a01_next_symbol (acv);
            curr_n := last_n;
            a01_call_put (acv, a261, 0, last_n);
            a_ap_tree^[curr_n].n_sa_level := last_n;
            IF  sc_symb = s_comma
            THEN
                BEGIN
                sc_symb := s_default;
                a01_put_node (acv, a_ap_tree^[last_n].n_lo_level);
                sc_symb := s_comma
                END
            ELSE
                a63_avalue_expression (acv,
                      a_ap_tree^[last_n].n_lo_level, dummy_n);
            (*ENDIF*) 
        UNTIL
            (sc_symb <> s_comma) OR (sc_symb = s_eof);
        (*ENDREPEAT*) 
        a_ex_kind := ex_kind;
        a01_force_symbol (acv, s_rightpar, put_node, last_n)
        END;
    (*ENDIF*) 
    IF  (a_returncode = 0) AND (sc_symb <> s_eof)
    THEN
        IF  a01_eqkey (a01kw[ cak_i_with ], a_sqlmode,
            a_cmd_part^.sp1p_buf,a_scv)
        THEN
            BEGIN
            a01_next_symbol (acv);
            IF  a01mandatory_keyword (acv, cak_i_commit)
            THEN
                a_ap_tree^[ a_ap_tree^[ 0 ].n_lo_level ].n_subproc := cak_i_commit;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
    (*ENDIF*) 
    IF  (a_returncode = 0) AND (sc_symb <> s_eof)
    THEN
        IF  a01_eqkey (a01kw[ cak_i_execute ], acv.a_sqlmode,
            acv.a_cmd_part^.sp1p_buf, acv.a_scv)
        THEN
            BEGIN
            a01_next_symbol (acv);
            a01_get_keyword (acv, kw_index, res_kw);
            acv.a_ap_tree^[put_node].n_length := kw_index;
            CASE kw_index OF
                cak_i_inproc, cak_i_local :
                    BEGIN
                    a01_next_symbol (acv);
                    END;
                cak_i_remote :
                    BEGIN
                    a01_next_symbol (acv);
                    IF  a01mandatory_keyword (acv, cak_i_at)
                    THEN
                        a03_astring_literal (acv, acv.a_ap_tree^[put_node].n_lo_level, last_n);
                    (*ENDIF*) 
                    END;
                OTHERWISE
                    a07_error (acv, e_wanted_keyword, put_node, last_n);
                END;
            (*ENDCASE*) 
            END;
        (*ENDIF*) 
    (*ENDIF*) 
    IF  (expected_odbc_terminator <> no_odbc) AND
        ((a_comp_type = at_odbc) OR (a_comp_type = at_jdbc))
    THEN
        BEGIN
        IF  NOT a01_odbc_end_ok (acv, expected_odbc_terminator)
        THEN
            a07_error (acv, e_invalid_end_of_command,
                  put_node, last_n);
        (*ENDIF*) 
        a01_next_symbol (acv)
        END;
    (*ENDIF*) 
    a01_is_end_symbol (acv);
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a201create_dbproc  (VAR acv : tak_all_command_glob;
            kw_index       : integer;
            is_replace     : boolean;
            VAR put_node   : tsp00_Int2);
 
VAR
      isPublicFunction : boolean;
      next             : boolean;
      res_kw           : boolean;
      beginProcFound   : boolean;
      asRequired       : boolean;
      hasOutParameter  : boolean;
      sql_mode         : tsp00_SqlMode;
      curr_n           : tsp00_Int2;
      last_n           : tsp00_Int2;
      name_n           : tsp00_Int2;
      param_n          : tsp00_Int2;
      scv              : tak_scanner_glob;
      msg              : tsp00_C40;
 
BEGIN
IF  kw_index = cak_i_public
THEN
    BEGIN
    isPublicFunction := true;
    kw_index         := cak_i_function;
    END
ELSE
    BEGIN
    isPublicFunction := false;
    IF  kw_index = cak_i_procedure
    THEN
        kw_index := cak_i_dbproc
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  kw_index <> cak_i_trigger
THEN
    IF  kw_index = cak_i_function
    THEN
        acv.a_is_ddl := ddl_create_dbfunc
    ELSE
        acv.a_is_ddl := ddl_create_procedure;
    (*ENDIF*) 
(*ENDIF*) 
acv.a_init_ddl := ddl_create_procedure;
asRequired     := false;
a01_call_put (acv, a12, cak_x_create_dbproc, put_node);
IF  kw_index = cak_i_trigger
THEN
    acv.a_ap_tree^[put_node].n_length := cak_i_inproc
ELSE
    acv.a_ap_tree^[put_node].n_length := cak_i_local;
(*ENDIF*) 
acv.a_ap_tree^[put_node].n_pos := ord(is_replace);
IF  kw_index <> cak_i_trigger
THEN
    BEGIN
    a01_next_symbol (acv);
    acv.a_scv.sc_states := acv.a_scv.sc_states + [ scs_reserved_check ];
    a02procedure (acv, acv.a_ap_tree^[put_node].n_lo_level, last_n);
    acv.a_scv.sc_states := acv.a_scv.sc_states - [ scs_reserved_check ];
    END
ELSE
    a02_put_identifier (acv, acv.a_ap_tree^[put_node].n_lo_level, last_n);
(*ENDIF*) 
name_n := last_n;
a01_call_put (acv, a12, 0, curr_n);
acv.a_ap_tree^[put_node].n_sa_level := curr_n;
hasOutParameter := false;
IF  acv.a_scv.sc_symb = s_leftpar
THEN
    BEGIN
    asRequired := true;
    ak201DbProcParameterList (acv, acv.a_ap_tree^[curr_n].n_lo_level,
          kw_index = cak_i_function, last_n, hasOutParameter);
    END
ELSE
    last_n := curr_n;
(*ENDIF*) 
IF  a01_eqkey (a01kw[ cak_i_returns ], acv.a_sqlmode,
    acv.a_cmd_part^.sp1p_buf, acv.a_scv)
THEN
    BEGIN
    asRequired := true;
    IF  kw_index = cak_i_function
    THEN
        BEGIN
        ak201ReturnType (acv, acv.a_ap_tree^[last_n].n_lo_level, name_n);
        IF  a01_eqkey (a01kw[ cak_i_deterministic], acv.a_sqlmode,
            acv.a_cmd_part^.sp1p_buf, acv.a_scv)
        THEN
            BEGIN
            acv.a_ap_tree^[curr_n].n_subproc := cak_i_deterministic;
            a01_next_symbol (acv);
            END;
        (*ENDIF*) 
        END
    ELSE
        BEGIN
        a01_next_symbol (acv);
        scv := acv.a_scv;
        IF  a01mandatory_keyword (acv, cak_i_cursor)
        THEN
            IF  hasOutParameter
            THEN
                BEGIN
                msg := 'OUT parameter and RETURN CURSOR         ';
                a07_const_b_put_error (acv, e_not_implemented, scv.sc_sypos,
                      @msg, sizeof(msg));
                END
            ELSE
                acv.a_ap_tree^[curr_n].n_subproc := cak_i_cursor;
            (*ENDIF*) 
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END
ELSE
    IF  kw_index = cak_i_function
    THEN
        a07_error (acv, e_wanted_keyword, put_node, last_n);
    (*ENDIF*) 
(*ENDIF*) 
IF  a01_eqkey (a01kw[ cak_i_as], acv.a_sqlmode,
    acv.a_cmd_part^.sp1p_buf, acv.a_scv)
THEN
    BEGIN
    acv.a_ap_tree^[put_node].n_proc    := a261;
    acv.a_ap_tree^[put_node].n_subproc := cak_i_create;
    IF  isPublicFunction
    THEN
        acv.a_ap_tree^[put_node].n_length  := cak_i_public
    ELSE
        acv.a_ap_tree^[put_node].n_length  := kw_index;
    (*ENDIF*) 
    (* PTS 1104049 *)
    scv := acv.a_scv;
    a01_next_symbol(acv);
    IF  a01_eqkey (a01kw[cak_i_language], acv.a_sqlmode,
        acv.a_cmd_part^.sp1p_buf, acv.a_scv)
    THEN
        BEGIN
        a01_call_put (acv, a262, cak_i_language, last_n);
        acv.a_ap_tree^[curr_n].n_sa_level := last_n;
        a01_next_symbol (acv);
        a02_put_identifier (acv, acv.a_ap_tree^[last_n].n_sa_level, last_n);
        IF  a01mandatory_keyword (acv, cak_i_name)
        THEN
            a03_astring_literal (acv, acv.a_ap_tree^[last_n].n_sa_level, last_n)
        (*ENDIF*) 
        END
    ELSE
        BEGIN
        IF  a01_eqkey (a01kw[cak_i_beginproc], acv.a_sqlmode,
            acv.a_cmd_part^.sp1p_buf, acv.a_scv)
        THEN
            beginProcFound := true
        ELSE
            BEGIN
            beginProcFound := false;
            acv.a_scv      := scv
            END;
        (*ENDIF*) 
        ak201DbProcBody (acv,  acv.a_ap_tree^[curr_n].n_sa_level);
        IF  beginProcFound
        THEN
            IF  a01mandatory_keyword (acv, cak_i_endproc)
            THEN
                BEGIN
                END;
            (*ENDIF*) 
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END
ELSE
    IF  asRequired
    THEN
        a07_error (acv, e_wanted_keyword, put_node, last_n)
    ELSE
        BEGIN
        IF  a01mandatory_keyword (acv, cak_i_in)
        THEN
            a02procedure (acv, acv.a_ap_tree^[put_node].n_sa_level, last_n);
        (*ENDIF*) 
        IF  acv.a_is_ddl = ddl_create_dbfunc
        THEN
            BEGIN
            name_n := acv.a_ap_tree^[put_node].n_lo_level;
            IF  acv.a_scv.sc_symb <> s_eof
            THEN
                IF  a01mandatory_keyword (acv, cak_i_using)
                THEN
                    BEGIN
                    next   := false;
                    REPEAT
                        IF  next
                        THEN
                            a01_next_symbol(acv)
                        ELSE
                            next := true;
                        (*ENDIF*) 
                        a02_put_identifier (acv, acv.a_ap_tree^[name_n].n_sa_level, name_n);
                        IF  acv.a_scv.sc_symb = s_leftpar
                        THEN
                            BEGIN
                            a01_call_put (acv, a12, cak_i_param, param_n);
                            acv.a_ap_tree^[name_n].n_lo_level := param_n;
                            REPEAT
                                a01_call_put (acv, a12, cak_i_param, last_n);
                                acv.a_ap_tree^[param_n].n_sa_level := last_n;
                                param_n                          := last_n;
                                a01_next_symbol (acv);
                                sql_mode      := acv.a_sqlmode;
                                acv.a_sqlmode := sqlm_oracle; (* allow keyword NUMBER *)
                                a01_get_keyword (acv, kw_index, res_kw);
                                acv.a_sqlmode := sql_mode;
                                CASE kw_index OF
                                    cak_i_varchar :
                                        BEGIN
                                        a01_call_put (acv, a12, cak_i_varchar, last_n);
                                        acv.a_ap_tree^[param_n].n_lo_level := last_n;
                                        a01_next_symbol(acv);
                                        END;
                                    cak_i_number :
                                        BEGIN
                                        a01_call_put (acv, a12, cak_i_number, last_n);
                                        acv.a_ap_tree^[param_n].n_lo_level := last_n;
                                        a01_next_symbol(acv);
                                        END;
                                    OTHERWISE
                                        a02_put_identifier (acv, acv.a_ap_tree^[param_n].n_lo_level, last_n);
                                    END;
                                (*ENDCASE*) 
                                IF  acv.a_scv.sc_symb = s_leftpar
                                THEN
                                    BEGIN
                                    a01_call_put (acv, a262, cak_i_trigger, curr_n);
                                    acv.a_ap_tree^[last_n].n_sa_level := curr_n;
                                    ak201statement_list (acv, sppr_db_func, cak_i_no_keyword, false, false, curr_n);
                                    a01_force_symbol (acv, s_rightpar, put_node, last_n)
                                    END
                                (*ENDIF*) 
                            UNTIL
                                acv.a_scv.sc_symb <> s_comma;
                            (*ENDREPEAT*) 
                            a01_force_symbol (acv, s_rightpar, put_node, last_n)
                            END;
                        (*ENDIF*) 
                    UNTIL
                        acv.a_scv.sc_symb <> s_comma;
                    (*ENDREPEAT*) 
                    END;
                (*ENDIF*) 
            (*ENDIF*) 
            acv.a_is_ddl := ddl_create_dbfunc (* may have been reset *)
            END
        ELSE
            BEGIN
            IF  a01_eqkey (a01kw[ cak_i_execute ], acv.a_sqlmode,
                acv.a_cmd_part^.sp1p_buf, acv.a_scv)
            THEN
                BEGIN
                a01_next_symbol (acv);
                a01_get_keyword (acv, kw_index, res_kw);
                acv.a_ap_tree^[put_node].n_length := kw_index;
                CASE kw_index OF
                    cak_i_inproc, cak_i_local :
                        BEGIN
                        a01_next_symbol (acv);
                        END;
                    cak_i_remote :
                        BEGIN
                        a01_next_symbol (acv);
                        IF  a01mandatory_keyword (acv, cak_i_at)
                        THEN
                            a03_astring_literal (acv, acv.a_ap_tree^[last_n].n_sa_level, last_n);
                        (*ENDIF*) 
                        END;
                    OTHERWISE
                        a07_error (acv, e_wanted_keyword, put_node, last_n);
                    END;
                (*ENDCASE*) 
                END;
            (* PTS 1114407 E.Z. *)
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        IF  is_replace AND a01_eqkey (a01kw[ cak_i_commit ], acv.a_sqlmode,
            acv.a_cmd_part^.sp1p_buf, acv.a_scv)
        THEN
            BEGIN
            acv.a_ap_tree^[put_node].n_pos := cak_i_commit;
            a01_next_symbol (acv)
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a201CreateSystemTriggerStatement (
            VAR acv      : tak_all_command_glob;
            VAR put_node : tsp00_Int2);
 
VAR
      beginProcFound : boolean;
      last_n         : tsp00_Int2;
      curr_n         : tsp00_Int2;
 
BEGIN
IF  a01mandatory_keyword (acv, cak_i_system)
THEN
    IF  a01mandatory_keyword (acv, cak_i_trigger)
    THEN
        BEGIN
        acv.a_init_ddl := ddl_create_procedure;
        acv.a_is_ddl   := ddl_create_procedure;
        a01_call_put (acv, a261, cak_i_create, put_node);
        (*acv.a_ap_tree^[put_node].n_subproc := cak_i_system;*)
        acv.a_ap_tree^[put_node].n_length  := cak_i_system;
        acv.a_ap_tree^[put_node].n_pos     := ord(false);
        acv.a_scv.sc_states := acv.a_scv.sc_states + [ scs_reserved_check ];
        a02procedure (acv, acv.a_ap_tree^[put_node].n_lo_level, last_n);
        acv.a_scv.sc_states := acv.a_scv.sc_states - [ scs_reserved_check ];
        a01_call_put (acv, a12, 0, curr_n);
        acv.a_ap_tree^[put_node].n_sa_level := curr_n;
        IF  a01mandatory_keyword (acv, cak_i_after)
        THEN
            IF  a01mandatory_keyword (acv, cak_i_restart)
            THEN
                IF  a01mandatory_keyword (acv, cak_i_execute)
                THEN
                    BEGIN
                    beginProcFound := a01_eqkey (a01kw[cak_i_beginproc], acv.a_sqlmode,
                          acv.a_cmd_part^.sp1p_buf, acv.a_scv); (* PTS 1104049 *)
                    IF  beginProcFound OR (acv.a_scv.sc_symb = s_leftpar)
                    THEN
                        BEGIN
                        ak201DbProcBody (acv,  acv.a_ap_tree^[curr_n].n_sa_level);
                        IF  NOT beginProcFound
                        THEN
                            a01_force_symbol (acv, s_rightpar, put_node, last_n)
                        ELSE
                            IF  a01mandatory_keyword (acv, cak_i_endproc)
                            THEN
                                BEGIN
                                END;
                            (*ENDIF*) 
                        (*ENDIF*) 
                        END;
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
            (*ENDIF*) 
        (*ENDIF*) 
        END;
    (*ENDIF*) 
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a201create_trigger_stmt (VAR acv : tak_all_command_glob;
            is_replace   : boolean;
            VAR put_node : tsp00_Int2);
 
VAR
      first          : boolean;
      beginProcFound : boolean;
      triggerKind    : tsp00_Sproc;
      ikw            : integer;
      res_kw         : boolean;
      curr_n         : tsp00_Int2;
      info_n         : tsp00_Int2;
      last_n         : tsp00_Int2;
      i              : integer;
      trigger_kind   : ARRAY[ 1..cak_maxkeyword ] OF boolean;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_is_ddl   := ddl_create_trigger;
    a_init_ddl := ddl_create_trigger;
    a01_call_put (acv, a262, cak_i_create, curr_n);
    IF  is_replace
    THEN
        a_ap_tree^[curr_n].n_pos := cak_i_replace
    ELSE
        a_ap_tree^[curr_n].n_pos := 0;
    (*ENDIF*) 
    a_ap_tree^[curr_n].n_length := 0;
    put_node := curr_n;
    a01_next_symbol (acv);
    a02_put_identifier  (acv,
          a_ap_tree^[ curr_n ].n_lo_level, last_n);
    IF  a01_eqkey (a01kw[ cak_i_for ], a_sqlmode,
        a_cmd_part^.sp1p_buf, a_scv)
    THEN
        BEGIN
        a01_next_symbol (acv);
        a02_atablename  (acv,
              a_ap_tree^[ last_n ].n_lo_level, last_n);
        IF  a01mandatory_keyword (acv, cak_i_after)
        THEN
            BEGIN
            first := true;
            FOR i := 1 TO cak_maxkeyword DO
                trigger_kind[ i ] := false;
            (*ENDFOR*) 
            REPEAT
                IF  first
                THEN
                    BEGIN
                    a01_get_keyword (acv, ikw, res_kw);
                    first := false;
                    CASE ikw OF
                        cak_i_insert :
                            triggerKind := sppr_insert_trigger;
                        cak_i_update :
                            triggerKind := sppr_update_trigger;
                        cak_i_delete :
                            triggerKind := sppr_delete_trigger;
                        OTHERWISE ;
                        END;
                    (*ENDCASE*) 
                    END
                ELSE
                    BEGIN
                    a01_next_symbol (acv);
                    triggerKind := sppr_ddl_trigger;
                    a01_get_keyword (acv, ikw, res_kw);
                    END;
                (*ENDIF*) 
                CASE ikw OF
                    cak_i_delete, cak_i_insert, cak_i_update :
                        BEGIN
                        IF  trigger_kind [ ikw ]
                        THEN
                            a07_error (acv,
                                  e_invalid_keyword, put_node, last_n)
                        ELSE
                            BEGIN
                            trigger_kind [ ikw ] := true;
                            a01_call_put (acv, a262, ikw, curr_n);
                            a_ap_tree^[ last_n ].n_lo_level := curr_n;
                            last_n := curr_n;
                            a01_next_symbol (acv);
                            IF  (ikw = cak_i_update) AND
                                (a_scv.sc_symb = s_leftpar)
                            THEN
                                BEGIN
                                a01_next_symbol (acv);
                                a02_l_acolumn_list (acv,
                                      a_ap_tree^[ last_n ].n_sa_level,
                                      last_n);
                                a01_force_symbol (acv, s_rightpar,
                                      put_node, last_n)
                                END;
                            (*ENDIF*) 
                            END;
                        (*ENDIF*) 
                        END;
                    OTHERWISE
                        a07_error (acv,
                              e_wanted_keyword, put_node, last_n)
                    END;
                (*ENDCASE*) 
            UNTIL
                sc_symb <> s_comma;
            (*ENDREPEAT*) 
            END;
        (*ENDIF*) 
        IF  a01mandatory_keyword (acv, cak_i_execute)
        THEN
            BEGIN
            a01_call_put (acv, a262, cak_i_trigger, last_n);
            a_ap_tree^[ curr_n ].n_lo_level := last_n;
            beginProcFound := a01_eqkey (a01kw[cak_i_beginproc], acv.a_sqlmode,
                  acv.a_cmd_part^.sp1p_buf, acv.a_scv); (* PTS 1104049 *)
            IF  beginProcFound OR (sc_symb = s_leftpar)
            THEN
                BEGIN
                a01_call_put (acv, a262, cak_i_trigger, curr_n);
                a_ap_tree^[ last_n ].n_sa_level := curr_n;
                ak201localVariables (acv, curr_n);
                acv.a_scv.sc_eof_symb := s_semicolon;
                ak201statement_list (acv, triggerKind, cak_i_no_keyword, false, false, curr_n);
                acv.a_scv.sc_eof_symb := s_unknown;
                IF  NOT beginProcFound
                THEN
                    a01_force_symbol (acv, s_rightpar, put_node, last_n)
                ELSE
                    IF  a01mandatory_keyword (acv, cak_i_endproc)
                    THEN
                        BEGIN
                        END;
                    (*ENDIF*) 
                (*ENDIF*) 
                END
            ELSE
                a201create_dbproc (acv, cak_i_trigger, false, a_ap_tree^[last_n].n_sa_level);
            (*ENDIF*) 
            IF  a_scv.sc_symb <> s_eof
            THEN
                IF  a01_eqkey (a01kw[cak_i_whenever], a_sqlmode,
                    a_cmd_part^.sp1p_buf, a_scv)
                THEN
                    BEGIN
                    a01_call_put (acv, a262, cak_i_whenever, curr_n);
                    a_ap_tree^[ last_n ].n_lo_level := curr_n;
                    a20info_node (acv, a63, 0, last_n, info_n);
                    a_ap_tree^[ curr_n ].n_sa_level := last_n;
                    a_ap_tree^[ last_n ].n_pos :=
                          a_scv.sc_sypos + a_scv.sc_sylength;
                    a01_next_symbol (acv);
                    IF  ikw <> cak_i_update
                    THEN (* OLD/NEW specification not allowed *)
                        a_is_ddl := ddl_create_table;
                    (*ENDIF*) 
                    a_rowno_allowed   := false;
                    a_rowno_found     := false;
                    a_allow_functions := tf_unknown;
                    a_from_select     := false;
                    a63_asearch_condition (acv,
                          a_ap_tree^[ last_n ].n_lo_level, curr_n);
                    a_is_ddl := ddl_create_trigger;
                    WITH a_ap_tree^[info_n] DO
                        BEGIN
                        IF  sc_symb = s_eof
                        THEN
                            n_pos := a_cmd_part^.sp1p_buf_len -
                                  a01char_size + 1
                        ELSE
                            n_pos := a_scv.sc_sypos - a01char_size;
                        (*ENDIF*) 
                        WHILE a01is_whitespace_char (a_cmd_part^.sp1p_buf,
                              n_pos - a01char_size + 1) DO
                            n_pos := n_pos - a01char_size
                        (*ENDWHILE*) 
                        END;
                    (*ENDWITH*) 
                    END;
                (*ENDIF*) 
            (*ENDIF*) 
            IF  (a_scv.sc_symb <> s_eof) AND (acv.a_isReplicationSession)
            THEN
                IF  a01mandatory_keyword (acv, cak_i_internal)
                THEN
                    acv.a_ap_tree^[put_node].n_length := cak_i_internal;
                (*ENDIF*) 
            (*ENDIF*) 
            END
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  acv.a_returncode <> 0
    THEN
        a201ReleaseInternalPackets (acv)
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
FUNCTION
      ak201IsAssignment(VAR acv : tak_all_command_glob) : boolean;
 
VAR
      aux_scv : tak_scanner_glob;
 
BEGIN
ak201IsAssignment := false;
IF  acv.a_scv.sc_symb = s_identifier
THEN
    BEGIN
    aux_scv := acv.a_scv;
    a01_next_symbol(acv);
    IF  acv.a_scv.sc_symb = s_equal
    THEN
        ak201IsAssignment := true;
    (*ENDIF*) 
    acv.a_scv := aux_scv;
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak201localVariables (VAR acv : tak_all_command_glob;
            VAR put_node : tsp00_Int2);
 
CONST
      c_isDBFunction = true;
 
VAR
      exit_loop : boolean;
      res_kw    : boolean;
      varNode   : tsp00_Int2;
      last_n    : tsp00_Int2;
      dummy_node: tsp00_Int2;
      ikw       : integer;
      varCnt    : integer;
      i_var     : tak_keyword;
      scv       : tak_scanner_glob;
 
BEGIN
i_var        := 'VAR               ';
scv          := acv.a_scv;
a01_next_symbol (acv);
IF  a01_eqkey (i_var, acv.a_sqlmode,
    acv.a_cmd_part^.sp1p_buf, acv.a_scv)
THEN
    BEGIN
    a01_call_put (acv, a262, cak_i_char, last_n);
    acv.a_ap_tree^[put_node].n_lo_level := last_n;
    put_node := last_n;
    a01_call_put (acv, a262, cak_i_char, varNode);
    acv.a_ap_tree^[last_n].n_sa_level := varNode;
    exit_loop := false;
    a01_next_symbol (acv);
    varCnt := 0;
    REPEAT
        a01_get_keyword   (acv, ikw, res_kw);
        IF  (ikw = cak_i_begin   ) OR
            (ikw = cak_i_declare ) OR
            (ikw = cak_i_do      ) OR
            (ikw = cak_i_call    ) OR (* PTS 1111462 *)
            (ikw = cak_i_check   ) OR (* PTS 1133300 EZ 2005-01-11 *)
            (ikw = cak_i_close   ) OR
            (ikw = cak_i_create  ) OR (* PTS 1109247 *)
            (ikw = cak_i_delete  ) OR
            (ikw = cak_i_drop    ) OR
            (ikw = cak_i_execute ) OR
            (ikw = cak_i_fetch   ) OR
            (ikw = cak_i_if      ) OR
            (ikw = cak_i_insert  ) OR
            (ikw = cak_i_lock    ) OR
            (ikw = cak_i_return  ) OR
            (ikw = cak_i_set     ) OR
            (ikw = cak_i_stop    ) OR
            (ikw = cak_i_select  ) OR
            (ikw = cak_i_subtrans) OR
            (ikw = cak_i_case    ) OR
            (ikw = cak_i_try     ) OR
            (ikw = cak_i_update  ) OR
            (ikw = cak_i_while   ) OR
            ak201IsAssignment(acv)
        THEN
            exit_loop := true
        ELSE
            BEGIN
            varCnt := varCnt + 1;
            a02_n_acolumnname (acv, dummy_node, last_n);
            a01_get_keyword   (acv, ikw, res_kw);
            IF  ikw in [cak_i_boolean,
                cak_i_char,
                cak_i_character,
                cak_i_date,
                cak_i_fixed,
                cak_i_float,
                cak_i_int,
                cak_i_integer,
                cak_i_like,
                cak_i_number,
                cak_i_real,
                cak_i_smallint,
                cak_i_time,
                cak_i_timestamp,
                cak_i_varchar (* PTS 1112697 *)
                ]
            THEN
                BEGIN
                acv.a_ap_tree^[varNode].n_lo_level := last_n;
                varNode                            := last_n;
                IF  ikw = cak_i_like
                THEN
                    BEGIN
                    a01_call_put (acv, a262, cak_i_like, last_n);
                    acv.a_ap_tree^[varNode].n_sa_level := last_n;
                    a01_next_symbol (acv);
                    a02_acolumnspec (acv, true, acv.a_ap_tree^[last_n].n_lo_level, last_n)
                    END
                ELSE
                    BEGIN
                    IF  ikw = cak_i_varchar (* PTS 1112697 *)
                    THEN (* accept varchar, but handle it like fixed char *)
                        ikw := cak_i_char;
                    (*ENDIF*) 
                    a20adata_type (acv, acv.a_ap_tree^[varNode].n_sa_level,
                          last_n, NOT c_isDBFunction, ikw);
                    IF  (ikw in [ cak_i_char, cak_i_character ]) (* PTS 1109341 *)
                    THEN
                        IF  (acv.a_ap_tree^[last_n].n_length = ord(s_unknown))
                        THEN
                            BEGIN
                            IF  g01unicode
                            THEN
                                acv.a_ap_tree^[last_n].n_length := ord(s_unicode)
                            (*ENDIF*) 
                            END
                        ELSE
                            IF  (acv.a_ap_tree^[last_n].n_length <> ord(s_byte)) AND
                                (acv.a_ap_tree^[last_n].n_length <> ord(s_unicode))
                            THEN
                                a07_error (acv, e_invalid_keyword, put_node, put_node)
                            (*ENDIF*) 
                        (*ENDIF*) 
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
                scv := acv.a_scv;
                a01_force_symbol (acv, s_semicolon, put_node, put_node)
                END
            ELSE
                BEGIN
                a07_error (acv, e_wanted_keyword, put_node, put_node);
                exit_loop := true;
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
    UNTIL
        exit_loop OR (acv.a_returncode <> 0);
    (*ENDREPEAT*) 
    IF  varCnt = 0
    THEN
        a07_error (acv, e_missing_identifier, put_node, put_node);
    (*ENDIF*) 
    END;
(*ENDIF*) 
acv.a_scv    := scv;
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak201ReturnType (VAR acv : tak_all_command_glob;
            VAR put_node : tsp00_Int2;
            nameNode     : integer);
 
VAR
      res_kw           : boolean;
      kw_index         : integer;
      curr_n           : tsp00_Int2;
 
BEGIN
a01_call_put (acv, a260, cak_i_out, put_node);
a01_call_put (acv, a260, cak_i_out, curr_n);
acv.a_ap_tree^[acv.a_scv_index] := acv.a_ap_tree^[nameNode];
acv.a_ap_tree^[put_node].n_sa_level := curr_n;
a01_next_symbol (acv);
a01_get_keyword (acv, kw_index, res_kw);
IF  kw_index in [cak_i_boolean,
    cak_i_char,
    cak_i_character,
    cak_i_date,
    cak_i_dec,
    cak_i_decimal,
    cak_i_double,
    cak_i_fixed,
    cak_i_float,
    cak_i_int,
    cak_i_integer,
    cak_i_number,
    cak_i_numeric,
    cak_i_raw,
    cak_i_real,
    cak_i_smallint,
    cak_i_time,
    cak_i_timestamp,
    cak_i_varchar,
    cak_i_varchar2]
THEN
    a20adata_type (acv, acv.a_ap_tree^[curr_n].n_sa_level,
          curr_n, acv.a_is_ddl = ddl_create_dbfunc, kw_index)
ELSE
    a07_error (acv, e_wanted_keyword, put_node, curr_n);
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak201statement_list (VAR acv : tak_all_command_glob;
            ObjType    : tsp00_Sproc;
            end_kw     : integer;
            InLoop     : boolean;
            InCatch    : boolean;
            put_node   : tsp00_Int2);
 
VAR
      exit_loop : boolean;
      init_is_ddl : tak_ddl_descriptor;
 
BEGIN
a01_next_symbol (acv);
exit_loop := false;
(* PTS 1114828 E.Z. *)
init_is_ddl := acv.a_is_ddl;
REPEAT
    acv.a_is_ddl := init_is_ddl;
    acv.a_precomp_info_byte := csp1_p_none;
    ak201statement(acv, ObjType, InLoop, InCatch, put_node);
    WHILE acv.a_ap_tree^[put_node].n_lo_level <> 0 DO
        put_node := acv.a_ap_tree^[put_node].n_lo_level;
    (*ENDWHILE*) 
    acv.a_scv.sc_eof_symb := s_unknown;
    a01_next_symbol  (acv);
    a01_force_symbol (acv, s_semicolon, put_node, put_node);
    acv.a_scv.sc_eof_symb := s_semicolon;
    IF  end_kw <> cak_i_no_keyword
    THEN
        BEGIN
        IF  a01_eqkey (a01kw[end_kw], acv.a_sqlmode,
            acv.a_cmd_part^.sp1p_buf, acv.a_scv)
        THEN
            exit_loop := true
        (*ENDIF*) 
        END
    ELSE
        IF  (acv.a_scv.sc_symb = s_rightpar) OR
            (acv.a_scv.sc_symb = s_eof     ) OR
            a01_eqkey (a01kw[cak_i_endproc], acv.a_sqlmode, (* PTS 1104049 *)
            acv.a_cmd_part^.sp1p_buf, acv.a_scv)
        THEN
            exit_loop := true;
        (*ENDIF*) 
    (*ENDIF*) 
UNTIL
    exit_loop OR (acv.a_returncode <> 0);
(*ENDREPEAT*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak201statement (VAR acv : tak_all_command_glob;
            ObjType    : tsp00_Sproc;
            InLoop     : boolean;
            InCatch    : boolean;
            put_node   : tsp00_Int2);
 
CONST
      c_in_loop        = true;
      release_packet_c = true;
 
VAR
      res_kw       : boolean;
      newPacket    : boolean;
      nextSymbol   : boolean;
      noCheckKW    : integer;
      ex_kind      : tak_execution_kind;
      is_ddl       : tak_ddl_descriptor;
      ikw          : integer;
      newPacketLen : integer;
      eofKW        : integer;
      first_n      : tsp00_Int2;
      last_n       : tsp00_Int2;
      curr_n       : tsp00_Int2;
      dummy_n      : tsp00_Int2;
      lo_level_0   : tsp00_Int2;
      req_len      : tsp00_Int4;
      pos          : tsp00_Int4;
      cmd_size     : tsp00_Int4;
      stmtLength   : tsp00_Int4;
      init_cmd     : tsp00_MoveObjPtr;
      aux_scv      : tak_scanner_glob;
      StmtStart_scv: tak_scanner_glob;
 
      dataTypeMapC1: RECORD
            CASE boolean OF
                true :
                    (dt : tsp00_DataType);
                false :
                    (c1 : tsp00_C1);
                END;
            (*ENDCASE*) 
 
 
BEGIN
is_ddl     := acv.a_is_ddl;
eofKW      := acv.a_scv.sc_eof_kw;
nextSymbol := true;
CASE ObjType OF
    sppr_db_proc :
        acv.a_proc_compile := pct_dbproc;
    sppr_insert_trigger :
        acv.a_proc_compile := pct_insert_trigger;
    sppr_update_trigger :
        acv.a_proc_compile := pct_update_trigger;
    sppr_delete_trigger :
        acv.a_proc_compile := pct_delete_trigger;
    sppr_ddl_trigger :
        acv.a_proc_compile := pct_multi_trigger;
    sppr_db_func :
        acv.a_proc_compile := pct_function;
    OTHERWISE
        acv.a_proc_compile := pct_dbproc;
    END;
(*ENDCASE*) 
IF  ak201IsAssignment(acv)
THEN
    BEGIN
    nextSymbol := false;
    ikw        := cak_i_set;
    END
ELSE
    a01_get_keyword (acv, ikw, res_kw);
(*ENDIF*) 
CASE ikw OF
    cak_i_begin :
        BEGIN
        ak201statement_list (acv, ObjType, cak_i_end, InLoop, InCatch, put_node);
        aux_scv := acv.a_scv;
        IF  a01mandatory_keyword (acv, cak_i_end)
        THEN
            acv.a_scv := aux_scv
        (*ENDIF*) 
        END;
    cak_i_break :
        BEGIN
        IF  InLoop
        THEN
            BEGIN
            a01_call_put (acv, a262, ikw, last_n);
            acv.a_ap_tree^[put_node].n_lo_level := last_n;
            a01_next_symbol (acv);
            END
        ELSE
            a07_error (acv, e_wanted_keyword, put_node, last_n);
        (*ENDIF*) 
        END;
    cak_i_continue :
        BEGIN
        a01_next_symbol(acv);
        IF  (a01_eqkey (a01kw[cak_i_execute], acv.a_sqlmode,
            acv.a_cmd_part^.sp1p_buf, acv.a_scv))
        THEN
            BEGIN
            IF  InCatch
            THEN
                BEGIN
                a01_call_put (acv, a262, ikw, last_n);
                acv.a_ap_tree^[last_n  ].n_pos      := cak_i_execute;
                acv.a_ap_tree^[put_node].n_lo_level := last_n;
                a01_next_symbol (acv)
                END
            ELSE
                a07_error (acv, e_wanted_keyword, put_node, last_n);
            (*ENDIF*) 
            END
        ELSE
            IF  InLoop
            THEN
                BEGIN
                a01_call_put (acv, a262, ikw, last_n);
                acv.a_ap_tree^[last_n  ].n_pos      := cak_i_no_keyword;
                acv.a_ap_tree^[put_node].n_lo_level := last_n;
                END
            ELSE
                a07_error (acv, e_wanted_keyword, put_node, last_n);
            (*ENDIF*) 
        (*ENDIF*) 
        END;
    cak_i_do :
        BEGIN
        a01_call_put (acv, a262, ikw, last_n);
        acv.a_ap_tree^[put_node].n_lo_level := last_n;
        first_n := last_n;
        a01_call_put (acv, a262, 0, last_n);
        acv.a_ap_tree^[first_n].n_sa_level := last_n;
        ak201statement_list (acv, ObjType, cak_i_while, c_in_loop, InCatch, last_n);
        IF  a01mandatory_keyword (acv, cak_i_while)
        THEN(* PTS 1119709 *)
            ak201Condition (acv, cak_i_do, cak_i_while, acv.a_ap_tree^[last_n].n_sa_level);
        (*ENDIF*) 
        END;
    cak_i_if, cak_i_while :
        ak201IfOrWhileStatement(acv, ObjType, InLoop, InCatch, ikw,
              acv.a_ap_tree^[put_node].n_lo_level);
    cak_i_return :
        BEGIN
        a01_call_put (acv, a262, ikw, last_n);
        acv.a_ap_tree^[put_node].n_lo_level := last_n;
        pos := acv.a_scv.sc_newpos;
        a01_next_symbol(acv);
        IF  is_ddl = ddl_create_dbfunc
        THEN
            BEGIN
            a01_call_put (acv, a262, ikw, curr_n); (* this node stores pos and length of return expr *)
            acv.a_ap_tree^[curr_n].n_pos := pos;
            acv.a_ap_tree^[last_n].n_sa_level := curr_n;
            last_n := curr_n;
            a63_avalue_expression (acv,
                  acv.a_ap_tree^[last_n].n_sa_level, dummy_n);
            acv.a_ap_tree^[last_n].n_length   :=
                  acv.a_scv.sc_sypos - acv.a_ap_tree^[last_n].n_pos;
            END;
        (*ENDIF*) 
        END;
    cak_i_set :
        BEGIN
        a01_call_put (acv, a262, cak_i_set, last_n);
        acv.a_ap_tree^[put_node].n_lo_level := last_n;
        IF  nextSymbol
        THEN
            a01_next_symbol (acv);
        (*ENDIF*) 
        a02_n_acolumnname (acv, acv.a_ap_tree^[last_n].n_sa_level, last_n);
        a01_force_symbol  (acv, s_equal, put_node, put_node);
        a63_avalue_expression (acv,
              acv.a_ap_tree^[last_n].n_sa_level, dummy_n);
        END;
    cak_i_case :
        ak201CaseStatement (acv, ObjType, InLoop, InCatch,
              acv.a_ap_tree^[put_node].n_lo_level);
    cak_i_execute :
        BEGIN
        a01_call_put (acv, a262, cak_i_dynamic, first_n);
        acv.a_ap_tree^[put_node].n_lo_level := first_n;
        a01_call_put (acv, a262, cak_i_dynamic, last_n);
        acv.a_ap_tree^[first_n].n_sa_level := last_n;
        a01_next_symbol (acv);
        a63_avalue_expression (acv,
              acv.a_ap_tree^[last_n].n_sa_level, dummy_n);
        (* future : dynamic sql with parameters
              IF  a01_eqkey (a01kw[ cak_i_using ], acv.a_sqlmode,
              acv.a_cmd_part^.sp1p_buf, acv.a_scv)
              THEN
              a02_l_acolumn_list (acv, acv.a_ap_tree^[last_n].n_lo_level, last_n);
              *)
        END;
    cak_i_stop :
        BEGIN
        a01_call_put (acv, a262, cak_i_stop, first_n);
        acv.a_ap_tree^[put_node].n_lo_level := first_n;
        a01_call_put (acv, a262, cak_i_stop, last_n);
        acv.a_ap_tree^[first_n].n_sa_level := last_n;
        a01_next_symbol (acv);
        a01_force_symbol (acv, s_leftpar, put_node, last_n);
        a63_avalue_expression (acv,
              acv.a_ap_tree^[last_n].n_sa_level, dummy_n);
        IF  acv.a_scv.sc_symb = s_comma
        THEN
            BEGIN
            a01_next_symbol (acv);
            a63_avalue_expression (acv,
                  acv.a_ap_tree^[last_n].n_lo_level, dummy_n);
            END;
        (*ENDIF*) 
        a01_force_symbol (acv, s_rightpar, put_node, last_n)
        END;
    cak_i_try :
        BEGIN
        a01_call_put (acv, a262, cak_i_try, first_n);
        acv.a_ap_tree^[put_node].n_lo_level := first_n;
        a01_call_put (acv, a262, cak_i_try, last_n);
        acv.a_ap_tree^[first_n].n_sa_level := last_n;
        ak201statement_list (acv, ObjType, cak_i_catch, InLoop, InCatch, last_n);
        IF  a01mandatory_keyword (acv, cak_i_catch)
        THEN
            BEGIN
            a01_call_put (acv, a262, cak_i_catch, first_n);
            acv.a_ap_tree^[last_n].n_sa_level := first_n;
            ak201statement (acv, ObjType, InLoop, true, first_n);
            END;
        (*ENDIF*) 
        END;
    OTHERWISE
        BEGIN
        newPacket  := false;
        lo_level_0 := acv.a_ap_tree^[0].n_lo_level;
        pos        := acv.a_scv.sc_sypos;
        a01_call_put (acv, a262, cak_i_execute, last_n);
        acv.a_ap_tree^[put_node].n_lo_level := last_n;
        ex_kind            := acv.a_ex_kind;
        acv.a_ex_kind      := only_parsing;
        acv.a_count_variab := 0;
        a01_get_keyword (acv, ikw, res_kw);
        IF  (ObjType = sppr_insert_trigger) AND
            (ikw = cak_i_subtrans)
        THEN (* subtransactions not allowed in trigger *)
            ikw := 0
        ELSE
            IF  (ObjType = sppr_db_func) AND
                NOT (ikw in [cak_i_close, cak_i_declare, cak_i_fetch, cak_i_select])
            THEN
                ikw := 0;
            (*ENDIF*) 
        (*ENDIF*) 
        noCheckKW := cak_i_no_keyword;
        CASE ikw OF
            cak_i_call : (* PTS 1111462 *)
                a201call_proc (acv, no_odbc, 0,
                      acv.a_ap_tree^[0].n_lo_level);
            cak_i_check : (* PTS 1133300 EZ 2005-01-11 *)
                IF  acv.a_ap_tree^[lo_level_0].n_length = cak_i_system
                THEN
                    a351check_statement (acv, acv.a_ap_tree^[0].n_lo_level)
                ELSE
                    a07_error (acv, e_wanted_keyword, put_node, last_n);
                (*ENDIF*) 
            cak_i_close :
                BEGIN (* PTS 1102766 *)
                noCheckKW := cak_i_close;
                a01_next_symbol (acv);
                a73_aclose_resulttable (acv, acv.a_ap_tree^[0].n_lo_level)
                END;
            cak_i_create : (* PTS 1109247 *)
                BEGIN
                a01_next_symbol (acv);
                StmtStart_scv := acv.a_scv;
                IF  a01mandatory_keyword (acv, cak_i_table)
                THEN
                    BEGIN
                    IF  a01mandatory_keyword (acv, cak_i_temp)
                    THEN
                        BEGIN
                        acv.a_scv     := StmtStart_scv;
                        a20create_table_stmt (acv, c_in_dbproc,
                              acv.a_ap_tree^[0].n_lo_level);
                        END;
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
                END;
            cak_i_declare : (* PTS 1105368 *)
                a60_adeclare (acv, acv.a_ap_tree^[0].n_lo_level);
            cak_i_delete :
                BEGIN
                a58_adelete_statement (acv,
                      acv.a_ap_tree^[0].n_lo_level);
                END;
            cak_i_drop :
                BEGIN
                noCheckKW := cak_i_drop;
                a01_next_symbol (acv);
                StmtStart_scv := acv.a_scv;
                IF  a01mandatory_keyword (acv, cak_i_table)
                THEN
                    BEGIN
                    IF  a01mandatory_keyword (acv, cak_i_temp)
                    THEN
                        BEGIN
                        acv.a_scv     := StmtStart_scv;
                        a20atable_drop (acv, acv.a_ap_tree^[0].n_lo_level);
                        END;
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
                END;
            cak_i_fetch :
                a73_afetch_statement (acv,
                      acv.a_ap_tree^[0].n_lo_level);
            cak_i_insert :
                BEGIN
                StmtStart_scv := acv.a_scv;
                a56_ainsert_statement (acv,
                      acv.a_ap_tree^[0].n_lo_level);
                IF  acv.a_returncode = cak_e_expr_in_insert
                THEN
                    BEGIN
                    aux_scv                            := acv.a_scv;
                    acv.a_returncode := 0;
                    a542pop_packet (acv);
&                   ifdef trace
                    t01moveobj (ak_sem, acv.a_cmd_part^.sp1p_buf, 1,
                          acv.a_cmd_part^.sp1p_buf_len);
&                   endif
                    acv.a_scv             := StmtStart_scv;
                    acv.a_scv.sc_eof_symb := s_unknown;
                    REPEAT
                        a01_next_symbol (acv);
                    UNTIL
                        (acv.a_scv.sc_symb = s_semicolon) OR (acv.a_scv.sc_symb = s_eof);
                    (*ENDREPEAT*) 
                    acv.a_scv.sc_eof_symb := s_semicolon;
                    IF  acv.a_scv.sc_symb <> s_semicolon
                    THEN
                        a01_force_symbol (acv, s_semicolon, put_node, last_n)
                    ELSE
                        BEGIN
                        req_len := acv.a_scv.sc_sypos - pos;
                        init_cmd := @acv.a_cmd_part^.sp1p_buf;
                        cmd_size := acv.a_cmd_part^.sp1p_buf_size;
                        a542internal_packet (acv, NOT release_packet_c, req_len)
                        END;
                    (*ENDIF*) 
                    IF  acv.a_returncode = 0
                    THEN
                        BEGIN
                        newPacket := true;
                        SAPDB_PascalMove ('VAK201',   1,    
                              cmd_size, acv.a_cmd_part^.sp1p_buf_size,
                              @init_cmd^, pos, @acv.a_cmd_part^.sp1p_buf, 1, req_len,
                              acv.a_returncode);
                        acv.a_cmd_part^.sp1p_buf_len := req_len;
&                       ifdef trace
                        t01moveobj (ak_sem, acv.a_cmd_part^.sp1p_buf, 1, req_len);
&                       endif
                        acv.a_scv.sc_symb                  := s_unknown;
                        acv.a_scv.sc_newpos                := 1;
                        acv.a_scv.sc_sypos                 := 1;
                        acv.a_scv.sc_states                := acv.a_scv.sc_states -
                              [ scs_reserved_check ];
                        acv.a_scv.sc_double_quote          := 0;
                        acv.a_count_variab                 := 0;
                        a01_next_symbol (acv);
                        a56_ainsert_statement (acv,
                              acv.a_ap_tree^[0].n_lo_level);
                        acv.a_scv.sc_symb                  := s_unknown;
                        acv.a_scv.sc_newpos                := 1;
                        acv.a_scv.sc_sypos                 := 1;
                        acv.a_scv.sc_states                := acv.a_scv.sc_states -
                              [ scs_reserved_check ];
                        acv.a_scv.sc_double_quote          := 0;
                        acv.a_count_variab                 := 0;
                        acv.a_returncode := 0;
                        a01_next_symbol (acv);
                        a56_ainsert_statement (acv,
                              acv.a_ap_tree^[0].n_lo_level);
                        newPacketLen := acv.a_cmd_part^.sp1p_buf_len;
                        acv.a_ap_tree^[acv.a_ap_tree^[0].n_lo_level].n_length :=
                              acv.a_ap_tree^[acv.a_ap_tree^[0].n_lo_level].n_length +
                              cak_x_pseudo_ins_select;
                        a01ptr_put_node (acv, a542GetAndRemovePacket (acv), curr_n);
                        (* PTS 1113166 E.Z. *)
                        WITH acv.a_ap_tree^[acv.a_ap_tree^[0].n_lo_level] DO
                            n_pos := pos;
                        (*ENDWITH*) 
                        acv.a_ap_tree^[curr_n].n_lo_level := acv.a_ap_tree^[0].n_lo_level;
                        acv.a_ap_tree^[0].n_lo_level      := curr_n;
                        acv.a_scv                         := aux_scv;
                        acv.a_scv.sc_newpos               := pos + req_len;
                        acv.a_ap_tree^[last_n].n_pos      := 1;
                        dataTypeMapC1.c1[1] := chr(newPacketLen DIV MAX_INT2_SP00);
                        acv.a_ap_tree^[last_n].n_datatype := dataTypeMapC1.dt;
                        acv.a_ap_tree^[last_n].n_length   := newPacketLen MOD MAX_INT2_SP00;
                        END;
                    (*ENDIF*) 
                    a542pop_packet (acv)
                    END;
                (*ENDIF*) 
                END;
            cak_i_lock :
                BEGIN
                a52_alock_statement (acv, acv.a_ap_tree^[0].n_lo_level);
                END;
            cak_i_select :
                a351select_statement (acv, pos, acv.a_ap_tree^[0].n_lo_level);
            cak_i_subtrans :
                a52asubtrans_statement (acv, acv.a_ap_tree^[0].n_lo_level);
            cak_i_update :
                BEGIN
                a57_aupdate_statement (acv,
                      acv.a_ap_tree^[0].n_lo_level, cak_i_update);
                END;
            OTHERWISE
                a07_error (acv, e_wanted_keyword, put_node, last_n);
            END;
        (*ENDCASE*) 
        IF  noCheckKW <> cak_i_no_keyword
        THEN
            acv.a_ap_tree^[last_n].n_subproc := noCheckKW;
        (*ENDIF*) 
        acv.a_ap_tree^[last_n].n_sa_level := acv.a_ap_tree^[0].n_lo_level;
        IF  NOT newPacket
        THEN
            BEGIN
            stmtLength          := acv.a_scv.sc_sypos - acv.a_ap_tree^[last_n].n_pos;
            dataTypeMapC1.c1[1] := chr(stmtLength DIV MAX_INT2_SP00);
            acv.a_ap_tree^[last_n].n_datatype := dataTypeMapC1.dt;
            acv.a_ap_tree^[last_n].n_length   := stmtLength MOD MAX_INT2_SP00;
            END;
        (*ENDIF*) 
        acv.a_ap_tree^[0].n_lo_level := lo_level_0;
        acv.a_ex_kind                := ex_kind
        END;
    END;
(*ENDCASE*) 
acv.a_proc_compile  := pct_none;
acv.a_scv.sc_eof_kw := eofKW;
acv.a_is_ddl        := is_ddl;
END;
 
(*------------------------------*) 
 
PROCEDURE
      a201ReleaseInternalPackets (VAR acv : tak_all_command_glob);
 
BEGIN
ak201ReleaseInternalPackets (acv, acv.a_ap_tree^[0].n_lo_level);
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak201ReleaseInternalPackets (VAR acv : tak_all_command_glob;
            tree_index : integer);
 
VAR
      p : tsp00_MoveObjPtr;
 
BEGIN
IF  tree_index > 0
THEN
    BEGIN
    IF  acv.a_ap_tree^[tree_index].n_proc = a20
    THEN
        BEGIN
        p := a01node_get_ptr (acv, tree_index);
        a10dispose (acv, p);
        acv.a_ap_tree^[tree_index].n_proc := no_proc;
        END;
    (*ENDIF*) 
    ak201ReleaseInternalPackets (acv, acv.a_ap_tree^[tree_index].n_sa_level);
    ak201ReleaseInternalPackets (acv, acv.a_ap_tree^[tree_index].n_sa_level);
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak201CaseStatement (VAR acv : tak_all_command_glob;
            ObjType      : tsp00_Sproc;
            InLoop       : boolean;
            InCatch      : boolean;
            VAR put_node : tsp00_Int2);
 
VAR
      isSearchedCase : boolean;
      firstCase      : boolean;
      exitLoop       : boolean;
      caseLabels     : integer;
      last_n         : tsp00_Int2;
      case_n         : tsp00_Int2;
      prevCaseNode   : integer;
      value_n        : tsp00_Int2;
 
BEGIN
a01_call_put (acv, a262, cak_i_case, put_node);
a01_next_symbol (acv);
IF  a01_eqkey (a01kw[ cak_i_when ], acv.a_sqlmode,
    acv.a_cmd_part^.sp1p_buf, acv.a_scv) OR
    a01_eqkey (a01kw[ cak_i_else ], acv.a_sqlmode,
    acv.a_cmd_part^.sp1p_buf, acv.a_scv)
THEN (* searched case statement *)
    BEGIN
    isSearchedCase := true;
    a01_call_put (acv, a262, cak_i_when, last_n);
    acv.a_ap_tree^[put_node].n_sa_level := last_n;
    WHILE a01_eqkey (a01kw[ cak_i_when ], acv.a_sqlmode,
          acv.a_cmd_part^.sp1p_buf, acv.a_scv) DO
        BEGIN
        ak201IfOrWhileStatement(acv, ObjType, InLoop, InCatch, cak_i_when,
              acv.a_ap_tree^[last_n].n_lo_level);
        last_n := acv.a_ap_tree^[last_n].n_lo_level;
        acv.a_scv.sc_eof_symb := s_unknown;
        a01_next_symbol  (acv);
        a01_force_symbol (acv, s_semicolon, put_node, put_node);
        acv.a_scv.sc_eof_symb := s_semicolon;
        END;
    (*ENDWHILE*) 
    END
ELSE
    BEGIN
    isSearchedCase := false;
    a01_call_put (acv, a262, cak_i_case, put_node);
    a01_call_put (acv, a64, cak_x_in_pred, last_n);
    acv.a_ap_tree^[last_n].n_symb := s_in;
    acv.a_ap_tree^[put_node].n_sa_level := last_n;
    a63_avalue_expression (acv,
          acv.a_ap_tree^[last_n].n_lo_level, last_n);
    a01_call_put (acv, a64, cak_x_in_pred_list, acv.a_ap_tree^[last_n].n_sa_level);
    last_n := acv.a_ap_tree^[last_n].n_sa_level;
    firstCase := true;
    WHILE a01_eqkey (a01kw[ cak_i_when ], acv.a_sqlmode,
          acv.a_cmd_part^.sp1p_buf, acv.a_scv) DO
        BEGIN
        caseLabels := 0;
        exitLoop   := false;
        REPEAT
            caseLabels := caseLabels + 1;
            a01_call_put (acv, a64, cak_x_value_expression, case_n);
            IF  firstCase
            THEN
                BEGIN
                acv.a_ap_tree^[put_node].n_length := case_n;
                acv.a_ap_tree^[last_n].n_lo_level := case_n;
                firstCase := false;
                END
            ELSE
                acv.a_ap_tree^[prevCaseNode].n_sa_level := case_n;
            (*ENDIF*) 
            prevCaseNode := case_n;
            a01_next_symbol (acv);
            a03_aliteral (acv, acv.a_ap_tree^[case_n].n_lo_level, value_n);
            exitLoop := acv.a_scv.sc_symb <> s_comma;
        UNTIL
            exitLoop;
        (*ENDREPEAT*) 
        IF  a01mandatory_keyword (acv, cak_i_then)
        THEN
            BEGIN
            a01_call_put (acv, a262, caseLabels, last_n);
            acv.a_ap_tree^[prevCaseNode].n_sa_level := last_n;
            prevCaseNode                            := last_n;
            ak201statement (acv, ObjType, InLoop, InCatch, last_n);
            acv.a_scv.sc_eof_symb := s_unknown;
            a01_next_symbol  (acv);
            a01_force_symbol (acv, s_semicolon, put_node, put_node);
            acv.a_scv.sc_eof_symb := s_semicolon;
            END;
        (*ENDIF*) 
        END;
    (*ENDWHILE*) 
    END;
(*ENDIF*) 
IF  a01_eqkey (a01kw[ cak_i_else ], acv.a_sqlmode,
    acv.a_cmd_part^.sp1p_buf, acv.a_scv)
THEN
    BEGIN
    a01_next_symbol (acv);
    IF  NOT isSearchedCase
    THEN
        BEGIN
        a01_call_put (acv, a262, 0, last_n);
        acv.a_ap_tree^[prevCaseNode].n_sa_level := last_n;
        END
    ELSE
        acv.a_ap_tree^[acv.a_ap_tree^[put_node].n_sa_level].n_subproc := cak_i_else;
    (*ENDIF*) 
    ak201statement (acv, ObjType, InLoop, InCatch, last_n);
    acv.a_scv.sc_eof_symb := s_unknown;
    a01_next_symbol  (acv);
    a01_force_symbol (acv, s_semicolon, put_node, put_node);
    acv.a_scv.sc_eof_symb := s_semicolon;
    END;
(*ENDIF*) 
IF  a01mandatory_keyword (acv, cak_i_end)
THEN
    BEGIN
    IF  a01_eqkey (a01kw[ cak_i_case ], acv.a_sqlmode,
        acv.a_cmd_part^.sp1p_buf, acv.a_scv)
    THEN
        a01_next_symbol(acv)
    (*ENDIF*) 
    END;
(*ENDIF*) 
END;
 
(* PTS 1119709 *)
(*------------------------------*) 
 
PROCEDURE
      ak201Condition(VAR acv  : tak_all_command_glob;
            errorKW      : integer;
            wantedKW     : integer;
            VAR put_node : tsp00_Int2);
 
VAR
      dummy_n  : tsp00_Int2;
      sa_level : integer;
      errPos   : integer;
 
BEGIN
acv.a_rowno_allowed   := false;
acv.a_rowno_found     := false;
acv.a_allow_functions := tf_unknown;
acv.a_from_select     := false;
acv.a_scv.sc_eof_kw   := wantedKW;
acv.a_select_node            := 1;
sa_level                     := acv.a_ap_tree^[1].n_sa_level;
acv.a_ap_tree^[1].n_sa_level := 0;
a63_asearch_condition (acv, put_node, dummy_n);
acv.a_scv.sc_eof_kw := cak_i_no_keyword;
IF  (acv.a_returncode =
    a071_return_code (e_subquery_not_allowed, acv.a_sqlmode))
THEN
    BEGIN
    acv.a_returncode := a071_return_code (e_query_not_allowed, acv.a_sqlmode);
    a07const_param (acv, 1, @a01kw[errorKW], sizeof(a01kw[errorKW]));
    END
ELSE
    IF  acv.a_ap_tree^[1].n_sa_level > 0
    THEN
        BEGIN (* query in if/while statement detected, not allowed *)
        errPos := acv.a_ap_tree^[acv.a_ap_tree^[acv.a_ap_tree^[1].n_sa_level].n_pos].n_pos;
        acv.a_ap_tree^[1].n_sa_level := sa_level;
        a07_kw_put_error (acv, e_query_not_allowed, errPos, errorKW);
        END;
    (*ENDIF*) 
(*ENDIF*) 
acv.a_ap_tree^[1].n_sa_level := sa_level;
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak201IfOrWhileStatement(VAR acv  : tak_all_command_glob;
            ObjType    : tsp00_Sproc;
            InLoop     : boolean;
            InCatch    : boolean;
            kwIndex     : integer;
            VAR putNode : tsp00_Int2);
 
VAR
      last_n   : tsp00_Int2;
      first_n  : tsp00_Int2;
      else_n   : tsp00_Int2;
      wantedKW : integer;
      aux_scv  : tak_scanner_glob;
 
BEGIN
a01_call_put (acv, a262, kwIndex, putNode);
first_n := putNode;
a01_next_symbol (acv);
a01_call_put (acv, a262, 0, last_n);
acv.a_ap_tree^[first_n].n_sa_level := last_n;
a01_call_put (acv, a262, 0, else_n);
acv.a_ap_tree^[last_n].n_sa_level := else_n;
IF  kwIndex <> cak_i_while
THEN
    wantedKW := cak_i_then
ELSE
    wantedKW := cak_i_do;
(*ENDIF*) 
(* PTS 1119709 *)
ak201Condition (acv, kwIndex, wantedKW, acv.a_ap_tree^[else_n].n_sa_level);
a01_next_symbol (acv);
IF  a01mandatory_keyword (acv, wantedKW)
THEN
    BEGIN
    IF  kwIndex = cak_i_if
    THEN (* stop at keyword else *)
        acv.a_scv.sc_eof_kw := cak_i_else;
    (*ENDIF*) 
    ak201statement (acv, ObjType, InLoop OR (kwIndex = cak_i_while), InCatch, last_n);
    acv.a_scv.sc_eof_kw := cak_i_no_keyword;
    aux_scv             := acv.a_scv;
    a01_next_symbol (acv);
    IF  (kwIndex = cak_i_if) AND
        a01_eqkey (a01kw[cak_i_else], acv.a_sqlmode,
        acv.a_cmd_part^.sp1p_buf, acv.a_scv)
    THEN
        BEGIN
        a01_next_symbol (acv);
        acv.a_scv.sc_eof_kw := cak_i_else; (* if .. then .. if .. then .. else .. else *)
        ak201statement   (acv, ObjType, InLoop, InCatch, else_n)
        END
    ELSE
        acv.a_scv := aux_scv;
    (*ENDIF*) 
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a201drop_trigger (VAR acv  : tak_all_command_glob;
            VAR put_node : tsp00_Int2);
 
VAR
      last_n : tsp00_Int2;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a01_call_put (acv, a262, cak_i_drop, put_node);
    a01_next_symbol (acv);
    a02_put_identifier (acv, a_ap_tree^[ put_node ].n_lo_level, last_n);
    IF  a01mandatory_keyword (acv, cak_i_of)
    THEN
        BEGIN
        a_is_ddl := ddl_drop_trigger;
        a02_atablename (acv, a_ap_tree^[ last_n ].n_lo_level, last_n)
        END
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak201DbProcParameterList (VAR acv : tak_all_command_glob;
            VAR put_node       : tsp00_Int2;
            isDBFunction       : boolean;
            VAR last_n         : tsp00_Int2;
            VAR HasOutParamter : boolean);
 
VAR
      isFirstParameter : boolean;
      res_kw           : boolean;
      kw_index         : integer;
      in_out_index     : integer;
      prev_n           : tsp00_Int2;
      curr_n           : tsp00_Int2;
 
BEGIN
isFirstParameter := true;
HasOutParamter   := false;
REPEAT
    IF  isDBFunction
    THEN
        in_out_index := cak_i_in
    ELSE
        BEGIN
        a01_next_symbol(acv);
        a01_get_keyword (acv, in_out_index, res_kw);
        END;
    (*ENDIF*) 
    IF  (in_out_index = cak_i_in   ) OR
        (in_out_index = cak_i_out  ) OR
        (in_out_index = cak_i_inout)
    THEN
        BEGIN
        IF  in_out_index <> cak_i_in
        THEN
            HasOutParamter := true;
        (*ENDIF*) 
        a01_call_put (acv, a260, in_out_index, curr_n);
        IF  isFirstParameter
        THEN
            BEGIN
            put_node         := curr_n;
            isFirstParameter := false;
            END
        ELSE
            acv.a_ap_tree^[prev_n].n_lo_level := curr_n;
        (*ENDIF*) 
        prev_n := curr_n;
        a01_next_symbol    (acv);
        a02_put_identifier (acv, acv.a_ap_tree^[curr_n].n_sa_level, curr_n);
        a01_get_keyword (acv, kw_index, res_kw);
        (* PTS 1104983 E.Z. *)
        IF  kw_index in [cak_i_boolean,
            cak_i_char,
            cak_i_character,
            cak_i_date,
            cak_i_dec,
            cak_i_decimal,
            cak_i_double,
            cak_i_fixed,
            cak_i_float,
            cak_i_int,
            cak_i_integer,
            cak_i_long,
            cak_i_number,
            cak_i_numeric,
            cak_i_raw,
            cak_i_real,
            cak_i_smallint,
            cak_i_time,
            cak_i_timestamp,
            cak_i_varchar,
            cak_i_varchar2]
        THEN
            a20adata_type (acv, acv.a_ap_tree^[curr_n].n_sa_level,
                  curr_n, isDBFunction, kw_index)
        ELSE
            a07_error (acv, e_wanted_keyword, put_node, last_n);
        (*ENDIF*) 
        END
    ELSE
        a07_error (acv, e_wanted_keyword, put_node, last_n);
    (*ENDIF*) 
UNTIL
    (acv.a_scv.sc_symb <> s_comma) OR
    (acv.a_returncode <> 0);
(*ENDREPEAT*) 
last_n := prev_n;
a01_force_symbol (acv, s_rightpar, put_node, last_n)
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak201DbProcBody (VAR acv : tak_all_command_glob;
            VAR put_node : tsp00_Int2);
 
VAR
      last_n : tsp00_Int2;
 
BEGIN
a01_call_put    (acv, a260, cak_i_dbproc, last_n);
put_node := last_n;
a01_call_put (acv, a262, cak_i_trigger, last_n);
acv.a_ap_tree^[put_node].n_lo_level := last_n;
ak201localVariables (acv, last_n);
acv.a_scv.sc_eof_symb := s_semicolon;
ak201statement_list (acv, sppr_db_proc, cak_i_no_keyword, false, false, last_n);
acv.a_scv.sc_eof_symb := s_unknown;
END;
 
(*------------------------------*) 
 
PROCEDURE
      a201alter_trigger_statement (VAR acv     : tak_all_command_glob;
            VAR put_node : tsp00_Int2);
 
VAR
      res_kw   : boolean;
      last_n   : tsp00_Int2;
      kw_index : integer;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_is_ddl := ddl_alter_trigger;
    a01_call_put    (acv, a262, cak_i_alter, put_node);
    a01_next_symbol (acv);
    a02_put_identifier (acv, a_ap_tree^[put_node].n_lo_level, last_n);
    IF  a01mandatory_keyword (acv, cak_i_of)
    THEN
        BEGIN
        a02_atablename (acv, a_ap_tree^[last_n].n_lo_level, last_n);
        IF  a01mandatory_keyword (acv, cak_i_trace)
        THEN
            BEGIN
            a01_get_keyword (acv, kw_index, res_kw);
            CASE kw_index OF
                cak_i_on, cak_i_off :
                    BEGIN
                    a01_next_symbol (acv);
                    a_ap_tree^[put_node].n_length := kw_index
                    END;
                OTHERWISE
                    a07_error (acv, e_wanted_keyword, put_node, last_n)
                END
            (*ENDCASE*) 
            END
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a201alter_dbproc (VAR acv  : tak_all_command_glob;
            VAR put_node : tsp00_Int2);
 
VAR
      res_kw   : boolean;
      last_n   : tsp00_Int2;
      kw_index : integer;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_is_ddl := ddl_alter_dbproc;
    a01_call_put (acv, a261, cak_i_alter, put_node);
    a01_next_symbol (acv);
    a02procedure (acv,
          a_ap_tree^[put_node].n_sa_level, last_n);
    a01_get_keyword (acv, kw_index, res_kw);
    CASE kw_index OF
        cak_i_param :
            BEGIN
            a_ap_tree^[put_node].n_length := cak_i_param;
            a01_next_symbol (acv);
            a02_put_identifier (acv, acv.a_ap_tree^[put_node].n_lo_level, last_n);
            IF  a01mandatory_keyword (acv, cak_i_char)
            THEN
                BEGIN
                a01_get_keyword (acv, kw_index, res_kw);
                CASE kw_index OF
                    cak_i_ascii, cak_i_byte :
                        BEGIN
                        a01_next_symbol (acv);
                        a01_call_put (acv, a261, kw_index, a_ap_tree^[last_n].n_sa_level);
                        END;
                    OTHERWISE
                        a07_error (acv, e_wanted_keyword, put_node, last_n);
                    END;
                (*ENDCASE*) 
                END;
            (*ENDIF*) 
            END;
        cak_i_trace :
            BEGIN
            a01_next_symbol (acv);
            a01_get_keyword (acv, kw_index, res_kw);
            CASE kw_index OF
                cak_i_on, cak_i_off :
                    BEGIN
                    a01_next_symbol (acv);
                    a_ap_tree^[put_node].n_length := kw_index
                    END;
                OTHERWISE
                    a07_error (acv, e_wanted_keyword, put_node, last_n);
                END;
            (*ENDCASE*) 
            END;
        OTHERWISE
            a07_error (acv, e_wanted_keyword, put_node, last_n);
        END;
    (*ENDCASE*) 
    END;
(*ENDWITH*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
