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>