.ad 8
.bm 8
.fm 4
.bt $Copyright by   SAP AG, 1998$$Page %$
.tm 12
.hm 6
.hs 3
.TT 1 $SQL$Project Distributed Database System$VAK78$
.tt 2 $$$
.TT 3 $$AK_string_columns$1998-05-25$
***********************************************************
.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  : AK_string_columns_syntax
=========
.sp
Purpose : syntax analysis of string column opns
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :
 
        PROCEDURE
              a78af_column_statement (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp_int2;
                    f_type       : tsp_int2);
 
        PROCEDURE
              a78aopen_column_statement (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp_int2);
 
        PROCEDURE
              a78aclose_column_statement (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp_int2);
 
        PROCEDURE
              a78aread_column_statement (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp_int2);
 
        PROCEDURE
              a78awrite_column_statement (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp_int2);
 
        PROCEDURE
              a78aexpand_column_statement
                    (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp_int2);
 
        PROCEDURE
              a78acopy_column_statement (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp_int2);
 
        PROCEDURE
              a78alength_column_statement
                    (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp_int2);
 
        PROCEDURE
              a78asearch_column_statement
                    (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp_int2);
 
        PROCEDURE
              a78atrunc_column_statement (VAR acv : tak_all_command_glob;
                    VAR put_node : tsp_int2);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              Scanner : VAK01;
 
        VAR
              a01kw       : tak_keywordtab;
 
        PROCEDURE
              a01_next_symbol (VAR acv : tak_all_command_glob);
 
        PROCEDURE
              a01_is_end_symbol (VAR acv : tak_all_command_glob);
 
        PROCEDURE
              a01_call_put (VAR acv : tak_all_command_glob;
                    proc     : tak_procs;
                    subproc  : tsp_int2;
                    VAR curr_n : tsp_int2);
 
        FUNCTION
              a01_eqkey (VAR a : tak_keyword;
                    sqlmode    : tsp_sqlmode;
                    VAR b      : tsp_moveobj;
                    VAR scv    : tak_scanner_glob) : boolean;
 
        FUNCTION
              a01mandatory_keyword (VAR acv : tak_all_command_glob;
                    required_keyword : integer) : boolean;
 
      ------------------------------ 
 
        FROM
              AK_syntax_tools : VAK02;
 
        PROCEDURE
              a02_aparameter_name (VAR acv : tak_all_command_glob;
                    VAR put_node  : tsp_int2;
                    VAR last_node : tsp_int2);
 
        PROCEDURE
              a02_acolumnspec (VAR acv : tak_all_command_glob;
                    table_required : boolean;
                    VAR put_node   : tsp_int2;
                    VAR last_node  : tsp_int2);
 
      ------------------------------ 
 
        FROM
              AK_error_handling : VAK07;
 
        PROCEDURE
              a07_error (VAR acv : tak_all_command_glob;
                    err      : tgg_basis_error;
                    VAR nod1 : tsp_int2;
                    VAR nod2 : tsp_int2);
 
      ------------------------------ 
 
        FROM
              DML_Parts : VAK55;
 
        PROCEDURE
              a55_akey_spec_list (VAR acv : tak_all_command_glob;
                    VAR put_node  : tsp_int2;
                    VAR last_node : tsp_int2);
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : 
.sp
.cp 3
Created : 1986-06-06
.sp
.cp 3
Version : 1998-05-25
.sp
.cp 3
Release :      Date : 1998-05-25
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:
 
 
.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_table_required  = true (* a02_acolumnspec *);
 
 
(*------------------------------*) 
 
PROCEDURE
      a78af_column_statement (VAR acv : tak_all_command_glob;
            VAR put_node : tsp_int2;
            f_type       : tsp_int2);
 
