108334c51SBrooks Davis // Copyright 2011 The Kyua Authors.
208334c51SBrooks Davis // All rights reserved.
308334c51SBrooks Davis //
408334c51SBrooks Davis // Redistribution and use in source and binary forms, with or without
508334c51SBrooks Davis // modification, are permitted provided that the following conditions are
608334c51SBrooks Davis // met:
708334c51SBrooks Davis //
808334c51SBrooks Davis // * Redistributions of source code must retain the above copyright
908334c51SBrooks Davis // notice, this list of conditions and the following disclaimer.
1008334c51SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
1108334c51SBrooks Davis // notice, this list of conditions and the following disclaimer in the
1208334c51SBrooks Davis // documentation and/or other materials provided with the distribution.
1308334c51SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
1408334c51SBrooks Davis // may be used to endorse or promote products derived from this software
1508334c51SBrooks Davis // without specific prior written permission.
1608334c51SBrooks Davis //
1708334c51SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1808334c51SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1908334c51SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2008334c51SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2108334c51SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2208334c51SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2308334c51SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2408334c51SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2508334c51SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2608334c51SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2708334c51SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2808334c51SBrooks Davis
2908334c51SBrooks Davis #include "utils/sqlite/statement.ipp"
3008334c51SBrooks Davis
3108334c51SBrooks Davis extern "C" {
3208334c51SBrooks Davis #include <stdint.h>
3308334c51SBrooks Davis }
3408334c51SBrooks Davis
3508334c51SBrooks Davis #include <cstring>
3608334c51SBrooks Davis #include <iostream>
3708334c51SBrooks Davis
3808334c51SBrooks Davis #include <atf-c++.hpp>
3908334c51SBrooks Davis
4008334c51SBrooks Davis #include "utils/sqlite/database.hpp"
4108334c51SBrooks Davis #include "utils/sqlite/test_utils.hpp"
4208334c51SBrooks Davis
4308334c51SBrooks Davis namespace sqlite = utils::sqlite;
4408334c51SBrooks Davis
4508334c51SBrooks Davis
4608334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(step__ok);
ATF_TEST_CASE_BODY(step__ok)4708334c51SBrooks Davis ATF_TEST_CASE_BODY(step__ok)
4808334c51SBrooks Davis {
4908334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
5008334c51SBrooks Davis sqlite::statement stmt = db.create_statement(
5108334c51SBrooks Davis "CREATE TABLE foo (a INTEGER PRIMARY KEY)");
5208334c51SBrooks Davis ATF_REQUIRE_THROW(sqlite::error, db.exec("SELECT * FROM foo"));
5308334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
5408334c51SBrooks Davis db.exec("SELECT * FROM foo");
5508334c51SBrooks Davis }
5608334c51SBrooks Davis
5708334c51SBrooks Davis
5808334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(step__many);
ATF_TEST_CASE_BODY(step__many)5908334c51SBrooks Davis ATF_TEST_CASE_BODY(step__many)
6008334c51SBrooks Davis {
6108334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
6208334c51SBrooks Davis create_test_table(raw(db));
6308334c51SBrooks Davis sqlite::statement stmt = db.create_statement(
6408334c51SBrooks Davis "SELECT prime FROM test ORDER BY prime");
6508334c51SBrooks Davis for (int i = 0; i < 5; i++)
6608334c51SBrooks Davis ATF_REQUIRE(stmt.step());
6708334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
6808334c51SBrooks Davis }
6908334c51SBrooks Davis
7008334c51SBrooks Davis
7108334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(step__fail);
ATF_TEST_CASE_BODY(step__fail)7208334c51SBrooks Davis ATF_TEST_CASE_BODY(step__fail)
7308334c51SBrooks Davis {
7408334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
7508334c51SBrooks Davis sqlite::statement stmt = db.create_statement(
7608334c51SBrooks Davis "CREATE TABLE foo (a INTEGER PRIMARY KEY)");
7708334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
7808334c51SBrooks Davis REQUIRE_API_ERROR("sqlite3_step", stmt.step());
7908334c51SBrooks Davis }
8008334c51SBrooks Davis
8108334c51SBrooks Davis
8208334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(step_without_results__ok);
ATF_TEST_CASE_BODY(step_without_results__ok)8308334c51SBrooks Davis ATF_TEST_CASE_BODY(step_without_results__ok)
8408334c51SBrooks Davis {
8508334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
8608334c51SBrooks Davis sqlite::statement stmt = db.create_statement(
8708334c51SBrooks Davis "CREATE TABLE foo (a INTEGER PRIMARY KEY)");
8808334c51SBrooks Davis ATF_REQUIRE_THROW(sqlite::error, db.exec("SELECT * FROM foo"));
8908334c51SBrooks Davis stmt.step_without_results();
9008334c51SBrooks Davis db.exec("SELECT * FROM foo");
9108334c51SBrooks Davis }
9208334c51SBrooks Davis
9308334c51SBrooks Davis
9408334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(step_without_results__fail);
ATF_TEST_CASE_BODY(step_without_results__fail)9508334c51SBrooks Davis ATF_TEST_CASE_BODY(step_without_results__fail)
9608334c51SBrooks Davis {
9708334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
9808334c51SBrooks Davis db.exec("CREATE TABLE foo (a INTEGER PRIMARY KEY)");
9908334c51SBrooks Davis db.exec("INSERT INTO foo VALUES (3)");
10008334c51SBrooks Davis sqlite::statement stmt = db.create_statement(
10108334c51SBrooks Davis "INSERT INTO foo VALUES (3)");
10208334c51SBrooks Davis REQUIRE_API_ERROR("sqlite3_step", stmt.step_without_results());
10308334c51SBrooks Davis }
10408334c51SBrooks Davis
10508334c51SBrooks Davis
10608334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_count);
ATF_TEST_CASE_BODY(column_count)10708334c51SBrooks Davis ATF_TEST_CASE_BODY(column_count)
10808334c51SBrooks Davis {
10908334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
11008334c51SBrooks Davis db.exec("CREATE TABLE foo (a INTEGER PRIMARY KEY, b INTEGER, c TEXT);"
11108334c51SBrooks Davis "INSERT INTO foo VALUES (5, 3, 'foo');");
11208334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
11308334c51SBrooks Davis ATF_REQUIRE(stmt.step());
11408334c51SBrooks Davis ATF_REQUIRE_EQ(3, stmt.column_count());
11508334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
11608334c51SBrooks Davis }
11708334c51SBrooks Davis
11808334c51SBrooks Davis
11908334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_name__ok);
ATF_TEST_CASE_BODY(column_name__ok)12008334c51SBrooks Davis ATF_TEST_CASE_BODY(column_name__ok)
12108334c51SBrooks Davis {
12208334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
12308334c51SBrooks Davis db.exec("CREATE TABLE foo (first INTEGER PRIMARY KEY, second TEXT);"
12408334c51SBrooks Davis "INSERT INTO foo VALUES (5, 'foo');");
12508334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
12608334c51SBrooks Davis ATF_REQUIRE(stmt.step());
12708334c51SBrooks Davis ATF_REQUIRE_EQ("first", stmt.column_name(0));
12808334c51SBrooks Davis ATF_REQUIRE_EQ("second", stmt.column_name(1));
12908334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
13008334c51SBrooks Davis }
13108334c51SBrooks Davis
13208334c51SBrooks Davis
13308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_name__fail);
ATF_TEST_CASE_BODY(column_name__fail)13408334c51SBrooks Davis ATF_TEST_CASE_BODY(column_name__fail)
13508334c51SBrooks Davis {
13608334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
13708334c51SBrooks Davis db.exec("CREATE TABLE foo (first INTEGER PRIMARY KEY);"
13808334c51SBrooks Davis "INSERT INTO foo VALUES (5);");
13908334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
14008334c51SBrooks Davis ATF_REQUIRE(stmt.step());
14108334c51SBrooks Davis ATF_REQUIRE_EQ("first", stmt.column_name(0));
14208334c51SBrooks Davis REQUIRE_API_ERROR("sqlite3_column_name", stmt.column_name(1));
14308334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
14408334c51SBrooks Davis }
14508334c51SBrooks Davis
14608334c51SBrooks Davis
14708334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_type__ok);
ATF_TEST_CASE_BODY(column_type__ok)14808334c51SBrooks Davis ATF_TEST_CASE_BODY(column_type__ok)
14908334c51SBrooks Davis {
15008334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
15108334c51SBrooks Davis db.exec("CREATE TABLE foo (a_blob BLOB,"
15208334c51SBrooks Davis " a_float FLOAT,"
15308334c51SBrooks Davis " an_integer INTEGER,"
15408334c51SBrooks Davis " a_null BLOB,"
15508334c51SBrooks Davis " a_text TEXT);"
15608334c51SBrooks Davis "INSERT INTO foo VALUES (x'0102', 0.3, 5, NULL, 'foo bar');"
15708334c51SBrooks Davis "INSERT INTO foo VALUES (NULL, NULL, NULL, NULL, NULL);");
15808334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
15908334c51SBrooks Davis ATF_REQUIRE(stmt.step());
16008334c51SBrooks Davis ATF_REQUIRE(sqlite::type_blob == stmt.column_type(0));
16108334c51SBrooks Davis ATF_REQUIRE(sqlite::type_float == stmt.column_type(1));
16208334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(2));
16308334c51SBrooks Davis ATF_REQUIRE(sqlite::type_null == stmt.column_type(3));
16408334c51SBrooks Davis ATF_REQUIRE(sqlite::type_text == stmt.column_type(4));
16508334c51SBrooks Davis ATF_REQUIRE(stmt.step());
16608334c51SBrooks Davis for (int i = 0; i < stmt.column_count(); i++)
16708334c51SBrooks Davis ATF_REQUIRE(sqlite::type_null == stmt.column_type(i));
16808334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
16908334c51SBrooks Davis }
17008334c51SBrooks Davis
17108334c51SBrooks Davis
17208334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_type__out_of_range);
ATF_TEST_CASE_BODY(column_type__out_of_range)17308334c51SBrooks Davis ATF_TEST_CASE_BODY(column_type__out_of_range)
17408334c51SBrooks Davis {
17508334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
17608334c51SBrooks Davis db.exec("CREATE TABLE foo (a INTEGER PRIMARY KEY);"
17708334c51SBrooks Davis "INSERT INTO foo VALUES (1);");
17808334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
17908334c51SBrooks Davis ATF_REQUIRE(stmt.step());
18008334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
18108334c51SBrooks Davis ATF_REQUIRE(sqlite::type_null == stmt.column_type(1));
18208334c51SBrooks Davis ATF_REQUIRE(sqlite::type_null == stmt.column_type(512));
18308334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
18408334c51SBrooks Davis }
18508334c51SBrooks Davis
18608334c51SBrooks Davis
18708334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_id__ok);
ATF_TEST_CASE_BODY(column_id__ok)18808334c51SBrooks Davis ATF_TEST_CASE_BODY(column_id__ok)
18908334c51SBrooks Davis {
19008334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
19108334c51SBrooks Davis db.exec("CREATE TABLE foo (bar INTEGER PRIMARY KEY, "
19208334c51SBrooks Davis " baz INTEGER);"
19308334c51SBrooks Davis "INSERT INTO foo VALUES (1, 2);");
19408334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
19508334c51SBrooks Davis ATF_REQUIRE(stmt.step());
19608334c51SBrooks Davis ATF_REQUIRE_EQ(0, stmt.column_id("bar"));
19708334c51SBrooks Davis ATF_REQUIRE_EQ(1, stmt.column_id("baz"));
19808334c51SBrooks Davis ATF_REQUIRE_EQ(0, stmt.column_id("bar"));
19908334c51SBrooks Davis ATF_REQUIRE_EQ(1, stmt.column_id("baz"));
20008334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
20108334c51SBrooks Davis }
20208334c51SBrooks Davis
20308334c51SBrooks Davis
20408334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_id__missing);
ATF_TEST_CASE_BODY(column_id__missing)20508334c51SBrooks Davis ATF_TEST_CASE_BODY(column_id__missing)
20608334c51SBrooks Davis {
20708334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
20808334c51SBrooks Davis db.exec("CREATE TABLE foo (bar INTEGER PRIMARY KEY, "
20908334c51SBrooks Davis " baz INTEGER);"
21008334c51SBrooks Davis "INSERT INTO foo VALUES (1, 2);");
21108334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
21208334c51SBrooks Davis ATF_REQUIRE(stmt.step());
21308334c51SBrooks Davis ATF_REQUIRE_EQ(0, stmt.column_id("bar"));
21408334c51SBrooks Davis try {
21508334c51SBrooks Davis stmt.column_id("bazo");
21608334c51SBrooks Davis fail("invalid_column_error not raised");
21708334c51SBrooks Davis } catch (const sqlite::invalid_column_error& e) {
21808334c51SBrooks Davis ATF_REQUIRE_EQ("bazo", e.column_name());
21908334c51SBrooks Davis }
22008334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
22108334c51SBrooks Davis }
22208334c51SBrooks Davis
22308334c51SBrooks Davis
22408334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_blob);
ATF_TEST_CASE_BODY(column_blob)22508334c51SBrooks Davis ATF_TEST_CASE_BODY(column_blob)
22608334c51SBrooks Davis {
22708334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
22808334c51SBrooks Davis db.exec("CREATE TABLE foo (a INTEGER, b BLOB, c INTEGER);"
22908334c51SBrooks Davis "INSERT INTO foo VALUES (NULL, x'cafe', NULL);");
23008334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
23108334c51SBrooks Davis ATF_REQUIRE(stmt.step());
23208334c51SBrooks Davis const sqlite::blob blob = stmt.column_blob(1);
23308334c51SBrooks Davis ATF_REQUIRE_EQ(0xca, static_cast< const uint8_t* >(blob.memory)[0]);
23408334c51SBrooks Davis ATF_REQUIRE_EQ(0xfe, static_cast< const uint8_t* >(blob.memory)[1]);
23508334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
23608334c51SBrooks Davis }
23708334c51SBrooks Davis
23808334c51SBrooks Davis
23908334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_double);
ATF_TEST_CASE_BODY(column_double)24008334c51SBrooks Davis ATF_TEST_CASE_BODY(column_double)
24108334c51SBrooks Davis {
24208334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
24308334c51SBrooks Davis db.exec("CREATE TABLE foo (a INTEGER, b DOUBLE, c INTEGER);"
24408334c51SBrooks Davis "INSERT INTO foo VALUES (NULL, 0.5, NULL);");
24508334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
24608334c51SBrooks Davis ATF_REQUIRE(stmt.step());
24708334c51SBrooks Davis ATF_REQUIRE_EQ(0.5, stmt.column_double(1));
24808334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
24908334c51SBrooks Davis }
25008334c51SBrooks Davis
25108334c51SBrooks Davis
25208334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_int__ok);
ATF_TEST_CASE_BODY(column_int__ok)25308334c51SBrooks Davis ATF_TEST_CASE_BODY(column_int__ok)
25408334c51SBrooks Davis {
25508334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
25608334c51SBrooks Davis db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"
25708334c51SBrooks Davis "INSERT INTO foo VALUES (NULL, 987, NULL);");
25808334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
25908334c51SBrooks Davis ATF_REQUIRE(stmt.step());
26008334c51SBrooks Davis ATF_REQUIRE_EQ(987, stmt.column_int(1));
26108334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
26208334c51SBrooks Davis }
26308334c51SBrooks Davis
26408334c51SBrooks Davis
26508334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_int__overflow);
ATF_TEST_CASE_BODY(column_int__overflow)26608334c51SBrooks Davis ATF_TEST_CASE_BODY(column_int__overflow)
26708334c51SBrooks Davis {
26808334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
26908334c51SBrooks Davis db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"
27008334c51SBrooks Davis "INSERT INTO foo VALUES (NULL, 4294967419, NULL);");
27108334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
27208334c51SBrooks Davis ATF_REQUIRE(stmt.step());
27308334c51SBrooks Davis ATF_REQUIRE_EQ(123, stmt.column_int(1));
27408334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
27508334c51SBrooks Davis }
27608334c51SBrooks Davis
27708334c51SBrooks Davis
27808334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_int64);
ATF_TEST_CASE_BODY(column_int64)27908334c51SBrooks Davis ATF_TEST_CASE_BODY(column_int64)
28008334c51SBrooks Davis {
28108334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
28208334c51SBrooks Davis db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"
28308334c51SBrooks Davis "INSERT INTO foo VALUES (NULL, 4294967419, NULL);");
28408334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
28508334c51SBrooks Davis ATF_REQUIRE(stmt.step());
28608334c51SBrooks Davis ATF_REQUIRE_EQ(4294967419LL, stmt.column_int64(1));
28708334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
28808334c51SBrooks Davis }
28908334c51SBrooks Davis
29008334c51SBrooks Davis
29108334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_text);
ATF_TEST_CASE_BODY(column_text)29208334c51SBrooks Davis ATF_TEST_CASE_BODY(column_text)
29308334c51SBrooks Davis {
29408334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
29508334c51SBrooks Davis db.exec("CREATE TABLE foo (a INTEGER, b TEXT, c INTEGER);"
29608334c51SBrooks Davis "INSERT INTO foo VALUES (NULL, 'foo bar', NULL);");
29708334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
29808334c51SBrooks Davis ATF_REQUIRE(stmt.step());
29908334c51SBrooks Davis ATF_REQUIRE_EQ("foo bar", stmt.column_text(1));
30008334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
30108334c51SBrooks Davis }
30208334c51SBrooks Davis
30308334c51SBrooks Davis
30408334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_bytes__blob);
ATF_TEST_CASE_BODY(column_bytes__blob)30508334c51SBrooks Davis ATF_TEST_CASE_BODY(column_bytes__blob)
30608334c51SBrooks Davis {
30708334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
30808334c51SBrooks Davis db.exec("CREATE TABLE foo (a BLOB);"
30908334c51SBrooks Davis "INSERT INTO foo VALUES (x'12345678');");
31008334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
31108334c51SBrooks Davis ATF_REQUIRE(stmt.step());
31208334c51SBrooks Davis ATF_REQUIRE_EQ(4, stmt.column_bytes(0));
31308334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
31408334c51SBrooks Davis }
31508334c51SBrooks Davis
31608334c51SBrooks Davis
31708334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(column_bytes__text);
ATF_TEST_CASE_BODY(column_bytes__text)31808334c51SBrooks Davis ATF_TEST_CASE_BODY(column_bytes__text)
31908334c51SBrooks Davis {
32008334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
32108334c51SBrooks Davis db.exec("CREATE TABLE foo (a TEXT);"
32208334c51SBrooks Davis "INSERT INTO foo VALUES ('foo bar');");
32308334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
32408334c51SBrooks Davis ATF_REQUIRE(stmt.step());
32508334c51SBrooks Davis ATF_REQUIRE_EQ(7, stmt.column_bytes(0));
32608334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
32708334c51SBrooks Davis }
32808334c51SBrooks Davis
32908334c51SBrooks Davis
33008334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_blob__ok);
ATF_TEST_CASE_BODY(safe_column_blob__ok)33108334c51SBrooks Davis ATF_TEST_CASE_BODY(safe_column_blob__ok)
33208334c51SBrooks Davis {
33308334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
33408334c51SBrooks Davis db.exec("CREATE TABLE foo (a INTEGER, b BLOB, c INTEGER);"
33508334c51SBrooks Davis "INSERT INTO foo VALUES (NULL, x'cafe', NULL);");
33608334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
33708334c51SBrooks Davis ATF_REQUIRE(stmt.step());
33808334c51SBrooks Davis const sqlite::blob blob = stmt.safe_column_blob("b");
33908334c51SBrooks Davis ATF_REQUIRE_EQ(0xca, static_cast< const uint8_t* >(blob.memory)[0]);
34008334c51SBrooks Davis ATF_REQUIRE_EQ(0xfe, static_cast< const uint8_t* >(blob.memory)[1]);
34108334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
34208334c51SBrooks Davis }
34308334c51SBrooks Davis
34408334c51SBrooks Davis
34508334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_blob__fail);
ATF_TEST_CASE_BODY(safe_column_blob__fail)34608334c51SBrooks Davis ATF_TEST_CASE_BODY(safe_column_blob__fail)
34708334c51SBrooks Davis {
34808334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
34908334c51SBrooks Davis db.exec("CREATE TABLE foo (a INTEGER);"
35008334c51SBrooks Davis "INSERT INTO foo VALUES (123);");
35108334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
35208334c51SBrooks Davis ATF_REQUIRE(stmt.step());
35308334c51SBrooks Davis ATF_REQUIRE_THROW(sqlite::invalid_column_error,
35408334c51SBrooks Davis stmt.safe_column_blob("b"));
35508334c51SBrooks Davis ATF_REQUIRE_THROW_RE(sqlite::error, "not a blob",
35608334c51SBrooks Davis stmt.safe_column_blob("a"));
35708334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
35808334c51SBrooks Davis }
35908334c51SBrooks Davis
36008334c51SBrooks Davis
36108334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_double__ok);
ATF_TEST_CASE_BODY(safe_column_double__ok)36208334c51SBrooks Davis ATF_TEST_CASE_BODY(safe_column_double__ok)
36308334c51SBrooks Davis {
36408334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
36508334c51SBrooks Davis db.exec("CREATE TABLE foo (a INTEGER, b DOUBLE, c INTEGER);"
36608334c51SBrooks Davis "INSERT INTO foo VALUES (NULL, 0.5, NULL);");
36708334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
36808334c51SBrooks Davis ATF_REQUIRE(stmt.step());
36908334c51SBrooks Davis ATF_REQUIRE_EQ(0.5, stmt.safe_column_double("b"));
37008334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
37108334c51SBrooks Davis }
37208334c51SBrooks Davis
37308334c51SBrooks Davis
37408334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_double__fail);
ATF_TEST_CASE_BODY(safe_column_double__fail)37508334c51SBrooks Davis ATF_TEST_CASE_BODY(safe_column_double__fail)
37608334c51SBrooks Davis {
37708334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
37808334c51SBrooks Davis db.exec("CREATE TABLE foo (a INTEGER);"
37908334c51SBrooks Davis "INSERT INTO foo VALUES (NULL);");
38008334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
38108334c51SBrooks Davis ATF_REQUIRE(stmt.step());
38208334c51SBrooks Davis ATF_REQUIRE_THROW(sqlite::invalid_column_error,
38308334c51SBrooks Davis stmt.safe_column_double("b"));
38408334c51SBrooks Davis ATF_REQUIRE_THROW_RE(sqlite::error, "not a float",
38508334c51SBrooks Davis stmt.safe_column_double("a"));
38608334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
38708334c51SBrooks Davis }
38808334c51SBrooks Davis
38908334c51SBrooks Davis
39008334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_int__ok);
ATF_TEST_CASE_BODY(safe_column_int__ok)39108334c51SBrooks Davis ATF_TEST_CASE_BODY(safe_column_int__ok)
39208334c51SBrooks Davis {
39308334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
39408334c51SBrooks Davis db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"
39508334c51SBrooks Davis "INSERT INTO foo VALUES (NULL, 987, NULL);");
39608334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
39708334c51SBrooks Davis ATF_REQUIRE(stmt.step());
39808334c51SBrooks Davis ATF_REQUIRE_EQ(987, stmt.safe_column_int("b"));
39908334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
40008334c51SBrooks Davis }
40108334c51SBrooks Davis
40208334c51SBrooks Davis
40308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_int__fail);
ATF_TEST_CASE_BODY(safe_column_int__fail)40408334c51SBrooks Davis ATF_TEST_CASE_BODY(safe_column_int__fail)
40508334c51SBrooks Davis {
40608334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
40708334c51SBrooks Davis db.exec("CREATE TABLE foo (a TEXT);"
40808334c51SBrooks Davis "INSERT INTO foo VALUES ('def');");
40908334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
41008334c51SBrooks Davis ATF_REQUIRE(stmt.step());
41108334c51SBrooks Davis ATF_REQUIRE_THROW(sqlite::invalid_column_error,
41208334c51SBrooks Davis stmt.safe_column_int("b"));
41308334c51SBrooks Davis ATF_REQUIRE_THROW_RE(sqlite::error, "not an integer",
41408334c51SBrooks Davis stmt.safe_column_int("a"));
41508334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
41608334c51SBrooks Davis }
41708334c51SBrooks Davis
41808334c51SBrooks Davis
41908334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_int64__ok);
ATF_TEST_CASE_BODY(safe_column_int64__ok)42008334c51SBrooks Davis ATF_TEST_CASE_BODY(safe_column_int64__ok)
42108334c51SBrooks Davis {
42208334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
42308334c51SBrooks Davis db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"
42408334c51SBrooks Davis "INSERT INTO foo VALUES (NULL, 4294967419, NULL);");
42508334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
42608334c51SBrooks Davis ATF_REQUIRE(stmt.step());
42708334c51SBrooks Davis ATF_REQUIRE_EQ(4294967419LL, stmt.safe_column_int64("b"));
42808334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
42908334c51SBrooks Davis }
43008334c51SBrooks Davis
43108334c51SBrooks Davis
43208334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_int64__fail);
ATF_TEST_CASE_BODY(safe_column_int64__fail)43308334c51SBrooks Davis ATF_TEST_CASE_BODY(safe_column_int64__fail)
43408334c51SBrooks Davis {
43508334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
43608334c51SBrooks Davis db.exec("CREATE TABLE foo (a TEXT);"
43708334c51SBrooks Davis "INSERT INTO foo VALUES ('abc');");
43808334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
43908334c51SBrooks Davis ATF_REQUIRE(stmt.step());
44008334c51SBrooks Davis ATF_REQUIRE_THROW(sqlite::invalid_column_error,
44108334c51SBrooks Davis stmt.safe_column_int64("b"));
44208334c51SBrooks Davis ATF_REQUIRE_THROW_RE(sqlite::error, "not an integer",
44308334c51SBrooks Davis stmt.safe_column_int64("a"));
44408334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
44508334c51SBrooks Davis }
44608334c51SBrooks Davis
44708334c51SBrooks Davis
44808334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_text__ok);
ATF_TEST_CASE_BODY(safe_column_text__ok)44908334c51SBrooks Davis ATF_TEST_CASE_BODY(safe_column_text__ok)
45008334c51SBrooks Davis {
45108334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
45208334c51SBrooks Davis db.exec("CREATE TABLE foo (a INTEGER, b TEXT, c INTEGER);"
45308334c51SBrooks Davis "INSERT INTO foo VALUES (NULL, 'foo bar', NULL);");
45408334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
45508334c51SBrooks Davis ATF_REQUIRE(stmt.step());
45608334c51SBrooks Davis ATF_REQUIRE_EQ("foo bar", stmt.safe_column_text("b"));
45708334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
45808334c51SBrooks Davis }
45908334c51SBrooks Davis
46008334c51SBrooks Davis
46108334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_text__fail);
ATF_TEST_CASE_BODY(safe_column_text__fail)46208334c51SBrooks Davis ATF_TEST_CASE_BODY(safe_column_text__fail)
46308334c51SBrooks Davis {
46408334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
46508334c51SBrooks Davis db.exec("CREATE TABLE foo (a INTEGER);"
46608334c51SBrooks Davis "INSERT INTO foo VALUES (NULL);");
46708334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
46808334c51SBrooks Davis ATF_REQUIRE(stmt.step());
46908334c51SBrooks Davis ATF_REQUIRE_THROW(sqlite::invalid_column_error,
47008334c51SBrooks Davis stmt.safe_column_text("b"));
47108334c51SBrooks Davis ATF_REQUIRE_THROW_RE(sqlite::error, "not a string",
47208334c51SBrooks Davis stmt.safe_column_text("a"));
47308334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
47408334c51SBrooks Davis }
47508334c51SBrooks Davis
47608334c51SBrooks Davis
47708334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_bytes__ok__blob);
ATF_TEST_CASE_BODY(safe_column_bytes__ok__blob)47808334c51SBrooks Davis ATF_TEST_CASE_BODY(safe_column_bytes__ok__blob)
47908334c51SBrooks Davis {
48008334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
48108334c51SBrooks Davis db.exec("CREATE TABLE foo (a BLOB);"
48208334c51SBrooks Davis "INSERT INTO foo VALUES (x'12345678');");
48308334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
48408334c51SBrooks Davis ATF_REQUIRE(stmt.step());
48508334c51SBrooks Davis ATF_REQUIRE_EQ(4, stmt.safe_column_bytes("a"));
48608334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
48708334c51SBrooks Davis }
48808334c51SBrooks Davis
48908334c51SBrooks Davis
49008334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_bytes__ok__text);
ATF_TEST_CASE_BODY(safe_column_bytes__ok__text)49108334c51SBrooks Davis ATF_TEST_CASE_BODY(safe_column_bytes__ok__text)
49208334c51SBrooks Davis {
49308334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
49408334c51SBrooks Davis db.exec("CREATE TABLE foo (a TEXT);"
49508334c51SBrooks Davis "INSERT INTO foo VALUES ('foo bar');");
49608334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
49708334c51SBrooks Davis ATF_REQUIRE(stmt.step());
49808334c51SBrooks Davis ATF_REQUIRE_EQ(7, stmt.safe_column_bytes("a"));
49908334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
50008334c51SBrooks Davis }
50108334c51SBrooks Davis
50208334c51SBrooks Davis
50308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(safe_column_bytes__fail);
ATF_TEST_CASE_BODY(safe_column_bytes__fail)50408334c51SBrooks Davis ATF_TEST_CASE_BODY(safe_column_bytes__fail)
50508334c51SBrooks Davis {
50608334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
50708334c51SBrooks Davis db.exec("CREATE TABLE foo (a TEXT);"
50808334c51SBrooks Davis "INSERT INTO foo VALUES (NULL);");
50908334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
51008334c51SBrooks Davis ATF_REQUIRE(stmt.step());
51108334c51SBrooks Davis ATF_REQUIRE_THROW(sqlite::invalid_column_error,
51208334c51SBrooks Davis stmt.safe_column_bytes("b"));
51308334c51SBrooks Davis ATF_REQUIRE_THROW_RE(sqlite::error, "not a blob or a string",
51408334c51SBrooks Davis stmt.safe_column_bytes("a"));
51508334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
51608334c51SBrooks Davis }
51708334c51SBrooks Davis
51808334c51SBrooks Davis
51908334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(reset);
ATF_TEST_CASE_BODY(reset)52008334c51SBrooks Davis ATF_TEST_CASE_BODY(reset)
52108334c51SBrooks Davis {
52208334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
52308334c51SBrooks Davis db.exec("CREATE TABLE foo (a TEXT);"
52408334c51SBrooks Davis "INSERT INTO foo VALUES ('foo bar');");
52508334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT * FROM foo");
52608334c51SBrooks Davis ATF_REQUIRE(stmt.step());
52708334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
52808334c51SBrooks Davis stmt.reset();
52908334c51SBrooks Davis ATF_REQUIRE(stmt.step());
53008334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
53108334c51SBrooks Davis }
53208334c51SBrooks Davis
53308334c51SBrooks Davis
53408334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__blob);
ATF_TEST_CASE_BODY(bind__blob)53508334c51SBrooks Davis ATF_TEST_CASE_BODY(bind__blob)
53608334c51SBrooks Davis {
53708334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
53808334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT 3, ?");
53908334c51SBrooks Davis
54008334c51SBrooks Davis const unsigned char blob[] = {0xca, 0xfe};
54108334c51SBrooks Davis stmt.bind(1, sqlite::blob(static_cast< const void* >(blob), 2));
54208334c51SBrooks Davis ATF_REQUIRE(stmt.step());
54308334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
54408334c51SBrooks Davis ATF_REQUIRE_EQ(3, stmt.column_int(0));
54508334c51SBrooks Davis ATF_REQUIRE(sqlite::type_blob == stmt.column_type(1));
54608334c51SBrooks Davis const unsigned char* ret_blob =
54708334c51SBrooks Davis static_cast< const unsigned char* >(stmt.column_blob(1).memory);
54808334c51SBrooks Davis ATF_REQUIRE(std::memcmp(blob, ret_blob, 2) == 0);
54908334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
55008334c51SBrooks Davis }
55108334c51SBrooks Davis
55208334c51SBrooks Davis
55308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__double);
ATF_TEST_CASE_BODY(bind__double)55408334c51SBrooks Davis ATF_TEST_CASE_BODY(bind__double)
55508334c51SBrooks Davis {
55608334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
55708334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT 3, ?");
55808334c51SBrooks Davis
55908334c51SBrooks Davis stmt.bind(1, 0.5);
56008334c51SBrooks Davis ATF_REQUIRE(stmt.step());
56108334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
56208334c51SBrooks Davis ATF_REQUIRE_EQ(3, stmt.column_int(0));
56308334c51SBrooks Davis ATF_REQUIRE(sqlite::type_float == stmt.column_type(1));
56408334c51SBrooks Davis ATF_REQUIRE_EQ(0.5, stmt.column_double(1));
56508334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
56608334c51SBrooks Davis }
56708334c51SBrooks Davis
56808334c51SBrooks Davis
56908334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__int);
ATF_TEST_CASE_BODY(bind__int)57008334c51SBrooks Davis ATF_TEST_CASE_BODY(bind__int)
57108334c51SBrooks Davis {
57208334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
57308334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT 3, ?");
57408334c51SBrooks Davis
57508334c51SBrooks Davis stmt.bind(1, 123);
57608334c51SBrooks Davis ATF_REQUIRE(stmt.step());
57708334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
57808334c51SBrooks Davis ATF_REQUIRE_EQ(3, stmt.column_int(0));
57908334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(1));
58008334c51SBrooks Davis ATF_REQUIRE_EQ(123, stmt.column_int(1));
58108334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
58208334c51SBrooks Davis }
58308334c51SBrooks Davis
58408334c51SBrooks Davis
58508334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__int64);
ATF_TEST_CASE_BODY(bind__int64)58608334c51SBrooks Davis ATF_TEST_CASE_BODY(bind__int64)
58708334c51SBrooks Davis {
58808334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
58908334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT 3, ?");
59008334c51SBrooks Davis
59108334c51SBrooks Davis stmt.bind(1, static_cast< int64_t >(4294967419LL));
59208334c51SBrooks Davis ATF_REQUIRE(stmt.step());
59308334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
59408334c51SBrooks Davis ATF_REQUIRE_EQ(3, stmt.column_int(0));
59508334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(1));
59608334c51SBrooks Davis ATF_REQUIRE_EQ(4294967419LL, stmt.column_int64(1));
59708334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
59808334c51SBrooks Davis }
59908334c51SBrooks Davis
60008334c51SBrooks Davis
60108334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__null);
ATF_TEST_CASE_BODY(bind__null)60208334c51SBrooks Davis ATF_TEST_CASE_BODY(bind__null)
60308334c51SBrooks Davis {
60408334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
60508334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT 3, ?");
60608334c51SBrooks Davis
60708334c51SBrooks Davis stmt.bind(1, sqlite::null());
60808334c51SBrooks Davis ATF_REQUIRE(stmt.step());
60908334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
61008334c51SBrooks Davis ATF_REQUIRE_EQ(3, stmt.column_int(0));
61108334c51SBrooks Davis ATF_REQUIRE(sqlite::type_null == stmt.column_type(1));
61208334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
61308334c51SBrooks Davis }
61408334c51SBrooks Davis
61508334c51SBrooks Davis
61608334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__text);
ATF_TEST_CASE_BODY(bind__text)61708334c51SBrooks Davis ATF_TEST_CASE_BODY(bind__text)
61808334c51SBrooks Davis {
61908334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
62008334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT 3, ?");
62108334c51SBrooks Davis
62208334c51SBrooks Davis const std::string str = "Hello";
62308334c51SBrooks Davis stmt.bind(1, str);
62408334c51SBrooks Davis ATF_REQUIRE(stmt.step());
62508334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
62608334c51SBrooks Davis ATF_REQUIRE_EQ(3, stmt.column_int(0));
62708334c51SBrooks Davis ATF_REQUIRE(sqlite::type_text == stmt.column_type(1));
62808334c51SBrooks Davis ATF_REQUIRE_EQ(str, stmt.column_text(1));
62908334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
63008334c51SBrooks Davis }
63108334c51SBrooks Davis
63208334c51SBrooks Davis
63308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__text__transient);
ATF_TEST_CASE_BODY(bind__text__transient)63408334c51SBrooks Davis ATF_TEST_CASE_BODY(bind__text__transient)
63508334c51SBrooks Davis {
63608334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
63708334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT 3, :foo");
63808334c51SBrooks Davis
63908334c51SBrooks Davis {
64008334c51SBrooks Davis const std::string str = "Hello";
64108334c51SBrooks Davis stmt.bind(":foo", str);
64208334c51SBrooks Davis }
64308334c51SBrooks Davis
64408334c51SBrooks Davis ATF_REQUIRE(stmt.step());
64508334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
64608334c51SBrooks Davis ATF_REQUIRE_EQ(3, stmt.column_int(0));
64708334c51SBrooks Davis ATF_REQUIRE(sqlite::type_text == stmt.column_type(1));
64808334c51SBrooks Davis ATF_REQUIRE_EQ(std::string("Hello"), stmt.column_text(1));
64908334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
65008334c51SBrooks Davis }
65108334c51SBrooks Davis
65208334c51SBrooks Davis
65308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind__by_name);
ATF_TEST_CASE_BODY(bind__by_name)65408334c51SBrooks Davis ATF_TEST_CASE_BODY(bind__by_name)
65508334c51SBrooks Davis {
65608334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
65708334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT 3, :foo");
65808334c51SBrooks Davis
65908334c51SBrooks Davis const std::string str = "Hello";
66008334c51SBrooks Davis stmt.bind(":foo", str);
66108334c51SBrooks Davis ATF_REQUIRE(stmt.step());
66208334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
66308334c51SBrooks Davis ATF_REQUIRE_EQ(3, stmt.column_int(0));
66408334c51SBrooks Davis ATF_REQUIRE(sqlite::type_text == stmt.column_type(1));
66508334c51SBrooks Davis ATF_REQUIRE_EQ(str, stmt.column_text(1));
66608334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
66708334c51SBrooks Davis }
66808334c51SBrooks Davis
66908334c51SBrooks Davis
67008334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind_parameter_count);
ATF_TEST_CASE_BODY(bind_parameter_count)67108334c51SBrooks Davis ATF_TEST_CASE_BODY(bind_parameter_count)
67208334c51SBrooks Davis {
67308334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
67408334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT 3, ?, ?");
67508334c51SBrooks Davis ATF_REQUIRE_EQ(2, stmt.bind_parameter_count());
67608334c51SBrooks Davis }
67708334c51SBrooks Davis
67808334c51SBrooks Davis
67908334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind_parameter_index);
ATF_TEST_CASE_BODY(bind_parameter_index)68008334c51SBrooks Davis ATF_TEST_CASE_BODY(bind_parameter_index)
68108334c51SBrooks Davis {
68208334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
68308334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT 3, :foo, ?, :bar");
68408334c51SBrooks Davis ATF_REQUIRE_EQ(1, stmt.bind_parameter_index(":foo"));
68508334c51SBrooks Davis ATF_REQUIRE_EQ(3, stmt.bind_parameter_index(":bar"));
68608334c51SBrooks Davis }
68708334c51SBrooks Davis
68808334c51SBrooks Davis
68908334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bind_parameter_name);
ATF_TEST_CASE_BODY(bind_parameter_name)69008334c51SBrooks Davis ATF_TEST_CASE_BODY(bind_parameter_name)
69108334c51SBrooks Davis {
69208334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
69308334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT 3, :foo, ?, :bar");
69408334c51SBrooks Davis ATF_REQUIRE_EQ(":foo", stmt.bind_parameter_name(1));
69508334c51SBrooks Davis ATF_REQUIRE_EQ(":bar", stmt.bind_parameter_name(3));
69608334c51SBrooks Davis }
69708334c51SBrooks Davis
69808334c51SBrooks Davis
69908334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(clear_bindings);
ATF_TEST_CASE_BODY(clear_bindings)70008334c51SBrooks Davis ATF_TEST_CASE_BODY(clear_bindings)
70108334c51SBrooks Davis {
70208334c51SBrooks Davis sqlite::database db = sqlite::database::in_memory();
70308334c51SBrooks Davis sqlite::statement stmt = db.create_statement("SELECT 3, ?");
70408334c51SBrooks Davis
70508334c51SBrooks Davis stmt.bind(1, 5);
70608334c51SBrooks Davis ATF_REQUIRE(stmt.step());
70708334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
70808334c51SBrooks Davis ATF_REQUIRE_EQ(3, stmt.column_int(0));
70908334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(1));
71008334c51SBrooks Davis ATF_REQUIRE_EQ(5, stmt.column_int(1));
71108334c51SBrooks Davis stmt.clear_bindings();
71208334c51SBrooks Davis stmt.reset();
71308334c51SBrooks Davis
71408334c51SBrooks Davis ATF_REQUIRE(stmt.step());
71508334c51SBrooks Davis ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));
71608334c51SBrooks Davis ATF_REQUIRE_EQ(3, stmt.column_int(0));
71708334c51SBrooks Davis ATF_REQUIRE(sqlite::type_null == stmt.column_type(1));
71808334c51SBrooks Davis
71908334c51SBrooks Davis ATF_REQUIRE(!stmt.step());
72008334c51SBrooks Davis }
72108334c51SBrooks Davis
72208334c51SBrooks Davis
ATF_INIT_TEST_CASES(tcs)72308334c51SBrooks Davis ATF_INIT_TEST_CASES(tcs)
72408334c51SBrooks Davis {
72508334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, step__ok);
72608334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, step__many);
72708334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, step__fail);
72808334c51SBrooks Davis
72908334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, step_without_results__ok);
73008334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, step_without_results__fail);
73108334c51SBrooks Davis
73208334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_count);
73308334c51SBrooks Davis
73408334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_name__ok);
73508334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_name__fail);
73608334c51SBrooks Davis
73708334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_type__ok);
73808334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_type__out_of_range);
73908334c51SBrooks Davis
74008334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_id__ok);
74108334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_id__missing);
74208334c51SBrooks Davis
74308334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_blob);
74408334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_double);
74508334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_int__ok);
74608334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_int__overflow);
74708334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_int64);
74808334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_text);
74908334c51SBrooks Davis
75008334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_bytes__blob);
75108334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, column_bytes__text);
75208334c51SBrooks Davis
75308334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, safe_column_blob__ok);
75408334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, safe_column_blob__fail);
75508334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, safe_column_double__ok);
75608334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, safe_column_double__fail);
75708334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, safe_column_int__ok);
75808334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, safe_column_int__fail);
75908334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, safe_column_int64__ok);
76008334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, safe_column_int64__fail);
76108334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, safe_column_text__ok);
76208334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, safe_column_text__fail);
76308334c51SBrooks Davis
76408334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, safe_column_bytes__ok__blob);
76508334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, safe_column_bytes__ok__text);
76608334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, safe_column_bytes__fail);
76708334c51SBrooks Davis
76808334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, reset);
76908334c51SBrooks Davis
77008334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, bind__blob);
77108334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, bind__double);
77208334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, bind__int64);
77308334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, bind__int);
77408334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, bind__null);
77508334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, bind__text);
77608334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, bind__text__transient);
77708334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, bind__by_name);
77808334c51SBrooks Davis
77908334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, bind_parameter_count);
78008334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, bind_parameter_index);
78108334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, bind_parameter_name);
78208334c51SBrooks Davis
78308334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, clear_bindings);
78408334c51SBrooks Davis }
785