Annotation of embedaddon/sqlite3/test/bind.test, revision 1.1
1.1 ! misho 1: # 2003 September 6
! 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 sqlite_bind API.
! 13: #
! 14: # $Id: bind.test,v 1.48 2009/07/22 07:27:57 danielk1977 Exp $
! 15: #
! 16:
! 17: set testdir [file dirname $argv0]
! 18: source $testdir/tester.tcl
! 19:
! 20: proc sqlite_step {stmt N VALS COLS} {
! 21: upvar VALS vals
! 22: upvar COLS cols
! 23: set vals [list]
! 24: set cols [list]
! 25:
! 26: set rc [sqlite3_step $stmt]
! 27: for {set i 0} {$i < [sqlite3_column_count $stmt]} {incr i} {
! 28: lappend cols [sqlite3_column_name $stmt $i]
! 29: }
! 30: for {set i 0} {$i < [sqlite3_data_count $stmt]} {incr i} {
! 31: lappend vals [sqlite3_column_text $stmt $i]
! 32: }
! 33:
! 34: return $rc
! 35: }
! 36:
! 37: do_test bind-1.1 {
! 38: set DB [sqlite3_connection_pointer db]
! 39: execsql {CREATE TABLE t1(a,b,c);}
! 40: set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(:1,?,:abc)} -1 TAIL]
! 41: set TAIL
! 42: } {}
! 43: do_test bind-1.1.1 {
! 44: sqlite3_bind_parameter_count $VM
! 45: } 3
! 46: do_test bind-1.1.2 {
! 47: sqlite3_bind_parameter_name $VM 1
! 48: } {:1}
! 49: do_test bind-1.1.3 {
! 50: sqlite3_bind_parameter_name $VM 2
! 51: } {}
! 52: do_test bind-1.1.4 {
! 53: sqlite3_bind_parameter_name $VM 3
! 54: } {:abc}
! 55: do_test bind-1.2 {
! 56: sqlite_step $VM N VALUES COLNAMES
! 57: } {SQLITE_DONE}
! 58: do_test bind-1.3 {
! 59: execsql {SELECT rowid, * FROM t1}
! 60: } {1 {} {} {}}
! 61: do_test bind-1.4 {
! 62: sqlite3_reset $VM
! 63: sqlite_bind $VM 1 {test value 1} normal
! 64: sqlite_step $VM N VALUES COLNAMES
! 65: } SQLITE_DONE
! 66: do_test bind-1.5 {
! 67: execsql {SELECT rowid, * FROM t1}
! 68: } {1 {} {} {} 2 {test value 1} {} {}}
! 69: do_test bind-1.6 {
! 70: sqlite3_reset $VM
! 71: sqlite_bind $VM 3 {'test value 2'} normal
! 72: sqlite_step $VM N VALUES COLNAMES
! 73: } SQLITE_DONE
! 74: do_test bind-1.7 {
! 75: execsql {SELECT rowid, * FROM t1}
! 76: } {1 {} {} {} 2 {test value 1} {} {} 3 {test value 1} {} {'test value 2'}}
! 77: do_test bind-1.8 {
! 78: sqlite3_reset $VM
! 79: set sqlite_static_bind_value 123
! 80: sqlite_bind $VM 1 {} static
! 81: sqlite_bind $VM 2 {abcdefg} normal
! 82: sqlite_bind $VM 3 {} null
! 83: execsql {DELETE FROM t1}
! 84: sqlite_step $VM N VALUES COLNAMES
! 85: execsql {SELECT rowid, * FROM t1}
! 86: } {1 123 abcdefg {}}
! 87: do_test bind-1.9 {
! 88: sqlite3_reset $VM
! 89: sqlite_bind $VM 1 {456} normal
! 90: sqlite_step $VM N VALUES COLNAMES
! 91: execsql {SELECT rowid, * FROM t1}
! 92: } {1 123 abcdefg {} 2 456 abcdefg {}}
! 93:
! 94: do_test bind-1.10 {
! 95: set rc [catch {
! 96: sqlite3_prepare db {INSERT INTO t1 VALUES($abc:123,?,:abc)} -1 TAIL
! 97: } msg]
! 98: lappend rc $msg
! 99: } {1 {(1) near ":123": syntax error}}
! 100: do_test bind-1.11 {
! 101: set rc [catch {
! 102: sqlite3_prepare db {INSERT INTO t1 VALUES(@abc:xyz,?,:abc)} -1 TAIL
! 103: } msg]
! 104: lappend rc $msg
! 105: } {1 {(1) near ":xyz": syntax error}}
! 106:
! 107: do_test bind-1.99 {
! 108: sqlite3_finalize $VM
! 109: } SQLITE_OK
! 110:
! 111: # Prepare the statement in different ways depending on whether or not
! 112: # the $var processing is compiled into the library.
! 113: #
! 114: ifcapable {tclvar} {
! 115: do_test bind-2.1 {
! 116: execsql {
! 117: DELETE FROM t1;
! 118: }
! 119: set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES($one,$::two,$x(-z-))}\
! 120: -1 TX]
! 121: set TX
! 122: } {}
! 123: set v1 {$one}
! 124: set v2 {$::two}
! 125: set v3 {$x(-z-)}
! 126: }
! 127: ifcapable {!tclvar} {
! 128: do_test bind-2.1 {
! 129: execsql {
! 130: DELETE FROM t1;
! 131: }
! 132: set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(:one,:two,:_)} -1 TX]
! 133: set TX
! 134: } {}
! 135: set v1 {:one}
! 136: set v2 {:two}
! 137: set v3 {:_}
! 138: }
! 139:
! 140: do_test bind-2.1.1 {
! 141: sqlite3_bind_parameter_count $VM
! 142: } 3
! 143: do_test bind-2.1.2 {
! 144: sqlite3_bind_parameter_name $VM 1
! 145: } $v1
! 146: do_test bind-2.1.3 {
! 147: sqlite3_bind_parameter_name $VM 2
! 148: } $v2
! 149: do_test bind-2.1.4 {
! 150: sqlite3_bind_parameter_name $VM 3
! 151: } $v3
! 152: do_test bind-2.1.5 {
! 153: sqlite3_bind_parameter_index $VM $v1
! 154: } 1
! 155: do_test bind-2.1.6 {
! 156: sqlite3_bind_parameter_index $VM $v2
! 157: } 2
! 158: do_test bind-2.1.7 {
! 159: sqlite3_bind_parameter_index $VM $v3
! 160: } 3
! 161: do_test bind-2.1.8 {
! 162: sqlite3_bind_parameter_index $VM {:hi}
! 163: } 0
! 164:
! 165: # 32 bit Integers
! 166: do_test bind-2.2 {
! 167: sqlite3_bind_int $VM 1 123
! 168: sqlite3_bind_int $VM 2 456
! 169: sqlite3_bind_int $VM 3 789
! 170: sqlite_step $VM N VALUES COLNAMES
! 171: sqlite3_reset $VM
! 172: execsql {SELECT rowid, * FROM t1}
! 173: } {1 123 456 789}
! 174: do_test bind-2.3 {
! 175: sqlite3_bind_int $VM 2 -2000000000
! 176: sqlite3_bind_int $VM 3 2000000000
! 177: sqlite_step $VM N VALUES COLNAMES
! 178: sqlite3_reset $VM
! 179: execsql {SELECT rowid, * FROM t1}
! 180: } {1 123 456 789 2 123 -2000000000 2000000000}
! 181: do_test bind-2.4 {
! 182: execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
! 183: } {integer integer integer integer integer integer}
! 184: do_test bind-2.5 {
! 185: execsql {
! 186: DELETE FROM t1;
! 187: }
! 188: } {}
! 189:
! 190: # 64 bit Integers
! 191: do_test bind-3.1 {
! 192: sqlite3_bind_int64 $VM 1 32
! 193: sqlite3_bind_int64 $VM 2 -2000000000000
! 194: sqlite3_bind_int64 $VM 3 2000000000000
! 195: sqlite_step $VM N VALUES COLNAMES
! 196: sqlite3_reset $VM
! 197: execsql {SELECT rowid, * FROM t1}
! 198: } {1 32 -2000000000000 2000000000000}
! 199: do_test bind-3.2 {
! 200: execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
! 201: } {integer integer integer}
! 202: do_test bind-3.3 {
! 203: execsql {
! 204: DELETE FROM t1;
! 205: }
! 206: } {}
! 207:
! 208: # Doubles
! 209: do_test bind-4.1 {
! 210: sqlite3_bind_double $VM 1 1234.1234
! 211: sqlite3_bind_double $VM 2 0.00001
! 212: sqlite3_bind_double $VM 3 123456789
! 213: sqlite_step $VM N VALUES COLNAMES
! 214: sqlite3_reset $VM
! 215: set x [execsql {SELECT rowid, * FROM t1}]
! 216: regsub {1e-005} $x {1e-05} y
! 217: set y
! 218: } {1 1234.1234 1e-05 123456789.0}
! 219: do_test bind-4.2 {
! 220: execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
! 221: } {real real real}
! 222: do_test bind-4.3 {
! 223: execsql {
! 224: DELETE FROM t1;
! 225: }
! 226: } {}
! 227: do_test bind-4.4 {
! 228: sqlite3_bind_double $VM 1 NaN
! 229: sqlite3_bind_double $VM 2 1e300
! 230: sqlite3_bind_double $VM 3 -1e-300
! 231: sqlite_step $VM N VALUES COLNAMES
! 232: sqlite3_reset $VM
! 233: set x [execsql {SELECT rowid, * FROM t1}]
! 234: regsub {1e-005} $x {1e-05} y
! 235: set y
! 236: } {1 {} 1e+300 -1e-300}
! 237: do_test bind-4.5 {
! 238: execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
! 239: } {null real real}
! 240: do_test bind-4.6 {
! 241: execsql {
! 242: DELETE FROM t1;
! 243: }
! 244: } {}
! 245:
! 246: # NULL
! 247: do_test bind-5.1 {
! 248: sqlite3_bind_null $VM 1
! 249: sqlite3_bind_null $VM 2
! 250: sqlite3_bind_null $VM 3
! 251: sqlite_step $VM N VALUES COLNAMES
! 252: sqlite3_reset $VM
! 253: execsql {SELECT rowid, * FROM t1}
! 254: } {1 {} {} {}}
! 255: do_test bind-5.2 {
! 256: execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
! 257: } {null null null}
! 258: do_test bind-5.3 {
! 259: execsql {
! 260: DELETE FROM t1;
! 261: }
! 262: } {}
! 263:
! 264: # UTF-8 text
! 265: do_test bind-6.1 {
! 266: sqlite3_bind_text $VM 1 hellothere 5
! 267: sqlite3_bind_text $VM 2 ".." 1
! 268: sqlite3_bind_text $VM 3 world\000 -1
! 269: sqlite_step $VM N VALUES COLNAMES
! 270: sqlite3_reset $VM
! 271: execsql {SELECT rowid, * FROM t1}
! 272: } {1 hello . world}
! 273: do_test bind-6.2 {
! 274: execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
! 275: } {text text text}
! 276: do_test bind-6.3 {
! 277: execsql {
! 278: DELETE FROM t1;
! 279: }
! 280: } {}
! 281:
! 282: # Make sure zeros in a string work.
! 283: #
! 284: do_test bind-6.4 {
! 285: db eval {DELETE FROM t1}
! 286: sqlite3_bind_text $VM 1 hello\000there\000 12
! 287: sqlite3_bind_text $VM 2 hello\000there\000 11
! 288: sqlite3_bind_text $VM 3 hello\000there\000 -1
! 289: sqlite_step $VM N VALUES COLNAMES
! 290: sqlite3_reset $VM
! 291: execsql {SELECT * FROM t1}
! 292: } {hello hello hello}
! 293: set enc [db eval {PRAGMA encoding}]
! 294: if {$enc=="UTF-8" || $enc==""} {
! 295: do_test bind-6.5 {
! 296: execsql {SELECT hex(a), hex(b), hex(c) FROM t1}
! 297: } {68656C6C6F00746865726500 68656C6C6F007468657265 68656C6C6F}
! 298: } elseif {$enc=="UTF-16le"} {
! 299: do_test bind-6.5 {
! 300: execsql {SELECT hex(a), hex(b), hex(c) FROM t1}
! 301: } {680065006C006C006F000000740068006500720065000000 680065006C006C006F00000074006800650072006500 680065006C006C006F00}
! 302: } elseif {$enc=="UTF-16be"} {
! 303: do_test bind-6.5 {
! 304: execsql {SELECT hex(a), hex(b), hex(c) FROM t1}
! 305: } {00680065006C006C006F0000007400680065007200650000 00680065006C006C006F000000740068006500720065 00680065006C006C006F}
! 306: } else {
! 307: do_test bind-6.5 {
! 308: set "Unknown database encoding: $::enc"
! 309: } {}
! 310: }
! 311: do_test bind-6.6 {
! 312: execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
! 313: } {text text text}
! 314: do_test bind-6.7 {
! 315: execsql {
! 316: DELETE FROM t1;
! 317: }
! 318: } {}
! 319:
! 320: # UTF-16 text
! 321: ifcapable {utf16} {
! 322: do_test bind-7.1 {
! 323: sqlite3_bind_text16 $VM 1 [encoding convertto unicode hellothere] 10
! 324: sqlite3_bind_text16 $VM 2 [encoding convertto unicode ""] 0
! 325: sqlite3_bind_text16 $VM 3 [encoding convertto unicode world] 10
! 326: sqlite_step $VM N VALUES COLNAMES
! 327: sqlite3_reset $VM
! 328: execsql {SELECT rowid, * FROM t1}
! 329: } {1 hello {} world}
! 330: do_test bind-7.2 {
! 331: execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
! 332: } {text text text}
! 333: do_test bind-7.3 {
! 334: db eval {DELETE FROM t1}
! 335: sqlite3_bind_text16 $VM 1 [encoding convertto unicode hi\000yall\000] 16
! 336: sqlite3_bind_text16 $VM 2 [encoding convertto unicode hi\000yall\000] 14
! 337: sqlite3_bind_text16 $VM 3 [encoding convertto unicode hi\000yall\000] -1
! 338: sqlite_step $VM N VALUES COLNAMES
! 339: sqlite3_reset $VM
! 340: execsql {SELECT * FROM t1}
! 341: } {hi hi hi}
! 342: if {$enc=="UTF-8"} {
! 343: do_test bind-7.4 {
! 344: execsql {SELECT hex(a), hex(b), hex(c) FROM t1}
! 345: } {68690079616C6C00 68690079616C6C 6869}
! 346: } elseif {$enc=="UTF-16le"} {
! 347: do_test bind-7.4 {
! 348: execsql {SELECT hex(a), hex(b), hex(c) FROM t1}
! 349: } {680069000000790061006C006C000000 680069000000790061006C006C00 68006900}
! 350: } elseif {$enc=="UTF-16be"} {
! 351: do_test bind-7.4 {
! 352: execsql {SELECT hex(a), hex(b), hex(c) FROM t1}
! 353: } {00680069000000790061006C006C0000 00680069000000790061006C006C 00680069}
! 354: }
! 355: do_test bind-7.5 {
! 356: execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
! 357: } {text text text}
! 358: }
! 359: do_test bind-7.99 {
! 360: execsql {DELETE FROM t1;}
! 361: } {}
! 362:
! 363: # Test that the 'out of range' error works.
! 364: do_test bind-8.1 {
! 365: catch { sqlite3_bind_null $VM 0 }
! 366: } {1}
! 367: do_test bind-8.2 {
! 368: sqlite3_errmsg $DB
! 369: } {bind or column index out of range}
! 370: ifcapable {utf16} {
! 371: do_test bind-8.3 {
! 372: encoding convertfrom unicode [sqlite3_errmsg16 $DB]
! 373: } {bind or column index out of range}
! 374: }
! 375: do_test bind-8.4 {
! 376: sqlite3_bind_null $VM 1
! 377: sqlite3_errmsg $DB
! 378: } {not an error}
! 379: do_test bind-8.5 {
! 380: catch { sqlite3_bind_null $VM 4 }
! 381: } {1}
! 382: do_test bind-8.6 {
! 383: sqlite3_errmsg $DB
! 384: } {bind or column index out of range}
! 385: ifcapable {utf16} {
! 386: do_test bind-8.7 {
! 387: encoding convertfrom unicode [sqlite3_errmsg16 $DB]
! 388: } {bind or column index out of range}
! 389: }
! 390:
! 391: do_test bind-8.8 {
! 392: catch { sqlite3_bind_blob $VM 0 "abc" 3 }
! 393: } {1}
! 394: do_test bind-8.9 {
! 395: catch { sqlite3_bind_blob $VM 4 "abc" 3 }
! 396: } {1}
! 397: do_test bind-8.10 {
! 398: catch { sqlite3_bind_text $VM 0 "abc" 3 }
! 399: } {1}
! 400: ifcapable {utf16} {
! 401: do_test bind-8.11 {
! 402: catch { sqlite3_bind_text16 $VM 4 "abc" 2 }
! 403: } {1}
! 404: }
! 405: do_test bind-8.12 {
! 406: catch { sqlite3_bind_int $VM 0 5 }
! 407: } {1}
! 408: do_test bind-8.13 {
! 409: catch { sqlite3_bind_int $VM 4 5 }
! 410: } {1}
! 411: do_test bind-8.14 {
! 412: catch { sqlite3_bind_double $VM 0 5.0 }
! 413: } {1}
! 414: do_test bind-8.15 {
! 415: catch { sqlite3_bind_double $VM 4 6.0 }
! 416: } {1}
! 417:
! 418: do_test bind-8.99 {
! 419: sqlite3_finalize $VM
! 420: } SQLITE_OK
! 421:
! 422: set iMaxVar $SQLITE_MAX_VARIABLE_NUMBER
! 423: set zError "(1) variable number must be between ?1 and ?$iMaxVar"
! 424: do_test bind-9.1 {
! 425: execsql {
! 426: CREATE TABLE t2(a,b,c,d,e,f);
! 427: }
! 428: set rc [catch {
! 429: sqlite3_prepare $DB {
! 430: INSERT INTO t2(a) VALUES(?0)
! 431: } -1 TAIL
! 432: } msg]
! 433: lappend rc $msg
! 434: } [list 1 $zError]
! 435: do_test bind-9.2 {
! 436: set rc [catch {
! 437: sqlite3_prepare $DB "INSERT INTO t2(a) VALUES(?[expr $iMaxVar+1])" -1 TAIL
! 438: } msg]
! 439: lappend rc $msg
! 440: } [list 1 $zError]
! 441: do_test bind-9.3.1 {
! 442: set VM [
! 443: sqlite3_prepare $DB "
! 444: INSERT INTO t2(a,b) VALUES(?1,?$iMaxVar)
! 445: " -1 TAIL
! 446: ]
! 447: sqlite3_bind_parameter_count $VM
! 448: } $iMaxVar
! 449: catch {sqlite3_finalize $VM}
! 450: do_test bind-9.3.2 {
! 451: set VM [
! 452: sqlite3_prepare $DB "
! 453: INSERT INTO t2(a,b) VALUES(?2,?[expr $iMaxVar - 1])
! 454: " -1 TAIL
! 455: ]
! 456: sqlite3_bind_parameter_count $VM
! 457: } [expr {$iMaxVar - 1}]
! 458: catch {sqlite3_finalize $VM}
! 459: do_test bind-9.4 {
! 460: set VM [
! 461: sqlite3_prepare $DB "
! 462: INSERT INTO t2(a,b,c,d) VALUES(?1,?[expr $iMaxVar - 2],?,?)
! 463: " -1 TAIL
! 464: ]
! 465: sqlite3_bind_parameter_count $VM
! 466: } $iMaxVar
! 467: do_test bind-9.5 {
! 468: sqlite3_bind_int $VM 1 1
! 469: sqlite3_bind_int $VM [expr $iMaxVar - 2] 999
! 470: sqlite3_bind_int $VM [expr $iMaxVar - 1] 1000
! 471: sqlite3_bind_int $VM $iMaxVar 1001
! 472: sqlite3_step $VM
! 473: } SQLITE_DONE
! 474: do_test bind-9.6 {
! 475: sqlite3_finalize $VM
! 476: } SQLITE_OK
! 477: do_test bind-9.7 {
! 478: execsql {SELECT * FROM t2}
! 479: } {1 999 1000 1001 {} {}}
! 480:
! 481: ifcapable {tclvar} {
! 482: do_test bind-10.1 {
! 483: set VM [
! 484: sqlite3_prepare $DB {
! 485: INSERT INTO t2(a,b,c,d,e,f) VALUES(:abc,$abc,:abc,$ab,$abc,:abc)
! 486: } -1 TAIL
! 487: ]
! 488: sqlite3_bind_parameter_count $VM
! 489: } 3
! 490: set v1 {$abc}
! 491: set v2 {$ab}
! 492: }
! 493: ifcapable {!tclvar} {
! 494: do_test bind-10.1 {
! 495: set VM [
! 496: sqlite3_prepare $DB {
! 497: INSERT INTO t2(a,b,c,d,e,f) VALUES(:abc,:xyz,:abc,:xy,:xyz,:abc)
! 498: } -1 TAIL
! 499: ]
! 500: sqlite3_bind_parameter_count $VM
! 501: } 3
! 502: set v1 {:xyz}
! 503: set v2 {:xy}
! 504: }
! 505: do_test bind-10.2 {
! 506: sqlite3_bind_parameter_index $VM :abc
! 507: } 1
! 508: do_test bind-10.3 {
! 509: sqlite3_bind_parameter_index $VM $v1
! 510: } 2
! 511: do_test bind-10.4 {
! 512: sqlite3_bind_parameter_index $VM $v2
! 513: } 3
! 514: do_test bind-10.5 {
! 515: sqlite3_bind_parameter_name $VM 1
! 516: } :abc
! 517: do_test bind-10.6 {
! 518: sqlite3_bind_parameter_name $VM 2
! 519: } $v1
! 520: do_test bind-10.7 {
! 521: sqlite3_bind_parameter_name $VM 3
! 522: } $v2
! 523: do_test bind-10.7.1 {
! 524: sqlite3_bind_parameter_name 0 1 ;# Ignore if VM is NULL
! 525: } {}
! 526: do_test bind-10.7.2 {
! 527: sqlite3_bind_parameter_name $VM 0 ;# Ignore if index too small
! 528: } {}
! 529: do_test bind-10.7.3 {
! 530: sqlite3_bind_parameter_name $VM 4 ;# Ignore if index is too big
! 531: } {}
! 532: do_test bind-10.8 {
! 533: sqlite3_bind_int $VM 1 1
! 534: sqlite3_bind_int $VM 2 2
! 535: sqlite3_bind_int $VM 3 3
! 536: sqlite3_step $VM
! 537: } SQLITE_DONE
! 538: do_test bind-10.8.1 {
! 539: # Binding attempts after program start should fail
! 540: set rc [catch {
! 541: sqlite3_bind_int $VM 1 1
! 542: } msg]
! 543: lappend rc $msg
! 544: } {1 {}}
! 545: do_test bind-10.9 {
! 546: sqlite3_finalize $VM
! 547: } SQLITE_OK
! 548: do_test bind-10.10 {
! 549: execsql {SELECT * FROM t2}
! 550: } {1 999 1000 1001 {} {} 1 2 1 3 2 1}
! 551:
! 552: # Ticket #918
! 553: #
! 554: do_test bind-10.11 {
! 555: # catch {sqlite3_finalize $VM}
! 556: set VM [
! 557: sqlite3_prepare $DB {
! 558: INSERT INTO t2(a,b,c,d,e,f) VALUES(:abc,?,?4,:pqr,:abc,?4)
! 559: } -1 TAIL
! 560: ]
! 561: sqlite3_bind_parameter_count $VM
! 562: } 5
! 563: do_test bind-10.11.1 {
! 564: sqlite3_bind_parameter_index 0 :xyz ;# ignore NULL VM arguments
! 565: } 0
! 566: do_test bind-10.12 {
! 567: sqlite3_bind_parameter_index $VM :xyz
! 568: } 0
! 569: do_test bind-10.13 {
! 570: sqlite3_bind_parameter_index $VM {}
! 571: } 0
! 572: do_test bind-10.14 {
! 573: sqlite3_bind_parameter_index $VM :pqr
! 574: } 5
! 575: do_test bind-10.15 {
! 576: sqlite3_bind_parameter_index $VM ?4
! 577: } 4
! 578: do_test bind-10.16 {
! 579: sqlite3_bind_parameter_name $VM 1
! 580: } :abc
! 581: do_test bind-10.17 {
! 582: sqlite3_bind_parameter_name $VM 2
! 583: } {}
! 584: do_test bind-10.18 {
! 585: sqlite3_bind_parameter_name $VM 3
! 586: } {}
! 587: do_test bind-10.19 {
! 588: sqlite3_bind_parameter_name $VM 4
! 589: } {?4}
! 590: do_test bind-10.20 {
! 591: sqlite3_bind_parameter_name $VM 5
! 592: } :pqr
! 593: catch {sqlite3_finalize $VM}
! 594:
! 595: # Make sure we catch an unterminated "(" in a Tcl-style variable name
! 596: #
! 597: ifcapable tclvar {
! 598: do_test bind-11.1 {
! 599: catchsql {SELECT * FROM sqlite_master WHERE name=$abc(123 and sql NOT NULL;}
! 600: } {1 {unrecognized token: "$abc(123"}}
! 601: }
! 602:
! 603: if {[execsql {pragma encoding}]=="UTF-8"} {
! 604: # Test the ability to bind text that contains embedded '\000' characters.
! 605: # Make sure we can recover the entire input string.
! 606: #
! 607: do_test bind-12.1 {
! 608: execsql {
! 609: CREATE TABLE t3(x BLOB);
! 610: }
! 611: set VM [sqlite3_prepare $DB {INSERT INTO t3 VALUES(?)} -1 TAIL]
! 612: sqlite_bind $VM 1 not-used blob10
! 613: sqlite3_step $VM
! 614: sqlite3_finalize $VM
! 615: execsql {
! 616: SELECT typeof(x), length(x), quote(x),
! 617: length(cast(x AS BLOB)), quote(cast(x AS BLOB)) FROM t3
! 618: }
! 619: } {text 3 'abc' 10 X'6162630078797A007071'}
! 620: do_test bind-12.2 {
! 621: sqlite3_create_function $DB
! 622: execsql {
! 623: SELECT quote(cast(x_coalesce(x) AS blob)) FROM t3
! 624: }
! 625: } {X'6162630078797A007071'}
! 626: }
! 627:
! 628: # Test the operation of sqlite3_clear_bindings
! 629: #
! 630: do_test bind-13.1 {
! 631: set VM [sqlite3_prepare $DB {SELECT ?,?,?} -1 TAIL]
! 632: sqlite3_step $VM
! 633: list [sqlite3_column_type $VM 0] [sqlite3_column_type $VM 1] \
! 634: [sqlite3_column_type $VM 2]
! 635: } {NULL NULL NULL}
! 636: do_test bind-13.2 {
! 637: sqlite3_reset $VM
! 638: sqlite3_bind_int $VM 1 1
! 639: sqlite3_bind_int $VM 2 2
! 640: sqlite3_bind_int $VM 3 3
! 641: sqlite3_step $VM
! 642: list [sqlite3_column_type $VM 0] [sqlite3_column_type $VM 1] \
! 643: [sqlite3_column_type $VM 2]
! 644: } {INTEGER INTEGER INTEGER}
! 645: do_test bind-13.3 {
! 646: sqlite3_reset $VM
! 647: sqlite3_step $VM
! 648: list [sqlite3_column_type $VM 0] [sqlite3_column_type $VM 1] \
! 649: [sqlite3_column_type $VM 2]
! 650: } {INTEGER INTEGER INTEGER}
! 651: do_test bind-13.4 {
! 652: sqlite3_reset $VM
! 653: sqlite3_clear_bindings $VM
! 654: sqlite3_step $VM
! 655: list [sqlite3_column_type $VM 0] [sqlite3_column_type $VM 1] \
! 656: [sqlite3_column_type $VM 2]
! 657: } {NULL NULL NULL}
! 658: sqlite3_finalize $VM
! 659:
! 660: #--------------------------------------------------------------------
! 661: # These tests attempt to reproduce bug #3463.
! 662: #
! 663: proc param_names {db zSql} {
! 664: set ret [list]
! 665: set VM [sqlite3_prepare db $zSql -1 TAIL]
! 666: for {set ii 1} {$ii <= [sqlite3_bind_parameter_count $VM]} {incr ii} {
! 667: lappend ret [sqlite3_bind_parameter_name $VM $ii]
! 668: }
! 669: sqlite3_finalize $VM
! 670: set ret
! 671: }
! 672:
! 673: do_test bind-14.1 {
! 674: param_names db { SELECT @a, @b }
! 675: } {@a @b}
! 676: do_test bind-14.2 {
! 677: param_names db { SELECT NULL FROM (SELECT NULL) WHERE @a = @b }
! 678: } {@a @b}
! 679: do_test bind-14.3 {
! 680: param_names db { SELECT @a FROM (SELECT NULL) WHERE 1 = @b }
! 681: } {@a @b}
! 682: do_test bind-14.4 {
! 683: param_names db { SELECT @a, @b FROM (SELECT NULL) }
! 684: } {@a @b}
! 685:
! 686: #--------------------------------------------------------------------------
! 687: # Tests of the OP_Variable opcode where P3>1
! 688: #
! 689: do_test bind-15.1 {
! 690: db eval {CREATE TABLE t4(a,b,c,d,e,f,g,h);}
! 691: set VM [sqlite3_prepare db {
! 692: INSERT INTO t4(a,b,c,d,f,g,h,e) VALUES(?,?,?,?,?,?,?,?)
! 693: } -1 TAIL]
! 694: sqlite3_bind_int $VM 1 1
! 695: sqlite3_bind_int $VM 2 2
! 696: sqlite3_bind_int $VM 3 3
! 697: sqlite3_bind_int $VM 4 4
! 698: sqlite3_bind_int $VM 5 5
! 699: sqlite3_bind_int $VM 6 6
! 700: sqlite3_bind_int $VM 7 7
! 701: sqlite3_bind_int $VM 8 8
! 702: sqlite3_step $VM
! 703: sqlite3_finalize $VM
! 704: db eval {SELECT * FROM t4}
! 705: } {1 2 3 4 8 5 6 7}
! 706: do_test bind-15.2 {
! 707: db eval {DELETE FROM t4}
! 708: set VM [sqlite3_prepare db {
! 709: INSERT INTO t4(a,b,c,d,e,f,g,h) VALUES(?,?,?,?,?,?,?,?)
! 710: } -1 TAIL]
! 711: sqlite3_bind_int $VM 1 1
! 712: sqlite3_bind_int $VM 2 2
! 713: sqlite3_bind_int $VM 3 3
! 714: sqlite3_bind_int $VM 4 4
! 715: sqlite3_bind_int $VM 5 5
! 716: sqlite3_bind_int $VM 6 6
! 717: sqlite3_bind_int $VM 7 7
! 718: sqlite3_bind_int $VM 8 8
! 719: sqlite3_step $VM
! 720: sqlite3_finalize $VM
! 721: db eval {SELECT * FROM t4}
! 722: } {1 2 3 4 5 6 7 8}
! 723: do_test bind-15.3 {
! 724: db eval {DELETE FROM t4}
! 725: set VM [sqlite3_prepare db {
! 726: INSERT INTO t4(h,g,f,e,d,c,b,a) VALUES(?,?,?,?,?,?,?,?)
! 727: } -1 TAIL]
! 728: sqlite3_bind_int $VM 1 1
! 729: sqlite3_bind_int $VM 2 2
! 730: sqlite3_bind_int $VM 3 3
! 731: sqlite3_bind_int $VM 4 4
! 732: sqlite3_bind_int $VM 5 5
! 733: sqlite3_bind_int $VM 6 6
! 734: sqlite3_bind_int $VM 7 7
! 735: sqlite3_bind_int $VM 8 8
! 736: sqlite3_step $VM
! 737: sqlite3_finalize $VM
! 738: db eval {SELECT * FROM t4}
! 739: } {8 7 6 5 4 3 2 1}
! 740: do_test bind-15.4 {
! 741: db eval {DELETE FROM t4}
! 742: set VM [sqlite3_prepare db {
! 743: INSERT INTO t4(a,b,c,d,e,f,g,h) VALUES(?,?,?,?4,?,?6,?,?)
! 744: } -1 TAIL]
! 745: sqlite3_bind_int $VM 1 1
! 746: sqlite3_bind_int $VM 2 2
! 747: sqlite3_bind_int $VM 3 3
! 748: sqlite3_bind_int $VM 4 4
! 749: sqlite3_bind_int $VM 5 5
! 750: sqlite3_bind_int $VM 6 6
! 751: sqlite3_bind_int $VM 7 7
! 752: sqlite3_bind_int $VM 8 8
! 753: sqlite3_step $VM
! 754: sqlite3_finalize $VM
! 755: db eval {SELECT * FROM t4}
! 756: } {1 2 3 4 5 6 7 8}
! 757:
! 758: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>