]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge in the WITHOUT ROWID changes. A few tests are failing now. They will
authordrh <drh@noemail.net>
Mon, 11 Nov 2013 22:55:26 +0000 (22:55 +0000)
committerdrh <drh@noemail.net>
Mon, 11 Nov 2013 22:55:26 +0000 (22:55 +0000)
be fixed in a follow-on check-in.

FossilOrigin-Name: 5addd1234ded59ce60fb633b76ac87d483377edd

19 files changed:
1  2 
Makefile.in
Makefile.msc
main.mk
manifest
manifest.uuid
src/delete.c
src/insert.c
src/main.c
src/sqlite.h.in
src/sqliteInt.h
src/test_config.c
src/update.c
src/vdbe.c
src/vdbe.h
src/vdbeInt.h
src/vdbeaux.c
src/vdbeblob.c
test/fkey6.test
test/tester.tcl

diff --cc Makefile.in
Simple merge
diff --cc Makefile.msc
Simple merge
diff --cc main.mk
Simple merge
diff --cc manifest
index 4112e0a47f4103871f61c2f00caef9cca593158a,450f12a232eec086afe18be34af8890d246c3228..fcac3f72304fca9d17115eed841f819115c4a257
+++ b/manifest
@@@ -1,12 -1,12 +1,12 @@@
- C Merge\sall\strunk\schanges\ssince\s3.8.1\sinto\sthe\ssessions\sbranch.
- D 2013-10-28T22:47:24.844
 -C Fix\stypos\sin\scompile\sand\srun-time\stests\sof\sthe\ssqlite\slibrary\sversion\snumber\sin\s\srtree.c.
 -D 2013-11-11T19:56:35.910
++C Merge\sin\sthe\sWITHOUT\sROWID\schanges.\s\sA\sfew\stests\sare\sfailing\snow.\s\sThey\swill\nbe\sfixed\sin\sa\sfollow-on\scheck-in.
++D 2013-11-11T22:55:26.153
  F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
- F Makefile.in 15f75d6d804c5552a05390d1982c1114b8ce6d2d
 -F Makefile.in d12e4455cf7a36e42d3949876c1c3b88ff70867a
++F Makefile.in bb787d5227c6aa95915ff04e9634a0a469297ea4
  F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
- F Makefile.msc 72a3e9091272201b337908e136de753ba38c8206
 -F Makefile.msc eaf39e18f37637111c6e39ed35b1da9092c8816f
++F Makefile.msc ec33274b488575929601e26d7e815e340ded812c
  F Makefile.vxworks db21ed42a01d5740e656b16f92cb5d8d5e5dd315
  F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6
- F VERSION a8d1f6839521130dc73c5408cdd24bcfd791df34
+ F VERSION 52f7e22bfcec71a462e34194b4ae1671380fde59
  F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
  F addopcodes.awk 17dc593f791f874d2c23a0f9360850ded0286531
  F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
@@@ -138,24 -139,10 +139,24 @@@ F ext/rtree/rtree_util.tcl 06aab2ed5b82
  F ext/rtree/sqlite3rtree.h c34c1e41d1ab80bb8ad09aae402c9c956871a765
  F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de
  F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024
 +F ext/session/session1.test 894e3bc9f497c4fa07a2aa3271e3911f3670c3d8
 +F ext/session/session2.test 99ca0da7ddb617d42bafd83adccf99f18ae0384b
 +F ext/session/session3.test a7a9ce59b8d1e49e2cc23d81421ac485be0eea01
 +F ext/session/session4.test a6ed685da7a5293c5d6f99855bcf41dbc352ca84
 +F ext/session/session5.test 8fdfaf9dba28a2f1c6b89b06168bdab1fef2d478
 +F ext/session/session6.test 443789bc2fca12e4f7075cf692c60b8a2bea1a26
 +F ext/session/session8.test 7d35947ad329b8966f095d34f9617a9eff52dc65
 +F ext/session/session9.test 43acfdc57647c2ce4b36dbd0769112520ea6af14
 +F ext/session/sessionA.test eb05c13e4ef1ca8046a3a6dbf2d5f6f5b04a11d4
 +F ext/session/session_common.tcl 1539d8973b2aea0025c133eb0cc4c89fcef541a5
 +F ext/session/sessionfault.test 496291b287ba3c0b14ca2e074425e29cc92a64a6
 +F ext/session/sqlite3session.c 63eea3741e8ac1574d4c183fd92a6a50b1415357
 +F ext/session/sqlite3session.h 6c35057241567ed6319f750ee504a81c459225e1
 +F ext/session/test_session.c d38968307c05229cc8cd603722cf305d6f768832
  F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
  F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
