Annotation of embedaddon/sqlite3/test/bind.test, revision 1.1.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>