.CM  SCRIPT , Version - 1.1 , last edited by Elke Zabach
.ad 8
.bm 8
.fm 4
.bt $Copyright (c) 1998-2005 SAP AG$$Page %$
.tm 12
.hm 6
.hs 3
.tt 1 $SQL$Project Distributed Database System$VSP03$
.tt 2 $$$
.tt 3 $ElkeZ$SQLSTATEs$1996-05-29$
***********************************************************
.nf

.nf

.nf

    ========== licence begin  GPL
    Copyright (c) 1998-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


.fo
.nf
.sp
Module  : SQLSTATEs
=========
.sp
Purpose : Conversion from returncode to SQLSTATE
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :
 
        PROCEDURE
              s03getsqlstate (returncode : tsp00_Int2;
                    warnings     : tsp00_WarningSet;
                    VAR sqlstate : tsp00_SqlState);
 
        FUNCTION
              s03severe_error (returncode : tsp00_Int2) : boolean;
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : ElkeZ
.sp
.cp 3
Created : 1994-03-14
.sp
.cp 3
Version : 1998-02-06
.sp
.cp 3
Release :  6.2   Date : 1996-05-29
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:
 
PROCEDURE
      s03getsqlstate (returncode : tsp00_Int2;
            VAR sqlstate : tsp00_SqlState);
 
To be used by at least precompiler, LOAD
 
.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    :
 
 
(*------------------------------*) 
 
PROCEDURE
      sp03sqlstate_value (returncode : tsp00_Int2;
            VAR sqlstate : tsp00_SqlState);
 
VAR
      return_value : tsp00_Int2;
      i            : integer;
 
BEGIN
IF  returncode < 0
THEN
    return_value := -returncode
ELSE
    return_value := returncode;
(*ENDIF*) 
FOR i := 4 DOWNTO 1 DO
    BEGIN
    sqlstate [1+i] := chr ((return_value MOD 10) + ord('0'));
    return_value := return_value DIV 10
    END;