- F magic.txt 814d3de5ec227817ff2ad26cbc73159c968a2a58
- F main.mk f572e71022e342deb3a4786a728eb20765e0cfae
+ F magic.txt f439556c5ce01ced70987e5ee86549a45165d9ff
 -F main.mk fbd5fed974f68cc312e4f73770df0f5221b3b460
++F main.mk 384a11414a17c25a5df667174050ec50181f46a9
  F mkdll.sh 7d09b23c05d56532e9d44a50868eb4b12ff4f74a
  F mkextu.sh 416f9b7089d80e5590a29692c9d9280a10dbad9f
  F mkextw.sh d2a981497b404d6498f5ff3e3b1f3816bdfcb338
@@@ -187,21 -174,21 +188,21 @@@ F src/callback.c f99a8957ba2adf369645fa
  F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
  F src/ctime.c ea4b7f3623a0fcb1146e7f245d7410033e86859c
  F src/date.c 593c744b2623971e45affd0bde347631bdfa4625
- F src/delete.c 92d409e4c3ab3c5f1173451971a40226ce4cfe1c
- F src/expr.c e7338ccffdc391c53ba2d51c5eb6a2f5299e040e
 -F src/delete.c ddb92f44595366c4817e576b5f11cad5a915c3ef
++F src/delete.c 714f86ed9d563f12313d92d600ae1c9e68c6fa14
+ F src/expr.c e7bbe3c6916e141f27a28655d3cf325b817695e4
  F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
- F src/fkey.c 5dc10cbaa355753903cd2a64da040f948997ebf8
- F src/func.c 2c47b65e6e00e3e9374942f28254faf8adafe398
+ F src/fkey.c 78364daed38e26269c53ddb94c515bceac1063c6
+ F src/func.c 96caa9dfd1febf9a4b720de4c43ccfb392a52b73
  F src/global.c 5caf4deab621abb45b4c607aad1bd21c20aac759
  F src/hash.c ac3470bbf1ca4ae4e306a8ecb0fdf1731810ffe4
  F src/hash.h 8890a25af81fb85a9ad7790d32eedab4b994da22
  F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08
- F src/insert.c feaa30b45af7f6a6bf363cc0ac05c1c25d162eff
 -F src/insert.c 63003c569c55793c3278ad7634bdd0c49d755a47
++F src/insert.c 0f4d5b41d1cd8291e98af33587f2a4bbb3d59abb
  F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
  F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12
  F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b
  F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303
- F src/main.c 0cc0574e656567999115fe93666a3f97ad917e86
 -F src/main.c 32bf1e6e164a6fa0ddf1bf2616c6eafbefd6e9b0
++F src/main.c d802034d4a145e440b651dc67c590355f41c64b5
  F src/malloc.c 543a8eb5508eaf4cadf55a9b503379eba2088128
  F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
  F src/mem1.c 437c7c4af964895d4650f29881df63535caaa1fa
@@@ -230,14 -217,14 +231,14 @@@ F src/pragma.c 3b7b766382ac679d3c1a7ba3
  F src/prepare.c fa6988589f39af8504a61731614cd4f6ae71554f
  F src/printf.c da9119eb31a187a4b99f60aa4a225141c0ebb74b
  F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68
- F src/resolve.c 572585a96bf282bb9c3d9e08785ec3cae21dc488
+ F src/resolve.c fc4673cc49b116e51e7f12de074c0acf8f2388f9
  F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
- F src/select.c 15127b54cc11defb2cddef6914e1f384501a61c4
- F src/shell.c d5eebdc6034014103de2b9d58e1d3f6f7de0fb50
- F src/sqlite.h.in f287bd97f9cdf6ec8f57f37cf2e590ed6b9f6302
+ F src/select.c a040df82c4ac90b27114e1c21a05d77cc6dc6f80
+ F src/shell.c 03d8d9b4052430343ff30d646334621f980f1202
 -F src/sqlite.h.in f73c5fa1f1ff7c82ad8dff4daee690fe0ef43638