VAR
      curr_n         : tsp_int2;
      last_n         : tsp_int2;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_return_segm^.sp1r_function_code := csp1_string_command_fc;
    open_column_part (acv, put_node, f_type, curr_n,
          last_n);
    IF  (a_return_segm^.sp1r_returncode = 0)
    THEN
        CASE f_type OF
            cak_i_fnull:
                IF  (sc_symb <> s_eof)
                THEN
                    BEGIN
                    IF  a01mandatory_keyword (acv, cak_i_for)
                    THEN
                        BEGIN
                        a02_aparameter_name (acv,
                              a_ap_tree^[ curr_n ].n_sa_level,
                              curr_n);
                        IF  a_return_segm^.sp1r_returncode = 0
                        THEN
                            a01_is_end_symbol (acv);
                        (*ENDIF*) 
                        END
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
            cak_i_fread:
                BEGIN
                IF  a01mandatory_keyword (acv, cak_i_length)
                THEN
                    BEGIN
                    IF  a01mandatory_keyword (acv, cak_i_out)
                    THEN
                        a02_aparameter_name (acv,
                              a_ap_tree^[ curr_n ].n_sa_level,
                              curr_n);
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
                IF  a_return_segm^.sp1r_returncode = 0
                THEN
                    BEGIN
                    IF  a01mandatory_keyword (acv, cak_i_length)
                    THEN
                        a02_aparameter_name (acv,
                              a_ap_tree^[ curr_n ].n_sa_level, curr_n);
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
                IF  a_return_segm^.sp1r_returncode = 0
                THEN
                    BEGIN
                    IF  a01mandatory_keyword (acv, cak_i_buffer)
                    THEN
                        a02_aparameter_name (acv,
                              a_ap_tree^[ curr_n ].n_sa_level,
                              curr_n);
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
                IF  (sc_symb <> s_eof) AND (a_return_segm^.sp1r_returncode = 0)
                THEN
                    BEGIN
                    IF  a01mandatory_keyword (acv, cak_i_for)
                    THEN
                        BEGIN
                        IF  a01mandatory_keyword (acv, cak_i_update)
                        THEN
                            BEGIN
                            a_ap_tree^[ last_n ].n_subproc := cak_i_update;
                            a01_is_end_symbol (acv);
                            END
                        (*ENDIF*) 
                        END
                    (*ENDIF*) 
                    END
                ELSE
                    IF  a_return_segm^.sp1r_returncode = 0
                    THEN
                        a01_is_end_symbol (acv);
                    (*ENDIF*) 
                (*ENDIF*) 
                END;
            cak_i_fwrite :
                BEGIN
                a_ap_tree^[ last_n ].n_subproc := cak_i_update;
                IF  a01mandatory_keyword (acv, cak_i_length)
                THEN
                    a02_aparameter_name (acv,
                          a_ap_tree^[ curr_n ].n_sa_level, curr_n);
                (*ENDIF*) 
                IF  a_return_segm^.sp1r_returncode = 0
                THEN
                    BEGIN
                    IF  a01mandatory_keyword (acv, cak_i_buffer)
                    THEN
                        a02_aparameter_name (acv,
                              a_ap_tree^[ curr_n ].n_sa_level,
                              curr_n);
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
                IF  (sc_symb <> s_eof) AND (a_return_segm^.sp1r_returncode = 0)
                THEN
                    BEGIN
                    IF  a01mandatory_keyword (acv, cak_i_with)
                    THEN
                        BEGIN
                        IF  a01mandatory_keyword (acv, cak_i_trunc)
                        THEN
                            IF  NOT a01mandatory_keyword (acv, cak_i_option)
                            THEN
                                put_node := 0
                            (*ENDIF*) 
                        (*ENDIF*) 
                        END;
                    (*ENDIF*) 
                    IF  a_return_segm^.sp1r_returncode = 0
                    THEN
                        BEGIN
                        a_ap_tree^[ last_n ].n_subproc := cak_i_trunc;
                        a01_next_symbol (acv);
                        a01_is_end_symbol (acv);
                        END
                    (*ENDIF*) 
                    END
                ELSE
                    IF  a_return_segm^.sp1r_returncode = 0
                    THEN
                        a01_is_end_symbol (acv);
                    (*ENDIF*) 
                (*ENDIF*) 
                END;
            END
        (*ENDCASE*) 
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a78aopen_column_statement (VAR acv : tak_all_command_glob;
            VAR put_node : tsp_int2);
 
VAR
      curr_n         : tsp_int2;
      last_n         : tsp_int2;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_return_segm^.sp1r_function_code := csp1_string_command_fc;
    open_column_part (acv, put_node, cak_i_open, curr_n, last_n);
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        BEGIN
        IF  sc_symb <> s_eof
        THEN
            BEGIN
            (*==== for update clause ====*)
            IF  a01_eqkey (a01kw[ cak_i_for ], a_sqlmode,
                a_cmd_part^.sp1p_buf, a_scv)
            THEN
                BEGIN
                a01_next_symbol (acv);
                IF  a01mandatory_keyword (acv, cak_i_update)
                THEN
                    a_ap_tree^[ last_n ].n_subproc := cak_i_update;
                (*ENDIF*) 
                END
            (*==== in write mode clause ====*)
            ELSE
                IF  a01mandatory_keyword (acv, cak_i_in)
                THEN
                    BEGIN
                    IF  a01mandatory_keyword (acv, cak_i_write)
                    THEN
                        IF  a01mandatory_keyword (acv, cak_i_mode)
                        THEN
                            a_ap_tree^[ last_n ].n_subproc := cak_i_update;
                        (*ENDIF*) 
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
            (*ENDIF*) 
            a01_is_end_symbol (acv);
            END
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a78aclose_column_statement (VAR acv : tak_all_command_glob;
            VAR put_node : tsp_int2);
 
