gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/bind.test (about)

     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  } {column index out of range}
   370  ifcapable {utf16} {
   371    do_test bind-8.3 {
   372      encoding convertfrom unicode [sqlite3_errmsg16 $DB]
   373    } {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  } {column index out of range}
   385  ifcapable {utf16} {
   386    do_test bind-8.7 {
   387      encoding convertfrom unicode [sqlite3_errmsg16 $DB]
   388    } {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