Path: blob/main/contrib/kyua/utils/sqlite/statement_test.cpp
48178 views
// Copyright 2011 The Kyua Authors.1// All rights reserved.2//3// Redistribution and use in source and binary forms, with or without4// modification, are permitted provided that the following conditions are5// met:6//7// * Redistributions of source code must retain the above copyright8// notice, this list of conditions and the following disclaimer.9// * Redistributions in binary form must reproduce the above copyright10// notice, this list of conditions and the following disclaimer in the11// documentation and/or other materials provided with the distribution.12// * Neither the name of Google Inc. nor the names of its contributors13// may be used to endorse or promote products derived from this software14// without specific prior written permission.15//16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.2728#include "utils/sqlite/statement.ipp"2930extern "C" {31#include <stdint.h>32}3334#include <cstring>35#include <iostream>3637#include <atf-c++.hpp>3839#include "utils/sqlite/database.hpp"40#include "utils/sqlite/test_utils.hpp"4142namespace sqlite = utils::sqlite;434445ATF_TEST_CASE_WITHOUT_HEAD(step__ok);46ATF_TEST_CASE_BODY(step__ok)47{48sqlite::database db = sqlite::database::in_memory();49sqlite::statement stmt = db.create_statement(50"CREATE TABLE foo (a INTEGER PRIMARY KEY)");51ATF_REQUIRE_THROW(sqlite::error, db.exec("SELECT * FROM foo"));52ATF_REQUIRE(!stmt.step());53db.exec("SELECT * FROM foo");54}555657ATF_TEST_CASE_WITHOUT_HEAD(step__many);58ATF_TEST_CASE_BODY(step__many)59{60sqlite::database db = sqlite::database::in_memory();61create_test_table(raw(db));62sqlite::statement stmt = db.create_statement(63"SELECT prime FROM test ORDER BY prime");64for (int i = 0; i < 5; i++)65ATF_REQUIRE(stmt.step());66ATF_REQUIRE(!stmt.step());67}686970ATF_TEST_CASE_WITHOUT_HEAD(step__fail);71ATF_TEST_CASE_BODY(step__fail)72{73sqlite::database db = sqlite::database::in_memory();74sqlite::statement stmt = db.create_statement(75"CREATE TABLE foo (a INTEGER PRIMARY KEY)");76ATF_REQUIRE(!stmt.step());77REQUIRE_API_ERROR("sqlite3_step", stmt.step());78}798081ATF_TEST_CASE_WITHOUT_HEAD(step_without_results__ok);82ATF_TEST_CASE_BODY(step_without_results__ok)83{84sqlite::database db = sqlite::database::in_memory();85sqlite::statement stmt = db.create_statement(86"CREATE TABLE foo (a INTEGER PRIMARY KEY)");87ATF_REQUIRE_THROW(sqlite::error, db.exec("SELECT * FROM foo"));88stmt.step_without_results();89db.exec("SELECT * FROM foo");90}919293ATF_TEST_CASE_WITHOUT_HEAD(step_without_results__fail);94ATF_TEST_CASE_BODY(step_without_results__fail)95{96sqlite::database db = sqlite::database::in_memory();97db.exec("CREATE TABLE foo (a INTEGER PRIMARY KEY)");98db.exec("INSERT INTO foo VALUES (3)");99sqlite::statement stmt = db.create_statement(100"INSERT INTO foo VALUES (3)");101REQUIRE_API_ERROR("sqlite3_step", stmt.step_without_results());102}103104105ATF_TEST_CASE_WITHOUT_HEAD(column_count);106ATF_TEST_CASE_BODY(column_count)107{108sqlite::database db = sqlite::database::in_memory();109db.exec("CREATE TABLE foo (a INTEGER PRIMARY KEY, b INTEGER, c TEXT);"110"INSERT INTO foo VALUES (5, 3, 'foo');");111sqlite::statement stmt = db.create_statement("SELECT * FROM foo");112ATF_REQUIRE(stmt.step());113ATF_REQUIRE_EQ(3, stmt.column_count());114ATF_REQUIRE(!stmt.step());115}116117118ATF_TEST_CASE_WITHOUT_HEAD(column_name__ok);119ATF_TEST_CASE_BODY(column_name__ok)120{121sqlite::database db = sqlite::database::in_memory();122db.exec("CREATE TABLE foo (first INTEGER PRIMARY KEY, second TEXT);"123"INSERT INTO foo VALUES (5, 'foo');");124sqlite::statement stmt = db.create_statement("SELECT * FROM foo");125ATF_REQUIRE(stmt.step());126ATF_REQUIRE_EQ("first", stmt.column_name(0));127ATF_REQUIRE_EQ("second", stmt.column_name(1));128ATF_REQUIRE(!stmt.step());129}130131132ATF_TEST_CASE_WITHOUT_HEAD(column_name__fail);133ATF_TEST_CASE_BODY(column_name__fail)134{135sqlite::database db = sqlite::database::in_memory();136db.exec("CREATE TABLE foo (first INTEGER PRIMARY KEY);"137"INSERT INTO foo VALUES (5);");138sqlite::statement stmt = db.create_statement("SELECT * FROM foo");139ATF_REQUIRE(stmt.step());140ATF_REQUIRE_EQ("first", stmt.column_name(0));141REQUIRE_API_ERROR("sqlite3_column_name", stmt.column_name(1));142ATF_REQUIRE(!stmt.step());143}144145146ATF_TEST_CASE_WITHOUT_HEAD(column_type__ok);147ATF_TEST_CASE_BODY(column_type__ok)148{149sqlite::database db = sqlite::database::in_memory();150db.exec("CREATE TABLE foo (a_blob BLOB,"151" a_float FLOAT,"152" an_integer INTEGER,"153" a_null BLOB,"154" a_text TEXT);"155"INSERT INTO foo VALUES (x'0102', 0.3, 5, NULL, 'foo bar');"156"INSERT INTO foo VALUES (NULL, NULL, NULL, NULL, NULL);");157sqlite::statement stmt = db.create_statement("SELECT * FROM foo");158ATF_REQUIRE(stmt.step());159ATF_REQUIRE(sqlite::type_blob == stmt.column_type(0));160ATF_REQUIRE(sqlite::type_float == stmt.column_type(1));161ATF_REQUIRE(sqlite::type_integer == stmt.column_type(2));162ATF_REQUIRE(sqlite::type_null == stmt.column_type(3));163ATF_REQUIRE(sqlite::type_text == stmt.column_type(4));164ATF_REQUIRE(stmt.step());165for (int i = 0; i < stmt.column_count(); i++)166ATF_REQUIRE(sqlite::type_null == stmt.column_type(i));167ATF_REQUIRE(!stmt.step());168}169170171ATF_TEST_CASE_WITHOUT_HEAD(column_type__out_of_range);172ATF_TEST_CASE_BODY(column_type__out_of_range)173{174sqlite::database db = sqlite::database::in_memory();175db.exec("CREATE TABLE foo (a INTEGER PRIMARY KEY);"176"INSERT INTO foo VALUES (1);");177sqlite::statement stmt = db.create_statement("SELECT * FROM foo");178ATF_REQUIRE(stmt.step());179ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));180ATF_REQUIRE(sqlite::type_null == stmt.column_type(1));181ATF_REQUIRE(sqlite::type_null == stmt.column_type(512));182ATF_REQUIRE(!stmt.step());183}184185186ATF_TEST_CASE_WITHOUT_HEAD(column_id__ok);187ATF_TEST_CASE_BODY(column_id__ok)188{189sqlite::database db = sqlite::database::in_memory();190db.exec("CREATE TABLE foo (bar INTEGER PRIMARY KEY, "191" baz INTEGER);"192"INSERT INTO foo VALUES (1, 2);");193sqlite::statement stmt = db.create_statement("SELECT * FROM foo");194ATF_REQUIRE(stmt.step());195ATF_REQUIRE_EQ(0, stmt.column_id("bar"));196ATF_REQUIRE_EQ(1, stmt.column_id("baz"));197ATF_REQUIRE_EQ(0, stmt.column_id("bar"));198ATF_REQUIRE_EQ(1, stmt.column_id("baz"));199ATF_REQUIRE(!stmt.step());200}201202203ATF_TEST_CASE_WITHOUT_HEAD(column_id__missing);204ATF_TEST_CASE_BODY(column_id__missing)205{206sqlite::database db = sqlite::database::in_memory();207db.exec("CREATE TABLE foo (bar INTEGER PRIMARY KEY, "208" baz INTEGER);"209"INSERT INTO foo VALUES (1, 2);");210sqlite::statement stmt = db.create_statement("SELECT * FROM foo");211ATF_REQUIRE(stmt.step());212ATF_REQUIRE_EQ(0, stmt.column_id("bar"));213try {214stmt.column_id("bazo");215fail("invalid_column_error not raised");216} catch (const sqlite::invalid_column_error& e) {217ATF_REQUIRE_EQ("bazo", e.column_name());218}219ATF_REQUIRE(!stmt.step());220}221222223ATF_TEST_CASE_WITHOUT_HEAD(column_blob);224ATF_TEST_CASE_BODY(column_blob)225{226sqlite::database db = sqlite::database::in_memory();227db.exec("CREATE TABLE foo (a INTEGER, b BLOB, c INTEGER);"228"INSERT INTO foo VALUES (NULL, x'cafe', NULL);");229sqlite::statement stmt = db.create_statement("SELECT * FROM foo");230ATF_REQUIRE(stmt.step());231const sqlite::blob blob = stmt.column_blob(1);232ATF_REQUIRE_EQ(0xca, static_cast< const uint8_t* >(blob.memory)[0]);233ATF_REQUIRE_EQ(0xfe, static_cast< const uint8_t* >(blob.memory)[1]);234ATF_REQUIRE(!stmt.step());235}236237238ATF_TEST_CASE_WITHOUT_HEAD(column_double);239ATF_TEST_CASE_BODY(column_double)240{241sqlite::database db = sqlite::database::in_memory();242db.exec("CREATE TABLE foo (a INTEGER, b DOUBLE, c INTEGER);"243"INSERT INTO foo VALUES (NULL, 0.5, NULL);");244sqlite::statement stmt = db.create_statement("SELECT * FROM foo");245ATF_REQUIRE(stmt.step());246ATF_REQUIRE_EQ(0.5, stmt.column_double(1));247ATF_REQUIRE(!stmt.step());248}249250251ATF_TEST_CASE_WITHOUT_HEAD(column_int__ok);252ATF_TEST_CASE_BODY(column_int__ok)253{254sqlite::database db = sqlite::database::in_memory();255db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"256"INSERT INTO foo VALUES (NULL, 987, NULL);");257sqlite::statement stmt = db.create_statement("SELECT * FROM foo");258ATF_REQUIRE(stmt.step());259ATF_REQUIRE_EQ(987, stmt.column_int(1));260ATF_REQUIRE(!stmt.step());261}262263264ATF_TEST_CASE_WITHOUT_HEAD(column_int__overflow);265ATF_TEST_CASE_BODY(column_int__overflow)266{267sqlite::database db = sqlite::database::in_memory();268db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"269"INSERT INTO foo VALUES (NULL, 4294967419, NULL);");270sqlite::statement stmt = db.create_statement("SELECT * FROM foo");271ATF_REQUIRE(stmt.step());272ATF_REQUIRE_EQ(123, stmt.column_int(1));273ATF_REQUIRE(!stmt.step());274}275276277ATF_TEST_CASE_WITHOUT_HEAD(column_int64);278ATF_TEST_CASE_BODY(column_int64)279{280sqlite::database db = sqlite::database::in_memory();281db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"282"INSERT INTO foo VALUES (NULL, 4294967419, NULL);");283sqlite::statement stmt = db.create_statement("SELECT * FROM foo");284ATF_REQUIRE(stmt.step());285ATF_REQUIRE_EQ(4294967419LL, stmt.column_int64(1));286ATF_REQUIRE(!stmt.step());287}288289290ATF_TEST_CASE_WITHOUT_HEAD(column_text);291ATF_TEST_CASE_BODY(column_text)292{293sqlite::database db = sqlite::database::in_memory();294db.exec("CREATE TABLE foo (a INTEGER, b TEXT, c INTEGER);"295"INSERT INTO foo VALUES (NULL, 'foo bar', NULL);");296sqlite::statement stmt = db.create_statement("SELECT * FROM foo");297ATF_REQUIRE(stmt.step());298ATF_REQUIRE_EQ("foo bar", stmt.column_text(1));299ATF_REQUIRE(!stmt.step());300}301302303ATF_TEST_CASE_WITHOUT_HEAD(column_bytes__blob);304ATF_TEST_CASE_BODY(column_bytes__blob)305{306sqlite::database db = sqlite::database::in_memory();307db.exec("CREATE TABLE foo (a BLOB);"308"INSERT INTO foo VALUES (x'12345678');");309sqlite::statement stmt = db.create_statement("SELECT * FROM foo");310ATF_REQUIRE(stmt.step());311ATF_REQUIRE_EQ(4, stmt.column_bytes(0));312ATF_REQUIRE(!stmt.step());313}314315316ATF_TEST_CASE_WITHOUT_HEAD(column_bytes__text);317ATF_TEST_CASE_BODY(column_bytes__text)318{319sqlite::database db = sqlite::database::in_memory();320db.exec("CREATE TABLE foo (a TEXT);"321"INSERT INTO foo VALUES ('foo bar');");322sqlite::statement stmt = db.create_statement("SELECT * FROM foo");323ATF_REQUIRE(stmt.step());324ATF_REQUIRE_EQ(7, stmt.column_bytes(0));325ATF_REQUIRE(!stmt.step());326}327328329ATF_TEST_CASE_WITHOUT_HEAD(safe_column_blob__ok);330ATF_TEST_CASE_BODY(safe_column_blob__ok)331{332sqlite::database db = sqlite::database::in_memory();333db.exec("CREATE TABLE foo (a INTEGER, b BLOB, c INTEGER);"334"INSERT INTO foo VALUES (NULL, x'cafe', NULL);");335sqlite::statement stmt = db.create_statement("SELECT * FROM foo");336ATF_REQUIRE(stmt.step());337const sqlite::blob blob = stmt.safe_column_blob("b");338ATF_REQUIRE_EQ(0xca, static_cast< const uint8_t* >(blob.memory)[0]);339ATF_REQUIRE_EQ(0xfe, static_cast< const uint8_t* >(blob.memory)[1]);340ATF_REQUIRE(!stmt.step());341}342343344ATF_TEST_CASE_WITHOUT_HEAD(safe_column_blob__fail);345ATF_TEST_CASE_BODY(safe_column_blob__fail)346{347sqlite::database db = sqlite::database::in_memory();348db.exec("CREATE TABLE foo (a INTEGER);"349"INSERT INTO foo VALUES (123);");350sqlite::statement stmt = db.create_statement("SELECT * FROM foo");351ATF_REQUIRE(stmt.step());352ATF_REQUIRE_THROW(sqlite::invalid_column_error,353stmt.safe_column_blob("b"));354ATF_REQUIRE_THROW_RE(sqlite::error, "not a blob",355stmt.safe_column_blob("a"));356ATF_REQUIRE(!stmt.step());357}358359360ATF_TEST_CASE_WITHOUT_HEAD(safe_column_double__ok);361ATF_TEST_CASE_BODY(safe_column_double__ok)362{363sqlite::database db = sqlite::database::in_memory();364db.exec("CREATE TABLE foo (a INTEGER, b DOUBLE, c INTEGER);"365"INSERT INTO foo VALUES (NULL, 0.5, NULL);");366sqlite::statement stmt = db.create_statement("SELECT * FROM foo");367ATF_REQUIRE(stmt.step());368ATF_REQUIRE_EQ(0.5, stmt.safe_column_double("b"));369ATF_REQUIRE(!stmt.step());370}371372373ATF_TEST_CASE_WITHOUT_HEAD(safe_column_double__fail);374ATF_TEST_CASE_BODY(safe_column_double__fail)375{376sqlite::database db = sqlite::database::in_memory();377db.exec("CREATE TABLE foo (a INTEGER);"378"INSERT INTO foo VALUES (NULL);");379sqlite::statement stmt = db.create_statement("SELECT * FROM foo");380ATF_REQUIRE(stmt.step());381ATF_REQUIRE_THROW(sqlite::invalid_column_error,382stmt.safe_column_double("b"));383ATF_REQUIRE_THROW_RE(sqlite::error, "not a float",384stmt.safe_column_double("a"));385ATF_REQUIRE(!stmt.step());386}387388389ATF_TEST_CASE_WITHOUT_HEAD(safe_column_int__ok);390ATF_TEST_CASE_BODY(safe_column_int__ok)391{392sqlite::database db = sqlite::database::in_memory();393db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"394"INSERT INTO foo VALUES (NULL, 987, NULL);");395sqlite::statement stmt = db.create_statement("SELECT * FROM foo");396ATF_REQUIRE(stmt.step());397ATF_REQUIRE_EQ(987, stmt.safe_column_int("b"));398ATF_REQUIRE(!stmt.step());399}400401402ATF_TEST_CASE_WITHOUT_HEAD(safe_column_int__fail);403ATF_TEST_CASE_BODY(safe_column_int__fail)404{405sqlite::database db = sqlite::database::in_memory();406db.exec("CREATE TABLE foo (a TEXT);"407"INSERT INTO foo VALUES ('def');");408sqlite::statement stmt = db.create_statement("SELECT * FROM foo");409ATF_REQUIRE(stmt.step());410ATF_REQUIRE_THROW(sqlite::invalid_column_error,411stmt.safe_column_int("b"));412ATF_REQUIRE_THROW_RE(sqlite::error, "not an integer",413stmt.safe_column_int("a"));414ATF_REQUIRE(!stmt.step());415}416417418ATF_TEST_CASE_WITHOUT_HEAD(safe_column_int64__ok);419ATF_TEST_CASE_BODY(safe_column_int64__ok)420{421sqlite::database db = sqlite::database::in_memory();422db.exec("CREATE TABLE foo (a TEXT, b INTEGER, c TEXT);"423"INSERT INTO foo VALUES (NULL, 4294967419, NULL);");424sqlite::statement stmt = db.create_statement("SELECT * FROM foo");425ATF_REQUIRE(stmt.step());426ATF_REQUIRE_EQ(4294967419LL, stmt.safe_column_int64("b"));427ATF_REQUIRE(!stmt.step());428}429430431ATF_TEST_CASE_WITHOUT_HEAD(safe_column_int64__fail);432ATF_TEST_CASE_BODY(safe_column_int64__fail)433{434sqlite::database db = sqlite::database::in_memory();435db.exec("CREATE TABLE foo (a TEXT);"436"INSERT INTO foo VALUES ('abc');");437sqlite::statement stmt = db.create_statement("SELECT * FROM foo");438ATF_REQUIRE(stmt.step());439ATF_REQUIRE_THROW(sqlite::invalid_column_error,440stmt.safe_column_int64("b"));441ATF_REQUIRE_THROW_RE(sqlite::error, "not an integer",442stmt.safe_column_int64("a"));443ATF_REQUIRE(!stmt.step());444}445446447ATF_TEST_CASE_WITHOUT_HEAD(safe_column_text__ok);448ATF_TEST_CASE_BODY(safe_column_text__ok)449{450sqlite::database db = sqlite::database::in_memory();451db.exec("CREATE TABLE foo (a INTEGER, b TEXT, c INTEGER);"452"INSERT INTO foo VALUES (NULL, 'foo bar', NULL);");453sqlite::statement stmt = db.create_statement("SELECT * FROM foo");454ATF_REQUIRE(stmt.step());455ATF_REQUIRE_EQ("foo bar", stmt.safe_column_text("b"));456ATF_REQUIRE(!stmt.step());457}458459460ATF_TEST_CASE_WITHOUT_HEAD(safe_column_text__fail);461ATF_TEST_CASE_BODY(safe_column_text__fail)462{463sqlite::database db = sqlite::database::in_memory();464db.exec("CREATE TABLE foo (a INTEGER);"465"INSERT INTO foo VALUES (NULL);");466sqlite::statement stmt = db.create_statement("SELECT * FROM foo");467ATF_REQUIRE(stmt.step());468ATF_REQUIRE_THROW(sqlite::invalid_column_error,469stmt.safe_column_text("b"));470ATF_REQUIRE_THROW_RE(sqlite::error, "not a string",471stmt.safe_column_text("a"));472ATF_REQUIRE(!stmt.step());473}474475476ATF_TEST_CASE_WITHOUT_HEAD(safe_column_bytes__ok__blob);477ATF_TEST_CASE_BODY(safe_column_bytes__ok__blob)478{479sqlite::database db = sqlite::database::in_memory();480db.exec("CREATE TABLE foo (a BLOB);"481"INSERT INTO foo VALUES (x'12345678');");482sqlite::statement stmt = db.create_statement("SELECT * FROM foo");483ATF_REQUIRE(stmt.step());484ATF_REQUIRE_EQ(4, stmt.safe_column_bytes("a"));485ATF_REQUIRE(!stmt.step());486}487488489ATF_TEST_CASE_WITHOUT_HEAD(safe_column_bytes__ok__text);490ATF_TEST_CASE_BODY(safe_column_bytes__ok__text)491{492sqlite::database db = sqlite::database::in_memory();493db.exec("CREATE TABLE foo (a TEXT);"494"INSERT INTO foo VALUES ('foo bar');");495sqlite::statement stmt = db.create_statement("SELECT * FROM foo");496ATF_REQUIRE(stmt.step());497ATF_REQUIRE_EQ(7, stmt.safe_column_bytes("a"));498ATF_REQUIRE(!stmt.step());499}500501502ATF_TEST_CASE_WITHOUT_HEAD(safe_column_bytes__fail);503ATF_TEST_CASE_BODY(safe_column_bytes__fail)504{505sqlite::database db = sqlite::database::in_memory();506db.exec("CREATE TABLE foo (a TEXT);"507"INSERT INTO foo VALUES (NULL);");508sqlite::statement stmt = db.create_statement("SELECT * FROM foo");509ATF_REQUIRE(stmt.step());510ATF_REQUIRE_THROW(sqlite::invalid_column_error,511stmt.safe_column_bytes("b"));512ATF_REQUIRE_THROW_RE(sqlite::error, "not a blob or a string",513stmt.safe_column_bytes("a"));514ATF_REQUIRE(!stmt.step());515}516517518ATF_TEST_CASE_WITHOUT_HEAD(reset);519ATF_TEST_CASE_BODY(reset)520{521sqlite::database db = sqlite::database::in_memory();522db.exec("CREATE TABLE foo (a TEXT);"523"INSERT INTO foo VALUES ('foo bar');");524sqlite::statement stmt = db.create_statement("SELECT * FROM foo");525ATF_REQUIRE(stmt.step());526ATF_REQUIRE(!stmt.step());527stmt.reset();528ATF_REQUIRE(stmt.step());529ATF_REQUIRE(!stmt.step());530}531532533ATF_TEST_CASE_WITHOUT_HEAD(bind__blob);534ATF_TEST_CASE_BODY(bind__blob)535{536sqlite::database db = sqlite::database::in_memory();537sqlite::statement stmt = db.create_statement("SELECT 3, ?");538539const unsigned char blob[] = {0xca, 0xfe};540stmt.bind(1, sqlite::blob(static_cast< const void* >(blob), 2));541ATF_REQUIRE(stmt.step());542ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));543ATF_REQUIRE_EQ(3, stmt.column_int(0));544ATF_REQUIRE(sqlite::type_blob == stmt.column_type(1));545const unsigned char* ret_blob =546static_cast< const unsigned char* >(stmt.column_blob(1).memory);547ATF_REQUIRE(std::memcmp(blob, ret_blob, 2) == 0);548ATF_REQUIRE(!stmt.step());549}550551552ATF_TEST_CASE_WITHOUT_HEAD(bind__double);553ATF_TEST_CASE_BODY(bind__double)554{555sqlite::database db = sqlite::database::in_memory();556sqlite::statement stmt = db.create_statement("SELECT 3, ?");557558stmt.bind(1, 0.5);559ATF_REQUIRE(stmt.step());560ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));561ATF_REQUIRE_EQ(3, stmt.column_int(0));562ATF_REQUIRE(sqlite::type_float == stmt.column_type(1));563ATF_REQUIRE_EQ(0.5, stmt.column_double(1));564ATF_REQUIRE(!stmt.step());565}566567568ATF_TEST_CASE_WITHOUT_HEAD(bind__int);569ATF_TEST_CASE_BODY(bind__int)570{571sqlite::database db = sqlite::database::in_memory();572sqlite::statement stmt = db.create_statement("SELECT 3, ?");573574stmt.bind(1, 123);575ATF_REQUIRE(stmt.step());576ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));577ATF_REQUIRE_EQ(3, stmt.column_int(0));578ATF_REQUIRE(sqlite::type_integer == stmt.column_type(1));579ATF_REQUIRE_EQ(123, stmt.column_int(1));580ATF_REQUIRE(!stmt.step());581}582583584ATF_TEST_CASE_WITHOUT_HEAD(bind__int64);585ATF_TEST_CASE_BODY(bind__int64)586{587sqlite::database db = sqlite::database::in_memory();588sqlite::statement stmt = db.create_statement("SELECT 3, ?");589590stmt.bind(1, static_cast< int64_t >(4294967419LL));591ATF_REQUIRE(stmt.step());592ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));593ATF_REQUIRE_EQ(3, stmt.column_int(0));594ATF_REQUIRE(sqlite::type_integer == stmt.column_type(1));595ATF_REQUIRE_EQ(4294967419LL, stmt.column_int64(1));596ATF_REQUIRE(!stmt.step());597}598599600ATF_TEST_CASE_WITHOUT_HEAD(bind__null);601ATF_TEST_CASE_BODY(bind__null)602{603sqlite::database db = sqlite::database::in_memory();604sqlite::statement stmt = db.create_statement("SELECT 3, ?");605606stmt.bind(1, sqlite::null());607ATF_REQUIRE(stmt.step());608ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));609ATF_REQUIRE_EQ(3, stmt.column_int(0));610ATF_REQUIRE(sqlite::type_null == stmt.column_type(1));611ATF_REQUIRE(!stmt.step());612}613614615ATF_TEST_CASE_WITHOUT_HEAD(bind__text);616ATF_TEST_CASE_BODY(bind__text)617{618sqlite::database db = sqlite::database::in_memory();619sqlite::statement stmt = db.create_statement("SELECT 3, ?");620621const std::string str = "Hello";622stmt.bind(1, str);623ATF_REQUIRE(stmt.step());624ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));625ATF_REQUIRE_EQ(3, stmt.column_int(0));626ATF_REQUIRE(sqlite::type_text == stmt.column_type(1));627ATF_REQUIRE_EQ(str, stmt.column_text(1));628ATF_REQUIRE(!stmt.step());629}630631632ATF_TEST_CASE_WITHOUT_HEAD(bind__text__transient);633ATF_TEST_CASE_BODY(bind__text__transient)634{635sqlite::database db = sqlite::database::in_memory();636sqlite::statement stmt = db.create_statement("SELECT 3, :foo");637638{639const std::string str = "Hello";640stmt.bind(":foo", str);641}642643ATF_REQUIRE(stmt.step());644ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));645ATF_REQUIRE_EQ(3, stmt.column_int(0));646ATF_REQUIRE(sqlite::type_text == stmt.column_type(1));647ATF_REQUIRE_EQ(std::string("Hello"), stmt.column_text(1));648ATF_REQUIRE(!stmt.step());649}650651652ATF_TEST_CASE_WITHOUT_HEAD(bind__by_name);653ATF_TEST_CASE_BODY(bind__by_name)654{655sqlite::database db = sqlite::database::in_memory();656sqlite::statement stmt = db.create_statement("SELECT 3, :foo");657658const std::string str = "Hello";659stmt.bind(":foo", str);660ATF_REQUIRE(stmt.step());661ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));662ATF_REQUIRE_EQ(3, stmt.column_int(0));663ATF_REQUIRE(sqlite::type_text == stmt.column_type(1));664ATF_REQUIRE_EQ(str, stmt.column_text(1));665ATF_REQUIRE(!stmt.step());666}667668669ATF_TEST_CASE_WITHOUT_HEAD(bind_parameter_count);670ATF_TEST_CASE_BODY(bind_parameter_count)671{672sqlite::database db = sqlite::database::in_memory();673sqlite::statement stmt = db.create_statement("SELECT 3, ?, ?");674ATF_REQUIRE_EQ(2, stmt.bind_parameter_count());675}676677678ATF_TEST_CASE_WITHOUT_HEAD(bind_parameter_index);679ATF_TEST_CASE_BODY(bind_parameter_index)680{681sqlite::database db = sqlite::database::in_memory();682sqlite::statement stmt = db.create_statement("SELECT 3, :foo, ?, :bar");683ATF_REQUIRE_EQ(1, stmt.bind_parameter_index(":foo"));684ATF_REQUIRE_EQ(3, stmt.bind_parameter_index(":bar"));685}686687688ATF_TEST_CASE_WITHOUT_HEAD(bind_parameter_name);689ATF_TEST_CASE_BODY(bind_parameter_name)690{691sqlite::database db = sqlite::database::in_memory();692sqlite::statement stmt = db.create_statement("SELECT 3, :foo, ?, :bar");693ATF_REQUIRE_EQ(":foo", stmt.bind_parameter_name(1));694ATF_REQUIRE_EQ(":bar", stmt.bind_parameter_name(3));695}696697698ATF_TEST_CASE_WITHOUT_HEAD(clear_bindings);699ATF_TEST_CASE_BODY(clear_bindings)700{701sqlite::database db = sqlite::database::in_memory();702sqlite::statement stmt = db.create_statement("SELECT 3, ?");703704stmt.bind(1, 5);705ATF_REQUIRE(stmt.step());706ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));707ATF_REQUIRE_EQ(3, stmt.column_int(0));708ATF_REQUIRE(sqlite::type_integer == stmt.column_type(1));709ATF_REQUIRE_EQ(5, stmt.column_int(1));710stmt.clear_bindings();711stmt.reset();712713ATF_REQUIRE(stmt.step());714ATF_REQUIRE(sqlite::type_integer == stmt.column_type(0));715ATF_REQUIRE_EQ(3, stmt.column_int(0));716ATF_REQUIRE(sqlite::type_null == stmt.column_type(1));717718ATF_REQUIRE(!stmt.step());719}720721722ATF_INIT_TEST_CASES(tcs)723{724ATF_ADD_TEST_CASE(tcs, step__ok);725ATF_ADD_TEST_CASE(tcs, step__many);726ATF_ADD_TEST_CASE(tcs, step__fail);727728ATF_ADD_TEST_CASE(tcs, step_without_results__ok);729ATF_ADD_TEST_CASE(tcs, step_without_results__fail);730731ATF_ADD_TEST_CASE(tcs, column_count);732733ATF_ADD_TEST_CASE(tcs, column_name__ok);734ATF_ADD_TEST_CASE(tcs, column_name__fail);735736ATF_ADD_TEST_CASE(tcs, column_type__ok);737ATF_ADD_TEST_CASE(tcs, column_type__out_of_range);738739ATF_ADD_TEST_CASE(tcs, column_id__ok);740ATF_ADD_TEST_CASE(tcs, column_id__missing);741742ATF_ADD_TEST_CASE(tcs, column_blob);743ATF_ADD_TEST_CASE(tcs, column_double);744ATF_ADD_TEST_CASE(tcs, column_int__ok);745ATF_ADD_TEST_CASE(tcs, column_int__overflow);746ATF_ADD_TEST_CASE(tcs, column_int64);747ATF_ADD_TEST_CASE(tcs, column_text);748749ATF_ADD_TEST_CASE(tcs, column_bytes__blob);750ATF_ADD_TEST_CASE(tcs, column_bytes__text);751752ATF_ADD_TEST_CASE(tcs, safe_column_blob__ok);753ATF_ADD_TEST_CASE(tcs, safe_column_blob__fail);754ATF_ADD_TEST_CASE(tcs, safe_column_double__ok);755ATF_ADD_TEST_CASE(tcs, safe_column_double__fail);756ATF_ADD_TEST_CASE(tcs, safe_column_int__ok);757ATF_ADD_TEST_CASE(tcs, safe_column_int__fail);758ATF_ADD_TEST_CASE(tcs, safe_column_int64__ok);759ATF_ADD_TEST_CASE(tcs, safe_column_int64__fail);760ATF_ADD_TEST_CASE(tcs, safe_column_text__ok);761ATF_ADD_TEST_CASE(tcs, safe_column_text__fail);762763ATF_ADD_TEST_CASE(tcs, safe_column_bytes__ok__blob);764ATF_ADD_TEST_CASE(tcs, safe_column_bytes__ok__text);765ATF_ADD_TEST_CASE(tcs, safe_column_bytes__fail);766767ATF_ADD_TEST_CASE(tcs, reset);768769ATF_ADD_TEST_CASE(tcs, bind__blob);770ATF_ADD_TEST_CASE(tcs, bind__double);771ATF_ADD_TEST_CASE(tcs, bind__int64);772ATF_ADD_TEST_CASE(tcs, bind__int);773ATF_ADD_TEST_CASE(tcs, bind__null);774ATF_ADD_TEST_CASE(tcs, bind__text);775ATF_ADD_TEST_CASE(tcs, bind__text__transient);776ATF_ADD_TEST_CASE(tcs, bind__by_name);777778ATF_ADD_TEST_CASE(tcs, bind_parameter_count);779ATF_ADD_TEST_CASE(tcs, bind_parameter_index);780ATF_ADD_TEST_CASE(tcs, bind_parameter_name);781782ATF_ADD_TEST_CASE(tcs, clear_bindings);783}784785786