(*ENDFOR*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      s03getsqlstate (returncode : tsp00_Int2;
            warnings     : tsp00_WarningSet;
            VAR sqlstate : tsp00_SqlState);
 
VAR
      retcode : tsp00_Int2;
 
BEGIN
(* if more than one returncode is given, it is the same errorcase, *)
(* but with different numbers in different sqlmodes. Because this  *)
(* procedure is called with ALL sqlmodes, this is necessary.       *)
CASE returncode OF
    0 :
        BEGIN
        sqlstate := '00000';
        IF  warnings <> [ ]
        THEN
            BEGIN
            IF  warn1 in warnings
            THEN
                (* set in the precompiler *)
                (* here only for documentation *)
                sqlstate := '01004'
            ELSE
                IF  warn2_null_in_builtin_func in warnings
                THEN
                    sqlstate := '01003'
                (*ENDIF*) 
            (*ENDIF*) 
            END
        (*ENDIF*) 
        END;
    -885 :
        sqlstate := '01004';
    -892 :
        sqlstate := '01004';
    100 :
        sqlstate := '02000';
    (*
          -861 :
          sqlstate := '07008';
          *)
    -8888 :
        sqlstate := '08001';
    -752 :
        sqlstate := '08002';
    -708 :
        sqlstate := '08003';
    -709 :
        sqlstate := '08003';
    -8001 :
        sqlstate := '08003';
    -707 :
        sqlstate := '08004';
    -711 :
        sqlstate := '08004';
    -715 :
        sqlstate := '08004';
    -882 :
        sqlstate := '08004';
    -4008 :
        sqlstate := '08004';
    -8000 :
        sqlstate := '08004';
    -8002 :
        sqlstate := '08004';
    -8022 :
        sqlstate := '08004';
    -9000 :
        sqlstate := '0A000';
    -7015 :
        sqlstate := '21000';
    -743 :
        sqlstate := '22001';
    -2010 :
        sqlstate := '22001';
    -8004 :
        sqlstate := '22001'; (*CONSTANT MUST BE COMPATIBLE WITH COLUMN TYPE*)
    (* unter Vorbehalt, 22001 ist nur fuer String Data, Right Truncation *)
    -809 :
        sqlstate := '22002';
    -884 :
        sqlstate := '22002';
    -751 :
        sqlstate := '22003';
    -811 :
        sqlstate := '22003';
    -3016 :
        sqlstate := '22003';
    -3019 :
        sqlstate := '22003';
    -817 :
        sqlstate := '22005';
    (* future use
          -3048 :
          sqlstate := '22007';
          -3049 :
          sqlstate := '22007';
          -3050 :
          sqlstate := '22007';
          *)
    -3024 :
        sqlstate := '22012';
    -768 :
        sqlstate := '22019';
    -3061 :
        sqlstate := '22019';
    -802 :
        sqlstate := '22023';
    -767 :
        sqlstate := '22024';
    -3060 :
        sqlstate := '22025';
    -20, 200, -1 :
        sqlstate := '23000';
    -25, -803, 250 (* -1 *) :
        sqlstate := '23000';
    -30, 300, -1402 :
        sqlstate := '23000';
    -35, -530, 350 :
        sqlstate := '23000';
    -4000 :
        sqlstate := '24000';
    -6003 :
        sqlstate := '24000';
    -7026 :
        sqlstate := '24000';
    -880 :
        sqlstate := '26000';
    -50, -51, -913, 500 :
        sqlstate := '40001';
    -60, -911, 600 :
        sqlstate := '40001';
    -70, 700 :
        sqlstate := '40003';
    -1006 :
        sqlstate := '42000';
    -1015 :
        sqlstate := '42000';
    -1200 :
        sqlstate := '42000';
    -1201 :
        sqlstate := '42000';
    -2004 :
        sqlstate := '42000';
    -2014 :
        sqlstate := '42000';
    -3002 :
        sqlstate := '42000';
    -3005 :
        sqlstate := '42000';
    -3008 :
        sqlstate := '42000';
    -3009 :
        sqlstate := '42000';
    -3014 :
        sqlstate := '42000';
    -3017 :
        sqlstate := '42000';
    -4004, -942 :
        sqlstate := '42000';
    -4005 :
        sqlstate := '42000';
    -5001 :
        sqlstate := '42000';
    -5004 :
        sqlstate := '42000';
    -5006 :
        sqlstate := '42000';
    -5007 :
        sqlstate := '42000';
    -5008 :
        sqlstate := '42000';
    -5009 :
        sqlstate := '42000';
    -5010 :
        sqlstate := '42000';
    -5015 :
        sqlstate := '42000';
    -5016 :
        sqlstate := '42000';
    -7006 :
        sqlstate := '42000';
    -7016 :
        sqlstate := '42000';
    -7018 :
        sqlstate := '42000';
    -8017 :
        sqlstate := '42000';
    -8028 :
        sqlstate := '42000';
    -32, 320 (* -1402 *) :
        sqlstate := '44000';
    OTHERWISE
        IF  ((returncode >= -9799) AND
            ( returncode <= -9001))
            OR (returncode = -602)
        THEN
            BEGIN
            sp03sqlstate_value (returncode, sqlstate);
            sqlstate[ 1 ] := 'S'
            END
        ELSE
            IF  (returncode <= -30000) OR
                (returncode >= 30000)
            THEN
                BEGIN
                (* Gateway-errors *)
                retcode := abs(returncode) - 30000;
                sp03sqlstate_value (returncode, sqlstate);
                sqlstate[ 1 ] := 'Q'
                END
            ELSE
                IF  (returncode <= -20000) OR
                    (returncode >= 20000)
                THEN
                    BEGIN
                    retcode := abs(returncode) - 20000;
                    sp03sqlstate_value (returncode, sqlstate);
                    sqlstate[ 1 ] := 'P'
                    END
                ELSE
                    IF  (returncode <= -10000) OR
                        (returncode >= 10000)
                    THEN
                        BEGIN
                        retcode := abs(returncode) - 10000;
                        sp03sqlstate_value (returncode, sqlstate);
                        sqlstate[ 1 ] := 'O'
                        END
                    ELSE
                        BEGIN
                        sp03sqlstate_value (returncode, sqlstate);
                        sqlstate[ 1 ] := 'I'
                        END
                    (*ENDIF*) 
                (*ENDIF*) 
            (*ENDIF*) 
        (*ENDIF*) 
    END
(*ENDCASE*) 
END;
 
(*------------------------------*) 
 
FUNCTION
      s03severe_error (returncode : tsp00_Int2) : boolean;
 
VAR
      severe_kernel_error : boolean;
 
BEGIN
severe_kernel_error := false;
(* the following errors are not included in list of severe errors   *)
(* because one/many NIST-tests will result in 'NOGO'                *)
(*    -5005, MISSING COLUMN, NULL VALUE NOT ALLOWED ; sdl012,cdr004 *)
(*    -3061, INVALID ESCAPE VALUE                   ; dml082        *)
(*    -3060, INVALID ESCAPE SEQUENCE                ; dml082        *)
(*    -8004, CONSTANT MUST BE COMPATIBLE                            *)
(*                   WITH COLUMN TYPE AND LENGTH    : dml083        *)
CASE returncode OF
    (* something is really wrong *)
    -8048, (* VERSION OF COMPONENT MUST BE COMPATIBLE WITH KERNEL VERSION *)
    -8001, (* USER MUST BE CONNECTED *)
    (* Syntax and syntax-like *)
    -9000, (* SYSTEM ERROR NOT_YET IMPLEMENTED *)
    -8888, (* SERVERDB NOT ACCESSIBLE *)
    -8047, (* PASSWORD REQUIRED *)
    -8034, (* ORDER COLUMN MUST BE NUMBER *)
    -8031, (* OWNER MUST BE SPECIFIED *)
    -8023, (* COSTLIMIT MUST BE GREATER THAN COSTWARNING *)
    -8017, (* COLUMN MUST BE GROUP COLUMN *)
    -8014, (* RESULT TABLE MUST BE FOR REUSE *)
    -8013, (* ORDER COLUMN MUST BE OUTPUT COLUMN *)
    -8010, (* TABLE NAME MUST BE IN FROM LIST *)
    -8009, (* DEFAULT VALUE MUST BE IN CONSTRAINT SPECIFICATION *)
    -8005, (* VALUE EXPRESSION MUST BE PARAMETER NAME *)
    -7074, (* CYCLE IN GRANTED ROLES NOT ALLOWED *)
    -7073, (* FEATURE NOT ALLOWED IN REPLICATED TABLE DEFINITION *)
    -7072, (* MORE THAN ONE COLUMN WITH DEFAULT SERIAL NOT ALLOWED *)
    -7068, (* OUTER JOIN NOT ALLOWED IN THIS CONTEXT *)
    -7064, (* FEATURE NOT ALLOWED IN TEMP TABLE DEFINITION *)
    -7063, (* TEMP TABLE NOT ALLOWED *)
    -7058, (* CORRELATED SUBQUERY WITH SELECT IN FROM CLAUSE NOT ALLOWED *)
    -7056, (* SUBQUERY NOT ALLOWED *)
    -7054, (* PARAMETER IN PARSING EXPLAIN NOT ALLOWED *)
    -7052, (* SINGLE SELECT NOT ALLOWED *)
    -7046, (* COLUMN WITH LENGTH GREATER THAN 254 NOT ALLOWED *)
    -7045, (* PARAMETER SPEC NOT ALLOWED *)
    -7043, (* GROUP MEMBER NOT ALLOWED *)
    -7036, (* ROWNO SPECIFICATION NOT ALLOWED IN THIS CONTEXT *)
    -7034, (* PERMLIMIT FOR STANDARD USER NOT ALLOWED *)
    -7032, (* SQL STATEMENT NOT ALLOWED FOR COLUMN OF DATA TYPE LONG *)
    -7031, (* CONSTRAINT OR DEFAULT FOR DATA TYPE LONG NOT ALLOWED *)
    -7029, (* FUNCTION NOT ALLOWED FOR THIS DATA TYPE *)
    -7022, (* COLUMNS OF MORE THAN ONE TABLE NOT ALLOWED *)
    -7021, (* VIEW COLUMN DERIVED FROM FUNCTION NOT ALLOWED *)
    -7019, (* FEATURE NOT ALLOWED IN VIEW DEFINITION *)
    -7018, (* VARIABLE NOT ALLOWED IN VIEW *)
    -7016, (* PARAMETER SPEC NOT ALLOWED IN THIS CONTEXT *)
    -7011, (* CORRELATED SUBQUERY NOT ALLOWED *)
    -7006, (* RESERVED IDENTIFIER NOT ALLOWED *)
    -7005, (* LOWER BOUND GREATER THAN UPPER BOUND NOT ALLOWED *)
    -7004, (* DEFAULT NOT ALLOWED *)
    -7003, (* NOT NULL NOT ALLOWED *)
    -7002, (* KEY NOT ALLOWED *)
    -6016, (* DUPLICATE FORMAT CODE *)
    -6009, (* DUPLICATE REFERENCE NAME *)
    -6007, (* DUPLICATE ORDER COLUMN *)
    -6002, (* DUPLICATE PRIVILEGE *)
    -5016, (* MISSING DELIMITER *)
    -5015, (* MISSING KEYWORD *)
    -5013, (* MISSING UPDATE COLUMN *)
    -5012, (* MISSING DEFINITE TABLE NAME *)
    -5011, (* MISSING INDEX VALUE SPECIFICATION *)
    -5010, (* MISSING VALUE SPECIFICATION *)
    -5009, (* MISSING INTEGER *)
    -5008, (* MISSING STRING CONSTANT *)
    -5007, (* MISSING NUMERIC CONSTANT *)
    -5006, (* MISSING IDENTIFIER *)
    -5004, (* MISSING CONSTANT *)
    -3995, (* INVALID PATTERN *)
    -3103, (* INVALID SEQUENCE DEFINITION *)
    -3067, (* INVALID TIMEZONE *)
    -3063, (* INVALID FORMAT CODE *)
    -3062, (* INVALID MONTH *)
    -3059, (* INVALID DAY OF WEEK *)
    -3044, (* INVALID PERMLIMIT SIZE *)
    -3022, (* INVALID NUMBER OF TABLES FOR OUTER JOIN *)
    -3021, (* INVALID MIXTURE OF FUNCTIONS AND COLUMNS *)
    -3020, (* INVALID LENGTH FOR THIS DATA TYPE *)
    -3018, (* INVALID NUMERIC PARAMETER *)
    -3017, (* INVALID UNSIGNED INTEGER *)
    -3014, (* INVALID END OF SQL STATEMENT *)
    -3011, (* INVALID COLUMN NAME *)
    -3009, (* INVALID TABLE NAME *)
    -3008, (* INVALID KEYWORD OR MISSING DELIMITER *)
    -3005, (* INVALID SQL STATEMENT *)
    -3003, (* INVALID USER NAME *)
    -3002, (* INVALID DATATYPE *)
    -2014, (* IDENTIFIER TOO LONG *)
    -1017, (* TOO MANY JOINS *)
    -1014, (* TOO MANY SOURCE TABLES *)
    -1013, (* TOO MANY ORDER COLUMNS *)
    -1011, (* TOO MANY CORRELATED TABLES *)
    -1006, (* TOO MANY VARIABLES *)
    -1005, (* TOO MANY MONADIC OPERATORS *)
    -1004, (* TOO MANY CORRELATED COLUMNS *)
    (* semantics *)
    (* may be ok after CREATE TABLE or so *)
    -8040, (* PRIMARY KEY DOES NOT EXIST *)
    -8032, (* TABLE MUST BE A SNAPSHOT TABLE *)
    -8025, (* TABLE MUST BE TEMP TABLE *)
    -8016, (* TABLE MUST BE A VIEW TABLE *)
    -8015, (* TABLE MUST BE A BASE TABLE *)
    -7070, (* SNAPSHOT BASED ON SNAPSHOT NOT ALLOWED *)
    -7061, (* LOCK ROW FOR THIS TABLE NOT ALLOWED *)
    -7057, (* VIEW DEFINITION CONTRADICTS NEW TABLE DEFINITION *)
    -6015, (* DUPLICATE SEQUENCE DEFINITION *)
    -1755, (* SQL STATEMENT WILL DROP FURTHER OBJECTS (USE CASCADE) *)
    (* may be ok after ALTER TABLE or so *)
    -8035, (* FOREIGN KEY MUST EXIST *)
    -8030, (* COLUMN MUST BE INDEXED *)
    -8028, (* UNION COLUMNS MUST BE COMPATIBLE *)
    -8021, (* COLUMN MUST HAVE DEFAULT SPECIFICATION *)
    -8007, (* COLUMN MUST BE KEY COLUMN *)
    -8006, (* DATA TYPES MUST BE COMPATIBLE *)
    -7066, (* UNIQUE INDEX REFERENCED BY FOREIGN KEY NOT ALLOWED *)
    -7051, (* READ ONLY VIEW WITH CHECK OPTION NOT ALLOWED *)
    -7040, (* REFERENTIAL CONSTRAINT NOT ALLOWED *)
    -7039, (* CYCLE IN REFERENTIAL CONSTRAINT DEFINITION NOT ALLOWED *)
    -7038, (* FOREIGN KEY COLUMN NOT ALLOWED *)
    -7037, (* NULL VALUE FOR NOT NULL COLUMN NOT ALLOWED *)
    -7035, (* DEFAULT SPECIFICATION NOT ALLOWED FOR THIS COLUMN *)
    -7023, (* DROPPING OF ALL COLUMNS NOT ALLOWED *)
    -7009, (* NULL VALUE IN KEY COLUMN NOT ALLOWED *)
    -7007, (* KEY COLUMN NOT ALLOWED *)
    -6001, (* DUPLICATE COLUMN NAME *)
    -5014, (* MISSING DEFINITE COLUMN NAME *)
    -5003, (* MISSING KEY SPECIFICATION *)
    -3051, (* INVALID CACHELIMIT VALUE *)
    -3046, (* INVALID CHAR POSITION IN STRING FUNCTION *)
    -3016, (* INVALID NUMERIC CONSTANT *)
    -2013, (* SELECT COLUMN LIST TOO LONG *)
    -2012, (* VIEW COLUMN LIST TOO LONG *)
    -2009, (* JOIN COLUMNS ARE TOO LONG *)
    -2004, (* NUMERIC CONSTANT TOO LONG *)
    -2003, (* OUTPUT COLUMNS ARE TOO LONG *)
    -2002, (* ONE OUTPUT COLUMN TOO LONG *)
    -2001, (* KEY IS TOO LONG *)
    -2000, (* ROW IS TOO LONG *)
    -1754, (* A TABLE MAY CONTAIN ONLY ONE COLUMN OF TYPE LONG *)
    -1201, (* TOO FEW COLUMNS *)
    -1200, (* TOO FEW VALUES *)
    -1103, (* TOO COMPLICATED SQL STATEMENT *)
    -1102, (* TOO COMPLICATED SQL STATEMENT (TOO MANY SUBQUERIES) *)
    -1101, (* TOO COMPLICATED SQL STATEMENT (BUFFER LIMIT) *)
    -1026, (* TOO MANY DIFFERENCES BETWEEN OLD AND NEW VIEW DEFINITION *)
    -1012, (* TOO MANY REFERENTIAL CONSTRAINT DEFINITIONS FOR THIS TABLE *)
    -1002, (* TOO MANY COLUMNS *)
    -9999 :
        severe_kernel_error := true;
    OTHERWISE
        BEGIN
        IF  returncode < -9000
        THEN
            severe_kernel_error := true;
        (*ENDIF*) 
        END
    END;
(*ENDCASE*) 
s03severe_error := severe_kernel_error
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
*-PRETTY-*  statements    :        110
*-PRETTY-*  lines of code :        442        PRETTYX 3.10 
*-PRETTY-*  lines in file :        544         1997-12-10 
.PA 