VAR
      curr_n : tsp_int2;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_return_segm^.sp1r_function_code := csp1_string_command_fc;
    a01_call_put (acv, a77, cak_i_close, curr_n);
    put_node:= curr_n;
    a01_next_symbol (acv);
    a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level, curr_n);
    a01_is_end_symbol (acv);
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a78aread_column_statement (VAR acv : tak_all_command_glob;
            VAR put_node : tsp_int2);
 
VAR
      curr_n : tsp_int2;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_return_segm^.sp1r_function_code := csp1_string_command_fc;
    a01_call_put (acv, a77, cak_i_read, curr_n);
    put_node:= curr_n;
    a01_next_symbol (acv);
    a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level, curr_n);
    IF  a01mandatory_keyword (acv, cak_i_pos)
    THEN
        BEGIN
        a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
              curr_n);
        IF  a01mandatory_keyword (acv, cak_i_length)
        THEN
            BEGIN
            IF  a01mandatory_keyword (acv, cak_i_in)
            THEN
                BEGIN
                a02_aparameter_name (acv,
                      a_ap_tree^[ curr_n ].n_sa_level,
                      curr_n);
                IF  a01mandatory_keyword (acv, cak_i_length)
                THEN
                    BEGIN
                    IF  a01mandatory_keyword (acv, cak_i_out)
                    THEN
                        BEGIN
                        a02_aparameter_name (acv,
                              a_ap_tree^[ curr_n ].n_sa_level,
                              curr_n);
                        IF  a01mandatory_keyword (acv, cak_i_buffer)
                        THEN
                            BEGIN
                            a02_aparameter_name (acv,
                                  a_ap_tree^[ curr_n ].n_sa_level,
                                  curr_n);
                            END;
                        (*ENDIF*) 
                        a01_is_end_symbol (acv);
                        END
                    (*ENDIF*) 
                    END
                (*ENDIF*) 
                END
            (*ENDIF*) 
            END
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a78awrite_column_statement (VAR acv : tak_all_command_glob;
            VAR put_node : tsp_int2);
 
VAR
      curr_n : tsp_int2;
      last_n : tsp_int2;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_return_segm^.sp1r_function_code := csp1_string_command_fc;
    a01_call_put (acv, a77, cak_i_write, curr_n);
    put_node:= curr_n;
    a01_next_symbol (acv);
    a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level, curr_n);
    IF  a01mandatory_keyword (acv, cak_i_pos)
    THEN
        BEGIN
        a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
              curr_n);
        IF  a01mandatory_keyword (acv, cak_i_length)
        THEN
            BEGIN
            a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
                  curr_n);
            IF  a01mandatory_keyword (acv, cak_i_buffer)
            THEN
                BEGIN
                a02_aparameter_name (acv,
                      a_ap_tree^[ curr_n ].n_sa_level,
                      curr_n);
                END;
            (*ENDIF*) 
            IF  sc_symb <> s_eof
            THEN
                BEGIN
                IF  a01mandatory_keyword (acv, cak_i_with)
                THEN
                    BEGIN
                    IF  a01mandatory_keyword (acv, cak_i_trunc)
                    THEN
                        BEGIN
                        IF  a01mandatory_keyword (acv, cak_i_option)
                        THEN
                            BEGIN
                            a01_call_put (acv, a77, cak_i_trunc, last_n);
                            a_ap_tree^[ curr_n ].n_sa_level := last_n;
                            END
                        (*ENDIF*) 
                        END
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
                a01_is_end_symbol (acv);
                END
            (*ENDIF*) 
            END
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a78aexpand_column_statement (VAR acv : tak_all_command_glob;
            VAR put_node : tsp_int2);
 
