xref: /sqlite-3.40.0/test/spellfix.test (revision e2d27e02)
185127524Sdan# 2012 July 12
285127524Sdan#
385127524Sdan# The author disclaims copyright to this source code.  In place of
485127524Sdan# a legal notice, here is a blessing:
585127524Sdan#
685127524Sdan#    May you do good and not evil.
785127524Sdan#    May you find forgiveness for yourself and forgive others.
885127524Sdan#    May you share freely, never taking more than you give.
985127524Sdan#
1085127524Sdan#***********************************************************************
1185127524Sdan#
1285127524Sdan
1385127524Sdanset testdir [file dirname $argv0]
1485127524Sdansource $testdir/tester.tcl
1585127524Sdanset testprefix spellfix
1685127524Sdan
1781f0740eSdanifcapable !vtab { finish_test ; return }
1881f0740eSdan
19ea41dc44Sdrhload_static_extension db spellfix nextchar
2085127524Sdan
2185127524Sdanset vocab {
2285127524Sdanrabbi rabbit rabbits rabble rabid rabies raccoon raccoons race raced racer
2385127524Sdanracers races racetrack racial racially racing rack racked racket racketeer
2485127524Sdanracketeering racketeers rackets racking racks radar radars radial radially
2585127524Sdanradian radiance radiant radiantly radiate radiated radiates radiating radiation
2685127524Sdanradiations radiator radiators radical radically radicals radices radii radio
2785127524Sdanradioactive radioastronomy radioed radiography radioing radiology radios radish
2885127524Sdanradishes radium radius radix radon raft rafter rafters rafts rag rage raged
2985127524Sdanrages ragged raggedly raggedness raging rags ragweed raid raided raider raiders
3085127524Sdanraiding raids rail railed railer railers railing railroad railroaded railroader
3185127524Sdanrailroaders railroading railroads rails railway railways raiment rain rainbow
3285127524Sdanraincoat raincoats raindrop raindrops rained rainfall rainier rainiest raining
3385127524Sdanrains rainstorm rainy raise raised raiser raisers raises raisin raising rake
3485127524Sdanraked rakes raking rallied rallies rally rallying ram ramble rambler rambles
3585127524Sdanrambling ramblings ramification ramifications ramp rampage rampant rampart
3685127524Sdanramps ramrod rams ran ranch ranched rancher ranchers ranches ranching rancid
3785127524Sdanrandom randomization randomize randomized randomizes randomly randomness randy
3885127524Sdanrang range ranged rangeland ranger rangers ranges ranging rangy rank ranked
3985127524Sdanranker rankers rankest ranking rankings rankle rankly rankness ranks ransack
4085127524Sdanransacked ransacking ransacks ransom ransomer ransoming ransoms rant ranted
4185127524Sdanranter ranters ranting rants rap rapacious rape raped raper rapes rapid
4285127524Sdanrapidity rapidly rapids rapier raping rapport rapprochement raps rapt raptly
4385127524Sdanrapture raptures rapturous rare rarely rareness rarer rarest rarity rascal
4485127524Sdanrascally rascals rash rasher rashly rashness rasp raspberry rasped rasping
4585127524Sdanrasps raster rat rate rated rater raters rates rather ratification ratified
4685127524Sdanratifies ratify ratifying rating ratings ratio ration rational rationale
4785127524Sdanrationales rationalities rationality rationalization rationalizations
4885127524Sdanrationalize rationalized rationalizes rationalizing rationally rationals
4985127524Sdanrationing rations ratios rats rattle rattled rattler rattlers rattles
5085127524Sdanrattlesnake rattlesnakes rattling raucous ravage ravaged ravager ravagers
5185127524Sdanravages ravaging rave raved raven ravening ravenous ravenously ravens raves
5285127524Sdanravine ravines raving ravings raw rawer rawest rawly rawness ray rays raze
5385127524Sdanrazor razors re reabbreviate reabbreviated reabbreviates reabbreviating reach
5485127524Sdanreachability reachable reachably reached reacher reaches reaching reacquired
5585127524Sdanreact reacted reacting reaction reactionaries reactionary reactions reactivate
5685127524Sdanreactivated reactivates reactivating reactivation reactive reactively
5785127524Sdanreactivity reactor reactors reacts read readability readable reader readers
5885127524Sdanreadied readier readies readiest readily readiness reading readings readjusted
5985127524Sdanreadout readouts reads ready readying real realest realign realigned realigning
6085127524Sdanrealigns realism realist realistic realistically realists realities reality
6185127524Sdan}
6285127524Sdan
6385127524Sdando_test 1.1 {
6485127524Sdan  execsql { CREATE VIRTUAL TABLE t1 USING spellfix1 }
6585127524Sdan  foreach word $vocab {
6685127524Sdan    execsql { INSERT INTO t1(word) VALUES($word) }
6785127524Sdan  }
6885127524Sdan} {}
6985127524Sdan
7085127524Sdanforeach {tn word res} {
71e0d058c6Sdrh  1   raxpi*     {rasping 5 rasped 5 ragweed 5 raspberry 6 rasp 4}
72342ced4bSdrh  2   ril*       {rail 4 railed 4 railer 4 railers 4 railing 4}
73342ced4bSdrh  3   rilis*     {realism 6 realist 6 realistic 6 realistically 6 realists 6}
74342ced4bSdrh  4   reail*     {real 3 realest 3 realign 3 realigned 3 realigning 3}
75342ced4bSdrh  5   ras*       {rascal 3 rascally 3 rascals 3 rash 3 rasher 3}
7685127524Sdan  6   realistss* {realists 8 realigns 8 realistic 9 realistically 9 realest 7}
7785127524Sdan  7   realistss  {realists 8 realist 7 realigns 8 realistic 9 realest 7}
7885127524Sdan  8   rllation*  {realities 9 reality 7 rallied 7 railed 4}
79342ced4bSdrh  9   renstom*   {rainstorm 8 ransom 6 ransomer 6 ransoming 6 ransoms 6}
8085127524Sdan} {
8185127524Sdan  do_execsql_test 1.2.$tn {
82342ced4bSdrh    SELECT word, matchlen FROM t1 WHERE word MATCH $word
83342ced4bSdrh     ORDER BY score, word LIMIT 5
8485127524Sdan  } $res
8585127524Sdan}
8685127524Sdan
87ea41dc44Sdrh# Tests of the next_char function.
88ea41dc44Sdrh#
89ea41dc44Sdrhdo_test 1.10 {
90ea41dc44Sdrh  db eval {
91ea41dc44Sdrh    CREATE TABLE vocab(w TEXT PRIMARY KEY);
92ea41dc44Sdrh    INSERT INTO vocab SELECT word FROM t1;
93ea41dc44Sdrh  }
94ea41dc44Sdrh} {}
95ea41dc44Sdrhdo_execsql_test 1.11 {
96ea41dc44Sdrh  SELECT next_char('re','vocab','w');
97ea41dc44Sdrh} {a}
98f4274724Sdrhdo_execsql_test 1.11sub {
99f4274724Sdrh  SELECT next_char('re','(SELECT w AS x FROM vocab)','x');
100f4274724Sdrh} {a}
101ea41dc44Sdrhdo_execsql_test 1.12 {
102ea41dc44Sdrh  SELECT next_char('r','vocab','w');
103ea41dc44Sdrh} {ae}
104ea41dc44Sdrhdo_execsql_test 1.13 {
105ea41dc44Sdrh  SELECT next_char('','vocab','w');
106ea41dc44Sdrh} {r}
107ea41dc44Sdrhdo_test 1.14 {
108ea41dc44Sdrh  catchsql {SELECT next_char('','xyzzy','a')}
109ea41dc44Sdrh} {1 {no such table: xyzzy}}
11085127524Sdan
111d4b473b2Sdrhdo_execsql_test 1.20 {
112d4b473b2Sdrh  CREATE TABLE vocab2(w TEXT);
113d4b473b2Sdrh  CREATE INDEX vocab2w ON vocab2(w COLLATE nocase);
114d4b473b2Sdrh  INSERT INTO vocab2 VALUES('abc'), ('ABD'), ('aBe'), ('AbF');
115d4b473b2Sdrh  SELECT next_char('ab', 'vocab2', 'w', null, 'nocase');
116d4b473b2Sdrh} {cDeF}
117d4b473b2Sdrhdo_execsql_test 1.21 {
118d4b473b2Sdrh  SELECT next_char('ab','vocab2','w',null,null);
119d4b473b2Sdrh} {c}
120d4b473b2Sdrhdo_execsql_test 1.22 {
121d4b473b2Sdrh  SELECT next_char('AB','vocab2','w',null,'NOCASE');
122d4b473b2Sdrh} {cDeF}
123d4b473b2Sdrhdo_execsql_test 1.23 {
124d4b473b2Sdrh  SELECT next_char('ab','vocab2','w',null,'binary');
125d4b473b2Sdrh} {c}
126d4b473b2Sdrh
1275ab56707Sdrhdo_execsql_test 1.30 {
1285ab56707Sdrh  SELECT rowid FROM t1 WHERE word='rabbit';
1295ab56707Sdrh} {2}
1305ab56707Sdrhdo_execsql_test 1.31 {
1315ab56707Sdrh  UPDATE t1 SET rowid=2000 WHERE word='rabbit';
1325ab56707Sdrh  SELECT rowid FROM t1 WHERE word='rabbit';
1335ab56707Sdrh} {2000}
1345ab56707Sdrhdo_execsql_test 1.32 {
1355ab56707Sdrh  INSERT INTO t1(rowid, word) VALUES(3000,'melody');
1365ab56707Sdrh  SELECT rowid, word, matchlen FROM t1 WHERE word MATCH 'melotti'
1375ab56707Sdrh   ORDER BY score LIMIT 3;
1385ab56707Sdrh} {3000 melody 6}
1395ab56707Sdrhdo_test 1.33 {
1405ab56707Sdrh  catchsql {INSERT INTO t1(rowid, word) VALUES(3000,'garden');}
1415ab56707Sdrh} {1 {constraint failed}}
1425ab56707Sdrh
14385127524Sdando_execsql_test 2.1 {
14485127524Sdan  CREATE VIRTUAL TABLE t2 USING spellfix1;
14585127524Sdan  INSERT INTO t2 (word, soundslike) VALUES('school', 'skuul');
14685127524Sdan  INSERT INTO t2 (word, soundslike) VALUES('psalm', 'sarm');
14785127524Sdan  SELECT word, matchlen FROM t2 WHERE word MATCH 'sar*' LIMIT 5;
14885127524Sdan} {psalm 4}
14985127524Sdan
15085127524Sdando_execsql_test 2.2 {
15185127524Sdan  SELECT word, matchlen FROM t2 WHERE word MATCH 'skol*' LIMIT 5;
15285127524Sdan} {school 6}
15385127524Sdan
15485127524Sdanset vocab {
15585127524Sdankangaroo kanji kappa karate keel keeled keeling keels keen keener keenest
15685127524Sdankeenly keenness keep keeper keepers keeping keeps ken kennel kennels kept
15785127524Sdankerchief kerchiefs kern kernel kernels kerosene ketchup kettle
15885127524Sdankettles key keyboard keyboards keyed keyhole keying keynote keypad keypads keys
15985127524Sdankeystroke keystrokes keyword keywords kick kicked kicker kickers kicking
16085127524Sdankickoff kicks kid kidded kiddie kidding kidnap kidnapper kidnappers kidnapping
16185127524Sdankidnappings kidnaps kidney kidneys kids kill killed killer killers killing
16285127524Sdankillingly killings killjoy kills kilobit kilobits kiloblock kilobyte kilobytes
16385127524Sdankilogram kilograms kilohertz kilohm kilojoule kilometer kilometers kiloton
16485127524Sdankilovolt kilowatt kiloword kimono kin kind kinder kindergarten kindest
16585127524Sdankindhearted kindle kindled kindles kindling kindly kindness kindred kinds
16685127524Sdankinetic king kingdom kingdoms kingly kingpin kings kink kinky kinship kinsman
16785127524Sdankiosk kiss kissed kisser kissers kisses kissing kit kitchen kitchenette
16885127524Sdankitchens kite kited kites kiting kits kitten kittenish kittens kitty klaxon
16985127524Sdankludge kludges klystron knack knapsack knapsacks knave knaves knead kneads knee
17085127524Sdankneecap kneed kneeing kneel kneeled kneeling kneels knees knell knells knelt
17185127524Sdanknew knife knifed knifes knifing knight knighted knighthood knighting knightly
17285127524Sdanknights knit knits knives knob knobs knock knockdown knocked knocker knockers
17385127524Sdanknocking knockout knocks knoll knolls knot knots knotted knotting know knowable
17485127524Sdanknower knowhow knowing knowingly knowledge knowledgeable known knows knuckle
17585127524Sdanknuckled knuckles koala kosher kudo
17685127524Sdan}
17785127524Sdan
17885127524Sdando_execsql_test 3.1 {
17985127524Sdan  CREATE TABLE costs(iLang, cFrom, cTo, iCost);
18085127524Sdan  INSERT INTO costs VALUES(0, 'a', 'e', 1);
18185127524Sdan  INSERT INTO costs VALUES(0, 'e', 'i', 1);
18285127524Sdan  INSERT INTO costs VALUES(0, 'i', 'o', 1);
18385127524Sdan  INSERT INTO costs VALUES(0, 'o', 'u', 1);
18485127524Sdan  INSERT INTO costs VALUES(0, 'u', 'a', 1);
18585127524Sdan  CREATE VIRTUAL TABLE t3 USING spellfix1(edit_cost_table=costs);
18685127524Sdan}
18785127524Sdan
18885127524Sdando_test 3.2 {
18985127524Sdan  foreach w $vocab {
19085127524Sdan    execsql { INSERT INTO t3(word) VALUES($w) }
19185127524Sdan  }
19285127524Sdan} {}
19385127524Sdan
19485127524Sdanforeach {tn word res} {
195c16eb693Sdrh  1   kos*     {kosher 3 kiosk 4 kudo 2 kiss 3 kissed 3}
196c16eb693Sdrh  2   kellj*   {killjoy 5 kill 4 killed 4 killer 4 killers 4}
19785127524Sdan  3   kellj    {kill 4 kills 5 killjoy 7 keel 4 killed 6}
19885127524Sdan} {
1995cee8a7aSdrh  do_execsql_test 3.2.$tn {
200c16eb693Sdrh    SELECT word, matchlen FROM t3 WHERE word MATCH $word
201c16eb693Sdrh     ORDER BY score, word LIMIT 5
20285127524Sdan  } $res
20385127524Sdan}
20485127524Sdan
2055cee8a7aSdrhdo_execsql_test 4.0 {
2065cee8a7aSdrh  INSERT INTO t3(command) VALUES('edit_cost_table=NULL');
2075cee8a7aSdrh}
2085cee8a7aSdrhforeach {tn word res} {
2095cee8a7aSdrh  1   kosher     {kosher 0 kisser 51 kissers 76 kissed 126 kisses 126}
2105cee8a7aSdrh  2   kellj      {keels 60 killjoy 68 kills 80 keel 120 kill 125}
2115cee8a7aSdrh  3   kashar     {kosher 80 kisser 91 kissers 116 kissed 166 kisses 166}
2125cee8a7aSdrh} {
2135cee8a7aSdrh  do_execsql_test 4.1.$tn {
2145cee8a7aSdrh    SELECT word, distance FROM t3 WHERE word MATCH $word
2155cee8a7aSdrh     ORDER BY score, word LIMIT 5
2165cee8a7aSdrh  } $res
2175cee8a7aSdrh}
2185cee8a7aSdrhdo_execsql_test 5.0 {
2195cee8a7aSdrh  CREATE TABLE costs2(iLang, cFrom, cTo, iCost);
2205cee8a7aSdrh  INSERT INTO costs2 VALUES(0, 'a', 'o', 1);
2215cee8a7aSdrh  INSERT INTO costs2 VALUES(0, 'e', 'o', 4);
2225cee8a7aSdrh  INSERT INTO costs2 VALUES(0, 'i', 'o', 8);
2235cee8a7aSdrh  INSERT INTO costs2 VALUES(0, 'u', 'o', 16);
2245cee8a7aSdrh  INSERT INTO t3(command) VALUES('edit_cost_table="costs2"');
2255cee8a7aSdrh}
2265cee8a7aSdrh
2275cee8a7aSdrhforeach {tn word res} {
2285cee8a7aSdrh  1   kasher     {kosher 1}
2295cee8a7aSdrh  2   kesher     {kosher 4}
2305cee8a7aSdrh  3   kisher     {kosher 8}
2315cee8a7aSdrh  4   kosher     {kosher 0}
2325cee8a7aSdrh  5   kusher     {kosher 16}
2335cee8a7aSdrh} {
2345cee8a7aSdrh  do_execsql_test 5.1.$tn {
2355cee8a7aSdrh    SELECT word, distance FROM t3 WHERE word MATCH $word
2365cee8a7aSdrh     ORDER BY score, word LIMIT 1
2375cee8a7aSdrh  } $res
2385cee8a7aSdrh}
2395cee8a7aSdrh
240a8a0617eSdan#-------------------------------------------------------------------------
241a8a0617eSdan# Try some queries by rowid.
242a8a0617eSdan#
243a8a0617eSdando_execsql_test 6.1.1 {
244a8a0617eSdan  SELECT word FROM t3 WHERE rowid = 10;
245a8a0617eSdan} {keener}
246a8a0617eSdando_execsql_test 6.1.2 {
247a8a0617eSdan  SELECT word, distance FROM t3 WHERE rowid = 10;
248a8a0617eSdan} {keener {}}
249a8a0617eSdando_execsql_test 6.1.3 {
250a8a0617eSdan  SELECT word, distance FROM t3 WHERE rowid = 10 AND word MATCH 'kiiner';
251a8a0617eSdan} {keener 300}
252a8a0617eSdan
253abfe0346Sdanifcapable trace {
254a8a0617eSdan  proc trace_callback {sql} {
255a8a0617eSdan    if {[string range $sql 0 2] == "-- "} {
256a8a0617eSdan      lappend ::trace [string range $sql 3 end]
257a8a0617eSdan    }
258a8a0617eSdan  }
259a8a0617eSdan
260a8a0617eSdan  proc do_tracesql_test {tn sql {res {}}} {
261a8a0617eSdan    set ::trace [list]
262a8a0617eSdan    uplevel [list do_test $tn [subst -nocommands {
263a8a0617eSdan      set vals [execsql {$sql}]
264a8a0617eSdan      concat [set vals] [set ::trace]
265a8a0617eSdan    }] [list {*}$res]]
266a8a0617eSdan  }
267a8a0617eSdan
268a8a0617eSdan  db trace trace_callback
269a8a0617eSdan  do_tracesql_test 6.2.1 {
270a8a0617eSdan    SELECT word FROM t3 WHERE rowid = 10;
271a8a0617eSdan  } {keener
272a8a0617eSdan    {SELECT word, rank, NULL, langid, id FROM "main"."t3_vocab" WHERE rowid=?}
273a8a0617eSdan  }
274a8a0617eSdan  do_tracesql_test 6.2.2 {
275a8a0617eSdan    SELECT word, distance FROM t3 WHERE rowid = 10;
276a8a0617eSdan  } {keener {}
277a8a0617eSdan    {SELECT word, rank, NULL, langid, id FROM "main"."t3_vocab" WHERE rowid=?}
278a8a0617eSdan  }
279a8a0617eSdan  do_tracesql_test 6.2.3 {
280a8a0617eSdan    SELECT word, distance FROM t3 WHERE rowid = 10 AND word MATCH 'kiiner';
281a8a0617eSdan  } {keener 300
282*e2d27e02Sdrh    {SELECT id, word, rank, coalesce(k1,word)  FROM "main"."t3_vocab" WHERE langid=0 AND k2>=?1 AND k2<?2}
283a8a0617eSdan  }
284abfe0346Sdan}
285a8a0617eSdan
28688d702e6Sdan#-------------------------------------------------------------------------
28788d702e6Sdan# Test that the spellfix1 table supports conflict handling (OR REPLACE
28888d702e6Sdan# and so on).
28988d702e6Sdan#
29088d702e6Sdando_execsql_test 7.1 {
29188d702e6Sdan  CREATE VIRTUAL TABLE t4 USING spellfix1;
29288d702e6Sdan  PRAGMA table_info = t4;
29388d702e6Sdan} {
29488d702e6Sdan  0 word {} 0 {} 0
29588d702e6Sdan  1 rank {} 0 {} 0
29688d702e6Sdan  2 distance {} 0 {} 0
29788d702e6Sdan  3 langid {} 0 {} 0
29888d702e6Sdan  4 score {} 0 {} 0
29988d702e6Sdan  5 matchlen {} 0 {} 0
30088d702e6Sdan}
301a8a0617eSdan
30288d702e6Sdando_execsql_test 7.2.1 {
30388d702e6Sdan  INSERT INTO t4(rowid, word) VALUES(1, 'Archilles');
30488d702e6Sdan  INSERT INTO t4(rowid, word) VALUES(2, 'Pluto');
30588d702e6Sdan  INSERT INTO t4(rowid, word) VALUES(3, 'Atrides');
30688d702e6Sdan  INSERT OR REPLACE INTO t4(rowid, word) VALUES(2, 'Apollo');
30788d702e6Sdan  SELECT rowid, word FROM t4;
30888d702e6Sdan} {
30988d702e6Sdan  1 Archilles   2 Apollo   3 Atrides
31088d702e6Sdan}
31188d702e6Sdando_catchsql_test 7.2.2 {
31288d702e6Sdan  INSERT OR ABORT INTO t4(rowid, word) VALUES(1, 'Leto');
31388d702e6Sdan} {1 {constraint failed}}
31488d702e6Sdando_catchsql_test 7.2.3 {
31588d702e6Sdan  INSERT OR ROLLBACK INTO t4(rowid, word) VALUES(3, 'Zeus');
31688d702e6Sdan} {1 {constraint failed}}
31788d702e6Sdando_catchsql_test 7.2.4 {
31888d702e6Sdan  INSERT OR FAIL INTO t4(rowid, word) VALUES(3, 'Zeus');
31988d702e6Sdan} {1 {constraint failed}}
32088d702e6Sdando_execsql_test 7.2.5 {
32188d702e6Sdan  INSERT OR IGNORE INTO t4(rowid, word) VALUES(3, 'Zeus');
32288d702e6Sdan  SELECT rowid, word FROM t4;
32388d702e6Sdan} {
32488d702e6Sdan  1 Archilles   2 Apollo   3 Atrides
32588d702e6Sdan}
3265cee8a7aSdrh
32788d702e6Sdando_execsql_test 7.3.1 {
32888d702e6Sdan  UPDATE OR REPLACE t4 SET rowid=3 WHERE rowid=1;
32988d702e6Sdan  SELECT rowid, word FROM t4;
33088d702e6Sdan} {2 Apollo 3 Archilles}
33188d702e6Sdando_catchsql_test 7.3.2 {
33288d702e6Sdan  UPDATE OR ABORT t4 SET rowid=3 WHERE rowid=2;
33388d702e6Sdan} {1 {constraint failed}}
33488d702e6Sdando_catchsql_test 7.3.3 {
33588d702e6Sdan  UPDATE OR ROLLBACK t4 SET rowid=3 WHERE rowid=2;
33688d702e6Sdan} {1 {constraint failed}}
33788d702e6Sdando_catchsql_test 7.3.4 {
33888d702e6Sdan  UPDATE OR FAIL t4 SET rowid=3 WHERE rowid=2;
33988d702e6Sdan} {1 {constraint failed}}
34088d702e6Sdando_execsql_test 7.3.5 {
34188d702e6Sdan  UPDATE OR IGNORE t4 SET rowid=3 WHERE rowid=2;
34288d702e6Sdan  SELECT rowid, word FROM t4;
34388d702e6Sdan} {2 Apollo  3 Archilles}
34488d702e6Sdan
34588d702e6Sdando_execsql_test 7.4.1 {
34688d702e6Sdan  DELETE FROM t4;
34788d702e6Sdan  INSERT INTO t4(rowid, word) VALUES(10, 'Agamemnon');
34888d702e6Sdan  INSERT INTO t4(rowid, word) VALUES(20, 'Patroclus');
34988d702e6Sdan  INSERT INTO t4(rowid, word) VALUES(30, 'Chryses');
35088d702e6Sdan
35188d702e6Sdan  CREATE TABLE t5(i, w);
35288d702e6Sdan  INSERT INTO t5 VALUES(5,  'Poseidon');
35388d702e6Sdan  INSERT INTO t5 VALUES(20, 'Chronos');
35488d702e6Sdan  INSERT INTO t5 VALUES(30, 'Hera');
35588d702e6Sdan}
35688d702e6Sdan
35788d702e6Sdandb_save_and_close
35888d702e6Sdanforeach {tn conflict err bRollback res} {
35988d702e6Sdan  0 ""            {1 {constraint failed}} 0
36088d702e6Sdan                  {10 Agamemnon 20 Patroclus 30 Chryses}
36188d702e6Sdan  1 "OR REPLACE"  {0 {}} 0
36288d702e6Sdan                  {5 Poseidon 10 Agamemnon 20 Chronos 30 Hera}
36388d702e6Sdan  2 "OR ABORT"    {1 {constraint failed}} 0
36488d702e6Sdan                  {10 Agamemnon 20 Patroclus 30 Chryses}
36588d702e6Sdan  3 "OR ROLLBACK" {1 {constraint failed}} 1
36688d702e6Sdan                  {10 Agamemnon 20 Patroclus 30 Chryses}
36788d702e6Sdan  5 "OR IGNORE"   {0 {}} 0
36888d702e6Sdan                  {5 Poseidon 10 Agamemnon 20 Patroclus 30 Chryses}
36988d702e6Sdan} {
37088d702e6Sdan  db_restore_and_reopen
37188d702e6Sdan  load_static_extension db spellfix nextchar
37288d702e6Sdan
37388d702e6Sdan  execsql BEGIN
37488d702e6Sdan  set sql "INSERT $conflict INTO t4(rowid, word) SELECT i, w FROM t5"
37588d702e6Sdan  do_catchsql_test 7.4.2.$tn.1 $sql $err
37688d702e6Sdan  do_execsql_test 7.4.2.$tn.2 { SELECT rowid, word FROM t4 } $res
37788d702e6Sdan
37888d702e6Sdan  do_test 7.4.2.$tn.3 { sqlite3_get_autocommit db } $bRollback
37988d702e6Sdan  catchsql ROLLBACK
38088d702e6Sdan}
38188d702e6Sdan
38288d702e6Sdanforeach {tn conflict err bRollback res} {
38388d702e6Sdan  0 ""            {1 {constraint failed}} 0
38488d702e6Sdan                  {10 Agamemnon 20 Patroclus 30 Chryses}
38588d702e6Sdan  1 "OR REPLACE"  {0 {}} 0
38688d702e6Sdan                  {15 Agamemnon 45 Chryses}
38788d702e6Sdan  2 "OR ABORT"    {1 {constraint failed}} 0
38888d702e6Sdan                  {10 Agamemnon 20 Patroclus 30 Chryses}
38988d702e6Sdan  3 "OR ROLLBACK" {1 {constraint failed}} 1
39088d702e6Sdan                  {10 Agamemnon 20 Patroclus 30 Chryses}
39188d702e6Sdan  5 "OR IGNORE"   {0 {}} 0
39288d702e6Sdan                  {15 Agamemnon 20 Patroclus 45 Chryses}
39388d702e6Sdan} {
39488d702e6Sdan  db_restore_and_reopen
39588d702e6Sdan  load_static_extension db spellfix nextchar
39688d702e6Sdan
39788d702e6Sdan  execsql BEGIN
39888d702e6Sdan  set sql "UPDATE $conflict t4 SET rowid=rowid + (rowid/2)"
39988d702e6Sdan  do_catchsql_test 7.5.2.$tn.1 $sql $err
40088d702e6Sdan  do_execsql_test 7.5.2.$tn.2 { SELECT rowid, word FROM t4 } $res
40188d702e6Sdan  do_test 7.5.2.$tn.3 { sqlite3_get_autocommit db } $bRollback
40288d702e6Sdan  catchsql ROLLBACK
40388d702e6Sdan}
4045cee8a7aSdrh
40585127524Sdanfinish_test
406