++F src/sqlite.h.in 359a06b4832eba83e832712b9708c731c2a13a7a
  F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
  F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
- F src/sqliteInt.h cc58deabef26a4a82e7b40c47316968e359c6fae
 -F src/sqliteInt.h 3da1940a2ba05a663e9016d57f1ea1f79ffcb03e
++F src/sqliteInt.h 4d218f4480af7672cff22bb4ef589410f5415f68
  F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
  F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
  F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@@ -255,7 -242,7 +256,7 @@@ F src/test_async.c 21e11293a2f72080eda7
  F src/test_autoext.c dea8a01a7153b9adc97bd26161e4226329546e12
  F src/test_backup.c 3875e899222b651e18b662f86e0e50daa946344e
  F src/test_btree.c 5b89601dcb42a33ba8b820a6b763cc9cb48bac16
- F src/test_config.c 9ec20c94a3290f64d60c6db12c3e88ed3de9e501
 -F src/test_config.c e825cd6a4a8f498be246fc5934fe5fd702b9441f
++F src/test_config.c 740b371afbfa12d47fd44d515a685b00c4015850
  F src/test_demovfs.c 69b2085076654ebc18014cbc6386f04409c959a9
  F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc
  F src/test_fs.c ced436e3d4b8e4681328409b8081051ce614e28f
@@@ -287,20 -274,20 +288,20 @@@ F src/test_thread.c 1e133a40b50e9c035b0
  F src/test_vfs.c e72f555ef7a59080f898fcf1a233deb9eb704ea9
  F src/test_vfstrace.c 34b544e80ba7fb77be15395a609c669df2e660a2
  F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
- F src/tokenize.c 70061085a51f2f4fc15ece94f32c03bcb78e63b2
- F src/trigger.c ba0a883cd536b7dfdd4df3733001f5372a4299da
- F src/update.c be9831a714638ed5b66e215451d4775d136ea745
+ F src/tokenize.c ec4c1a62b890bf1dbcdb966399e140b904c700a4
+ F src/trigger.c 53d6b5d50b3b23d4fcd0a36504feb5cff9aed716
 -F src/update.c 3de7e657b98ac67338d775c114a4068faf732402
++F src/update.c faee30d7aa32a1196b9eb751b8e50d9ff0ad6ea7
  F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269
  F src/util.c 2fa6c821d28bbdbeec1b2a7b091a281c9ef8f918
- F src/vacuum.c f313bc97123a4dd4bfd3f50a00c4d44c08a5b1b7
- F src/vdbe.c 7663e009b870623f664fc4d4d0634767d4a927a3
- F src/vdbe.h 7aa3ab6210a68471c8490dedfc9aa4ef5684b9a0
- F src/vdbeInt.h 2eaf8a38ec76738bbb18429e6c4f317e3766742e
+ F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
 -F src/vdbe.c fda0d2ba5a3a5ab588f0467782e7fd64930ddb22
 -F src/vdbe.h 8d5a7351024d80374fc0acdbbe3cfe65c51ba8b6
 -F src/vdbeInt.h f2fa3ceccceeb757773921fb08af7c6e9f3caa1c
 -F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed
 -F src/vdbeaux.c 84d2d421c11c3e534d4948274e4d0a5d5816a695
 -F src/vdbeblob.c ff60adf2953e0ffc1d59541b3101c9886b03a3de
++F src/vdbe.c 8b6b4fcea067e9ea3736538378765098018284f8
++F src/vdbe.h c7aa561dea0070486c49a3aab6d550bb84728bda
++F src/vdbeInt.h fe226d7290e8c1eb2d334dadfeb3f3285b3f2d14
 +F src/vdbeapi.c 8ade912f7023a3b35ee64497a94718ddbd7269c3
