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