/ Hex Artifact Content
Login

Artifact 1feeab0b8e03527f08f2f1defb442da25480138f:


0000: 23 20 32 30 31 33 20 4a 75 6c 79 20 30 34 0a 23  # 2013 July 04.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 23 0a 23 20 54 68 69 73 20 66 69  ****.#.# This fi
0170: 6c 65 20 74 65 73 74 73 20 74 68 61 74 20 66 69  le tests that fi
0180: 6c 74 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 77  lter callbacks w
0190: 6f 72 6b 20 61 73 20 72 65 71 75 69 72 65 64 2e  ork as required.
01a0: 0a 23 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65  .#..if {![info e
01b0: 78 69 73 74 73 20 74 65 73 74 64 69 72 5d 7d 20  xists testdir]} 
01c0: 7b 0a 20 20 73 65 74 20 74 65 73 74 64 69 72 20  {.  set testdir 
01d0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65  [file join [file
01e0: 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73   dirname [info s
01f0: 63 72 69 70 74 5d 5d 20 2e 2e 20 2e 2e 20 74 65  cript]] .. .. te
0200: 73 74 5d 0a 7d 20 0a 73 6f 75 72 63 65 20 5b 66  st].} .source [f
0210: 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64  ile join [file d
0220: 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72  irname [info scr
0230: 69 70 74 5d 5d 20 73 65 73 73 69 6f 6e 5f 63 6f  ipt]] session_co
0240: 6d 6d 6f 6e 2e 74 63 6c 5d 0a 73 6f 75 72 63 65  mmon.tcl].source
0250: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
0260: 2e 74 63 6c 0a 69 66 63 61 70 61 62 6c 65 20 21  .tcl.ifcapable !
0270: 73 65 73 73 69 6f 6e 20 7b 66 69 6e 69 73 68 5f  session {finish_
0280: 74 65 73 74 3b 20 72 65 74 75 72 6e 7d 0a 73 65  test; return}.se
0290: 74 20 74 65 73 74 70 72 65 66 69 78 20 73 65 73  t testprefix ses
02a0: 73 69 6f 6e 41 0a 0a 0a 66 6f 72 63 65 64 65 6c  sionA...forcedel
02b0: 65 74 65 20 74 65 73 74 2e 64 62 32 0a 73 71 6c  ete test.db2.sql
02c0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
02d0: 32 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 64 62  2.foreach {tn db
02e0: 7d 20 7b 31 20 64 62 20 32 20 64 62 32 7d 20 7b  } {1 db 2 db2} {
02f0: 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 24 74 6e  .  do_test 1.$tn
0300: 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .1 {.    execsql
0310: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
0320: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
0330: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
0340: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0350: 32 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  2(a PRIMARY KEY,
0360: 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54   b);.      CREAT
0370: 45 20 54 41 42 4c 45 20 74 33 28 61 20 50 52 49  E TABLE t3(a PRI
0380: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
0390: 20 20 7d 20 24 64 62 0a 20 20 7d 20 7b 7d 0a 7d    } $db.  } {}.}
03a0: 0a 0a 70 72 6f 63 20 74 62 6c 5f 66 69 6c 74 65  ..proc tbl_filte
03b0: 72 20 7b 7a 54 62 6c 7d 20 7b 0a 20 20 72 65 74  r {zTbl} {.  ret
03c0: 75 72 6e 20 24 3a 3a 74 61 62 6c 65 5f 66 69 6c  urn $::table_fil
03d0: 74 65 72 28 24 7a 54 62 6c 29 0a 7d 0a 0a 64 6f  ter($zTbl).}..do
03e0: 5f 74 65 73 74 20 32 2e 31 20 7b 0a 20 20 73 65  _test 2.1 {.  se
03f0: 74 20 3a 3a 74 61 62 6c 65 5f 66 69 6c 74 65 72  t ::table_filter
0400: 28 74 31 29 20 31 0a 20 20 73 65 74 20 3a 3a 74  (t1) 1.  set ::t
0410: 61 62 6c 65 5f 66 69 6c 74 65 72 28 74 32 29 20  able_filter(t2) 
0420: 30 0a 20 20 73 65 74 20 3a 3a 74 61 62 6c 65 5f  0.  set ::table_
0430: 66 69 6c 74 65 72 28 74 33 29 20 31 0a 0a 20 20  filter(t3) 1..  
0440: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 20 53  sqlite3session S
0450: 20 64 62 20 6d 61 69 6e 0a 20 20 53 20 74 61 62   db main.  S tab
0460: 6c 65 5f 66 69 6c 74 65 72 20 74 62 6c 5f 66 69  le_filter tbl_fi
0470: 6c 74 65 72 20 0a 0a 20 20 65 78 65 63 73 71 6c  lter ..  execsql
0480: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
0490: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 27  TO t1 VALUES('a'
04a0: 2c 20 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'b');.    INSE
04b0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
04c0: 53 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20  S('c', 'd');.   
04d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
04e0: 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27 29  VALUES('e', 'f')
04f0: 3b 0a 20 20 7d 0a 0a 20 20 73 65 74 20 63 68 61  ;.  }..  set cha
0500: 6e 67 65 73 65 74 20 5b 53 20 63 68 61 6e 67 65  ngeset [S change
0510: 73 65 74 5d 0a 20 20 53 20 64 65 6c 65 74 65 0a  set].  S delete.
0520: 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73    sqlite3changes
0530: 65 74 5f 61 70 70 6c 79 20 64 62 32 20 24 63 68  et_apply db2 $ch
0540: 61 6e 67 65 73 65 74 20 78 43 6f 6e 66 6c 69 63  angeset xConflic
0550: 74 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  t..  execsql {. 
0560: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0570: 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   t1;.    SELECT 
0580: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 53  * FROM t2;.    S
0590: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
05a0: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 61 20 62 20  .  } db2.} {a b 
05b0: 65 20 66 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  e f}..#---------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0600: 0a 23 20 54 65 73 74 20 74 68 61 74 20 66 69 6c  .# Test that fil
0610: 74 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 70 61  ter callbacks pa
0620: 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 63  ssed to sqlite3c
0630: 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29  hangeset_apply()
0640: 20 61 72 65 20 0a 23 20 69 6e 76 6f 6b 65 64 20   are .# invoked 
0650: 63 6f 72 72 65 63 74 6c 79 2e 0a 23 0a 72 65 73  correctly..#.res
0660: 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c  et_db.do_execsql
0670: 5f 74 65 73 74 20 33 2e 31 20 7b 0a 20 20 43 52  _test 3.1 {.  CR
0680: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
0690: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
06a0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
06b0: 74 32 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  t2(x PRIMARY KEY
06c0: 2c 20 79 29 3b 0a 7d 0a 0a 64 6f 5f 74 65 73 74  , y);.}..do_test
06d0: 20 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c   3.2 {.  execsql
06e0: 20 42 45 47 49 4e 0a 20 20 73 65 74 20 3a 3a 63   BEGIN.  set ::c
06f0: 73 20 5b 63 68 61 6e 67 65 73 65 74 5f 66 72 6f  s [changeset_fro
0700: 6d 5f 73 71 6c 20 7b 20 0a 20 20 20 20 49 4e 53  m_sql { .    INS
0710: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0720: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e  ES(1, 2);.    IN
0730: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
0740: 55 45 53 28 27 78 27 2c 20 27 79 27 29 3b 0a 20  UES('x', 'y');. 
0750: 20 7d 5d 0a 20 20 65 78 65 63 73 71 6c 20 52 4f   }].  execsql RO
0760: 4c 4c 42 41 43 4b 0a 20 20 73 65 74 20 7b 7d 20  LLBACK.  set {} 
0770: 7b 7d 0a 7d 20 7b 7d 0a 0a 70 72 6f 63 20 66 69  {}.} {}..proc fi
0780: 6c 74 65 72 20 7b 78 20 79 7d 20 7b 20 0a 20 20  lter {x y} { .  
0790: 72 65 74 75 72 6e 20 5b 73 74 72 69 6e 67 20 65  return [string e
07a0: 71 75 61 6c 20 24 78 20 24 79 5d 20 0a 7d 0a 0a  qual $x $y] .}..
07b0: 64 6f 5f 74 65 73 74 20 33 2e 33 20 7b 0a 20 20  do_test 3.3 {.  
07c0: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
07d0: 5f 61 70 70 6c 79 20 64 62 20 24 3a 3a 63 73 20  _apply db $::cs 
07e0: 7b 7d 20 5b 6c 69 73 74 20 66 69 6c 74 65 72 20  {} [list filter 
07f0: 74 31 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  t1].  execsql {.
0800: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
0810: 4d 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54  M t1;.    SELECT
0820: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a   * FROM t2;.  }.
0830: 7d 20 7b 31 20 32 7d 0a 0a 64 6f 5f 74 65 73 74  } {1 2}..do_test
0840: 20 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c   3.4 {.  execsql
0850: 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74   { DELETE FROM t
0860: 31 20 7d 0a 20 20 73 71 6c 69 74 65 33 63 68 61  1 }.  sqlite3cha
0870: 6e 67 65 73 65 74 5f 61 70 70 6c 79 20 64 62 20  ngeset_apply db 
0880: 24 3a 3a 63 73 20 7b 7d 20 5b 6c 69 73 74 20 66  $::cs {} [list f
0890: 69 6c 74 65 72 20 74 32 5d 0a 20 20 65 78 65 63  ilter t2].  exec
08a0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
08b0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
08c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
08d0: 3b 0a 20 20 7d 0a 7d 20 7b 78 20 79 7d 0a 0a 66  ;.  }.} {x y}..f
08e0: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.