VAR
      curr_n      : tsp_int2;
      last_n      : tsp_int2;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_return_segm^.sp1r_function_code := csp1_string_command_fc;
    a01_next_symbol (acv);
    IF  a01mandatory_keyword (acv, cak_i_column)
    THEN
        BEGIN
        a01_call_put (acv, a77, cak_i_expand, curr_n);
        last_n := curr_n;
        put_node:= curr_n;
        a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
              curr_n);
        last_n := curr_n;
        IF  a01mandatory_keyword (acv, cak_i_length)
        THEN
            BEGIN
            a02_aparameter_name (acv,
                  a_ap_tree^ [ last_n ].n_sa_level,
                  curr_n);
            IF  a01mandatory_keyword (acv, cak_i_with)
            THEN
                BEGIN
                a02_aparameter_name (acv,
                      a_ap_tree^ [ curr_n ].n_sa_level,
                      curr_n);
                a01_is_end_symbol (acv);
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        END
    ELSE
        put_node := 0;
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a78acopy_column_statement (VAR acv : tak_all_command_glob;
            VAR put_node : tsp_int2);
 
VAR
      curr_n      : tsp_int2;
      last_n      : tsp_int2;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_return_segm^.sp1r_function_code := csp1_string_command_fc;
    a01_next_symbol (acv);
    IF  a01mandatory_keyword (acv, cak_i_column)
    THEN
        BEGIN
        a01_call_put (acv, a77, cak_i_copy, curr_n);
        last_n := curr_n;
        put_node:= curr_n;
        a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
              curr_n);
        last_n := curr_n;
        IF  a01mandatory_keyword (acv, cak_i_to)
        THEN
            BEGIN
            a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
                  curr_n);
            last_n := curr_n;
            END;
        (*ENDIF*) 
        IF  a01mandatory_keyword (acv, cak_i_sourcepos)
        THEN
            a02_aparameter_name (acv,
                  a_ap_tree^ [ curr_n ].n_sa_level,
                  curr_n);
        (*ENDIF*) 
        IF  a01mandatory_keyword (acv, cak_i_destpos)
        THEN
            a02_aparameter_name (acv,
                  a_ap_tree^ [ curr_n ].n_sa_level,
                  curr_n);
        (*ENDIF*) 
        IF  a01mandatory_keyword (acv, cak_i_length)
        THEN
            IF  a01mandatory_keyword (acv, cak_i_in)
            THEN
                a02_aparameter_name (acv,
                      a_ap_tree^ [ curr_n ].n_sa_level,
                      curr_n);
            (*ENDIF*) 
        (*ENDIF*) 
        IF  a01mandatory_keyword (acv, cak_i_length)
        THEN
            BEGIN
            IF  a01mandatory_keyword (acv, cak_i_out)
            THEN
                a02_aparameter_name (acv,
                      a_ap_tree^ [ curr_n ].n_sa_level,
                      curr_n);
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        a01_is_end_symbol (acv);
        END
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a78atrunc_column_statement (VAR acv : tak_all_command_glob;
            VAR put_node : tsp_int2);
 
VAR
      curr_n : tsp_int2;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_return_segm^.sp1r_function_code := csp1_string_command_fc;
    a01_call_put (acv, a77, cak_i_trunc, curr_n);
    put_node:= curr_n;
    a01_next_symbol (acv);
    a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level, curr_n);
    IF  a01mandatory_keyword (acv, cak_i_length)
    THEN
        BEGIN
        a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
              curr_n);
        a01_is_end_symbol (acv);
        END
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a78alength_column_statement (VAR acv : tak_all_command_glob;
            VAR put_node : tsp_int2);
 
VAR
      curr_n : tsp_int2;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_return_segm^.sp1r_function_code := csp1_string_command_fc;
    a01_call_put (acv, a77, cak_i_length, curr_n);
    put_node:= curr_n;
    a01_next_symbol (acv);
    a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level, curr_n);
    IF  a01mandatory_keyword (acv, cak_i_is)
    THEN
        BEGIN
        a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
              curr_n);
        a01_is_end_symbol (acv);
        END
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a78asearch_column_statement (VAR acv : tak_all_command_glob;
            VAR put_node : tsp_int2);
 
