xref: /freebsd/contrib/kyua/utils/sqlite/statement_test.cpp (revision b0d29bc47dba79f6f38e67eabadfb4b32ffd9390)
1*b0d29bc4SBrooks Davis // Copyright 2011 The Kyua Authors.
2*b0d29bc4SBrooks Davis // All rights reserved.
3*b0d29bc4SBrooks Davis //
4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without
5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are
6*b0d29bc4SBrooks Davis // met:
7*b0d29bc4SBrooks Davis //
8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright
9*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer.
10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
11*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer in the
12*b0d29bc4SBrooks Davis //   documentation and/or other materials provided with the distribution.
13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
14*b0d29bc4SBrooks Davis //   may be used to endorse or promote products derived from this software
15*b0d29bc4SBrooks Davis //   without specific prior written permission.
16*b0d29bc4SBrooks Davis //
17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*b0d29bc4SBrooks Davis 
29*b0d29bc4SBrooks Davis #include "utils/sqlite/statement.ipp"
30*b0d29bc4SBrooks Davis 
31*b0d29bc4SBrooks Davis extern "C" {
32*b0d29bc4SBrooks Davis #include <stdint.h>
33*b0d29bc4SBrooks Davis }
34*b0d29bc4SBrooks Davis 
35*b0d29bc4SBrooks Davis #include <cstring>
36*b0d29bc4SBrooks Davis #include <iostream>
37*b0d29bc4SBrooks Davis 
38*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
39*b0d29bc4SBrooks Davis 
40*b0d29bc4SBrooks Davis #include "utils/sqlite/database.hpp"
41*b0d29bc4SBrooks Davis #include "utils/sqlite/test_utils.hpp"
42*b0d29bc4SBrooks Davis 
43*b0d29bc4SBrooks Davis namespace sqlite = utils::sqlite;
44*b0d29bc4SBrooks Davis 
45*b0d29bc4SBrooks Davis 
46*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(step__ok);
ATF_TEST_CASE_BODY(step__ok)47*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(step__ok)
48*b0d29bc4SBrooks Davis {
49*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
50*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement(
51*b0d29bc4SBrooks Davis         "CREATE TABLE foo (a INTEGER PRIMARY KEY)");
52*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(sqlite::error, db.exec("SELECT * FROM foo"));
53*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
54*b0d29bc4SBrooks Davis     db.exec("SELECT * FROM foo");
55*b0d29bc4SBrooks Davis }
56*b0d29bc4SBrooks Davis 
57*b0d29bc4SBrooks Davis 
58*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(step__many);
ATF_TEST_CASE_BODY(step__many)59*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(step__many)
60*b0d29bc4SBrooks Davis {
61*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
62*b0d29bc4SBrooks Davis     create_test_table(raw(db));
63*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement(
64*b0d29bc4SBrooks Davis         "SELECT prime FROM test ORDER BY prime");
65*b0d29bc4SBrooks Davis     for (int i = 0; i < 5; i++)
66*b0d29bc4SBrooks Davis         ATF_REQUIRE(stmt.step());
67*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
68*b0d29bc4SBrooks Davis }
69*b0d29bc4SBrooks Davis 
70*b0d29bc4SBrooks Davis 
71*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(step__fail);
ATF_TEST_CASE_BODY(step__fail)72*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(step__fail)
73*b0d29bc4SBrooks Davis {
74*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
75*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement(
76*b0d29bc4SBrooks Davis         "CREATE TABLE foo (a INTEGER PRIMARY KEY)");
77*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
78*b0d29bc4SBrooks Davis     REQUIRE_API_ERROR("sqlite3_step", stmt.step());
79*b0d29bc4SBrooks Davis }
80*b0d29bc4SBrooks Davis 
81*b0d29bc4SBrooks Davis 
82*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(step_without_results__ok);
ATF_TEST_CASE_BODY(step_without_results__ok)83*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(step_without_results__ok)
84*b0d29bc4SBrooks Davis {
85*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
86*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement(
87*b0d29bc4SBrooks Davis         "CREATE TABLE foo (a INTEGER PRIMARY KEY)");
88*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(sqlite::error, db.exec("SELECT * FROM foo"));
89*b0d29bc4SBrooks Davis     stmt.step_without_results();
90*b0d29bc4SBrooks Davis     db.exec("SELECT * FROM foo");
91*b0d29bc4SBrooks Davis }
92*b0d29bc4SBrooks Davis 
93*b0d29bc4SBrooks Davis 
94*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(step_without_results__fail);
ATF_TEST_CASE_BODY(step_without_results__fail)95*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(step_without_results__fail)
96*b0d29bc4SBrooks Davis {
97*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
98*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a INTEGER PRIMARY KEY)");
99*b0d29bc4SBrooks Davis     db.exec("INSERT INTO foo VALUES (3)");
100*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement(
101*b0d29bc4SBrooks Davis         "INSERT INTO foo VALUES (3)");
102*b0d29bc4SBrooks Davis     REQUIRE_API_ERROR("sqlite3_step", stmt.step_without_results());
103*b0d29bc4SBrooks Davis }
104*b0d29bc4SBrooks Davis 
105*b0d29bc4SBrooks Davis 
106*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_count);
ATF_TEST_CASE_BODY(column_count)107*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_count)
108*b0d29bc4SBrooks Davis {
109*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
110*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a INTEGER PRIMARY KEY, b INTEGER, c TEXT);"
111*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (5, 3, 'foo');");
112*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
113*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
114*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, stmt.column_count());
115*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
116*b0d29bc4SBrooks Davis }
117*b0d29bc4SBrooks Davis 
118*b0d29bc4SBrooks Davis 
119*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_name__ok);
ATF_TEST_CASE_BODY(column_name__ok)120*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_name__ok)
121*b0d29bc4SBrooks Davis {
122*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
123*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (first INTEGER PRIMARY KEY, second TEXT);"
124*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (5, 'foo');");
125*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
126*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
127*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("first", stmt.column_name(0));
128*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("second", stmt.column_name(1));
129*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
130*b0d29bc4SBrooks Davis }
131*b0d29bc4SBrooks Davis 
132*b0d29bc4SBrooks Davis 
133*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_name__fail);
ATF_TEST_CASE_BODY(column_name__fail)134*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_name__fail)
135*b0d29bc4SBrooks Davis {
136*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
137*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (first INTEGER PRIMARY KEY);"
138*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (5);");
139*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
140*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
141*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("first", stmt.column_name(0));
142*b0d29bc4SBrooks Davis     REQUIRE_API_ERROR("sqlite3_column_name", stmt.column_name(1));
143*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
144*b0d29bc4SBrooks Davis }
145*b0d29bc4SBrooks Davis 
146*b0d29bc4SBrooks Davis 
147*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_type__ok);
ATF_TEST_CASE_BODY(column_type__ok)148*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_type__ok)
149*b0d29bc4SBrooks Davis {
150*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
151*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a_blob BLOB,"
152*b0d29bc4SBrooks Davis             "                  a_float FLOAT,"
153*b0d29bc4SBrooks Davis             "                  an_integer INTEGER,"
154*b0d29bc4SBrooks Davis             "                  a_null BLOB,"
155*b0d29bc4SBrooks Davis             "                  a_text TEXT);"
156*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (x'0102', 0.3, 5, NULL, 'foo bar');"
157*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL, NULL, NULL, NULL, NULL);");
158*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
159*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
160*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_blob == stmt.column_type(0));
161*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_float == stmt.column_type(1));
162*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(2));
163*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_null == stmt.column_type(3));
164*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_text == stmt.column_type(4));
165*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
166*b0d29bc4SBrooks Davis     for (int i = 0; i < stmt.column_count(); i++)
167*b0d29bc4SBrooks Davis         ATF_REQUIRE(sqlite::type_null == stmt.column_type(i));
168*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
169*b0d29bc4SBrooks Davis }
170*b0d29bc4SBrooks Davis 
171*b0d29bc4SBrooks Davis 
172*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_type__out_of_range);
ATF_TEST_CASE_BODY(column_type__out_of_range)173*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_type__out_of_range)
174*b0d29bc4SBrooks Davis {
175*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
176*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a INTEGER PRIMARY KEY);"
177*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (1);");
178*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
179*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
180*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
181*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_null == stmt.column_type(1));
182*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_null == stmt.column_type(512));
183*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
184*b0d29bc4SBrooks Davis }
185*b0d29bc4SBrooks Davis 
186*b0d29bc4SBrooks Davis 
187*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_id__ok);
ATF_TEST_CASE_BODY(column_id__ok)188*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_id__ok)
189*b0d29bc4SBrooks Davis {
190*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
191*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (bar INTEGER PRIMARY KEY, "
192*b0d29bc4SBrooks Davis             "                  baz INTEGER);"
193*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (1, 2);");
194*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
195*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
196*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0, stmt.column_id("bar"));
197*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1, stmt.column_id("baz"));
198*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0, stmt.column_id("bar"));
199*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1, stmt.column_id("baz"));
200*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
201*b0d29bc4SBrooks Davis }
202*b0d29bc4SBrooks Davis 
203*b0d29bc4SBrooks Davis 
204*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_id__missing);
ATF_TEST_CASE_BODY(column_id__missing)205*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_id__missing)
206*b0d29bc4SBrooks Davis {
207*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
208*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (bar INTEGER PRIMARY KEY, "
209*b0d29bc4SBrooks Davis             "                  baz INTEGER);"
210*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (1, 2);");
211*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
212*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
213*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0, stmt.column_id("bar"));
214*b0d29bc4SBrooks Davis     try {
215*b0d29bc4SBrooks Davis         stmt.column_id("bazo");
216*b0d29bc4SBrooks Davis         fail("invalid_column_error not raised");
217*b0d29bc4SBrooks Davis     } catch (const sqlite::invalid_column_error& e) {
218*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ("bazo", e.column_name());
219*b0d29bc4SBrooks Davis     }
220*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
221*b0d29bc4SBrooks Davis }
222*b0d29bc4SBrooks Davis 
223*b0d29bc4SBrooks Davis 
224*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_blob);
ATF_TEST_CASE_BODY(column_blob)225*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_blob)
226*b0d29bc4SBrooks Davis {
227*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
228*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a INTEGER, b BLOB, c INTEGER);"
229*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL, x'cafe', NULL);");
230*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
231*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
232*b0d29bc4SBrooks Davis     const sqlite::blob blob = stmt.column_blob(1);
233*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0xca, static_cast< const uint8_t* >(blob.memory)[0]);
234*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0xfe, static_cast< const uint8_t* >(blob.memory)[1]);
235*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
236*b0d29bc4SBrooks Davis }
237*b0d29bc4SBrooks Davis 
238*b0d29bc4SBrooks Davis 
239*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_double);
ATF_TEST_CASE_BODY(column_double)240*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_double)
241*b0d29bc4SBrooks Davis {
242*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
243*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a INTEGER, b DOUBLE, c INTEGER);"
244*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL, 0.5, NULL);");
245*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
246*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
247*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0.5, stmt.column_double(1));
248*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
249*b0d29bc4SBrooks Davis }
250*b0d29bc4SBrooks Davis 
251*b0d29bc4SBrooks Davis 
252*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_int__ok);
ATF_TEST_CASE_BODY(column_int__ok)253*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_int__ok)
254*b0d29bc4SBrooks Davis {
255*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
256*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"
257*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL, 987, NULL);");
258*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
259*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
260*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(987, stmt.column_int(1));
261*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
262*b0d29bc4SBrooks Davis }
263*b0d29bc4SBrooks Davis 
264*b0d29bc4SBrooks Davis 
265*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_int__overflow);
ATF_TEST_CASE_BODY(column_int__overflow)266*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_int__overflow)
267*b0d29bc4SBrooks Davis {
268*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
269*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"
270*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL, 4294967419, NULL);");
271*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
272*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
273*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(123, stmt.column_int(1));
274*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
275*b0d29bc4SBrooks Davis }
276*b0d29bc4SBrooks Davis 
277*b0d29bc4SBrooks Davis 
278*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_int64);
ATF_TEST_CASE_BODY(column_int64)279*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_int64)
280*b0d29bc4SBrooks Davis {
281*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
282*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"
283*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL, 4294967419, NULL);");
284*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
285*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
286*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(4294967419LL, stmt.column_int64(1));
287*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
288*b0d29bc4SBrooks Davis }
289*b0d29bc4SBrooks Davis 
290*b0d29bc4SBrooks Davis 
291*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_text);
ATF_TEST_CASE_BODY(column_text)292*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_text)
293*b0d29bc4SBrooks Davis {
294*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
295*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a INTEGER, b TEXT, c INTEGER);"
296*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL, 'foo bar', NULL);");
297*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
298*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
299*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("foo bar", stmt.column_text(1));
300*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
301*b0d29bc4SBrooks Davis }
302*b0d29bc4SBrooks Davis 
303*b0d29bc4SBrooks Davis 
304*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_bytes__blob);
ATF_TEST_CASE_BODY(column_bytes__blob)305*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_bytes__blob)
306*b0d29bc4SBrooks Davis {
307*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
308*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a BLOB);"
309*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (x'12345678');");
310*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
311*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
312*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(4, stmt.column_bytes(0));
313*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
314*b0d29bc4SBrooks Davis }
315*b0d29bc4SBrooks Davis 
316*b0d29bc4SBrooks Davis 
317*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_bytes__text);
ATF_TEST_CASE_BODY(column_bytes__text)318*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(column_bytes__text)
319*b0d29bc4SBrooks Davis {
320*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
321*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a TEXT);"
322*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES ('foo bar');");
323*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
324*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
325*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(7, stmt.column_bytes(0));
326*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
327*b0d29bc4SBrooks Davis }
328*b0d29bc4SBrooks Davis 
329*b0d29bc4SBrooks Davis 
330*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_blob__ok);
ATF_TEST_CASE_BODY(safe_column_blob__ok)331*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(safe_column_blob__ok)
332*b0d29bc4SBrooks Davis {
333*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
334*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a INTEGER, b BLOB, c INTEGER);"
335*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL, x'cafe', NULL);");
336*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
337*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
338*b0d29bc4SBrooks Davis     const sqlite::blob blob = stmt.safe_column_blob("b");
339*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0xca, static_cast< const uint8_t* >(blob.memory)[0]);
340*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0xfe, static_cast< const uint8_t* >(blob.memory)[1]);
341*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
342*b0d29bc4SBrooks Davis }
343*b0d29bc4SBrooks Davis 
344*b0d29bc4SBrooks Davis 
345*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_blob__fail);
ATF_TEST_CASE_BODY(safe_column_blob__fail)346*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(safe_column_blob__fail)
347*b0d29bc4SBrooks Davis {
348*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
349*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a INTEGER);"
350*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (123);");
351*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
352*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
353*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(sqlite::invalid_column_error,
354*b0d29bc4SBrooks Davis                       stmt.safe_column_blob("b"));
355*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(sqlite::error, "not a blob",
356*b0d29bc4SBrooks Davis                          stmt.safe_column_blob("a"));
357*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
358*b0d29bc4SBrooks Davis }
359*b0d29bc4SBrooks Davis 
360*b0d29bc4SBrooks Davis 
361*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_double__ok);
ATF_TEST_CASE_BODY(safe_column_double__ok)362*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(safe_column_double__ok)
363*b0d29bc4SBrooks Davis {
364*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
365*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a INTEGER, b DOUBLE, c INTEGER);"
366*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL, 0.5, NULL);");
367*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
368*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
369*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0.5, stmt.safe_column_double("b"));
370*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
371*b0d29bc4SBrooks Davis }
372*b0d29bc4SBrooks Davis 
373*b0d29bc4SBrooks Davis 
374*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_double__fail);
ATF_TEST_CASE_BODY(safe_column_double__fail)375*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(safe_column_double__fail)
376*b0d29bc4SBrooks Davis {
377*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
378*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a INTEGER);"
379*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL);");
380*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
381*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
382*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(sqlite::invalid_column_error,
383*b0d29bc4SBrooks Davis                       stmt.safe_column_double("b"));
384*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(sqlite::error, "not a float",
385*b0d29bc4SBrooks Davis                          stmt.safe_column_double("a"));
386*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
387*b0d29bc4SBrooks Davis }
388*b0d29bc4SBrooks Davis 
389*b0d29bc4SBrooks Davis 
390*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_int__ok);
ATF_TEST_CASE_BODY(safe_column_int__ok)391*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(safe_column_int__ok)
392*b0d29bc4SBrooks Davis {
393*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
394*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"
395*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL, 987, NULL);");
396*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
397*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
398*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(987, stmt.safe_column_int("b"));
399*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
400*b0d29bc4SBrooks Davis }
401*b0d29bc4SBrooks Davis 
402*b0d29bc4SBrooks Davis 
403*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_int__fail);
ATF_TEST_CASE_BODY(safe_column_int__fail)404*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(safe_column_int__fail)
405*b0d29bc4SBrooks Davis {
406*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
407*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a TEXT);"
408*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES ('def');");
409*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
410*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
411*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(sqlite::invalid_column_error,
412*b0d29bc4SBrooks Davis                       stmt.safe_column_int("b"));
413*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(sqlite::error, "not an integer",
414*b0d29bc4SBrooks Davis                          stmt.safe_column_int("a"));
415*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
416*b0d29bc4SBrooks Davis }
417*b0d29bc4SBrooks Davis 
418*b0d29bc4SBrooks Davis 
419*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_int64__ok);
ATF_TEST_CASE_BODY(safe_column_int64__ok)420*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(safe_column_int64__ok)
421*b0d29bc4SBrooks Davis {
422*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
423*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"
424*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL, 4294967419, NULL);");
425*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
426*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
427*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(4294967419LL, stmt.safe_column_int64("b"));
428*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
429*b0d29bc4SBrooks Davis }
430*b0d29bc4SBrooks Davis 
431*b0d29bc4SBrooks Davis 
432*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_int64__fail);
ATF_TEST_CASE_BODY(safe_column_int64__fail)433*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(safe_column_int64__fail)
434*b0d29bc4SBrooks Davis {
435*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
436*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a TEXT);"
437*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES ('abc');");
438*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
439*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
440*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(sqlite::invalid_column_error,
441*b0d29bc4SBrooks Davis                       stmt.safe_column_int64("b"));
442*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(sqlite::error, "not an integer",
443*b0d29bc4SBrooks Davis                          stmt.safe_column_int64("a"));
444*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
445*b0d29bc4SBrooks Davis }
446*b0d29bc4SBrooks Davis 
447*b0d29bc4SBrooks Davis 
448*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_text__ok);
ATF_TEST_CASE_BODY(safe_column_text__ok)449*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(safe_column_text__ok)
450*b0d29bc4SBrooks Davis {
451*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
452*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a INTEGER, b TEXT, c INTEGER);"
453*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL, 'foo bar', NULL);");
454*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
455*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
456*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("foo bar", stmt.safe_column_text("b"));
457*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
458*b0d29bc4SBrooks Davis }
459*b0d29bc4SBrooks Davis 
460*b0d29bc4SBrooks Davis 
461*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_text__fail);
ATF_TEST_CASE_BODY(safe_column_text__fail)462*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(safe_column_text__fail)
463*b0d29bc4SBrooks Davis {
464*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
465*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a INTEGER);"
466*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL);");
467*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
468*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
469*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(sqlite::invalid_column_error,
470*b0d29bc4SBrooks Davis                       stmt.safe_column_text("b"));
471*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(sqlite::error, "not a string",
472*b0d29bc4SBrooks Davis                          stmt.safe_column_text("a"));
473*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
474*b0d29bc4SBrooks Davis }
475*b0d29bc4SBrooks Davis 
476*b0d29bc4SBrooks Davis 
477*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_bytes__ok__blob);
ATF_TEST_CASE_BODY(safe_column_bytes__ok__blob)478*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(safe_column_bytes__ok__blob)
479*b0d29bc4SBrooks Davis {
480*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
481*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a BLOB);"
482*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (x'12345678');");
483*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
484*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
485*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(4, stmt.safe_column_bytes("a"));
486*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
487*b0d29bc4SBrooks Davis }
488*b0d29bc4SBrooks Davis 
489*b0d29bc4SBrooks Davis 
490*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_bytes__ok__text);
ATF_TEST_CASE_BODY(safe_column_bytes__ok__text)491*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(safe_column_bytes__ok__text)
492*b0d29bc4SBrooks Davis {
493*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
494*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a TEXT);"
495*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES ('foo bar');");
496*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
497*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
498*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(7, stmt.safe_column_bytes("a"));
499*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
500*b0d29bc4SBrooks Davis }
501*b0d29bc4SBrooks Davis 
502*b0d29bc4SBrooks Davis 
503*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_bytes__fail);
ATF_TEST_CASE_BODY(safe_column_bytes__fail)504*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(safe_column_bytes__fail)
505*b0d29bc4SBrooks Davis {
506*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
507*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a TEXT);"
508*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES (NULL);");
509*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
510*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
511*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(sqlite::invalid_column_error,
512*b0d29bc4SBrooks Davis                       stmt.safe_column_bytes("b"));
513*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(sqlite::error, "not a blob or a string",
514*b0d29bc4SBrooks Davis                          stmt.safe_column_bytes("a"));
515*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
516*b0d29bc4SBrooks Davis }
517*b0d29bc4SBrooks Davis 
518*b0d29bc4SBrooks Davis 
519*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(reset);
ATF_TEST_CASE_BODY(reset)520*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(reset)
521*b0d29bc4SBrooks Davis {
522*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
523*b0d29bc4SBrooks Davis     db.exec("CREATE TABLE foo (a TEXT);"
524*b0d29bc4SBrooks Davis             "INSERT INTO foo VALUES ('foo bar');");
525*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
526*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
527*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
528*b0d29bc4SBrooks Davis     stmt.reset();
529*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
530*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
531*b0d29bc4SBrooks Davis }
532*b0d29bc4SBrooks Davis 
533*b0d29bc4SBrooks Davis 
534*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__blob);
ATF_TEST_CASE_BODY(bind__blob)535*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(bind__blob)
536*b0d29bc4SBrooks Davis {
537*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
538*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT 3, ?");
539*b0d29bc4SBrooks Davis 
540*b0d29bc4SBrooks Davis     const unsigned char blob[] = {0xca, 0xfe};
541*b0d29bc4SBrooks Davis     stmt.bind(1, sqlite::blob(static_cast< const void* >(blob), 2));
542*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
543*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
544*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, stmt.column_int(0));
545*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_blob == stmt.column_type(1));
546*b0d29bc4SBrooks Davis     const unsigned char* ret_blob =
547*b0d29bc4SBrooks Davis         static_cast< const unsigned char* >(stmt.column_blob(1).memory);
548*b0d29bc4SBrooks Davis     ATF_REQUIRE(std::memcmp(blob, ret_blob, 2) == 0);
549*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
550*b0d29bc4SBrooks Davis }
551*b0d29bc4SBrooks Davis 
552*b0d29bc4SBrooks Davis 
553*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__double);
ATF_TEST_CASE_BODY(bind__double)554*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(bind__double)
555*b0d29bc4SBrooks Davis {
556*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
557*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT 3, ?");
558*b0d29bc4SBrooks Davis 
559*b0d29bc4SBrooks Davis     stmt.bind(1, 0.5);
560*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
561*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
562*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, stmt.column_int(0));
563*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_float == stmt.column_type(1));
564*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0.5, stmt.column_double(1));
565*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
566*b0d29bc4SBrooks Davis }
567*b0d29bc4SBrooks Davis 
568*b0d29bc4SBrooks Davis 
569*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__int);
ATF_TEST_CASE_BODY(bind__int)570*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(bind__int)
571*b0d29bc4SBrooks Davis {
572*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
573*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT 3, ?");
574*b0d29bc4SBrooks Davis 
575*b0d29bc4SBrooks Davis     stmt.bind(1, 123);
576*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
577*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
578*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, stmt.column_int(0));
579*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(1));
580*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(123, stmt.column_int(1));
581*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
582*b0d29bc4SBrooks Davis }
583*b0d29bc4SBrooks Davis 
584*b0d29bc4SBrooks Davis 
585*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__int64);
ATF_TEST_CASE_BODY(bind__int64)586*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(bind__int64)
587*b0d29bc4SBrooks Davis {
588*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
589*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT 3, ?");
590*b0d29bc4SBrooks Davis 
591*b0d29bc4SBrooks Davis     stmt.bind(1, static_cast< int64_t >(4294967419LL));
592*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
593*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
594*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, stmt.column_int(0));
595*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(1));
596*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(4294967419LL, stmt.column_int64(1));
597*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
598*b0d29bc4SBrooks Davis }
599*b0d29bc4SBrooks Davis 
600*b0d29bc4SBrooks Davis 
601*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__null);
ATF_TEST_CASE_BODY(bind__null)602*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(bind__null)
603*b0d29bc4SBrooks Davis {
604*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
605*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT 3, ?");
606*b0d29bc4SBrooks Davis 
607*b0d29bc4SBrooks Davis     stmt.bind(1, sqlite::null());
608*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
609*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
610*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, stmt.column_int(0));
611*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_null == stmt.column_type(1));
612*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
613*b0d29bc4SBrooks Davis }
614*b0d29bc4SBrooks Davis 
615*b0d29bc4SBrooks Davis 
616*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__text);
ATF_TEST_CASE_BODY(bind__text)617*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(bind__text)
618*b0d29bc4SBrooks Davis {
619*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
620*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT 3, ?");
621*b0d29bc4SBrooks Davis 
622*b0d29bc4SBrooks Davis     const std::string str = "Hello";
623*b0d29bc4SBrooks Davis     stmt.bind(1, str);
624*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
625*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
626*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, stmt.column_int(0));
627*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_text == stmt.column_type(1));
628*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(str, stmt.column_text(1));
629*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
630*b0d29bc4SBrooks Davis }
631*b0d29bc4SBrooks Davis 
632*b0d29bc4SBrooks Davis 
633*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__text__transient);
ATF_TEST_CASE_BODY(bind__text__transient)634*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(bind__text__transient)
635*b0d29bc4SBrooks Davis {
636*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
637*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT 3, :foo");
638*b0d29bc4SBrooks Davis 
639*b0d29bc4SBrooks Davis     {
640*b0d29bc4SBrooks Davis         const std::string str = "Hello";
641*b0d29bc4SBrooks Davis         stmt.bind(":foo", str);
642*b0d29bc4SBrooks Davis     }
643*b0d29bc4SBrooks Davis 
644*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
645*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
646*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, stmt.column_int(0));
647*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_text == stmt.column_type(1));
648*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(std::string("Hello"), stmt.column_text(1));
649*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
650*b0d29bc4SBrooks Davis }
651*b0d29bc4SBrooks Davis 
652*b0d29bc4SBrooks Davis 
653*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__by_name);
ATF_TEST_CASE_BODY(bind__by_name)654*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(bind__by_name)
655*b0d29bc4SBrooks Davis {
656*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
657*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT 3, :foo");
658*b0d29bc4SBrooks Davis 
659*b0d29bc4SBrooks Davis     const std::string str = "Hello";
660*b0d29bc4SBrooks Davis     stmt.bind(":foo", str);
661*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
662*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
663*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, stmt.column_int(0));
664*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_text == stmt.column_type(1));
665*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(str, stmt.column_text(1));
666*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
667*b0d29bc4SBrooks Davis }
668*b0d29bc4SBrooks Davis 
669*b0d29bc4SBrooks Davis 
670*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind_parameter_count);
ATF_TEST_CASE_BODY(bind_parameter_count)671*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(bind_parameter_count)
672*b0d29bc4SBrooks Davis {
673*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
674*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT 3, ?, ?");
675*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(2, stmt.bind_parameter_count());
676*b0d29bc4SBrooks Davis }
677*b0d29bc4SBrooks Davis 
678*b0d29bc4SBrooks Davis 
679*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind_parameter_index);
ATF_TEST_CASE_BODY(bind_parameter_index)680*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(bind_parameter_index)
681*b0d29bc4SBrooks Davis {
682*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
683*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT 3, :foo, ?, :bar");
684*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1, stmt.bind_parameter_index(":foo"));
685*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, stmt.bind_parameter_index(":bar"));
686*b0d29bc4SBrooks Davis }
687*b0d29bc4SBrooks Davis 
688*b0d29bc4SBrooks Davis 
689*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind_parameter_name);
ATF_TEST_CASE_BODY(bind_parameter_name)690*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(bind_parameter_name)
691*b0d29bc4SBrooks Davis {
692*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
693*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT 3, :foo, ?, :bar");
694*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(":foo", stmt.bind_parameter_name(1));
695*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(":bar", stmt.bind_parameter_name(3));
696*b0d29bc4SBrooks Davis }
697*b0d29bc4SBrooks Davis 
698*b0d29bc4SBrooks Davis 
699*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(clear_bindings);
ATF_TEST_CASE_BODY(clear_bindings)700*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(clear_bindings)
701*b0d29bc4SBrooks Davis {
702*b0d29bc4SBrooks Davis     sqlite::database db = sqlite::database::in_memory();
703*b0d29bc4SBrooks Davis     sqlite::statement stmt = db.create_statement("SELECT 3, ?");
704*b0d29bc4SBrooks Davis 
705*b0d29bc4SBrooks Davis     stmt.bind(1, 5);
706*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
707*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
708*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, stmt.column_int(0));
709*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(1));
710*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(5, stmt.column_int(1));
711*b0d29bc4SBrooks Davis     stmt.clear_bindings();
712*b0d29bc4SBrooks Davis     stmt.reset();
713*b0d29bc4SBrooks Davis 
714*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
715*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
716*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, stmt.column_int(0));
717*b0d29bc4SBrooks Davis     ATF_REQUIRE(sqlite::type_null == stmt.column_type(1));
718*b0d29bc4SBrooks Davis 
719*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
720*b0d29bc4SBrooks Davis }
721*b0d29bc4SBrooks Davis 
722*b0d29bc4SBrooks Davis 
ATF_INIT_TEST_CASES(tcs)723*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
724*b0d29bc4SBrooks Davis {
725*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, step__ok);
726*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, step__many);
727*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, step__fail);
728*b0d29bc4SBrooks Davis 
729*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, step_without_results__ok);
730*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, step_without_results__fail);
731*b0d29bc4SBrooks Davis 
732*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_count);
733*b0d29bc4SBrooks Davis 
734*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_name__ok);
735*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_name__fail);
736*b0d29bc4SBrooks Davis 
737*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_type__ok);
738*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_type__out_of_range);
739*b0d29bc4SBrooks Davis 
740*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_id__ok);
741*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_id__missing);
742*b0d29bc4SBrooks Davis 
743*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_blob);
744*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_double);
745*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_int__ok);
746*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_int__overflow);
747*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_int64);
748*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_text);
749*b0d29bc4SBrooks Davis 
750*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_bytes__blob);
751*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, column_bytes__text);
752*b0d29bc4SBrooks Davis 
753*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, safe_column_blob__ok);
754*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, safe_column_blob__fail);
755*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, safe_column_double__ok);
756*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, safe_column_double__fail);
757*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, safe_column_int__ok);
758*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, safe_column_int__fail);
759*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, safe_column_int64__ok);
760*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, safe_column_int64__fail);
761*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, safe_column_text__ok);
762*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, safe_column_text__fail);
763*b0d29bc4SBrooks Davis 
764*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, safe_column_bytes__ok__blob);
765*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, safe_column_bytes__ok__text);
766*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, safe_column_bytes__fail);
767*b0d29bc4SBrooks Davis 
768*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, reset);
769*b0d29bc4SBrooks Davis 
770*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, bind__blob);
771*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, bind__double);
772*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, bind__int64);
773*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, bind__int);
774*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, bind__null);
775*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, bind__text);
776*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, bind__text__transient);
777*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, bind__by_name);
778*b0d29bc4SBrooks Davis 
779*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, bind_parameter_count);
780*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, bind_parameter_index);
781*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, bind_parameter_name);
782*b0d29bc4SBrooks Davis 
783*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, clear_bindings);
784*b0d29bc4SBrooks Davis }
785