1# 2003 January 29 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# This file implements regression tests for SQLite library. The 12# focus of this script testing the callback-free C/C++ API. 13# 14# $Id: capi2.test,v 1.26 2005/03/29 03:11:00 danielk1977 Exp $ 15# 16 17set testdir [file dirname $argv0] 18source $testdir/tester.tcl 19 20# Return the text values from the current row pointed at by STMT as a list. 21proc get_row_values {STMT} { 22 set VALUES [list] 23 for {set i 0} {$i < [sqlite3_data_count $STMT]} {incr i} { 24 lappend VALUES [sqlite3_column_text $STMT $i] 25 } 26 return $VALUES 27} 28 29# Return the column names followed by declaration types for the result set 30# of the SQL statement STMT. 31# 32# i.e. for: 33# CREATE TABLE abc(a text, b integer); 34# SELECT * FROM abc; 35# 36# The result is {a b text integer} 37proc get_column_names {STMT} { 38 set VALUES [list] 39 for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} { 40 lappend VALUES [sqlite3_column_name $STMT $i] 41 } 42 for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} { 43 lappend VALUES [sqlite3_column_decltype $STMT $i] 44 } 45 return $VALUES 46} 47 48# Check basic functionality 49# 50do_test capi2-1.1 { 51 db close 52 set DB [sqlite3 db test.db] 53 execsql {CREATE TABLE t1(a,b,c)} 54 set VM [sqlite3_prepare $DB {SELECT name, rowid FROM sqlite_master} -1 TAIL] 55 set TAIL 56} {} 57do_test capi2-1.2 { 58 sqlite3_step $VM 59} {SQLITE_ROW} 60do_test capi2-1.3 { 61 sqlite3_data_count $VM 62} {2} 63do_test capi2-1.4 { 64 get_row_values $VM 65} {t1 1} 66do_test capi2-1.5 { 67 get_column_names $VM 68} {name rowid text INTEGER} 69do_test capi2-1.6 { 70 sqlite3_step $VM 71} {SQLITE_DONE} 72do_test capi2-1.7 { 73 list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM] 74} {2 {} {name rowid text INTEGER}} 75do_test capi2-1.8 { 76 sqlite3_step $VM 77} {SQLITE_MISUSE} 78 79# Update: In v2, once SQLITE_MISUSE is returned the statement handle cannot 80# be interrogated for more information. However in v3, since the column 81# count, names and types are determined at compile time, these are still 82# accessible after an SQLITE_MISUSE error. 83do_test capi2-1.9 { 84 list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM] 85} {2 {} {name rowid text INTEGER}} 86do_test capi2-1.10 { 87 sqlite3_data_count $VM 88} {0} 89 90do_test capi2-1.11 { 91 sqlite3_finalize $VM 92} {SQLITE_OK} 93 94# Check to make sure that the "tail" of a multi-statement SQL script 95# is returned by sqlite3_prepare. 96# 97do_test capi2-2.1 { 98 set SQL { 99 SELECT name, rowid FROM sqlite_master; 100 SELECT name, rowid FROM sqlite_master WHERE 0; 101 -- A comment at the end 102 } 103 set VM [sqlite3_prepare $DB $SQL -1 SQL] 104 set SQL 105} { 106 SELECT name, rowid FROM sqlite_master WHERE 0; 107 -- A comment at the end 108 } 109do_test capi2-2.2 { 110 set r [sqlite3_step $VM] 111 lappend r [sqlite3_column_count $VM] \ 112 [get_row_values $VM] \ 113 [get_column_names $VM] 114} {SQLITE_ROW 2 {t1 1} {name rowid text INTEGER}} 115do_test capi2-2.3 { 116 set r [sqlite3_step $VM] 117 lappend r [sqlite3_column_count $VM] \ 118 [get_row_values $VM] \ 119 [get_column_names $VM] 120} {SQLITE_DONE 2 {} {name rowid text INTEGER}} 121do_test capi2-2.4 { 122 sqlite3_finalize $VM 123} {SQLITE_OK} 124do_test capi2-2.5 { 125 set VM [sqlite3_prepare $DB $SQL -1 SQL] 126 set SQL 127} { 128 -- A comment at the end 129 } 130do_test capi2-2.6 { 131 set r [sqlite3_step $VM] 132 lappend r [sqlite3_column_count $VM] \ 133 [get_row_values $VM] \ 134 [get_column_names $VM] 135} {SQLITE_DONE 2 {} {name rowid text INTEGER}} 136do_test capi2-2.7 { 137 sqlite3_finalize $VM 138} {SQLITE_OK} 139do_test capi2-2.8 { 140 set VM [sqlite3_prepare $DB $SQL -1 SQL] 141 list $SQL $VM 142} {{} {}} 143 144# Check the error handling. 145# 146do_test capi2-3.1 { 147 set rc [catch { 148 sqlite3_prepare $DB {select bogus from sqlite_master} -1 TAIL 149 } msg] 150 lappend rc $msg $TAIL 151} {1 {(1) no such column: bogus} {}} 152do_test capi2-3.2 { 153 set rc [catch { 154 sqlite3_prepare $DB {select bogus from } -1 TAIL 155 } msg] 156 lappend rc $msg $TAIL 157} {1 {(1) near " ": syntax error} {}} 158do_test capi2-3.3 { 159 set rc [catch { 160 sqlite3_prepare $DB {;;;;select bogus from sqlite_master} -1 TAIL 161 } msg] 162 lappend rc $msg $TAIL 163} {1 {(1) no such column: bogus} {}} 164do_test capi2-3.4 { 165 set rc [catch { 166 sqlite3_prepare $DB {select bogus from sqlite_master;x;} -1 TAIL 167 } msg] 168 lappend rc $msg $TAIL 169} {1 {(1) no such column: bogus} {x;}} 170do_test capi2-3.5 { 171 set rc [catch { 172 sqlite3_prepare $DB {select bogus from sqlite_master;;;x;} -1 TAIL 173 } msg] 174 lappend rc $msg $TAIL 175} {1 {(1) no such column: bogus} {;;x;}} 176do_test capi2-3.6 { 177 set rc [catch { 178 sqlite3_prepare $DB {select 5/0} -1 TAIL 179 } VM] 180 lappend rc $TAIL 181} {0 {}} 182do_test capi2-3.7 { 183 list [sqlite3_step $VM] \ 184 [sqlite3_column_count $VM] \ 185 [get_row_values $VM] \ 186 [get_column_names $VM] 187} {SQLITE_ROW 1 {{}} {5/0 {}}} 188do_test capi2-3.8 { 189 sqlite3_finalize $VM 190} {SQLITE_OK} 191do_test capi2-3.9 { 192 execsql {CREATE UNIQUE INDEX i1 ON t1(a)} 193 set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,2,3)} -1 TAIL] 194 set TAIL 195} {} 196do_test capi2-3.9b {db changes} {0} 197do_test capi2-3.10 { 198 list [sqlite3_step $VM] \ 199 [sqlite3_column_count $VM] \ 200 [get_row_values $VM] \ 201 [get_column_names $VM] 202} {SQLITE_DONE 0 {} {}} 203 204# Update for v3 - the change has not actually happened until the query is 205# finalized. Is this going to cause trouble for anyone? Lee Nelson maybe? 206# (Later:) The change now happens just before SQLITE_DONE is returned. 207do_test capi2-3.10b {db changes} {1} 208do_test capi2-3.11 { 209 sqlite3_finalize $VM 210} {SQLITE_OK} 211do_test capi2-3.11b {db changes} {1} 212do_test capi2-3.12 { 213 sqlite3_finalize $VM 214} {SQLITE_MISUSE} 215do_test capi2-3.13 { 216 set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,3,4)} -1 TAIL] 217 list [sqlite3_step $VM] \ 218 [sqlite3_column_count $VM] \ 219 [get_row_values $VM] \ 220 [get_column_names $VM] 221} {SQLITE_ERROR 0 {} {}} 222 223# Update for v3: Preparing a statement does not affect the change counter. 224# (Test result changes from 0 to 1). (Later:) change counter updates occur 225# when sqlite3_step returns, not at finalize time. 226do_test capi2-3.13b {db changes} {0} 227 228do_test capi2-3.14 { 229 list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] 230} {SQLITE_CONSTRAINT {column a is not unique}} 231do_test capi2-3.15 { 232 set VM [sqlite3_prepare $DB {CREATE TABLE t2(a NOT NULL, b)} -1 TAIL] 233 set TAIL 234} {} 235do_test capi2-3.16 { 236 list [sqlite3_step $VM] \ 237 [sqlite3_column_count $VM] \ 238 [get_row_values $VM] \ 239 [get_column_names $VM] 240} {SQLITE_DONE 0 {} {}} 241do_test capi2-3.17 { 242 list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] 243} {SQLITE_OK {not an error}} 244do_test capi2-3.18 { 245 set VM [sqlite3_prepare $DB {INSERT INTO t2 VALUES(NULL,2)} -1 TAIL] 246 list [sqlite3_step $VM] \ 247 [sqlite3_column_count $VM] \ 248 [get_row_values $VM] \ 249 [get_column_names $VM] 250} {SQLITE_ERROR 0 {} {}} 251do_test capi2-3.19 { 252 list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] 253} {SQLITE_CONSTRAINT {t2.a may not be NULL}} 254 255do_test capi2-3.20 { 256 execsql { 257 CREATE TABLE a1(message_id, name , UNIQUE(message_id, name) ); 258 INSERT INTO a1 VALUES(1, 1); 259 } 260} {} 261do_test capi2-3.21 { 262 set VM [sqlite3_prepare $DB {INSERT INTO a1 VALUES(1, 1)} -1 TAIL] 263 sqlite3_step $VM 264} {SQLITE_ERROR} 265do_test capi2-3.22 { 266 sqlite3_errcode $DB 267} {SQLITE_ERROR} 268do_test capi2-3.23 { 269 sqlite3_finalize $VM 270} {SQLITE_CONSTRAINT} 271do_test capi2-3.24 { 272 sqlite3_errcode $DB 273} {SQLITE_CONSTRAINT} 274 275# Two or more virtual machines exists at the same time. 276# 277do_test capi2-4.1 { 278 set VM1 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(1,2)} -1 TAIL] 279 set TAIL 280} {} 281do_test capi2-4.2 { 282 set VM2 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL] 283 set TAIL 284} {} 285do_test capi2-4.3 { 286 set VM3 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(3,4)} -1 TAIL] 287 set TAIL 288} {} 289do_test capi2-4.4 { 290 list [sqlite3_step $VM2] \ 291 [sqlite3_column_count $VM2] \ 292 [get_row_values $VM2] \ 293 [get_column_names $VM2] 294} {SQLITE_DONE 0 {} {}} 295do_test capi2-4.5 { 296 execsql {SELECT * FROM t2 ORDER BY a} 297} {2 3} 298do_test capi2-4.6 { 299 sqlite3_finalize $VM2 300} {SQLITE_OK} 301do_test capi2-4.7 { 302 list [sqlite3_step $VM3] \ 303 [sqlite3_column_count $VM3] \ 304 [get_row_values $VM3] \ 305 [get_column_names $VM3] 306} {SQLITE_DONE 0 {} {}} 307do_test capi2-4.8 { 308 execsql {SELECT * FROM t2 ORDER BY a} 309} {2 3 3 4} 310do_test capi2-4.9 { 311 sqlite3_finalize $VM3 312} {SQLITE_OK} 313do_test capi2-4.10 { 314 list [sqlite3_step $VM1] \ 315 [sqlite3_column_count $VM1] \ 316 [get_row_values $VM1] \ 317 [get_column_names $VM1] 318} {SQLITE_DONE 0 {} {}} 319do_test capi2-4.11 { 320 execsql {SELECT * FROM t2 ORDER BY a} 321} {1 2 2 3 3 4} 322do_test capi2-4.12 { 323 sqlite3_finalize $VM1 324} {SQLITE_OK} 325 326# Interleaved SELECTs 327# 328do_test capi2-5.1 { 329 set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] 330 set VM2 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] 331 set VM3 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] 332 list [sqlite3_step $VM1] \ 333 [sqlite3_column_count $VM1] \ 334 [get_row_values $VM1] \ 335 [get_column_names $VM1] 336} {SQLITE_ROW 2 {2 3} {a b {} {}}} 337do_test capi2-5.2 { 338 list [sqlite3_step $VM2] \ 339 [sqlite3_column_count $VM2] \ 340 [get_row_values $VM2] \ 341 [get_column_names $VM2] 342} {SQLITE_ROW 2 {2 3} {a b {} {}}} 343do_test capi2-5.3 { 344 list [sqlite3_step $VM1] \ 345 [sqlite3_column_count $VM1] \ 346 [get_row_values $VM1] \ 347 [get_column_names $VM1] 348} {SQLITE_ROW 2 {3 4} {a b {} {}}} 349do_test capi2-5.4 { 350 list [sqlite3_step $VM3] \ 351 [sqlite3_column_count $VM3] \ 352 [get_row_values $VM3] \ 353 [get_column_names $VM3] 354} {SQLITE_ROW 2 {2 3} {a b {} {}}} 355do_test capi2-5.5 { 356 list [sqlite3_step $VM3] \ 357 [sqlite3_column_count $VM3] \ 358 [get_row_values $VM3] \ 359 [get_column_names $VM3] 360} {SQLITE_ROW 2 {3 4} {a b {} {}}} 361do_test capi2-5.6 { 362 list [sqlite3_step $VM3] \ 363 [sqlite3_column_count $VM3] \ 364 [get_row_values $VM3] \ 365 [get_column_names $VM3] 366} {SQLITE_ROW 2 {1 2} {a b {} {}}} 367do_test capi2-5.7 { 368 list [sqlite3_step $VM3] \ 369 [sqlite3_column_count $VM3] \ 370 [get_row_values $VM3] \ 371 [get_column_names $VM3] 372} {SQLITE_DONE 2 {} {a b {} {}}} 373do_test capi2-5.8 { 374 sqlite3_finalize $VM3 375} {SQLITE_OK} 376do_test capi2-5.9 { 377 list [sqlite3_step $VM1] \ 378 [sqlite3_column_count $VM1] \ 379 [get_row_values $VM1] \ 380 [get_column_names $VM1] 381} {SQLITE_ROW 2 {1 2} {a b {} {}}} 382do_test capi2-5.10 { 383 sqlite3_finalize $VM1 384} {SQLITE_OK} 385do_test capi2-5.11 { 386 list [sqlite3_step $VM2] \ 387 [sqlite3_column_count $VM2] \ 388 [get_row_values $VM2] \ 389 [get_column_names $VM2] 390} {SQLITE_ROW 2 {3 4} {a b {} {}}} 391do_test capi2-5.12 { 392 list [sqlite3_step $VM2] \ 393 [sqlite3_column_count $VM2] \ 394 [get_row_values $VM2] \ 395 [get_column_names $VM2] 396} {SQLITE_ROW 2 {1 2} {a b {} {}}} 397do_test capi2-5.11 { 398 sqlite3_finalize $VM2 399} {SQLITE_OK} 400 401# Check for proper SQLITE_BUSY returns. 402# 403do_test capi2-6.1 { 404 execsql { 405 BEGIN; 406 CREATE TABLE t3(x counter); 407 INSERT INTO t3 VALUES(1); 408 INSERT INTO t3 VALUES(2); 409 INSERT INTO t3 SELECT x+2 FROM t3; 410 INSERT INTO t3 SELECT x+4 FROM t3; 411 INSERT INTO t3 SELECT x+8 FROM t3; 412 COMMIT; 413 } 414 set VM1 [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL] 415 sqlite3 db2 test.db 416 execsql {BEGIN} db2 417} {} 418# Update for v3: BEGIN doesn't write-lock the database. It is quite 419# difficult to get v3 to write-lock the database, which causes a few 420# problems for test scripts. 421# 422# do_test capi2-6.2 { 423# list [sqlite3_step $VM1] \ 424# [sqlite3_column_count $VM1] \ 425# [get_row_values $VM1] \ 426# [get_column_names $VM1] 427# } {SQLITE_BUSY 0 {} {}} 428do_test capi2-6.3 { 429 execsql {COMMIT} db2 430} {} 431do_test capi2-6.4 { 432 list [sqlite3_step $VM1] \ 433 [sqlite3_column_count $VM1] \ 434 [get_row_values $VM1] \ 435 [get_column_names $VM1] 436} {SQLITE_ROW 1 1 {x counter}} 437do_test capi2-6.5 { 438 catchsql {INSERT INTO t3 VALUES(10);} db2 439} {1 {database is locked}} 440do_test capi2-6.6 { 441 list [sqlite3_step $VM1] \ 442 [sqlite3_column_count $VM1] \ 443 [get_row_values $VM1] \ 444 [get_column_names $VM1] 445} {SQLITE_ROW 1 2 {x counter}} 446do_test capi2-6.7 { 447 execsql {SELECT * FROM t2} db2 448} {2 3 3 4 1 2} 449do_test capi2-6.8 { 450 list [sqlite3_step $VM1] \ 451 [sqlite3_column_count $VM1] \ 452 [get_row_values $VM1] \ 453 [get_column_names $VM1] 454} {SQLITE_ROW 1 3 {x counter}} 455do_test capi2-6.9 { 456 execsql {SELECT * FROM t2} 457} {2 3 3 4 1 2} 458do_test capi2-6.10 { 459 list [sqlite3_step $VM1] \ 460 [sqlite3_column_count $VM1] \ 461 [get_row_values $VM1] \ 462 [get_column_names $VM1] 463} {SQLITE_ROW 1 4 {x counter}} 464do_test capi2-6.11 { 465 execsql {BEGIN} 466} {} 467do_test capi2-6.12 { 468 list [sqlite3_step $VM1] \ 469 [sqlite3_column_count $VM1] \ 470 [get_row_values $VM1] \ 471 [get_column_names $VM1] 472} {SQLITE_ROW 1 5 {x counter}} 473 474do_test capi2-6.13 { 475 catchsql {UPDATE t3 SET x=x+1} 476} {1 {database table is locked}} 477do_test capi2-6.14 { 478 list [sqlite3_step $VM1] \ 479 [sqlite3_column_count $VM1] \ 480 [get_row_values $VM1] \ 481 [get_column_names $VM1] 482} {SQLITE_ROW 1 6 {x counter}} 483do_test capi2-6.15 { 484 execsql {SELECT * FROM t1} 485} {1 2 3} 486do_test capi2-6.16 { 487 list [sqlite3_step $VM1] \ 488 [sqlite3_column_count $VM1] \ 489 [get_row_values $VM1] \ 490 [get_column_names $VM1] 491} {SQLITE_ROW 1 7 {x counter}} 492do_test capi2-6.17 { 493 catchsql {UPDATE t1 SET b=b+1} 494} {0 {}} 495do_test capi2-6.18 { 496 list [sqlite3_step $VM1] \ 497 [sqlite3_column_count $VM1] \ 498 [get_row_values $VM1] \ 499 [get_column_names $VM1] 500} {SQLITE_ROW 1 8 {x counter}} 501do_test capi2-6.19 { 502 execsql {SELECT * FROM t1} 503} {1 3 3} 504do_test capi2-6.20 { 505 list [sqlite3_step $VM1] \ 506 [sqlite3_column_count $VM1] \ 507 [get_row_values $VM1] \ 508 [get_column_names $VM1] 509} {SQLITE_ROW 1 9 {x counter}} 510#do_test capi2-6.21 { 511# execsql {ROLLBACK; SELECT * FROM t1} 512#} {1 2 3} 513do_test capi2-6.22 { 514 list [sqlite3_step $VM1] \ 515 [sqlite3_column_count $VM1] \ 516 [get_row_values $VM1] \ 517 [get_column_names $VM1] 518} {SQLITE_ROW 1 10 {x counter}} 519#do_test capi2-6.23 { 520# execsql {BEGIN TRANSACTION;} 521#} {} 522do_test capi2-6.24 { 523 list [sqlite3_step $VM1] \ 524 [sqlite3_column_count $VM1] \ 525 [get_row_values $VM1] \ 526 [get_column_names $VM1] 527} {SQLITE_ROW 1 11 {x counter}} 528do_test capi2-6.25 { 529 execsql { 530 INSERT INTO t1 VALUES(2,3,4); 531 SELECT * FROM t1; 532 } 533} {1 3 3 2 3 4} 534do_test capi2-6.26 { 535 list [sqlite3_step $VM1] \ 536 [sqlite3_column_count $VM1] \ 537 [get_row_values $VM1] \ 538 [get_column_names $VM1] 539} {SQLITE_ROW 1 12 {x counter}} 540do_test capi2-6.27 { 541 catchsql { 542 INSERT INTO t1 VALUES(2,4,5); 543 SELECT * FROM t1; 544 } 545} {1 {column a is not unique}} 546do_test capi2-6.28 { 547 list [sqlite3_step $VM1] \ 548 [sqlite3_column_count $VM1] \ 549 [get_row_values $VM1] \ 550 [get_column_names $VM1] 551} {SQLITE_ROW 1 13 {x counter}} 552do_test capi2-6.99 { 553 sqlite3_finalize $VM1 554} {SQLITE_OK} 555catchsql {ROLLBACK} 556 557do_test capi2-7.1 { 558 stepsql $DB { 559 SELECT * FROM t1 560 } 561} {0 1 2 3} 562do_test capi2-7.2 { 563 stepsql $DB { 564 PRAGMA count_changes=on 565 } 566} {0} 567do_test capi2-7.3 { 568 stepsql $DB { 569 UPDATE t1 SET a=a+10; 570 } 571} {0 1} 572do_test capi2-7.4 { 573 stepsql $DB { 574 INSERT INTO t1 SELECT a+1,b+1,c+1 FROM t1; 575 } 576} {0 1} 577do_test capi2-7.4b {sqlite3_changes $DB} {1} 578do_test capi2-7.5 { 579 stepsql $DB { 580 UPDATE t1 SET a=a+10; 581 } 582} {0 2} 583do_test capi2-7.5b {sqlite3_changes $DB} {2} 584do_test capi2-7.6 { 585 stepsql $DB { 586 SELECT * FROM t1; 587 } 588} {0 21 2 3 22 3 4} 589do_test capi2-7.7 { 590 stepsql $DB { 591 INSERT INTO t1 SELECT a+2,b+2,c+2 FROM t1; 592 } 593} {0 2} 594do_test capi2-7.8 { 595 sqlite3_changes $DB 596} {2} 597do_test capi2-7.9 { 598 stepsql $DB { 599 SELECT * FROM t1; 600 } 601} {0 21 2 3 22 3 4 23 4 5 24 5 6} 602do_test capi2-7.10 { 603 stepsql $DB { 604 UPDATE t1 SET a=a-20; 605 SELECT * FROM t1; 606 } 607} {0 4 1 2 3 2 3 4 3 4 5 4 5 6} 608 609# Update for version 3: A SELECT statement no longer resets the change 610# counter (Test result changes from 0 to 4). 611do_test capi2-7.11 { 612 sqlite3_changes $DB 613} {4} 614do_test capi2-7.11a { 615 execsql {SELECT count(*) FROM t1} 616} {4} 617 618ifcapable {explain} { 619 do_test capi2-7.12 { 620btree_breakpoint 621 set x [stepsql $DB {EXPLAIN SELECT * FROM t1}] 622 lindex $x 0 623 } {0} 624} 625 626# Ticket #261 - make sure we can finalize before the end of a query. 627# 628do_test capi2-8.1 { 629 set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] 630 sqlite3_finalize $VM1 631} {SQLITE_OK} 632 633# Tickets #384 and #385 - make sure the TAIL argument to sqlite3_prepare 634# and all of the return pointers in sqlite_step can be null. 635# 636do_test capi2-9.1 { 637 set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 DUMMY] 638 sqlite3_step $VM1 639 sqlite3_finalize $VM1 640} {SQLITE_OK} 641 642do_test capi2-10.1 { 643 sqlite3_finalize 0 644} {SQLITE_OK} 645do_test capi2-10.2 { 646 sqlite3_reset 0 647} {SQLITE_OK} 648 649db2 close 650 651finish_test 652