perfkitbenchmarker/data/sysbench/spanner_pg_tpcc_run.lua (497 lines of code) (raw):
#!/usr/bin/env sysbench
-- ----------------------------------------------------------------------
-- TPCC-like workload
-- https://github.com/Percona-Lab/sysbench-tpcc/releases/tag/v2.2
-- ----------------------------------------------------------------------
require("tpcc_common")
--
-- produce the id of a valid warehouse other than home_ware
-- (assuming there is one)
--
function other_ware (home_ware)
local tmp
if sysbench.opt.scale == 1 then return home_ware end
repeat
tmp = sysbench.rand.uniform(1, sysbench.opt.scale)
until tmp == home_ware
return tmp
end
function prepared_statements_for_run(table_num)
-- table_num for all sysbench.opt.tables
con:query("PREPARE select_customer_info"..table_num..
[[ as SELECT c_discount, c_last, c_credit, w_tax
FROM customer]]..table_num..[[ , warehouse]]..table_num..[[
WHERE w_id = $1
AND c_w_id = w_id
AND c_d_id = $2
AND c_id = $3]])
con:query("PREPARE get_next_order_id_and_tax"..table_num..
[[ as SELECT d_next_o_id, d_tax
FROM district]]..table_num..[[
WHERE d_w_id = $1
AND d_id = $2]])
con:query("PREPARE get_next_order_id"..table_num..
[[ as SELECT d_next_o_id
FROM district]]..table_num..[[
WHERE d_id = $1 AND d_w_id= $2]])
con:query("PREPARE update_next_order_id"..table_num..
[[ as UPDATE district]]..table_num..[[
SET d_next_o_id = $1
WHERE d_id = $2 AND d_w_id= $3]])
con:query("PREPARE insert_order"..table_num.."(bigint,bigint,bigint,bigint,bigint,bigint)"..
[[ as INSERT INTO orders]]..table_num..[[
(o_id, o_d_id, o_w_id, o_c_id, o_entry_d, o_ol_cnt, o_all_local)
VALUES ($1,$2,$3,$4,NOW(),$5,$6)]])
con:query("PREPARE insert_new_order"..table_num..
[[ as INSERT INTO new_orders]]..table_num..[[ (no_o_id, no_d_id, no_w_id)
VALUES ($1,$2,$3)]])
con:query("PREPARE select_item"..table_num..
[[ as SELECT i_price, i_name, i_data
FROM item]]..table_num..[[
WHERE i_id = $1]])
con:query("PREPARE select_stock"..table_num..
[[ as 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]]..table_num..[[
WHERE s_i_id = $1 AND s_w_id= $2]])
con:query("PREPARE update_stock"..table_num..
[[ as UPDATE stock]]..table_num..[[
SET s_quantity = $1
WHERE s_i_id = $2
AND s_w_id= $3]])
con:query("PREPARE insert_order_line"..table_num..
[[ as INSERT INTO order_line]]..table_num..[[
(ol_o_id, ol_d_id, ol_w_id, ol_number, ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_dist_info)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9)]])
con:query("PREPARE update_warehouse"..table_num..
[[ as UPDATE warehouse]]..table_num..[[
SET w_ytd = w_ytd + $1
WHERE w_id = $2]])
con:query("PREPARE select_warehouse"..table_num..
[[ as SELECT w_street_1, w_street_2, w_city, w_state, w_zip, w_name
FROM warehouse]]..table_num..[[
WHERE w_id = $1]])
con:query("PREPARE update_district"..table_num..
[[ as UPDATE district]]..table_num..[[
SET d_ytd = d_ytd + $1
WHERE d_w_id = $2
AND d_id= $3]])
con:query("PREPARE select_district"..table_num..
[[ as SELECT d_street_1, d_street_2, d_city, d_state, d_zip, d_name
FROM district]]..table_num..[[
WHERE d_w_id = $1
AND d_id = $2]])
con:query("PREPARE count_customer"..table_num..
[[ as SELECT count(c_id) namecnt
FROM customer]]..table_num..[[
WHERE c_w_id = $1
AND c_d_id= $2 AND c_last=$3 ]])
con:query("PREPARE select_customer"..table_num..
[[ as SELECT c_id
FROM customer]]..table_num..[[
WHERE c_w_id = $1 AND c_d_id= $2
AND c_last=$3 ORDER BY c_first ]])
con:query("PREPARE select_customer_details"..table_num..
[[ as 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_ytd_payment, c_since
FROM customer]]..table_num..[[
WHERE c_w_id = $1
AND c_d_id= $2
AND c_id=$3 ]])
con:query("PREPARE select_customer_c_data"..table_num..
[[ as SELECT c_data
FROM customer]]..table_num..[[
WHERE c_w_id = $1
AND c_d_id=$2
AND c_id= $3]])
con:query("PREPARE update_customer_1_"..table_num..
[[ as UPDATE customer]]..table_num..[[
SET c_balance=$1, c_ytd_payment=$2, c_data=$3
WHERE c_w_id = $4
AND c_d_id=$5
AND c_id=$6]])
con:query("PREPARE update_customer_2_"..table_num..
[[ as UPDATE customer]]..table_num..[[
SET c_balance=$1, c_ytd_payment=$2
WHERE c_w_id = $3
AND c_d_id=$4
AND c_id=$5]])
con:query("PREPARE insert_history"..table_num.."(bigint,bigint,bigint,bigint,bigint,bigint,varchar)"..
[[ as INSERT INTO history]]..table_num..[[
(h_c_d_id, h_c_w_id, h_c_id, h_d_id, h_w_id, h_date, h_amount, h_data)
VALUES ($1,$2,$3,$4,$5,NOW(),$6,$7)]])
con:query("PREPARE select_customer_balance_1_"..table_num..
[[ as SELECT c_balance, c_first, c_middle, c_id
FROM customer]]..table_num..[[
WHERE c_w_id = $1
AND c_d_id= $2
AND c_last=$3 ORDER BY c_first]])
con:query("PREPARE select_customer_balance_2_"..table_num..
[[ as SELECT c_balance, c_first, c_middle, c_last
FROM customer]]..table_num..[[
WHERE c_w_id = $1
AND c_d_id=$2
AND c_id=$3]])
con:query("PREPARE select_order"..table_num..
[[ as SELECT o_id, o_carrier_id, o_entry_d
FROM orders]]..table_num..[[
WHERE o_w_id = $1
AND o_d_id = $2
AND o_c_id = $3
ORDER BY o_id DESC]])
con:query("PREPARE select_order_line"..table_num..
[[ as SELECT ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_delivery_d
FROM order_line]]..table_num..[[
WHERE ol_w_id = $1 AND ol_d_id = $2 AND ol_o_id = $3]])
con:query("PREPARE select_new_order"..table_num..
[[ as SELECT no_o_id
FROM new_orders]]..table_num..[[
WHERE no_d_id = $1
AND no_w_id = $2
ORDER BY no_o_id ASC LIMIT 1]])
con:query("PREPARE delete_new_order"..table_num..
[[ as DELETE FROM new_orders]]..table_num..[[
WHERE no_o_id = $1
AND no_d_id = $2
AND no_w_id = $3]])
con:query("PREPARE select_order_customer"..table_num..
[[ as SELECT o_c_id
FROM orders]]..table_num..[[
WHERE o_id = $1
AND o_d_id = $2
AND o_w_id = $3]])
con:query("PREPARE update_order"..table_num..
[[ as UPDATE orders]]..table_num..[[
SET o_carrier_id = $1
WHERE o_id = $2
AND o_d_id = $3
AND o_w_id = $4]])
con:query("PREPARE update_order_line"..table_num..
[[ as UPDATE order_line]]..table_num..[[
SET ol_delivery_d = NOW()
WHERE ol_o_id = $1
AND ol_d_id = $2
AND ol_w_id = $3]])
con:query("PREPARE sum_order_line"..table_num..
[[ as SELECT SUM(ol_amount) sm
FROM order_line]]..table_num..[[
WHERE ol_o_id = $1
AND ol_d_id = $2
AND ol_w_id = $3]])
con:query("PREPARE update_customer_bal"..table_num..
[[ as UPDATE customer]]..table_num..[[
SET c_balance = c_balance + $1,
c_delivery_cnt = c_delivery_cnt + 1
WHERE c_id = $2
AND c_d_id = $3
AND c_w_id = $4]])
con:query("PREPARE count_order_line"..table_num..
[[ as SELECT COUNT(DISTINCT (s_i_id))
FROM order_line]]..table_num..[[, stock]]..table_num..[[
WHERE ol_w_id = $1
AND ol_d_id = $2
AND ol_o_id < $3
AND ol_o_id >= $4
AND s_w_id= $5
AND s_i_id=ol_i_id
AND s_quantity < $6]])
end
function new_order()
-- prep work
local table_num = sysbench.rand.uniform(1, sysbench.opt.tables)
local w_id = sysbench.rand.uniform(1, sysbench.opt.scale)
local d_id = sysbench.rand.uniform(1, DIST_PER_WARE)
local c_id = NURand(1023, 1, CUST_PER_DIST)
local ol_cnt = sysbench.rand.uniform(5, 15);
local rbk = sysbench.rand.uniform(1, 100);
local itemid = {}
local supware = {}
local qty = {}
local all_local = 1
for i = 1, ol_cnt
do
itemid[i] = NURand(8191, 1, MAXITEMS)
if ((i == ol_cnt - 1) and (rbk == 1))
then
itemid[i] = -1
end
if sysbench.rand.uniform(1, 100) ~= 1
then
supware[i] = w_id
else
supware[i] = other_ware(w_id)
all_local = 0
end
qty[i] = sysbench.rand.uniform(1, 10)
end
-- SELECT c_discount, c_last, c_credit, w_tax
-- INTO :c_discount, :c_last, :c_credit, :w_tax
-- FROM customer, warehouse
-- WHERE w_id = :w_id
-- AND c_w_id = w_id
-- AND c_d_id = :d_id
-- AND c_id = :c_id;
con:query("BEGIN")
local c_discount
local c_last
local c_credit
local w_tax
c_discount, c_last, c_credit, w_tax = con:query_row(([[EXECUTE select_customer_info%d (%d,%d,%d);]]):
format(table_num, w_id, d_id, c_id))
-- SELECT d_next_o_id, d_tax INTO :d_next_o_id, :d_tax
-- FROM district
-- WHERE d_id = :d_id
-- AND d_w_id = :w_id
-- FOR UPDATE
local d_next_o_id
local d_tax
-- TODO(user) removed SELECT ... FOR UPDATE.
d_next_o_id, d_tax = con:query_row(([[EXECUTE get_next_order_id_and_tax%d (%d,%d);]]):
format(table_num, w_id, d_id))
-- UPDATE district SET d_next_o_id = :d_next_o_id + 1
-- WHERE d_id = :d_id
-- AND d_w_id = :w_id;
con:query(([[EXECUTE update_next_order_id%d (%d,%d,%d);]]):format(table_num, d_next_o_id + 1, d_id, w_id))
--INSERT INTO orders (o_id, o_d_id, o_w_id, o_c_id,
-- o_entry_d, o_ol_cnt, o_all_local)
-- VALUES(:o_id, :d_id, :w_id, :c_id,
-- :datetime,
-- :o_ol_cnt, :o_all_local);
con:query(([[EXECUTE insert_order%d (%d,%d,%d,%d,%d,%d);]]):
format(table_num, d_next_o_id, d_id, w_id, c_id, ol_cnt, all_local))
-- INSERT INTO new_orders (no_o_id, no_d_id, no_w_id)
-- VALUES (:o_id,:d_id,:w_id); */
con:query(([[EXECUTE insert_new_order%d (%d,%d,%d);]]):
format(table_num, d_next_o_id, d_id, w_id))
for ol_number=1, ol_cnt do
local ol_supply_w_id = supware[ol_number]
local ol_i_id = itemid[ol_number]
local ol_quantity = qty[ol_number]
-- SELECT i_price, i_name, i_data
-- INTO :i_price, :i_name, :i_data
-- FROM item
-- WHERE i_id = :ol_i_id;*/
rs = con:query(([[EXECUTE select_item%d (%d)]]):
format(table_num, ol_i_id))
local i_price
local i_name
local i_data
if rs.nrows == 0 then
-- print("ROLLBACK")
ffi.C.sb_counter_inc(sysbench.tid, ffi.C.SB_CNT_ERROR)
con:query("ROLLBACK")
return
end
i_price, i_name, i_data = unpack(rs:fetch_row(), 1, rs.nfields)
-- 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
-- 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
-- FROM stock
-- WHERE s_i_id = :ol_i_id
-- AND s_w_id = :ol_supply_w_id
-- FOR UPDATE;*/
local s_quantity
local s_data
local ol_dist_info
local ol_di = {}
s_quantity, s_data, ol_di[1], ol_di[2], ol_di[3], ol_di[4], ol_di[5], ol_di[6], ol_di[7], ol_di[8], ol_di[9], ol_di[10] = con:query_row((
[[EXECUTE select_stock%d (%d,%d)]]):
format(table_num,ol_i_id,ol_supply_w_id ))
ol_dist_info = ol_di[d_id]
s_quantity=tonumber(s_quantity)
if (s_quantity > ol_quantity) then
s_quantity = s_quantity - ol_quantity
else
s_quantity = s_quantity - ol_quantity + 91
end
-- UPDATE stock SET s_quantity = :s_quantity
-- WHERE s_i_id = :ol_i_id
-- AND s_w_id = :ol_supply_w_id;*/
con:query(([[EXECUTE update_stock%d (%d,%d,%d)]]):
format(table_num, s_quantity, ol_i_id, ol_supply_w_id))
i_price=tonumber(i_price)
w_tax=tonumber(w_tax)
d_tax=tonumber(d_tax)
c_discount=tonumber(c_discount)
ol_amount = ol_quantity * i_price * (1 + w_tax + d_tax) * (1 - c_discount);
-- INSERT INTO order_line (ol_o_id, ol_d_id, ol_w_id,
-- ol_number, ol_i_id,
-- ol_supply_w_id, ol_quantity,
-- ol_amount, ol_dist_info)
-- VALUES (:o_id, :d_id, :w_id, :ol_number, :ol_i_id,
-- :ol_supply_w_id, :ol_quantity, :ol_amount,
-- :ol_dist_info);
con:query(([[EXECUTE insert_order_line%d (%d,%d,%d,%d,%d,%d,%d,%d,'%s')]]):
format(table_num, d_next_o_id, d_id, w_id, ol_number, ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_dist_info))
end
con:query("COMMIT")
end
function payment()
-- prep work
local table_num = sysbench.rand.uniform(1, sysbench.opt.tables)
local w_id = sysbench.rand.uniform(1, sysbench.opt.scale)
local d_id = sysbench.rand.uniform(1, DIST_PER_WARE)
local c_id = NURand(1023, 1, CUST_PER_DIST)
local h_amount = sysbench.rand.uniform(1,5000)
local byname
local c_w_id
local c_d_id
local c_last = Lastname(NURand(255,0,999))
if sysbench.rand.uniform(1, 100) <= 60 then
byname = 1 -- select by last name
else
byname = 0 -- select by customer id
end
if sysbench.rand.uniform(1, 100) <= 85 then
c_w_id = w_id
c_d_id = d_id
else
c_w_id = other_ware(w_id)
c_d_id = sysbench.rand.uniform(1, DIST_PER_WARE)
end
-- UPDATE warehouse SET w_ytd = w_ytd + :h_amount
-- WHERE w_id =:w_id
con:query("BEGIN")
con:query(([[EXECUTE update_warehouse%d (%d,%d)]]):format(table_num, h_amount, w_id ))
-- SELECT w_street_1, w_street_2, w_city, w_state, w_zip,
-- w_name
-- INTO :w_street_1, :w_street_2, :w_city, :w_state,
-- :w_zip, :w_name
-- FROM warehouse
-- WHERE w_id = :w_id;*/
local w_street_1, w_street_2, w_city, w_state, w_zip, w_name
w_street_1, w_street_2, w_city, w_state, w_zip, w_name =
con:query_row(([[EXECUTE select_warehouse%d (%d)]]):format(table_num, w_id))
-- UPDATE district SET d_ytd = d_ytd + :h_amount
-- WHERE d_w_id = :w_id
-- AND d_id = :d_id;*/
con:query(([[EXECUTE update_district%d (%d,%d,%d)]]):format(table_num, h_amount, w_id, d_id))
local d_street_1,d_street_2, d_city, d_state, d_zip, d_name
d_street_1,d_street_2, d_city, d_state, d_zip, d_name =
con:query_row(([[EXECUTE select_district%d (%d,%d)]]):format(table_num, w_id, d_id ))
if byname == 1 then
-- SELECT count(c_id)
-- FROM customer
-- WHERE c_w_id = :c_w_id
-- AND c_d_id = :c_d_id
-- AND c_last = :c_last;*/
local namecnt = con:query_row(([[EXECUTE count_customer%d (%d,%d,'%s')]]):format(table_num, w_id, c_d_id, c_last ))
-- 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;
if namecnt % 2 == 0 then
namecnt = namecnt + 1
end
rs = con:query(([[EXECUTE select_customer%d (%d,%d,'%s')]]
):format(table_num, w_id, c_d_id, c_last ))
for i = 1, (namecnt / 2 ) + 1 do
row = rs:fetch_row()
c_id = row[1]
end
end -- byname
-- 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;
local 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_ytd_payment, c_since
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_ytd_payment, c_since =
con:query_row(([[EXECUTE select_customer_details%d (%d,%d,%d)]])
:format(table_num, w_id, c_d_id, c_id ))
c_balance = tonumber(c_balance) - h_amount
c_ytd_payment = tonumber(c_ytd_payment) + h_amount
if c_credit == "BC" then
-- 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; */
local c_data
c_data = con:query_row(([[EXECUTE select_customer_c_data%d (%d,%d,%d)]]):
format(table_num, w_id, c_d_id, c_id ))
local c_new_data=string.sub(string.format("| %4d %2d %4d %2d %4d $%7.2f %12s %24s",
c_id, c_d_id, c_w_id, d_id, w_id, h_amount, os.time(), c_data), 1, 500);
-- UPDATE customer
-- SET c_balance = :c_balance, c_data = :c_new_data
-- WHERE c_w_id = :c_w_id
-- AND c_d_id = :c_d_id
-- AND c_id = :c_id
con:query(([[EXECUTE update_customer_1_%d (%f,%f,'%s',%d,%d,%d)]])
:format(table_num, c_balance, c_ytd_payment, c_new_data, w_id, c_d_id, c_id ))
else
con:query(([[EXECUTE update_customer_2_%d (%f,%f,%d,%d,%d)]])
:format(table_num, c_balance, c_ytd_payment, w_id, c_d_id, c_id ))
end
-- INSERT INTO history(h_c_d_id, h_c_w_id, h_c_id, h_d_id,
-- h_w_id, h_date, h_amount, h_data)
-- VALUES(:c_d_id, :c_w_id, :c_id, :d_id, :w_id, :datetime, :h_amount, :h_data);
con:query(([[EXECUTE insert_history%d (%d,%d,%d,%d,%d,%d,'%s')]])
:format(table_num, c_d_id, c_w_id, c_id, d_id, w_id, h_amount,
string.format("%10s %10s ",w_name,d_name))) -- Had to remove a space
con:query("COMMIT")
end
function orderstatus()
local table_num = sysbench.rand.uniform(1, sysbench.opt.tables)
local w_id = sysbench.rand.uniform(1, sysbench.opt.scale)
local d_id = sysbench.rand.uniform(1, DIST_PER_WARE)
local c_id = NURand(1023, 1, CUST_PER_DIST)
local byname
local c_last = Lastname(NURand(255,0,999))
if sysbench.rand.uniform(1, 100) <= 60 then
byname = 1 -- select by last name
else
byname = 0 -- select by customer id
end
local c_balance
local c_first
local c_middle
con:query("BEGIN")
if byname == 1 then
-- /*EXEC_SQL SELECT count(c_id)
-- FROM customer
-- WHERE c_w_id = :c_w_id
-- AND c_d_id = :c_d_id
-- AND c_last = :c_last;*/
local namecnt
namecnt = con:query_row(([[EXECUTE count_customer%d (%d,%d,'%s')]]):
format(table_num, w_id, d_id, c_last ))
-- SELECT c_balance, c_first, c_middle, 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;
rs = con:query(([[EXECUTE select_customer_balance_1_%d (%d,%d,'%s')]])
:format(table_num, w_id, d_id, c_last ))
if namecnt % 2 == 0 then
namecnt = namecnt + 1
end
for i = 1, (namecnt / 2 ) + 1 do
row = rs:fetch_row()
c_balance = row[1]
c_first = row[2]
c_middle = row[3]
c_id = row[4]
end
else
-- SELECT 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;*/
c_balance, c_first, c_middle, c_last =
con:query_row(([[EXECUTE select_customer_balance_2_%d (%d,%d,%d)]])
:format(table_num, w_id, d_id, c_id ))
end
--[=[ Initial query
SELECT o_id, o_entry_d, COALESCE(o_carrier_id,0) FROM orders
WHERE o_w_id = ? AND o_d_id = ? AND o_c_id = ? AND o_id =
(SELECT MAX(o_id) FROM orders WHERE o_w_id = ? AND o_d_id = ? AND o_c_id = ?)
rs = con:query(([[SELECT o_id, o_entry_d, COALESCE(o_carrier_id,0)
FROM orders%d WHERE o_w_id = %d AND o_d_id = %d AND o_c_id = %d AND o_id =
(SELECT MAX(o_id) FROM orders%d WHERE o_w_id = %d AND o_d_id = %d AND o_c_id = %d)]])
:format(table_num, w_id, d_id, c_id, table_num, w_id, d_id, c_id))
--]=]
--[[ Query from tpcc standard
EXEC SQL SELECT o_id, o_carrier_id, o_entry_d
INTO :o_id, :o_carrier_id, :entdate
FROM orders
ORDER BY o_id DESC;
-]]
local o_id
o_id = con:query_row(([[EXECUTE select_order%d (%d,%d,%d)]]):
format(table_num, w_id, d_id, c_id))
-- rs = con:query(([[SELECT o_id, o_carrier_id, o_entry_d
-- FROM orders%d
-- WHERE o_w_id = %d
-- AND o_d_id = %d
-- AND o_c_id = %d
-- ORDER BY o_id DESC]]):
-- format(table_num, w_id, d_id, c_id))
-- if rs.nrows == 0 then
-- print(string.format("Error o_id %d, %d, %d, %d\n", table_num , w_id , d_id , c_id))
-- end
-- for i = 1, rs.nrows do
-- row = rs:fetch_row()
-- o_id= row[1]
-- end
-- 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;*/
rs = con:query(([[EXECUTE select_order_line%d (%d,%d,%d)]])
:format(table_num, w_id, d_id, o_id))
for i = 1, rs.nrows do
row = rs:fetch_row()
local ol_i_id = row[1]
local ol_supply_w_id = row[2]
local ol_quantity = row[3]
local ol_amount = row[4]
local ol_delivery_d = row[5]
end
con:query("COMMIT")
end
function delivery()
local table_num = sysbench.rand.uniform(1, sysbench.opt.tables)
local w_id = sysbench.rand.uniform(1, sysbench.opt.scale)
local o_carrier_id = sysbench.rand.uniform(1, 10)
con:query("BEGIN")
for d_id = 1, DIST_PER_WARE do
-- SELECT COALESCE(MIN(no_o_id),0) INTO :no_o_id
-- FROM new_orders
-- WHERE no_d_id = :d_id AND no_w_id = :w_id;*/
-- rs = con:query(([[SELECT COALESCE(MIN(no_o_id),0) no_o_id
-- FROM new_orders%d WHERE no_d_id = %d AND no_w_id = %d FOR UPDATE]])
-- :format(table_num, d_id, w_id))
local no_o_id
rs = con:query(([[EXECUTE select_new_order%d (%d,%d)]])
:format(table_num, d_id, w_id))
if (rs.nrows > 0) then
no_o_id=unpack(rs:fetch_row(), 1, rs.nfields)
end
if (no_o_id ~= nil ) then
-- DELETE FROM new_orders WHERE no_o_id = :no_o_id AND no_d_id = :d_id
-- AND no_w_id = :w_id;*/
con:query(([[EXECUTE delete_new_order%d (%d,%d,%d)]])
:format(table_num, no_o_id, d_id, w_id))
-- SELECT o_c_id INTO :c_id FROM orders
-- WHERE o_id = :no_o_id AND o_d_id = :d_id
-- AND o_w_id = :w_id;*/
local o_c_id
o_c_id = con:query_row(([[EXECUTE select_order_customer%d (%d,%d,%d)]])
:format(table_num, no_o_id, d_id, w_id))
-- UPDATE orders SET o_carrier_id = :o_carrier_id
-- WHERE o_id = :no_o_id AND o_d_id = :d_id AND
-- o_w_id = :w_id;*/
con:query(([[EXECUTE update_order%d (%d,%d,%d,%d)]])
:format(table_num, o_carrier_id, no_o_id, d_id, w_id))
-- UPDATE order_line
-- SET ol_delivery_d = :datetime
-- WHERE ol_o_id = :no_o_id AND ol_d_id = :d_id AND
-- ol_w_id = :w_id;*/
con:query(([[EXECUTE update_order_line%d (%d,%d,%d)]])
:format(table_num, no_o_id, d_id, w_id))
-- SELECT SUM(ol_amount) INTO :ol_total
-- FROM order_line
-- WHERE ol_o_id = :no_o_id AND ol_d_id = :d_id
-- AND ol_w_id = :w_id;*/
local sm_ol_amount
sm_ol_amount = con:query_row(([[EXECUTE sum_order_line%d (%d,%d,%d)]])
:format(table_num, no_o_id, d_id, w_id))
-- UPDATE customer SET c_balance = c_balance + :ol_total ,
-- c_delivery_cnt = c_delivery_cnt + 1
-- WHERE c_id = :c_id AND c_d_id = :d_id AND
-- c_w_id = :w_id;*/
-- print(string.format("update customer table %d, cid %d, did %d, wid %d balance %f",table_num, o_c_id, d_id, w_id, sm_ol_amount))
con:query(([[EXECUTE update_customer_bal%d (%f,%d,%d,%d)]])
:format(table_num, sm_ol_amount, o_c_id, d_id, w_id))
end
end
con:query("COMMIT")
end
function stocklevel()
local table_num = sysbench.rand.uniform(1, sysbench.opt.tables)
local w_id = sysbench.rand.uniform(1, sysbench.opt.scale)
local d_id = sysbench.rand.uniform(1, DIST_PER_WARE)
local level = sysbench.rand.uniform(10, 20)
con:query("BEGIN")
-- /*EXEC_SQL SELECT d_next_o_id
-- FROM district
-- WHERE d_id = :d_id
-- AND d_w_id = :w_id;*/
-- What variant of queries to use for stock_level transaction
-- case1 - specification
-- case2 - modified/simplified
local stock_level_queries="case1"
local d_next_o_id
d_next_o_id = con:query_row(([[EXECUTE get_next_order_id%d (%d,%d)]])
:format( table_num, d_id, w_id))
if stock_level_queries == "case1" then
--[[
SELECT COUNT(DISTINCT (s_i_id)) 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 AND ol_o_id>=:o_id-20 AND s_w_id=:w_id AND s_i_id=ol_i_id AND s_quantity < :threshold;
--]]
rs = con:query(([[EXECUTE count_order_line%d (%d,%d,%d,%d,%d,%d) ]])
:format(table_num, w_id, d_id, d_next_o_id, d_next_o_id - 20, w_id, level ))
-- SELECT DISTINCT ol_i_id
-- FROM order_line
-- WHERE ol_w_id = :w_id
-- AND ol_d_id = :d_id
-- AND ol_o_id < :d_next_o_id
-- AND ol_o_id >= (:d_next_o_id - 20);
else
rs = con:query(([[SELECT DISTINCT ol_i_id FROM order_line%d
WHERE ol_w_id = %d AND ol_d_id = %d
AND ol_o_id < %d AND ol_o_id >= %d]])
:format(table_num, w_id, d_id, d_next_o_id, d_next_o_id - 20 ))
local ol_i_id
for i = 1, rs.nrows do
ol_i_id = unpack(rs:fetch_row(), 1, rs.nfields)
-- SELECT count(*) INTO :i_count
-- FROM stock
-- WHERE s_w_id = :w_id
-- AND s_i_id = :ol_i_id
-- AND s_quantity < :level;*/
rs1 = con:query(([[SELECT count(*) FROM stock%d
WHERE s_w_id = %d AND s_i_id = %d
AND s_quantity < %d]])
:format(table_num, w_id, ol_i_id, level ) )
local cnt
for i = 1, rs1.nrows do
cnt = unpack(rs1:fetch_row(), 1, rs1.nfields)
end
end
end
con:query("COMMIT")
end
-- function purge to remove all orders, this is useful if we want to limit data directory in size
function purge()
for i = 1, 10 do
local table_num = sysbench.rand.uniform(1, sysbench.opt.tables)
local w_id = sysbench.rand.uniform(1, sysbench.opt.scale)
local d_id = sysbench.rand.uniform(1, DIST_PER_WARE)
con:query("BEGIN")
local m_o_id
rs = con:query(([[SELECT min(no_o_id) mo
FROM new_orders%d
WHERE no_w_id = %d AND no_d_id = %d]])
:format(table_num, w_id, d_id))
if (rs.nrows > 0) then
m_o_id=unpack(rs:fetch_row(), 1, rs.nfields)
end
if (m_o_id ~= nil ) then
-- select o_id,o.o_d_id from orders2 o, (select o_c_id,o_w_id,o_d_id,count(distinct o_id) from orders2 where o_w_id=1 and o_id > 2100 and o_id < 11153 group by o_c_id,o_d_id,o_w_id having count( distinct o_id) > 1 limit 1) t where t.o_w_id=o.o_w_id and t.o_d_id=o.o_d_id and t.o_c_id=o.o_c_id limit 1;
-- find an order to delete
rs = con:query(([[SELECT o_id FROM orders%d o, (SELECT o_c_id,o_w_id,o_d_id,count(distinct o_id) FROM orders%d WHERE o_w_id=%d AND o_d_id=%d AND o_id > 2100 AND o_id < %d GROUP BY o_c_id,o_d_id,o_w_id having count( distinct o_id) > 1 limit 1) t WHERE t.o_w_id=o.o_w_id and t.o_d_id=o.o_d_id and t.o_c_id=o.o_c_id limit 1 ]])
:format(table_num, table_num, w_id, d_id, m_o_id))
local del_o_id
if (rs.nrows > 0) then
del_o_id=unpack(rs:fetch_row(), 1, rs.nfields)
end
if (del_o_id ~= nil ) then
con:query(([[DELETE FROM order_line%d where ol_w_id=%d AND ol_d_id=%d AND ol_o_id=%d]])
:format(table_num, w_id, d_id, del_o_id))
con:query(([[DELETE FROM orders%d where o_w_id=%d AND o_d_id=%d and o_id=%d]])
:format(table_num, w_id, d_id, del_o_id))
con:query(([[DELETE FROM history%d where h_w_id=%d AND h_d_id=%d LIMIT 10]])
:format(table_num, w_id, d_id ))
end
end
con:query("COMMIT")
end
end
-- vim:ts=4 ss=4 sw=4 expandtab