summaryrefslogtreecommitdiff
path: root/innobase/btr/ts/tscli.c
diff options
context:
space:
mode:
Diffstat (limited to 'innobase/btr/ts/tscli.c')
-rw-r--r--innobase/btr/ts/tscli.c3380
1 files changed, 0 insertions, 3380 deletions
diff --git a/innobase/btr/ts/tscli.c b/innobase/btr/ts/tscli.c
deleted file mode 100644
index 6c42a83cdbe..00000000000
--- a/innobase/btr/ts/tscli.c
+++ /dev/null
@@ -1,3380 +0,0 @@
-/************************************************************************
-Tests for the client, TPC-C, and TPC-D Query 5
-
-(c) 1996-1998 Innobase Oy
-
-Created 2/16/1996 Heikki Tuuri
-*************************************************************************/
-
-#include "univ.i"
-#include "ib_odbc.h"
-#include "mem0mem.h"
-#include "sync0sync.h"
-#include "os0thread.h"
-#include "os0proc.h"
-#include "os0sync.h"
-#include "srv0srv.h"
-
-ulint n_exited = 0;
-
-/* Disk wait simulation array */
-typedef struct srv_sim_disk_struct srv_sim_disk_t;
-struct srv_sim_disk_struct{
- os_event_t event; /* OS event to wait */
- bool event_set;/* TRUE if the event is in the set state */
- bool empty; /* TRUE if this cell not reserved */
-};
-
-#define SRV_N_SIM_DISK_ARRAY 150
-
-srv_sim_disk_t srv_sim_disk[SRV_N_SIM_DISK_ARRAY];
-
-/* Random counter used in disk wait simulation */
-ulint srv_disk_rnd = 982364761;
-ulint srv_disk_n_active_threads = 0;
-
-char cli_srv_endpoint_name[100];
-char cli_user_name[100];
-
-ulint n_warehouses = ULINT_MAX;
-ulint n_customers_d = ULINT_MAX;
-bool is_tpc_d = FALSE;
-ulint n_rounds = ULINT_MAX;
-ulint n_users = ULINT_MAX;
-ulint startdate = 0;
-ulint enddate = 0;
-bool own_warehouse = FALSE;
-
-ulint mem_pool_size = ULINT_MAX;
-
-/*********************************************************************
-Test for TPC-C. */
-
-ulint
-test_init(
-/*======*/
- void* arg)
-{
- HENV env;
- HDBC conn;
- RETCODE ret;
- HSTMT stat;
- HSTMT create_query;
- HSTMT populate_query;
- char* str;
- char* str1;
- char* str2;
- char* str3;
- char* str4;
- char* str5;
- char* str6;
- char* create_str;
- char* populate_str;
- char* commit_str;
- char* new_order_str;
- char* payment_str;
- char* order_status_str;
- char* delivery_str;
- char* stock_level_str;
- char* consistency_str;
- char* query_5_str;
- char* print_str;
- char* lock_wait_str;
- char* join_test_str;
- char* test_errors_str;
- char* test_group_commit_str;
- char* test_single_row_select_str;
- char* rollback_str;
- char* ibuf_test_str;
- SDWORD n_warehouses_buf;
- SDWORD n_warehouses_len;
- SDWORD n_customers_d_buf;
- SDWORD n_customers_d_len;
-
- UT_NOT_USED(arg);
-
- /*------------------------------------------------------*/
-
- str1 =
-
-" PROCEDURE CREATE_TABLES () IS"
-" BEGIN"
-" CREATE TABLE WAREHOUSE (W_ID CHAR, W_NAME CHAR,"
-" W_STREET_1 CHAR, W_STREET_2 CHAR,"
-" W_CITY CHAR,"
-" W_STATE CHAR, W_ZIP CHAR,"
-" W_TAX INT,"
-" W_YTD_HIGH INT,"
-" W_YTD INT);"
-""
-" CREATE UNIQUE CLUSTERED INDEX W_IND ON WAREHOUSE (W_ID);"
-""
-" CREATE TABLE DISTRICT (D_ID CHAR, D_W_ID CHAR,"
-" D_NAME CHAR,"
-" D_STREET_1 CHAR, D_STREET_2 CHAR,"
-" D_CITY CHAR,"
-" D_STATE CHAR, D_ZIP CHAR,"
-" D_TAX INT,"
-" D_YTD_HIGH INT,"
-" D_YTD INT,"
-" D_NEXT_O_ID INT);"
-""
-" CREATE UNIQUE CLUSTERED INDEX D_IND ON DISTRICT (D_W_ID, D_ID);"
-""
-" CREATE TABLE CUSTOMER (C_ID CHAR, C_D_ID CHAR, C_W_ID CHAR,"
-" C_FIRST CHAR, C_MIDDLE CHAR,"
-" C_LAST CHAR,"
-" C_STREET_1 CHAR, C_STREET_2 CHAR,"
-" C_CITY CHAR,"
-" C_STATE CHAR, C_ZIP CHAR,"
-" C_PHONE CHAR,"
-" C_SINCE_TIME INT,"
-" C_SINCE INT,"
-" C_CREDIT CHAR,"
-" C_CREDIT_LIM_HIGH INT,"
-" C_CREDIT_LIM INT,"
-" C_DISCOUNT INT,"
-" C_BALANCE_HIGH INT,"
-" C_BALANCE INT,"
-" C_YTD_PAYMENT_HIGH INT,"
-" C_YTD_PAYMENT INT,"
-" C_PAYMENT_CNT INT,"
-" C_DELIVERY_CNT INT,"
-" C_DATA CHAR) /*DOES_NOT_FIT_IN_MEMORY*/;"
-""
-" CREATE UNIQUE CLUSTERED INDEX C_IND ON CUSTOMER (C_W_ID, C_D_ID,"
-" C_ID);"
-""
-" CREATE INDEX C_LAST_IND ON CUSTOMER (C_W_ID, C_D_ID, C_LAST,"
-" C_FIRST);"
-""
-" CREATE TABLE HISTORY (H_C_ID CHAR, H_C_D_ID CHAR, H_C_W_ID CHAR,"
-" H_D_ID CHAR, H_W_ID CHAR,"
-" H_DATE INT,"
-" H_AMOUNT INT,"
-" H_DATA CHAR);"
-""
-" CREATE CLUSTERED INDEX H_IND ON HISTORY (H_W_ID);"
-""
-" CREATE TABLE NEW_ORDER (NO_O_ID INT,"
-" NO_D_ID CHAR,"
-" NO_W_ID CHAR);"
-""
-" CREATE UNIQUE CLUSTERED INDEX NO_IND ON NEW_ORDER (NO_W_ID, NO_D_ID,"
-" NO_O_ID);"
- ;
-
- str2 =
-
-" CREATE TABLE ORDERS (O_ID INT, O_D_ID CHAR, O_W_ID CHAR,"
-" O_C_ID CHAR,"
-" O_ENTRY_D INT,"
-" O_CARRIER_ID INT,"
-" O_OL_CNT INT,"
-" O_ALL_LOCAL CHAR);"
-""
-" CREATE UNIQUE CLUSTERED INDEX O_IND ON ORDERS (O_W_ID, O_D_ID,"
-" O_ID);"
-" CREATE INDEX O_C_IND ON ORDERS (O_W_ID, O_D_ID, O_C_ID);"
-""
-" CREATE TABLE ORDER_LINE (OL_O_ID INT, OL_D_ID CHAR, OL_W_ID CHAR,"
-" OL_NUMBER CHAR,"
-" OL_I_ID CHAR,"
-" OL_SUPPLY_W_ID CHAR,"
-" OL_DELIVERY_D INT,"
-" OL_QUANTITY INT,"
-" OL_AMOUNT INT,"
-" OL_DIST_INFO CHAR);"
-""
-" CREATE UNIQUE CLUSTERED INDEX OL_IND ON ORDER_LINE"
-" (OL_W_ID, OL_D_ID, OL_O_ID, OL_NUMBER);"
-""
-" CREATE TABLE ITEM (I_ID CHAR, I_IM_ID CHAR, I_NAME CHAR,"
-" I_PRICE INT,"
-" I_DATA CHAR);"
-""
-" CREATE UNIQUE CLUSTERED INDEX I_IND ON ITEM (I_ID);"
-""
-" CREATE TABLE STOCK (S_I_ID CHAR,"
-" S_W_ID CHAR,"
-" S_QUANTITY INT,"
-" S_DIST_01 CHAR,"
-" S_DIST_02 CHAR,"
-" S_DIST_03 CHAR,"
-" S_DIST_04 CHAR,"
-" S_DIST_05 CHAR,"
-" S_DIST_06 CHAR,"
-" S_DIST_07 CHAR,"
-" S_DIST_08 CHAR,"
-" S_DIST_09 CHAR,"
-" S_DIST_10 CHAR,"
-" S_YTD INT,"
-" S_ORDER_CNT INT,"
-" S_REMOTE_CNT INT,"
-" S_DATA CHAR) /*DOES_NOT_FIT_IN_MEMORY*/;"
-""
-" CREATE UNIQUE CLUSTERED INDEX S_IND ON STOCK (S_W_ID, S_I_ID);"
-""
-""
-" CREATE TABLE REGION (R_REGIONKEY INT, R_NAME CHAR, R_COMMENT CHAR);"
-""
-" CREATE UNIQUE CLUSTERED INDEX R_IND ON REGION (R_REGIONKEY);"
-""
-" CREATE TABLE NATION (N_NATIONKEY INT, N_NAME CHAR, N_REGIONKEY INT,"
-" N_COMMENT CHAR);"
-" CREATE UNIQUE CLUSTERED INDEX N_IND ON NATION (N_NATIONKEY);"
-""
-" CREATE TABLE NATION_2 (N2_NATIONKEY INT, N2_NAME CHAR,"
-" N2_REGIONKEY INT, N2_COMMENT CHAR);"
-" CREATE UNIQUE CLUSTERED INDEX N2_IND ON NATION_2 (N2_NAME);"
-""
-" CREATE TABLE SUPPLIER (S_SUPPKEY INT, S_NAME CHAR, S_ADDRESS CHAR,"
-" S_NATIONKEY INT, S_PHONE CHAR,"
-" S_ACCTBAL INT, S_COMMENT CHAR);"
-" CREATE UNIQUE CLUSTERED INDEX SU_IND ON SUPPLIER (S_SUPPKEY);"
-""
-" CREATE TABLE CUSTOMER_D (C_CUSTKEY INT, C_NAME CHAR, C_ADDRESS CHAR,"
-" C_NATIONKEY INT, C_PHONE CHAR,"
-" C_ACCTBAL INT, C_MKTSEGMENT CHAR,"
-" C_COMMENT CHAR);"
-" CREATE UNIQUE CLUSTERED INDEX CU_IND ON CUSTOMER_D (C_CUSTKEY);"
-""
-" CREATE TABLE ORDERS_D (O_ORDERKEY INT, O_CUSTKEY INT,"
-" O_ORDERSTATUS CHAR, O_TOTALPRICE INT,"
-" O_ORDERDATE INT,"
-" O_ORDERPRIORITY CHAR,"
-" O_CLERK CHAR, O_SHIPPRIORITY INT,"
-" O_COMMENT CHAR);"
-""
-" CREATE UNIQUE CLUSTERED INDEX OR_IND ON ORDERS_D (O_ORDERKEY);"
-""
-" CREATE INDEX OR_D_IND ON ORDERS_D (O_ORDERDATE, O_ORDERKEY,"
-" O_CUSTKEY);"
-""
-" CREATE TABLE LINEITEM (L_ORDERKEY INT, L_PARTKEY INT, L_SUPPKEY INT,"
-" L_LINENUMBER INT, L_QUANTITY INT,"
-" L_EXTENDEDPRICE INT,"
-" L_DISCOUNT INT, L_TAX INT,"
-" L_RETURNFLAG CHAR,"
-" L_LINESTATUS CHAR,"
-" L_SHIPDATE INT, L_COMMITDATE INT,"
-" L_RECEIPTDATE INT,"
-" L_SHIPINSTRUCT CHAR,"
-" L_SHIPMODE CHAR, L_COMMENT CHAR);"
-""
-" CREATE UNIQUE CLUSTERED INDEX L_IND ON LINEITEM (L_ORDERKEY,"
-" L_LINENUMBER);"
-""
-" CREATE TABLE ACCOUNTA (A_NUM INT, A_BAL INT);"
-""
-" CREATE UNIQUE CLUSTERED INDEX ACCOUNTA_IND ON ACCOUNTA (A_NUM);"
-""
-" CREATE TABLE TELLERA (T_NUM INT, T_BAL INT);"
-""
-" CREATE UNIQUE CLUSTERED INDEX TELLERA_IND ON TELLERA (T_NUM);"
-""
-" CREATE TABLE BRANCHA (B_NUM INT, B_BAL INT);"
-""
-" CREATE UNIQUE CLUSTERED INDEX BRANCHA_IND ON BRANCHA (B_NUM);"
-""
-" CREATE TABLE HISTORYA (H_NUM INT, H_TEXT CHAR);"
-""
-" CREATE CLUSTERED INDEX HISTORYA_IND ON HISTORYA (H_NUM);"
-""
-" CREATE TABLE JTEST1 (JT1_A INT, JT1_B INT);"
-""
-" CREATE UNIQUE CLUSTERED INDEX JT_IND1 ON JTEST1 (JT1_A);"
-""
-" CREATE TABLE JTEST2 (JT2_A INT, JT2_B INT);"
-""
-" CREATE UNIQUE CLUSTERED INDEX JT_IND2 ON JTEST2 (JT2_A);"
-""
-" CREATE TABLE IBUF_TEST (IB_A INT, IB_B CHAR) DOES_NOT_FIT_IN_MEMORY;"
-""
-" CREATE UNIQUE CLUSTERED INDEX IBUF_IND ON IBUF_TEST (IB_A);"
-" END;"
- ;
-
- create_str = ut_str_catenate(str1, str2);
- /*-----------------------------------------------------------*/
-
- str1 =
-
-" PROCEDURE POPULATE_TABLES (n_warehouses IN INT, n_customers_d"
-" IN INT) IS"
-""
-" i INT;"
-" j INT;"
-" k INT;"
-" t INT;"
-" string CHAR;"
-" rnd1 INT;"
-" rnd2 INT;"
-" rnd INT;"
-" n_items INT;"
-" n_districts INT;"
-" n_customers INT;"
-""
-" BEGIN"
-""
-"/**********************************************************/"
-" PRINTF('Starting Mikko-test');"
-""
-" FOR i IN 1 .. 5 LOOP"
-" INSERT INTO IBUF_TEST VALUES (i, 'Mikko');"
-" END LOOP;"
-""
-" /* PRINTF('Printing rows from Mikko-test:');"
-""
-" ROW_PRINTF SELECT * FROM IBUF_TEST; */"
-""
-" SELECT SUM(IB_A) INTO t FROM IBUF_TEST;"
-""
-" PRINTF('Sum of 1 to ', i, ' is ', t);"
-" ASSERT(t = (i * (i + 1)) / 2);"
-""
-" ROLLBACK WORK;"
-""
-" PRINTF('Printing rows from Mikko-test after rollback:');"
-""
-" ROW_PRINTF SELECT * FROM IBUF_TEST;"
-""
-"/**********************************************************/"
-" FOR i IN 0 .. 100 LOOP"
-" INSERT INTO ACCOUNTA VALUES (i, i);"
-" INSERT INTO TELLERA VALUES (i, i);"
-" INSERT INTO BRANCHA VALUES (i, i);"
-" INSERT INTO HISTORYA VALUES (i, '12345678901234567890');"
-" END LOOP;"
-""
-" COMMIT WORK;"
-"/**********************************************************/"
-"/* PRINTF('Populating ibuf test tables');"
-" FOR i IN 1 .. 1000 LOOP"
-" INSERT INTO IBUF_TEST VALUES (i, RND_STR(RND(1, 2000)));"
-" END LOOP;"
-" PRINTF('Ibuf test tables populated');"
-" COMMIT WORK; */"
-""
-" n_items := 200;"
-" n_districts := 10;"
-" n_customers := 20;"
-""
-" PRINTF('Starting to populate ITEMs');"
-""
-" FOR i IN 1 .. n_items LOOP"
-" rnd1 := RND(26, 50);"
-" string := RND_STR(rnd1);"
-""
-" IF (RND(0, 99) < 10) THEN"
-" rnd2 := RND(0, rnd1 - 8);"
-" REPLSTR(string, 'ORIGINAL', rnd2, 8);"
-" END IF;"
-""
-" INSERT INTO ITEM VALUES (TO_BINARY(i, 3),"
-" TO_BINARY(RND(1, 10000), 3),"
-" RND_STR(RND(14, 24)),"
-" RND(100, 10000),"
-" string);"
-" END LOOP;"
-" COMMIT WORK;"
-""
-" FOR i IN 1 .. n_warehouses LOOP"
-" COMMIT WORK;"
-" PRINTF('Starting to populate warehouse number ', i);"
-" INSERT INTO WAREHOUSE VALUES (TO_BINARY(i, 2),"
-" RND_STR(RND(6, 10)),"
-" RND_STR(RND(10, 20)),"
-" RND_STR(RND(10, 20)),"
-" RND_STR(RND(10, 20)),"
-" RND_STR(2),"
-" CONCAT(SUBSTR(TO_CHAR(RND(0, 9999)),"
-" 6, 4),"
-" '11111'),"
-" RND(0, 2000),"
-" 0,"
-" 0);"
-" FOR j IN 1 .. n_items LOOP"
-""
-" rnd1 := RND(26, 50);"
-" string := RND_STR(rnd1);"
-""
-" IF (RND(0, 99) < 10) THEN"
-" rnd2 := RND(0, rnd1 - 8);"
-" REPLSTR(string, 'ORIGINAL', rnd2, 8);"
-" END IF; "
-""
-" INSERT INTO STOCK VALUES (TO_BINARY(j, 3),"
-" TO_BINARY(i, 2),"
-" 91,"
-" RND_STR(24),"
-" RND_STR(24),"
-" RND_STR(24),"
-" RND_STR(24),"
-" RND_STR(24),"
-" RND_STR(24),"
-" RND_STR(24),"
-" RND_STR(24),"
-" RND_STR(24),"
-" RND_STR(24),"
-" 0, 0, 0,"
-" string);"
-" END LOOP;"
- ;
-
- str2 =
-" FOR j IN 1 .. n_districts LOOP"
-""
-" /* PRINTF('Starting to populate district number ', j); */"
-" INSERT INTO DISTRICT VALUES (TO_BINARY(j + 47, 1),"
-" TO_BINARY(i, 2),"
-" RND_STR(RND(6, 10)),"
-" RND_STR(RND(10, 20)),"
-" RND_STR(RND(10, 20)),"
-" RND_STR(RND(10, 20)),"
-" RND_STR(2),"
-" CONCAT(SUBSTR("
-" TO_CHAR(RND(0, 9999)),"
-" 6, 4),"
-" '11111'),"
-" RND(0, 2000),"
-" 0,"
-" 0,"
-" 3001);"
-""
-" FOR k IN 1 .. n_customers LOOP"
-""
-" string := 'GC';"
-""
-" IF (RND(0, 99) < 10) THEN"
-" string := 'BC';"
-" END IF;"
-" "
-" INSERT INTO CUSTOMER VALUES ("
-" TO_BINARY(k, 3),"
-" TO_BINARY(j + 47, 1),"
-" TO_BINARY(i, 2),"
-" RND_STR(RND(8, 16)),"
-" 'OE',"
-" CONCAT('NAME',"
-" TO_CHAR(k / 3)),"
-" RND_STR(RND(10, 20)),"
-" RND_STR(RND(10, 20)),"
-" RND_STR(RND(10, 20)),"
-" RND_STR(2),"
-" CONCAT(SUBSTR("
-" TO_CHAR(RND(0, 9999)),"
-" 6, 4),"
-" '11111'),"
-" RND_STR(16),"
-" SYSDATE(), 0,"
-" string,"
-" 0, 5000000,"
-" RND(0, 5000),"
-" 0, 0, 0, 0, 0, 0,"
-" RND_STR(RND(300, 500)));"
- ;
-
- str3 =
-" INSERT INTO HISTORY VALUES ("
-" TO_BINARY(k, 3),"
-" TO_BINARY(j + 47, 1),"
-" TO_BINARY(i, 2),"
-" TO_BINARY(j + 47, 1),"
-" TO_BINARY(i, 2),"
-" SYSDATE(),"
-" 1000,"
-" RND_STR(RND(12, 24)));"
-""
-" rnd1 := RND(5, 15);"
-""
-" INSERT INTO ORDERS VALUES ("
-" k,"
-" TO_BINARY(j + 47, 1),"
-" TO_BINARY(i, 2),"
-" TO_BINARY(k, 3),"
-" SYSDATE(),"
-" RND(1, 10),"
-" rnd1,"
-" '1');"
-""
-" FOR t IN 1 .. rnd1 LOOP"
-" INSERT INTO ORDER_LINE VALUES ("
-" k,"
-" TO_BINARY(j + 47, 1),"
-" TO_BINARY(i, 2),"
-" TO_BINARY(t, 1),"
-" TO_BINARY("
-" RND(1, n_items),"
-" 3),"
-" TO_BINARY(i, 2),"
-" NULL,"
-" 91,"
-" RND(0, 9999),"
-" RND_STR(24));"
-" END LOOP;"
-" END LOOP;"
-" "
-" FOR k IN 1 /* + (2 * n_customers) / 3 */"
-" .. n_customers LOOP"
-" "
-" INSERT INTO NEW_ORDER VALUES ("
-" k,"
-" TO_BINARY(j + 47, 1),"
-" TO_BINARY(i, 2));"
-" END LOOP;"
-" END LOOP;"
-" END LOOP;"
-""
-" COMMIT WORK;"
-""
-" PRINTF('Populating TPC-D tables');"
-""
-" FOR i IN 0 .. 4 LOOP"
-" /* We set the last columns to a long character string, to"
-" reduce latch contention on region and nation database pages."
-" A similar effect could be achieved by setting the page"
-" fillfactor in these tables low. */"
-""
-" INSERT INTO REGION VALUES (i, CONCAT('Region', TO_CHAR(i),"
-" ' '),"
-" RND_STR(1500 + RND(1, 152)));"
-" FOR j IN i * 5 .. i * 5 + 4 LOOP"
-" INSERT INTO NATION VALUES (j,"
-" CONCAT('Nation', TO_CHAR(j),"
-" ' '),"
-" i, RND_STR(1500 + RND(1, 152)));"
-" INSERT INTO NATION_2 VALUES (j,"
-" CONCAT('Nation', TO_CHAR(j),"
-" ' '),"
-" i, RND_STR(1500 + RND(1, 152)));"
-" END LOOP;"
-" END LOOP;"
-""
-" COMMIT WORK;"
-""
-" FOR i IN 0 .. n_customers_d / 15 LOOP"
-" INSERT INTO SUPPLIER VALUES (i,"
-" CONCAT('Supplier', TO_CHAR(i)),"
-" RND_STR(RND(20, 30)),"
-" RND(0, 24),"
-" RND_STR(15),"
-" RND(1, 1000),"
-" RND_STR(RND(40, 80)));"
-" END LOOP;"
-""
-" COMMIT WORK;"
-""
-" FOR i IN 0 .. n_customers_d - 1 LOOP"
-" IF ((i / 100) * 100 = i) THEN"
-" COMMIT WORK;"
-" PRINTF('Populating customer ', i);"
-" END IF;"
-""
-" INSERT INTO CUSTOMER_D VALUES (i,"
-" CONCAT('Customer', TO_CHAR(i)),"
-" RND_STR(RND(20, 30)),"
-" RND(0, 24),"
-" RND_STR(15),"
-" RND(1, 1000),"
-" RND_STR(10),"
-" RND_STR(RND(50, 100)));"
-""
-" FOR j IN i * 10 .. i * 10 + 9 LOOP"
-""
-" rnd := (j * 2400) / (10 * n_customers_d);"
-""
-" INSERT INTO ORDERS_D VALUES (j,"
-" 3 * RND(0, (n_customers_d / 3) - 1)"
-" + RND(1, 2),"
-" 'F', 1000,"
-" rnd,"
-" RND_STR(10),"
-" CONCAT('Clerk', TO_CHAR(RND(0, 1000))),"
-" 0, RND_STR(RND(3, 7)));"
-""
-" FOR k IN 0 .. RND(0, 6) LOOP"
-" INSERT INTO LINEITEM VALUES (j,"
-" RND(1, 1000),"
-" RND(0, n_customers_d / 15),"
-" k,"
-" RND(1, 50),"
-" 100,"
-" 5,"
-" RND(0, 8),"
-" 'N',"
-" 'F',"
-" rnd + RND(1, 100),"
-" rnd + RND(1, 100),"
-" rnd + RND(1, 100),"
-" RND_STR(1),"
-" RND_STR(1),"
-" RND_STR(RND(1, 3)));"
-" END LOOP;"
-" END LOOP;"
-""
-" END LOOP;"
-""
-" COMMIT WORK;"
-" PRINTF('TPC-D tables populated');"
-""
-" PRINTF('Populating join test tables');"
-" FOR i IN 1 .. 1 LOOP"
-" INSERT INTO JTEST1 VALUES (i, i);"
-" INSERT INTO JTEST2 VALUES (i, i);"
-" END LOOP;"
-" PRINTF('Join test tables populated');"
-""
-" COMMIT WORK;"
-" END;"
- ;
-
- str4 = ut_str_catenate(str1, str2);
- populate_str = ut_str_catenate(str4, str3);
-
- /*-----------------------------------------------------------*/
- str =
-
-" PROCEDURE PRINT_TABLES () IS"
-" i INT;"
-" BEGIN"
-""
-" /* PRINTF('Printing ITEM table:');"
-""
-" ROW_PRINTF"
-" SELECT *"
-" FROM ITEM;"
-""
-" PRINTF('Printing WAREHOUSE table:');"
-""
-" ROW_PRINTF"
-" SELECT *"
-" FROM WAREHOUSE;"
-""
-" PRINTF('Printing STOCK table:');"
-""
-" ROW_PRINTF"
-" SELECT *"
-" FROM STOCK;"
-""
-" PRINTF('Printing DISTRICT table:');"
-""
-" ROW_PRINTF"
-" SELECT *"
-" FROM DISTRICT;"
-""
-" PRINTF('Printing CUSTOMER table:');"
-""
-" ROW_PRINTF"
-" SELECT *"
-" FROM CUSTOMER;"
-""
-" PRINTF('Printing HISTORY table:');"
-""
-" ROW_PRINTF"
-" SELECT *"
-" FROM HISTORY;"
-""
-" PRINTF('Printing ORDERS table:');"
-""
-" ROW_PRINTF"
-" SELECT *"
-" FROM ORDERS;"
-""
-" PRINTF('Printing ORDER_LINE table:');"
-""
-" ROW_PRINTF"
-" SELECT *"
-" FROM ORDER_LINE"
-" WHERE OL_O_ID >= 3000; */"
-""
-" PRINTF('Printing NEW_ORDER table:');"
-""
-" ROW_PRINTF"
-" SELECT *"
-" FROM NEW_ORDER;"
-""
-" COMMIT WORK;"
-" END;"
- ;
-
- print_str = str;
- /*-----------------------------------------------------------*/
- commit_str =
-
-" PROCEDURE COMMIT_TEST () IS"
-" "
-" BEGIN"
-" COMMIT WORK;"
-" END;"
- ;
-
- /*-----------------------------------------------------------*/
-
- str1 =
-
-" PROCEDURE NEW_ORDER (c_w_id IN CHAR,"
-" c_d_id IN CHAR,"
-" c_id IN CHAR,"
-" ol_supply_w_ids IN CHAR,"
-" ol_i_ids IN CHAR,"
-" ol_quantities IN CHAR,"
-" c_last OUT CHAR,"
-" c_credit OUT CHAR,"
-" c_discount OUT INT,"
-" w_tax OUT INT,"
-" d_tax OUT INT,"
-" o_ol_count OUT INT,"
-" o_id OUT INT,"
-" o_entry_d OUT INT,"
-" total OUT INT,"
-" i_names OUT CHAR,"
-" s_quantities OUT CHAR,"
-" bg OUT CHAR,"
-" i_prices OUT CHAR,"
-" ol_amounts OUT CHAR) IS"
-""
-" i INT;"
-" j INT;"
-" o_all_local CHAR;"
-" i_price INT;"
-" i_name CHAR;"
-" i_data CHAR;"
-" s_quantity INT;"
-" s_data CHAR;"
-" s_dist_01 CHAR;"
-" s_dist_02 CHAR;"
-" s_dist_03 CHAR;"
-" s_dist_04 CHAR;"
-" s_dist_05 CHAR;"
-" s_dist_06 CHAR;"
-" s_dist_07 CHAR;"
-" s_dist_08 CHAR;"
-" s_dist_09 CHAR;"
-" s_dist_10 CHAR;"
-" ol_i_id CHAR;"
-" ol_quantity INT;"
-" ol_amount INT;"
-" ol_supply_w_id CHAR;"
-" ol_dist_info CHAR;"
-""
-" DECLARE CURSOR district_cursor IS"
-" SELECT D_NEXT_O_ID, D_TAX"
-" FROM DISTRICT"
-" WHERE D_ID = c_d_id AND D_W_ID = c_w_id"
-" FOR UPDATE;"
-""
-" DECLARE CURSOR stock_cursor IS"
-" SELECT S_QUANTITY, S_DATA,"
-" S_DIST_01, S_DIST_02, S_DIST_03, S_DIST_04,"
-" S_DIST_05, S_DIST_06, S_DIST_07, S_DIST_08,"
-" S_DIST_09, S_DIST_10"
-" FROM STOCK"
-" WHERE S_W_ID = ol_supply_w_id AND S_I_ID = ol_i_id"
-" FOR UPDATE;"
- ;
- str2 =
-
-" BEGIN"
-" FOR j IN 1 .. 1 LOOP"
-""
-" /* PRINTF('Warehouse ', BINARY_TO_NUMBER(c_w_id)); */"
-" o_all_local := '1';"
-" i_names := '12345678901234567890123456789012345678901234567890"
- "12345678901234567890123456789012345678901234567890"
- "12345678901234567890123456789012345678901234567890"
- "12345678901234567890123456789012345678901234567890"
- "12345678901234567890123456789012345678901234567890"
- "12345678901234567890123456789012345678901234567890"
- "12345678901234567890123456789012345678901234567890"
- "1234567890';"
-" s_quantities := '12345678901234567890123456789012345678901234567890"
- "1234567890';"
-" i_prices := '12345678901234567890123456789012345678901234567890"
- "1234567890';"
-" ol_amounts := '12345678901234567890123456789012345678901234567890"
- "1234567890';"
-" bg := 'GGGGGGGGGGGGGGG';"
-" total := 0;"
-""
-" SELECT C_DISCOUNT, C_LAST, C_CREDIT INTO c_discount, c_last, c_credit"
-" FROM CUSTOMER"
-" WHERE C_W_ID = c_w_id AND C_D_ID = c_d_id AND C_ID = c_id;"
-""
-" OPEN district_cursor;"
-""
-" FETCH district_cursor INTO o_id, d_tax;"
-""
-" UPDATE DISTRICT SET D_NEXT_O_ID = o_id + 1"
-" WHERE CURRENT OF district_cursor;"
-""
-" CLOSE district_cursor;"
-""
-""
- ;
- str3 =
-
-" o_ol_count := LENGTH(ol_quantities);"
-""
-" /* PRINTF('C-WAREHOUSE id ', BINARY_TO_NUMBER(c_w_id),"
-" ' C-district id ', c_d_id,"
-" ' order id ', o_id, ' linecount ', o_ol_count); */"
-""
-" FOR i IN 0 .. (o_ol_count - 1) LOOP"
-""
-" ol_i_id := SUBSTR(ol_i_ids, 3 * i, 3);"
-" ol_supply_w_id := SUBSTR(ol_supply_w_ids, 2 * i, 2);"
-" ol_quantity := BINARY_TO_NUMBER(SUBSTR(ol_quantities, i, 1));"
-""
-" /* PRINTF('ol_i_id ', BINARY_TO_NUMBER(ol_i_id),"
-" ' ol_supply_w_id ', BINARY_TO_NUMBER(ol_supply_w_id),"
-" ' ol_quantity ', ol_quantity); */"
-""
-" SELECT I_PRICE, I_NAME, I_DATA INTO i_price, i_name, i_data"
-" FROM ITEM"
-" WHERE I_ID = ol_i_id"
-" CONSISTENT READ;"
-""
-" IF (SQL % NOTFOUND) THEN"
-" /* PRINTF('Rolling back; item not found: ',"
-" BINARY_TO_NUMBER(ol_i_id)); */"
-" ROLLBACK WORK;"
-" o_ol_count := 0;"
-""
-" RETURN;"
-" END IF;"
-""
-" OPEN stock_cursor;"
-""
-" FETCH stock_cursor INTO s_quantity, s_data,"
-" s_dist_01, s_dist_02, s_dist_03,"
-" s_dist_04, s_dist_05, s_dist_06,"
-" s_dist_07, s_dist_08, s_dist_09,"
-" s_dist_10;"
-""
-" /* PRINTF('Stock quantity ', s_quantity); */"
-""
-" IF (s_quantity >= ol_quantity + 10) THEN"
-" s_quantity := s_quantity - ol_quantity;"
-" ELSE"
-" s_quantity := (s_quantity + 91) - ol_quantity;"
-" END IF;"
-""
-" UPDATE STOCK SET S_QUANTITY = s_quantity,"
-" S_YTD = S_YTD + ol_quantity,"
-" S_ORDER_CNT = S_ORDER_CNT + 1"
- " WHERE CURRENT OF stock_cursor;"
-""
-" IF (ol_supply_w_id <> c_w_id) THEN"
-""
-" o_all_local := '0';"
-" PRINTF('Remote order ',"
-" BINARY_TO_NUMBER(ol_supply_w_id), ' ',"
-" BINARY_TO_NUMBER(c_w_id));"
-""
-" UPDATE STOCK SET S_REMOTE_CNT = S_REMOTE_CNT + 1"
-" WHERE CURRENT OF stock_cursor;"
-" END IF;"
-""
-" CLOSE stock_cursor;"
-""
-" IF ((INSTR(i_data, 'ORIGINAL') > 0)"
-" OR (INSTR(s_data, 'ORIGINAL') > 0)) THEN"
-" REPLSTR(bg, 'B', i, 1);"
-" END IF;"
-""
-" ol_amount := ol_quantity * i_price;"
-""
-" total := total + ol_amount;"
- ;
- str4 =
-" IF (c_d_id = '0') THEN"
-" ol_dist_info := s_dist_01;"
-" ELSIF (c_d_id = '1') THEN"
-" ol_dist_info := s_dist_02;"
-" ELSIF (c_d_id = '2') THEN"
-" ol_dist_info := s_dist_03;"
-" ELSIF (c_d_id = '3') THEN"
-" ol_dist_info := s_dist_04;"
-" ELSIF (c_d_id = '4') THEN"
-" ol_dist_info := s_dist_05;"
-" ELSIF (c_d_id = '5') THEN"
-" ol_dist_info := s_dist_06;"
-" ELSIF (c_d_id = '6') THEN"
-" ol_dist_info := s_dist_07;"
-" ELSIF (c_d_id = '7') THEN"
-" ol_dist_info := s_dist_08;"
-" ELSIF (c_d_id = '8') THEN"
-" ol_dist_info := s_dist_09;"
-" ELSIF (c_d_id = '9') THEN"
-" ol_dist_info := s_dist_10;"
-" END IF;"
-""
-" INSERT INTO ORDER_LINE VALUES (o_id, c_d_id, c_w_id,"
-" TO_BINARY(i + 1, 1), ol_i_id,"
-" ol_supply_w_id, NULL, ol_quantity,"
-" ol_amount, ol_dist_info);"
-""
-" REPLSTR(i_names, i_name, i * 24, LENGTH(i_name));"
-" REPLSTR(s_quantities, TO_BINARY(s_quantity, 4), i * 4, 4);"
-" REPLSTR(i_prices, TO_BINARY(i_price, 4), i * 4, 4);"
-" REPLSTR(ol_amounts, TO_BINARY(ol_amount, 4), i * 4, 4);"
-""
-" /* PRINTF('i_name ', i_name, ' s_quantity ', s_quantity,"
-" ' i_price ', i_price, ' ol_amount ', ol_amount); */"
-" END LOOP;"
-""
-" SELECT W_TAX INTO w_tax"
-" FROM WAREHOUSE"
-" WHERE W_ID = c_w_id;"
-""
-" total := (((total * (10000 + w_tax + d_tax)) / 10000)"
-" * (10000 - c_discount)) / 10000;"
-""
-" o_entry_d := SYSDATE();"
-""
-" INSERT INTO ORDERS VALUES (o_id, c_d_id, c_w_id, c_id, o_entry_d,"
-" NULL, o_ol_count, o_all_local);"
-" INSERT INTO NEW_ORDER VALUES (o_id, c_d_id, c_w_id);"
-""
-" /* PRINTF('Inserted order lines:');"
-" ROW_PRINTF"
-" SELECT * FROM ORDER_LINE WHERE OL_O_ID = o_id AND"
-" OL_D_ID = c_d_id"
-" AND OL_W_ID = c_w_id; */"
-" COMMIT WORK;"
-" END LOOP;"
-" END;"
- ;
-
- str5 = ut_str_catenate(str1, str2);
- str6 = ut_str_catenate(str3, str4);
-
- new_order_str = ut_str_catenate(str5, str6);
-
- /*-----------------------------------------------------------*/
-
- str1 =
-
-" PROCEDURE PAYMENT (c_w_id IN CHAR) IS"
-""
-" i INT;"
-" n_items INT;"
-" n_warehouses INT;"
-" n_districts INT;"
-" n_customers INT;"
-" w_id CHAR;"
-" w_street_1 CHAR;"
-" w_street_2 CHAR;"
-" w_city CHAR;"
-" w_state CHAR;"
-" w_zip CHAR;"
-" w_name CHAR;"
-" d_id CHAR;"
-" d_street_1 CHAR;"
-" d_street_2 CHAR;"
-" d_city CHAR;"
-" d_state CHAR;"
-" d_zip CHAR;"
-" d_name CHAR;"
-" c_d_id CHAR;"
-" c_street_1 CHAR;"
-" c_street_2 CHAR;"
-" c_city CHAR;"
-" c_state CHAR;"
-" c_zip CHAR;"
-" c_id CHAR;"
-" c_last CHAR;"
-" c_first CHAR;"
-" c_middle CHAR;"
-" c_phone CHAR;"
-" c_credit CHAR;"
-" c_credit_lim INT;"
-" c_discount INT;"
-" c_balance INT;"
-" c_since INT;"
-" c_data CHAR;"
-" byname INT;"
-" namecnt INT;"
-" amount INT;"
-" h_data CHAR;"
-" h_date INT;"
-" c_more_data CHAR;"
-" more_len INT;"
-" data_len INT;"
-""
-" DECLARE CURSOR warehouse_cursor IS"
-" SELECT W_STREET_1, W_STREET_2, W_CITY, W_STATE, W_ZIP, W_NAME"
-" FROM WAREHOUSE"
-" WHERE W_ID = w_id"
-" FOR UPDATE;"
-""
-" DECLARE CURSOR district_cursor IS"
-" SELECT D_STREET_1, D_STREET_2, D_CITY, D_STATE, D_ZIP, D_NAME"
-" FROM DISTRICT"
-" WHERE D_W_ID = w_id AND D_ID = d_id"
-" FOR UPDATE;"
-""
-" DECLARE CURSOR customer_by_name_cursor IS"
-" SELECT C_ID"
-" FROM CUSTOMER"
-" WHERE C_W_ID = c_w_id AND C_D_ID = c_d_id"
-" AND C_LAST = c_last"
-" ORDER BY C_FIRST ASC;"
-""
-" DECLARE CURSOR customer_cursor IS"
-" SELECT C_FIRST, C_MIDDLE, C_LAST, C_STREET_1, C_STREET_2,"
-" C_CITY, C_STATE, C_ZIP, C_PHONE, C_CREDIT,"
-" C_CREDIT_LIM, C_DISCOUNT, C_BALANCE,"
-" C_SINCE"
-" FROM CUSTOMER"
-" WHERE C_W_ID = c_w_id AND C_D_ID = c_d_id"
-" AND C_ID = c_id"
-" FOR UPDATE;"
- ;
-
- str2 =
-
-" BEGIN"
-""
-" n_items := 200;"
-" n_warehouses := 1;"
-" n_districts := 10;"
-" n_customers := 20;"
-""
-" byname := RND(1, 100);"
-" amount := RND(1, 1000);"
-" h_date := SYSDATE();"
-" w_id := c_w_id;"
-" d_id := TO_BINARY(47 + RND(1, n_districts), 1);"
-" c_d_id := TO_BINARY(47 + RND(1, n_districts), 1);"
-""
-" IF (byname <= 60) THEN"
-" c_last := CONCAT('NAME', TO_CHAR(RND(1, n_customers) / 3));"
-""
-" SELECT COUNT(*) INTO namecnt"
-" FROM CUSTOMER"
-" WHERE C_W_ID = c_w_id AND C_D_ID = c_d_id"
-" AND C_LAST = c_last;"
-" /* PRINTF('Payment trx: Customer name ', c_last,"
-" ' namecount ', namecnt); */"
-" OPEN customer_by_name_cursor;"
-""
-" FOR i IN 1 .. (namecnt + 1) / 2 LOOP"
-" FETCH customer_by_name_cursor INTO c_id;"
-" END LOOP;"
-" /* ASSERT(NOT (customer_by_name_cursor % NOTFOUND)); */"
-" "
-" CLOSE customer_by_name_cursor;"
-" ELSE"
-" c_id := TO_BINARY(RND(1, n_customers), 3);"
-" END IF;"
-
- ;
- str3 =
-""
-" /* PRINTF('Payment for customer ', BINARY_TO_NUMBER(c_w_id), ' ',"
-" c_d_id, ' ', BINARY_TO_NUMBER(c_id)); */"
-" OPEN customer_cursor;"
-""
-" FETCH customer_cursor INTO c_first, c_middle, c_last, c_street_1,"
-" c_street_2, c_city, c_state, c_zip,"
-" c_phone, c_credit, c_credit_lim,"
-" c_discount, c_balance, c_since;"
-" c_balance := c_balance - amount;"
-""
-" OPEN district_cursor;"
-""
-" FETCH district_cursor INTO d_street_1, d_street_2, d_city, d_state,"
-" d_zip, d_name;"
-" UPDATE DISTRICT SET D_YTD = D_YTD + amount"
-" WHERE CURRENT OF district_cursor;"
-""
-" CLOSE district_cursor;"
-""
-" OPEN warehouse_cursor;"
-""
-" FETCH warehouse_cursor INTO w_street_1, w_street_2, w_city, w_state,"
-" w_zip, w_name;"
-" UPDATE WAREHOUSE SET W_YTD = W_YTD + amount"
-" WHERE CURRENT OF warehouse_cursor;"
-""
-" CLOSE warehouse_cursor;"
-""
-" h_data := CONCAT(w_name, ' ', d_name);"
-" "
-" IF (c_credit = 'BC') THEN"
-" /* PRINTF('Bad customer pays'); */"
-""
-" SELECT C_DATA INTO c_data"
-" FROM CUSTOMER"
-" WHERE C_W_ID = c_w_id AND C_D_ID = c_d_id"
-" AND C_ID = c_id;"
-" c_more_data := CONCAT("
-" ' ', TO_CHAR(BINARY_TO_NUMBER(c_id)),"
-" ' ', c_d_id,"
-" ' ', TO_CHAR(BINARY_TO_NUMBER(c_w_id)),"
-" ' ', d_id,"
-" ' ', TO_CHAR(BINARY_TO_NUMBER(w_id)),"
-" TO_CHAR(amount),"
-" TO_CHAR(h_date),"
-" ' ', h_data);"
-""
-" more_len := LENGTH(c_more_data);"
-" data_len := LENGTH(c_data);"
-" "
-" IF (more_len + data_len > 500) THEN"
-" data_len := 500 - more_len;"
-" END IF;"
-" "
-" c_data := CONCAT(c_more_data, SUBSTR(c_data, 0, data_len));"
-" "
-" UPDATE CUSTOMER SET C_BALANCE = c_balance,"
-" C_PAYMENT_CNT = C_PAYMENT_CNT + 1,"
-" C_YTD_PAYMENT = C_YTD_PAYMENT + amount,"
-" C_DATA = c_data"
-" WHERE CURRENT OF customer_cursor;"
-" ELSE"
-" UPDATE CUSTOMER SET C_BALANCE = c_balance,"
-" C_PAYMENT_CNT = C_PAYMENT_CNT + 1,"
-" C_YTD_PAYMENT = C_YTD_PAYMENT + amount"
-" WHERE CURRENT OF customer_cursor;"
-" END IF;"
-""
-" CLOSE customer_cursor;"
-" "
-" INSERT INTO HISTORY VALUES (c_d_id, c_w_id, c_id, d_id, w_id,"
-" h_date, amount, h_data);"
-" COMMIT WORK;"
-""
-" END;"
-
- ;
-
- str4 = ut_str_catenate(str1, str2);
- payment_str = ut_str_catenate(str4, str3);
-
- /*-----------------------------------------------------------*/
-
- str1 =
-
-" PROCEDURE ORDER_STATUS (c_w_id IN CHAR) IS"
-""
-" i INT;"
-" n_items INT;"
-" n_warehouses INT;"
-" n_districts INT;"
-" n_customers INT;"
-" d_id CHAR;"
-" namecnt INT;"
-" c_d_id CHAR;"
-" c_id CHAR;"
-" c_last CHAR;"
-" c_first CHAR;"
-" c_middle CHAR;"
-" c_balance INT;"
-" byname INT;"
-" o_id INT;"
-" o_carrier_id CHAR;"
-" o_entry_d INT;"
-" ol_i_id CHAR;"
-" ol_supply_w_id CHAR;"
-" ol_quantity INT;"
-" ol_amount INT;"
-" ol_delivery_d INT;"
-""
-" DECLARE CURSOR orders_cursor IS"
-" SELECT O_ID, O_CARRIER_ID, O_ENTRY_D"
-" FROM ORDERS"
-" WHERE O_W_ID = c_w_id AND O_D_ID = c_d_id"
-" AND O_C_ID = c_id"
-" ORDER BY O_ID DESC;"
-""
-" DECLARE CURSOR order_line_cursor IS"
-" SELECT OL_I_ID, OL_SUPPLY_W_ID, OL_QUANTITY, OL_AMOUNT,"
-" OL_DELIVERY_D"
-" FROM ORDER_LINE"
-" WHERE OL_W_ID = c_w_id AND OL_D_ID = c_d_id"
-" AND OL_O_ID = o_id;"
-" DECLARE CURSOR customer_by_name_cursor IS"
-" SELECT C_ID"
-" FROM CUSTOMER"
-" WHERE C_W_ID = c_w_id AND C_D_ID = c_d_id"
-" AND C_LAST = c_last"
-" ORDER BY C_FIRST ASC;"
-" BEGIN"
-""
-" n_items := 200;"
-" n_warehouses := 1;"
-" n_districts := 10;"
-" n_customers := 20;"
-""
-" byname := RND(1, 100);"
-""
- ;
-
- str2 =
-
-" IF (byname <= 60) THEN"
-" d_id := TO_BINARY(47 + RND(1, n_districts), 1); "
-""
-" c_d_id := d_id;"
-""
-" c_last := CONCAT('NAME', TO_CHAR(RND(1, n_customers) / 3));"
-""
-" SELECT COUNT(*) INTO namecnt"
-" FROM CUSTOMER"
-" WHERE C_W_ID = c_w_id AND C_D_ID = c_d_id"
-" AND C_LAST = c_last;"
-" OPEN customer_by_name_cursor;"
-""
-" /* PRINTF('Order status trx: Customer name ', c_last,"
-" ' namecount ', namecnt); */"
-" FOR i IN 1 .. (namecnt + 1) / 2 LOOP"
-" FETCH customer_by_name_cursor INTO c_id;"
-" END LOOP;"
-" /* ASSERT(NOT (customer_by_name_cursor % NOTFOUND)); */"
-""
-" CLOSE customer_by_name_cursor;"
-" ELSE"
-" c_d_id := TO_BINARY(47 + RND(1, n_districts), 1);"
-" c_id := TO_BINARY(RND(1, n_customers), 3);"
-" END IF;"
-""
-" SELECT C_BALANCE, C_FIRST, C_MIDDLE, C_LAST INTO c_balance, c_first,"
-" c_middle, c_last"
-" FROM CUSTOMER"
-" WHERE C_W_ID = c_w_id AND C_D_ID = c_d_id AND C_ID = c_id;"
-""
-" OPEN orders_cursor;"
-""
-" FETCH orders_cursor INTO o_id, o_carrier_id, o_entry_d;"
-""
-" IF (orders_cursor % NOTFOUND) THEN"
-" PRINTF('Order status trx: customer has no order');"
-" CLOSE orders_cursor;"
-""
-" COMMIT WORK;"
-""
-" RETURN;"
-" END IF;"
-""
-" CLOSE orders_cursor;"
-""
-" OPEN order_line_cursor;"
-""
-" FOR i IN 0 .. 15 LOOP"
-" FETCH order_line_cursor INTO ol_i_id, ol_supply_w_id,"
-" ol_quantity, ol_amount,"
-" ol_delivery_d;"
-""
-" IF (order_line_cursor % NOTFOUND) THEN"
-" CLOSE order_line_cursor;"
-""
-" COMMIT WORK;"
-""
-" RETURN;"
-" END IF;"
-" END LOOP;"
-" ASSERT(0 = 1);"
-" "
-" END;"
- ;
-
- order_status_str = ut_str_catenate(str1, str2);
- /*-----------------------------------------------------------*/
-
- str1 =
-
-" PROCEDURE DELIVERY (w_id IN CHAR) IS"
-""
-" i INT;"
-" n_items INT;"
-" n_warehouses INT;"
-" n_districts INT;"
-" n_customers INT;"
-" d_id CHAR;"
-" c_id CHAR;"
-" o_id INT;"
-" o_carrier_id INT;"
-" ol_delivery_d INT;"
-" ol_total INT;"
-""
-" DECLARE CURSOR new_order_cursor IS"
-" SELECT NO_O_ID"
-" FROM NEW_ORDER"
-" WHERE NO_W_ID = w_id AND NO_D_ID = d_id"
-" ORDER BY NO_O_ID ASC;"
-""
-" DECLARE CURSOR orders_cursor IS"
-" SELECT O_C_ID"
-" FROM ORDERS"
-" WHERE O_W_ID = w_id AND O_D_ID = d_id"
-" AND O_ID = o_id"
-" FOR UPDATE;"
-" BEGIN"
-""
-" n_items := 200;"
-" n_warehouses := 1;"
-" n_districts := 10;"
-" n_customers := 20;"
-""
-" o_carrier_id := RND(1, 10);"
-" ol_delivery_d := SYSDATE();"
-
- ;
-
- str2 =
-
-" FOR i IN 1 .. n_districts LOOP"
-""
-" d_id := TO_BINARY(47 + i, 1);"
-""
-" OPEN new_order_cursor;"
-""
-" FETCH new_order_cursor INTO o_id;"
-""
-" IF (new_order_cursor % NOTFOUND) THEN"
-" /* PRINTF('No order to deliver'); */"
-""
-" CLOSE new_order_cursor;"
-" ELSE"
-" CLOSE new_order_cursor;"
-""
-" DELETE FROM NEW_ORDER"
-" WHERE NO_W_ID = w_id AND NO_D_ID = d_id"
-" AND NO_O_ID = o_id;"
-" OPEN orders_cursor;"
-""
-" FETCH orders_cursor INTO c_id;"
-""
-" UPDATE ORDERS SET O_CARRIER_ID = o_carrier_id"
-" WHERE CURRENT OF orders_cursor;"
-""
-" CLOSE orders_cursor;"
-""
-" UPDATE ORDER_LINE SET OL_DELIVERY_D = ol_delivery_d"
-" WHERE OL_W_ID = w_id AND OL_D_ID = d_id"
-" AND OL_O_ID = o_id;"
-""
-" SELECT SUM(OL_AMOUNT) INTO ol_total"
-" FROM ORDER_LINE"
-" WHERE OL_W_ID = w_id AND OL_D_ID = d_id"
-" AND OL_O_ID = o_id;"
-""
-" UPDATE CUSTOMER SET C_BALANCE = C_BALANCE - ol_total"
-" WHERE C_W_ID = w_id AND C_D_ID = d_id"
-" AND C_ID = c_id;"
-" END IF;"
-" END LOOP;"
-" COMMIT WORK;"
-""
-" "
-" END;"
- ;
-
- delivery_str = ut_str_catenate(str1, str2);
-
- /*-----------------------------------------------------------*/
-
- str =
-
-" PROCEDURE STOCK_LEVEL (w_id IN CHAR) IS"
-""
-" n_items INT;"
-" n_warehouses INT;"
-" n_districts INT;"
-" n_customers INT;"
-" d_id CHAR;"
-" o_id INT;"
-" stock_count INT;"
-" threshold INT;"
-""
-" BEGIN"
-""
-" n_items := 200;"
-" n_warehouses := 1;"
-" n_districts := 10;"
-" n_customers := 20;"
-""
-" d_id := TO_BINARY(47 + 4, 1);"
-""
-" threshold := RND(10, 20);"
-""
-" SELECT D_NEXT_O_ID INTO o_id"
-" FROM DISTRICT"
-" WHERE D_W_ID = w_id AND D_ID = d_id;"
-""
-" /* NOTE: COUNT(DISTINCT ...) not implemented yet: if we used a hash"
-" table, the DISTINCT operation should take at most 15 % more time */"
-""
-" SELECT COUNT(*) INTO stock_count"
-" FROM ORDER_LINE, STOCK"
-" WHERE OL_W_ID = w_id AND OL_D_ID = d_id"
-" AND OL_O_ID >= o_id - 10 AND OL_O_ID < o_id"
-" AND S_W_ID = w_id AND S_I_ID = OL_I_ID"
-" AND S_QUANTITY < threshold"
-" CONSISTENT READ;"
-" /* PRINTF(stock_count, ' items under threshold ', threshold); */"
-" COMMIT WORK;"
-""
-" END;"
- ;
-
- stock_level_str = str;
-
- /*-----------------------------------------------------------*/
-
- str =
-
-" PROCEDURE TPC_CONSISTENCY () IS"
-""
-" n_items INT;"
-" n_warehouses INT;"
-" n_districts INT;"
-" n_customers INT;"
-" n_orders INT;"
-" n_new_orders INT;"
-" n_order_lines INT;"
-" n_history INT;"
-" sum_order_quant INT;"
-" sum_stock_quant INT;"
-" n_delivered INT;"
-" n INT;"
-" n_new_order_lines INT;"
-" n_customers_d INT;"
-" n_regions INT;"
-" n_nations INT;"
-" n_suppliers INT;"
-" n_orders_d INT;"
-" n_lineitems INT;"
-""
-" BEGIN"
-""
-" PRINTF('TPC-C consistency check begins');"
-""
-" SELECT COUNT(*) INTO n_warehouses"
-" FROM WAREHOUSE;"
-" SELECT COUNT(*) INTO n_items"
-" FROM ITEM;"
-" SELECT COUNT(*) INTO n_customers"
-" FROM CUSTOMER;"
-" SELECT COUNT(*) INTO n_districts"
-" FROM DISTRICT;"
-" SELECT COUNT(*) INTO n_orders"
-" FROM ORDERS;"
-" SELECT COUNT(*) INTO n_new_orders"
-" FROM NEW_ORDER;"
-" SELECT COUNT(*) INTO n_order_lines"
-" FROM ORDER_LINE;"
-" SELECT COUNT(*) INTO n_history"
-" FROM HISTORY;"
-""
-" PRINTF('N warehouses ', n_warehouses);"
-""
-" PRINTF('N items ', n_items, ' : ', n_items / n_warehouses,"
-" ' per warehouse');"
-" PRINTF('N districts ', n_districts, ' : ', n_districts / n_warehouses,"
-" ' per warehouse');"
-" PRINTF('N customers ', n_customers, ' : ', n_customers / n_districts,"
-" ' per district');"
-" PRINTF('N orders ', n_orders, ' : ', n_orders / n_customers,"
-" ' per customer');"
-" PRINTF('N new orders ', n_new_orders, ' : ',"
-" n_new_orders / n_customers, ' per customer');"
-" PRINTF('N order lines ', n_order_lines, ' : ',"
-" n_order_lines / n_orders, ' per order');"
-" PRINTF('N history ', n_history, ' : ',"
-" n_history / n_customers, ' per customer');"
-" SELECT COUNT(*) INTO n_delivered"
-" FROM ORDER_LINE"
-" WHERE OL_DELIVERY_D < NULL;"
-""
-" PRINTF('N delivered order lines ', n_delivered);"
-""
-" SELECT COUNT(*) INTO n_new_order_lines"
-" FROM NEW_ORDER, ORDER_LINE"
-" WHERE NO_O_ID = OL_O_ID AND NO_D_ID = OL_D_ID"
-" AND NO_W_ID = OL_W_ID;"
-" PRINTF('N new order lines ', n_new_order_lines);"
-""
-" SELECT COUNT(*) INTO n"
-" FROM NEW_ORDER, ORDER_LINE"
-" WHERE NO_O_ID = OL_O_ID AND NO_D_ID = OL_D_ID"
-" AND NO_W_ID = OL_W_ID AND OL_DELIVERY_D < NULL;"
-" PRINTF('Assertion 1');"
-" ASSERT(n = 0);"
-""
-" SELECT COUNT(*) INTO n"
-" FROM NEW_ORDER, ORDER_LINE"
-" WHERE NO_O_ID = OL_O_ID AND NO_D_ID = OL_D_ID"
-" AND NO_W_ID = OL_W_ID AND OL_DELIVERY_D = NULL;"
-""
-" PRINTF('Assertion 2');"
-" ASSERT(n = n_new_order_lines);"
-" PRINTF('Assertion 2B');"
-" ASSERT(n_delivered + n_new_order_lines = n_order_lines);"
-""
-" PRINTF('Assertion 3');"
-" /* ASSERT(n_orders <= n_history); */"
-" PRINTF('Assertion 4');"
-" ASSERT(n_order_lines <= 15 * n_orders);"
-" PRINTF('Assertion 5');"
-" ASSERT(n_order_lines >= 5 * n_orders);"
-" PRINTF('Assertion 6');"
-" ASSERT(n_new_orders <= n_orders);"
-""
-" SELECT SUM(OL_QUANTITY) INTO sum_order_quant"
-" FROM ORDER_LINE;"
-" SELECT SUM(S_QUANTITY) INTO sum_stock_quant"
-" FROM STOCK;"
-" PRINTF('Sum order quant ', sum_order_quant, ' sum stock quant ',"
-" sum_stock_quant);"
-""
-" PRINTF('Assertion 7');"
-" ASSERT(((sum_stock_quant + sum_order_quant) / 91) * 91"
-" = sum_stock_quant + sum_order_quant);"
-" COMMIT WORK;"
-" PRINTF('TPC-C consistency check passed');"
-""
-" PRINTF('TPC-D consistency check begins');"
-""
-" SELECT COUNT(*) INTO n_customers_d"
-" FROM CUSTOMER_D"
-" CONSISTENT READ;"
-" SELECT COUNT(*) INTO n_nations"
-" FROM NATION"
-" CONSISTENT READ;"
-" SELECT COUNT(*) INTO n_regions"
-" FROM REGION"
-" CONSISTENT READ;"
-" SELECT COUNT(*) INTO n_suppliers"
-" FROM SUPPLIER"
-" CONSISTENT READ;"
-" SELECT COUNT(*) INTO n_orders_d"
-" FROM ORDERS_D"
-" CONSISTENT READ;"
-" SELECT COUNT(*) INTO n_lineitems"
-" FROM LINEITEM"
-" CONSISTENT READ;"
-""
-" PRINTF('N customers TPC-D ', n_customers_d);"
-""
-" PRINTF('N nations ', n_nations);"
-" PRINTF('N regions ', n_regions);"
-""
-" PRINTF('N suppliers ', n_suppliers);"
-" PRINTF('N orders TPC-D ', n_orders_d);"
-""
-" PRINTF('N lineitems ', n_lineitems, ' : ',"
-" n_lineitems / n_orders_d, ' per order');"
-" SELECT COUNT(*) INTO n"
-" FROM NATION, NATION_2"
-" WHERE N_NAME = N2_NAME"
-" CONSISTENT READ;"
-""
-" PRINTF('Assertion D1');"
-" ASSERT(n = n_nations);"
-""
-" SELECT COUNT(*) INTO n"
-" FROM NATION, REGION"
-" WHERE N_REGIONKEY = R_REGIONKEY"
-" CONSISTENT READ;"
-""
-" PRINTF('Assertion D2');"
-" ASSERT(n = n_nations);"
-""
-" SELECT COUNT(*) INTO n"
-" FROM ORDERS_D, CUSTOMER_D"
-" WHERE O_CUSTKEY = C_CUSTKEY"
-" CONSISTENT READ;"
-""
-" PRINTF('Assertion D3');"
-" ASSERT(n = n_orders_d);"
-""
-" SELECT COUNT(*) INTO n"
-" FROM LINEITEM, SUPPLIER"
-" WHERE L_SUPPKEY = S_SUPPKEY"
-" CONSISTENT READ;"
-""
-" PRINTF('Assertion D4');"
-" ASSERT(n = n_lineitems);"
-""
-" SELECT COUNT(*) INTO n"
-" FROM ORDERS_D"
-" WHERE O_ORDERDATE >= 0"
-" AND O_ORDERDATE <= 2500"
-" CONSISTENT READ;"
-""
-" PRINTF('Assertion D5');"
-" ASSERT(n = n_orders_d);"
-""
-" COMMIT WORK;"
-" PRINTF('TPC-D consistency check passed');"
-""
-" END;"
- ;
-
- consistency_str = str;
-
- /*-----------------------------------------------------------*/
- str =
-
-" PROCEDURE TPC_D_QUERY_5 (startday IN INT, endday IN INT) IS"
-""
-" revenue INT;"
-" r_name CHAR;"
-""
-" BEGIN"
-""
-" r_name := CONCAT('Region', TO_CHAR(3), ' ');"
-""
-" /* The last join to NATION_2 corresponds to calculating"
-" GROUP BY N_NAME in the original TPC-D query. It should take"
-" approximately the same amount of CPU time as GROUP BY. */"
-""
-" SELECT SUM((L_EXTENDEDPRICE * (100 - L_DISCOUNT)) / 100)"
-" INTO revenue"
-" FROM REGION, ORDERS_D, CUSTOMER_D, NATION,"
-" LINEITEM, SUPPLIER, NATION_2"
-" WHERE R_NAME = r_name"
-" AND O_ORDERDATE >= startday"
-" AND O_ORDERDATE < endday"
-" AND O_CUSTKEY = C_CUSTKEY"
-" AND C_NATIONKEY = N_NATIONKEY"
-" AND N_REGIONKEY = R_REGIONKEY"
-" AND O_ORDERKEY = L_ORDERKEY"
-" AND L_SUPPKEY = S_SUPPKEY"
-" AND S_NATIONKEY = C_NATIONKEY"
-" AND N_NAME = N2_NAME"
-" CONSISTENT READ;"
-""
-" PRINTF('Startdate ', startday, '; enddate ', endday,"
-" ': revenue ', revenue);"
-" COMMIT WORK;"
-""
-" END;"
- ;
-
- query_5_str = str;
- /*-----------------------------------------------------------*/
- str =
-
-" PROCEDURE ROLLBACK_QUERY () IS"
-""
-" BEGIN"
-""
-" ROLLBACK WORK;"
-""
-" END;"
- ;
-
- rollback_str = str;
- /*-----------------------------------------------------------*/
- str =
-
-" PROCEDURE TEST_LOCK_WAIT () IS"
-""
-" w_id CHAR;"
-" BEGIN"
-""
-" w_id := TO_BINARY(1, 2);"
-" UPDATE WAREHOUSE SET W_YTD = W_YTD + 1 WHERE W_ID = w_id;"
-""
-" END;"
- ;
-
- lock_wait_str = str;
- /*-----------------------------------------------------------*/
- str =
-
-" PROCEDURE TEST_IBUF () IS"
-""
-" i INT;"
-" rnd INT;"
-" j INT;"
-" found INT;"
-""
-" DECLARE CURSOR desc_cursor IS"
-" SELECT IB_A"
-" FROM IBUF_TEST"
-" WHERE IB_A >= rnd AND IB_A < rnd + 50"
-" ORDER BY IB_A DESC;"
-""
-" BEGIN"
-""
-" PRINTF('Ibuf QUERY starts!!!!!!');"
-" rnd := RND(1, 1000);"
-""
-" FOR i IN 1 .. 50 LOOP"
-" INSERT INTO IBUF_TEST VALUES (rnd + i,"
-" RND_STR(RND(1, 2000)));"
-" END LOOP;"
-" IF (RND(1, 100) < 30) THEN"
-" PRINTF('Ibuf rolling back ---!!!');"
-" ROLLBACK WORK;"
-" END IF;"
-""
-""
-" IF (RND(1, 100) < 101) THEN"
-" rnd := RND(1, 1000);"
-" DELETE FROM IBUF_TEST WHERE IB_A >= rnd "
-" AND IB_A <= rnd + 50;"
-" END IF;"
-""
-" rnd := RND(1, 1000);"
-" SELECT COUNT(*) INTO j"
-" FROM IBUF_TEST"
-" WHERE IB_A >= rnd AND IB_A < rnd + 50;"
-""
-" PRINTF('Count: ', j);"
-""
-" rnd := RND(1, 1000);"
-" UPDATE IBUF_TEST"
-" SET IB_B = RND_STR(RND(1, 2000))"
-" WHERE IB_A >= rnd AND IB_A < rnd + 50;"
-""
-" OPEN desc_cursor;"
-""
-" rnd := RND(1, 1000);"
-" found := 1;"
-" WHILE (found > 0) LOOP"
-""
-" FETCH desc_cursor INTO j;"
-""
-" IF (desc_cursor % NOTFOUND) THEN"
-" found := 0;"
-" END IF;"
-" END LOOP;"
-""
-" CLOSE desc_cursor;"
-""
-" IF (RND(1, 100) < 30) THEN"
-" PRINTF('Ibuf rolling back!!!');"
-" ROLLBACK WORK;"
-" ELSE"
-" COMMIT WORK;"
-" END IF;"
-""
-" PRINTF('Ibuf QUERY ends!!!!!!');"
-" END;"
- ;
-
- ibuf_test_str = str;
- /*-----------------------------------------------------------*/
- str =
-
-" PROCEDURE TEST_GROUP_COMMIT (w_id IN CHAR) IS"
-""
-" i INT;"
-""
-" BEGIN"
-""
-" FOR i IN 1 .. 200 LOOP"
-" UPDATE WAREHOUSE SET W_YTD = W_YTD + 1 WHERE W_ID = w_id;"
-" COMMIT WORK;"
-" END LOOP;"
-" END;"
- ;
-
- test_group_commit_str = str;
- /*-----------------------------------------------------------*/
- str =
-
-" PROCEDURE TEST_SINGLE_ROW_SELECT ("
-" i_id IN CHAR,"
-" i_name OUT CHAR) IS"
-" BEGIN"
-" SELECT I_NAME INTO i_name"
-" FROM ITEM"
-" WHERE I_ID = i_id"
-" CONSISTENT READ;"
-" END;"
- ;
-
- test_single_row_select_str = str;
- /*-----------------------------------------------------------*/
- str =
-
-" PROCEDURE JOIN_TEST () IS"
-""
-" n_rows INT;"
-" i INT;"
-""
-" BEGIN"
-""
-" FOR i IN 0 .. 0 LOOP"
-" SELECT COUNT(*) INTO n_rows"
-" FROM JTEST1, JTEST2"
-" WHERE JT2_A = JT1_B"
-" CONSISTENT READ;"
-" PRINTF(n_rows);"
-""
-" COMMIT WORK;"
-" END LOOP;"
-""
-" END;"
- ;
-
- join_test_str = str;
-
- /*-----------------------------------------------------------*/
- str =
-
-" PROCEDURE TEST_ERRORS (switch IN CHAR) IS"
-""
-" count INT;"
-" val INT;"
-""
-" BEGIN"
-""
-" IF (switch = '01') THEN"
-" /* Test duplicate key error: run this first */"
-" ROW_PRINTF SELECT * FROM JTEST1;"
-" PRINTF('To insert first');"
-" INSERT INTO JTEST1 VALUES (1, 1);"
-" PRINTF('To insert second');"
-" INSERT INTO JTEST1 VALUES (2, 2);"
-" END IF;"
-""
-" IF (switch = '02') THEN"
-" /* Test duplicate key error: run this second */"
-" ROW_PRINTF SELECT * FROM JTEST1;"
-" PRINTF('To insert third');"
-" INSERT INTO JTEST1 VALUES (3, 3);"
-" ROW_PRINTF SELECT * FROM JTEST1;"
-" PRINTF('To insert fourth');"
-" INSERT INTO JTEST1 VALUES (1, 1);"
-" END IF;"
-""
-" IF (switch = '03') THEN"
-" /* Test duplicate key error: run this third */"
-" ROW_PRINTF SELECT * FROM JTEST1;"
-" PRINTF('Testing assert');"
-" SELECT COUNT(*) INTO count FROM JTEST1;"
-" ASSERT(count = 2);"
-" END IF;"
-""
-" IF (switch = '04') THEN"
-" /* Test duplicate key error: run this fourth */"
-" ROW_PRINTF SELECT * FROM JTEST1;"
-" PRINTF('Testing update');"
-" UPDATE JTEST1 SET JT1_A = 3 WHERE JT1_A = 2;"
-" PRINTF('Testing update');"
-" UPDATE JTEST1 SET JT1_A = 1 WHERE JT1_A = 3;"
-" END IF;"
-""
-" IF (switch = '05') THEN"
-" /* Test deadlock error: run this fifth in thread 1 */"
-" COMMIT WORK;"
-" PRINTF('Testing update in thread 1');"
-" UPDATE JTEST1 SET JT1_B = 3 WHERE JT1_A = 1;"
-" END IF;"
-""
-" IF (switch = '06') THEN"
-" /* Test deadlock error: run this sixth in thread 2 */"
-" PRINTF('Testing update in thread 2');"
-" UPDATE JTEST1 SET JT1_B = 10 WHERE JT1_A = 2;"
-" PRINTF('Testing update in thread 2');"
-" UPDATE JTEST1 SET JT1_B = 11 WHERE JT1_A = 1;"
-" PRINTF('Update in thread 2 completed');"
-" SELECT JT1_B INTO val FROM JTEST1 WHERE JT1_A = 1;"
-" ASSERT(val = 11);"
-" SELECT JT1_B INTO val FROM JTEST1 WHERE JT1_A = 2;"
-" ASSERT(val = 10);"
-" COMMIT WORK;"
-" END IF;"
-""
-" IF (switch = '07') THEN"
-" /* Test deadlock error: run this seventh in thread 1 */"
-" PRINTF('Testing update in thread 1: deadlock');"
-" UPDATE JTEST1 SET JT1_B = 4 WHERE JT1_A = 2;"
-" END IF;"
-""
-" IF (switch = '08') THEN"
-" /* Test deadlock error: run this eighth in thread 1 */"
-" PRINTF('Testing update in thread 1: commit');"
-" SELECT JT1_B INTO val FROM JTEST1 WHERE JT1_A = 1;"
-" ASSERT(val = 3);"
-" COMMIT WORK;"
-" END IF;"
-""
-" END;"
- ;
-
- test_errors_str = str;
- /*-----------------------------------------------------------*/
- ret = SQLAllocEnv(&env);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocConnect(env, &conn);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &create_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &populate_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLConnect(conn, (UCHAR*)cli_srv_endpoint_name,
- (SWORD)ut_strlen(cli_srv_endpoint_name),
- (UCHAR*)"use21", 5, (UCHAR*)"password", 8);
- ut_a(ret == SQL_SUCCESS);
-
- printf("Connection established\n");
-
- /*-----------------------------------------------------------*/
- ret = SQLPrepare(stat, (UCHAR*)create_str, ut_strlen(create_str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- str = "{CREATE_TABLES()}";
-
- ret = SQLPrepare(create_query, (UCHAR*)str, ut_strlen(str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(create_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- /*-----------------------------------------------------------*/
- ret = SQLPrepare(stat, (UCHAR*)populate_str, ut_strlen(populate_str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)lock_wait_str,
- ut_strlen(lock_wait_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)commit_str,
- ut_strlen(commit_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)print_str,
- ut_strlen(print_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)new_order_str,
- ut_strlen(new_order_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)payment_str,
- ut_strlen(payment_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)order_status_str,
- ut_strlen(order_status_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)delivery_str,
- ut_strlen(delivery_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)stock_level_str,
- ut_strlen(stock_level_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)query_5_str,
- ut_strlen(query_5_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)consistency_str,
- ut_strlen(consistency_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)rollback_str, ut_strlen(rollback_str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)join_test_str,
- ut_strlen(join_test_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)test_errors_str,
- ut_strlen(test_errors_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)test_single_row_select_str,
- ut_strlen(test_single_row_select_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)test_group_commit_str,
- ut_strlen(test_group_commit_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLPrepare(stat, (UCHAR*)ibuf_test_str,
- ut_strlen(ibuf_test_str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(stat);
-
- ut_a(ret == SQL_SUCCESS);
-
- str = "{POPULATE_TABLES(?, ?)}";
-
- ret = SQLPrepare(populate_query, (UCHAR*)str, ut_strlen(str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(populate_query, 1, SQL_PARAM_INPUT,
- SQL_C_LONG, SQL_INTEGER, 0, 0,
- (byte*)&n_warehouses_buf,
- 4, &n_warehouses_len);
- ut_a(ret == SQL_SUCCESS);
-
- n_warehouses_buf = n_warehouses;
- n_warehouses_len = 4;
-
- ret = SQLBindParameter(populate_query, 2, SQL_PARAM_INPUT,
- SQL_C_LONG, SQL_INTEGER, 0, 0,
- (byte*)&n_customers_d_buf,
- 4, &n_customers_d_len);
- ut_a(ret == SQL_SUCCESS);
-
- n_customers_d_buf = n_customers_d;
- n_customers_d_len = 4;
-
- ret = SQLExecute(populate_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- /*-----------------------------------------------------------*/
- printf("TPC-C test database initialized\n");
-
- return(0);
-}
-
-/*********************************************************************
-Iterates an SQL query until it returns SQL_SUCCESS. If it returns other
-value, rolls back the trx, prints an error message, and tries again. */
-
-void
-execute_until_success(
-/*==================*/
- HSTMT query, /* in: query */
- HSTMT rollback_query) /* in: trx rollback query to run if error */
-{
- RETCODE ret;
- UCHAR sql_state[6];
- SDWORD native_error;
- UCHAR error_msg[512];
- SWORD error_msg_max = 512;
- SWORD error_msg_len;
-
- for (;;) {
- ret = SQLExecute(query);
-
- if (ret != SQL_SUCCESS) {
- ut_a(ret == SQL_ERROR);
-
- ret = SQLError(SQL_NULL_HENV, SQL_NULL_HDBC, query,
- sql_state, &native_error, error_msg,
- error_msg_max, &error_msg_len);
-
- ut_a(ret == SQL_SUCCESS);
-
- printf("%s\n", error_msg);
-
- /* Roll back to release trx locks, and try again */
-
- ret = SQLExecute(rollback_query);
- ut_a(ret == SQL_SUCCESS);
-
- os_thread_sleep(ut_rnd_gen_ulint() / 1000);
- } else {
-
- return;
- }
- }
-}
-
-/*********************************************************************
-Test for TPC-C. */
-
-ulint
-test_client(
-/*=========*/
- void* arg) /* in: user name as a null-terminated string */
-{
- ulint n_customers = 20;
- ulint n_items = 200;
- ulint n_lines;
- bool put_invalid_item;
- HENV env;
- HDBC conn;
- RETCODE ret;
- HSTMT commit_query;
- HSTMT new_order_query;
- HSTMT payment_query;
- HSTMT order_status_query;
- HSTMT delivery_query;
- HSTMT stock_level_query;
- HSTMT print_query;
- HSTMT lock_wait_query;
- HSTMT join_test_query;
- HSTMT test_group_commit_query;
- HSTMT rollback_query;
- HSTMT ibuf_query;
- ulint tm, oldtm;
- char* str;
- byte c_w_id_buf[2];
- byte c_d_id_buf[1];
- byte c_id_buf[3];
- byte ol_supply_w_ids_buf[30];
- byte ol_i_ids_buf[45];
- byte ol_quantities_buf[15];
- byte c_last_buf[51];
- byte c_credit_buf[3];
- ulint c_discount_buf;
- ulint w_tax_buf;
- ulint d_tax_buf;
- ulint o_ol_count_buf;
- ulint o_id_buf;
- ulint o_entry_d_buf;
- ulint total_buf;
- byte i_names_buf[361];
- byte s_quantities_buf[60];
- byte bg_buf[16];
- byte i_prices_buf[60];
- byte ol_amounts_buf[60];
- SDWORD c_w_id_len;
- SDWORD c_d_id_len;
- SDWORD c_id_len;
- SDWORD ol_supply_w_ids_len;
- SDWORD ol_i_ids_len;
- SDWORD ol_quantities_len;
- SDWORD c_last_len;
- SDWORD c_credit_len;
- SDWORD c_discount_len;
- SDWORD w_tax_len;
- SDWORD d_tax_len;
- SDWORD o_ol_count_len;
- SDWORD o_id_len;
- SDWORD o_entry_d_len;
- SDWORD total_len;
- SDWORD i_names_len;
- SDWORD s_quantities_len;
- SDWORD bg_len;
- SDWORD i_prices_len;
- SDWORD ol_amounts_len;
- ulint i;
- ulint k;
- ulint t;
-
- printf("Client thread %s\n", (UCHAR*)arg);
-
- ret = SQLAllocEnv(&env);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocConnect(env, &conn);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &new_order_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &payment_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &order_status_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &delivery_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &stock_level_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &print_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &commit_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &lock_wait_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &join_test_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &test_group_commit_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &rollback_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &ibuf_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLConnect(conn, (UCHAR*)cli_srv_endpoint_name,
- (SWORD)ut_strlen(cli_srv_endpoint_name),
- (UCHAR*)arg, (SWORD)ut_strlen((char*)arg),
- (UCHAR*)"password", 8);
- ut_a(ret == SQL_SUCCESS);
-
- printf("Connection established\n");
-
- /*-----------------------------------------------------------*/
- str =
- "{NEW_ORDER(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,"
- " ?, ?, ?, ?)}";
-
- ret = SQLPrepare(new_order_query, (UCHAR*)str, ut_strlen(str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 1, SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, c_w_id_buf,
- 2, &c_w_id_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 2, SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, c_d_id_buf,
- 1, &c_d_id_len);
- ut_a(ret == SQL_SUCCESS);
-
- c_d_id_len = 1;
-
- ret = SQLBindParameter(new_order_query, 3, SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, c_id_buf,
- 3, &c_id_len);
- ut_a(ret == SQL_SUCCESS);
-
- c_id_len = 3;
-
- ret = SQLBindParameter(new_order_query, 4, SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, ol_supply_w_ids_buf,
- 30, &ol_supply_w_ids_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 5, SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, ol_i_ids_buf,
- 45, &ol_i_ids_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 6, SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, ol_quantities_buf,
- 15, &ol_quantities_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 7, SQL_PARAM_OUTPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, c_last_buf,
- 50, &c_last_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 8, SQL_PARAM_OUTPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0,
- (byte*)&c_credit_buf,
- 2, &c_credit_len);
- ut_a(ret == SQL_SUCCESS);
- c_credit_buf[2] = '\0';
-
- ret = SQLBindParameter(new_order_query, 9, SQL_PARAM_OUTPUT,
- SQL_C_LONG, SQL_INTEGER, 0, 0,
- (byte*)&c_discount_buf,
- 4, &c_discount_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 10, SQL_PARAM_OUTPUT,
- SQL_C_LONG, SQL_INTEGER, 0, 0,
- (byte*)&w_tax_buf,
- 4, &w_tax_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 11, SQL_PARAM_OUTPUT,
- SQL_C_LONG, SQL_INTEGER, 0, 0,
- (byte*)&d_tax_buf,
- 4, &d_tax_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 12, SQL_PARAM_OUTPUT,
- SQL_C_LONG, SQL_INTEGER, 0, 0,
- (byte*)&o_ol_count_buf,
- 4, &o_ol_count_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 13, SQL_PARAM_OUTPUT,
- SQL_C_LONG, SQL_INTEGER, 0, 0,
- (byte*)&o_id_buf,
- 4, &o_id_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 14, SQL_PARAM_OUTPUT,
- SQL_C_LONG, SQL_INTEGER, 0, 0,
- (byte*)&o_entry_d_buf,
- 4, &o_entry_d_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 15, SQL_PARAM_OUTPUT,
- SQL_C_LONG, SQL_INTEGER, 0, 0,
- (byte*)&total_buf,
- 4, &total_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 16, SQL_PARAM_OUTPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, i_names_buf,
- 360, &i_names_len);
- ut_a(ret == SQL_SUCCESS);
- i_names_buf[360] = '\0';
-
- ret = SQLBindParameter(new_order_query, 17, SQL_PARAM_OUTPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, s_quantities_buf,
- 60, &s_quantities_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 18, SQL_PARAM_OUTPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, bg_buf,
- 15, &bg_len);
- ut_a(ret == SQL_SUCCESS);
- bg_buf[15] = '\0';
-
- ret = SQLBindParameter(new_order_query, 19, SQL_PARAM_OUTPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, i_prices_buf,
- 60, &i_prices_len);
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(new_order_query, 20, SQL_PARAM_OUTPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, ol_amounts_buf,
- 60, &ol_amounts_len);
- ut_a(ret == SQL_SUCCESS);
-
- c_w_id_len = 2;
- c_w_id_buf[1] = (byte)(2 * atoi((char*)arg + 4));
- c_w_id_buf[0] = (byte)(2 * (atoi((char*)arg + 4) / 256));
-
- k = atoi((char*)arg + 4);
-
- printf("Client thread %lu starts\n", k);
-
- /*-----------------------------------------------------------*/
- str = "{PAYMENT(?)}";
-
- ret = SQLPrepare(payment_query, (UCHAR*)str, ut_strlen(str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(payment_query, 1, SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, c_w_id_buf,
- 2, &c_w_id_len);
- ut_a(ret == SQL_SUCCESS);
-
- /*-----------------------------------------------------------*/
- str = "{ORDER_STATUS(?)}";
-
- ret = SQLPrepare(order_status_query, (UCHAR*)str, ut_strlen(str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(order_status_query, 1, SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, c_w_id_buf,
- 2, &c_w_id_len);
- ut_a(ret == SQL_SUCCESS);
-
- /*-----------------------------------------------------------*/
- str = "{DELIVERY(?)}";
-
- ret = SQLPrepare(delivery_query, (UCHAR*)str, ut_strlen(str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(delivery_query, 1, SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, c_w_id_buf,
- 2, &c_w_id_len);
- ut_a(ret == SQL_SUCCESS);
-
- /*-----------------------------------------------------------*/
- str = "{STOCK_LEVEL(?)}";
-
- ret = SQLPrepare(stock_level_query, (UCHAR*)str, ut_strlen(str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(stock_level_query, 1, SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, c_w_id_buf,
- 2, &c_w_id_len);
- ut_a(ret == SQL_SUCCESS);
-
- /*-----------------------------------------------------------*/
- str = "{ROLLBACK_QUERY()}";
-
- ret = SQLPrepare(rollback_query, (UCHAR*)str, ut_strlen(str));
-
- ut_a(ret == SQL_SUCCESS);
- /*-----------------------------------------------------------*/
-
- oldtm = ut_clock();
-
- for (i = k; i < k + n_rounds / n_users; i++) {
-
- /* execute_until_success(ibuf_query, rollback_query); */
-
- if (i % 100 == 0) {
- printf("User %s round %lu\n", (char*)arg, i);
- }
-
- if (!own_warehouse) {
- c_w_id_buf[1] = (byte)ut_rnd_interval(1, n_warehouses);
- c_w_id_buf[0] = (byte)(ut_rnd_interval(1, n_warehouses)
- / 256);
- }
-
- mach_write_to_1(c_d_id_buf, (ut_rnd_interval(1, 10) + 47));
- mach_write_to_3(c_id_buf, ut_rnd_interval(1, n_customers));
-
- n_lines = ut_rnd_interval(5, 15);
-
- if ((15 * k + i) % 100 == 0) {
- put_invalid_item = TRUE;
-
- /* printf("Will put invalid item\n"); */
- } else {
- put_invalid_item = FALSE;
- }
-
- for (t = 0; t < n_lines; t++) {
- mach_write_to_3(ol_i_ids_buf + 3 * t,
- ut_rnd_interval(1, n_items));
-
- if (put_invalid_item && (t + 1 == n_lines)) {
- mach_write_to_3(ol_i_ids_buf + 3 * t,
- n_items + 1);
- }
-
- mach_write_to_1(ol_quantities_buf + t,
- ut_rnd_interval(10, 20));
- ut_memcpy(ol_supply_w_ids_buf + 2 * t, c_w_id_buf, 2);
- }
-
- ol_i_ids_len = 3 * n_lines;
- ol_quantities_len = n_lines;
- ol_supply_w_ids_len = 2 * n_lines;
-
- execute_until_success(new_order_query, rollback_query);
-
- if (put_invalid_item) {
-
- goto skip_prints;
- }
-/*
- c_last_buf[c_last_len] = '\0';
-
- printf(
- "C_LAST %s, c_credit %s, c_discount, %lu, w_tax %lu, d_tax %lu\n",
- c_last_buf, c_credit_buf, w_tax_buf, d_tax_buf);
-
- printf("o_ol_count %lu, o_id %lu, o_entry_d %lu, total %lu\n",
- o_ol_count_buf, o_id_buf, o_entry_d_buf,
- total_buf);
-
- ut_a(c_credit_len == 2);
- ut_a(c_discount_len == 4);
- ut_a(i_names_len == 360);
-
- printf("i_names %s, bg %s\n", i_names_buf, bg_buf);
-
- for (t = 0; t < n_lines; t++) {
- printf("s_quantity %lu, i_price %lu, ol_amount %lu\n",
- mach_read_from_4(s_quantities_buf + 4 * t),
- mach_read_from_4(i_prices_buf + 4 * t),
- mach_read_from_4(ol_amounts_buf + 4 * t));
- }
-*/
- skip_prints:
- ;
-
- execute_until_success(payment_query, rollback_query);
-
- if (i % 10 == 3) {
- execute_until_success(order_status_query,
- rollback_query);
- }
-
- if ((i % 10 == 6) || (i % 100 == 60)) {
- execute_until_success(delivery_query, rollback_query);
- }
-
- if (i % 10 == 9) {
- execute_until_success(stock_level_query,
- rollback_query);
- }
- }
-
- tm = ut_clock();
-
- printf("Wall time for %lu loops %lu milliseconds\n",
- (i - k), tm - oldtm);
-
-/* execute_until_success(print_query, rollback_query); */
-
- n_exited++;
-
- printf("Client thread %lu exits as the %luth\n", k, n_exited);
-
- return(0);
-}
-
-/*********************************************************************
-Test for single row select. */
-
-ulint
-test_single_row_select(
-/*===================*/
- void* arg) /* in: user name as a null-terminated string */
-{
- ulint n_items = 200;
- HENV env;
- HDBC conn;
- RETCODE ret;
- HSTMT single_row_select_query;
- ulint tm, oldtm;
- char* str;
- byte i_id_buf[3];
- byte i_name_buf[25];
- SDWORD i_id_len;
- SDWORD i_name_len;
- ulint i;
-
- ret = SQLAllocEnv(&env);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocConnect(env, &conn);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn, &single_row_select_query);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLConnect(conn, (UCHAR*)cli_srv_endpoint_name,
- (SWORD)ut_strlen(cli_srv_endpoint_name),
- (UCHAR*)arg,
- (SWORD)ut_strlen((char*)arg),
- (UCHAR*)"password", 8);
- ut_a(ret == SQL_SUCCESS);
-
- printf("Connection established\n");
-
- /*-----------------------------------------------------------*/
- str =
- "{TEST_SINGLE_ROW_SELECT(?, ?)}";
-
- ret = SQLPrepare(single_row_select_query, (UCHAR*)str,
- ut_strlen(str));
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(single_row_select_query, 1, SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, i_id_buf,
- 3, &i_id_len);
- ut_a(ret == SQL_SUCCESS);
- i_id_len = 3;
-
- ret = SQLBindParameter(single_row_select_query, 2, SQL_PARAM_OUTPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, i_name_buf,
- 24, &i_name_len);
- ut_a(ret == SQL_SUCCESS);
- i_name_buf[24] = '\0';
-
- oldtm = ut_clock();
-
- for (i = 0; i < 10000; i++) {
-
- mach_write_to_3(i_id_buf, ut_rnd_interval(1, n_items));
-
- ret = SQLExecute(single_row_select_query);
-
- ut_a(ret == SQL_SUCCESS);
- }
-
- tm = ut_clock();
-
- printf("Wall time for %lu single row selects %lu milliseconds\n",
- i, tm - oldtm);
- return(0);
-}
-
-/*********************************************************************
-TPC-D query 5. */
-
-ulint
-test_tpc_d_client(
-/*==============*/
- void* arg) /* in: pointer to an array of startdate and enddate */
-{
- char buf[20];
- HENV env;
- HDBC conn1;
- RETCODE ret;
- HSTMT query5;
- HSTMT join_test;
- char* str;
- SDWORD len1;
- SDWORD len2;
- ulint i;
- ulint tm, oldtm;
-
- UT_NOT_USED(arg);
-
- ret = SQLAllocEnv(&env);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocConnect(env, &conn1);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn1, &query5);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn1, &join_test);
-
- ut_a(ret == SQL_SUCCESS);
-
- sprintf(buf, "Use2%5lu", *((ulint*)arg));
-
- ret = SQLConnect(conn1, (UCHAR*)cli_srv_endpoint_name,
- (SWORD)ut_strlen(cli_srv_endpoint_name),
- (UCHAR*)buf,
- (SWORD)9, (UCHAR*)"password", 8);
- ut_a(ret == SQL_SUCCESS);
-
- printf("Connection established\n");
-
- /*-----------------------------------------------------------*/
- str = "{TPC_D_QUERY_5(?, ?)}";
-
- ret = SQLPrepare(query5, (UCHAR*)str, ut_strlen(str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(query5, 1, SQL_PARAM_INPUT,
- SQL_C_LONG, SQL_INTEGER, 0, 0,
- (byte*)arg,
- 4, &len1);
- ut_a(ret == SQL_SUCCESS);
-
- len1 = 4;
-
- ret = SQLBindParameter(query5, 2, SQL_PARAM_INPUT,
- SQL_C_LONG, SQL_INTEGER, 0, 0,
- (byte*)arg + sizeof(ulint),
- 4, &len2);
- ut_a(ret == SQL_SUCCESS);
-
- len2 = 4;
-
- str = "{JOIN_TEST()}";
-
- ret = SQLPrepare(join_test, (UCHAR*)str, ut_strlen(str));
-
- ut_a(ret == SQL_SUCCESS);
-
- for (i = 0; i < n_rounds; i++) {
-
- oldtm = ut_clock();
-
- ret = SQLExecute(query5);
-
- /* ret = SQLExecute(join_test); */
-
- ut_a(ret == SQL_SUCCESS);
-
- tm = ut_clock();
-
- printf("Wall time %lu milliseconds\n", tm - oldtm);
- }
-
- printf("%s exits\n", buf);
-
- return(0);
-}
-
-/*********************************************************************
-Checks consistency of the TPC databases. */
-
-ulint
-check_tpc_consistency(
-/*==================*/
- void* arg) /* in: user name */
-{
- HENV env;
- HDBC conn1;
- RETCODE ret;
- HSTMT consistency_query1;
- char* str;
-
- UT_NOT_USED(arg);
-
- ret = SQLAllocEnv(&env);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocConnect(env, &conn1);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn1, &consistency_query1);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLConnect(conn1, (UCHAR*)cli_srv_endpoint_name,
- (SWORD)ut_strlen(cli_srv_endpoint_name),
- (UCHAR*)arg,
- (SWORD)ut_strlen((char*)arg), (UCHAR*)"password", 8);
- ut_a(ret == SQL_SUCCESS);
-
- printf("Connection established\n");
-
- /*-----------------------------------------------------------*/
- str = "{TPC_CONSISTENCY()}";
-
- ret = SQLPrepare(consistency_query1, (UCHAR*)str, ut_strlen(str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLExecute(consistency_query1);
-
- ut_a(ret == SQL_SUCCESS);
-
- printf("Consistency checked\n");
-
- return(0);
-}
-
-/*********************************************************************
-Test for errors. */
-
-ulint
-test_client_errors2(
-/*================*/
- void* arg) /* in: ignored */
-{
- HENV env;
- HDBC conn1;
- RETCODE ret;
- HSTMT error_test_query1;
- char* str;
- byte buf1[2];
- SDWORD len1;
- UCHAR sql_state[6];
- SDWORD native_error;
- UCHAR error_msg[512];
- SWORD error_msg_max = 512;
- SWORD error_msg_len;
-
- UT_NOT_USED(arg);
-
- ret = SQLAllocEnv(&env);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocConnect(env, &conn1);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn1, &error_test_query1);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLConnect(conn1, (UCHAR*)cli_srv_endpoint_name,
- (SWORD)ut_strlen(cli_srv_endpoint_name),
- (UCHAR*)"conn2",
- (SWORD)5, (UCHAR*)"password", 8);
- ut_a(ret == SQL_SUCCESS);
-
- printf("Connection established\n");
-
- /*-----------------------------------------------------------*/
- str = "{TEST_ERRORS(?)}";
-
- ret = SQLPrepare(error_test_query1, (UCHAR*)str, ut_strlen(str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(error_test_query1, 1, SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, buf1,
- 2, &len1);
- ut_a(ret == SQL_SUCCESS);
-
- /*-----------------------------------------------------------*/
-
- printf("Thread 2 to do update\n");
-
- ut_memcpy(buf1, "06", 2);
- len1 = 2;
- ret = SQLExecute(error_test_query1);
- ut_a(ret == SQL_SUCCESS);
-
- printf("Thread 2 has done update\n");
-
- ret = SQLError(SQL_NULL_HENV, SQL_NULL_HDBC, error_test_query1,
- sql_state, &native_error, error_msg, error_msg_max,
- &error_msg_len);
-
- ut_a(ret == SQL_NO_DATA_FOUND);
-
- return(0);
-}
-
-/*********************************************************************
-Test for errors. */
-
-ulint
-test_client_errors(
-/*===============*/
- void* arg) /* in: ignored */
-{
- HENV env;
- HDBC conn1;
- RETCODE ret;
- HSTMT error_test_query1;
- char* str;
- byte buf1[2];
- SDWORD len1;
- UCHAR sql_state[6];
- SDWORD native_error;
- UCHAR error_msg[512];
- SWORD error_msg_max = 512;
- SWORD error_msg_len;
- os_thread_id_t thread_id;
-
- UT_NOT_USED(arg);
-
- ret = SQLAllocEnv(&env);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocConnect(env, &conn1);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLAllocStmt(conn1, &error_test_query1);
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLConnect(conn1, (UCHAR*)"innobase", 8, (UCHAR*)"conn1",
- (SWORD)5, (UCHAR*)"password", 8);
- ut_a(ret == SQL_SUCCESS);
-
- printf("Connection established\n");
-
- /*-----------------------------------------------------------*/
- str = "{TEST_ERRORS(?)}";
-
- ret = SQLPrepare(error_test_query1, (UCHAR*)str, ut_strlen(str));
-
- ut_a(ret == SQL_SUCCESS);
-
- ret = SQLBindParameter(error_test_query1, 1, SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR, 0, 0, buf1,
- 2, &len1);
- ut_a(ret == SQL_SUCCESS);
-
- /*-----------------------------------------------------------*/
-
- ut_memcpy(buf1, "01", 2);
- len1 = 2;
- ret = SQLExecute(error_test_query1);
- ut_a(ret == SQL_SUCCESS);
-
- ut_memcpy(buf1, "02", 2);
- len1 = 2;
- ret = SQLExecute(error_test_query1);
- ut_a(ret == SQL_ERROR);
-
- ret = SQLError(SQL_NULL_HENV, SQL_NULL_HDBC, error_test_query1,
- sql_state, &native_error, error_msg, error_msg_max,
- &error_msg_len);
-
- ut_a(ret == SQL_SUCCESS);
-
- printf("%s\n", error_msg);
-
- ret = SQLError(SQL_NULL_HENV, SQL_NULL_HDBC, error_test_query1,
- sql_state, &native_error, error_msg, error_msg_max,
- &error_msg_len);
-
- ut_a(ret == SQL_NO_DATA_FOUND);
-
- ut_memcpy(buf1, "03", 2);
- len1 = 2;
- ret = SQLExecute(error_test_query1);
- ut_a(ret == SQL_SUCCESS);
-
- ut_memcpy(buf1, "01", 2);
- len1 = 2;
- ret = SQLExecute(error_test_query1);
- ut_a(ret == SQL_ERROR);
-
- ret = SQLError(SQL_NULL_HENV, SQL_NULL_HDBC, error_test_query1,
- sql_state, &native_error, error_msg, error_msg_max,
- &error_msg_len);
-
- ut_a(ret == SQL_SUCCESS);
-
- printf("%s\n", error_msg);
-
- ut_memcpy(buf1, "03", 2);
- len1 = 2;
- ret = SQLExecute(error_test_query1);
- ut_a(ret == SQL_SUCCESS);
-
- ut_memcpy(buf1, "04", 2);
- len1 = 2;
- ret = SQLExecute(error_test_query1);
- ut_a(ret == SQL_ERROR);
-
- ret = SQLError(SQL_NULL_HENV, SQL_NULL_HDBC, error_test_query1,
- sql_state, &native_error, error_msg, error_msg_max,
- &error_msg_len);
-
- ut_a(ret == SQL_SUCCESS);
-
- printf("%s\n", error_msg);
-
- ut_memcpy(buf1, "03", 2);
- len1 = 2;
- ret = SQLExecute(error_test_query1);
- ut_a(ret == SQL_SUCCESS);
-
- ut_memcpy(buf1, "05", 2);
- len1 = 2;
- ret = SQLExecute(error_test_query1);
- ut_a(ret == SQL_SUCCESS);
-
- os_thread_create(&test_client_errors2, "user000", &thread_id);
-
- os_thread_sleep(5000000);
-
- ut_memcpy(buf1, "07", 2);
- len1 = 2;
- ret = SQLExecute(error_test_query1);
- ut_a(ret == SQL_ERROR);
-
- ret = SQLError(SQL_NULL_HENV, SQL_NULL_HDBC, error_test_query1,
- sql_state, &native_error, error_msg, error_msg_max,
- &error_msg_len);
-
- ut_a(ret == SQL_SUCCESS);
-
- printf("%s\n", error_msg);
-
- printf("Thread 1 to commit\n");
-
- ut_memcpy(buf1, "08", 2);
- len1 = 2;
- ret = SQLExecute(error_test_query1);
- ut_a(ret == SQL_SUCCESS);
-
- return(0);
-}
-
-/*************************************************************************
-Simulates disk waits: if there are at least two threads active,
-puts the current thread to wait for an event. If there is just the current
-thread active and another thread doing a simulated disk wait, puts the
-current thread to wait and releases another thread from wait, otherwise does
-nothing */
-
-void
-srv_simulate_disk_wait(void)
-/*========================*/
-{
- os_event_t event;
- ulint wait_i;
- ulint count;
- bool found;
- ulint rnd;
- ulint i;
- ulint j;
-
- mutex_enter(&kernel_mutex);
-
- srv_disk_rnd += 98687241;
-
- count = 0;
- found = FALSE;
-
- for (i = 0; i < SRV_N_SIM_DISK_ARRAY; i++) {
-
- if (!srv_sim_disk[i].empty) {
-
- count++;
- }
-
- if (!found && srv_sim_disk[i].empty) {
-
- srv_sim_disk[i].empty = FALSE;
- event = srv_sim_disk[i].event;
-
- os_event_reset(event);
- srv_sim_disk[i].event_set = FALSE;
-
- wait_i = i;
-
- found = TRUE;
- }
- }
-
- ut_a(found);
-
- if (srv_disk_n_active_threads == count + 1) {
- /* We have to release a thread from the disk wait array */;
-
- rnd = srv_disk_rnd;
-
- for (i = rnd; i < SRV_N_SIM_DISK_ARRAY + rnd; i++) {
-
- j = i % SRV_N_SIM_DISK_ARRAY;
-
- if (!srv_sim_disk[j].empty
- && !srv_sim_disk[j].event_set) {
-
- srv_sim_disk[j].event_set = TRUE;
- os_event_set(srv_sim_disk[j].event);
-
- break;
- }
- }
- }
-
- mutex_exit(&kernel_mutex);
-
- os_event_wait(event);
-
- mutex_enter(&kernel_mutex);
-
- srv_sim_disk[wait_i].empty = TRUE;
-
- mutex_exit(&kernel_mutex);
-}
-
-/*************************************************************************
-Releases a thread from the simulated disk wait array if there is any to
-release. */
-
-void
-srv_simulate_disk_wait_release(void)
-/*================================*/
-{
- ulint rnd;
- ulint i;
- ulint j;
-
- mutex_enter(&kernel_mutex);
-
- srv_disk_rnd += 98687241;
- rnd = srv_disk_rnd;
-
- for (i = rnd; i < SRV_N_SIM_DISK_ARRAY + rnd; i++) {
-
- j = i % SRV_N_SIM_DISK_ARRAY;
-
- if (!srv_sim_disk[j].empty
- && !srv_sim_disk[j].event_set) {
-
- srv_sim_disk[j].event_set = TRUE;
- os_event_set(srv_sim_disk[j].event);
-
- break;
- }
- }
-
- mutex_exit(&kernel_mutex);
-}
-
-/*********************************************************************
-Test for many threads and disk waits. */
-
-ulint
-test_disk_waits(
-/*============*/
- void* arg) /* in: ignored */
-{
- ulint i;
- ulint tm, oldtm;
-
- UT_NOT_USED(arg);
-
- n_exited++;
-
- printf("Client thread starts as the %luth\n", n_exited);
-
- oldtm = ut_clock();
-
- mutex_enter(&kernel_mutex);
- srv_disk_n_active_threads++;
- mutex_exit(&kernel_mutex);
-
- for (i = 0; i < 133; i++) {
- ut_delay(500);
-
-/* os_thread_yield(); */
-
-/* os_thread_sleep(10000); */
-
- srv_simulate_disk_wait();
- }
-
- mutex_enter(&kernel_mutex);
- srv_disk_n_active_threads--;
- mutex_exit(&kernel_mutex);
-
- srv_simulate_disk_wait_release();
-
- tm = ut_clock();
-
- printf("Wall time for %lu loops %lu milliseconds\n", i, tm - oldtm);
-
- n_exited++;
-
- printf("Client thread exits as the %luth\n", n_exited);
-
- return(0);
-}
-
-/*************************************************************************
-Reads a keywords and a values from an initfile. In case of an error, exits
-from the process. */
-
-void
-cli_read_initfile(
-/*==============*/
- FILE* initfile) /* in: file pointer */
-{
- char str_buf[10000];
- ulint ulint_val;
-
- srv_read_init_val(initfile, FALSE, "SRV_ENDPOINT_NAME", str_buf,
- &ulint_val);
- ut_a(ut_strlen(str_buf) < COM_MAX_ADDR_LEN);
-
- ut_memcpy(cli_srv_endpoint_name, str_buf, COM_MAX_ADDR_LEN);
-
- srv_read_init_val(initfile, FALSE, "USER_NAME", str_buf,
- &ulint_val);
- ut_a(ut_strlen(str_buf) < COM_MAX_ADDR_LEN);
-
- ut_memcpy(cli_user_name, str_buf, COM_MAX_ADDR_LEN);
-
- srv_read_init_val(initfile, TRUE, "MEM_POOL_SIZE", str_buf,
- &mem_pool_size);
-
- srv_read_init_val(initfile, TRUE, "N_WAREHOUSES", str_buf,
- &n_warehouses);
-
- srv_read_init_val(initfile, TRUE, "N_CUSTOMERS_D", str_buf,
- &n_customers_d);
-
- srv_read_init_val(initfile, TRUE, "IS_TPC_D", str_buf,
- &is_tpc_d);
-
- srv_read_init_val(initfile, TRUE, "N_ROUNDS", str_buf,
- &n_rounds);
-
- srv_read_init_val(initfile, TRUE, "N_USERS", str_buf,
- &n_users);
-
- srv_read_init_val(initfile, TRUE, "STARTDATE", str_buf,
- &startdate);
-
- srv_read_init_val(initfile, TRUE, "ENDDATE", str_buf,
- &enddate);
-
- srv_read_init_val(initfile, TRUE, "OWN_WAREHOUSE", str_buf,
- &own_warehouse);
-}
-
-/*************************************************************************
-*/
-void
-cli_boot(
-/*=====*/
- char* name) /* in: the initialization file name */
-{
- FILE* initfile;
-
- initfile = fopen(name, "r");
-
- if (initfile == NULL) {
- printf(
- "Error in client booting: could not open initfile whose name is %s!\n",
- name);
- os_process_exit(1);
- }
-
- cli_read_initfile(initfile);
-
- fclose(initfile);
-}
-
-/********************************************************************
-Main test function. */
-
-void
-main(void)
-/*======*/
-{
- os_thread_t thread_handles[1000];
- os_thread_id_t thread_ids[1000];
- char user_names[1000];
- ulint tm, oldtm;
- ulint i;
- ulint dates[1000];
-
- cli_boot("cli_init");
-
- for (i = 1; i <= n_users; i++) {
- dates[2 * i] = startdate
- + ((enddate - startdate) / n_users) * (i - 1);
- dates[2 * i + 1] = startdate
- + ((enddate - startdate) / n_users) * i;
- }
-
- sync_init();
-
- mem_init(mem_pool_size);
-
- test_init(NULL);
-
- check_tpc_consistency("con21");
-
-/* test_client_errors(NULL); */
-
- os_thread_sleep(4000000);
-
- printf("Sleep ends\n");
-
- oldtm = ut_clock();
-
- for (i = 2; i <= n_users; i++) {
- if (is_tpc_d) {
- thread_handles[i] = os_thread_create(&test_tpc_d_client,
- dates + 2 * i, thread_ids + i);
- } else {
- sprintf(user_names + i * 8, "use2%3lu", i);
-
- thread_handles[i] = os_thread_create(&test_client,
- user_names + i * 8, thread_ids + i);
- }
-
- ut_a(thread_handles[i]);
- }
-
- if (is_tpc_d) {
- test_tpc_d_client(dates + 2 * 1);
- } else {
- test_client("use2 1");
- }
-
- for (i = 2; i <= n_users; i++) {
- os_thread_wait(thread_handles[i]);
-
- printf("Wait for thread %lu ends\n", i);
- }
-
- tm = ut_clock();
-
- printf("Wall time for test %lu milliseconds\n", tm - oldtm);
-
- os_thread_sleep(4000000);
-
- printf("Sleep ends\n");
-
- test_single_row_select("con99");
-
- check_tpc_consistency("con22");
-
- printf("TESTS COMPLETED SUCCESSFULLY!\n");
-}