@@ -33,7 +33,7 @@ TEST(Statement, invalid) {
33
33
EXPECT_EQ (SQLITE_OK, db.getExtendedErrorCode ());
34
34
35
35
// Compile a SQL query with no parameter
36
- SQLite::Statement query (db, " SELECT * FROM test" );
36
+ SQLite::Statement query (db, " SELECT * FROM test" );
37
37
EXPECT_STREQ (" SELECT * FROM test" , query.getQuery ().c_str ());
38
38
EXPECT_EQ (2 , query.getColumnCount ());
39
39
EXPECT_FALSE (query.isOk ());
@@ -86,6 +86,108 @@ TEST(Statement, invalid) {
86
86
87
87
// TODO: test every kind of binding + clearBindings()
88
88
89
+ TEST (Statement, executeStep) {
90
+ // Create a new database
91
+ SQLite::Database db (" :memory:" , SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE);
92
+ EXPECT_EQ (SQLITE_OK, db.getErrorCode ());
93
+
94
+ // Create a new table
95
+ EXPECT_EQ (0 , db.exec (" CREATE TABLE test (id INTEGER PRIMARY KEY, msg TEXT, int INTEGER, double REAL)" ));
96
+ EXPECT_EQ (SQLITE_OK, db.getErrorCode ());
97
+
98
+ // Create a first row
99
+ EXPECT_EQ (1 , db.exec (" INSERT INTO test VALUES (NULL, \" first\" , 123, 0.123)" ));
100
+ EXPECT_EQ (1 , db.getLastInsertRowid ());
101
+
102
+ // Compile a SQL query
103
+ SQLite::Statement query (db, " SELECT * FROM test" );
104
+ EXPECT_STREQ (" SELECT * FROM test" , query.getQuery ().c_str ());
105
+ EXPECT_EQ (4 , query.getColumnCount ());
106
+
107
+ // Get the first row
108
+ query.executeStep ();
109
+ EXPECT_TRUE (query.isOk ());
110
+ EXPECT_FALSE (query.isDone ());
111
+ const sqlite3_int64 id = query.getColumn (0 );
112
+ const std::string msg = query.getColumn (1 );
113
+ const int integer = query.getColumn (2 );
114
+ const double real = query.getColumn (3 );
115
+ EXPECT_EQ (1 , id);
116
+ EXPECT_EQ (" first" , msg);
117
+ EXPECT_EQ (123 , integer);
118
+ EXPECT_EQ (0.123 , real);
119
+
120
+ // Step one more time to discover there is nothing more
121
+ query.executeStep ();
122
+ EXPECT_FALSE (query.isOk ());
123
+ EXPECT_TRUE (query.isDone ()); // "done" is "the end"
124
+
125
+ // Step after "the end" throw an exception
126
+ EXPECT_THROW (query.executeStep (), SQLite::Exception);
127
+ }
128
+
129
+ TEST (Statement, isColumnNull) {
130
+ // Create a new database
131
+ SQLite::Database db (" :memory:" , SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE);
132
+ ASSERT_EQ (SQLITE_OK, db.getErrorCode ());
133
+
134
+ // Create a new table
135
+ EXPECT_EQ (0 , db.exec (" CREATE TABLE test (msg TEXT, int INTEGER, double REAL)" ));
136
+ ASSERT_EQ (SQLITE_OK, db.getErrorCode ());
137
+
138
+ // Create a first row with no null values, then other rows with each time a NULL value
139
+ ASSERT_EQ (1 , db.exec (" INSERT INTO test VALUES (\" first\" , 123, 0.123)" ));
140
+ ASSERT_EQ (1 , db.exec (" INSERT INTO test VALUES (NULL, 123, 0.123)" ));
141
+ ASSERT_EQ (1 , db.exec (" INSERT INTO test VALUES (\" first\" , NULL, 0.123)" ));
142
+ ASSERT_EQ (1 , db.exec (" INSERT INTO test VALUES (\" first\" , 123, NULL)" ));
143
+
144
+ // Compile a SQL query
145
+ const std::string select (" SELECT * FROM test" );
146
+ SQLite::Statement query (db, select);
147
+ EXPECT_EQ (select, query.getQuery ());
148
+ EXPECT_EQ (3 , query.getColumnCount ());
149
+
150
+ // Get the first non-null row
151
+ query.executeStep ();
152
+ EXPECT_TRUE (query.isOk ());
153
+ EXPECT_FALSE (query.isDone ());
154
+ EXPECT_THROW (query.isColumnNull (-1 ), SQLite::Exception);
155
+ EXPECT_EQ (false , query.isColumnNull (0 ));
156
+ EXPECT_EQ (false , query.isColumnNull (1 ));
157
+ EXPECT_EQ (false , query.isColumnNull (2 ));
158
+ EXPECT_THROW (query.isColumnNull (3 ), SQLite::Exception);
159
+
160
+ // Get the second row with null text
161
+ query.executeStep ();
162
+ EXPECT_TRUE (query.isOk ());
163
+ EXPECT_FALSE (query.isDone ());
164
+ EXPECT_THROW (query.isColumnNull (-1 ), SQLite::Exception);
165
+ EXPECT_EQ (true , query.isColumnNull (0 ));
166
+ EXPECT_EQ (false , query.isColumnNull (1 ));
167
+ EXPECT_EQ (false , query.isColumnNull (2 ));
168
+ EXPECT_THROW (query.isColumnNull (3 ), SQLite::Exception);
169
+
170
+ // Get the second row with null integer
171
+ query.executeStep ();
172
+ EXPECT_TRUE (query.isOk ());
173
+ EXPECT_FALSE (query.isDone ());
174
+ EXPECT_THROW (query.isColumnNull (-1 ), SQLite::Exception);
175
+ EXPECT_EQ (false , query.isColumnNull (0 ));
176
+ EXPECT_EQ (true , query.isColumnNull (1 ));
177
+ EXPECT_EQ (false , query.isColumnNull (2 ));
178
+ EXPECT_THROW (query.isColumnNull (3 ), SQLite::Exception);
179
+
180
+ // Get the third row with null float
181
+ query.executeStep ();
182
+ EXPECT_TRUE (query.isOk ());
183
+ EXPECT_FALSE (query.isDone ());
184
+ EXPECT_THROW (query.isColumnNull (-1 ), SQLite::Exception);
185
+ EXPECT_EQ (false , query.isColumnNull (0 ));
186
+ EXPECT_EQ (false , query.isColumnNull (1 ));
187
+ EXPECT_EQ (true , query.isColumnNull (2 ));
188
+ EXPECT_THROW (query.isColumnNull (3 ), SQLite::Exception);
189
+ }
190
+
89
191
TEST (Statement, getColumnByName) {
90
192
// Create a new database
91
193
SQLite::Database db (" :memory:" , SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE);
@@ -103,14 +205,14 @@ TEST(Statement, getColumnByName) {
103
205
EXPECT_EQ (1 , db.getTotalChanges ());
104
206
105
207
// Compile a SQL query
106
- SQLite::Statement query (db, " SELECT * FROM test" );
208
+ SQLite::Statement query (db, " SELECT * FROM test" );
107
209
EXPECT_STREQ (" SELECT * FROM test" , query.getQuery ().c_str ());
108
210
EXPECT_EQ (4 , query.getColumnCount ());
109
211
query.executeStep ();
110
212
EXPECT_TRUE (query.isOk ());
111
213
EXPECT_FALSE (query.isDone ());
112
214
113
- // Look for unexisting columns
215
+ // Look for non-existing columns
114
216
EXPECT_THROW (query.getColumn (" unknown" ), SQLite::Exception);
115
217
EXPECT_THROW (query.getColumn (" " ), SQLite::Exception);
116
218
@@ -128,7 +230,7 @@ TEST(Statement, getName) {
128
230
EXPECT_EQ (0 , db.exec (" CREATE TABLE test (id INTEGER PRIMARY KEY, msg TEXT)" ));
129
231
130
232
// Compile a SQL query, using the "id" column name as-is, but aliasing the "msg" column with new name "value"
131
- SQLite::Statement query (db, " SELECT id, msg as value FROM test" );
233
+ SQLite::Statement query (db, " SELECT id, msg as value FROM test" );
132
234
query.executeStep ();
133
235
134
236
const std::string name0 = query.getColumnName (0 );
0 commit comments