- F src/vdbeaux.c 371a22e7485e57048be1e625eb0b82e3429b0f58
- F src/vdbeblob.c 1268e0bcb8e21fa32520b0fc376e1bcdfaa0c642
- F src/vdbemem.c 649933bad3e922465b726eaf85c72a75acba2ab7
- F src/vdbesort.c 3937e06b2a0e354500e17dc206ef4c35770a5017
++F src/vdbeaux.c f2905bb192c946ee0e223b5eca9411592eaa7976
++F src/vdbeblob.c 0ab871fa7466efaef05877f06d650f0f7401cbe0
+ F src/vdbemem.c cc529bbf4f13e4e181bdb446bf6e6962ab030b4b
+ F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147
  F src/vdbetrace.c e7ec40e1999ff3c6414424365d5941178966dcbc
  F src/vtab.c 5a423b042eb1402ef77697d03d6a67378d97bc8d
  F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4
@@@ -474,11 -463,11 +477,11 @@@ F test/fallocate.test 3e979af17dfa7e5e9
  F test/filectrl.test 14fa712e42c4cb791e09dfd58a6a03efb47ef13a
  F test/filefmt.test cb34663f126cbc2d358af552dcaf5c72769b0146
  F test/fkey1.test e1d1fa84cde579185ea01358436839703e415a5b
- F test/fkey2.test 06e0b4cc9e1b3271ae2ae6feeb19755468432111
- F test/fkey3.test 5ec899d12b13bcf1e9ef40eff7fb692fdb91392e
+ F test/fkey2.test 32ca728bcb854feed72d1406ea375fe423eebff2
+ F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49
  F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d
  F test/fkey5.test 8a1fde4e7721ae00b05b3178888833726ca2df8d
- F test/fkey6.test cd81be336e0664c7e4d3523efb67171d720192ef
 -F test/fkey6.test abb59f866c1b44926fd02d1fdd217d831fe04f48
++F test/fkey6.test 6697550baa38505c9952eff130ab26a2d156c0cc
  F test/fkey7.test e31d0e71a41c1d29349a16448d6c420e2c53a8fc
  F test/fkey_malloc.test bb74c9cb8f8fceed03b58f8a7ef2df98520bbd51
  F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb
@@@ -595,9 -584,9 +598,9 @@@ F test/fuzz_malloc.test 328f70aaca63adf
  F test/fuzzer1.test d4c52aaf3ef923da293a2653cfab33d02f718a36
  F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536
  F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98
 -F test/hook.test 45cb22b940c3cc0af616ba7430f666e245711a48
 +F test/hook.test 777b2541f6dd4f4ca5e8d6b66c1df1b3717aeab6
  F test/icu.test 70df4faca133254c042d02ae342c0a141f2663f4
- F test/in.test 5941096407d8c133b9eff15bd3e666624b6cbde3
+ F test/in.test 047c4671328e9032ab95666a67021adbbd36e98e
  F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75
  F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0
  F test/in4.test 64f3cc1acde1b9161ccdd8e5bde3daefdb5b2617
@@@ -741,8 -731,8 +745,8 @@@ F test/pagesize.test 1dd51367e752e742f5
  F test/pcache.test b09104b03160aca0d968d99e8cd2c5b1921a993d
  F test/pcache2.test a83efe2dec0d392f814bfc998def1d1833942025
  F test/percentile.test b98fc868d71eb5619d42a1702e9ab91718cbed54
 -F test/permutations.test e154f5ed66d4d4913a99a110e870c9407f75b055
 +F test/permutations.test 08dbc6b0f4afbdffd701346ffae2998bb612c335
- F test/pragma.test 5e7de6c32a5d764f09437d2025f07e4917b9e178
+ F test/pragma.test e882183ecd21d064cec5c7aaea174fbd36293429
  F test/pragma2.test aea7b3d82c76034a2df2b38a13745172ddc0bc13
  F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552
  F test/progress.test a282973d1d17f08071bc58a77d6b80f2a81c354d
@@@ -837,13 -826,14 +841,14 @@@ F test/superlock.test 1cde669f68d2dd37d
  F test/sync.test a34cd43e98b7fb84eabbf38f7ed8f7349b3f3d85
  F test/syscall.test a653783d985108c4912cc64d341ffbbb55ad2806
  F test/sysfault.test fa776e60bf46bdd3ae69f0b73e46ee3977a58ae6
