* Standard COBOL (file "MPA006.SCO") calling SQL * procedures in file "MPA006.MCO". * STANDARD COBOL (file "MPA006.SCO")
**************************************************************** * * COMMENT SECTION * * DATE 1992/07/16 STANDARD COBOL LANGUAGE * NIST SQL VALIDATION TEST SUITE V6.0 * DISCLAIMER: * This program was written by employees of NIST to test SQL * implementations for conformance to the SQL standards. * NIST assumes no responsibility for any party's use of * this program. * * MPA006.SCO * WRITTEN BY: David W. Flater, based on MPA004 * * THIS ROUTINE TESTS THE SQLSTATE STATUS CODE. * * This is part A of a two-part (A & B) program. * * REFERENCES * ANSI SQL-1992 * 22.1 SQLSTATE * ****************************************************************
DISPLAY"*** This program is part A of a two-part" DISPLAY"*** program (A & B)."
DISPLAY" This is Program A which starts first and
- " waits.... "
.
P100. * -----Initialization----- MOVE 0 TO code1 * EXEC SQL DELETE FROM MP6_AA; CALL"SUB2"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then MOVE 1 TO code1 END-IF * EXEC SQL DELETE FROM MP6_NEXTKEY; CALL"SUB3"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then MOVE 1 TO code1 END-IF * EXEC SQL DELETE FROM MP6_NN; CALL"SUB4"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then MOVE 1 TO code1 END-IF * EXEC SQL DELETE FROM MP6_MM2; CALL"SUB5"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then MOVE 1 TO code1 END-IF * EXEC SQL INSERT * INTO MP6_NEXTKEY (KEYNUM,AUTHOR) * VALUES (1,'A'); CALL"SUB6"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF * EXEC SQL INSERT INTO MP6_NN * VALUES ( 1); CALL"SUB7"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF * EXEC SQL INSERT INTO MP6_MM2 * VALUES ( 100); CALL"SUB8"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF
if (code1 = 1) then DISPLAY"*****Error initializing tables ****" * EXEC SQL ROLLBACK WORK; CALL"SUB9"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD GOTO P100 END-IF
* EXEC SQL COMMIT WORK; CALL"SUB10"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then DISPLAY"*********Setup will not commit ********" * EXEC SQL ROLLBACK WORK; CALL"SUB11"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD GOTO P100 END-IF
* -----Synchronization-----
DISPLAY" PLEASE start program MPB006!!! "
.
P105. *pause a little *increase value of variable pauze if MPB006 has trouble * getting table MP6_NEXTKEY. MOVE 0 TO i
.
P106. * EXEC SQL UPDATE MP6_NN * SET NUMTEST = 1; CALL"SUB12"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD COMPUTE i = i + 1 if (i < pauze) then GOTO P106 END-IF *end of pause
MOVE 0 TO knum * EXEC SQL SELECT COUNT(*) * INTO :knum * FROM MP6_NEXTKEY WHERE AUTHOR = 'B'; CALL"SUB13"USING SQLCODE SQLSTATE knum MOVE SQLCODE TO SQL-COD
if (knum = 0) then DISPLAY" PLEASE start program MPB006!!! " GOTO P105 END-IF
*YES, we are in sync!
DISPLAY"Transaction A Starts!! " *date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME DISPLAY" " DISPLAY"IF this test lasts too long, DEADLOCK" DISPLAY"has taken place, STOP this test!"
*** The attack begins here. **
*Rollback detection--HOPE that this doesn't fail. * EXEC SQL INSERT INTO MP6_AA VALUES (1); CALL"SUB15"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then DISPLAY"**** --> FATAL ERROR: Failure within rollback
- " detection" DISPLAY"Aborting test--try rerunning." COMPUTE errcnt = errcnt + 1 * EXEC SQL ROLLBACK WORK; CALL"SUB16"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD GOTO P193 END-IF
* EXEC SQL SELECT NUMTEST * INTO :who1 * FROM MP6_NN; CALL"SUB17"USING SQLCODE SQLSTATE who1 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then GOTO P198 END-IF
*MP6_NN UPDATE loop MOVE 0 TO i
.
P111. * EXEC SQL UPDATE MP6_NN * SET NUMTEST = NUMTEST + 3; CALL"SUB18"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then GOTO P198 END-IF COMPUTE i = i + 1 if (i < tranct) then GOTO P111 END-IF
* EXEC SQL SELECT NUMTEST INTO :who2 FROM MP6_MM2; CALL"SUB19"USING SQLCODE SQLSTATE who2 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then GOTO P198 END-IF
*MP6_MM2 UPDATE loop MOVE 0 TO i
.
P112. * EXEC SQL UPDATE MP6_MM2 * SET NUMTEST = NUMTEST + 5; CALL"SUB20"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then GOTO P198 END-IF COMPUTE i = i + 1 if (i < 4) then GOTO P112 END-IF
* EXEC SQL SELECT NUMTEST INTO :rslt1 FROM MP6_NN; CALL"SUB21"USING SQLCODE SQLSTATE rslt1 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then GOTO P198 END-IF * EXEC SQL SELECT NUMTEST INTO :rslt2 FROM MP6_MM2; CALL"SUB22"USING SQLCODE SQLSTATE rslt2 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then GOTO P198 END-IF
* EXEC SQL COMMIT WORK; CALL"SUB23"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD *Did we get rolled back when we tried to commit? if (SQLCODE NOT = 0) then GOTO P198 END-IF
*** The attack is over. **
DISPLAY" " *date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME DISPLAY"MPA006 was not victimized. Look for a
- " ??DEADLOCK??" DISPLAY"message from MPB006. If there isn't one, rerun" DISPLAY"the test after increasing the value of variable" DISPLAY"tranct. If the implementation under test
- " transparently" DISPLAY"serializes all transactions, it will not be
- " possible to" DISPLAY"generate a negative SQLCODE regardless of the
- " value of tranct."
GOTO P193
.
P198. *We got a negative SQLCODE. *Was this transaction rollback or statement error?
MOVE SQLCODE TO ii MOVE SQLSTATE TO SQLST1
DISPLAY" " DISPLAY"!+!+!+!+!+!+!+!+ DEADLOCK? !+!+!+!+!+!+!+!+!+!+!" DISPLAY"Negative SQLCODE (Deadlock?) was returned earlier" DISPLAY"!+!+!+!+!+!+!+!+ DEADLOCK? !+!+!+!+!+!+!+!+!+!+!" *date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME DISPLAY" SQLCODE is ", ii DISPLAY" SQLSTATE is ", SQLST1 DISPLAY" SQLSTATE has been saved into variable SQLST1."
*Was the whole transaction rolled back or was it just a *single statement failure? DISPLAY" " DISPLAY"SELECT COUNT(*) INTO :rollflg FROM MP6_AA" DISPLAY" WHERE ANUM = 1;" DISPLAY"ROLLBACK WORK;" * EXEC SQL SELECT COUNT(*) INTO :rollflg FROM MP6_AA * WHERE ANUM = 1; CALL"SUB24"USING SQLCODE SQLSTATE rollflg MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then DISPLAY"**** --> FATAL ERROR: Failure within rollback
- " detection" DISPLAY"Aborting test--try rerunning." COMPUTE errcnt = errcnt + 1 * EXEC SQL ROLLBACK WORK; CALL"SUB25"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD GOTO P193 END-IF * EXEC SQL ROLLBACK WORK; CALL"SUB26"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD DISPLAY"rollflg is ", rollflg
DISPLAY"rollflg = 0 Transaction was rolled back" DISPLAY"rollflg = 1 Transaction was not rolled back" DISPLAY"otherwise Database error, automatic fail" DISPLAY" " DISPLAY"If SQLST1 is x (never set), fail.
- " Else:" DISPLAY"If rollback and SQLST1 is 40001, pass.
- " Else:" DISPLAY"If rollback and SQLST1 is not 40001, fail.
- " Else:" DISPLAY"If no rollback and SQLST1 is 40xxx, fail.
- " Else:" DISPLAY"If SQLST1 is 00xxx or 01xxx (completion), fail
- " Else:" DISPLAY"For other SQLST1 values " DISPLAY" (we assume DBMS LOCK ERROR), pass!" DISPLAY"We may be persuaded that other SQLST1 values" DISPLAY"in the range 40xxx pass for a rollback. Call
- " NIST!"
*If we got a statement rollback, SQLSTATE cannot be 40xxx *since this indicates a transaction rollback; neither can *it be 00xxx (success) or 01xxx (warning) since these are *completion conditions and are incompatible with getting *a negative SQLCODE.
if (SQLST1 = "x") then GOTO P192 END-IF if (SQLST1 = "40001"AND rollflg = 0) then GOTO P191 END-IF if (rollflg = 0) then GOTO P192 END-IF if (SQLST1 > "40 "AND SQLST1 < "41 ") then GOTO P192 END-IF if (SQLST1 > "00 "AND SQLST1 < "02 ") then GOTO P192 END-IF
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.