/ Hex Artifact Content
Login

Artifact 0b3173f69b8899da640a13a345dc5ef1400199405f738abe6145b2454195b8ff:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 20 4a 75 6c 79 20  /*.** 2017 July 
0010: 31 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  15.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  *.**.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  e contains the i
0190: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
01a0: 20 74 68 65 20 22 75 6e 69 6f 6e 76 74 61 62 22   the "unionvtab"
01b0: 20 61 6e 64 20 22 73 77 61 72 6d 76 74 61 62 22   and "swarmvtab"
01c0: 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
01d0: 65 73 2e 20 54 68 65 73 65 20 6d 6f 64 75 6c 65  es. These module
01e0: 73 20 70 72 6f 76 69 64 65 20 72 65 61 64 2d 6f  s provide read-o
01f0: 6e 6c 79 20 61 63 63 65 73 73 20 74 6f 20 6d 75  nly access to mu
0200: 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 2c 0a 2a  ltiple tables,.*
0210: 2a 20 70 6f 73 73 69 62 6c 79 20 69 6e 20 6d 75  * possibly in mu
0220: 6c 74 69 70 6c 65 20 64 61 74 61 62 61 73 65 20  ltiple database 
0230: 66 69 6c 65 73 2c 20 76 69 61 20 61 20 73 69 6e  files, via a sin
0240: 67 6c 65 20 64 61 74 61 62 61 73 65 20 6f 62 6a  gle database obj
0250: 65 63 74 2e 0a 2a 2a 20 54 68 65 20 73 6f 75 72  ect..** The sour
0260: 63 65 20 74 61 62 6c 65 73 20 6d 75 73 74 20 68  ce tables must h
0270: 61 76 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ave the followin
0280: 67 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  g characteristic
0290: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  s:.**.**   * The
02a0: 79 20 6d 75 73 74 20 61 6c 6c 20 62 65 20 72 6f  y must all be ro
02b0: 77 69 64 20 74 61 62 6c 65 73 20 28 6e 6f 74 20  wid tables (not 
02c0: 56 49 52 54 55 41 4c 20 6f 72 20 57 49 54 48 4f  VIRTUAL or WITHO
02d0: 55 54 20 52 4f 57 49 44 0a 2a 2a 20 20 20 20 20  UT ROWID.**     
02e0: 74 61 62 6c 65 73 20 6f 72 20 76 69 65 77 73 29  tables or views)
02f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 45 61 63 68  ..**.**   * Each
0300: 20 74 61 62 6c 65 20 6d 75 73 74 20 68 61 76 65   table must have
0310: 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
0320: 20 63 6f 6c 75 6d 6e 73 2c 20 64 65 63 6c 61 72   columns, declar
0330: 65 64 20 69 6e 0a 2a 2a 20 20 20 20 20 74 68 65  ed in.**     the
0340: 20 73 61 6d 65 20 6f 72 64 65 72 20 61 6e 64 20   same order and 
0350: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 64 65  with the same de
0360: 63 6c 61 72 65 64 20 74 79 70 65 73 2e 0a 2a 2a  clared types..**
0370: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 74 61 62 6c  .**   * The tabl
0380: 65 73 20 6d 75 73 74 20 6e 6f 74 20 66 65 61 74  es must not feat
0390: 75 72 65 20 61 20 75 73 65 72 2d 64 65 66 69 6e  ure a user-defin
03a0: 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  ed column named 
03b0: 22 5f 72 6f 77 69 64 5f 22 2e 0a 2a 2a 0a 2a 2a  "_rowid_"..**.**
03c0: 20 20 20 2a 20 45 61 63 68 20 74 61 62 6c 65 20     * Each table 
03d0: 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 20 64  must contain a d
03e0: 69 73 74 69 6e 63 74 20 72 61 6e 67 65 20 6f 66  istinct range of
03f0: 20 72 6f 77 69 64 20 76 61 6c 75 65 73 2e 0a 2a   rowid values..*
0400: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
0410: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  nce between the 
0420: 74 77 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c  two virtual tabl
0430: 65 20 6d 6f 64 75 6c 65 73 20 69 73 20 74 68 61  e modules is tha
0440: 74 20 66 6f 72 20 0a 2a 2a 20 22 75 6e 69 6f 6e  t for .** "union
0450: 76 74 61 62 22 2c 20 61 6c 6c 20 73 6f 75 72 63  vtab", all sourc
0460: 65 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62 65  e tables must be
0470: 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20   located in the 
0480: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 72  main database or
0490: 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 73  .** in databases
04a0: 20 41 54 54 41 43 48 65 64 20 74 6f 20 74 68 65   ATTACHed to the
04b0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 62   main database b
04c0: 79 20 74 68 65 20 75 73 65 72 2e 20 46 6f 72 20  y the user. For 
04d0: 22 73 77 61 72 6d 76 74 61 62 22 2c 0a 2a 2a 20  "swarmvtab",.** 
04e0: 74 68 65 20 74 61 62 6c 65 73 20 6d 61 79 20 62  the tables may b
04f0: 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 61 6e 79  e located in any
0500: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
0510: 6e 20 64 69 73 6b 2e 20 54 68 65 20 22 73 77 61  n disk. The "swa
0520: 72 6d 76 74 61 62 22 0a 2a 2a 20 69 6d 70 6c 65  rmvtab".** imple
0530: 6d 65 6e 74 61 74 69 6f 6e 20 74 61 6b 65 73 20  mentation takes 
0540: 63 61 72 65 20 6f 66 20 6f 70 65 6e 69 6e 67 20  care of opening 
0550: 61 6e 64 20 63 6c 6f 73 69 6e 67 20 64 61 74 61  and closing data
0560: 62 61 73 65 20 66 69 6c 65 73 0a 2a 2a 20 61 75  base files.** au
0570: 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a  tomatically..**.
0580: 2a 2a 20 55 4e 49 4f 4e 56 54 41 42 0a 2a 2a 0a  ** UNIONVTAB.**.
0590: 2a 2a 20 20 20 41 20 22 75 6e 69 6f 6e 76 74 61  **   A "unionvta
05a0: 62 22 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  b" virtual table
05b0: 20 69 73 20 63 72 65 61 74 65 64 20 61 73 20 66   is created as f
05c0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
05d0: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
05e0: 20 54 41 42 4c 45 20 3c 6e 61 6d 65 3e 20 55 53   TABLE <name> US
05f0: 49 4e 47 20 75 6e 69 6f 6e 76 74 61 62 28 3c 73  ING unionvtab(<s
0600: 71 6c 2d 73 74 61 74 65 6d 65 6e 74 3e 29 3b 0a  ql-statement>);.
0610: 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 69 6d 70 6c  **.**   The impl
0620: 65 6d 65 6e 74 61 74 69 6f 6e 20 65 76 61 6c 75  ementation evalu
0630: 74 65 73 20 3c 73 71 6c 20 73 74 61 74 65 6d 65  tes <sql stateme
0640: 6e 74 3e 20 77 68 65 6e 65 76 65 72 20 61 20 75  nt> whenever a u
0650: 6e 69 6f 6e 76 74 61 62 20 76 69 72 74 75 61 6c  nionvtab virtual
0660: 0a 2a 2a 20 20 20 74 61 62 6c 65 20 69 73 20 63  .**   table is c
0670: 72 65 61 74 65 64 20 6f 72 20 6f 70 65 6e 65 64  reated or opened
0680: 2e 20 49 74 20 73 68 6f 75 6c 64 20 72 65 74 75  . It should retu
0690: 72 6e 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65  rn one row for e
06a0: 61 63 68 20 73 6f 75 72 63 65 0a 2a 2a 20 20 20  ach source.**   
06b0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 20  database table. 
06c0: 54 68 65 20 66 6f 75 72 20 63 6f 6c 75 6d 6e 73  The four columns
06d0: 20 72 65 71 75 69 72 65 64 20 6f 66 20 65 61 63   required of eac
06e0: 68 20 72 6f 77 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  h row are:.**.**
06f0: 20 20 20 20 20 31 2e 20 54 68 65 20 6e 61 6d 65       1. The name
0700: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
0710: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
0720: 74 61 62 6c 65 20 28 22 6d 61 69 6e 22 20 6f 72  table ("main" or
0730: 20 22 74 65 6d 70 22 20 6f 72 0a 2a 2a 20 20 20   "temp" or.**   
0740: 20 20 20 20 20 74 68 65 20 6e 61 6d 65 20 6f 66       the name of
0750: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
0760: 61 62 61 73 65 29 2e 20 4f 72 20 4e 55 4c 4c 20  abase). Or NULL 
0770: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
0780: 20 61 6c 6c 0a 2a 2a 20 20 20 20 20 20 20 20 64   all.**        d
0790: 61 74 61 62 61 73 65 73 20 73 68 6f 75 6c 64 20  atabases should 
07a0: 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
07b0: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  the table in the
07c0: 20 75 73 75 61 6c 20 66 61 73 68 69 6f 6e 2e 0a   usual fashion..
07d0: 2a 2a 0a 2a 2a 20 20 20 20 20 32 2e 20 54 68 65  **.**     2. The
07e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
07f0: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  abase table..**.
0800: 2a 2a 20 20 20 20 20 33 2e 20 54 68 65 20 73 6d  **     3. The sm
0810: 61 6c 6c 65 73 74 20 72 6f 77 69 64 20 69 6e 20  allest rowid in 
0820: 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 6f 77  the range of row
0830: 69 64 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ids that may be 
0840: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a  stored in the.**
0850: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
0860: 20 74 61 62 6c 65 20 28 61 6e 20 69 6e 74 65 67   table (an integ
0870: 65 72 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 34  er)..**.**     4
0880: 2e 20 54 68 65 20 6c 61 72 67 65 73 74 20 72 6f  . The largest ro
0890: 77 69 64 20 69 6e 20 74 68 65 20 72 61 6e 67 65  wid in the range
08a0: 20 6f 66 20 72 6f 77 69 64 73 20 74 68 61 74 20   of rowids that 
08b0: 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  may be stored in
08c0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 64   the.**        d
08d0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 28 61  atabase table (a
08e0: 6e 20 69 6e 74 65 67 65 72 29 2e 0a 2a 2a 0a 2a  n integer)..**.*
08f0: 2a 20 53 57 41 52 4d 56 54 41 42 0a 2a 2a 0a 2a  * SWARMVTAB.**.*
0900: 2a 20 20 4c 45 47 41 43 59 20 53 59 4e 54 41 58  *  LEGACY SYNTAX
0910: 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 22 73 77 61  :.**.**   A "swa
0920: 72 6d 76 74 61 62 22 20 76 69 72 74 75 61 6c 20  rmvtab" virtual 
0930: 74 61 62 6c 65 20 69 73 20 63 72 65 61 74 65 64  table is created
0940: 20 73 69 6d 69 6c 61 72 6c 79 20 74 6f 20 61 20   similarly to a 
0950: 75 6e 69 6f 6e 76 74 61 62 20 74 61 62 6c 65 3a  unionvtab table:
0960: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  .**.**     CREAT
0970: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
0980: 3c 6e 61 6d 65 3e 0a 2a 2a 20 20 20 20 20 20 55  <name>.**      U
0990: 53 49 4e 47 20 73 77 61 72 6d 76 74 61 62 28 3c  SING swarmvtab(<
09a0: 73 71 6c 2d 73 74 61 74 65 6d 65 6e 74 3e 2c 20  sql-statement>, 
09b0: 3c 63 61 6c 6c 62 61 63 6b 3e 29 3b 0a 2a 2a 0a  <callback>);.**.
09c0: 2a 2a 20 20 20 54 68 65 20 64 69 66 66 65 72 65  **   The differe
09d0: 6e 63 65 20 69 73 20 74 68 61 74 20 66 6f 72 20  nce is that for 
09e0: 61 20 73 77 61 72 6d 76 74 61 62 20 74 61 62 6c  a swarmvtab tabl
09f0: 65 2c 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c  e, the first col
0a00: 75 6d 6e 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  umn returned.** 
0a10: 20 20 62 79 20 74 68 65 20 3c 73 71 6c 20 73 74    by the <sql st
0a20: 61 74 65 6d 65 6e 74 3e 20 6d 75 73 74 20 72 65  atement> must re
0a30: 74 75 72 6e 20 61 20 70 61 74 68 20 6f 72 20 55  turn a path or U
0a40: 52 49 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  RI that can be u
0a50: 73 65 64 20 74 6f 20 6f 70 65 6e 0a 2a 2a 20 20  sed to open.**  
0a60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
0a70: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
0a80: 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 2e 20  e source table. 
0a90: 20 54 68 65 20 3c 63 61 6c 6c 62 61 63 6b 3e 20   The <callback> 
0aa0: 6f 70 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f  option.**   is o
0ab0: 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 69 6e 63  ptional.  If inc
0ac0: 6c 75 64 65 64 2c 20 69 74 20 69 73 20 74 68 65  luded, it is the
0ad0: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 70 70 6c   name of an appl
0ae0: 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 0a  ication-defined.
0af0: 2a 2a 20 20 20 53 51 4c 20 66 75 6e 63 74 69 6f  **   SQL functio
0b00: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
0b10: 64 20 77 69 74 68 20 74 68 65 20 55 52 49 20 6f  d with the URI o
0b20: 66 20 74 68 65 20 66 69 6c 65 2c 20 69 66 20 74  f the file, if t
0b30: 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 64 6f 65  he file.**   doe
0b40: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
0b50: 69 73 74 20 6f 6e 20 64 69 73 6b 20 77 68 65 6e  ist on disk when
0b60: 20 72 65 71 75 69 72 65 64 20 62 79 20 73 77 61   required by swa
0b70: 72 6d 76 74 61 62 2e 0a 2a 2a 0a 2a 2a 20 20 4e  rmvtab..**.**  N
0b80: 45 57 20 53 59 4e 54 41 58 3a 0a 2a 2a 0a 2a 2a  EW SYNTAX:.**.**
0b90: 20 20 20 55 73 69 6e 67 20 74 68 65 20 6e 65 77     Using the new
0ba0: 20 73 79 6e 74 61 78 2c 20 61 20 73 77 61 72 6d   syntax, a swarm
0bb0: 76 74 61 62 20 74 61 62 6c 65 20 69 73 20 63 72  vtab table is cr
0bc0: 65 61 74 65 64 20 77 69 74 68 3a 0a 2a 2a 0a 2a  eated with:.**.*
0bd0: 2a 20 20 20 20 20 20 43 52 45 41 54 45 20 56 49  *      CREATE VI
0be0: 52 54 55 41 4c 20 54 41 42 4c 45 20 3c 6e 61 6d  RTUAL TABLE <nam
0bf0: 65 3e 20 55 53 49 4e 47 20 73 77 61 72 6d 76 74  e> USING swarmvt
0c00: 61 62 28 0a 2a 2a 20 20 20 20 20 20 20 20 3c 73  ab(.**        <s
0c10: 71 6c 2d 73 74 61 74 65 6d 65 6e 74 3e 20 5b 2c  ql-statement> [,
0c20: 20 3c 6f 70 74 69 6f 6e 73 3e 5d 0a 2a 2a 20 20   <options>].**  
0c30: 20 20 20 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 77      );.**.**   w
0c40: 68 65 72 65 20 76 61 6c 69 64 20 3c 6f 70 74 69  here valid <opti
0c50: 6f 6e 73 3e 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ons> are:.**.** 
0c60: 20 20 20 20 20 6d 69 73 73 69 6e 67 3d 3c 75 64       missing=<ud
0c70: 66 2d 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 3e  f-function-name>
0c80: 0a 2a 2a 20 20 20 20 20 20 6f 70 65 6e 63 6c 6f  .**      openclo
0c90: 73 65 3d 3c 75 64 66 2d 66 75 6e 63 74 69 6f 6e  se=<udf-function
0ca0: 2d 6e 61 6d 65 3e 0a 2a 2a 20 20 20 20 20 20 6d  -name>.**      m
0cb0: 61 78 6f 70 65 6e 3d 3c 69 6e 74 65 67 65 72 3e  axopen=<integer>
0cc0: 0a 2a 2a 20 20 20 20 20 20 3c 73 71 6c 2d 70 61  .**      <sql-pa
0cd0: 72 61 6d 65 74 65 72 3e 3d 3c 74 65 78 74 2d 76  rameter>=<text-v
0ce0: 61 6c 75 65 3e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  alue>.**.**   Th
0cf0: 65 20 3c 73 71 6c 2d 73 74 61 74 65 6d 65 6e 74  e <sql-statement
0d00: 3e 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68  > must return th
0d10: 65 20 73 61 6d 65 20 34 20 63 6f 6c 75 6d 6e 73  e same 4 columns
0d20: 20 61 73 20 66 6f 72 20 61 20 73 77 61 72 6d 76   as for a swarmv
0d30: 74 61 62 0a 2a 2a 20 20 20 74 61 62 6c 65 20 69  tab.**   table i
0d40: 6e 20 6c 65 67 61 63 79 20 6d 6f 64 65 2e 20 48  n legacy mode. H
0d50: 6f 77 65 76 65 72 2c 20 69 74 20 6d 61 79 20 61  owever, it may a
0d60: 6c 73 6f 20 72 65 74 75 72 6e 20 61 20 35 74 68  lso return a 5th
0d70: 20 63 6f 6c 75 6d 6e 20 2d 20 74 68 65 0a 2a 2a   column - the.**
0d80: 20 20 20 22 63 6f 6e 74 65 78 74 22 20 63 6f 6c     "context" col
0d90: 75 6d 6e 2e 20 54 68 65 20 74 65 78 74 20 76 61  umn. The text va
0da0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 20  lue returned in 
0db0: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 69 73 20 6e  this column is n
0dc0: 6f 74 20 75 73 65 64 0a 2a 2a 20 20 20 61 74 20  ot used.**   at 
0dd0: 61 6c 6c 20 62 79 20 74 68 65 20 73 77 61 72 6d  all by the swarm
0de0: 76 74 61 62 20 69 6d 70 6c 65 6d 65 6e 74 61 74  vtab implementat
0df0: 69 6f 6e 2c 20 65 78 63 65 70 74 20 74 68 61 74  ion, except that
0e00: 20 69 74 20 69 73 20 70 61 73 73 65 64 20 61 73   it is passed as
0e10: 0a 2a 2a 20 20 20 61 6e 20 61 64 64 69 74 69 6f  .**   an additio
0e20: 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  nal argument to 
0e30: 74 68 65 20 74 77 6f 20 55 44 46 20 66 75 6e 63  the two UDF func
0e40: 74 69 6f 6e 73 20 74 68 61 74 20 6d 61 79 20 62  tions that may b
0e50: 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 20 20 28  e invoked.**   (
0e60: 73 65 65 20 62 65 6c 6f 77 29 2e 0a 2a 2a 0a 2a  see below)..**.*
0e70: 2a 20 20 20 54 68 65 20 22 6d 69 73 73 69 6e 67  *   The "missing
0e80: 22 20 6f 70 74 69 6f 6e 2c 20 69 66 20 70 72 65  " option, if pre
0e90: 73 65 6e 74 2c 20 73 70 65 63 69 66 69 65 73 20  sent, specifies 
0ea0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 53  the name of an S
0eb0: 51 4c 20 55 44 46 0a 2a 2a 20 20 20 66 75 6e 63  QL UDF.**   func
0ec0: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
0ed0: 65 64 20 69 66 20 61 20 64 61 74 61 62 61 73 65  ed if a database
0ee0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72   file is not alr
0ef0: 65 61 64 79 20 70 72 65 73 65 6e 74 20 6f 6e 0a  eady present on.
0f00: 2a 2a 20 20 20 64 69 73 6b 20 77 68 65 6e 20 72  **   disk when r
0f10: 65 71 75 69 72 65 64 20 62 79 20 73 77 61 72 6d  equired by swarm
0f20: 76 74 61 62 2e 20 49 66 20 74 68 65 20 3c 73 71  vtab. If the <sq
0f30: 6c 2d 73 74 61 74 65 6d 65 6e 74 3e 20 64 69 64  l-statement> did
0f40: 20 6e 6f 74 20 70 72 6f 76 69 64 65 0a 2a 2a 20   not provide.** 
0f50: 20 20 61 20 63 6f 6e 74 65 78 74 20 63 6f 6c 75    a context colu
0f60: 6d 6e 2c 20 69 74 20 69 73 20 69 6e 76 6f 6b 65  mn, it is invoke
0f70: 64 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d as:.**.**     
0f80: 53 45 4c 45 43 54 20 3c 6d 69 73 73 69 6e 67 2d  SELECT <missing-
0f90: 75 64 66 3e 28 3c 64 61 74 61 62 61 73 65 20 66  udf>(<database f
0fa0: 69 6c 65 6e 61 6d 65 2f 75 72 69 3e 29 3b 0a 2a  ilename/uri>);.*
0fb0: 2a 0a 2a 2a 20 20 20 4f 72 2c 20 69 66 20 74 68  *.**   Or, if th
0fc0: 65 72 65 20 77 61 73 20 61 20 63 6f 6e 74 65 78  ere was a contex
0fd0: 74 20 63 6f 6c 75 6d 6e 3a 0a 2a 2a 0a 2a 2a 20  t column:.**.** 
0fe0: 20 20 20 20 53 45 4c 45 43 54 20 3c 6d 69 73 73      SELECT <miss
0ff0: 69 6e 67 2d 75 64 66 3e 28 3c 64 61 74 61 62 61  ing-udf>(<databa
1000: 73 65 20 66 69 6c 65 6e 61 6d 65 2f 75 72 69 3e  se filename/uri>
1010: 2c 20 3c 63 6f 6e 74 65 78 74 3e 29 3b 0a 2a 2a  , <context>);.**
1020: 0a 2a 2a 20 20 20 54 68 65 20 22 6f 70 65 6e 63  .**   The "openc
1030: 6c 6f 73 65 22 20 6f 70 74 69 6f 6e 20 6d 61 79  lose" option may
1040: 20 61 6c 73 6f 20 73 70 65 63 69 66 79 20 61 20   also specify a 
1050: 55 44 46 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  UDF function. Th
1060: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20  is function.**  
1070: 20 69 73 20 69 6e 76 6f 6b 65 64 20 72 69 67 68   is invoked righ
1080: 74 20 62 65 66 6f 72 65 20 73 77 61 72 6d 76 74  t before swarmvt
1090: 61 62 20 6f 70 65 6e 73 20 61 20 64 61 74 61 62  ab opens a datab
10a0: 61 73 65 2c 20 61 6e 64 20 72 69 67 68 74 20 61  ase, and right a
10b0: 66 74 65 72 0a 2a 2a 20 20 20 69 74 20 63 6c 6f  fter.**   it clo
10c0: 73 65 73 20 6f 6e 65 2e 20 54 68 65 20 66 69 72  ses one. The fir
10d0: 73 74 20 61 72 67 75 6d 65 6e 74 20 2d 20 6f 72  st argument - or
10e0: 20 66 69 72 73 74 20 74 77 6f 20 61 72 67 75 6d   first two argum
10f0: 65 6e 74 73 2c 20 69 66 0a 2a 2a 20 20 20 3c 73  ents, if.**   <s
1100: 71 6c 2d 73 74 61 74 65 6d 65 6e 74 3e 20 73 75  ql-statement> su
1110: 70 70 6c 69 65 64 20 74 68 65 20 63 6f 6e 74 65  pplied the conte
1120: 78 74 20 63 6f 6c 75 6d 6e 20 2d 20 69 73 20 74  xt column - is t
1130: 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 0a 2a  he same as for.*
1140: 2a 20 20 20 74 68 65 20 22 6d 69 73 73 69 6e 67  *   the "missing
1150: 22 20 55 44 46 2e 20 46 6f 6c 6c 6f 77 69 6e 67  " UDF. Following
1160: 20 74 68 69 73 2c 20 74 68 65 20 55 44 46 20 69   this, the UDF i
1170: 73 20 70 61 73 73 65 64 20 69 6e 74 65 67 65 72  s passed integer
1180: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 30 20 62 65   value.**   0 be
1190: 66 6f 72 65 20 61 20 64 62 20 69 73 20 6f 70 65  fore a db is ope
11a0: 6e 65 64 2c 20 61 6e 64 20 31 20 72 69 67 68 74  ned, and 1 right
11b0: 20 61 66 74 65 72 20 69 74 20 69 73 20 63 6c 6f   after it is clo
11c0: 73 65 64 2e 20 49 66 20 62 6f 74 68 0a 2a 2a 20  sed. If both.** 
11d0: 20 20 61 20 6d 69 73 73 69 6e 67 20 61 6e 64 20    a missing and 
11e0: 6f 70 65 6e 63 6c 6f 73 65 20 55 44 46 20 69 73  openclose UDF is
11f0: 20 73 75 70 70 6c 69 65 64 2c 20 74 68 65 20 61   supplied, the a
1200: 70 70 6c 69 63 61 74 69 6f 6e 20 73 68 6f 75 6c  pplication shoul
1210: 64 20 65 78 70 65 63 74 0a 2a 2a 20 20 20 74 68  d expect.**   th
1220: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75  e following sequ
1230: 65 6e 63 65 20 6f 66 20 63 61 6c 6c 73 20 28 66  ence of calls (f
1240: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
1250: 62 61 73 65 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  base):.**.**    
1260: 20 20 53 45 4c 45 43 54 20 3c 6f 70 65 6e 63 6c    SELECT <opencl
1270: 6f 73 65 2d 75 64 66 3e 28 3c 64 62 20 66 69 6c  ose-udf>(<db fil
1280: 65 6e 61 6d 65 3e 2c 20 3c 63 6f 6e 74 65 78 74  ename>, <context
1290: 3e 2c 20 30 29 3b 0a 2a 2a 20 20 20 20 20 20 69  >, 0);.**      i
12a0: 66 28 20 64 62 20 6e 6f 74 20 61 6c 72 65 61 64  f( db not alread
12b0: 79 20 6f 6e 20 64 69 73 6b 20 29 7b 0a 2a 2a 20  y on disk ){.** 
12c0: 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
12d0: 3c 6d 69 73 73 69 6e 67 2d 75 64 66 3e 28 3c 64  <missing-udf>(<d
12e0: 62 20 66 69 6c 65 6e 61 6d 65 3e 2c 20 3c 63 6f  b filename>, <co
12f0: 6e 74 65 78 74 3e 29 3b 0a 2a 2a 20 20 20 20 20  ntext>);.**     
1300: 20 7d 0a 2a 2a 20 20 20 20 20 20 2e 2e 2e 20 73   }.**      ... s
1310: 77 61 72 6d 76 74 61 62 20 75 73 65 73 20 64 61  warmvtab uses da
1320: 74 61 62 61 73 65 20 2e 2e 2e 0a 2a 2a 20 20 20  tabase ....**   
1330: 20 20 20 53 45 4c 45 43 54 20 3c 6f 70 65 6e 63     SELECT <openc
1340: 6c 6f 73 65 2d 75 64 66 3e 28 3c 64 62 20 66 69  lose-udf>(<db fi
1350: 6c 65 6e 61 6d 65 3e 2c 20 3c 63 6f 6e 74 65 78  lename>, <contex
1360: 74 3e 2c 20 31 29 3b 0a 2a 2a 0a 2a 2a 20 20 20  t>, 1);.**.**   
1370: 54 68 65 20 22 6d 61 78 6f 70 65 6e 22 20 6f 70  The "maxopen" op
1380: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1390: 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 6d 61  configure the ma
13a0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a  ximum number of.
13b0: 2a 2a 20 20 20 64 61 74 61 62 61 73 65 20 66 69  **   database fi
13c0: 6c 65 73 20 73 77 61 72 6d 76 74 61 62 20 77 69  les swarmvtab wi
13d0: 6c 6c 20 68 6f 6c 64 20 6f 70 65 6e 20 73 69 6d  ll hold open sim
13e0: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 28 64 65 66  ultaneously (def
13f0: 61 75 6c 74 20 39 29 2e 0a 2a 2a 0a 2a 2a 20 20  ault 9)..**.**  
1400: 20 49 66 20 61 6e 20 6f 70 74 69 6f 6e 20 6e 61   If an option na
1410: 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  me begins with a
1420: 20 22 3a 22 20 63 68 61 72 61 63 74 65 72 2c 20   ":" character, 
1430: 74 68 65 6e 20 69 74 20 69 73 20 61 73 73 75 6d  then it is assum
1440: 65 64 0a 2a 2a 20 20 20 74 6f 20 62 65 20 61 6e  ed.**   to be an
1450: 20 53 51 4c 20 70 61 72 61 6d 65 74 65 72 2e 20   SQL parameter. 
1460: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
1470: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 78 74  e specified text
1480: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 20 20 62   value is.**   b
1490: 6f 75 6e 64 20 74 6f 20 74 68 65 20 73 61 6d 65  ound to the same
14a0: 20 76 61 72 69 61 62 6c 65 20 6f 66 20 74 68 65   variable of the
14b0: 20 3c 73 71 6c 2d 73 74 61 74 65 6d 65 6e 74 3e   <sql-statement>
14c0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 0a 2a   before it is .*
14d0: 2a 20 20 20 65 78 65 63 75 74 65 64 2e 20 49 74  *   executed. It
14e0: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 6f 66 20   is an error of 
14f0: 74 68 65 20 6e 61 6d 65 64 20 53 51 4c 20 70 61  the named SQL pa
1500: 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74  rameter does not
1510: 20 65 78 69 73 74 2e 0a 2a 2a 20 20 20 46 6f 72   exist..**   For
1520: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
1530: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
1540: 41 4c 20 54 41 42 4c 45 20 73 77 61 72 6d 20 55  AL TABLE swarm U
1550: 53 49 4e 47 20 73 77 61 72 6d 76 74 61 62 28 0a  SING swarmvtab(.
1560: 2a 2a 20 20 20 20 20 20 20 27 53 45 4c 45 43 54  **       'SELECT
1570: 20 3a 70 61 74 68 20 7c 7c 20 6c 6f 63 61 6c 66   :path || localf
1580: 69 6c 65 2c 20 74 62 6c 2c 20 6d 69 6e 2c 20 6d  ile, tbl, min, m
1590: 61 78 20 46 52 4f 4d 20 73 77 61 72 6d 64 69 72  ax FROM swarmdir
15a0: 27 2c 0a 2a 2a 20 20 20 20 20 20 20 3a 70 61 74  ',.**       :pat
15b0: 68 3d 27 2f 68 6f 6d 65 2f 75 73 65 72 2f 64 61  h='/home/user/da
15c0: 74 61 62 61 73 65 73 2f 27 0a 2a 2a 20 20 20 20  tabases/'.**    
15d0: 20 20 20 6d 69 73 73 69 6e 67 3d 27 6d 69 73 73     missing='miss
15e0: 69 6e 67 5f 66 75 6e 63 27 0a 2a 2a 20 20 20 20  ing_func'.**    
15f0: 20 29 3b 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65   );.*/..#include
1600: 20 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a   "sqlite3ext.h".
1610: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
1620: 5f 49 4e 49 54 31 0a 23 69 6e 63 6c 75 64 65 20  _INIT1.#include 
1630: 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c  <assert.h>.#incl
1640: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
1650: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
1660: 68 3e 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h>..#ifndef SQLI
1670: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1680: 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 4c 61 72 67  ABLE../*.** Larg
1690: 65 73 74 20 61 6e 64 20 73 6d 61 6c 6c 65 73 74  est and smallest
16a0: 20 70 6f 73 73 69 62 6c 65 20 36 34 2d 62 69 74   possible 64-bit
16b0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73   signed integers
16c0: 2e 20 54 68 65 73 65 20 6d 61 63 72 6f 73 0a 2a  . These macros.*
16d0: 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 71  * copied from sq
16e0: 6c 69 74 65 49 6e 74 2e 68 2e 0a 2a 2f 0a 23 69  liteInt.h..*/.#i
16f0: 66 6e 64 65 66 20 4c 41 52 47 45 53 54 5f 49 4e  fndef LARGEST_IN
1700: 54 36 34 0a 23 20 64 65 66 69 6e 65 20 4c 41 52  T64.# define LAR
1710: 47 45 53 54 5f 49 4e 54 36 34 20 20 28 30 78 66  GEST_INT64  (0xf
1720: 66 66 66 66 66 66 66 7c 28 28 28 73 71 6c 69 74  fffffff|(((sqlit
1730: 65 33 5f 69 6e 74 36 34 29 30 78 37 66 66 66 66  e3_int64)0x7ffff
1740: 66 66 66 29 3c 3c 33 32 29 29 0a 23 65 6e 64 69  fff)<<32)).#endi
1750: 66 0a 23 69 66 6e 64 65 66 20 53 4d 41 4c 4c 45  f.#ifndef SMALLE
1760: 53 54 5f 49 4e 54 36 34 0a 23 20 64 65 66 69 6e  ST_INT64.# defin
1770: 65 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  e SMALLEST_INT64
1780: 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   (((sqlite3_int6
1790: 34 29 2d 31 29 20 2d 20 4c 41 52 47 45 53 54 5f  4)-1) - LARGEST_
17a0: 49 4e 54 36 34 29 0a 23 65 6e 64 69 66 0a 0a 2f  INT64).#endif../
17b0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
17c0: 6e 67 20 69 73 20 61 6c 73 6f 20 63 6f 70 69 65  ng is also copie
17d0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 49 6e 74  d from sqliteInt
17e0: 2e 68 2e 20 54 6f 20 66 61 63 69 6c 69 74 61 74  .h. To facilitat
17f0: 65 20 63 6f 76 65 72 61 67 65 0a 2a 2a 20 74 65  e coverage.** te
1800: 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65  sting..*/.#ifnde
1810: 66 20 41 4c 57 41 59 53 0a 23 20 69 66 20 64 65  f ALWAYS.# if de
1820: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56  fined(SQLITE_COV
1830: 45 52 41 47 45 5f 54 45 53 54 29 20 7c 7c 20 64  ERAGE_TEST) || d
1840: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 55  efined(SQLITE_MU
1850: 54 41 54 49 4f 4e 5f 54 45 53 54 29 0a 23 20 20  TATION_TEST).#  
1860: 64 65 66 69 6e 65 20 41 4c 57 41 59 53 28 58 29  define ALWAYS(X)
1870: 20 20 20 20 20 20 28 31 29 0a 23 20 20 64 65 66        (1).#  def
1880: 69 6e 65 20 4e 45 56 45 52 28 58 29 20 20 20 20  ine NEVER(X)    
1890: 20 20 20 28 30 29 0a 23 20 65 6c 69 66 20 21 64     (0).# elif !d
18a0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 23  efined(NDEBUG).#
18b0: 20 20 64 65 66 69 6e 65 20 41 4c 57 41 59 53 28    define ALWAYS(
18c0: 58 29 20 20 20 20 20 20 28 28 58 29 3f 31 3a 28  X)      ((X)?1:(
18d0: 61 73 73 65 72 74 28 30 29 2c 30 29 29 0a 23 20  assert(0),0)).# 
18e0: 20 64 65 66 69 6e 65 20 4e 45 56 45 52 28 58 29   define NEVER(X)
18f0: 20 20 20 20 20 20 20 28 28 58 29 3f 28 61 73 73         ((X)?(ass
1900: 65 72 74 28 30 29 2c 31 29 3a 30 29 0a 23 20 65  ert(0),1):0).# e
1910: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 41 4c  lse.#  define AL
1920: 57 41 59 53 28 58 29 20 20 20 20 20 20 28 58 29  WAYS(X)      (X)
1930: 0a 23 20 20 64 65 66 69 6e 65 20 4e 45 56 45 52  .#  define NEVER
1940: 28 58 29 20 20 20 20 20 20 20 28 58 29 0a 23 20  (X)       (X).# 
1950: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
1960: 0a 2a 2a 20 54 68 65 20 73 77 61 72 6d 76 74 61  .** The swarmvta
1970: 62 20 6d 6f 64 75 6c 65 20 61 74 74 65 6d 70 74  b module attempt
1980: 73 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6e 75  s to keep the nu
1990: 6d 62 65 72 20 6f 66 20 6f 70 65 6e 20 64 61 74  mber of open dat
19a0: 61 62 61 73 65 20 66 69 6c 65 73 0a 2a 2a 20 61  abase files.** a
19b0: 74 20 6f 72 20 62 65 6c 6f 77 20 74 68 69 73 20  t or below this 
19c0: 6c 69 6d 69 74 2e 20 54 68 69 73 20 6d 61 79 20  limit. This may 
19d0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
19e0: 69 66 20 74 68 65 72 65 20 61 72 65 20 74 6f 6f  if there are too
19f0: 20 6d 61 6e 79 0a 2a 2a 20 73 69 6d 75 6c 74 61   many.** simulta
1a00: 6e 65 6f 75 73 20 71 75 65 72 69 65 73 2e 0a 2a  neous queries..*
1a10: 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 52 4d 56  /.#define SWARMV
1a20: 54 41 42 5f 4d 41 58 5f 4f 50 45 4e 20 39 0a 0a  TAB_MAX_OPEN 9..
1a30: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55  typedef struct U
1a40: 6e 69 6f 6e 43 73 72 20 55 6e 69 6f 6e 43 73 72  nionCsr UnionCsr
1a50: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
1a60: 20 55 6e 69 6f 6e 54 61 62 20 55 6e 69 6f 6e 54   UnionTab UnionT
1a70: 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ab;.typedef stru
1a80: 63 74 20 55 6e 69 6f 6e 53 72 63 20 55 6e 69 6f  ct UnionSrc Unio
1a90: 6e 53 72 63 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  nSrc;../*.** Eac
1aa0: 68 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 28  h source table (
1ab0: 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20  row returned by 
1ac0: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
1ad0: 6f 6e 20 71 75 65 72 79 29 20 69 73 20 0a 2a 2a  on query) is .**
1ae0: 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
1af0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1b00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1b10: 75 63 74 75 72 65 20 73 74 6f 72 65 64 20 69 6e  ucture stored in
1b20: 20 74 68 65 0a 2a 2a 20 55 6e 69 6f 6e 54 61 62   the.** UnionTab
1b30: 2e 61 53 72 63 5b 5d 20 61 72 72 61 79 2e 0a 2a  .aSrc[] array..*
1b40: 2f 0a 73 74 72 75 63 74 20 55 6e 69 6f 6e 53 72  /.struct UnionSr
1b50: 63 20 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  c {.  char *zDb;
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1b80: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 6f 75  e containing sou
1b90: 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  rce table */.  c
1ba0: 68 61 72 20 2a 7a 54 61 62 3b 20 20 20 20 20 20  har *zTab;      
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc0: 2a 20 53 6f 75 72 63 65 20 74 61 62 6c 65 20 6e  * Source table n
1bd0: 61 6d 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ame */.  sqlite3
1be0: 5f 69 6e 74 36 34 20 69 4d 69 6e 3b 20 20 20 20  _int64 iMin;    
1bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69           /* Mini
1c00: 6d 75 6d 20 72 6f 77 69 64 20 2a 2f 0a 20 20 73  mum rowid */.  s
1c10: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4d 61  qlite3_int64 iMa
1c20: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  x;             /
1c30: 2a 20 4d 61 78 69 6d 75 6d 20 72 6f 77 69 64 20  * Maximum rowid 
1c40: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 65 6c 64 73 20  */..  /* Fields 
1c50: 75 73 65 64 20 62 79 20 73 77 61 72 6d 76 74 61  used by swarmvta
1c60: 62 20 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72  b only */.  char
1c70: 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20   *zFile;        
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1c90: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 6f 6e  atabase file con
1ca0: 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 20 7a 54  taining table zT
1cb0: 61 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ab */.  char *zC
1cc0: 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20  ontext;         
1cd0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
1ce0: 78 74 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  xt string, if an
1cf0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65 72  y */.  int nUser
1d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d10: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1d20: 74 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  t number of user
1d30: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
1d40: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
1d50: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1d60: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 55  se handle */.  U
1d70: 6e 69 6f 6e 53 72 63 20 2a 70 4e 65 78 74 43 6c  nionSrc *pNextCl
1d80: 6f 73 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f  osable;        /
1d90: 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f  * Next in list o
1da0: 66 20 63 6c 6f 73 61 62 6c 65 20 73 6f 75 72 63  f closable sourc
1db0: 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  es */.};../*.** 
1dc0: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 20 74  Virtual table  t
1dd0: 79 70 65 20 66 6f 72 20 75 6e 69 6f 6e 20 76 74  ype for union vt
1de0: 61 62 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e  ab..*/.struct Un
1df0: 69 6f 6e 54 61 62 20 7b 0a 20 20 73 71 6c 69 74  ionTab {.  sqlit
1e00: 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20 20  e3_vtab base;   
1e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
1e20: 73 65 20 63 6c 61 73 73 20 2d 20 6d 75 73 74 20  se class - must 
1e30: 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71  be first */.  sq
1e40: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e60: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
1e70: 20 2a 2f 0a 20 20 69 6e 74 20 62 53 77 61 72 6d   */.  int bSwarm
1e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e90: 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 22        /* 1 for "
1ea0: 73 77 61 72 6d 76 74 61 62 22 2c 20 30 20 66 6f  swarmvtab", 0 fo
1eb0: 72 20 22 75 6e 69 6f 6e 76 74 61 62 22 20 2a 2f  r "unionvtab" */
1ec0: 0a 20 20 69 6e 74 20 69 50 4b 3b 20 20 20 20 20  .  int iPK;     
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 20 2f 2a 20 49 4e 54 45 47 45 52 20 50 52     /* INTEGER PR
1ef0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
1f00: 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 69 6e 74  , or -1 */.  int
1f10: 20 6e 53 72 63 3b 20 20 20 20 20 20 20 20 20 20   nSrc;          
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f30: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
1f40: 74 73 20 69 6e 20 74 68 65 20 61 53 72 63 5b 5d  ts in the aSrc[]
1f50: 20 61 72 72 61 79 20 2a 2f 0a 20 20 55 6e 69 6f   array */.  Unio
1f60: 6e 53 72 63 20 2a 61 53 72 63 3b 20 20 20 20 20  nSrc *aSrc;     
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1f80: 72 72 61 79 20 6f 66 20 73 6f 75 72 63 65 20 74  rray of source t
1f90: 61 62 6c 65 73 2c 20 73 6f 72 74 65 64 20 62 79  ables, sorted by
1fa0: 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 2f 2a 20   rowid */..  /* 
1fb0: 55 73 65 64 20 62 79 20 73 77 61 72 6d 76 74 61  Used by swarmvta
1fc0: 62 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  b only */.  int 
1fd0: 62 48 61 73 43 6f 6e 74 65 78 74 3b 20 20 20 20  bHasContext;    
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
1ff0: 61 73 20 63 6f 6e 74 65 78 74 20 73 74 72 69 6e  as context strin
2000: 67 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  gs */.  char *zS
2010: 6f 75 72 63 65 53 74 72 3b 20 20 20 20 20 20 20  ourceStr;       
2020: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
2030: 74 65 64 20 75 6e 69 6f 6e 53 6f 75 72 63 65 54  ted unionSourceT
2040: 6f 53 74 72 28 29 20 76 61 6c 75 65 20 2a 2f 0a  oStr() value */.
2050: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2060: 70 4e 6f 74 46 6f 75 6e 64 3b 20 20 20 20 20 20  pNotFound;      
2070: 20 20 2f 2a 20 55 44 46 20 74 6f 20 69 6e 76 6f    /* UDF to invo
2080: 6b 65 20 69 66 20 66 69 6c 65 20 6e 6f 74 20 66  ke if file not f
2090: 6f 75 6e 64 20 6f 6e 20 6f 70 65 6e 20 2a 2f 0a  ound on open */.
20a0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
20b0: 70 4f 70 65 6e 43 6c 6f 73 65 3b 20 20 20 20 20  pOpenClose;     
20c0: 20 20 2f 2a 20 55 44 46 20 74 6f 20 69 6e 76 6f    /* UDF to invo
20d0: 6b 65 20 6f 6e 20 6f 70 65 6e 20 61 6e 64 20 63  ke on open and c
20e0: 6c 6f 73 65 20 2a 2f 0a 0a 20 20 55 6e 69 6f 6e  lose */..  Union
20f0: 53 72 63 20 2a 70 43 6c 6f 73 61 62 6c 65 3b 20  Src *pClosable; 
2100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2110: 72 73 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 63  rst in list of c
2120: 6c 6f 73 61 62 6c 65 20 73 6f 75 72 63 65 73 20  losable sources 
2130: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 65 6e 3b 20  */.  int nOpen; 
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2160: 6e 75 6d 62 65 72 20 6f 66 20 6f 70 65 6e 20 73  number of open s
2170: 6f 75 72 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ources */.  int 
2180: 6e 4d 61 78 4f 70 65 6e 3b 20 20 20 20 20 20 20  nMaxOpen;       
2190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
21a0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
21b0: 20 6f 70 65 6e 20 73 6f 75 72 63 65 73 20 2a 2f   open sources */
21c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 69 72 74 75  .};../*.** Virtu
21d0: 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  al table cursor 
21e0: 74 79 70 65 20 66 6f 72 20 75 6e 69 6f 6e 20 76  type for union v
21f0: 74 61 62 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55  tab..*/.struct U
2200: 6e 69 6f 6e 43 73 72 20 7b 0a 20 20 73 71 6c 69  nionCsr {.  sqli
2210: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
2220: 62 61 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 42  base;       /* B
2230: 61 73 65 20 63 6c 61 73 73 20 2d 20 6d 75 73 74  ase class - must
2240: 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73   be first */.  s
2250: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2260: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  mt;            /
2270: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
2280: 74 6f 20 72 75 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  to run */..  /* 
2290: 55 73 65 64 20 62 79 20 73 77 61 72 6d 76 74 61  Used by swarmvta
22a0: 62 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c 69  b only */.  sqli
22b0: 74 65 33 5f 69 6e 74 36 34 20 69 4d 61 78 52 6f  te3_int64 iMaxRo
22c0: 77 69 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  wid;        /* L
22d0: 61 73 74 20 72 6f 77 69 64 20 74 6f 20 76 69 73  ast rowid to vis
22e0: 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  it */.  int iTab
22f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2300: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2310: 20 6f 66 20 74 61 62 6c 65 20 72 65 61 64 20 62   of table read b
2320: 79 20 70 53 74 6d 74 20 2a 2f 0a 7d 3b 0a 0a 2f  y pStmt */.};../
2330: 2a 0a 2a 2a 20 47 69 76 65 6e 20 55 6e 69 6f 6e  *.** Given Union
2340: 54 61 62 20 74 61 62 6c 65 20 70 54 61 62 20 61  Tab table pTab a
2350: 6e 64 20 55 6e 69 6f 6e 53 72 63 20 6f 62 6a 65  nd UnionSrc obje
2360: 63 74 20 70 53 72 63 2c 20 72 65 74 75 72 6e 20  ct pSrc, return 
2370: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
2380: 68 61 6e 64 6c 65 20 74 68 61 74 20 73 68 6f 75  handle that shou
2390: 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  ld be used to ac
23a0: 63 65 73 73 20 74 68 65 20 74 61 62 6c 65 20 69  cess the table i
23b0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 53 72  dentified by pSr
23c0: 63 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 74 68  c. This.** is th
23d0: 65 20 6d 61 69 6e 20 64 62 20 68 61 6e 64 6c 65  e main db handle
23e0: 20 66 6f 72 20 22 75 6e 69 6f 6e 76 74 61 62 22   for "unionvtab"
23f0: 20 74 61 62 6c 65 73 2c 20 6f 72 20 74 68 65 20   tables, or the 
2400: 73 6f 75 72 63 65 2d 73 70 65 63 69 66 69 63 20  source-specific 
2410: 0a 2a 2a 20 68 61 6e 64 6c 65 20 66 6f 72 20 22  .** handle for "
2420: 73 77 61 72 6d 76 74 61 62 22 2e 0a 2a 2f 0a 23  swarmvtab"..*/.#
2430: 64 65 66 69 6e 65 20 75 6e 69 6f 6e 47 65 74 44  define unionGetD
2440: 62 28 70 54 61 62 2c 20 70 53 72 63 29 20 28 28  b(pTab, pSrc) ((
2450: 70 54 61 62 29 2d 3e 62 53 77 61 72 6d 20 3f 20  pTab)->bSwarm ? 
2460: 28 70 53 72 63 29 2d 3e 64 62 20 3a 20 28 70 54  (pSrc)->db : (pT
2470: 61 62 29 2d 3e 64 62 29 0a 0a 2f 2a 0a 2a 2a 20  ab)->db)../*.** 
2480: 49 66 20 2a 70 52 63 20 69 73 20 6f 74 68 65 72  If *pRc is other
2490: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
24a0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
24b0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
24c0: 0a 2a 2a 20 61 6c 77 61 79 73 20 72 65 74 75 72  .** always retur
24d0: 6e 73 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69  ns NULL. Otherwi
24e0: 73 65 2c 20 69 74 20 61 74 74 65 6d 70 74 73 20  se, it attempts 
24f0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
2500: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
2510: 74 65 72 20 74 6f 20 6e 42 79 74 65 20 62 79 74  ter to nByte byt
2520: 65 73 20 6f 66 20 7a 65 72 6f 65 64 20 6d 65 6d  es of zeroed mem
2530: 6f 72 79 2e 20 49 66 20 74 68 65 20 6d 65 6d 6f  ory. If the memo
2540: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
2550: 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 62 75   is attempted bu
2560: 74 20 66 61 69 6c 73 2c 20 4e 55 4c 4c 20 69 73  t fails, NULL is
2570: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
2580: 52 63 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  Rc is set to .**
2590: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
25a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75  /.static void *u
25b0: 6e 69 6f 6e 4d 61 6c 6c 6f 63 28 69 6e 74 20 2a  nionMalloc(int *
25c0: 70 52 63 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  pRc, int nByte){
25d0: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
25e0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 30   assert( nByte>0
25f0: 20 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   );.  if( *pRc==
2600: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2610: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f   pRet = sqlite3_
2620: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
2630: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
2640: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74       memset(pRet
2650: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
2660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
2670: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
2680: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  M;.    }.  }else
2690: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
26a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
26b0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a  t;.}../*.** If *
26c0: 70 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61  pRc is other tha
26d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  n SQLITE_OK when
26e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26f0: 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
2700: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 4e  always returns N
2710: 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ULL. Otherwise, 
2720: 69 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 61  it attempts to a
2730: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
2740: 72 6e 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20  rn.** a copy of 
2750: 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  the nul-terminat
2760: 65 64 20 73 74 72 69 6e 67 20 70 61 73 73 65 64  ed string passed
2770: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2780: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74  rgument..** If t
2790: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
27a0: 20 61 74 74 65 6d 70 74 65 64 20 62 75 74 20 66   attempted but f
27b0: 61 69 6c 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  ails, NULL is re
27c0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 52 63 20  turned and *pRc 
27d0: 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f 20 53 51  is .** set to SQ
27e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73  LITE_NOMEM..*/.s
27f0: 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69 6f  tatic char *unio
2800: 6e 53 74 72 64 75 70 28 69 6e 74 20 2a 70 52 63  nStrdup(int *pRc
2810: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
2820: 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74  n){.  char *zRet
2830: 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 49 6e 20   = 0;.  if( zIn 
2840: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
2850: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
2860: 49 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7a 52 65  In) + 1;.    zRe
2870: 74 20 3d 20 75 6e 69 6f 6e 4d 61 6c 6c 6f 63 28  t = unionMalloc(
2880: 70 52 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  pRc, nByte);.   
2890: 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20   if( zRet ){.   
28a0: 20 20 20 6d 65 6d 63 70 79 28 7a 52 65 74 2c 20     memcpy(zRet, 
28b0: 7a 49 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  zIn, nByte);.   
28c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
28d0: 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  zRet;.}../*.** I
28e0: 66 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  f the first char
28f0: 61 63 74 65 72 20 6f 66 20 74 68 65 20 73 74 72  acter of the str
2900: 69 6e 67 20 70 61 73 73 65 64 20 61 73 20 74 68  ing passed as th
2910: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
2920: 74 6f 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  to this.** funct
2930: 69 6f 6e 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  ion is one of th
2940: 65 20 34 20 74 68 61 74 20 6d 61 79 20 62 65 20  e 4 that may be 
2950: 75 73 65 64 20 61 73 20 61 6e 20 6f 70 65 6e 20  used as an open 
2960: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 0a  quote character.
2970: 2a 2a 20 69 6e 20 53 51 4c 2c 20 74 68 69 73 20  ** in SQL, this 
2980: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
2990: 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
29a0: 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  is a well-formed
29b0: 20 71 75 6f 74 65 64 20 53 51 4c 20 0a 2a 2a 20   quoted SQL .** 
29c0: 73 74 72 69 6e 67 2e 20 49 6e 20 74 68 69 73 20  string. In this 
29d0: 63 61 73 65 20 74 68 65 20 73 74 72 69 6e 67 20  case the string 
29e0: 69 73 20 64 65 71 75 6f 74 65 64 20 69 6e 20 70  is dequoted in p
29f0: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lace..**.** If t
2a00: 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
2a10: 65 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  er of the input 
2a20: 69 73 20 6e 6f 74 20 61 6e 20 6f 70 65 6e 20 71  is not an open q
2a30: 75 6f 74 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  uote, then this.
2a40: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
2a50: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
2a60: 63 20 76 6f 69 64 20 75 6e 69 6f 6e 44 65 71 75  c void unionDequ
2a70: 6f 74 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ote(char *z){.  
2a80: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 68 61  if( z ){.    cha
2a90: 72 20 71 20 3d 20 7a 5b 30 5d 3b 0a 0a 20 20 20  r q = z[0];..   
2aa0: 20 2f 2a 20 53 65 74 20 73 74 61 63 6b 20 76 61   /* Set stack va
2ab0: 72 69 61 62 6c 65 20 71 20 74 6f 20 74 68 65 20  riable q to the 
2ac0: 63 6c 6f 73 65 2d 71 75 6f 74 65 20 63 68 61 72  close-quote char
2ad0: 61 63 74 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  acter */.    if(
2ae0: 20 71 3d 3d 27 5b 27 20 7c 7c 20 71 3d 3d 27 5c   q=='[' || q=='\
2af0: 27 27 20 7c 7c 20 71 3d 3d 27 22 27 20 7c 7c 20  '' || q=='"' || 
2b00: 71 3d 3d 27 60 27 20 29 7b 0a 20 20 20 20 20 20  q=='`' ){.      
2b10: 69 6e 74 20 69 49 6e 20 3d 20 31 3b 0a 20 20 20  int iIn = 1;.   
2b20: 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b     int iOut = 0;
2b30: 0a 20 20 20 20 20 20 69 66 28 20 71 3d 3d 27 5b  .      if( q=='[
2b40: 27 20 29 20 71 20 3d 20 27 5d 27 3b 20 20 0a 20  ' ) q = ']';  . 
2b50: 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
2b60: 59 53 28 7a 5b 69 49 6e 5d 29 20 29 7b 0a 20 20  YS(z[iIn]) ){.  
2b70: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 49 6e 5d        if( z[iIn]
2b80: 3d 3d 71 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==q ){.         
2b90: 20 69 66 28 20 7a 5b 69 49 6e 2b 31 5d 21 3d 71   if( z[iIn+1]!=q
2ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bb0: 2f 2a 20 43 68 61 72 61 63 74 65 72 20 69 49 6e  /* Character iIn
2bc0: 20 77 61 73 20 74 68 65 20 63 6c 6f 73 65 20 71   was the close q
2bd0: 75 6f 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  uote. */.       
2be0: 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20       iIn++;.    
2bf0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2c00: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2c20: 68 61 72 61 63 74 65 72 20 69 49 6e 20 61 6e 64  haracter iIn and
2c30: 20 69 49 6e 2b 31 20 66 6f 72 6d 20 61 6e 20 65   iIn+1 form an e
2c40: 73 63 61 70 65 64 20 71 75 6f 74 65 20 63 68 61  scaped quote cha
2c50: 72 61 63 74 65 72 2e 20 53 6b 69 70 0a 20 20 20  racter. Skip.   
2c60: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
2c70: 69 6e 70 75 74 20 63 75 72 73 6f 72 20 70 61 73  input cursor pas
2c80: 74 20 62 6f 74 68 20 61 6e 64 20 63 6f 70 79 20  t both and copy 
2c90: 61 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 20 63  a single quote c
2ca0: 68 61 72 61 63 74 65 72 20 0a 20 20 20 20 20 20  haracter .      
2cb0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
2cc0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 2a  output buffer. *
2cd0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49  /.            iI
2ce0: 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  n += 2;.        
2cf0: 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20 3d 20      z[iOut++] = 
2d00: 71 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  q;.          }. 
2d10: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d20: 20 20 20 20 20 20 20 20 7a 5b 69 4f 75 74 2b 2b          z[iOut++
2d30: 5d 20 3d 20 7a 5b 69 49 6e 2b 2b 5d 3b 0a 20 20  ] = z[iIn++];.  
2d40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2d50: 20 20 20 20 20 20 7a 5b 69 4f 75 74 5d 20 3d 20        z[iOut] = 
2d60: 27 5c 30 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  '\0';.    }.  }.
2d70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2d80: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2d90: 70 20 69 66 20 2a 70 52 63 20 69 73 20 73 65 74  p if *pRc is set
2da0: 20 74 6f 20 6f 74 68 65 72 20 74 68 61 6e 20 53   to other than S
2db0: 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 69 74  QLITE_OK when it
2dc0: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 4e  .** is called. N
2dd0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
2de0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
2df0: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74  .** Otherwise, t
2e00: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
2e10: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74   passed as the t
2e20: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
2e30: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 61 67 61   prepared.** aga
2e40: 69 6e 73 74 20 74 68 65 20 64 61 74 61 62 61 73  inst the databas
2e50: 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  e handle passed 
2e60: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 2e 20 49  as the second. I
2e70: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
2e80: 69 73 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  is.** successful
2e90: 6c 79 20 70 72 65 70 61 72 65 64 2c 20 61 20 70  ly prepared, a p
2ea0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
2eb0: 77 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  w statement hand
2ec0: 6c 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  le is .** return
2ed0: 65 64 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ed. It is the re
2ee0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
2ef0: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
2f00: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
2f10: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62  e.** statement b
2f20: 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
2f30: 33 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 20 41 6c  3_finalize(). Al
2f40: 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
2f50: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 6f 6d  statement.** com
2f60: 70 69 6c 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  pilation fails, 
2f70: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
2f80: 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  , *pRc is set to
2f90: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
2fa0: 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20 2a 70 7a  .** code and *pz
2fb0: 45 72 72 20 6d 61 79 20 62 65 20 73 65 74 20 74  Err may be set t
2fc0: 6f 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  o an error messa
2fd0: 67 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61  ge buffer alloca
2fe0: 74 65 64 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65  ted by.** sqlite
2ff0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  3_malloc()..*/.s
3000: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74  tatic sqlite3_st
3010: 6d 74 20 2a 75 6e 69 6f 6e 50 72 65 70 61 72 65  mt *unionPrepare
3020: 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
3050: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 73  rror code */.  s
3060: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3080: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
3090: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
30a0: 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
30b0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
30c0: 61 74 65 6d 65 6e 74 20 74 6f 20 70 72 65 70 61  atement to prepa
30d0: 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  re */.  char **p
30e0: 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  zErr            
30f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3100: 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  Error message */
3110: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
3120: 6d 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  mt *pRet = 0;.  
3130: 61 73 73 65 72 74 28 20 70 7a 45 72 72 20 29 3b  assert( pzErr );
3140: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
3150: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
3160: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70  t rc = sqlite3_p
3170: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
3180: 71 6c 2c 20 2d 31 2c 20 26 70 52 65 74 2c 20 30  ql, -1, &pRet, 0
3190: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31b0: 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
31c0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 73 71 6c 20  e3_mprintf("sql 
31d0: 65 72 72 6f 72 3a 20 25 73 22 2c 20 73 71 6c 69  error: %s", sqli
31e0: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
31f0: 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63  .      *pRc = rc
3200: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
3210: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
3220: 0a 2a 2a 20 4c 69 6b 65 20 75 6e 69 6f 6e 50 72  .** Like unionPr
3230: 65 70 61 72 65 28 29 2c 20 65 78 63 65 70 74 20  epare(), except 
3240: 70 72 65 70 61 72 65 20 74 68 65 20 72 65 73 75  prepare the resu
3250: 6c 74 73 20 6f 66 20 76 70 72 69 6e 74 66 28 7a  lts of vprintf(z
3260: 46 6d 74 2c 20 2e 2e 2e 29 0a 2a 2a 20 69 6e 73  Fmt, ...).** ins
3270: 74 65 61 64 20 6f 66 20 61 20 63 6f 6e 73 74 61  tead of a consta
3280: 6e 74 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a 2a  nt SQL string..*
3290: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
32a0: 5f 73 74 6d 74 20 2a 75 6e 69 6f 6e 50 72 65 70  _stmt *unionPrep
32b0: 61 72 65 50 72 69 6e 74 66 28 0a 20 20 69 6e 74  arePrintf(.  int
32c0: 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32e0: 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
32f0: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  de */.  char **p
3300: 7a 45 72 72 2c 20 20 20 20 20 20 20 20 20 20 20  zErr,           
3310: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3320: 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  Error message */
3330: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
3360: 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
3370: 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 20 20 20   char *zFmt,    
3380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 72             /* pr
3390: 69 6e 74 66 28 29 20 66 6f 72 6d 61 74 20 73 74  intf() format st
33a0: 72 69 6e 67 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20  ring */.  ...   
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61            /* Tra
33d0: 69 6c 69 6e 67 20 70 72 69 6e 74 66 20 61 72 67  iling printf arg
33e0: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
33f0: 33 5f 73 74 6d 74 20 2a 70 52 65 74 20 3d 20 30  3_stmt *pRet = 0
3400: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
3410: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
3420: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d  va_start(ap, zFm
3430: 74 29 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71  t);..  zSql = sq
3440: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
3450: 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66 28 20  Fmt, ap);.  if( 
3460: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
3470: 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  ){.    if( zSql=
3480: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  =0 ){.      *pRc
3490: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
34a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
34b0: 20 20 70 52 65 74 20 3d 20 75 6e 69 6f 6e 50 72    pRet = unionPr
34c0: 65 70 61 72 65 28 70 52 63 2c 20 64 62 2c 20 7a  epare(pRc, db, z
34d0: 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20  Sql, pzErr);.   
34e0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
34f0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 0a 20 20  _free(zSql);..  
3500: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
3510: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a 2f  turn pRet;.}.../
3520: 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
3530: 33 5f 72 65 73 65 74 28 29 20 6f 6e 20 53 51 4c  3_reset() on SQL
3540: 20 73 74 61 74 65 6d 65 6e 74 20 70 53 74 6d 74   statement pStmt
3550: 2e 20 49 66 20 2a 70 52 63 20 69 73 20 73 65 74  . If *pRc is set
3560: 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   to .** SQLITE_O
3570: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
3580: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
3590: 74 68 65 6e 20 69 74 20 69 73 20 73 65 74 20 74  then it is set t
35a0: 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 72  o the.** value r
35b0: 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
35c0: 65 33 5f 72 65 73 65 74 28 29 20 62 65 66 6f 72  e3_reset() befor
35d0: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
35e0: 65 78 69 74 73 2e 0a 2a 2a 20 49 6e 20 74 68 69  exits..** In thi
35f0: 73 20 63 61 73 65 2c 20 2a 70 7a 45 72 72 20 6d  s case, *pzErr m
3600: 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69  ay be set to poi
3610: 6e 74 20 74 6f 20 61 6e 20 65 72 72 6f 72 20 6d  nt to an error m
3620: 65 73 73 61 67 65 0a 2a 2a 20 62 75 66 66 65 72  essage.** buffer
3630: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 73 71   allocated by sq
3640: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
3650: 2a 2f 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20  */.#if 0.static 
3660: 76 6f 69 64 20 75 6e 69 6f 6e 52 65 73 65 74 28  void unionReset(
3670: 69 6e 74 20 2a 70 52 63 2c 20 73 71 6c 69 74 65  int *pRc, sqlite
3680: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63  3_stmt *pStmt, c
3690: 68 61 72 20 2a 2a 70 7a 45 72 72 29 7b 0a 20 20  har **pzErr){.  
36a0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
36b0: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
36c0: 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
36d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63  E_OK ){.    *pRc
36e0: 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20 72   = rc;.    if( r
36f0: 63 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72  c ){.      *pzEr
3700: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
3710: 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
3720: 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33  3_errmsg(sqlite3
3730: 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74  _db_handle(pStmt
3740: 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  )));.    }.  }.}
3750: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
3760: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  all sqlite3_fina
3770: 6c 69 7a 65 28 29 20 6f 6e 20 53 51 4c 20 73 74  lize() on SQL st
3780: 61 74 65 6d 65 6e 74 20 70 53 74 6d 74 2e 20 49  atement pStmt. I
3790: 66 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  f *pRc is set to
37a0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 77   .** SQLITE_OK w
37b0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
37c0: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
37d0: 6e 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 74  n it is set to t
37e0: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75  he.** value retu
37f0: 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  rned by sqlite3_
3800: 66 69 6e 61 6c 69 7a 65 28 29 20 62 65 66 6f 72  finalize() befor
3810: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
3820: 65 78 69 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  exits..*/.static
3830: 20 76 6f 69 64 20 75 6e 69 6f 6e 46 69 6e 61 6c   void unionFinal
3840: 69 7a 65 28 69 6e 74 20 2a 70 52 63 2c 20 73 71  ize(int *pRc, sq
3850: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
3860: 74 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 29  t, char **pzErr)
3870: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
3880: 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  = sqlite3_db_han
3890: 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 6e  dle(pStmt);.  in
38a0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66  t rc = sqlite3_f
38b0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
38c0: 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
38d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
38e0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20  c = rc;.    if( 
38f0: 72 63 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45  rc ){.      *pzE
3900: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
3910: 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
3920: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
3930: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
3940: 2a 2a 20 49 66 20 61 6e 20 22 6f 70 65 6e 63 6c  ** If an "opencl
3950: 6f 73 65 22 20 55 44 46 20 77 61 73 20 73 75 70  ose" UDF was sup
3960: 70 6c 69 65 64 20 77 68 65 6e 20 74 68 69 73 20  plied when this 
3970: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 61  virtual table wa
3980: 73 20 63 72 65 61 74 65 64 2c 0a 2a 2a 20 69 6e  s created,.** in
3990: 76 6f 6b 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  voke it now. The
39a0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
39b0: 70 61 73 73 65 64 20 69 73 20 74 68 65 20 6e 61  passed is the na
39c0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
39d0: 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 73  se.** file for s
39e0: 6f 75 72 63 65 20 70 53 72 63 2e 20 54 68 65 20  ource pSrc. The 
39f0: 73 65 63 6f 6e 64 20 69 73 20 69 6e 74 65 67 65  second is intege
3a00: 72 20 76 61 6c 75 65 20 62 43 6c 6f 73 65 2e 0a  r value bClose..
3a10: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
3a20: 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ful, return SQLI
3a30: 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
3a40: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
3a50: 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 0a 2a   code. In this.*
3a60: 2a 20 63 61 73 65 20 69 66 20 61 72 67 75 6d 65  * case if argume
3a70: 6e 74 20 70 7a 45 72 72 20 69 73 20 6e 6f 74 20  nt pzErr is not 
3a80: 4e 55 4c 4c 2c 20 61 6c 73 6f 20 73 65 74 20 28  NULL, also set (
3a90: 2a 70 7a 45 72 72 29 20 74 6f 20 61 6e 20 45 6e  *pzErr) to an En
3aa0: 67 6c 69 73 68 0a 2a 2a 20 6c 61 6e 67 75 61 67  glish.** languag
3ab0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
3ac0: 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
3ad0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
3ae0: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 69 6e  ventually freein
3af0: 67 20 0a 2a 2a 20 61 6e 79 20 65 72 72 6f 72 20  g .** any error 
3b00: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
3b10: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
3b20: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 6f  .static int unio
3b30: 6e 49 6e 76 6f 6b 65 4f 70 65 6e 43 6c 6f 73 65  nInvokeOpenClose
3b40: 28 0a 20 20 55 6e 69 6f 6e 54 61 62 20 2a 70 54  (.  UnionTab *pT
3b50: 61 62 2c 20 0a 20 20 55 6e 69 6f 6e 53 72 63 20  ab, .  UnionSrc 
3b60: 2a 70 53 72 63 2c 20 0a 20 20 69 6e 74 20 62 43  *pSrc, .  int bC
3b70: 6c 6f 73 65 2c 0a 20 20 63 68 61 72 20 2a 2a 70  lose,.  char **p
3b80: 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zErr.){.  int rc
3b90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3ba0: 69 66 28 20 70 54 61 62 2d 3e 70 4f 70 65 6e 43  if( pTab->pOpenC
3bb0: 6c 6f 73 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  lose ){.    sqli
3bc0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54  te3_bind_text(pT
3bd0: 61 62 2d 3e 70 4f 70 65 6e 43 6c 6f 73 65 2c 20  ab->pOpenClose, 
3be0: 31 2c 20 70 53 72 63 2d 3e 7a 46 69 6c 65 2c 20  1, pSrc->zFile, 
3bf0: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
3c00: 43 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  C);.    if( pTab
3c10: 2d 3e 62 48 61 73 43 6f 6e 74 65 78 74 20 29 7b  ->bHasContext ){
3c20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
3c30: 69 6e 64 5f 74 65 78 74 28 70 54 61 62 2d 3e 70  ind_text(pTab->p
3c40: 4f 70 65 6e 43 6c 6f 73 65 2c 20 32 2c 20 70 53  OpenClose, 2, pS
3c50: 72 63 2d 3e 7a 43 6f 6e 74 65 78 74 2c 20 2d 31  rc->zContext, -1
3c60: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
3c70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
3c80: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 54 61  te3_bind_int(pTa
3c90: 62 2d 3e 70 4f 70 65 6e 43 6c 6f 73 65 2c 20 32  b->pOpenClose, 2
3ca0: 2b 70 54 61 62 2d 3e 62 48 61 73 43 6f 6e 74 65  +pTab->bHasConte
3cb0: 78 74 2c 20 62 43 6c 6f 73 65 29 3b 0a 20 20 20  xt, bClose);.   
3cc0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54   sqlite3_step(pT
3cd0: 61 62 2d 3e 70 4f 70 65 6e 43 6c 6f 73 65 29 3b  ab->pOpenClose);
3ce0: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
3cf0: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
3d00: 33 5f 72 65 73 65 74 28 70 54 61 62 2d 3e 70 4f  3_reset(pTab->pO
3d10: 70 65 6e 43 6c 6f 73 65 29 29 20 29 7b 0a 20 20  penClose)) ){.  
3d20: 20 20 20 20 69 66 28 20 70 7a 45 72 72 20 29 7b      if( pzErr ){
3d30: 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20  .        *pzErr 
3d40: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3d50: 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
3d60: 65 72 72 6d 73 67 28 70 54 61 62 2d 3e 64 62 29  errmsg(pTab->db)
3d70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3d80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3d90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3da0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
3db0: 2d 6f 70 20 66 6f 72 20 75 6e 69 6f 6e 76 74 61  -op for unionvta
3dc0: 62 2e 20 46 6f 72 20 73 77 61 72 6d 76 74 61 62  b. For swarmvtab
3dd0: 2c 20 69 74 20 61 74 74 65 6d 70 74 73 20 74 6f  , it attempts to
3de0: 0a 2a 2a 20 63 6c 6f 73 65 20 6f 70 65 6e 20 64  .** close open d
3df0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 75 6e  atabase files un
3e00: 74 69 6c 20 61 74 20 6d 6f 73 74 20 6e 4d 61 78  til at most nMax
3e10: 20 61 72 65 20 6f 70 65 6e 2e 20 41 6e 20 53 51   are open. An SQ
3e20: 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
3e30: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
3e40: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
3e50: 73 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 20  s, or SQLITE_OK 
3e60: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
3e70: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 6f 6e 43  atic void unionC
3e80: 6c 6f 73 65 53 6f 75 72 63 65 73 28 55 6e 69 6f  loseSources(Unio
3e90: 6e 54 61 62 20 2a 70 54 61 62 2c 20 69 6e 74 20  nTab *pTab, int 
3ea0: 6e 4d 61 78 29 7b 0a 20 20 77 68 69 6c 65 28 20  nMax){.  while( 
3eb0: 70 54 61 62 2d 3e 70 43 6c 6f 73 61 62 6c 65 20  pTab->pClosable 
3ec0: 26 26 20 70 54 61 62 2d 3e 6e 4f 70 65 6e 3e 6e  && pTab->nOpen>n
3ed0: 4d 61 78 20 29 7b 0a 20 20 20 20 55 6e 69 6f 6e  Max ){.    Union
3ee0: 53 72 63 20 2a 70 3b 0a 20 20 20 20 55 6e 69 6f  Src *p;.    Unio
3ef0: 6e 53 72 63 20 2a 2a 70 70 3b 0a 20 20 20 20 66  nSrc **pp;.    f
3f00: 6f 72 28 70 70 3d 26 70 54 61 62 2d 3e 70 43 6c  or(pp=&pTab->pCl
3f10: 6f 73 61 62 6c 65 3b 20 28 2a 70 70 29 2d 3e 70  osable; (*pp)->p
3f20: 4e 65 78 74 43 6c 6f 73 61 62 6c 65 3b 20 70 70  NextClosable; pp
3f30: 3d 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 43 6c  =&(*pp)->pNextCl
3f40: 6f 73 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  osable);.    p =
3f50: 20 2a 70 70 3b 0a 20 20 20 20 61 73 73 65 72 74   *pp;.    assert
3f60: 28 20 70 2d 3e 64 62 20 29 3b 0a 20 20 20 20 73  ( p->db );.    s
3f70: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
3f80: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
3f90: 20 30 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b   0;.    *pp = 0;
3fa0: 0a 20 20 20 20 70 54 61 62 2d 3e 6e 4f 70 65 6e  .    pTab->nOpen
3fb0: 2d 2d 3b 0a 20 20 20 20 75 6e 69 6f 6e 49 6e 76  --;.    unionInv
3fc0: 6f 6b 65 4f 70 65 6e 43 6c 6f 73 65 28 70 54 61  okeOpenClose(pTa
3fd0: 62 2c 20 70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  b, p, 1, 0);.  }
3fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 44 69 73 63 6f  .}../*.** xDisco
3ff0: 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f  nnect method..*/
4000: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 6f  .static int unio
4010: 6e 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69  nDisconnect(sqli
4020: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
4030: 7b 0a 20 20 69 66 28 20 70 56 74 61 62 20 29 7b  {.  if( pVtab ){
4040: 0a 20 20 20 20 55 6e 69 6f 6e 54 61 62 20 2a 70  .    UnionTab *p
4050: 54 61 62 20 3d 20 28 55 6e 69 6f 6e 54 61 62 2a  Tab = (UnionTab*
4060: 29 70 56 74 61 62 3b 0a 20 20 20 20 69 6e 74 20  )pVtab;.    int 
4070: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
4080: 69 3c 70 54 61 62 2d 3e 6e 53 72 63 3b 20 69 2b  i<pTab->nSrc; i+
4090: 2b 29 7b 0a 20 20 20 20 20 20 55 6e 69 6f 6e 53  +){.      UnionS
40a0: 72 63 20 2a 70 53 72 63 20 3d 20 26 70 54 61 62  rc *pSrc = &pTab
40b0: 2d 3e 61 53 72 63 5b 69 5d 3b 0a 20 20 20 20 20  ->aSrc[i];.     
40c0: 20 69 6e 74 20 62 48 61 76 65 53 72 63 44 62 20   int bHaveSrcDb 
40d0: 3d 20 28 70 53 72 63 2d 3e 64 62 21 3d 30 29 3b  = (pSrc->db!=0);
40e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
40f0: 6c 6f 73 65 28 70 53 72 63 2d 3e 64 62 29 3b 0a  lose(pSrc->db);.
4100: 20 20 20 20 20 20 69 66 28 20 62 48 61 76 65 53        if( bHaveS
4110: 72 63 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20  rcDb ){.        
4120: 75 6e 69 6f 6e 49 6e 76 6f 6b 65 4f 70 65 6e 43  unionInvokeOpenC
4130: 6c 6f 73 65 28 70 54 61 62 2c 20 70 53 72 63 2c  lose(pTab, pSrc,
4140: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
4150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
4160: 65 65 28 70 53 72 63 2d 3e 7a 44 62 29 3b 0a 20  ee(pSrc->zDb);. 
4170: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
4180: 65 28 70 53 72 63 2d 3e 7a 54 61 62 29 3b 0a 20  e(pSrc->zTab);. 
4190: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
41a0: 65 28 70 53 72 63 2d 3e 7a 46 69 6c 65 29 3b 0a  e(pSrc->zFile);.
41b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
41c0: 65 65 28 70 53 72 63 2d 3e 7a 43 6f 6e 74 65 78  ee(pSrc->zContex
41d0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
41e0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
41f0: 54 61 62 2d 3e 70 4e 6f 74 46 6f 75 6e 64 29 3b  Tab->pNotFound);
4200: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
4210: 61 6c 69 7a 65 28 70 54 61 62 2d 3e 70 4f 70 65  alize(pTab->pOpe
4220: 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 73 71 6c  nClose);.    sql
4230: 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d 3e  ite3_free(pTab->
4240: 7a 53 6f 75 72 63 65 53 74 72 29 3b 0a 20 20 20  zSourceStr);.   
4250: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
4260: 61 62 2d 3e 61 53 72 63 29 3b 0a 20 20 20 20 73  ab->aSrc);.    s
4270: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 62  qlite3_free(pTab
4280: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4290: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
42a0: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
42b0: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
42c0: 69 65 64 20 62 79 20 70 53 72 63 20 69 73 20 61  ied by pSrc is a
42d0: 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 20 49 66   rowid table. If
42e0: 20 6e 6f 74 2c 0a 2a 2a 20 72 65 74 75 72 6e 20   not,.** return 
42f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64  SQLITE_ERROR and
4300: 20 73 65 74 20 28 2a 70 7a 45 72 72 29 20 74 6f   set (*pzErr) to
4310: 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 45 6e 67   point to an Eng
4320: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 0a 2a 2a  lish language.**
4330: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
4340: 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  If the table is 
4350: 61 20 72 6f 77 69 64 20 74 61 62 6c 65 20 61 6e  a rowid table an
4360: 64 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  d no error occur
4370: 73 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  s,.** return SQL
4380: 49 54 45 5f 4f 4b 20 61 6e 64 20 6c 65 61 76 65  ITE_OK and leave
4390: 20 28 2a 70 7a 45 72 72 29 20 75 6e 6d 6f 64 69   (*pzErr) unmodi
43a0: 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
43b0: 69 6e 74 20 75 6e 69 6f 6e 49 73 49 6e 74 6b 65  int unionIsIntke
43c0: 79 54 61 62 6c 65 28 0a 20 20 73 71 6c 69 74 65  yTable(.  sqlite
43d0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
43e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
43f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
4400: 20 20 55 6e 69 6f 6e 53 72 63 20 2a 70 53 72 63    UnionSrc *pSrc
4410: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4420: 20 20 2f 2a 20 53 6f 75 72 63 65 20 74 61 62 6c    /* Source tabl
4430: 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 63  e to test */.  c
4440: 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20  har **pzErr     
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4460: 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73  * OUT: Error mes
4470: 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  sage */.){.  int
4480: 20 62 50 6b 20 3d 20 30 3b 0a 20 20 63 6f 6e 73   bPk = 0;.  cons
4490: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
44a0: 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  0;.  int rc;..  
44b0: 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
44c0: 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
44d0: 20 20 20 20 20 64 62 2c 20 70 53 72 63 2d 3e 7a       db, pSrc->z
44e0: 44 62 2c 20 70 53 72 63 2d 3e 7a 54 61 62 2c 20  Db, pSrc->zTab, 
44f0: 22 5f 72 6f 77 69 64 5f 22 2c 20 26 7a 54 79 70  "_rowid_", &zTyp
4500: 65 2c 20 30 2c 20 30 2c 20 26 62 50 6b 2c 20 30  e, 0, 0, &bPk, 0
4510: 0a 20 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  .  );.  rc = sql
4520: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
4530: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
4540: 54 45 5f 45 52 52 4f 52 20 0a 20 20 20 7c 7c 20  TE_ERROR .   || 
4550: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  (rc==SQLITE_OK &
4560: 26 20 28 21 62 50 6b 20 7c 7c 20 73 71 6c 69 74  & (!bPk || sqlit
4570: 65 33 5f 73 74 72 69 63 6d 70 28 22 69 6e 74 65  e3_stricmp("inte
4580: 67 65 72 22 2c 20 7a 54 79 70 65 29 29 29 0a 20  ger", zType))). 
4590: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
45a0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 2a  ITE_ERROR;.    *
45b0: 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
45c0: 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
45d0: 20 72 6f 77 69 64 20 74 61 62 6c 65 3a 20 25 73   rowid table: %s
45e0: 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 28  %s%s",.        (
45f0: 70 53 72 63 2d 3e 7a 44 62 20 3f 20 70 53 72 63  pSrc->zDb ? pSrc
4600: 2d 3e 7a 44 62 20 3a 20 22 22 29 2c 0a 20 20 20  ->zDb : ""),.   
4610: 20 20 20 20 20 28 70 53 72 63 2d 3e 7a 44 62 20       (pSrc->zDb 
4620: 3f 20 22 2e 22 20 3a 20 22 22 29 2c 0a 20 20 20  ? "." : ""),.   
4630: 20 20 20 20 20 70 53 72 63 2d 3e 7a 54 61 62 0a       pSrc->zTab.
4640: 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74      );.  }.  ret
4650: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4660: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4670: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 2a 70 52  s a no-op if *pR
4680: 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20  c is other than 
4690: 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 69  SQLITE_OK when i
46a0: 74 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2e 20  t is.** called. 
46b0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
46c0: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
46d0: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74  .** Otherwise, t
46e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
46f0: 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 6f 75  cks that the sou
4700: 72 63 65 20 74 61 62 6c 65 20 70 61 73 73 65 64  rce table passed
4710: 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e   as the.** secon
4720: 64 20 61 72 67 75 6d 65 6e 74 20 28 61 29 20 65  d argument (a) e
4730: 78 69 73 74 73 2c 20 28 62 29 20 69 73 20 6e 6f  xists, (b) is no
4740: 74 20 61 20 76 69 65 77 20 61 6e 64 20 28 63 29  t a view and (c)
4750: 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 0a 2a   has a column .*
4760: 2a 20 6e 61 6d 65 64 20 22 5f 72 6f 77 69 64 5f  * named "_rowid_
4770: 22 20 6f 66 20 74 79 70 65 20 22 69 6e 74 65 67  " of type "integ
4780: 65 72 22 20 74 68 61 74 20 69 73 20 74 68 65 20  er" that is the 
4790: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 20  primary key..** 
47a0: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
47b0: 68 65 20 63 61 73 65 2c 20 2a 70 52 63 20 69 73  he case, *pRc is
47c0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 45   set to SQLITE_E
47d0: 52 52 4f 52 20 61 6e 64 20 4e 55 4c 4c 20 69 73  RROR and NULL is
47e0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
47f0: 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
4800: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
4810: 20 70 61 73 73 65 73 20 74 68 65 20 63 68 65 63   passes the chec
4820: 6b 73 20 61 62 6f 76 65 2c 20 61 20 6e 75 6c 2d  ks above, a nul-
4830: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 73 74  terminated.** st
4840: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20  ring describing 
4850: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
4860: 20 61 6e 64 20 74 79 70 65 73 20 62 65 6c 6f 6e   and types belon
4870: 67 69 6e 67 20 74 6f 20 74 68 65 20 73 6f 75 72  ging to the sour
4880: 63 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 72  ce.** table is r
4890: 65 74 75 72 6e 65 64 2e 20 54 61 62 6c 65 73 20  eturned. Tables 
48a0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 73 65  with the same se
48b0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  t of column name
48c0: 73 20 61 6e 64 20 74 79 70 65 73 20 0a 2a 2a 20  s and types .** 
48d0: 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
48e0: 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 69 64  ion to return id
48f0: 65 6e 74 69 63 61 6c 20 73 74 72 69 6e 67 73 2e  entical strings.
4900: 20 49 73 20 69 73 20 74 68 65 20 72 65 73 70 6f   Is is the respo
4910: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20  nsibility.** of 
4920: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72  the caller to fr
4930: 65 65 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ee the returned 
4940: 73 74 72 69 6e 67 20 75 73 69 6e 67 20 73 71 6c  string using sql
4950: 69 74 65 33 5f 66 72 65 65 28 29 20 77 68 65 6e  ite3_free() when
4960: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 20 6c 6f 6e  .** it is no lon
4970: 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f  ger required..*/
4980: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
4990: 69 6f 6e 53 6f 75 72 63 65 54 6f 53 74 72 28 0a  ionSourceToStr(.
49a0: 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49c0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
49d0: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 69  or code */.  Uni
49e0: 6f 6e 54 61 62 20 2a 70 54 61 62 2c 20 20 20 20  onTab *pTab,    
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4a00: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  Virtual table ob
4a10: 6a 65 63 74 20 2a 2f 0a 20 20 55 6e 69 6f 6e 53  ject */.  UnionS
4a20: 72 63 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  rc *pSrc,       
4a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
4a40: 72 63 65 20 74 61 62 6c 65 20 74 6f 20 74 65 73  rce table to tes
4a50: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  t */.  char **pz
4a60: 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
4a70: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
4a80: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
4a90: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20  ){.  char *zRet 
4aa0: 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  = 0;.  if( *pRc=
4ab0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4ac0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4ad0: 75 6e 69 6f 6e 47 65 74 44 62 28 70 54 61 62 2c  unionGetDb(pTab,
4ae0: 20 70 53 72 63 29 3b 0a 20 20 20 20 69 6e 74 20   pSrc);.    int 
4af0: 72 63 20 3d 20 75 6e 69 6f 6e 49 73 49 6e 74 6b  rc = unionIsIntk
4b00: 65 79 54 61 62 6c 65 28 64 62 2c 20 70 53 72 63  eyTable(db, pSrc
4b10: 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 73 71  , pzErr);.    sq
4b20: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
4b30: 74 20 3d 20 75 6e 69 6f 6e 50 72 65 70 61 72 65  t = unionPrepare
4b40: 28 26 72 63 2c 20 64 62 2c 20 0a 20 20 20 20 20  (&rc, db, .     
4b50: 20 20 20 22 53 45 4c 45 43 54 20 67 72 6f 75 70     "SELECT group
4b60: 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 6e 61  _concat(quote(na
4b70: 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75  me) || '.' || qu
4b80: 6f 74 65 28 74 79 70 65 29 29 20 22 0a 20 20 20  ote(type)) ".   
4b90: 20 20 20 20 20 22 46 52 4f 4d 20 70 72 61 67 6d       "FROM pragm
4ba0: 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 3f 2c 20  a_table_info(?, 
4bb0: 3f 29 22 2c 20 70 7a 45 72 72 0a 20 20 20 20 29  ?)", pzErr.    )
4bc0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
4bd0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
4be0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
4bf0: 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 70 53 72  xt(pStmt, 1, pSr
4c00: 63 2d 3e 7a 54 61 62 2c 20 2d 31 2c 20 53 51 4c  c->zTab, -1, SQL
4c10: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
4c20: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
4c30: 74 65 78 74 28 70 53 74 6d 74 2c 20 32 2c 20 70  text(pStmt, 2, p
4c40: 53 72 63 2d 3e 7a 44 62 2c 20 2d 31 2c 20 53 51  Src->zDb, -1, SQ
4c50: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
4c60: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
4c70: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
4c80: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
4c90: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
4ca0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
4cb0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
4cc0: 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
4cd0: 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 75 6e         zRet = un
4ce0: 69 6f 6e 53 74 72 64 75 70 28 26 72 63 2c 20 7a  ionStrdup(&rc, z
4cf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4d00: 20 75 6e 69 6f 6e 46 69 6e 61 6c 69 7a 65 28 26   unionFinalize(&
4d10: 72 63 2c 20 70 53 74 6d 74 2c 20 70 7a 45 72 72  rc, pStmt, pzErr
4d20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52  );.    }.    *pR
4d30: 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72  c = rc;.  }..  r
4d40: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f  eturn zRet;.}../
4d50: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
4d60: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 73  all configured s
4d70: 6f 75 72 63 65 20 74 61 62 6c 65 73 20 65 78 69  ource tables exi
4d80: 73 74 20 61 6e 64 20 68 61 76 65 20 74 68 65 20  st and have the 
4d90: 73 61 6d 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e  same column.** n
4da0: 61 6d 65 73 20 61 6e 64 20 64 61 74 61 74 79 70  ames and datatyp
4db0: 65 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  es. If this is n
4dc0: 6f 74 20 74 68 65 20 63 61 73 65 2c 20 6f 72 20  ot the case, or 
4dd0: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  if some other er
4de0: 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  ror.** occurs, r
4df0: 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
4e00: 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74  error code. In t
4e10: 68 69 73 20 63 61 73 65 20 2a 70 7a 45 72 72 20  his case *pzErr 
4e20: 6d 61 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f  may be set.** to
4e30: 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 72 72   point to an err
4e40: 6f 72 20 6d 65 73 73 61 67 65 20 62 75 66 66 65  or message buffe
4e50: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 73  r allocated by s
4e60: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 29  qlite3_mprintf()
4e70: 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f 20 70  ..** Or, if no p
4e80: 72 6f 62 6c 65 6d 73 20 72 65 67 61 72 64 69 6e  roblems regardin
4e90: 67 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  g the source tab
4ea0: 6c 65 73 20 61 72 65 20 64 65 74 65 63 74 65 64  les are detected
4eb0: 20 61 6e 64 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72   and no.** other
4ec0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
4ed0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
4ee0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
4ef0: 69 6e 74 20 75 6e 69 6f 6e 53 6f 75 72 63 65 43  int unionSourceC
4f00: 68 65 63 6b 28 55 6e 69 6f 6e 54 61 62 20 2a 70  heck(UnionTab *p
4f10: 54 61 62 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72  Tab, char **pzEr
4f20: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
4f30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
4f40: 20 2a 7a 30 20 3d 20 30 3b 0a 20 20 69 6e 74 20   *z0 = 0;.  int 
4f50: 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  i;..  assert( *p
4f60: 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 7a 30 20  zErr==0 );.  z0 
4f70: 3d 20 75 6e 69 6f 6e 53 6f 75 72 63 65 54 6f 53  = unionSourceToS
4f80: 74 72 28 26 72 63 2c 20 70 54 61 62 2c 20 26 70  tr(&rc, pTab, &p
4f90: 54 61 62 2d 3e 61 53 72 63 5b 30 5d 2c 20 70 7a  Tab->aSrc[0], pz
4fa0: 45 72 72 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  Err);.  for(i=1;
4fb0: 20 69 3c 70 54 61 62 2d 3e 6e 53 72 63 3b 20 69   i<pTab->nSrc; i
4fc0: 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
4fd0: 20 3d 20 75 6e 69 6f 6e 53 6f 75 72 63 65 54 6f   = unionSourceTo
4fe0: 53 74 72 28 26 72 63 2c 20 70 54 61 62 2c 20 26  Str(&rc, pTab, &
4ff0: 70 54 61 62 2d 3e 61 53 72 63 5b 69 5d 2c 20 70  pTab->aSrc[i], p
5000: 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
5010: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
5020: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5030: 7a 2c 20 7a 30 29 20 29 7b 0a 20 20 20 20 20 20  z, z0) ){.      
5040: 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
5050: 5f 6d 70 72 69 6e 74 66 28 22 73 6f 75 72 63 65  _mprintf("source
5060: 20 74 61 62 6c 65 20 73 63 68 65 6d 61 20 6d 69   table schema mi
5070: 73 6d 61 74 63 68 22 29 3b 0a 20 20 20 20 20 20  smatch");.      
5080: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5090: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
50a0: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
50b0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
50c0: 28 7a 30 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  (z0);..  return 
50d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  rc;.}../*.** Try
50e0: 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 73 77 61   to open the swa
50f0: 72 6d 76 74 61 62 20 64 61 74 61 62 61 73 65 2e  rmvtab database.
5100: 20 20 49 66 20 69 6e 69 74 69 61 6c 6c 79 20 75    If initially u
5110: 6e 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 20 74 68  nable, invoke th
5120: 65 0a 2a 2a 20 6e 6f 74 2d 66 6f 75 6e 64 20 63  e.** not-found c
5130: 61 6c 6c 62 61 63 6b 20 55 44 46 20 61 6e 64 20  allback UDF and 
5140: 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a  then try again..
5150: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
5160: 69 6f 6e 4f 70 65 6e 44 61 74 61 62 61 73 65 49  ionOpenDatabaseI
5170: 6e 6e 65 72 28 55 6e 69 6f 6e 54 61 62 20 2a 70  nner(UnionTab *p
5180: 54 61 62 2c 20 55 6e 69 6f 6e 53 72 63 20 2a 70  Tab, UnionSrc *p
5190: 53 72 63 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72  Src, char **pzEr
51a0: 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  r){.  static con
51b0: 73 74 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  st int openFlags
51c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
51d0: 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45  EADONLY | SQLITE
51e0: 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 69 6e 74  _OPEN_URI;.  int
51f0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 75 6e 69   rc;..  rc = uni
5200: 6f 6e 49 6e 76 6f 6b 65 4f 70 65 6e 43 6c 6f 73  onInvokeOpenClos
5210: 65 28 70 54 61 62 2c 20 70 53 72 63 2c 20 30 2c  e(pTab, pSrc, 0,
5220: 20 70 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72   pzErr);.  if( r
5230: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5240: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5250: 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
5260: 32 28 70 53 72 63 2d 3e 7a 46 69 6c 65 2c 20 26  2(pSrc->zFile, &
5270: 70 53 72 63 2d 3e 64 62 2c 20 6f 70 65 6e 46 6c  pSrc->db, openFl
5280: 61 67 73 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ags, 0);.  if( r
5290: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
52a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
52b0: 70 54 61 62 2d 3e 70 4e 6f 74 46 6f 75 6e 64 20  pTab->pNotFound 
52c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
52d0: 6c 6f 73 65 28 70 53 72 63 2d 3e 64 62 29 3b 0a  lose(pSrc->db);.
52e0: 20 20 20 20 70 53 72 63 2d 3e 64 62 20 3d 20 30      pSrc->db = 0
52f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
5300: 6e 64 5f 74 65 78 74 28 70 54 61 62 2d 3e 70 4e  nd_text(pTab->pN
5310: 6f 74 46 6f 75 6e 64 2c 20 31 2c 20 70 53 72 63  otFound, 1, pSrc
5320: 2d 3e 7a 46 69 6c 65 2c 20 2d 31 2c 20 53 51 4c  ->zFile, -1, SQL
5330: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
5340: 20 69 66 28 20 70 54 61 62 2d 3e 62 48 61 73 43   if( pTab->bHasC
5350: 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ontext ){.      
5360: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
5370: 74 28 70 54 61 62 2d 3e 70 4e 6f 74 46 6f 75 6e  t(pTab->pNotFoun
5380: 64 2c 20 32 2c 20 70 53 72 63 2d 3e 7a 43 6f 6e  d, 2, pSrc->zCon
5390: 74 65 78 74 2c 20 2d 31 2c 20 53 51 4c 49 54 45  text, -1, SQLITE
53a0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a  _STATIC);.    }.
53b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
53c0: 28 70 54 61 62 2d 3e 70 4e 6f 74 46 6f 75 6e 64  (pTab->pNotFound
53d0: 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
53e0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
53f0: 74 65 33 5f 72 65 73 65 74 28 70 54 61 62 2d 3e  te3_reset(pTab->
5400: 70 4e 6f 74 46 6f 75 6e 64 29 29 20 29 7b 0a 20  pNotFound)) ){. 
5410: 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71       *pzErr = sq
5420: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
5430: 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
5440: 73 67 28 70 54 61 62 2d 3e 64 62 29 29 3b 0a 20  sg(pTab->db));. 
5450: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
5460: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
5470: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70  qlite3_open_v2(p
5480: 53 72 63 2d 3e 7a 46 69 6c 65 2c 20 26 70 53 72  Src->zFile, &pSr
5490: 63 2d 3e 64 62 2c 20 6f 70 65 6e 46 6c 61 67 73  c->db, openFlags
54a0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
54b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
54c0: 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71  .    *pzErr = sq
54d0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
54e0: 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
54f0: 73 67 28 70 53 72 63 2d 3e 64 62 29 29 3b 0a 20  sg(pSrc->db));. 
5500: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5510: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
5520: 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
5530: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 73 77  be called for sw
5540: 61 72 6d 76 74 61 62 20 74 61 62 6c 65 73 2e 20  armvtab tables. 
5550: 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 0a 2a  The results of.*
5560: 2a 20 63 61 6c 6c 69 6e 67 20 69 74 20 6f 6e 20  * calling it on 
5570: 61 20 75 6e 69 6f 6e 76 74 61 62 20 74 61 62 6c  a unionvtab tabl
5580: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
5590: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 73 77 61  .**.** For a swa
55a0: 72 6d 76 74 61 62 20 74 61 62 6c 65 2c 20 74 68  rmvtab table, th
55b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 6e 73 75  is function ensu
55c0: 72 65 73 20 74 68 61 74 20 73 6f 75 72 63 65 20  res that source 
55d0: 64 61 74 61 62 61 73 65 20 69 53 72 63 0a 2a 2a  database iSrc.**
55e0: 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 74 68 65   is open. If the
55f0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
5600: 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
5610: 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20   and the schema 
5620: 69 73 20 61 73 0a 2a 2a 20 65 78 70 65 63 74 65  is as.** expecte
5630: 64 2c 20 6f 72 20 69 66 20 69 74 20 69 73 20 61  d, or if it is a
5640: 6c 72 65 61 64 79 20 6f 70 65 6e 20 77 68 65 6e  lready open when
5650: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
5660: 73 20 63 61 6c 6c 65 64 2c 20 53 51 4c 49 54 45  s called, SQLITE
5670: 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
5680: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 74 65 72 6e  ed..**.** Altern
5690: 61 74 69 76 65 6c 79 20 49 66 20 61 6e 20 65 72  atively If an er
56a0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
56b0: 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 64 61 74   opening the dat
56c0: 61 62 61 73 65 73 2c 20 6f 72 20 69 66 20 74 68  abases, or if th
56d0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63  e.** database sc
56e0: 68 65 6d 61 20 69 73 20 75 6e 73 75 69 74 61 62  hema is unsuitab
56f0: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  le, an SQLite er
5700: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
5710: 72 6e 65 64 20 61 6e 64 20 28 2a 70 7a 45 72 72  rned and (*pzErr
5720: 29 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20  ).** may be set 
5730: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 45  to point to an E
5740: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
5750: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49  error message. I
5760: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
5770: 73 0a 2a 2a 20 74 68 65 20 72 65 73 70 6f 6e 73  s.** the respons
5780: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
5790: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
57a0: 6c 6c 79 20 66 72 65 65 20 74 68 65 20 65 72 72  lly free the err
57b0: 6f 72 20 6d 65 73 73 61 67 65 20 62 75 66 66 65  or message buffe
57c0: 72 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74  r.** using sqlit
57d0: 65 33 5f 66 72 65 65 28 29 2e 20 0a 2a 2f 0a 73  e3_free(). .*/.s
57e0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 6f 6e 4f  tatic int unionO
57f0: 70 65 6e 44 61 74 61 62 61 73 65 28 55 6e 69 6f  penDatabase(Unio
5800: 6e 54 61 62 20 2a 70 54 61 62 2c 20 69 6e 74 20  nTab *pTab, int 
5810: 69 53 72 63 2c 20 63 68 61 72 20 2a 2a 70 7a 45  iSrc, char **pzE
5820: 72 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  rr){.  int rc = 
5830: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 6e 69  SQLITE_OK;.  Uni
5840: 6f 6e 53 72 63 20 2a 70 53 72 63 20 3d 20 26 70  onSrc *pSrc = &p
5850: 54 61 62 2d 3e 61 53 72 63 5b 69 53 72 63 5d 3b  Tab->aSrc[iSrc];
5860: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
5870: 2d 3e 62 53 77 61 72 6d 20 26 26 20 69 53 72 63  ->bSwarm && iSrc
5880: 3c 70 54 61 62 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pTab->nSrc );. 
5890: 20 69 66 28 20 70 53 72 63 2d 3e 64 62 3d 3d 30   if( pSrc->db==0
58a0: 20 29 7b 0a 20 20 20 20 75 6e 69 6f 6e 43 6c 6f   ){.    unionClo
58b0: 73 65 53 6f 75 72 63 65 73 28 70 54 61 62 2c 20  seSources(pTab, 
58c0: 70 54 61 62 2d 3e 6e 4d 61 78 4f 70 65 6e 2d 31  pTab->nMaxOpen-1
58d0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 6f  );.    rc = unio
58e0: 6e 4f 70 65 6e 44 61 74 61 62 61 73 65 49 6e 6e  nOpenDatabaseInn
58f0: 65 72 28 70 54 61 62 2c 20 70 53 72 63 2c 20 70  er(pTab, pSrc, p
5900: 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
5910: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5920: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
5930: 75 6e 69 6f 6e 53 6f 75 72 63 65 54 6f 53 74 72  unionSourceToStr
5940: 28 26 72 63 2c 20 70 54 61 62 2c 20 70 53 72 63  (&rc, pTab, pSrc
5950: 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  , pzErr);.      
5960: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5970: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
5980: 20 70 54 61 62 2d 3e 7a 53 6f 75 72 63 65 53 74   pTab->zSourceSt
5990: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
59a0: 20 20 70 54 61 62 2d 3e 7a 53 6f 75 72 63 65 53    pTab->zSourceS
59b0: 74 72 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20  tr = z;.        
59c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
59d0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
59e0: 69 63 6d 70 28 7a 2c 20 70 54 61 62 2d 3e 7a 53  icmp(z, pTab->zS
59f0: 6f 75 72 63 65 53 74 72 29 20 29 7b 0a 20 20 20  ourceStr) ){.   
5a00: 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20           *pzErr 
5a10: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5a20: 66 28 22 73 6f 75 72 63 65 20 74 61 62 6c 65 20  f("source table 
5a30: 73 63 68 65 6d 61 20 6d 69 73 6d 61 74 63 68 22  schema mismatch"
5a40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
5a50: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
5a60: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5a70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5a80: 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  free(z);.       
5a90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
5aa0: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
5ab0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5ac0: 20 70 53 72 63 2d 3e 70 4e 65 78 74 43 6c 6f 73   pSrc->pNextClos
5ad0: 61 62 6c 65 20 3d 20 70 54 61 62 2d 3e 70 43 6c  able = pTab->pCl
5ae0: 6f 73 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54  osable;.      pT
5af0: 61 62 2d 3e 70 43 6c 6f 73 61 62 6c 65 20 3d 20  ab->pClosable = 
5b00: 70 53 72 63 3b 0a 20 20 20 20 20 20 70 54 61 62  pSrc;.      pTab
5b10: 2d 3e 6e 4f 70 65 6e 2b 2b 3b 0a 20 20 20 20 7d  ->nOpen++;.    }
5b20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
5b30: 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 2d 3e  te3_close(pSrc->
5b40: 64 62 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d  db);.      pSrc-
5b50: 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  >db = 0;.      u
5b60: 6e 69 6f 6e 49 6e 76 6f 6b 65 4f 70 65 6e 43 6c  nionInvokeOpenCl
5b70: 6f 73 65 28 70 54 61 62 2c 20 70 53 72 63 2c 20  ose(pTab, pSrc, 
5b80: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  1, 0);.    }.  }
5b90: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
5ba0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
5bb0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
5bc0: 70 20 66 6f 72 20 75 6e 69 6f 6e 76 74 61 62 20  p for unionvtab 
5bd0: 74 61 62 6c 65 73 2e 20 46 6f 72 20 73 77 61 72  tables. For swar
5be0: 6d 76 74 61 62 2c 20 69 6e 63 72 65 6d 65 6e 74  mvtab, increment
5bf0: 20 0a 2a 2a 20 74 68 65 20 72 65 66 65 72 65 6e   .** the referen
5c00: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 73 6f 75  ce count for sou
5c10: 72 63 65 20 74 61 62 6c 65 20 69 54 61 62 2e 20  rce table iTab. 
5c20: 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
5c30: 20 63 6f 75 6e 74 20 77 61 73 0a 2a 2a 20 7a 65   count was.** ze
5c40: 72 6f 20 62 65 66 6f 72 65 20 69 74 20 77 61 73  ro before it was
5c50: 20 69 6e 63 72 65 6d 65 6e 74 65 64 2c 20 61 6c   incremented, al
5c60: 73 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 73 6f  so remove the so
5c70: 75 72 63 65 20 66 72 6f 6d 20 74 68 65 20 63 6c  urce from the cl
5c80: 6f 73 61 62 6c 65 0a 2a 2a 20 6c 69 73 74 2e 0a  osable.** list..
5c90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
5ca0: 6e 69 6f 6e 49 6e 63 72 52 65 66 63 6f 75 6e 74  nionIncrRefcount
5cb0: 28 55 6e 69 6f 6e 54 61 62 20 2a 70 54 61 62 2c  (UnionTab *pTab,
5cc0: 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66   int iTab){.  if
5cd0: 28 20 70 54 61 62 2d 3e 62 53 77 61 72 6d 20 29  ( pTab->bSwarm )
5ce0: 7b 0a 20 20 20 20 55 6e 69 6f 6e 53 72 63 20 2a  {.    UnionSrc *
5cf0: 70 53 72 63 20 3d 20 26 70 54 61 62 2d 3e 61 53  pSrc = &pTab->aS
5d00: 72 63 5b 69 54 61 62 5d 3b 0a 20 20 20 20 61 73  rc[iTab];.    as
5d10: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 55 73 65  sert( pSrc->nUse
5d20: 72 3e 3d 30 20 26 26 20 70 53 72 63 2d 3e 64 62  r>=0 && pSrc->db
5d30: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63   );.    if( pSrc
5d40: 2d 3e 6e 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20  ->nUser==0 ){.  
5d50: 20 20 20 20 55 6e 69 6f 6e 53 72 63 20 2a 2a 70      UnionSrc **p
5d60: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d  p;.      for(pp=
5d70: 26 70 54 61 62 2d 3e 70 43 6c 6f 73 61 62 6c 65  &pTab->pClosable
5d80: 3b 20 2a 70 70 21 3d 70 53 72 63 3b 20 70 70 3d  ; *pp!=pSrc; pp=
5d90: 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 43 6c 6f  &(*pp)->pNextClo
5da0: 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 2a 70  sable);.      *p
5db0: 70 20 3d 20 70 53 72 63 2d 3e 70 4e 65 78 74 43  p = pSrc->pNextC
5dc0: 6c 6f 73 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  losable;.      p
5dd0: 53 72 63 2d 3e 70 4e 65 78 74 43 6c 6f 73 61 62  Src->pNextClosab
5de0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  le = 0;.    }.  
5df0: 20 20 70 53 72 63 2d 3e 6e 55 73 65 72 2b 2b 3b    pSrc->nUser++;
5e00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  .  }.}../*.** Fi
5e10: 6e 61 6c 69 7a 65 20 74 68 65 20 53 51 4c 20 73  nalize the SQL s
5e20: 74 61 74 65 6d 65 6e 74 20 70 43 73 72 2d 3e 70  tatement pCsr->p
5e30: 53 74 6d 74 20 61 6e 64 20 72 65 74 75 72 6e 20  Stmt and return 
5e40: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
5e50: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
5e60: 77 61 72 6d 76 74 61 62 20 74 61 62 6c 65 20 28  warmvtab table (
5e70: 6e 6f 74 20 75 6e 69 6f 6e 76 74 61 62 29 20 61  not unionvtab) a
5e80: 6e 64 20 70 43 73 72 2d 3e 70 53 74 6d 74 20 77  nd pCsr->pStmt w
5e90: 61 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 77  as not.** NULL w
5ea0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
5eb0: 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 61 6c  n was called, al
5ec0: 73 6f 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  so decrement the
5ed0: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 63 6f   reference.** co
5ee0: 75 6e 74 20 6f 6e 20 74 68 65 20 61 73 73 6f 63  unt on the assoc
5ef0: 69 61 74 65 64 20 73 6f 75 72 63 65 20 74 61 62  iated source tab
5f00: 6c 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e  le. If this mean
5f10: 73 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  s the source tab
5f20: 6c 65 73 0a 2a 2a 20 72 65 66 63 6f 75 6e 74 20  les.** refcount 
5f30: 69 73 20 6e 6f 77 20 7a 65 72 6f 2c 20 61 64 64  is now zero, add
5f40: 20 69 74 20 74 6f 20 74 68 65 20 63 6c 6f 73 61   it to the closa
5f50: 62 6c 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ble list..*/.sta
5f60: 74 69 63 20 69 6e 74 20 75 6e 69 6f 6e 46 69 6e  tic int unionFin
5f70: 61 6c 69 7a 65 43 73 72 53 74 6d 74 28 55 6e 69  alizeCsrStmt(Uni
5f80: 6f 6e 43 73 72 20 2a 70 43 73 72 29 7b 0a 20 20  onCsr *pCsr){.  
5f90: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5fa0: 4f 4b 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  OK;.  if( pCsr->
5fb0: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 55 6e 69  pStmt ){.    Uni
5fc0: 6f 6e 54 61 62 20 2a 70 54 61 62 20 3d 20 28 55  onTab *pTab = (U
5fd0: 6e 69 6f 6e 54 61 62 2a 29 70 43 73 72 2d 3e 62  nionTab*)pCsr->b
5fe0: 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 20 20 55  ase.pVtab;.    U
5ff0: 6e 69 6f 6e 53 72 63 20 2a 70 53 72 63 20 3d 20  nionSrc *pSrc = 
6000: 26 70 54 61 62 2d 3e 61 53 72 63 5b 70 43 73 72  &pTab->aSrc[pCsr
6010: 2d 3e 69 54 61 62 5d 3b 0a 20 20 20 20 72 63 20  ->iTab];.    rc 
6020: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
6030: 7a 65 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b  ze(pCsr->pStmt);
6040: 0a 20 20 20 20 70 43 73 72 2d 3e 70 53 74 6d 74  .    pCsr->pStmt
6050: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54   = 0;.    if( pT
6060: 61 62 2d 3e 62 53 77 61 72 6d 20 29 7b 0a 20 20  ab->bSwarm ){.  
6070: 20 20 20 20 70 53 72 63 2d 3e 6e 55 73 65 72 2d      pSrc->nUser-
6080: 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
6090: 20 70 53 72 63 2d 3e 6e 55 73 65 72 3e 3d 30 20   pSrc->nUser>=0 
60a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
60b0: 63 2d 3e 6e 55 73 65 72 3d 3d 30 20 29 7b 0a 20  c->nUser==0 ){. 
60c0: 20 20 20 20 20 20 20 70 53 72 63 2d 3e 70 4e 65         pSrc->pNe
60d0: 78 74 43 6c 6f 73 61 62 6c 65 20 3d 20 70 54 61  xtClosable = pTa
60e0: 62 2d 3e 70 43 6c 6f 73 61 62 6c 65 3b 0a 20 20  b->pClosable;.  
60f0: 20 20 20 20 20 20 70 54 61 62 2d 3e 70 43 6c 6f        pTab->pClo
6100: 73 61 62 6c 65 20 3d 20 70 53 72 63 3b 0a 20 20  sable = pSrc;.  
6110: 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 6f      }.      unio
6120: 6e 43 6c 6f 73 65 53 6f 75 72 63 65 73 28 70 54  nCloseSources(pT
6130: 61 62 2c 20 70 54 61 62 2d 3e 6e 4d 61 78 4f 70  ab, pTab->nMaxOp
6140: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  en);.    }.  }. 
6150: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6160: 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  * .** Return tru
6170: 65 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  e if the argumen
6180: 74 20 69 73 20 61 20 73 70 61 63 65 2c 20 74 61  t is a space, ta
6190: 62 2c 20 43 52 20 6f 72 20 4c 46 20 63 68 61 72  b, CR or LF char
61a0: 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  acter..*/.static
61b0: 20 69 6e 74 20 75 6e 69 6f 6e 5f 69 73 73 70 61   int union_isspa
61c0: 63 65 28 63 68 61 72 20 63 29 7b 0a 20 20 72 65  ce(char c){.  re
61d0: 74 75 72 6e 20 28 63 3d 3d 27 20 27 20 7c 7c 20  turn (c==' ' || 
61e0: 63 3d 3d 27 5c 6e 27 20 7c 7c 20 63 3d 3d 27 5c  c=='\n' || c=='\
61f0: 72 27 20 7c 7c 20 63 3d 3d 27 5c 74 27 29 3b 0a  r' || c=='\t');.
6200: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  }../* .** Return
6210: 20 74 72 75 65 20 69 66 20 74 68 65 20 61 72 67   true if the arg
6220: 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 6c 70 68  ument is an alph
6230: 61 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63 74  anumeric charact
6240: 65 72 20 69 6e 20 74 68 65 20 0a 2a 2a 20 41 53  er in the .** AS
6250: 43 49 49 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74  CII range..*/.st
6260: 61 74 69 63 20 69 6e 74 20 75 6e 69 6f 6e 5f 69  atic int union_i
6270: 73 69 64 63 68 61 72 28 63 68 61 72 20 63 29 7b  sidchar(char c){
6280: 0a 20 20 72 65 74 75 72 6e 20 28 28 63 3e 3d 27  .  return ((c>='
6290: 61 27 20 26 26 20 63 3c 3d 27 7a 27 29 20 7c 7c  a' && c<='z') ||
62a0: 20 28 63 3e 3d 27 41 27 20 26 26 20 63 3c 27 5a   (c>='A' && c<'Z
62b0: 27 29 20 7c 7c 20 28 63 3e 3d 27 30 27 20 26 26  ') || (c>='0' &&
62c0: 20 63 3c 3d 27 39 27 29 29 3b 0a 7d 0a 0a 2f 2a   c<='9'));.}../*
62d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
62e0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68  n is called to h
62f0: 61 6e 64 6c 65 20 61 6c 6c 20 61 72 67 75 6d 65  andle all argume
6300: 6e 74 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  nts following th
6310: 65 20 66 69 72 73 74 20 0a 2a 2a 20 28 74 68 65  e first .** (the
6320: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 29 20   SQL statement) 
6330: 70 61 73 73 65 64 20 74 6f 20 61 20 73 77 61 72  passed to a swar
6340: 6d 76 74 61 62 20 28 6e 6f 74 20 75 6e 69 6f 6e  mvtab (not union
6350: 76 74 61 62 29 20 43 52 45 41 54 45 20 0a 2a 2a  vtab) CREATE .**
6360: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73   VIRTUAL TABLE s
6370: 74 61 74 65 6d 65 6e 74 2e 20 49 74 20 6d 61 79  tatement. It may
6380: 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72 73   bind parameters
6390: 20 74 6f 20 74 68 65 20 53 51 4c 20 73 74 61 74   to the SQL stat
63a0: 65 6d 65 6e 74 20 0a 2a 2a 20 6f 72 20 63 6f 6e  ement .** or con
63b0: 66 69 67 75 72 65 20 6d 65 6d 62 65 72 73 20 6f  figure members o
63c0: 66 20 74 68 65 20 55 6e 69 6f 6e 54 61 62 20 6f  f the UnionTab o
63d0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
63e0: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
63f0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  gument..**.** Re
6400: 66 65 72 20 74 6f 20 68 65 61 64 65 72 20 63 6f  fer to header co
6410: 6d 6d 65 6e 74 73 20 61 74 20 74 68 65 20 74 6f  mments at the to
6420: 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66  p of this file f
6430: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
6440: 0a 2a 2a 20 6f 66 20 74 68 65 20 61 72 67 75 6d  .** of the argum
6450: 65 6e 74 73 20 70 61 72 73 65 64 2e 0a 2a 2a 0a  ents parsed..**.
6460: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6470: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 2a   is a no-op if *
6480: 70 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61  pRc is other tha
6490: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  n SQLITE_OK when
64a0: 20 69 74 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64   it is.** called
64b0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
64c0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
64d0: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
64e0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
64f0: 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73  ** code. In this
6500: 20 63 61 73 65 20 2a 70 7a 45 72 72 20 6d 61 79   case *pzErr may
6510: 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
6520: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
6530: 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e  taining.** an En
6540: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
6550: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
6560: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
6570: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 0a 2a  bility of the .*
6580: 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
6590: 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20  tually free the 
65a0: 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
65b0: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
65c0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 6f  static void unio
65d0: 6e 43 6f 6e 66 69 67 75 72 65 56 74 61 62 28 0a  nConfigureVtab(.
65e0: 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
6610: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 69  or code */.  Uni
6620: 6f 6e 54 61 62 20 2a 70 54 61 62 2c 20 20 20 20  onTab *pTab,    
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6640: 54 61 62 6c 65 20 74 6f 20 63 6f 6e 66 69 67 75  Table to configu
6650: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  re */.  sqlite3_
6660: 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 20 20 20  stmt *pStmt,    
6670: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73          /* SQL s
6680: 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 69 6e 64  tatement to find
6690: 20 73 6f 75 72 63 65 73 20 2a 2f 0a 20 20 69 6e   sources */.  in
66a0: 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
66c0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
66d0: 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 61 72  es in azArg[] ar
66e0: 72 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ray */.  const c
66f0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 7a 41  har * const *azA
6700: 72 67 2c 20 20 20 20 20 20 2f 2a 20 41 72 72 61  rg,      /* Arra
6710: 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  y of arguments t
6720: 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20  o consider */.  
6730: 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20  char **pzErr    
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6750: 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65  /* OUT: Error me
6760: 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ssage */.){.  in
6770: 74 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20 20 69  t rc = *pRc;.  i
6780: 6e 74 20 69 3b 0a 20 20 69 66 28 20 72 63 3d 3d  nt i;.  if( rc==
6790: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
67a0: 20 70 54 61 62 2d 3e 62 48 61 73 43 6f 6e 74 65   pTab->bHasConte
67b0: 78 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 63 6f  xt = (sqlite3_co
67c0: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
67d0: 29 3e 34 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  )>4);.  }.  for(
67e0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
67f0: 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b  OK && i<nArg; i+
6800: 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 41  +){.    char *zA
6810: 72 67 20 3d 20 75 6e 69 6f 6e 53 74 72 64 75 70  rg = unionStrdup
6820: 28 26 72 63 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  (&rc, azArg[i]);
6830: 0a 20 20 20 20 69 66 28 20 7a 41 72 67 20 29 7b  .    if( zArg ){
6840: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20  .      int nOpt 
6850: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
6860: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 70     /* Size of op
6870: 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74  tion name in byt
6880: 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  es */.      char
6890: 20 2a 7a 4f 70 74 3b 20 20 20 20 20 20 20 20 20   *zOpt;         
68a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
68b0: 65 72 20 74 6f 20 6f 70 74 69 6f 6e 20 6e 61 6d  er to option nam
68c0: 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
68d0: 2a 7a 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zVal;          
68e0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
68f0: 72 20 74 6f 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  r to value */.. 
6900: 20 20 20 20 20 75 6e 69 6f 6e 44 65 71 75 6f 74       unionDequot
6910: 65 28 7a 41 72 67 29 3b 0a 20 20 20 20 20 20 7a  e(zArg);.      z
6920: 4f 70 74 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20  Opt = zArg;.    
6930: 20 20 77 68 69 6c 65 28 20 75 6e 69 6f 6e 5f 69    while( union_i
6940: 73 73 70 61 63 65 28 2a 7a 4f 70 74 29 20 29 20  sspace(*zOpt) ) 
6950: 7a 4f 70 74 2b 2b 3b 0a 20 20 20 20 20 20 7a 56  zOpt++;.      zV
6960: 61 6c 20 3d 20 7a 4f 70 74 3b 0a 20 20 20 20 20  al = zOpt;.     
6970: 20 69 66 28 20 2a 7a 56 61 6c 3d 3d 27 3a 27 20   if( *zVal==':' 
6980: 29 20 7a 56 61 6c 2b 2b 3b 0a 20 20 20 20 20 20  ) zVal++;.      
6990: 77 68 69 6c 65 28 20 75 6e 69 6f 6e 5f 69 73 69  while( union_isi
69a0: 64 63 68 61 72 28 2a 7a 56 61 6c 29 20 29 20 7a  dchar(*zVal) ) z
69b0: 56 61 6c 2b 2b 3b 0a 20 20 20 20 20 20 6e 4f 70  Val++;.      nOp
69c0: 74 20 3d 20 28 69 6e 74 29 28 7a 56 61 6c 2d 7a  t = (int)(zVal-z
69d0: 4f 70 74 29 3b 0a 0a 20 20 20 20 20 20 77 68 69  Opt);..      whi
69e0: 6c 65 28 20 75 6e 69 6f 6e 5f 69 73 73 70 61 63  le( union_isspac
69f0: 65 28 2a 7a 56 61 6c 29 20 29 20 7a 56 61 6c 2b  e(*zVal) ) zVal+
6a00: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 56  +;.      if( *zV
6a10: 61 6c 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20  al=='=' ){.     
6a20: 20 20 20 7a 4f 70 74 5b 6e 4f 70 74 5d 20 3d 20     zOpt[nOpt] = 
6a30: 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7a 56  '\0';.        zV
6a40: 61 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 77 68  al++;.        wh
6a50: 69 6c 65 28 20 75 6e 69 6f 6e 5f 69 73 73 70 61  ile( union_isspa
6a60: 63 65 28 2a 7a 56 61 6c 29 20 29 20 7a 56 61 6c  ce(*zVal) ) zVal
6a70: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7a 56 61 6c  ++;.        zVal
6a80: 20 3d 20 75 6e 69 6f 6e 53 74 72 64 75 70 28 26   = unionStrdup(&
6a90: 72 63 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  rc, zVal);.     
6aa0: 20 20 20 69 66 28 20 7a 56 61 6c 20 29 7b 0a 20     if( zVal ){. 
6ab0: 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 44 65           unionDe
6ac0: 71 75 6f 74 65 28 7a 56 61 6c 29 3b 0a 20 20 20  quote(zVal);.   
6ad0: 20 20 20 20 20 20 20 69 66 28 20 7a 4f 70 74 5b         if( zOpt[
6ae0: 30 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20  0]==':' ){.     
6af0: 20 20 20 20 20 20 20 2f 2a 20 41 20 76 61 6c 75         /* A valu
6b00: 65 20 74 6f 20 62 69 6e 64 20 74 6f 20 74 68 65  e to bind to the
6b10: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
6b20: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
6b30: 74 20 69 50 61 72 61 6d 20 3d 20 73 71 6c 69 74  t iParam = sqlit
6b40: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
6b50: 72 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 20 7a  r_index(pStmt, z
6b60: 4f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Opt);.          
6b70: 20 20 69 66 28 20 69 50 61 72 61 6d 3d 3d 30 20    if( iParam==0 
6b80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6b90: 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
6ba0: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 77               "sw
6bc0: 61 72 6d 76 74 61 62 3a 20 6e 6f 20 73 75 63 68  armvtab: no such
6bd0: 20 53 51 4c 20 70 61 72 61 6d 65 74 65 72 3a 20   SQL parameter: 
6be0: 25 73 22 2c 20 7a 4f 70 74 0a 20 20 20 20 20 20  %s", zOpt.      
6bf0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
6c00: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
6c10: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
6c20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
6c40: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
6c50: 65 78 74 28 70 53 74 6d 74 2c 20 69 50 61 72 61  ext(pStmt, iPara
6c60: 6d 2c 20 7a 56 61 6c 2c 20 2d 31 2c 20 53 51 4c  m, zVal, -1, SQL
6c70: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6c90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
6ca0: 28 20 6e 4f 70 74 3d 3d 37 20 26 26 20 30 3d 3d  ( nOpt==7 && 0==
6cb0: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
6cc0: 28 7a 4f 70 74 2c 20 22 6d 61 78 6f 70 65 6e 22  (zOpt, "maxopen"
6cd0: 2c 20 37 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 7) ){.        
6ce0: 20 20 20 20 70 54 61 62 2d 3e 6e 4d 61 78 4f 70      pTab->nMaxOp
6cf0: 65 6e 20 3d 20 61 74 6f 69 28 7a 56 61 6c 29 3b  en = atoi(zVal);
6d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6d10: 20 70 54 61 62 2d 3e 6e 4d 61 78 4f 70 65 6e 3c   pTab->nMaxOpen<
6d20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6d30: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
6d40: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 73 77  ite3_mprintf("sw
6d50: 61 72 6d 76 74 61 62 3a 20 69 6c 6c 65 67 61 6c  armvtab: illegal
6d60: 20 6d 61 78 6f 70 65 6e 20 76 61 6c 75 65 22 29   maxopen value")
6d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6d80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
6d90: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  R;.            }
6da0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6db0: 20 69 66 28 20 6e 4f 70 74 3d 3d 37 20 26 26 20   if( nOpt==7 && 
6dc0: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  0==sqlite3_strni
6dd0: 63 6d 70 28 7a 4f 70 74 2c 20 22 6d 69 73 73 69  cmp(zOpt, "missi
6de0: 6e 67 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 20  ng", 7) ){.     
6df0: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d         if( pTab-
6e00: 3e 70 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20  >pNotFound ){.  
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
6e20: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
6e30: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
6e40: 20 20 20 20 20 20 20 20 22 73 77 61 72 6d 76 74          "swarmvt
6e50: 61 62 3a 20 64 75 70 6c 69 63 61 74 65 20 5c 22  ab: duplicate \"
6e60: 6d 69 73 73 69 6e 67 5c 22 20 6f 70 74 69 6f 6e  missing\" option
6e70: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
6e80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
6e90: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ROR;.           
6ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6eb0: 20 20 20 20 20 20 70 54 61 62 2d 3e 70 4e 6f 74        pTab->pNot
6ec0: 46 6f 75 6e 64 20 3d 20 75 6e 69 6f 6e 50 72 65  Found = unionPre
6ed0: 70 61 72 65 50 72 69 6e 74 66 28 26 72 63 2c 20  parePrintf(&rc, 
6ee0: 70 7a 45 72 72 2c 20 70 54 61 62 2d 3e 64 62 2c  pzErr, pTab->db,
6ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6f00: 20 20 20 22 53 45 4c 45 43 54 20 5c 22 25 77 5c     "SELECT \"%w\
6f10: 22 28 3f 25 73 29 22 2c 20 7a 56 61 6c 2c 20 70  "(?%s)", zVal, p
6f20: 54 61 62 2d 3e 62 48 61 73 43 6f 6e 74 65 78 74  Tab->bHasContext
6f30: 20 3f 20 22 2c 3f 22 20 3a 20 22 22 0a 20 20 20   ? ",?" : "".   
6f40: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
6f50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6f60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6f70: 6e 4f 70 74 3d 3d 39 20 26 26 20 30 3d 3d 73 71  nOpt==9 && 0==sq
6f80: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
6f90: 4f 70 74 2c 20 22 6f 70 65 6e 63 6c 6f 73 65 22  Opt, "openclose"
6fa0: 2c 20 39 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 9) ){.        
6fb0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 4f      if( pTab->pO
6fc0: 70 65 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20  penClose ){.    
6fd0: 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
6fe0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
6ff0: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
7000: 20 20 20 20 20 20 22 73 77 61 72 6d 76 74 61 62        "swarmvtab
7010: 3a 20 64 75 70 6c 69 63 61 74 65 20 5c 22 6f 70  : duplicate \"op
7020: 65 6e 63 6c 6f 73 65 5c 22 20 6f 70 74 69 6f 6e  enclose\" option
7030: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
7040: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
7050: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ROR;.           
7060: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7070: 20 20 20 20 20 20 70 54 61 62 2d 3e 70 4f 70 65        pTab->pOpe
7080: 6e 43 6c 6f 73 65 20 3d 20 75 6e 69 6f 6e 50 72  nClose = unionPr
7090: 65 70 61 72 65 50 72 69 6e 74 66 28 26 72 63 2c  eparePrintf(&rc,
70a0: 20 70 7a 45 72 72 2c 20 70 54 61 62 2d 3e 64 62   pzErr, pTab->db
70b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
70c0: 20 20 20 20 22 53 45 4c 45 43 54 20 5c 22 25 77      "SELECT \"%w
70d0: 5c 22 28 3f 2c 3f 25 73 29 22 2c 20 7a 56 61 6c  \"(?,?%s)", zVal
70e0: 2c 20 70 54 61 62 2d 3e 62 48 61 73 43 6f 6e 74  , pTab->bHasCont
70f0: 65 78 74 20 3f 20 22 2c 3f 22 20 3a 20 22 22 0a  ext ? ",?" : "".
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b                );
7110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7120: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
7130: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
7140: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
7150: 69 6e 74 66 28 22 73 77 61 72 6d 76 74 61 62 3a  intf("swarmvtab:
7160: 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70   unrecognized op
7170: 74 69 6f 6e 3a 20 25 73 22 2c 7a 4f 70 74 29 3b  tion: %s",zOpt);
7180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
7190: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
71a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
71b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
71c0: 65 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  ee(zVal);.      
71d0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
71e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
71f0: 30 20 26 26 20 6e 41 72 67 3d 3d 31 20 29 7b 0a  0 && nArg==1 ){.
7200: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
7210: 70 4e 6f 74 46 6f 75 6e 64 20 3d 20 75 6e 69 6f  pNotFound = unio
7220: 6e 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 26  nPreparePrintf(&
7230: 72 63 2c 20 70 7a 45 72 72 2c 20 70 54 61 62 2d  rc, pzErr, pTab-
7240: 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
7250: 20 20 20 22 53 45 4c 45 43 54 20 5c 22 25 77 5c     "SELECT \"%w\
7260: 22 28 3f 29 22 2c 20 7a 41 72 67 0a 20 20 20 20  "(?)", zArg.    
7270: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
7280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7290: 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
72a0: 65 33 5f 6d 70 72 69 6e 74 66 28 20 22 73 77 61  e3_mprintf( "swa
72b0: 72 6d 76 74 61 62 3a 20 70 61 72 73 65 20 65 72  rmvtab: parse er
72c0: 72 6f 72 3a 20 25 73 22 2c 20 61 7a 41 72 67 5b  ror: %s", azArg[
72d0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
72e0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
72f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7300: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7310: 33 5f 66 72 65 65 28 7a 41 72 67 29 3b 0a 20 20  3_free(zArg);.  
7320: 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 63 20 3d    }.  }.  *pRc =
7330: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 78   rc;.}../* .** x
7340: 43 6f 6e 6e 65 63 74 2f 78 43 72 65 61 74 65 20  Connect/xCreate 
7350: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  method..**.** Th
7360: 65 20 61 72 67 76 5b 5d 20 61 72 72 61 79 20 63  e argv[] array c
7370: 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c  ontains the foll
7380: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  owing:.**.**   a
7390: 72 67 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64 75  rgv[0]   -> modu
73a0: 6c 65 20 6e 61 6d 65 20 20 28 22 75 6e 69 6f 6e  le name  ("union
73b0: 76 74 61 62 22 20 6f 72 20 22 73 77 61 72 6d 76  vtab" or "swarmv
73c0: 74 61 62 22 29 0a 2a 2a 20 20 20 61 72 67 76 5b  tab").**   argv[
73d0: 31 5d 20 20 20 2d 3e 20 64 61 74 61 62 61 73 65  1]   -> database
73e0: 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b   name.**   argv[
73f0: 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e 61  2]   -> table na
7400: 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 33 5d 20  me.**   argv[3] 
7410: 20 20 2d 3e 20 53 51 4c 20 73 74 61 74 65 6d 65    -> SQL stateme
7420: 6e 74 0a 2a 2a 20 20 20 61 72 67 76 5b 34 5d 20  nt.**   argv[4] 
7430: 20 20 2d 3e 20 6e 6f 74 2d 66 6f 75 6e 64 20 63    -> not-found c
7440: 61 6c 6c 62 61 63 6b 20 55 44 46 20 6e 61 6d 65  allback UDF name
7450: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
7460: 6e 69 6f 6e 43 6f 6e 6e 65 63 74 28 0a 20 20 73  nionConnect(.  s
7470: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
7480: 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20  id *pAux,.  int 
7490: 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
74a0: 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20   *const*argv,.  
74b0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
74c0: 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a  pVtab,.  char **
74d0: 70 7a 45 72 72 0a 29 7b 0a 20 20 55 6e 69 6f 6e  pzErr.){.  Union
74e0: 54 61 62 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20  Tab *pTab = 0;. 
74f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7500: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 53 77 61 72  _OK;.  int bSwar
7510: 6d 20 3d 20 28 70 41 75 78 3d 3d 30 20 3f 20 30  m = (pAux==0 ? 0
7520: 20 3a 20 31 29 3b 0a 20 20 63 6f 6e 73 74 20 63   : 1);.  const c
7530: 68 61 72 20 2a 7a 56 74 61 62 20 3d 20 28 62 53  har *zVtab = (bS
7540: 77 61 72 6d 20 3f 20 22 73 77 61 72 6d 76 74 61  warm ? "swarmvta
7550: 62 22 20 3a 20 22 75 6e 69 6f 6e 76 74 61 62 22  b" : "unionvtab"
7560: 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
7570: 33 5f 73 74 72 69 63 6d 70 28 22 74 65 6d 70 22  3_stricmp("temp"
7580: 2c 20 61 72 67 76 5b 31 5d 29 20 29 7b 0a 20 20  , argv[1]) ){.  
7590: 20 20 2f 2a 20 75 6e 69 6f 6e 76 74 61 62 20 74    /* unionvtab t
75a0: 61 62 6c 65 73 20 6d 61 79 20 6f 6e 6c 79 20 62  ables may only b
75b0: 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  e created in the
75c0: 20 74 65 6d 70 20 73 63 68 65 6d 61 20 2a 2f 0a   temp schema */.
75d0: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
75e0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
75f0: 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62 65 20   tables must be 
7600: 63 72 65 61 74 65 64 20 69 6e 20 54 45 4d 50 20  created in TEMP 
7610: 73 63 68 65 6d 61 22 2c 20 7a 56 74 61 62 29 3b  schema", zVtab);
7620: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
7630: 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20  _ERROR;.  }else 
7640: 69 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 28 61  if( argc<4 || (a
7650: 72 67 63 3e 34 20 26 26 20 62 53 77 61 72 6d 3d  rgc>4 && bSwarm=
7660: 3d 30 29 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  =0) ){.    *pzEr
7670: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
7680: 6e 74 66 28 22 77 72 6f 6e 67 20 6e 75 6d 62 65  ntf("wrong numbe
7690: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66  r of arguments f
76a0: 6f 72 20 25 73 22 2c 20 7a 56 74 61 62 29 3b 0a  or %s", zVtab);.
76b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
76c0: 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
76d0: 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d      int nAlloc =
76e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
76f0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
7700: 69 7a 65 20 6f 66 20 70 54 61 62 2d 3e 61 53 72  ize of pTab->aSr
7710: 63 5b 5d 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  c[] */.    sqlit
7720: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
7730: 20 30 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75   0;      /* Argu
7740: 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a  ment statement *
7750: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 72 67  /.    char *zArg
7760: 20 3d 20 75 6e 69 6f 6e 53 74 72 64 75 70 28 26   = unionStrdup(&
7770: 72 63 2c 20 61 72 67 76 5b 33 5d 29 3b 20 20 20  rc, argv[3]);   
7780: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 61 72     /* Copy of ar
7790: 67 75 6d 65 6e 74 20 74 6f 20 43 56 54 20 2a 2f  gument to CVT */
77a0: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65  ..    /* Prepare
77b0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
77c0: 6e 74 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 65  nt. Instead of e
77d0: 78 65 63 75 74 69 6e 67 20 69 74 20 64 69 72 65  xecuting it dire
77e0: 63 74 6c 79 2c 20 73 6f 72 74 0a 20 20 20 20 2a  ctly, sort.    *
77f0: 2a 20 74 68 65 20 72 65 73 75 6c 74 73 20 62 79  * the results by
7800: 20 74 68 65 20 22 6d 69 6e 69 6d 75 6d 20 72 6f   the "minimum ro
7810: 77 69 64 22 20 66 69 65 6c 64 2e 20 54 68 69 73  wid" field. This
7820: 20 6d 61 6b 65 73 20 69 74 20 65 61 73 69 65 72   makes it easier
7830: 20 74 6f 0a 20 20 20 20 2a 2a 20 63 68 65 63 6b   to.    ** check
7840: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
7850: 6e 6f 20 72 6f 77 69 64 20 72 61 6e 67 65 20 6f  no rowid range o
7860: 76 65 72 6c 61 70 73 20 62 65 74 77 65 65 6e 20  verlaps between 
7870: 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 0a 20  source tables . 
7880: 20 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 74     ** and that t
7890: 68 65 20 55 6e 69 6f 6e 54 61 62 2e 61 53 72 63  he UnionTab.aSrc
78a0: 5b 5d 20 61 72 72 61 79 20 69 73 20 61 6c 77 61  [] array is alwa
78b0: 79 73 20 73 6f 72 74 65 64 20 62 79 20 72 6f 77  ys sorted by row
78c0: 69 64 2e 20 20 2a 2f 0a 20 20 20 20 75 6e 69 6f  id.  */.    unio
78d0: 6e 44 65 71 75 6f 74 65 28 7a 41 72 67 29 3b 0a  nDequote(zArg);.
78e0: 20 20 20 20 70 53 74 6d 74 20 3d 20 75 6e 69 6f      pStmt = unio
78f0: 6e 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 26  nPreparePrintf(&
7900: 72 63 2c 20 70 7a 45 72 72 2c 20 64 62 2c 20 0a  rc, pzErr, db, .
7910: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
7920: 2a 20 46 52 4f 4d 20 28 25 7a 29 20 4f 52 44 45  * FROM (%z) ORDE
7930: 52 20 42 59 20 33 22 2c 20 7a 41 72 67 0a 20 20  R BY 3", zArg.  
7940: 20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c    );..    /* All
7950: 6f 63 61 74 65 20 74 68 65 20 55 6e 69 6f 6e 54  ocate the UnionT
7960: 61 62 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ab structure */.
7970: 20 20 20 20 70 54 61 62 20 3d 20 75 6e 69 6f 6e      pTab = union
7980: 4d 61 6c 6c 6f 63 28 26 72 63 2c 20 73 69 7a 65  Malloc(&rc, size
7990: 6f 66 28 55 6e 69 6f 6e 54 61 62 29 29 3b 0a 20  of(UnionTab));. 
79a0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
79b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
79c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
79d0: 20 20 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64      pTab->db = d
79e0: 62 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 62  b;.      pTab->b
79f0: 53 77 61 72 6d 20 3d 20 62 53 77 61 72 6d 3b 0a  Swarm = bSwarm;.
7a00: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 4d 61 78        pTab->nMax
7a10: 4f 70 65 6e 20 3d 20 53 57 41 52 4d 56 54 41 42  Open = SWARMVTAB
7a20: 5f 4d 41 58 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d  _MAX_OPEN;.    }
7a30: 0a 0a 20 20 20 20 2f 2a 20 50 61 72 73 65 20 6f  ..    /* Parse o
7a40: 74 68 65 72 20 43 56 54 20 61 72 67 75 6d 65 6e  ther CVT argumen
7a50: 74 73 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ts, if any */.  
7a60: 20 20 69 66 28 20 62 53 77 61 72 6d 20 29 7b 0a    if( bSwarm ){.
7a70: 20 20 20 20 20 20 75 6e 69 6f 6e 43 6f 6e 66 69        unionConfi
7a80: 67 75 72 65 56 74 61 62 28 26 72 63 2c 20 70 54  gureVtab(&rc, pT
7a90: 61 62 2c 20 70 53 74 6d 74 2c 20 61 72 67 63 2d  ab, pStmt, argc-
7aa0: 34 2c 20 26 61 72 67 76 5b 34 5d 2c 20 70 7a 45  4, &argv[4], pzE
7ab0: 72 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rr);.    }..    
7ac0: 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
7ad0: 67 68 20 74 68 65 20 72 6f 77 73 20 72 65 74 75  gh the rows retu
7ae0: 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20  rned by the SQL 
7af0: 73 74 61 74 65 6d 65 6e 74 20 73 70 65 63 69 66  statement specif
7b00: 69 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 61 6e  ied.    ** as an
7b10: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
7b20: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
7b30: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
7b40: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 72   */.    while( r
7b50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7b60: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
7b70: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
7b80: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
7b90: 68 61 72 20 2a 7a 44 62 20 3d 20 28 63 6f 6e 73  har *zDb = (cons
7ba0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
7bb0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
7bc0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e  t, 0);.      con
7bd0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
7be0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
7bf0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
7c00: 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
7c10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
7c20: 69 4d 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  iMin = sqlite3_c
7c30: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
7c40: 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 2);.      sql
7c50: 69 74 65 33 5f 69 6e 74 36 34 20 69 4d 61 78 20  ite3_int64 iMax 
7c60: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
7c70: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 29  _int64(pStmt, 3)
7c80: 3b 0a 20 20 20 20 20 20 55 6e 69 6f 6e 53 72 63  ;.      UnionSrc
7c90: 20 2a 70 53 72 63 3b 0a 0a 20 20 20 20 20 20 2f   *pSrc;..      /
7ca0: 2a 20 47 72 6f 77 20 74 68 65 20 70 54 61 62 2d  * Grow the pTab-
7cb0: 3e 61 53 72 63 5b 5d 20 61 72 72 61 79 20 69 66  >aSrc[] array if
7cc0: 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
7cd0: 20 20 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3c 3d      if( nAlloc<=
7ce0: 70 54 61 62 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  pTab->nSrc ){.  
7cf0: 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d        int nNew =
7d00: 20 6e 41 6c 6c 6f 63 20 3f 20 6e 41 6c 6c 6f 63   nAlloc ? nAlloc
7d10: 2a 32 20 3a 20 38 3b 0a 20 20 20 20 20 20 20 20  *2 : 8;.        
7d20: 55 6e 69 6f 6e 53 72 63 20 2a 61 4e 65 77 20 3d  UnionSrc *aNew =
7d30: 20 28 55 6e 69 6f 6e 53 72 63 2a 29 73 71 6c 69   (UnionSrc*)sqli
7d40: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
7d50: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
7d60: 53 72 63 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66  Src, nNew*sizeof
7d70: 28 55 6e 69 6f 6e 53 72 63 29 0a 20 20 20 20 20  (UnionSrc).     
7d80: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
7d90: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
7da0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
7db0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
7dc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7dd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7de0: 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
7df0: 5b 70 54 61 62 2d 3e 6e 53 72 63 5d 2c 20 30 2c  [pTab->nSrc], 0,
7e00: 20 28 6e 4e 65 77 2d 70 54 61 62 2d 3e 6e 53 72   (nNew-pTab->nSr
7e10: 63 29 2a 73 69 7a 65 6f 66 28 55 6e 69 6f 6e 53  c)*sizeof(UnionS
7e20: 72 63 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rc));.          
7e30: 70 54 61 62 2d 3e 61 53 72 63 20 3d 20 61 4e 65  pTab->aSrc = aNe
7e40: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 41 6c  w;.          nAl
7e50: 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  loc = nNew;.    
7e60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
7e70: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f       /* Check fo
7e80: 72 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  r problems with 
7e90: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 72 61  the specified ra
7ea0: 6e 67 65 20 6f 66 20 72 6f 77 69 64 73 20 2a 2f  nge of rowids */
7eb0: 0a 20 20 20 20 20 20 69 66 28 20 69 4d 61 78 3c  .      if( iMax<
7ec0: 69 4d 69 6e 20 7c 7c 20 28 70 54 61 62 2d 3e 6e  iMin || (pTab->n
7ed0: 53 72 63 3e 30 20 26 26 20 69 4d 69 6e 3c 3d 70  Src>0 && iMin<=p
7ee0: 54 61 62 2d 3e 61 53 72 63 5b 70 54 61 62 2d 3e  Tab->aSrc[pTab->
7ef0: 6e 53 72 63 2d 31 5d 2e 69 4d 61 78 29 20 29 7b  nSrc-1].iMax) ){
7f00: 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20  .        *pzErr 
7f10: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
7f20: 66 28 22 72 6f 77 69 64 20 72 61 6e 67 65 20 6d  f("rowid range m
7f30: 69 73 6d 61 74 63 68 20 65 72 72 6f 72 22 29 3b  ismatch error");
7f40: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
7f50: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
7f60: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
7f70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7f80: 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 26          pSrc = &
7f90: 70 54 61 62 2d 3e 61 53 72 63 5b 70 54 61 62 2d  pTab->aSrc[pTab-
7fa0: 3e 6e 53 72 63 2b 2b 5d 3b 0a 20 20 20 20 20 20  >nSrc++];.      
7fb0: 20 20 70 53 72 63 2d 3e 7a 54 61 62 20 3d 20 75    pSrc->zTab = u
7fc0: 6e 69 6f 6e 53 74 72 64 75 70 28 26 72 63 2c 20  nionStrdup(&rc, 
7fd0: 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 70  zTab);.        p
7fe0: 53 72 63 2d 3e 69 4d 69 6e 20 3d 20 69 4d 69 6e  Src->iMin = iMin
7ff0: 3b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e  ;.        pSrc->
8000: 69 4d 61 78 20 3d 20 69 4d 61 78 3b 0a 20 20 20  iMax = iMax;.   
8010: 20 20 20 20 20 69 66 28 20 62 53 77 61 72 6d 20       if( bSwarm 
8020: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 72  ){.          pSr
8030: 63 2d 3e 7a 46 69 6c 65 20 3d 20 75 6e 69 6f 6e  c->zFile = union
8040: 53 74 72 64 75 70 28 26 72 63 2c 20 7a 44 62 29  Strdup(&rc, zDb)
8050: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8060: 0a 20 20 20 20 20 20 20 20 20 20 70 53 72 63 2d  .          pSrc-
8070: 3e 7a 44 62 20 3d 20 75 6e 69 6f 6e 53 74 72 64  >zDb = unionStrd
8080: 75 70 28 26 72 63 2c 20 7a 44 62 29 3b 0a 20 20  up(&rc, zDb);.  
8090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
80a0: 69 66 28 20 70 54 61 62 2d 3e 62 48 61 73 43 6f  if( pTab->bHasCo
80b0: 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  ntext ){.       
80c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
80d0: 43 6f 6e 74 65 78 74 20 3d 20 28 63 6f 6e 73 74  Context = (const
80e0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
80f0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
8100: 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
8110: 70 53 72 63 2d 3e 7a 43 6f 6e 74 65 78 74 20 3d  pSrc->zContext =
8120: 20 75 6e 69 6f 6e 53 74 72 64 75 70 28 26 72 63   unionStrdup(&rc
8130: 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
8140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8150: 20 20 20 7d 0a 20 20 20 20 75 6e 69 6f 6e 46 69     }.    unionFi
8160: 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d  nalize(&rc, pStm
8170: 74 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 70  t, pzErr);.    p
8180: 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Stmt = 0;..    /
8190: 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72  * It is an error
81a0: 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   if the SELECT s
81b0: 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 65  tatement returne
81c0: 64 20 7a 65 72 6f 20 72 6f 77 73 2e 20 49 66 20  d zero rows. If 
81d0: 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 62 65 63 61  only.    ** beca
81e0: 75 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  use there is no 
81f0: 77 61 79 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  way to determine
8200: 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74   the schema of t
8210: 68 65 20 76 69 72 74 75 61 6c 20 0a 20 20 20 20  he virtual .    
8220: 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73  ** table in this
8230: 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
8240: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8250: 20 26 26 20 70 54 61 62 2d 3e 6e 53 72 63 3d 3d   && pTab->nSrc==
8260: 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72  0 ){.      *pzEr
8270: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
8280: 6e 74 66 28 22 6e 6f 20 73 6f 75 72 63 65 20 74  ntf("no source t
8290: 61 62 6c 65 73 20 63 6f 6e 66 69 67 75 72 65 64  ables configured
82a0: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ");.      rc = S
82b0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
82c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 75   }..    /* For u
82d0: 6e 69 6f 6e 76 74 61 62 2c 20 76 65 72 69 66 79  nionvtab, verify
82e0: 20 74 68 61 74 20 61 6c 6c 20 73 6f 75 72 63 65   that all source
82f0: 20 74 61 62 6c 65 73 20 65 78 69 73 74 20 61 6e   tables exist an
8300: 64 20 68 61 76 65 20 0a 20 20 20 20 2a 2a 20 63  d have .    ** c
8310: 6f 6d 70 61 74 69 62 6c 65 20 73 63 68 65 6d 61  ompatible schema
8320: 73 2e 20 46 6f 72 20 73 77 61 72 6d 76 74 61 62  s. For swarmvtab
8330: 2c 20 61 74 74 61 63 68 20 74 68 65 20 66 69 72  , attach the fir
8340: 73 74 20 64 61 74 61 62 61 73 65 20 61 6e 64 0a  st database and.
8350: 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 74 68 61      ** check tha
8360: 74 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c  t the first tabl
8370: 65 20 69 73 20 61 20 72 6f 77 69 64 20 74 61 62  e is a rowid tab
8380: 6c 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20  le only.  */.   
8390: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
83a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
83b0: 62 53 77 61 72 6d 20 29 7b 0a 20 20 20 20 20 20  bSwarm ){.      
83c0: 20 20 72 63 20 3d 20 75 6e 69 6f 6e 4f 70 65 6e    rc = unionOpen
83d0: 44 61 74 61 62 61 73 65 28 70 54 61 62 2c 20 30  Database(pTab, 0
83e0: 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  , pzErr);.      
83f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
8400: 63 20 3d 20 75 6e 69 6f 6e 53 6f 75 72 63 65 43  c = unionSourceC
8410: 68 65 63 6b 28 70 54 61 62 2c 20 70 7a 45 72 72  heck(pTab, pzErr
8420: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8430: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 65  ..    /* Compose
8440: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8450: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 70 61  statement and pa
8460: 73 73 20 69 74 20 74 6f 20 64 65 63 6c 61 72 65  ss it to declare
8470: 5f 76 74 61 62 28 29 20 2a 2f 0a 20 20 20 20 69  _vtab() */.    i
8480: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8490: 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 6f 6e 53   ){.      UnionS
84a0: 72 63 20 2a 70 53 72 63 20 3d 20 26 70 54 61 62  rc *pSrc = &pTab
84b0: 2d 3e 61 53 72 63 5b 30 5d 3b 0a 20 20 20 20 20  ->aSrc[0];.     
84c0: 20 73 71 6c 69 74 65 33 20 2a 74 64 62 20 3d 20   sqlite3 *tdb = 
84d0: 75 6e 69 6f 6e 47 65 74 44 62 28 70 54 61 62 2c  unionGetDb(pTab,
84e0: 20 70 53 72 63 29 3b 0a 20 20 20 20 20 20 70 53   pSrc);.      pS
84f0: 74 6d 74 20 3d 20 75 6e 69 6f 6e 50 72 65 70 61  tmt = unionPrepa
8500: 72 65 50 72 69 6e 74 66 28 26 72 63 2c 20 70 7a  rePrintf(&rc, pz
8510: 45 72 72 2c 20 74 64 62 2c 20 22 53 45 4c 45 43  Err, tdb, "SELEC
8520: 54 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 27  T ".          "'
8530: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a  CREATE TABLE xyz
8540: 28 27 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  ('".          " 
8550: 20 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63     || group_conc
8560: 61 74 28 71 75 6f 74 65 28 6e 61 6d 65 29 20 7c  at(quote(name) |
8570: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 2c 20 27  | ' ' || type, '
8580: 2c 20 27 29 22 0a 20 20 20 20 20 20 20 20 20 20  , ')".          
8590: 22 20 20 20 20 7c 7c 20 27 29 27 2c 22 0a 20 20  "    || ')',".  
85a0: 20 20 20 20 20 20 20 20 22 6d 61 78 28 28 63 69          "max((ci
85b0: 64 2b 31 29 20 2a 20 28 74 79 70 65 3d 27 49 4e  d+1) * (type='IN
85c0: 54 45 47 45 52 27 20 43 4f 4c 4c 41 54 45 20 6e  TEGER' COLLATE n
85d0: 6f 63 61 73 65 20 41 4e 44 20 70 6b 3d 31 29 29  ocase AND pk=1))
85e0: 2d 31 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  -1 ".          "
85f0: 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c  FROM pragma_tabl
8600: 65 5f 69 6e 66 6f 28 25 51 2c 20 3f 29 22 2c 20  e_info(%Q, ?)", 
8610: 0a 20 20 20 20 20 20 20 20 20 20 70 53 72 63 2d  .          pSrc-
8620: 3e 7a 54 61 62 2c 20 70 53 72 63 2d 3e 7a 44 62  >zTab, pSrc->zDb
8630: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
8640: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
8650: 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
8660: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
8670: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
8680: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
8690: 65 63 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ecl = (const cha
86a0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
86b0: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
86c0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
86d0: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
86e0: 62 28 64 62 2c 20 7a 44 65 63 6c 29 3b 0a 20 20  b(db, zDecl);.  
86f0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 20 3d 20      pTab->iPK = 
8700: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
8710: 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  nt(pStmt, 1);.  
8720: 20 20 7d 0a 0a 20 20 20 20 75 6e 69 6f 6e 46 69    }..    unionFi
8730: 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d  nalize(&rc, pStm
8740: 74 2c 20 70 7a 45 72 72 29 3b 0a 20 20 7d 0a 0a  t, pzErr);.  }..
8750: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8760: 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69 6f 6e  _OK ){.    union
8770: 44 69 73 63 6f 6e 6e 65 63 74 28 28 73 71 6c 69  Disconnect((sqli
8780: 74 65 33 5f 76 74 61 62 2a 29 70 54 61 62 29 3b  te3_vtab*)pTab);
8790: 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20  .    pTab = 0;. 
87a0: 20 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d 20   }..  *ppVtab = 
87b0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70  (sqlite3_vtab*)p
87c0: 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Tab;.  return rc
87d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 4f 70 65 6e  ;.}../*.** xOpen
87e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
87f0: 6e 69 6f 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33  nionOpen(sqlite3
8800: 5f 76 74 61 62 20 2a 70 2c 20 73 71 6c 69 74 65  _vtab *p, sqlite
8810: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a  3_vtab_cursor **
8820: 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 55 6e 69  ppCursor){.  Uni
8830: 6f 6e 43 73 72 20 2a 70 43 73 72 3b 0a 20 20 69  onCsr *pCsr;.  i
8840: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8850: 4b 3b 0a 20 20 28 76 6f 69 64 29 70 3b 20 20 2f  K;.  (void)p;  /
8860: 2a 20 53 75 70 70 72 65 73 73 20 68 61 72 6d 6c  * Suppress harml
8870: 65 73 73 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ess warning */. 
8880: 20 70 43 73 72 20 3d 20 28 55 6e 69 6f 6e 43 73   pCsr = (UnionCs
8890: 72 2a 29 75 6e 69 6f 6e 4d 61 6c 6c 6f 63 28 26  r*)unionMalloc(&
88a0: 72 63 2c 20 73 69 7a 65 6f 66 28 55 6e 69 6f 6e  rc, sizeof(Union
88b0: 43 73 72 29 29 3b 0a 20 20 2a 70 70 43 75 72 73  Csr));.  *ppCurs
88c0: 6f 72 20 3d 20 26 70 43 73 72 2d 3e 62 61 73 65  or = &pCsr->base
88d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
88e0: 0a 0a 2f 2a 0a 2a 2a 20 78 43 6c 6f 73 65 0a 2a  ../*.** xClose.*
88f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
8900: 6f 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  onClose(sqlite3_
8910: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
8920: 29 7b 0a 20 20 55 6e 69 6f 6e 43 73 72 20 2a 70  ){.  UnionCsr *p
8930: 43 73 72 20 3d 20 28 55 6e 69 6f 6e 43 73 72 2a  Csr = (UnionCsr*
8940: 29 63 75 72 3b 0a 20 20 75 6e 69 6f 6e 46 69 6e  )cur;.  unionFin
8950: 61 6c 69 7a 65 43 73 72 53 74 6d 74 28 70 43 73  alizeCsrStmt(pCs
8960: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
8970: 65 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75  ee(pCsr);.  retu
8980: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8990: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
89a0: 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f  tion does the wo
89b0: 72 6b 20 6f 66 20 74 68 65 20 78 4e 65 78 74 28  rk of the xNext(
89c0: 29 20 6d 65 74 68 6f 64 2e 20 45 78 63 65 70 74  ) method. Except
89d0: 20 74 68 61 74 2c 20 69 66 20 69 74 0a 2a 2a 20   that, if it.** 
89e0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 52  returns SQLITE_R
89f0: 4f 57 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65  OW, it should be
8a00: 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69   called again wi
8a10: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 78 4e  thin the same xN
8a20: 65 78 74 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  ext().** method 
8a30: 63 61 6c 6c 2e 20 53 65 65 20 75 6e 69 6f 6e 4e  call. See unionN
8a40: 65 78 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  ext() for detail
8a50: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
8a60: 20 64 6f 55 6e 69 6f 6e 4e 65 78 74 28 55 6e 69   doUnionNext(Uni
8a70: 6f 6e 43 73 72 20 2a 70 43 73 72 29 7b 0a 20 20  onCsr *pCsr){.  
8a80: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8a90: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  OK;.  assert( pC
8aa0: 73 72 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 69  sr->pStmt );.  i
8ab0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
8ac0: 70 43 73 72 2d 3e 70 53 74 6d 74 29 21 3d 53 51  pCsr->pStmt)!=SQ
8ad0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
8ae0: 55 6e 69 6f 6e 54 61 62 20 2a 70 54 61 62 20 3d  UnionTab *pTab =
8af0: 20 28 55 6e 69 6f 6e 54 61 62 2a 29 70 43 73 72   (UnionTab*)pCsr
8b00: 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20  ->base.pVtab;.  
8b10: 20 20 72 63 20 3d 20 75 6e 69 6f 6e 46 69 6e 61    rc = unionFina
8b20: 6c 69 7a 65 43 73 72 53 74 6d 74 28 70 43 73 72  lizeCsrStmt(pCsr
8b30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
8b40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 61 62  QLITE_OK && pTab
8b50: 2d 3e 62 53 77 61 72 6d 20 29 7b 0a 20 20 20 20  ->bSwarm ){.    
8b60: 20 20 70 43 73 72 2d 3e 69 54 61 62 2b 2b 3b 0a    pCsr->iTab++;.
8b70: 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e        if( pCsr->
8b80: 69 54 61 62 3c 70 54 61 62 2d 3e 6e 53 72 63 20  iTab<pTab->nSrc 
8b90: 29 7b 0a 20 20 20 20 20 20 20 20 55 6e 69 6f 6e  ){.        Union
8ba0: 53 72 63 20 2a 70 53 72 63 20 3d 20 26 70 54 61  Src *pSrc = &pTa
8bb0: 62 2d 3e 61 53 72 63 5b 70 43 73 72 2d 3e 69 54  b->aSrc[pCsr->iT
8bc0: 61 62 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ab];.        if(
8bd0: 20 70 43 73 72 2d 3e 69 4d 61 78 52 6f 77 69 64   pCsr->iMaxRowid
8be0: 3e 3d 70 53 72 63 2d 3e 69 4d 69 6e 20 29 7b 0a  >=pSrc->iMin ){.
8bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20            /* It 
8c00: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
8c10: 73 63 61 6e 20 74 68 65 20 6e 65 78 74 20 74 61  scan the next ta
8c20: 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ble. */.        
8c30: 20 20 72 63 20 3d 20 75 6e 69 6f 6e 4f 70 65 6e    rc = unionOpen
8c40: 44 61 74 61 62 61 73 65 28 70 54 61 62 2c 20 70  Database(pTab, p
8c50: 43 73 72 2d 3e 69 54 61 62 2c 20 26 70 54 61 62  Csr->iTab, &pTab
8c60: 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 29 3b  ->base.zErrMsg);
8c70: 0a 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d  .          pCsr-
8c80: 3e 70 53 74 6d 74 20 3d 20 75 6e 69 6f 6e 50 72  >pStmt = unionPr
8c90: 65 70 61 72 65 50 72 69 6e 74 66 28 26 72 63 2c  eparePrintf(&rc,
8ca0: 20 26 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72   &pTab->base.zEr
8cb0: 72 4d 73 67 2c 20 70 53 72 63 2d 3e 64 62 2c 0a  rMsg, pSrc->db,.
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
8cd0: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
8ce0: 52 4f 4d 20 25 51 20 25 73 20 25 6c 6c 64 22 2c  ROM %Q %s %lld",
8cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8d00: 53 72 63 2d 3e 7a 54 61 62 2c 0a 20 20 20 20 20  Src->zTab,.     
8d10: 20 20 20 20 20 20 20 20 20 28 70 53 72 63 2d 3e           (pSrc->
8d20: 69 4d 61 78 3e 70 43 73 72 2d 3e 69 4d 61 78 52  iMax>pCsr->iMaxR
8d30: 6f 77 69 64 20 3f 20 22 57 48 45 52 45 20 5f 72  owid ? "WHERE _r
8d40: 6f 77 69 64 5f 20 3c 3d 22 20 3a 20 22 2d 2d 20  owid_ <=" : "-- 
8d50: 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "),.            
8d60: 20 20 70 43 73 72 2d 3e 69 4d 61 78 52 6f 77 69    pCsr->iMaxRowi
8d70: 64 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  d.          );. 
8d80: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
8d90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8da0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8db0: 28 20 70 43 73 72 2d 3e 70 53 74 6d 74 20 29 3b  ( pCsr->pStmt );
8dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 69  .            uni
8dd0: 6f 6e 49 6e 63 72 52 65 66 63 6f 75 6e 74 28 70  onIncrRefcount(p
8de0: 54 61 62 2c 20 70 43 73 72 2d 3e 69 54 61 62 29  Tab, pCsr->iTab)
8df0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
8e00: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
8e10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8e20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8e30: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
8e40: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 4e   rc;.}../*.** xN
8e50: 65 78 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ext.*/.static in
8e60: 74 20 75 6e 69 6f 6e 4e 65 78 74 28 73 71 6c 69  t unionNext(sqli
8e70: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
8e80: 2a 63 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *cur){.  int rc;
8e90: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
8ea0: 20 64 6f 55 6e 69 6f 6e 4e 65 78 74 28 28 55 6e   doUnionNext((Un
8eb0: 69 6f 6e 43 73 72 2a 29 63 75 72 29 3b 0a 20 20  ionCsr*)cur);.  
8ec0: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
8ed0: 54 45 5f 52 4f 57 20 29 3b 0a 20 20 72 65 74 75  TE_ROW );.  retu
8ee0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8ef0: 78 43 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69  xColumn.*/.stati
8f00: 63 20 69 6e 74 20 75 6e 69 6f 6e 43 6f 6c 75 6d  c int unionColum
8f10: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  n(.  sqlite3_vta
8f20: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 0a 20  b_cursor *cur,. 
8f30: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8f40: 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 69 0a 29   *ctx,.  int i.)
8f50: 7b 0a 20 20 55 6e 69 6f 6e 43 73 72 20 2a 70 43  {.  UnionCsr *pC
8f60: 73 72 20 3d 20 28 55 6e 69 6f 6e 43 73 72 2a 29  sr = (UnionCsr*)
8f70: 63 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  cur;.  sqlite3_r
8f80: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c  esult_value(ctx,
8f90: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
8fa0: 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 53 74 6d  value(pCsr->pStm
8fb0: 74 2c 20 69 2b 31 29 29 3b 0a 20 20 72 65 74 75  t, i+1));.  retu
8fc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8fd0: 0a 2f 2a 0a 2a 2a 20 78 52 6f 77 69 64 0a 2a 2f  ./*.** xRowid.*/
8fe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 6f  .static int unio
8ff0: 6e 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76  nRowid(sqlite3_v
9000: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c  tab_cursor *cur,
9010: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
9020: 52 6f 77 69 64 29 7b 0a 20 20 55 6e 69 6f 6e 43  Rowid){.  UnionC
9030: 73 72 20 2a 70 43 73 72 20 3d 20 28 55 6e 69 6f  sr *pCsr = (Unio
9040: 6e 43 73 72 2a 29 63 75 72 3b 0a 20 20 2a 70 52  nCsr*)cur;.  *pR
9050: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  owid = sqlite3_c
9060: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 43 73 72  olumn_int64(pCsr
9070: 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 72  ->pStmt, 0);.  r
9080: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 45 6f 66 0a 2a  .}../*.** xEof.*
90a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
90b0: 6f 6e 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74  onEof(sqlite3_vt
90c0: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
90d0: 0a 20 20 55 6e 69 6f 6e 43 73 72 20 2a 70 43 73  .  UnionCsr *pCs
90e0: 72 20 3d 20 28 55 6e 69 6f 6e 43 73 72 2a 29 63  r = (UnionCsr*)c
90f0: 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 73  ur;.  return pCs
9100: 72 2d 3e 70 53 74 6d 74 3d 3d 30 3b 0a 7d 0a 0a  r->pStmt==0;.}..
9110: 2f 2a 0a 2a 2a 20 78 46 69 6c 74 65 72 0a 2a 2f  /*.** xFilter.*/
9120: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 6f  .static int unio
9130: 6e 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74  nFilter(.  sqlit
9140: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
9150: 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20  pVtabCursor, .  
9160: 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73  int idxNum, cons
9170: 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a  t char *idxStr,.
9180: 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69    int argc, sqli
9190: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
91a0: 0a 29 7b 0a 20 20 55 6e 69 6f 6e 54 61 62 20 2a  .){.  UnionTab *
91b0: 70 54 61 62 20 3d 20 28 55 6e 69 6f 6e 54 61 62  pTab = (UnionTab
91c0: 2a 29 28 70 56 74 61 62 43 75 72 73 6f 72 2d 3e  *)(pVtabCursor->
91d0: 70 56 74 61 62 29 3b 0a 20 20 55 6e 69 6f 6e 43  pVtab);.  UnionC
91e0: 73 72 20 2a 70 43 73 72 20 3d 20 28 55 6e 69 6f  sr *pCsr = (Unio
91f0: 6e 43 73 72 2a 29 70 56 74 61 62 43 75 72 73 6f  nCsr*)pVtabCurso
9200: 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
9210: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
9220: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  ;.  char *zSql =
9230: 20 30 3b 0a 20 20 69 6e 74 20 62 5a 65 72 6f 20   0;.  int bZero 
9240: 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  = 0;..  sqlite3_
9250: 69 6e 74 36 34 20 69 4d 69 6e 20 3d 20 53 4d 41  int64 iMin = SMA
9260: 4c 4c 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 73  LLEST_INT64;.  s
9270: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4d 61  qlite3_int64 iMa
9280: 78 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  x = LARGEST_INT6
9290: 34 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  4;..  assert( id
92a0: 78 4e 75 6d 3d 3d 30 20 0a 20 20 20 20 20 20 20  xNum==0 .       
92b0: 7c 7c 20 69 64 78 4e 75 6d 3d 3d 53 51 4c 49 54  || idxNum==SQLIT
92c0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
92d0: 4e 54 5f 45 51 0a 20 20 20 20 20 20 20 7c 7c 20  NT_EQ.       || 
92e0: 69 64 78 4e 75 6d 3d 3d 53 51 4c 49 54 45 5f 49  idxNum==SQLITE_I
92f0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
9300: 4c 45 0a 20 20 20 20 20 20 20 7c 7c 20 69 64 78  LE.       || idx
9310: 4e 75 6d 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  Num==SQLITE_INDE
9320: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 0a  X_CONSTRAINT_GE.
9330: 20 20 20 20 20 20 20 7c 7c 20 69 64 78 4e 75 6d         || idxNum
9340: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
9350: 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 0a 20 20 20  ONSTRAINT_LT.   
9360: 20 20 20 20 7c 7c 20 69 64 78 4e 75 6d 3d 3d 53      || idxNum==S
9370: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
9380: 54 52 41 49 4e 54 5f 47 54 0a 20 20 20 20 20 20  TRAINT_GT.      
9390: 20 7c 7c 20 69 64 78 4e 75 6d 3d 3d 28 53 51 4c   || idxNum==(SQL
93a0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
93b0: 41 49 4e 54 5f 47 45 7c 53 51 4c 49 54 45 5f 49  AINT_GE|SQLITE_I
93c0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
93d0: 4c 45 29 0a 20 20 29 3b 0a 0a 20 20 28 76 6f 69  LE).  );..  (voi
93e0: 64 29 69 64 78 53 74 72 3b 20 20 2f 2a 20 53 75  d)idxStr;  /* Su
93f0: 70 70 72 65 73 73 20 68 61 72 6d 6c 65 73 73 20  ppress harmless 
9400: 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20  warning */.  .  
9410: 69 66 28 20 69 64 78 4e 75 6d 3d 3d 53 51 4c 49  if( idxNum==SQLI
9420: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
9430: 49 4e 54 5f 45 51 20 29 7b 0a 20 20 20 20 61 73  INT_EQ ){.    as
9440: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
9450: 0a 20 20 20 20 69 4d 69 6e 20 3d 20 69 4d 61 78  .    iMin = iMax
9460: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
9470: 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b  _int64(argv[0]);
9480: 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 69  .  }else{..    i
9490: 66 28 20 69 64 78 4e 75 6d 20 26 20 28 53 51 4c  f( idxNum & (SQL
94a0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
94b0: 41 49 4e 54 5f 4c 45 7c 53 51 4c 49 54 45 5f 49  AINT_LE|SQLITE_I
94c0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
94d0: 4c 54 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LT) ){.      ass
94e0: 65 72 74 28 20 61 72 67 63 3e 3d 31 20 29 3b 0a  ert( argc>=1 );.
94f0: 20 20 20 20 20 20 69 4d 61 78 20 3d 20 73 71 6c        iMax = sql
9500: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
9510: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
9520: 20 69 66 28 20 69 64 78 4e 75 6d 20 26 20 53 51   if( idxNum & SQ
9530: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
9540: 52 41 49 4e 54 5f 4c 54 20 29 7b 0a 20 20 20 20  RAINT_LT ){.    
9550: 20 20 20 20 69 66 28 20 69 4d 61 78 3d 3d 53 4d      if( iMax==SM
9560: 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 7b 0a  ALLEST_INT64 ){.
9570: 20 20 20 20 20 20 20 20 20 20 62 5a 65 72 6f 20            bZero 
9580: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
9590: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4d  se{.          iM
95a0: 61 78 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ax--;.        }.
95b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
95c0: 20 20 20 69 66 28 20 69 64 78 4e 75 6d 20 26 20     if( idxNum & 
95d0: 28 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  (SQLITE_INDEX_CO
95e0: 4e 53 54 52 41 49 4e 54 5f 47 45 7c 53 51 4c 49  NSTRAINT_GE|SQLI
95f0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
9600: 49 4e 54 5f 47 54 29 20 29 7b 0a 20 20 20 20 20  INT_GT) ){.     
9610: 20 61 73 73 65 72 74 28 20 61 72 67 63 3e 3d 31   assert( argc>=1
9620: 20 29 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d   );.      iMin =
9630: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
9640: 6e 74 36 34 28 61 72 67 76 5b 61 72 67 63 2d 31  nt64(argv[argc-1
9650: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 64  ]);.      if( id
9660: 78 4e 75 6d 20 26 20 53 51 4c 49 54 45 5f 49 4e  xNum & SQLITE_IN
9670: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
9680: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
9690: 20 69 4d 69 6e 3d 3d 4c 41 52 47 45 53 54 5f 49   iMin==LARGEST_I
96a0: 4e 54 36 34 20 29 7b 0a 20 20 20 20 20 20 20 20  NT64 ){.        
96b0: 20 20 62 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20    bZero = 1;.   
96c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
96d0: 20 20 20 20 20 20 69 4d 69 6e 2b 2b 3b 0a 20 20        iMin++;.  
96e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
96f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 75 6e 69      }.  }..  uni
9700: 6f 6e 46 69 6e 61 6c 69 7a 65 43 73 72 53 74 6d  onFinalizeCsrStm
9710: 74 28 70 43 73 72 29 3b 0a 20 20 69 66 28 20 62  t(pCsr);.  if( b
9720: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 72 65 74 75  Zero ){.    retu
9730: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9740: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
9750: 70 54 61 62 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pTab->nSrc; i++)
9760: 7b 0a 20 20 20 20 55 6e 69 6f 6e 53 72 63 20 2a  {.    UnionSrc *
9770: 70 53 72 63 20 3d 20 26 70 54 61 62 2d 3e 61 53  pSrc = &pTab->aS
9780: 72 63 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69  rc[i];.    if( i
9790: 4d 69 6e 3e 70 53 72 63 2d 3e 69 4d 61 78 20 7c  Min>pSrc->iMax |
97a0: 7c 20 69 4d 61 78 3c 70 53 72 63 2d 3e 69 4d 69  | iMax<pSrc->iMi
97b0: 6e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69  n ){.      conti
97c0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
97d0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
97e0: 70 72 69 6e 74 66 28 22 25 7a 25 73 53 45 4c 45  printf("%z%sSELE
97f0: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
9800: 20 25 73 25 71 25 73 25 51 22 0a 20 20 20 20 20   %s%q%s%Q".     
9810: 20 20 20 2c 20 7a 53 71 6c 0a 20 20 20 20 20 20     , zSql.      
9820: 20 20 2c 20 28 7a 53 71 6c 20 3f 20 22 20 55 4e    , (zSql ? " UN
9830: 49 4f 4e 20 41 4c 4c 20 22 20 3a 20 22 22 29 0a  ION ALL " : "").
9840: 20 20 20 20 20 20 20 20 2c 20 28 70 53 72 63 2d          , (pSrc-
9850: 3e 7a 44 62 20 3f 20 22 27 22 20 3a 20 22 22 29  >zDb ? "'" : "")
9860: 0a 20 20 20 20 20 20 20 20 2c 20 28 70 53 72 63  .        , (pSrc
9870: 2d 3e 7a 44 62 20 3f 20 70 53 72 63 2d 3e 7a 44  ->zDb ? pSrc->zD
9880: 62 20 3a 20 22 22 29 0a 20 20 20 20 20 20 20 20  b : "").        
9890: 2c 20 28 70 53 72 63 2d 3e 7a 44 62 20 3f 20 22  , (pSrc->zDb ? "
98a0: 27 2e 22 20 3a 20 22 22 29 0a 20 20 20 20 20 20  '." : "").      
98b0: 20 20 2c 20 70 53 72 63 2d 3e 7a 54 61 62 0a 20    , pSrc->zTab. 
98c0: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53     );.    if( zS
98d0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
98e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
98f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9900: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4d     }..    if( iM
9910: 69 6e 3d 3d 69 4d 61 78 20 29 7b 0a 20 20 20 20  in==iMax ){.    
9920: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
9930: 5f 6d 70 72 69 6e 74 66 28 22 25 7a 20 57 48 45  _mprintf("%z WHE
9940: 52 45 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20  RE rowid=%lld", 
9950: 7a 53 71 6c 2c 20 69 4d 69 6e 29 3b 0a 20 20 20  zSql, iMin);.   
9960: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
9970: 6e 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65  nst char *zWhere
9980: 20 3d 20 22 57 48 45 52 45 22 3b 0a 20 20 20 20   = "WHERE";.    
9990: 20 20 69 66 28 20 69 4d 69 6e 21 3d 53 4d 41 4c    if( iMin!=SMAL
99a0: 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 69 4d  LEST_INT64 && iM
99b0: 69 6e 3e 70 53 72 63 2d 3e 69 4d 69 6e 20 29 7b  in>pSrc->iMin ){
99c0: 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
99d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
99e0: 22 25 7a 20 57 48 45 52 45 20 72 6f 77 69 64 3e  "%z WHERE rowid>
99f0: 3d 25 6c 6c 64 22 2c 20 7a 53 71 6c 2c 20 69 4d  =%lld", zSql, iM
9a00: 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7a 57 68  in);.        zWh
9a10: 65 72 65 20 3d 20 22 41 4e 44 22 3b 0a 20 20 20  ere = "AND";.   
9a20: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
9a30: 4d 61 78 21 3d 4c 41 52 47 45 53 54 5f 49 4e 54  Max!=LARGEST_INT
9a40: 36 34 20 26 26 20 69 4d 61 78 3c 70 53 72 63 2d  64 && iMax<pSrc-
9a50: 3e 69 4d 61 78 20 29 7b 0a 20 20 20 20 20 20 20  >iMax ){.       
9a60: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
9a70: 6d 70 72 69 6e 74 66 28 22 25 7a 20 25 73 20 72  mprintf("%z %s r
9a80: 6f 77 69 64 3c 3d 25 6c 6c 64 22 2c 20 7a 53 71  owid<=%lld", zSq
9a90: 6c 2c 20 7a 57 68 65 72 65 2c 20 69 4d 61 78 29  l, zWhere, iMax)
9aa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9ab0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 62  .    if( pTab->b
9ac0: 53 77 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 70  Swarm ){.      p
9ad0: 43 73 72 2d 3e 69 54 61 62 20 3d 20 69 3b 0a 20  Csr->iTab = i;. 
9ae0: 20 20 20 20 20 70 43 73 72 2d 3e 69 4d 61 78 52       pCsr->iMaxR
9af0: 6f 77 69 64 20 3d 20 69 4d 61 78 3b 0a 20 20 20  owid = iMax;.   
9b00: 20 20 20 72 63 20 3d 20 75 6e 69 6f 6e 4f 70 65     rc = unionOpe
9b10: 6e 44 61 74 61 62 61 73 65 28 70 54 61 62 2c 20  nDatabase(pTab, 
9b20: 69 2c 20 26 70 54 61 62 2d 3e 62 61 73 65 2e 7a  i, &pTab->base.z
9b30: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 62  ErrMsg);.      b
9b40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
9b50: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
9b60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
9b70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
9b80: 6c 69 74 65 33 20 2a 64 62 20 3d 20 75 6e 69 6f  lite3 *db = unio
9b90: 6e 47 65 74 44 62 28 70 54 61 62 2c 20 26 70 54  nGetDb(pTab, &pT
9ba0: 61 62 2d 3e 61 53 72 63 5b 70 43 73 72 2d 3e 69  ab->aSrc[pCsr->i
9bb0: 54 61 62 5d 29 3b 0a 20 20 20 20 70 43 73 72 2d  Tab]);.    pCsr-
9bc0: 3e 70 53 74 6d 74 20 3d 20 75 6e 69 6f 6e 50 72  >pStmt = unionPr
9bd0: 65 70 61 72 65 28 26 72 63 2c 20 64 62 2c 20 7a  epare(&rc, db, z
9be0: 53 71 6c 2c 20 26 70 54 61 62 2d 3e 62 61 73 65  Sql, &pTab->base
9bf0: 2e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69  .zErrMsg);.    i
9c00: 66 28 20 70 43 73 72 2d 3e 70 53 74 6d 74 20 29  f( pCsr->pStmt )
9c10: 7b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 49 6e 63  {.      unionInc
9c20: 72 52 65 66 63 6f 75 6e 74 28 70 54 61 62 2c 20  rRefcount(pTab, 
9c30: 70 43 73 72 2d 3e 69 54 61 62 29 3b 0a 20 20 20  pCsr->iTab);.   
9c40: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
9c50: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20  ree(zSql);.  }. 
9c60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9c70: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
9c80: 20 20 72 65 74 75 72 6e 20 75 6e 69 6f 6e 4e 65    return unionNe
9c90: 78 74 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  xt(pVtabCursor);
9ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 42 65 73 74 49  .}../*.** xBestI
9cb0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ndex..**.** This
9cc0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
9cd0: 73 65 61 72 63 68 65 73 20 66 6f 72 20 63 6f 6e  searches for con
9ce0: 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 65 20  straints on the 
9cf0: 72 6f 77 69 64 20 66 69 65 6c 64 2e 20 45 51 2c  rowid field. EQ,
9d00: 20 0a 2a 2a 20 4c 45 2c 20 4c 54 2c 20 47 45 20   .** LE, LT, GE 
9d10: 61 6e 64 20 47 54 20 61 72 65 20 68 61 6e 64 6c  and GT are handl
9d20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
9d30: 72 65 20 69 73 20 61 6e 20 45 51 20 63 6f 6d 70  re is an EQ comp
9d40: 61 72 69 73 6f 6e 2c 20 74 68 65 6e 20 69 64 78  arison, then idx
9d50: 4e 75 6d 20 69 73 20 73 65 74 20 74 6f 20 49 4e  Num is set to IN
9d60: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
9d70: 51 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  Q..** In this ca
9d80: 73 65 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  se the only argu
9d90: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78  ment passed to x
9da0: 46 69 6c 74 65 72 20 69 73 20 74 68 65 20 72 68  Filter is the rh
9db0: 73 20 6f 66 20 74 68 65 20 3d 3d 0a 2a 2a 20 6f  s of the ==.** o
9dc0: 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4f  perator..**.** O
9dd0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20  therwise, if an 
9de0: 4c 45 20 6f 72 20 4c 54 20 63 6f 6e 73 74 72 61  LE or LT constra
9df0: 69 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  int is found, th
9e00: 65 6e 20 74 68 65 20 49 4e 44 45 58 5f 43 4f 4e  en the INDEX_CON
9e10: 53 54 52 41 49 4e 54 5f 4c 45 0a 2a 2a 20 6f 72  STRAINT_LE.** or
9e20: 20 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e   INDEX_CONSTRAIN
9e30: 54 5f 4c 54 20 28 62 75 74 20 6e 6f 74 20 62 6f  T_LT (but not bo
9e40: 74 68 29 20 62 69 74 20 69 73 20 73 65 74 20 69  th) bit is set i
9e50: 6e 20 69 64 78 4e 75 6d 2e 20 54 68 65 20 66 69  n idxNum. The fi
9e60: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  rst.** argument 
9e70: 74 6f 20 78 46 69 6c 74 65 72 20 69 73 20 74 68  to xFilter is th
9e80: 65 20 72 68 73 20 6f 66 20 74 68 65 20 3c 3d 20  e rhs of the <= 
9e90: 6f 72 20 3c 20 6f 70 65 72 61 74 6f 72 2e 20 20  or < operator.  
9ea0: 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 0a 2a  Similarly, if .*
9eb0: 2a 20 61 6e 20 47 45 20 6f 72 20 47 54 20 63 6f  * an GE or GT co
9ec0: 6e 73 74 72 61 69 6e 74 20 69 73 20 66 6f 75 6e  nstraint is foun
9ed0: 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4e 44 45  d, then the INDE
9ee0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20  X_CONSTRAINT_GE 
9ef0: 6f 72 0a 2a 2a 20 49 4e 44 45 58 5f 43 4f 4e 53  or.** INDEX_CONS
9f00: 54 52 41 49 4e 54 5f 47 54 20 62 69 74 20 69 73  TRAINT_GT bit is
9f10: 20 73 65 74 20 69 6e 20 69 64 78 4e 75 6d 2e 20   set in idxNum. 
9f20: 54 68 65 20 72 68 73 20 6f 66 20 74 68 65 20 3e  The rhs of the >
9f30: 3d 20 6f 72 20 3e 20 6f 70 65 72 61 74 6f 72 0a  = or > operator.
9f40: 2a 2a 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ** is passed as 
9f50: 65 69 74 68 65 72 20 74 68 65 20 66 69 72 73 74  either the first
9f60: 20 6f 72 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   or second argum
9f70: 65 6e 74 20 74 6f 20 78 46 69 6c 74 65 72 2c 20  ent to xFilter, 
9f80: 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20  depending.** on 
9f90: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
9fa0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 4c  here is also a L
9fb0: 54 7c 4c 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  T|LE constraint.
9fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
9fd0: 6e 69 6f 6e 42 65 73 74 49 6e 64 65 78 28 0a 20  nionBestIndex(. 
9fe0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74   sqlite3_vtab *t
9ff0: 61 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  ab,.  sqlite3_in
a000: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
a010: 66 6f 0a 29 7b 0a 20 20 55 6e 69 6f 6e 54 61 62  fo.){.  UnionTab
a020: 20 2a 70 54 61 62 20 3d 20 28 55 6e 69 6f 6e 54   *pTab = (UnionT
a030: 61 62 2a 29 74 61 62 3b 0a 20 20 69 6e 74 20 69  ab*)tab;.  int i
a040: 45 71 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  Eq = -1;.  int i
a050: 4c 74 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  Lt = -1;.  int i
a060: 47 74 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  Gt = -1;.  int i
a070: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
a080: 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
a090: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
a0a0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
a0b0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
a0c0: 20 2a 70 20 3d 20 26 70 49 64 78 49 6e 66 6f 2d   *p = &pIdxInfo-
a0d0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 3b  >aConstraint[i];
a0e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 73 61 62  .    if( p->usab
a0f0: 6c 65 20 26 26 20 28 70 2d 3e 69 43 6f 6c 75 6d  le && (p->iColum
a100: 6e 3c 30 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d  n<0 || p->iColum
a110: 6e 3d 3d 70 54 61 62 2d 3e 69 50 4b 29 20 29 7b  n==pTab->iPK) ){
a120: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
a130: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ->op ){.        
a140: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45  case SQLITE_INDE
a150: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 3a  X_CONSTRAINT_EQ:
a160: 0a 20 20 20 20 20 20 20 20 20 20 69 45 71 20 3d  .          iEq =
a170: 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   i;.          br
a180: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
a190: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  e SQLITE_INDEX_C
a1a0: 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 3a 0a 20 20  ONSTRAINT_LE:.  
a1b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a1c0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
a1d0: 4e 54 5f 4c 54 3a 0a 20 20 20 20 20 20 20 20 20  NT_LT:.         
a1e0: 20 69 4c 74 20 3d 20 69 3b 0a 20 20 20 20 20 20   iLt = i;.      
a1f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a200: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a210: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
a220: 47 45 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  GE:.        case
a230: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
a240: 4e 53 54 52 41 49 4e 54 5f 47 54 3a 0a 20 20 20  NSTRAINT_GT:.   
a250: 20 20 20 20 20 20 20 69 47 74 20 3d 20 69 3b 0a         iGt = i;.
a260: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a270: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a280: 20 7d 0a 0a 20 20 69 66 28 20 69 45 71 3e 3d 30   }..  if( iEq>=0
a290: 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   ){.    pIdxInfo
a2a0: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
a2b0: 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 1;.    pIdxInf
a2c0: 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20 53 51  o->idxFlags = SQ
a2d0: 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f  LITE_INDEX_SCAN_
a2e0: 55 4e 49 51 55 45 3b 0a 20 20 20 20 70 49 64 78  UNIQUE;.    pIdx
a2f0: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
a300: 6f 73 74 20 3d 20 33 2e 30 3b 0a 20 20 20 20 70  ost = 3.0;.    p
a310: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
a320: 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  = SQLITE_INDEX_C
a330: 4f 4e 53 54 52 41 49 4e 54 5f 45 51 3b 0a 20 20  ONSTRAINT_EQ;.  
a340: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
a350: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 45 71  straintUsage[iEq
a360: 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b  ].argvIndex = 1;
a370: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  .    pIdxInfo->a
a380: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
a390: 69 45 71 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20  iEq].omit = 1;. 
a3a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
a3b0: 69 43 6f 6e 73 20 3d 20 31 3b 0a 20 20 20 20 69  iCons = 1;.    i
a3c0: 6e 74 20 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20  nt idxNum = 0;. 
a3d0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
a3e0: 20 6e 52 6f 77 20 3d 20 31 30 30 30 30 30 30 3b   nRow = 1000000;
a3f0: 0a 20 20 20 20 69 66 28 20 69 4c 74 3e 3d 30 20  .    if( iLt>=0 
a400: 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20  ){.      nRow = 
a410: 6e 52 6f 77 20 2f 20 32 3b 0a 20 20 20 20 20 20  nRow / 2;.      
a420: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
a430: 72 61 69 6e 74 55 73 61 67 65 5b 69 4c 74 5d 2e  raintUsage[iLt].
a440: 61 72 67 76 49 6e 64 65 78 20 3d 20 69 43 6f 6e  argvIndex = iCon
a450: 73 2b 2b 3b 0a 20 20 20 20 20 20 70 49 64 78 49  s++;.      pIdxI
a460: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
a470: 55 73 61 67 65 5b 69 4c 74 5d 2e 6f 6d 69 74 20  Usage[iLt].omit 
a480: 3d 20 31 3b 0a 20 20 20 20 20 20 69 64 78 4e 75  = 1;.      idxNu
a490: 6d 20 7c 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  m |= pIdxInfo->a
a4a0: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 4c 74 5d 2e  Constraint[iLt].
a4b0: 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  op;.    }.    if
a4c0: 28 20 69 47 74 3e 3d 30 20 29 7b 0a 20 20 20 20  ( iGt>=0 ){.    
a4d0: 20 20 6e 52 6f 77 20 3d 20 6e 52 6f 77 20 2f 20    nRow = nRow / 
a4e0: 32 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  2;.      pIdxInf
a4f0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
a500: 61 67 65 5b 69 47 74 5d 2e 61 72 67 76 49 6e 64  age[iGt].argvInd
a510: 65 78 20 3d 20 69 43 6f 6e 73 2b 2b 3b 0a 20 20  ex = iCons++;.  
a520: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
a530: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
a540: 47 74 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  Gt].omit = 1;.  
a550: 20 20 20 20 69 64 78 4e 75 6d 20 7c 3d 20 70 49      idxNum |= pI
a560: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
a570: 69 6e 74 5b 69 47 74 5d 2e 6f 70 3b 0a 20 20 20  int[iGt].op;.   
a580: 20 7d 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d   }.    pIdxInfo-
a590: 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
a5a0: 20 6e 52 6f 77 3b 0a 20 20 20 20 70 49 64 78 49   nRow;.    pIdxI
a5b0: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
a5c0: 73 74 20 3d 20 33 2e 30 20 2a 20 28 64 6f 75 62  st = 3.0 * (doub
a5d0: 6c 65 29 6e 52 6f 77 3b 0a 20 20 20 20 70 49 64  le)nRow;.    pId
a5e0: 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
a5f0: 69 64 78 4e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 72  idxNum;.  }..  r
a600: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
a620: 65 72 20 74 68 65 20 75 6e 69 6f 6e 76 74 61 62  er the unionvtab
a630: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
a640: 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62  odule with datab
a650: 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
a660: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
a670: 61 74 65 55 6e 69 6f 6e 56 74 61 62 28 73 71 6c  ateUnionVtab(sql
a680: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61  ite3 *db){.  sta
a690: 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  tic sqlite3_modu
a6a0: 6c 65 20 75 6e 69 6f 6e 4d 6f 64 75 6c 65 20 3d  le unionModule =
a6b0: 20 7b 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20   {.    0,       
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6d0: 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
a6e0: 20 2a 2f 0a 20 20 20 20 75 6e 69 6f 6e 43 6f 6e   */.    unionCon
a6f0: 6e 65 63 74 2c 0a 20 20 20 20 75 6e 69 6f 6e 43  nect,.    unionC
a700: 6f 6e 6e 65 63 74 2c 0a 20 20 20 20 75 6e 69 6f  onnect,.    unio
a710: 6e 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20  nBestIndex,     
a720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65            /* xBe
a730: 73 74 49 6e 64 65 78 20 2d 20 71 75 65 72 79 20  stIndex - query 
a740: 70 6c 61 6e 6e 65 72 20 2a 2f 0a 20 20 20 20 75  planner */.    u
a750: 6e 69 6f 6e 44 69 73 63 6f 6e 6e 65 63 74 2c 20  nionDisconnect, 
a760: 0a 20 20 20 20 75 6e 69 6f 6e 44 69 73 63 6f 6e  .    unionDiscon
a770: 6e 65 63 74 2c 0a 20 20 20 20 75 6e 69 6f 6e 4f  nect,.    unionO
a780: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
a790: 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
a7a0: 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72   - open a cursor
a7b0: 20 2a 2f 0a 20 20 20 20 75 6e 69 6f 6e 43 6c 6f   */.    unionClo
a7c0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
a7d0: 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
a7e0: 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  - close a cursor
a7f0: 20 2a 2f 0a 20 20 20 20 75 6e 69 6f 6e 46 69 6c   */.    unionFil
a800: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
a810: 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72        /* xFilter
a820: 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61   - configure sca
a830: 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  n constraints */
a840: 0a 20 20 20 20 75 6e 69 6f 6e 4e 65 78 74 2c 20  .    unionNext, 
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a860: 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64     /* xNext - ad
a870: 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a  vance a cursor *
a880: 2f 0a 20 20 20 20 75 6e 69 6f 6e 45 6f 66 2c 20  /.    unionEof, 
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8a0: 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63 68      /* xEof - ch
a8b0: 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20 73  eck for end of s
a8c0: 63 61 6e 20 2a 2f 0a 20 20 20 20 75 6e 69 6f 6e  can */.    union
a8d0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
a8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
a8f0: 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
a900: 2a 2f 0a 20 20 20 20 75 6e 69 6f 6e 52 6f 77 69  */.    unionRowi
a910: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
a920: 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d       /* xRowid -
a930: 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
a940: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a960: 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20  /* xUpdate */.  
a970: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a990: 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 20  /* xBegin */.   
a9a0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a9c0: 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 20 20 30  * xSync */.    0
a9d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a9f0: 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 20 20 30  xCommit */.    0
aa00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aa20: 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20  xRollback */.   
aa30: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa50: 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f  * xFindMethod */
aa60: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f     /* xRename */
aa90: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aab0: 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74     /* xSavepoint
aac0: 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73        /* xReleas
aaf0: 65 20 2a 2f 0a 20 20 20 20 30 20 20 20 20 20 20  e */.    0      
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62         /* xRollb
ab20: 61 63 6b 54 6f 20 2a 2f 0a 20 20 7d 3b 0a 20 20  ackTo */.  };.  
ab30: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
ab40: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d  sqlite3_create_m
ab50: 6f 64 75 6c 65 28 64 62 2c 20 22 75 6e 69 6f 6e  odule(db, "union
ab60: 76 74 61 62 22 2c 20 26 75 6e 69 6f 6e 4d 6f 64  vtab", &unionMod
ab70: 75 6c 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ule, 0);.  if( r
ab80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ab90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
aba0: 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64  _create_module(d
abb0: 62 2c 20 22 73 77 61 72 6d 76 74 61 62 22 2c 20  b, "swarmvtab", 
abc0: 26 75 6e 69 6f 6e 4d 6f 64 75 6c 65 2c 20 28 76  &unionModule, (v
abd0: 6f 69 64 2a 29 64 62 29 3b 0a 20 20 7d 0a 20 20  oid*)db);.  }.  
abe0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
abf0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ac00: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
ac10: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e   */..#ifdef _WIN
ac20: 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  32.__declspec(dl
ac30: 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a  lexport).#endif.
ac40: 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 6e 69 6f  int sqlite3_unio
ac50: 6e 76 74 61 62 5f 69 6e 69 74 28 0a 20 20 73 71  nvtab_init(.  sq
ac60: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 68  lite3 *db, .  ch
ac70: 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 0a  ar **pzErrMsg, .
ac80: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
ac90: 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41  api_routines *pA
aca0: 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pi.){.  int rc =
acb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 51   SQLITE_OK;.  SQ
acc0: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
acd0: 4e 49 54 32 28 70 41 70 69 29 3b 0a 20 20 28 76  NIT2(pApi);.  (v
ace0: 6f 69 64 29 70 7a 45 72 72 4d 73 67 3b 20 20 2f  oid)pzErrMsg;  /
acf0: 2a 20 53 75 70 70 72 65 73 73 20 68 61 72 6d 6c  * Suppress harml
ad00: 65 73 73 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 23  ess warning */.#
ad10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ad20: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
ad30: 20 20 72 63 20 3d 20 63 72 65 61 74 65 55 6e 69    rc = createUni
ad40: 6f 6e 56 74 61 62 28 64 62 29 3b 0a 23 65 6e 64  onVtab(db);.#end
ad50: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
ad60: 7d 0a                                            }.