- F test/table.test 30423211108121884588d24d6776c7f38702ad7b
+ F test/table.test 580d23530187026d4502fae74a490f0408cf2cc7
  F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126
 -F test/tclsqlite.test 37a61c2da7e3bfe3b8c1a2867199f6b860df5d43
+ F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930
 +F test/tclsqlite.test a7308276aad2e6c0bfb5b0414424dd0d9cc0cad7
  F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c
  F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30
  F test/temptrigger.test 0a48d94222d50e6e50d72ac103606c4f8e7cbb81
- F test/tester.tcl 282c1a6b541bd2518a28030884073d1b6dfe98ba
 -F test/tester.tcl 7eac97d18c7836d91c078e1d5fa3f7eb5d9d6b4e
++F test/tester.tcl c52441bc75166cf9eab488fef33a5367518b5a89
  F test/thread001.test 9f22fd3525a307ff42a326b6bc7b0465be1745a5
  F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58
  F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7
@@@ -1141,7 -1136,7 +1151,7 @@@ F tool/vdbe-compress.tcl f12c884766bd14
  F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
  F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
  F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
- P 5806546822b717d712dc7cd9de88a86f5bf2f715 3a9e3ed94bf617f00c48009b1a6d348a8f23a3cf
- R 6a218c52fd606677f29de12012a31eb7
 -P 5a3cfd747a85480d215784817c3821d87ecfa2f7
 -R 00f65730572bcf193db652ccbf41d1b0
 -U dan
 -Z 9077fdf4fd98897af8a921df2b0a84da
++P aa72ea8a004de7fe744fc13baef19d05aea607d5 f58d57017199421167dae8ebc67db2f19be45082
++R 3b17341d4c625bc46e3586e654b8390b
 +U drh
- Z 6c335f57007a8ea5e658e5dc44efd950
++Z 1cdf9fac9d6e4efb5a645c5741312eca
diff --cc manifest.uuid
index eb5e2715c7adf2001747904760375703cf04ee3c,289b909258692b8e4e8c996696d5ec988f841b2c..e437b594eae50365b5b335bdf51755c1d51dd629
@@@ -1,1 -1,1 +1,1 @@@
- aa72ea8a004de7fe744fc13baef19d05aea607d5
 -f58d57017199421167dae8ebc67db2f19be45082
++5addd1234ded59ce60fb633b76ac87d483377edd
diff --cc src/delete.c
index f52c0c67f6435b26386ce92355620bbaafe29500,4fb394659581a6c5869fa9e26e36af5f1064dddb..9ebb56ecaaec452b2c5ab6796cd945bcaef230f1
@@@ -549,18 -614,13 +621,18 @@@ void sqlite3GenerateRowDelete
  
    /* Delete the index and table entries. Skip this step if pTab is really
    ** a view (in which case the only effect of the DELETE statement is to
 -  ** fire the INSTEAD OF triggers).  */ 
 +  ** fire the INSTEAD OF triggers).  
 +  **
 +  ** If variable 'count' is non-zero, then this OP_Delete instruction should
 +  ** invoke the update-hook. The pre-update-hook, on the other hand should
 +  ** be invoked unless table pTab is a system table. The difference is that
 +  ** the update-hook is not invoked for rows removed by REPLACE, but the 
 +  ** pre-update-hook is.
 +  */ 
    if( pTab->pSelect==0 ){
-     sqlite3GenerateRowIndexDelete(pParse, pTab, iCur, 0);
-     sqlite3VdbeAddOp2(v, OP_Delete, iCur, (count?OPFLAG_NCHANGE:0));
+     sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, 0);
+     sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, (count?OPFLAG_NCHANGE:0));
 -    if( count ){
 -      sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_TRANSIENT);
 -    }
 +    sqlite3VdbeChangeP4(v, -1, (char*)pTab, P4_TABLE);
    }
  
    /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to
