Skip to content

Commit

Permalink
Merge pull request #602 from sm-shaw/600
Browse files Browse the repository at this point in the history
Add MariaDB/MySQL No Stored Procedures option to TPROC-C
  • Loading branch information
abondvt89 committed Oct 3, 2023
2 parents e2f6341 + a496b9b commit 91ab1d9
Show file tree
Hide file tree
Showing 6 changed files with 748 additions and 38 deletions.
1 change: 1 addition & 0 deletions config/mariadb.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<maria_storage_engine>innodb</maria_storage_engine>
<maria_partition>false</maria_partition>
<maria_prepared>false</maria_prepared>
<maria_no_stored_procs>false</maria_no_stored_procs>
<maria_history_pk>false</maria_history_pk>
</schema>
<driver>
Expand Down
1 change: 1 addition & 0 deletions config/mysql.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
<mysql_partition>false</mysql_partition>
<mysql_prepared>false</mysql_prepared>
<mysql_history_pk>false</mysql_history_pk>
<mysql_no_stored_procs>false</mysql_no_stored_procs>
</schema>
<driver>
<mysql_total_iterations>10000000</mysql_total_iterations>
Expand Down
311 changes: 311 additions & 0 deletions src/mariadb/mariaoltp.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -1364,6 +1364,305 @@ mariaclose $mmaria_handler
}
}

proc insert_maria_no_stored_procs { testtype timedtype } {
#No stored procedure code is different in arguments and whether output is printed
#for timed and test workloads and sync and async
#body is the same
#Build up procs so body is not repeated
#Replace existing stored proc calls with client version
if { $timedtype eq "sync" } {
set newordargs "#NEW ORDER
proc neword { maria_handler no_w_id w_id_input prepare RAISEERROR } \{
"
set payargs "#PAYMENT
proc payment { maria_handler p_w_id w_id_input prepare RAISEERROR } \{
"
set ostatargs "#ORDER_STATUS
proc ostat { maria_handler w_id prepare RAISEERROR } \{
"
set delivargs "#DELIVERY
proc delivery { maria_handler w_id prepare RAISEERROR } \{
"
set stockargs "#STOCK LEVEL
proc slev { maria_handler w_id stock_level_d_id prepare RAISEERROR } \{
"
} else {
set newordargs "#NEW ORDER
proc neword { maria_handler no_w_id w_id_input prepare RAISEERROR clientname} \{
"
set payargs "#PAYMENT
proc payment { maria_handler p_w_id w_id_input prepare RAISEERROR clientname} \{
"
set ostatargs "#ORDER_STATUS
proc ostat { maria_handler w_id prepare RAISEERROR clientname} \{
"
set delivargs "#DELIVERY
proc delivery { maria_handler w_id prepare RAISEERROR clientname} \{
"
set stockargs "#STOCK LEVEL
proc slev { maria_handler w_id stock_level_d_id prepare RAISEERROR clientname} \{
"
}

set newordbody {
global mariastatus
#open new order cursor
#2.4.1.2 select district id randomly from home warehouse where d_w_id = d_id
set no_d_id [ RandomNumber 1 10 ]
#2.4.1.2 Customer id randomly selected where c_d_id = d_id and c_w_id = w_id
set no_c_id [ RandomNumber 1 3000 ]
#2.4.1.3 Items in the order randomly selected from 5 to 15
set ol_cnt [ RandomNumber 5 15 ]
#2.4.1.6 order entry date O_ENTRY_D generated by SUT
set date [ gettimestamp ]
set no_max_w_id $w_id_input

set no_o_all_local 1
set cust_ware [ maria::sel $maria_handler "SELECT c_discount, c_last, c_credit, w_tax FROM customer, warehouse WHERE warehouse.w_id = $no_w_id AND customer.c_w_id = $no_w_id AND customer.c_d_id = $no_d_id AND customer.c_id = $no_c_id" -flatlist ]
lassign $cust_ware discount last credit wtax
mariaexec $maria_handler "start transaction"
set o_id_tax_list [ maria::sel $maria_handler "SELECT d_next_o_id, d_tax FROM district WHERE d_id = $no_d_id AND d_w_id = $no_w_id FOR UPDATE" -flatlist ]
lassign $o_id_tax_list next_o_id dtax
mariaexec $maria_handler "UPDATE district SET d_next_o_id = d_next_o_id + 1 WHERE d_id = $no_d_id AND d_w_id = $no_w_id"
set o_id [ lindex $o_id_tax_list 0 ]
set no_c_discount [ lindex $cust_ware 0 ]
set no_w_tax [ lindex $cust_ware 3 ]
set no_d_tax [ lindex $o_id_tax_list 1 ]
set rbk [ RandomNumber 1 99 ]
set loop_counter 1
while { $loop_counter <= $ol_cnt } {
if { ($loop_counter eq $ol_cnt) && $rbk eq 1 } {
set no_ol_i_id 100001
} else {
set no_ol_i_id [ RandomNumber 1 100000 ]
}
set x [ RandomNumber 1 100 ]
if { $x > 1 } {
set no_ol_supply_w_id $no_w_id
} else {
set no_ol_supply_w_id $no_w_id
set no_o_all_local 0
while { ($no_ol_supply_w_id eq $no_w_id) && ($no_max_w_id != 1) } {
set no_ol_supply_w_id [ RandomNumber 1 $no_max_w_id ]
}
}
set no_ol_quantity [ RandomNumber 1 10 ]
set price_name_data [ maria::sel $maria_handler "SELECT i_price, i_name, i_data FROM item WHERE i_id = $no_ol_i_id" -flatlist ]
if { [ llength $price_name_data ] eq 0 } {
maria::rollback $maria_handler
return
}
set quantity_data_dist [ maria::sel $maria_handler "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_i_id = $no_ol_i_id AND s_w_id = $no_ol_supply_w_id" -flatlist ]
set no_i_price [ lindex $price_name_data 0 ]
set no_s_quantity [ lindex $quantity_data_dist 0 ]
if { $no_s_quantity > $no_ol_quantity } {
set no_s_quantity [ expr {$no_s_quantity - $no_ol_quantity} ]
} else {
set no_s_quantity [ expr {$no_s_quantity - $no_ol_quantity + 91} ]
}
mariaexec $maria_handler "UPDATE stock SET s_quantity = $no_s_quantity WHERE s_i_id = $no_ol_i_id AND s_w_id = $no_ol_supply_w_id"
set no_ol_amount [ expr {($no_ol_quantity * $no_i_price * ( 1 + $no_w_tax + $no_d_tax ) * ( 1 - $no_c_discount ))} ]
switch $no_d_id {
1 { set no_ol_dist_info [ lindex $quantity_data_dist 2 ] }
2 { set no_ol_dist_info [ lindex $quantity_data_dist 3 ] }
3 { set no_ol_dist_info [ lindex $quantity_data_dist 4 ] }
4 { set no_ol_dist_info [ lindex $quantity_data_dist 5 ] }
5 { set no_ol_dist_info [ lindex $quantity_data_dist 6 ] }
6 { set no_ol_dist_info [ lindex $quantity_data_dist 7 ] }
7 { set no_ol_dist_info [ lindex $quantity_data_dist 8 ] }
8 { set no_ol_dist_info [ lindex $quantity_data_dist 9 ] }
9 { set no_ol_dist_info [ lindex $quantity_data_dist 10 ] }
10 { set no_ol_dist_info [ lindex $quantity_data_dist 11 ] }
}
mariaexec $maria_handler "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, $no_d_id, $no_w_id, $loop_counter, $no_ol_i_id, $no_ol_supply_w_id, $no_ol_quantity, $no_ol_amount, '$no_ol_dist_info')"
incr loop_counter
}
mariaexec $maria_handler "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, $no_d_id, $no_w_id, $no_c_id, $date, $ol_cnt, $no_o_all_local)"
mariaexec $maria_handler "INSERT INTO new_order (no_o_id, no_d_id, no_w_id) VALUES ($o_id, $no_d_id, $no_w_id)"
maria::commit $maria_handler
}
set paybody {
global mariastatus
#2.5.1.1 The home warehouse id remains the same for each terminal
#2.5.1.1 select district id randomly from home warehouse where d_w_id = d_id
set p_d_id [ RandomNumber 1 10 ]
#2.5.1.2 customer selected 60% of time by name and 40% of time by number
set x [ RandomNumber 1 100 ]
set y [ RandomNumber 1 100 ]
if { $x <= 85 } {
set p_c_d_id $p_d_id
set p_c_w_id $p_w_id
} else {
#use a remote warehouse
set p_c_d_id [ RandomNumber 1 10 ]
set p_c_w_id [ RandomNumber 1 $w_id_input ]
while { ($p_c_w_id == $p_w_id) && ($w_id_input != 1) } {
set p_c_w_id [ RandomNumber 1 $w_id_input ]
}
}
set nrnd [ NURand 255 0 999 123 ]
set name [ randname $nrnd ]
set p_c_id [ RandomNumber 1 3000 ]
if { $y <= 60 } {
#use customer name
#C_LAST is generated
set byname 1
} else {
#use customer number
set byname 0
set name {}
}
#2.5.1.3 random amount from 1 to 5000
set p_h_amount [ RandomNumber 1 5000 ]
#2.5.1.4 date selected from SUT
set h_date [ gettimestamp ]
#2.5.2.1 Payment Transaction
mariaexec $maria_handler "start transaction"
mariaexec $maria_handler "UPDATE warehouse SET w_ytd = w_ytd + $p_h_amount WHERE w_id = $p_w_id"
set w_address_list [ maria::sel $maria_handler "SELECT w_street_1, w_street_2, w_city, w_state, w_zip, w_name FROM warehouse WHERE w_id = $p_w_id" -flatlist ]
lassign $w_address_list p_w_street_1 p_w_street_2 p_w_city p_w_state p_w_zip p_w_name
set p_w_name [ lindex $w_address_list 5 ]
mariaexec $maria_handler "UPDATE district SET d_ytd = d_ytd + $p_h_amount WHERE d_w_id = $p_w_id AND d_id = $p_d_id"
set d_address_list [ maria::sel $maria_handler "SELECT d_street_1, d_street_2, d_city, d_state, d_zip, d_name FROM district WHERE d_w_id = $p_w_id AND d_id = $p_d_id" -flatlist ]
lassign $d_address_list p_d_street_1 p_d_street_2 p_d_city p_d_state p_d_zip p_d_name
set p_d_name [ lindex $d_address_list 5 ]
if { $byname } {
set namecnt [ maria::sel $maria_handler "SELECT count(c_id) FROM customer WHERE c_last = '$name' AND c_d_id = $p_c_d_id AND c_w_id = $p_c_w_id" -flatlist ]
set cust_list [ maria::sel $maria_handler "SELECT c_first, c_middle, c_id, 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 = $p_c_w_id AND c_d_id = $p_c_d_id AND c_last = '$name' ORDER BY c_first" -list ]
if { [ expr {$namecnt % 2} ] eq 1 } {
set $namecnt [ expr {$namecnt + 1} ]
}
set cust_id_to_query [ lindex $cust_list [ expr {$namecnt / 2} ] ]
lassign $cust_id_to_query p_c_first p_c_middle p_c_id p_c_street_1 p_c_street_2 p_c_city p_c_state p_c_zip p_c_phone p_c_credit p_c_credit_lim p_c_discount p_c_balance p_c_since
set p_c_last $name
} else {
set cust_id_to_query [ maria::sel $maria_handler "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 = $p_c_w_id AND c_d_id = $p_c_d_id AND c_id = $p_c_id" -flatlist ]
lassign $cust_id_to_query p_c_first p_c_middle p_c_last p_c_street_1 p_c_street_2 p_c_city p_c_state p_c_zip p_c_phone p_c_credit p_c_credit_lim p_c_discount p_c_balance p_c_since
}
if { $p_c_balance eq "" } { set p_c_balance 0 }
set p_c_balance [ expr {$p_c_balance + $p_h_amount} ]
if { $p_c_credit eq "BC" } {
set c_data [ join [ maria::sel $maria_handler "SELECT c_data FROM customer WHERE c_w_id = $p_c_w_id AND c_d_id = $p_c_d_id AND c_id = $p_c_id" -flatlist ]]
set h_data [ concat $p_w_name $p_d_name ]
set p_c_new_data [ concat p_c_id $p_c_id p_c_d_id $p_c_d_id p_c_w_id $p_c_w_id p_d_id $p_d_id p_w_id $p_w_id p_h_amount [ format %4.2f $p_h_amount ] h_date $h_date h_data $h_data ]
set p_c_new_data [ string range [ concat $p_c_new_data $c_data ] 1 [ expr 500 - [ string length $p_c_new_data ] ] ]
mariaexec $maria_handler "UPDATE customer SET c_balance = $p_c_balance, c_data = '$p_c_new_data' WHERE c_w_id = $p_c_w_id AND c_d_id = $p_c_d_id AND c_id = $p_c_id"
} else {
mariaexec $maria_handler "UPDATE customer SET c_balance = $p_c_balance WHERE c_w_id = $p_c_w_id AND c_d_id = $p_c_d_id AND c_id = $p_c_id"
set c_data ""
}
set h_data [ concat $p_w_name $p_d_name ]
mariaexec $maria_handler "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 ($p_c_d_id, $p_c_w_id, $p_c_id, $p_d_id, $p_w_id, $h_date, $p_h_amount, '$h_data')"
maria::commit $maria_handler
}
set ostatbody {
global mariastatus
#2.5.1.1 select district id randomly from home warehouse where d_w_id = d_id
set d_id [ RandomNumber 1 10 ]
set nrnd [ NURand 255 0 999 123 ]
set name [ randname $nrnd ]
set c_id [ RandomNumber 1 3000 ]
set y [ RandomNumber 1 100 ]
if { $y <= 60 } {
set byname 1
} else {
set byname 0
set name {}
}
mariaexec $maria_handler "start transaction"
if { $byname eq 1 } {
set namecnt [ list [ maria::sel $maria_handler "SELECT count(c_id) FROM customer WHERE c_last = '$name' AND c_d_id = $d_id AND c_w_id = $w_id" -list ]]
if { [ expr {$namecnt % 2} ] eq 1 } {
incr namecnt
}
set cust_list [ maria::sel $maria_handler "SELECT c_balance, c_first, c_middle, c_id FROM customer WHERE c_last = '$name' AND c_d_id = $d_id AND c_w_id = $w_id ORDER BY c_first" -list ]
set cust_id_to_query [ lindex $cust_list [ expr ($namecnt/2)-1 ] ]
} else {
set cust_id_to_query [ maria::sel $maria_handler "SELECT c_balance, c_first, c_middle, c_last FROM customer WHERE c_id = $c_id AND c_d_id = $d_id AND c_w_id = $w_id" -list ]
}
lassign $cust_id_to_query os_c_balance os_c_first os_c_middle os_c_last
set cust_orders [ maria::sel $maria_handler "SELECT o_id, o_carrier_id, o_entry_d FROM (SELECT o_id, o_carrier_id, o_entry_d FROM orders where o_d_id = $d_id AND o_w_id = $w_id and o_c_id = $c_id ORDER BY o_id DESC) AS sb LIMIT 1" -flatlist ]
if { [ llength $cust_orders ] eq 0 } {
set no_order_status "No orders for customer"
set o_id 0
} else {
lassign $cust_orders o_id o_carrier_id o_entry_d
}
set c_line [ maria::sel $maria_handler "SELECT ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_delivery_d FROM order_line WHERE ol_o_id = $o_id AND ol_d_id = $d_id AND ol_w_id = $w_id" -flatlist ]
foreach arr {os_ol_i_id_array os_ol_supply_w_id_array os_ol_quantity_array os_ol_amount_array os_ol_delivery_d_array os_ol_i_id_array } { set $arr "CSV," }
foreach {ol_i_id ol_supply_w_id ol_quantity ol_amount ol_delivery_d} $c_line {
lappend os_ol_i_id_array "$ol_i_id,"
lappend os_ol_supply_w_id_array "$ol_supply_w_id,"
lappend os_ol_quantity_array "$ol_quantity,"
lappend os_ol_amount_array "$ol_amount,"
lappend os_ol_delivery_d_array "$ol_delivery_d,"
}
maria::commit $maria_handler
}
set delivbody {
global mariastatus
set carrier_id [ RandomNumber 1 10 ]
set date [ gettimestamp ]
set loop_counter 1
mariaexec $maria_handler "start transaction"
while { $loop_counter <= 10 } {
set d_d_id $loop_counter
set no_o_id [ maria::sel $maria_handler "SELECT no_o_id FROM new_order WHERE no_w_id = $w_id AND no_d_id = $d_d_id LIMIT 1" -flatlist ]
if { $no_o_id eq "" } { break }
mariaexec $maria_handler "DELETE FROM new_order WHERE no_w_id = $w_id AND no_d_id = $d_d_id AND no_o_id = $no_o_id"
set o_c_id [ list [ maria::sel $maria_handler "SELECT o_c_id FROM orders WHERE o_id = $no_o_id AND o_d_id = $d_d_id AND o_w_id = $w_id" -list ]]
mariaexec $maria_handler "UPDATE orders SET o_carrier_id = $carrier_id WHERE o_id = $no_o_id AND o_d_id = $d_d_id AND o_w_id = $w_id"
mariaexec $maria_handler "UPDATE order_line SET ol_delivery_d = str_to_date($date,'%Y%m%d%H%i%s') WHERE ol_o_id = $no_o_id AND ol_d_id = $d_d_id AND ol_w_id = $w_id"
set d_ol_total [ list [ maria::sel $maria_handler "SELECT SUM(ol_amount) FROM order_line WHERE ol_o_id = $no_o_id AND ol_d_id = $d_d_id AND ol_w_id = $w_id" -list ]]
mariaexec $maria_handler "UPDATE customer SET c_balance = c_balance + $d_ol_total WHERE c_id = $o_c_id AND c_d_id = $d_d_id AND c_w_id = $w_id"
incr loop_counter
}
maria::commit $maria_handler
}
set stockbody {
global mariastatus
set threshold [ RandomNumber 10 20 ]
mariaexec $maria_handler "start transaction"
set d_next_o_id [ list [ maria::sel $maria_handler "SELECT d_next_o_id FROM district WHERE d_w_id=$w_id AND d_id=$stock_level_d_id" -list ]]
set stock_count [ list [ maria::sel $maria_handler "SELECT COUNT(DISTINCT (s_i_id)) FROM order_line, stock WHERE ol_w_id = $w_id AND ol_d_id = $stock_level_d_id AND (ol_o_id < $d_next_o_id) AND ol_o_id >= ($d_next_o_id - 20) AND s_w_id = $w_id AND s_i_id = ol_i_id AND s_quantity < $threshold" -list ]]
maria::commit $maria_handler
}
if { $testtype eq "test" } {
set newordtail {puts "$discount,$last,$credit,$dtax,$wtax,$next_o_id"
}
set paytail {puts "$p_c_id,$p_c_last,$p_w_street_1,$p_w_street_2,$p_w_city,$p_w_state,$p_w_zip,$p_d_street_1,$p_d_street_2,$p_d_city,$p_d_state,$p_d_zip,$p_c_first,$p_c_middle,$p_c_street_1,$p_c_street_2,$p_c_city,$p_c_state,$p_c_zip,$p_c_phone,$p_c_since,$p_c_credit,$p_c_credit_lim,$p_c_discount,$p_c_balance,$c_data"
}
set ostattail {puts "$c_id,$os_c_last,$os_c_first,$os_c_middle,$os_c_balance,$o_id,$o_entry_d,$o_carrier_id"
}
set delivtail {puts "$w_id $carrier_id $date"
}
set stocktail {puts "$stock_count"
}
} else {
foreach tl {newordtail paytail ostattail delivtail stocktail} { set $tl ""}
}
#Build procs for correct workload
append neword_no_sp $newordargs $newordbody $newordtail "\}"
append pay_no_sp $payargs $paybody $paytail "\}"
append ostat_no_sp $ostatargs $ostatbody $ostattail "\}"
append deliv_no_sp $delivargs $delivbody $delivtail "\}"
append stock_no_sp $stockargs $stockbody $stocktail "\}"

set index_sp_1 [.ed_mainFrame.mainwin.textFrame.left.text search -forwards "\#NEW ORDER" 1.0 ]
set index_sp_2 [.ed_mainFrame.mainwin.textFrame.left.text search -backwards "proc prep_statement" end ]
#End of run loop is previous line
#CLI indexes are characters in the string and integers GUI indexes are based on lines and position. Move back 1 line
if { [ string is entier $index_sp_2 ] } {
set index_sp_2 [ expr $index_sp_2 - 10 ]
} else {
set index_sp_2 [ expr $index_sp_2 - 1 ]
}
#Delete stored procedures
.ed_mainFrame.mainwin.textFrame.left.text fastdelete $index_sp_1 $index_sp_2+1l
#Insert no stored procedures version
.ed_mainFrame.mainwin.textFrame.left.text fastinsert $index_sp_1 "$neword_no_sp \n\n $pay_no_sp \n\n $ostat_no_sp \n\n $deliv_no_sp \n\n $stock_no_sp \n\n"
}

proc loadmariatpcc { } {
global _ED maria_ssl_options
upvar #0 dbdict dbdict
Expand Down Expand Up @@ -1689,6 +1988,10 @@ mariaclose $maria_handler
}
if { $maria_connect_pool } {
insert_mariaconnectpool_drivescript test sync
} else {
if { $maria_no_stored_procs } {
insert_maria_no_stored_procs test sync
}
}
}

Expand Down Expand Up @@ -2090,6 +2393,10 @@ mariaclose $maria_handler
}}
if { $maria_connect_pool } {
insert_mariaconnectpool_drivescript timed sync
} else {
if { $maria_no_stored_procs } {
insert_maria_no_stored_procs timed sync
}
}
} else {
#ASYNCHRONOUS TIMED SCRIPT
Expand Down Expand Up @@ -2556,6 +2863,10 @@ switch $myposition {
#Close bracket of fast insert must come directly after inserted code without newline
if { $maria_connect_pool } {
insert_mariaconnectpool_drivescript timed async
} else {
if { $maria_no_stored_procs } {
insert_maria_no_stored_procs timed async
}
}
}
}
Expand Down
Loading

0 comments on commit 91ab1d9

Please sign in to comment.