VAR
      curr_n   : tsp_int2;
      last_n   : tsp_int2;
      is_patt  : boolean;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a_return_segm^.sp1r_function_code := csp1_string_command_fc;
    a01_call_put (acv, a77, cak_i_search, curr_n);
    put_node:= curr_n;
    last_n:= curr_n;
    is_patt := false;
    a01_next_symbol (acv);
    a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level, curr_n);
    IF  a01mandatory_keyword (acv, cak_i_startpos)
    THEN
        BEGIN
        a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
              curr_n);
        IF  a01mandatory_keyword (acv, cak_i_endpos)
        THEN
            BEGIN
            a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
                  curr_n);
            last_n := curr_n;
            IF  a01_eqkey (a01kw[ cak_i_pattern ], a_sqlmode,
                a_cmd_part^.sp1p_buf, a_scv)
            THEN
                BEGIN
                a01_call_put (acv, a77, cak_i_pattern, curr_n);
                a_ap_tree^[ last_n ].n_lo_level:= curr_n;
                is_patt := true;
                END
            ELSE
                BEGIN
                IF  NOT a01_eqkey (a01kw[ cak_i_substr ], a_sqlmode,
                    a_cmd_part^.sp1p_buf, a_scv)
                THEN
                    a07_error (acv, e_wanted_keyword,
                          put_node, last_n)
                (*ENDIF*) 
                END
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        IF  a_return_segm^.sp1r_returncode = 0
        THEN
            BEGIN
            a01_next_symbol (acv);
            IF  is_patt
            THEN
                a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
                      curr_n)
            ELSE
                a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_lo_level,
                      curr_n);
            (*ENDIF*) 
            IF  NOT a01mandatory_keyword (acv, cak_i_firstpos)
            THEN
                put_node := 0
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        IF  a_return_segm^.sp1r_returncode = 0
        THEN
            BEGIN
            a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
                  curr_n);
            IF  a01mandatory_keyword (acv, cak_i_lastpos)
            THEN
                BEGIN
                a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
                      curr_n);
                a01_is_end_symbol (acv);
                END
            (*ENDIF*) 
            END
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*===================== locals ========================*)
(*------------------------------*) 
 
PROCEDURE
      open_column_part (VAR acv : tak_all_command_glob;
            VAR put_node : tsp_int2;
            f_type       : tsp_int2;
            VAR curr_n   : tsp_int2;
            VAR last_n   : tsp_int2);
 
VAR
      aux_n   : tsp_int2;
 
BEGIN
WITH acv, a_scv DO
    BEGIN
    a01_call_put (acv, a77, f_type, curr_n);
    last_n := curr_n;
    put_node:= curr_n;
    a01_next_symbol (acv);
    a02_acolumnspec (acv, NOT c_table_required,
          a_ap_tree^[ curr_n ].n_lo_level, curr_n);
    IF  NOT a01_eqkey (a01kw[ cak_i_key ], a_sqlmode,
        a_cmd_part^.sp1p_buf, a_scv)
    THEN
        a07_error (acv, e_wanted_keyword, put_node, curr_n)
    ELSE
        a55_akey_spec_list (acv, a_ap_tree^[ last_n ].n_sa_level, curr_n);
    (*ENDIF*) 
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        IF  f_type <> cak_i_fnull
        THEN
            BEGIN
            IF  a01mandatory_keyword (acv, cak_i_as)
            THEN
                a02_aparameter_name (acv, a_ap_tree^[ curr_n ].n_sa_level,
                      curr_n);
            (*ENDIF*) 
            IF  a_return_segm^.sp1r_returncode = 0
            THEN
                BEGIN
                a01_call_put (acv, a77, cak_i_not, aux_n);
                a_ap_tree^[ aux_n ].n_lo_level :=
                      a_ap_tree^[ last_n ].n_sa_level;
                a_ap_tree^ [ aux_n ].n_sa_level := 0;
                a_ap_tree^[ last_n ].n_sa_level:= aux_n;
                last_n := aux_n;
                IF  a01_eqkey (a01kw[ cak_i_max ], a_sqlmode,
                    a_cmd_part^.sp1p_buf, a_scv)
                THEN
                    BEGIN
                    a_ap_tree^[ aux_n ].n_length := cak_i_max;
                    a01_next_symbol (acv);
                    a02_aparameter_name (acv,
                          a_ap_tree^[ curr_n ].n_sa_level, curr_n);
                    END
                ELSE
                    a_ap_tree^[ aux_n ].n_length := 0
                (*ENDIF*) 
                END
            (*ENDIF*) 
            END
        (*ENDIF*) 
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
*-PRETTY-*  statements    :        211
*-PRETTY-*  lines of code :        701        PRETTYX 3.10 
*-PRETTY-*  lines in file :        899         1997-12-10 
.PA 