diff --cc src/insert.c
index 96ca2b69ba2901c57d911f0354fd4d98cd45983c,967abac8403c076581048897edda545b4ca6a57a..1c89a38af5dc6db22bfc8a5912a221a86e11a371
@@@ -1350,22 -1407,11 +1407,23 @@@ void sqlite3GenerateConstraintChecks
          }
          if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){
            sqlite3MultiWrite(pParse);
-           sqlite3GenerateRowDelete(
-               pParse, pTab, baseCur, regRowid, 0, pTrigger, OE_Replace
-           );
+           sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur,
+                                    regNewData, 1, 0, OE_Replace, 1);
 -        }else if( pTab->pIndex ){
 -          sqlite3MultiWrite(pParse);
 -          sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, 0);
 +        }else{
 +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
-           /* This OP_Delete opcode fires the pre-update-hook only. It does
-           ** not modify the b-tree. It is more efficient to let the coming
-           ** OP_Insert replace the existing entry than it is to delete the
-           ** existing entry and then insert a new one. */
-           sqlite3VdbeAddOp2(v, OP_Delete, baseCur, OPFLAG_ISNOOP);
-           sqlite3VdbeChangeP4(v, -1, (char *)pTab, P4_TABLE);
++          if( HasRowid(pTab) ){
++            /* This OP_Delete opcode fires the pre-update-hook only. It does
++            ** not modify the b-tree. It is more efficient to let the coming
++            ** OP_Insert replace the existing entry than it is to delete the
++            ** existing entry and then insert a new one. */
++            sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, OPFLAG_ISNOOP);
++            sqlite3VdbeChangeP4(v, -1, (char *)pTab, P4_TABLE);
++          }
 +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
 +          if( pTab->pIndex ){
 +            sqlite3MultiWrite(pParse);
-             sqlite3GenerateRowIndexDelete(pParse, pTab, baseCur, 0);
++            sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, 0);
 +          }
          }
          seenReplace = 1;
          break;
@@@ -1556,9 -1650,9 +1662,9 @@@ void sqlite3CompleteInsertion
    if( useSeekResult ){
      pik_flags |= OPFLAG_USESEEKRESULT;
    }
-   sqlite3VdbeAddOp3(v, OP_Insert, baseCur, regRec, regRowid);
+   sqlite3VdbeAddOp3(v, OP_Insert, iDataCur, regRec, regNewData);
    if( !pParse->nested ){
 -    sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_TRANSIENT);
 +    sqlite3VdbeChangeP4(v, -1, (char *)pTab, P4_TABLE);
    }
    sqlite3VdbeChangeP5(v, pik_flags);
  }
@@@ -1871,31 -1994,33 +2006,33 @@@ static int xferOptimization
      addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iDest, 0);
      emptyDestTest = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0);
      sqlite3VdbeJumpHere(v, addr1);
-   }else{
-     emptyDestTest = 0;
    }
-   sqlite3OpenTable(pParse, iSrc, iDbSrc, pSrc, OP_OpenRead);
-   emptySrcTest = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0);
-   regData = sqlite3GetTempReg(pParse);
-   regRowid = sqlite3GetTempReg(pParse);
-   if( pDest->iPKey>=0 ){
-     addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid);
-     addr2 = sqlite3VdbeAddOp3(v, OP_NotExists, iDest, 0, regRowid);
-     sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_PRIMARYKEY,
-         onError, "PRIMARY KEY must be unique", P4_STATIC);
-     sqlite3VdbeJumpHere(v, addr2);
-     autoIncStep(pParse, regAutoinc, regRowid);
-   }else if( pDest->pIndex==0 ){
-     addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid);
+   if( HasRowid(pSrc) ){
+     sqlite3OpenTable(pParse, iSrc, iDbSrc, pSrc, OP_OpenRead);
+     emptySrcTest = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0);
+     if( pDest->iPKey>=0 ){
+       addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid);
+       addr2 = sqlite3VdbeAddOp3(v, OP_NotExists, iDest, 0, regRowid);
+       sqlite3RowidConstraint(pParse, onError, pDest);
+       sqlite3VdbeJumpHere(v, addr2);
+       autoIncStep(pParse, regAutoinc, regRowid);
+     }else if( pDest->pIndex==0 ){
+       addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid);
+     }else{
+       addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid);
+       assert( (pDest->tabFlags & TF_Autoincrement)==0 );
+     }
+     sqlite3VdbeAddOp2(v, OP_RowData, iSrc, regData);
+     sqlite3VdbeAddOp3(v, OP_Insert, iDest, regData, regRowid);
+     sqlite3VdbeChangeP5(v, OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND);
 -    sqlite3VdbeChangeP4(v, -1, pDest->zName, 0);
