📄 tscli.c
字号:
/************************************************************************Tests for the client, TPC-C, and TPC-D Query 5(c) 1996-1998 Innobase OyCreated 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 150srv_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. */ulinttest_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;"""
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -