Skip to content

Commit 9fa6c6f

Browse files
committed
test: use precompiled statements in examples
Prepared statements improve performance by caching the execution plan for a query after the query optimizer has found the best plan. However, with simple queries (such as simple selects/inserts with no joins) prepared statements won't give a big improvement since the optimizer will quickly find the best plan. This commit enables using prepared statements in test examples and renames SQLite helpers.
1 parent 1902067 commit 9fa6c6f

File tree

2 files changed

+14
-19
lines changed

2 files changed

+14
-19
lines changed

test/examples/sqlite-list-append.lua

+6-8
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ local os = require('os')
99
print('SQLite version:', sqlite3.version())
1010
print('lsqlite3 library version:', sqlite3.lversion())
1111

12-
local function insert(stmt, key, val) -- luacheck: no unused
12+
local function sqlite_insert(stmt, key, val)
1313
local ok = stmt:bind_values(key, val)
1414
if ok ~= sqlite3.OK then
1515
return false
@@ -23,7 +23,7 @@ local function insert(stmt, key, val) -- luacheck: no unused
2323
return true
2424
end
2525

26-
local function select(stmt, key) -- luacheck: no unused
26+
local function sqlite_select(stmt, key)
2727
local values = {}
2828
for row in stmt:nrows() do
2929
if row.key == key then
@@ -45,13 +45,13 @@ sqlite_list_append.open = function(self)
4545
assert(sqlite3.OK == self.db:exec('PRAGMA synchronous = normal'))
4646
assert(sqlite3.OK == self.db:exec('PRAGMA mmap_size = 30000000000'))
4747
assert(sqlite3.OK == self.db:exec('PRAGMA page_size = 32768'))
48-
--self.insert_stmt = assert(self.db:prepare('INSERT INTO list_append VALUES (?, ?)'))
49-
--self.select_stmt = assert(self.db:prepare('SELECT key, val FROM list_append ORDER BY key'))
5048
return true
5149
end
5250

5351
sqlite_list_append.setup = function(self)
5452
assert(sqlite3.OK == self.db:exec('CREATE TABLE IF NOT EXISTS list_append (key INT NOT NULL, val INT)'))
53+
self.insert_stmt = assert(self.db:prepare('INSERT INTO list_append VALUES (?, ?)'))
54+
self.select_stmt = assert(self.db:prepare('SELECT key, val FROM list_append ORDER BY key'))
5555
return true
5656
end
5757

@@ -64,11 +64,9 @@ sqlite_list_append.invoke = function(self, op)
6464
local mop_key = mop[IDX_MOP_KEY]
6565
local type = 'ok'
6666
if mop[IDX_MOP_TYPE] == 'r' then
67-
--mop[IDX_MOP_VAL] = select(self.select_stmt, mop_key)
68-
mop[IDX_MOP_VAL] = self.db:exec('SELECT key, val FROM list_append ORDER BY key')
67+
mop[IDX_MOP_VAL] = sqlite_select(self.select_stmt, mop_key)
6968
elseif mop[IDX_MOP_TYPE] == 'append' then
70-
local ok = self.db:exec(string.format('INSERT INTO list_append VALUES (%s, %s)', mop_key, mop[IDX_MOP_VAL]))
71-
--local ok = insert(self.insert_stmt, mop_key, mop[IDX_MOP_VAL])
69+
local ok = sqlite_insert(self.insert_stmt, mop_key, mop[IDX_MOP_VAL])
7270
if ok == false then
7371
type = 'fail'
7472
end

test/examples/sqlite-rw-register.lua

+8-11
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ local os = require('os')
99
print('SQLite version:', sqlite3.version())
1010
print('lsqlite3 library version:', sqlite3.lversion())
1111

12-
local function call_insert(stmt, key, val) -- luacheck: no unused
12+
local function sqlite_insert(stmt, key, val)
1313
assert(stmt:isopen() == true, 'statement has been finalized')
1414
local ok = stmt:bind_values(key, val)
1515
if ok ~= sqlite3.OK then
@@ -24,7 +24,7 @@ local function call_insert(stmt, key, val) -- luacheck: no unused
2424
return true
2525
end
2626

27-
local function call_select(stmt, key) -- luacheck: no unused
27+
local function sqlite_select(stmt, key)
2828
assert(stmt:isopen() == true, 'statement has been finalized')
2929
local val, ok
3030
if stmt:bind_values(key) ~= sqlite3.OK then
@@ -54,13 +54,14 @@ sqlite_rw_register.open = function(self)
5454
assert(sqlite3.OK == self.db:exec('PRAGMA mmap_size = 30000000000'))
5555
assert(sqlite3.OK == self.db:exec('PRAGMA page_size = 32768'))
5656

57-
--self.insert_stmt = assert(self.db:prepare('INSERT INTO rw_register VALUES (?, ?)'), 'statement prepare')
58-
--self.select_stmt = assert(self.db:prepare('SELECT val FROM rw_register WHERE id = ?'), 'statement prepare')
5957
return true
6058
end
6159

6260
sqlite_rw_register.setup = function(self)
6361
assert(sqlite3.OK == self.db:exec('CREATE TABLE IF NOT EXISTS rw_register (id, val)'))
62+
self.insert_stmt = assert(self.db:prepare('INSERT INTO rw_register VALUES (?, ?)'), 'statement prepare')
63+
self.select_stmt = assert(self.db:prepare('SELECT val FROM rw_register WHERE id = ?'), 'statement prepare')
64+
6465
return true
6566
end
6667

@@ -73,19 +74,15 @@ sqlite_rw_register.invoke = function(self, op)
7374
local val = op.value[1]
7475
local type = 'ok'
7576
if val[OP_TYPE] == 'r' then
76-
--[[
7777
assert(self.select_stmt:isopen() == true, 'statement has been finalized')
78-
local ok, v = call_select(self.select_stmt, KEY_ID)
78+
local ok, v = sqlite_select(self.select_stmt, KEY_ID)
7979
val[OP_VAL] = v
8080
if ok == false then
8181
type = 'fail'
8282
end
83-
]]
84-
val[OP_VAL] = self.db:exec(string.format('SELECT val FROM rw_register WHERE id = %d', KEY_ID))
8583
elseif val[OP_TYPE] == 'w' then
86-
--assert(self.insert_stmt:isopen() == true, 'statement has been finalized')
87-
--local ok = call_insert(self.insert_stmt, KEY_ID, val[OP_VAL])
88-
local ok = self.db:exec(string.format('INSERT INTO rw_register VALUES (?, ?)', KEY_ID, val[OP_VAL]))
84+
assert(self.insert_stmt:isopen() == true, 'statement has been finalized')
85+
local ok = sqlite_insert(self.insert_stmt, KEY_ID, val[OP_VAL])
8986
if ok == false then
9087
type = 'fail'
9188
end

0 commit comments

Comments
 (0)