++    sqlite3VdbeChangeP4(v, -1, (char*)pDest, P4_TABLE);
+     sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1);
+     sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0);
+     sqlite3VdbeAddOp2(v, OP_Close, iDest, 0);
    }else{
-     addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid);
-     assert( (pDest->tabFlags & TF_Autoincrement)==0 );
-   }
-   sqlite3VdbeAddOp2(v, OP_RowData, iSrc, regData);
-   sqlite3VdbeAddOp3(v, OP_Insert, iDest, regData, regRowid);
-   sqlite3VdbeChangeP5(v, OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND);
-   sqlite3VdbeChangeP4(v, -1, (char *)pDest, P4_TABLE);
-   sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1);
+     sqlite3TableLock(pParse, iDbDest, pDest->tnum, 1, pDest->zName);
+     sqlite3TableLock(pParse, iDbSrc, pSrc->tnum, 0, pSrc->zName);
+   }
    for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){
      for(pSrcIdx=pSrc->pIndex; ALWAYS(pSrcIdx); pSrcIdx=pSrcIdx->pNext){
        if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break;
diff --cc src/main.c
Simple merge
diff --cc src/sqlite.h.in
Simple merge
diff --cc src/sqliteInt.h
Simple merge
Simple merge
diff --cc src/update.c
index 2e5d935389520af5af01f264b522f02d28a5d267,34176603e25c88e3f8191a31603c1fb6d8d26590..d355d7153c9978ef76faa0240cdd4b2c402cd8b0
@@@ -492,30 -567,29 +567,42 @@@ void sqlite3Update
      }
  
      /* Delete the index entries associated with the current record.  */
-     j1 = sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regOldRowid);
-     sqlite3GenerateRowIndexDelete(pParse, pTab, iCur, aRegIdx);
+     if( bReplace || chngKey ){
+       if( pPk ){
+         j1 = sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, 0, regKey, nKey);
+       }else{
+         j1 = sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, 0, regOldRowid);
+       }
+     }
+     sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx);
 -  
 -    /* If changing the record number, delete the old record.  */
 -    if( hasFK || chngKey || pPk!=0 ){
 -      sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, 0);
 +
 +    /* If changing the rowid value, or if there are foreign key constraints
 +    ** to process, delete the old record. Otherwise, add a noop OP_Delete
 +    ** to invoke the pre-update hook.
 +    **
 +    ** That (regNew==regnewRowid+1) is true is also important for the 
 +    ** pre-update hook. If the caller invokes preupdate_new(), the returned
 +    ** value is copied from memory cell (regNewRowid+1+iCol), where iCol
 +    ** is the column index supplied by the user.
 +    */
 +    assert( regNew==regNewRowid+1 );
