/ Hex Artifact Content
Login

Artifact 904ebe0ed1472d6bad17a81e2ecbfc20017dc237:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 4d 61 72 63 68  /*.** 2007 March
0010: 20 32 39 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75   29.**.** The au
0020: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
0030: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
0040: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
0050: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20  n place of.** a 
0060: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
0070: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
0080: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79  :.**.**    May y
0090: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
00a0: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d  ot evil..**    M
00b0: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67  ay you find forg
00c0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72  iveness for your
00d0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65  self and forgive
00e0: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d   others..**    M
00f0: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
0100: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
0110: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
0120: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  give..**.*******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  **.**.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 62 73 63  le contains obsc
0190: 75 72 65 20 74 65 73 74 73 20 6f 66 20 74 68 65  ure tests of the
01a0: 20 43 2d 69 6e 74 65 72 66 61 63 65 20 72 65 71   C-interface req
01b0: 75 69 72 65 64 0a 2a 2a 20 66 6f 72 20 63 6f 6d  uired.** for com
01c0: 70 6c 65 74 65 6e 65 73 73 2e 20 54 65 73 74 20  pleteness. Test 
01d0: 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 20  code is written 
01e0: 69 6e 20 43 20 66 6f 72 20 74 68 65 73 65 20 63  in C for these c
01f0: 61 73 65 73 0a 2a 2a 20 61 73 20 74 68 65 72 65  ases.** as there
0200: 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 70 6f 69   is not much poi
0210: 6e 74 20 69 6e 20 62 69 6e 64 69 6e 67 20 74 6f  nt in binding to
0220: 20 54 63 6c 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a   Tcl..**.** $Id:
0230: 20 74 65 73 74 39 2e 63 2c 76 20 31 2e 36 20 32   test9.c,v 1.6 2
0240: 30 30 38 2f 30 37 2f 31 31 20 31 33 3a 35 33 3a  008/07/11 13:53:
0250: 35 35 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  55 drh Exp $.*/.
0260: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0270: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0280: 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65  "tcl.h".#include
0290: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
02a0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
02b0: 0a 2f 2a 0a 2a 2a 20 63 5f 63 6f 6c 6c 61 74 69  ./*.** c_collati
02c0: 6f 6e 5f 74 65 73 74 0a 2a 2f 0a 73 74 61 74 69  on_test.*/.stati
02d0: 63 20 69 6e 74 20 63 5f 63 6f 6c 6c 61 74 69 6f  c int c_collatio
02e0: 6e 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  n_test(.  Client
02f0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
0300: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
0310: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
0320: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
0330: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0340: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
0350: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
0360: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
0370: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
0380: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
0390: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
03a0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
03b0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
03c0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
03d0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
03e0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
03f0: 7a 45 72 72 46 75 6e 63 74 69 6f 6e 20 3d 20 22  zErrFunction = "
0400: 4e 2f 41 22 3b 0a 20 20 73 71 6c 69 74 65 33 20  N/A";.  sqlite3 
0410: 2a 64 62 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a  *db;..  int rc;.
0420: 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
0430: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
0440: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
0450: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
0460: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
0480: 20 61 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a   a database. */.
0490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
04a0: 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20  pen(":memory:", 
04b0: 26 64 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  &db);.  if( rc!=
04c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
04d0: 20 7a 45 72 72 46 75 6e 63 74 69 6f 6e 20 3d 20   zErrFunction = 
04e0: 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22 3b 0a  "sqlite3_open";.
04f0: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
0500: 75 74 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  ut;.  }..  rc = 
0510: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
0520: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 63 6f  ollation(db, "co
0530: 6c 6c 61 74 65 22 2c 20 34 35 36 2c 20 30 2c 20  llate", 456, 0, 
0540: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
0550: 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20  LITE_MISUSE ){. 
0560: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
0570: 28 64 62 29 3b 0a 20 20 20 20 7a 45 72 72 46 75  (db);.    zErrFu
0580: 6e 63 74 69 6f 6e 20 3d 20 22 73 71 6c 69 74 65  nction = "sqlite
0590: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
05a0: 6f 6e 22 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72  on";.    goto er
05b0: 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
05c0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
05d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
05e0: 4f 4b 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a  OK;..error_out:.
05f0: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
0600: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 54 63 6c  t(interp);.  Tcl
0610: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
0620: 74 65 72 70 2c 20 22 45 72 72 6f 72 20 74 65 73  terp, "Error tes
0630: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 3a 20 22  ting function: "
0640: 2c 20 7a 45 72 72 46 75 6e 63 74 69 6f 6e 2c 20  , zErrFunction, 
0650: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
0660: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
0670: 20 63 5f 72 65 61 6c 6c 6f 63 5f 74 65 73 74 0a   c_realloc_test.
0680: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 5f  */.static int c_
0690: 72 65 61 6c 6c 6f 63 5f 74 65 73 74 28 0a 20 20  realloc_test(.  
06a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
06b0: 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
06c0: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
06d0: 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
06e0: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
06f0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
0700: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
0710: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
0720: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
0730: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
0740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0750: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
0760: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
0770: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
0780: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
0790: 73 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  s */.){.  void *
07a0: 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p;.  const char 
07b0: 2a 7a 45 72 72 46 75 6e 63 74 69 6f 6e 20 3d 20  *zErrFunction = 
07c0: 22 4e 2f 41 22 3b 0a 0a 20 20 69 66 28 20 6f 62  "N/A";..  if( ob
07d0: 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
07e0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
07f0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
0800: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
0810: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
0820: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
0830: 6c 6f 63 28 35 29 3b 0a 20 20 69 66 28 20 21 70  loc(5);.  if( !p
0840: 20 29 7b 0a 20 20 20 20 7a 45 72 72 46 75 6e 63   ){.    zErrFunc
0850: 74 69 6f 6e 20 3d 20 22 73 71 6c 69 74 65 33 5f  tion = "sqlite3_
0860: 6d 61 6c 6c 6f 63 22 3b 0a 20 20 20 20 67 6f 74  malloc";.    got
0870: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
0880: 0a 0a 20 20 2f 2a 20 54 65 73 74 20 74 68 61 74  ..  /* Test that
0890: 20 72 65 61 6c 6c 6f 63 28 29 69 6e 67 20 61 20   realloc()ing a 
08a0: 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
08b0: 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20 73 69  to a negative si
08c0: 7a 65 20 69 73 0a 20 20 2a 2a 20 74 68 65 20 73  ze is.  ** the s
08d0: 61 6d 65 20 61 73 20 66 72 65 65 28 29 69 6e 67  ame as free()ing
08e0: 20 74 68 61 74 20 6d 65 6d 6f 72 79 2e 0a 20 20   that memory..  
08f0: 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
0900: 5f 72 65 61 6c 6c 6f 63 28 70 2c 20 2d 31 29 3b  _realloc(p, -1);
0910: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0920: 7a 45 72 72 46 75 6e 63 74 69 6f 6e 20 3d 20 22  zErrFunction = "
0930: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 22  sqlite3_realloc"
0940: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  ;.    goto error
0950: 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  _out;.  }..  ret
0960: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 65 72 72  urn TCL_OK;..err
0970: 6f 72 5f 6f 75 74 3a 0a 20 20 54 63 6c 5f 52 65  or_out:.  Tcl_Re
0980: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
0990: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
09a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
09b0: 72 72 6f 72 20 74 65 73 74 69 6e 67 20 66 75 6e  rror testing fun
09c0: 63 74 69 6f 6e 3a 20 22 2c 20 7a 45 72 72 46 75  ction: ", zErrFu
09d0: 6e 63 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 72 65  nction, 0);.  re
09e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
09f0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 63 5f 6d 69 73 75  }.../*.** c_misu
0a00: 73 65 5f 74 65 73 74 0a 2a 2f 0a 73 74 61 74 69  se_test.*/.stati
0a10: 63 20 69 6e 74 20 63 5f 6d 69 73 75 73 65 5f 74  c int c_misuse_t
0a20: 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
0a30: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
0a40: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
0a50: 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
0a60: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
0a70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0a80: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
0a90: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
0aa0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
0ab0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
0ac0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
0ad0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
0ae0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
0af0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
0b00: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
0b10: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
0b20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
0b30: 72 46 75 6e 63 74 69 6f 6e 20 3d 20 22 4e 2f 41  rFunction = "N/A
0b40: 22 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ";.  sqlite3 *db
0b50: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
0b60: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
0b70: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
0b80: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
0b90: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
0ba0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
0bb0: 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  R;.  }..  /* Ope
0bc0: 6e 20 61 20 64 61 74 61 62 61 73 65 2e 20 54 68  n a database. Th
0bd0: 65 6e 20 63 6c 6f 73 65 20 69 74 20 61 67 61 69  en close it agai
0be0: 6e 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f  n. We need to do
0bf0: 20 74 68 69 73 20 73 6f 20 74 68 61 74 0a 20 20   this so that.  
0c00: 2a 2a 20 77 65 20 68 61 76 65 20 61 20 22 63 6c  ** we have a "cl
0c10: 6f 73 65 64 20 64 61 74 61 62 61 73 65 20 68 61  osed database ha
0c20: 6e 64 6c 65 22 20 74 6f 20 70 61 73 73 20 74 6f  ndle" to pass to
0c30: 20 76 61 72 69 6f 75 73 20 41 50 49 20 66 75 6e   various API fun
0c40: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 72  ctions..  */.  r
0c50: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
0c60: 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 64 62  (":memory:", &db
0c70: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
0c80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 45  ITE_OK ){.    zE
0c90: 72 72 46 75 6e 63 74 69 6f 6e 20 3d 20 22 73 71  rrFunction = "sq
0ca0: 6c 69 74 65 33 5f 6f 70 65 6e 22 3b 0a 20 20 20  lite3_open";.   
0cb0: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
0cc0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63  .  }.  sqlite3_c
0cd0: 6c 6f 73 65 28 64 62 29 3b 0a 0a 0a 20 20 72 63  lose(db);...  rc
0ce0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
0cf0: 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  de(db);.  if( rc
0d00: 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  !=SQLITE_MISUSE 
0d10: 29 7b 0a 20 20 20 20 7a 45 72 72 46 75 6e 63 74  ){.    zErrFunct
0d20: 69 6f 6e 20 3d 20 22 73 71 6c 69 74 65 33 5f 65  ion = "sqlite3_e
0d30: 72 72 63 6f 64 65 22 3b 0a 20 20 20 20 67 6f 74  rrcode";.    got
0d40: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
0d50: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
0d60: 5f 70 72 65 70 61 72 65 28 64 62 2c 20 30 2c 20  _prepare(db, 0, 
0d70: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  0, 0, 0);.  if( 
0d80: 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53  rc!=SQLITE_MISUS
0d90: 45 20 29 7b 0a 20 20 20 20 7a 45 72 72 46 75 6e  E ){.    zErrFun
0da0: 63 74 69 6f 6e 20 3d 20 22 73 71 6c 69 74 65 33  ction = "sqlite3
0db0: 5f 70 72 65 70 61 72 65 22 3b 0a 20 20 20 20 67  _prepare";.    g
0dc0: 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
0dd0: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
0de0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
0df0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
0e00: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
0e10: 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20 7a 45  MISUSE ){.    zE
0e20: 72 72 46 75 6e 63 74 69 6f 6e 20 3d 20 22 73 71  rrFunction = "sq
0e30: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
0e40: 22 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  ";.    goto erro
0e50: 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  r_out;.  }..#ifn
0e60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0e70: 55 54 46 31 36 0a 20 20 72 63 20 3d 20 73 71 6c  UTF16.  rc = sql
0e80: 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 64  ite3_prepare16(d
0e90: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  b, 0, 0, 0, 0);.
0ea0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
0eb0: 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20 7a  _MISUSE ){.    z
0ec0: 45 72 72 46 75 6e 63 74 69 6f 6e 20 3d 20 22 73  ErrFunction = "s
0ed0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
0ee0: 22 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  ";.    goto erro
0ef0: 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20  r_out;.  }.  rc 
0f00: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
0f10: 65 31 36 5f 76 32 28 64 62 2c 20 30 2c 20 30 2c  e16_v2(db, 0, 0,
0f20: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
0f30: 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  !=SQLITE_MISUSE 
0f40: 29 7b 0a 20 20 20 20 7a 45 72 72 46 75 6e 63 74  ){.    zErrFunct
0f50: 69 6f 6e 20 3d 20 22 73 71 6c 69 74 65 33 5f 70  ion = "sqlite3_p
0f60: 72 65 70 61 72 65 31 36 5f 76 32 22 3b 0a 20 20  repare16_v2";.  
0f70: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
0f80: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
0f90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
0fa0: 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 54 63 6c  error_out:.  Tcl
0fb0: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
0fc0: 65 72 70 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  erp);.  Tcl_Appe
0fd0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0fe0: 20 22 45 72 72 6f 72 20 74 65 73 74 69 6e 67 20   "Error testing 
0ff0: 66 75 6e 63 74 69 6f 6e 3a 20 22 2c 20 7a 45 72  function: ", zEr
1000: 72 46 75 6e 63 74 69 6f 6e 2c 20 30 29 3b 0a 20  rFunction, 0);. 
1010: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1020: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  R;.}../*.** Regi
1030: 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69  ster commands wi
1040: 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  th the TCL inter
1050: 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53  preter..*/.int S
1060: 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28  qlitetest9_Init(
1070: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1080: 72 70 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74  rp){.  static st
1090: 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
10a0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63   *zName;.     Tc
10b0: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50  l_ObjCmdProc *xP
10c0: 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a  roc;.     void *
10d0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20  clientData;.  } 
10e0: 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20  aObjCmd[] = {.  
10f0: 20 20 20 7b 20 22 63 5f 6d 69 73 75 73 65 5f 74     { "c_misuse_t
1100: 65 73 74 22 2c 20 20 20 20 63 5f 6d 69 73 75 73  est",    c_misus
1110: 65 5f 74 65 73 74 2c 20 30 20 7d 2c 0a 20 20 20  e_test, 0 },.   
1120: 20 20 7b 20 22 63 5f 72 65 61 6c 6c 6f 63 5f 74    { "c_realloc_t
1130: 65 73 74 22 2c 20 20 20 63 5f 72 65 61 6c 6c 6f  est",   c_reallo
1140: 63 5f 74 65 73 74 2c 20 30 20 7d 2c 0a 20 20 20  c_test, 0 },.   
1150: 20 20 7b 20 22 63 5f 63 6f 6c 6c 61 74 69 6f 6e    { "c_collation
1160: 5f 74 65 73 74 22 2c 20 63 5f 63 6f 6c 6c 61 74  _test", c_collat
1170: 69 6f 6e 5f 74 65 73 74 2c 20 30 20 7d 2c 0a 20  ion_test, 0 },. 
1180: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   };.  int i;.  f
1190: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
11a0: 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66  (aObjCmd)/sizeof
11b0: 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b  (aObjCmd[0]); i+
11c0: 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  +){.    Tcl_Crea
11d0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
11e0: 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e  erp, aObjCmd[i].
11f0: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
1200: 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63  aObjCmd[i].xProc
1210: 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69  , aObjCmd[i].cli
1220: 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d  entData, 0);.  }
1230: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1240: 3b 0a 7d 0a                                      ;.}.