-     sqlite3VdbeAddOp3(v, OP_Delete, iCur,
-         OPFLAG_ISUPDATE | ((hasFK || chngRowid) ? 0 : OPFLAG_ISNOOP),
++    sqlite3VdbeAddOp3(v, OP_Delete, iDataCur,
++        OPFLAG_ISUPDATE | ((hasFK || chngKey || pPk!=0) ? 0 : OPFLAG_ISNOOP),
 +        regNewRowid
 +    );
 +    if( !pParse->nested ){
 +      sqlite3VdbeChangeP4(v, -1, (char*)pTab, P4_TABLE);
      }
-     sqlite3VdbeJumpHere(v, j1);
+     if( bReplace || chngKey ){
+       if( sqlite3VdbeCurrentAddr(v)==j1+1 ){
+         sqlite3VdbeChangeToNoop(v, j1);
+       }else{
+         sqlite3VdbeJumpHere(v, j1);
+       }
+     }
  
      if( hasFK ){
-       sqlite3FkCheck(pParse, pTab, 0, regNewRowid, aXRef, chngRowid);
+       sqlite3FkCheck(pParse, pTab, 0, regNewRowid, aXRef, chngKey);
      }
    
      /* Insert the new index entries and the new record. */
diff --cc src/vdbe.c
index 9b384b4c6da70c554ae9e8d7200aa159a7ccbaae,d3fe0a4500d329d06a250be5e705f8f1c64e81fe..4eb900f256fcba0eb55606561ed28baab943ec80
@@@ -4065,8 -4070,8 +4080,8 @@@ case OP_InsertInt: 
    int nZero;        /* Number of zero-bytes to append */
    int seekResult;   /* Result of prior seek or 0 if no USESEEKRESULT flag */
    const char *zDb;  /* database name - used by the update hook */
 -  const char *zTbl; /* Table name - used by the opdate hook */
 -  int op;           /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */
 +  Table *pTab;      /* Table structure - used by update and pre-update hooks */
-   int op;           /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */
++  int op = 0;       /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */
  
    pData = &aMem[pOp->p2];
    assert( pOp->p1>=0 && pOp->p1<p->nCursor );
    assert( pC->pCursor!=0 );
    assert( pC->pseudoTableReg==0 );
    assert( pC->isTable );
-   assert( pOp->p4type==P4_TABLE || pOp->p4type==P4_NOTUSED );
++  assert( pOp->p4type==P4_TABLE || pOp->p4type>=P4_STATIC );
    REGISTER_TRACE(pOp->p2, pData);
  
    if( pOp->opcode==OP_Insert ){
    pC->cacheStatus = CACHE_STALE;
  
    /* Invoke the update-hook if required. */
--  if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){
 -    zDb = db->aDb[pC->iDb].zName;
 -    zTbl = pOp->p4.z;
 -    op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT);
 -    assert( pC->isTable );
 -    db->xUpdateCallback(db->pUpdateArg, op, zDb, zTbl, iKey);
 -    assert( pC->iDb>=0 );
++  if( rc==SQLITE_OK && db->xUpdateCallback && op ){
 +    db->xUpdateCallback(db->pUpdateArg, op, zDb, pTab->zName, iKey);
    }
    break;
  }
diff --cc src/vdbe.h
index e1db15fe2b45f9d9dacde36725003270b046ba22,91d6a0f794a2b6699ecd7d27969cf6a3395491f8..63ac0c3ef17f78d444d0ab5c79f8cfdaefe5bd67
@@@ -59,10 -59,9 +59,10 @@@ struct VdbeOp 
      KeyInfo *pKeyInfo;     /* Used when p4type is P4_KEYINFO */
      int *ai;               /* Used when p4type is P4_INTARRAY */
      SubProgram *pProgram;  /* Used when p4type is P4_SUBPROGRAM */
 +    Table *pTab;           /* Used when p4type is P4_TABLE */
      int (*xAdvance)(BtCursor *, int *);
    } p4;
- #ifdef SQLITE_DEBUG
+ #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
    char *zComment;          /* Comment to improve readability */
  #endif
  #ifdef VDBE_PROFILE
@@@ -117,17 -116,12 +117,13 @@@ typedef struct VdbeOpList VdbeOpList
  #define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */
  #define P4_SUBPROGRAM  (-18) /* P4 is a pointer to a SubProgram structure */
  #define P4_ADVANCE  (-19) /* P4 is a pointer to BtreeNext() or BtreePrev() */
 +#define P4_TABLE    (-20) /* P4 is a pointer to a Table structure */
  
- /* When adding a P4 argument using P4_KEYINFO, a copy of the KeyInfo structure
- ** is made.  That copy is freed when the Vdbe is finalized.  But if the
- ** argument is P4_KEYINFO_HANDOFF, the passed in pointer is used.  It still
- ** gets freed when the Vdbe is finalized so it still should be obtained
- ** from a single sqliteMalloc().  But no copy is made and the calling
- ** function should *not* try to free the KeyInfo.
- */
- #define P4_KEYINFO_HANDOFF (-16)
- #define P4_KEYINFO_STATIC  (-17)
+ /* Error message codes for OP_Halt */
+ #define P5_ConstraintNotNull 1
+ #define P5_ConstraintUnique  2
+ #define P5_ConstraintCheck   3
+ #define P5_ConstraintFK      4
  
  /*
  ** The Vdbe.aColName array contains 5n Mem structures, where n is the 
diff --cc src/vdbeInt.h
Simple merge
diff --cc src/vdbeaux.c
Simple merge
diff --cc src/vdbeblob.c
Simple merge
diff --cc test/fkey6.test
Simple merge
diff --cc test/tester.tcl
Simple merge