mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Merge enhancements and bug fixes from trunk.
FossilOrigin-Name: 9fb646f29c05bca5f677a2c7c4f45c36bfe0a0c6a88cb7968b4a0459bdd63bb2
This commit is contained in:
44
manifest
44
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Merge\sperformance\senhancements\sfrom\strunk.
|
C Merge\senhancements\sand\sbug\sfixes\sfrom\strunk.
|
||||||
D 2018-12-28T21:32:35.935
|
D 2018-12-31T18:30:41.155
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6
|
F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6
|
||||||
@@ -445,7 +445,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
|
|||||||
F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
|
F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
|
||||||
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
|
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
|
||||||
F src/alter.c 082286f89160ca2302d51650e173b745ef78c42b6a7ebc3262d9cb166596c7ca
|
F src/alter.c 082286f89160ca2302d51650e173b745ef78c42b6a7ebc3262d9cb166596c7ca
|
||||||
F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9
|
F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644
|
||||||
F src/attach.c 92b51739a885da8bd84bc9a05485f1e48148bce5c15432f059b45af98fff75cd
|
F src/attach.c 92b51739a885da8bd84bc9a05485f1e48148bce5c15432f059b45af98fff75cd
|
||||||
F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df
|
F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df
|
||||||
F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab
|
F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab
|
||||||
@@ -461,17 +461,17 @@ F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b
|
|||||||
F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957
|
F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957
|
||||||
F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7
|
F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7
|
||||||
F src/dbstat.c 3c8bd4e77f0244fd2bd7cc90acf116ad2f8e82d70e536637f35ac2bc99b726f9
|
F src/dbstat.c 3c8bd4e77f0244fd2bd7cc90acf116ad2f8e82d70e536637f35ac2bc99b726f9
|
||||||
F src/delete.c f7938125847e8ef485448db5fbad29acb2991381a02887dd854c1617315ab9fb
|
F src/delete.c 209cd8345b15d1843abeff2d91a6d9c765cf32ff4abcb24411c38fe08e18baab
|
||||||
F src/expr.c 7e6f3cd438b5023c82c52f45ef3c73d0db576092d26e5927c787a4610c3dd20a
|
F src/expr.c 2871554cc9be8d0da0d481dbf20ee814fc6990ce01f885a1bb6af0d1f552085e
|
||||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||||
F src/fkey.c 012dd7dba1a62fda6b76e633ab303b2232ee2874a685c915065227ab20ad6ae0
|
F src/fkey.c aaf28be73ab21e1e8bf4ac6b94269ebc8c93238d1e6997cb44b527b622e8ae6f
|
||||||
F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f
|
F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f
|
||||||
F src/global.c 8291eee0782b83124de14ec0389ec9fd6ae1873358a6b0d9469fe17a46ad803b
|
F src/global.c 8291eee0782b83124de14ec0389ec9fd6ae1873358a6b0d9469fe17a46ad803b
|
||||||
F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a
|
F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a
|
||||||
F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4
|
F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4
|
||||||
F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da
|
F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da
|
||||||
F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
|
F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
|
||||||
F src/insert.c 2b5d4e52fdcf1b9e8a5fe88bb2a5f1c58338062145b95683c2e98467633620e8
|
F src/insert.c 1e0001758cd174177886cdfe23d69c6d6775f1c4e7fe946a041f1ef56ae85bc5
|
||||||
F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e
|
F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e
|
||||||
F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6
|
F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6
|
||||||
F src/main.c 008f45dd39cdc7fb9e7e1f61d75a5c97397f8e07427a8879be23e27747d5f948
|
F src/main.c 008f45dd39cdc7fb9e7e1f61d75a5c97397f8e07427a8879be23e27747d5f948
|
||||||
@@ -503,19 +503,19 @@ F src/parse.y a3c0db595bc642c6ee1d72869842f7f5b0b6ebeb91c21d0a7cba631d27e7afbd
|
|||||||
F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee
|
F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee
|
||||||
F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586
|
F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586
|
||||||
F src/pcache1.c ddc9fc7d9861cf3a1f30660264b76b1ae9e1dce5dbba085cf001d5cb6b41cf8c
|
F src/pcache1.c ddc9fc7d9861cf3a1f30660264b76b1ae9e1dce5dbba085cf001d5cb6b41cf8c
|
||||||
F src/pragma.c 96ce7dce4dc9cb2b7aa0e1b2ce7536870bdc00b10becc278245e775489447ea0
|
F src/pragma.c 20811b404b6d302a1bedd4b8af8aab2794c5e87ba1f5cb6b42dbc3266ad9c603
|
||||||
F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13
|
F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13
|
||||||
F src/prepare.c d0918fb8d00b1ebf19655e7f3d28464b3fc3c43c16d36dd06092de02244a5180
|
F src/prepare.c d0918fb8d00b1ebf19655e7f3d28464b3fc3c43c16d36dd06092de02244a5180
|
||||||
F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381
|
F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381
|
||||||
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
||||||
F src/resolve.c 72fe8cae7326b979e7258ab4c531956951e1a5f3fe8644c646abaec1b2eb6d95
|
F src/resolve.c 72fe8cae7326b979e7258ab4c531956951e1a5f3fe8644c646abaec1b2eb6d95
|
||||||
F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
|
F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
|
||||||
F src/select.c c6a71c619db529e1af6b30d9ff59ec75dac2511f155e45bb6e49c07d9d5e79c0
|
F src/select.c 2493d09401fdd3c0b9a8d5b15486876f9167f87ef8013d58be9730f4c83bdb0c
|
||||||
F src/shell.c.in 207da30342db0b6fac8b2487abd60b059a5ea80cc9494bd1db76a1dd4aae7cca
|
F src/shell.c.in 207da30342db0b6fac8b2487abd60b059a5ea80cc9494bd1db76a1dd4aae7cca
|
||||||
F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f
|
F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f
|
||||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||||
F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683
|
F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683
|
||||||
F src/sqliteInt.h ac354476cedd0a7cf103ec225423bc654bc0df8a7a1019ce298425ebe91062cf
|
F src/sqliteInt.h 2ed8b7c854c9c1c300c3f17bbdff926c3022665146a3125e48bdf8ae2351db70
|
||||||
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
||||||
F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
|
F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
|
||||||
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
||||||
@@ -575,17 +575,17 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
|||||||
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
||||||
F src/tokenize.c c8af4feebd8bf5a4d60a14018d91f61013f658ec864dfce7661bae73d86b3191
|
F src/tokenize.c c8af4feebd8bf5a4d60a14018d91f61013f658ec864dfce7661bae73d86b3191
|
||||||
F src/treeview.c c6ff90da4cc1813ff2d9bb11f17d4d927db62c47e552faa1835edc47269d753d
|
F src/treeview.c c6ff90da4cc1813ff2d9bb11f17d4d927db62c47e552faa1835edc47269d753d
|
||||||
F src/trigger.c 252b650375dd1f47e787fddf5fc0ad14bc298c7af7e6e1b70748df604f2ccb37
|
F src/trigger.c 77546bf525854aa4dc09f3a0450fa801c3e99d5f13a3eb2efd07bfe521e3b5d6
|
||||||
F src/update.c 1816d56c1bca1ba4e0ef98cac2f49be62858e9df1dc08844c7067eb41cc44274
|
F src/update.c 4e630e47852e206d0b29ec63ea0402e0b7ba328a1c19dd645ae8ac7bd0a378cf
|
||||||
F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4
|
F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4
|
||||||
F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
|
F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
|
||||||
F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
|
F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
|
||||||
F src/vacuum.c 3ffe64ecfc94b7528c5d7bdb1c3a19d72fec63f2aa846e3b90f8de5dbbddf5aa
|
F src/vacuum.c 3ffe64ecfc94b7528c5d7bdb1c3a19d72fec63f2aa846e3b90f8de5dbbddf5aa
|
||||||
F src/vdbe.c 149521430c7d7b9f2d43f6cdb2d2de36e7f35537914aede13e0f94f91113710d
|
F src/vdbe.c 0be19a62da20276746ef51828d581a8e7a07dc327d1b26edeffa5f7f7d9d05b0
|
||||||
F src/vdbe.h 55f9ef5d48f6b4b2aa84cba08dab1217400b499e9131d8603289b6ae485bb0d8
|
F src/vdbe.h d64fe28f20a67feffb820c20bb1bc6f8d365c6b410d66e7eb9a7192e839316b3
|
||||||
F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f
|
F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f
|
||||||
F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4
|
F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4
|
||||||
F src/vdbeaux.c 01631f90d84751911f328dd78ae13e1e811c35d4d99864673eef4bba9dccc349
|
F src/vdbeaux.c b230f12642040c5ede19f092d9ad7510f75add84888e66a00108948dec574fd2
|
||||||
F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191
|
F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191
|
||||||
F src/vdbemem.c 7b3305bc4a5139f4536ac9b5f61da0f915e49d2e3fdfa87dfdfa9d7aba8bc1e9
|
F src/vdbemem.c 7b3305bc4a5139f4536ac9b5f61da0f915e49d2e3fdfa87dfdfa9d7aba8bc1e9
|
||||||
F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f
|
F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f
|
||||||
@@ -595,11 +595,11 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
|
|||||||
F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f
|
F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f
|
||||||
F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a
|
F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a
|
||||||
F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66
|
F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66
|
||||||
F src/where.c bf0715a80776f341335b112f529dd29d7f31698fbeeb0bac6bceef99f3c92ba7
|
F src/where.c 981412c27abb9378d3024eae6f3040abd3c16db722f5ef8a7d613141ea2aea78
|
||||||
F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88
|
F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88
|
||||||
F src/wherecode.c daade831371821738bc598b5bae05f47985014f208372391c2715c881c9e6d9c
|
F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811
|
||||||
F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442
|
F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442
|
||||||
F src/window.c ea81ecd031ed2cbc14b7db6fd7f4bee2471b894feae5fea0547b15b1e2dd8fb2
|
F src/window.c f4a9ac8396395a9e281e182dd32fc9b3b19f6762a9eef468137369def3ad9a2c
|
||||||
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
||||||
F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
|
F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
|
||||||
F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
|
F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
|
||||||
@@ -1666,7 +1666,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2
|
|||||||
F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
|
F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
|
||||||
F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
|
F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
|
||||||
F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc
|
F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc
|
||||||
F test/window1.test a96a80bd6c5cc0e4bacbd3948223604e4b2745e37909a70d09c05f5ef6f84266
|
F test/window1.test 148552f6331a1b9fbdc034ee1b46233cf52b58b98936ca2e74c9d5eba653b2ba
|
||||||
F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143
|
F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143
|
||||||
F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e
|
F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e
|
||||||
F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823
|
F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823
|
||||||
@@ -1795,7 +1795,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P da53f3d3ff26cc32d3a5ac788b6785baa3d1688e50d9354025a3130dc7e71a38 891f1f72187f0f9ec0d24fda98cc08be3ae3c3ff8b27c4e409ee7135c3106398
|
P 0f1b9ff9e1e6f13e03045fcb7d0907227085054f9eb0b0b8471fb26b0094b13a f856676c8438dbf52d299e78f6dd6148d929755dc05cdcabafd17d9a86439435
|
||||||
R c1c92a3b03da98f440390a0e9ced2b83
|
R 3d5a1ea78142c180da83ac42547c771a
|
||||||
U drh
|
U drh
|
||||||
Z 16f502f29d74bfe53bffbbe615dec4cd
|
Z 030784c6ac18d793a85199580bd539ae
|
||||||
|
@@ -1 +1 @@
|
|||||||
0f1b9ff9e1e6f13e03045fcb7d0907227085054f9eb0b0b8471fb26b0094b13a
|
9fb646f29c05bca5f677a2c7c4f45c36bfe0a0c6a88cb7968b4a0459bdd63bb2
|
@@ -1156,7 +1156,7 @@ static void analyzeOneTable(
|
|||||||
addrNextRow = sqlite3VdbeCurrentAddr(v);
|
addrNextRow = sqlite3VdbeCurrentAddr(v);
|
||||||
|
|
||||||
if( nColTest>0 ){
|
if( nColTest>0 ){
|
||||||
int endDistinctTest = sqlite3VdbeMakeLabel(v);
|
int endDistinctTest = sqlite3VdbeMakeLabel(pParse);
|
||||||
int *aGotoChng; /* Array of jump instruction addresses */
|
int *aGotoChng; /* Array of jump instruction addresses */
|
||||||
aGotoChng = sqlite3DbMallocRawNN(db, sizeof(int)*nColTest);
|
aGotoChng = sqlite3DbMallocRawNN(db, sizeof(int)*nColTest);
|
||||||
if( aGotoChng==0 ) continue;
|
if( aGotoChng==0 ) continue;
|
||||||
|
@@ -517,7 +517,7 @@ void sqlite3DeleteFrom(
|
|||||||
/* If this DELETE cannot use the ONEPASS strategy, this is the
|
/* If this DELETE cannot use the ONEPASS strategy, this is the
|
||||||
** end of the WHERE loop */
|
** end of the WHERE loop */
|
||||||
if( eOnePass!=ONEPASS_OFF ){
|
if( eOnePass!=ONEPASS_OFF ){
|
||||||
addrBypass = sqlite3VdbeMakeLabel(v);
|
addrBypass = sqlite3VdbeMakeLabel(pParse);
|
||||||
}else{
|
}else{
|
||||||
sqlite3WhereEnd(pWInfo);
|
sqlite3WhereEnd(pWInfo);
|
||||||
}
|
}
|
||||||
@@ -706,7 +706,7 @@ void sqlite3GenerateRowDelete(
|
|||||||
/* Seek cursor iCur to the row to delete. If this row no longer exists
|
/* Seek cursor iCur to the row to delete. If this row no longer exists
|
||||||
** (this can happen if a trigger program has already deleted it), do
|
** (this can happen if a trigger program has already deleted it), do
|
||||||
** not attempt to delete it or fire any DELETE triggers. */
|
** not attempt to delete it or fire any DELETE triggers. */
|
||||||
iLabel = sqlite3VdbeMakeLabel(v);
|
iLabel = sqlite3VdbeMakeLabel(pParse);
|
||||||
opSeek = HasRowid(pTab) ? OP_NotExists : OP_NotFound;
|
opSeek = HasRowid(pTab) ? OP_NotExists : OP_NotFound;
|
||||||
if( eMode==ONEPASS_OFF ){
|
if( eMode==ONEPASS_OFF ){
|
||||||
sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk);
|
sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk);
|
||||||
@@ -912,7 +912,7 @@ int sqlite3GenerateIndexKey(
|
|||||||
|
|
||||||
if( piPartIdxLabel ){
|
if( piPartIdxLabel ){
|
||||||
if( pIdx->pPartIdxWhere ){
|
if( pIdx->pPartIdxWhere ){
|
||||||
*piPartIdxLabel = sqlite3VdbeMakeLabel(v);
|
*piPartIdxLabel = sqlite3VdbeMakeLabel(pParse);
|
||||||
pParse->iSelfTab = iDataCur + 1;
|
pParse->iSelfTab = iDataCur + 1;
|
||||||
sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel,
|
sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel,
|
||||||
SQLITE_JUMPIFNULL);
|
SQLITE_JUMPIFNULL);
|
||||||
|
26
src/expr.c
26
src/expr.c
@@ -553,7 +553,7 @@ static void codeVectorCompare(
|
|||||||
int regLeft = 0;
|
int regLeft = 0;
|
||||||
int regRight = 0;
|
int regRight = 0;
|
||||||
u8 opx = op;
|
u8 opx = op;
|
||||||
int addrDone = sqlite3VdbeMakeLabel(v);
|
int addrDone = sqlite3VdbeMakeLabel(pParse);
|
||||||
|
|
||||||
if( nLeft!=sqlite3ExprVectorSize(pRight) ){
|
if( nLeft!=sqlite3ExprVectorSize(pRight) ){
|
||||||
sqlite3ErrorMsg(pParse, "row value misused");
|
sqlite3ErrorMsg(pParse, "row value misused");
|
||||||
@@ -3093,7 +3093,7 @@ static void sqlite3ExprCodeIN(
|
|||||||
if( eType==IN_INDEX_NOOP ){
|
if( eType==IN_INDEX_NOOP ){
|
||||||
ExprList *pList = pExpr->x.pList;
|
ExprList *pList = pExpr->x.pList;
|
||||||
CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft);
|
CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft);
|
||||||
int labelOk = sqlite3VdbeMakeLabel(v);
|
int labelOk = sqlite3VdbeMakeLabel(pParse);
|
||||||
int r2, regToFree;
|
int r2, regToFree;
|
||||||
int regCkNull = 0;
|
int regCkNull = 0;
|
||||||
int ii;
|
int ii;
|
||||||
@@ -3137,7 +3137,7 @@ static void sqlite3ExprCodeIN(
|
|||||||
if( destIfNull==destIfFalse ){
|
if( destIfNull==destIfFalse ){
|
||||||
destStep2 = destIfFalse;
|
destStep2 = destIfFalse;
|
||||||
}else{
|
}else{
|
||||||
destStep2 = destStep6 = sqlite3VdbeMakeLabel(v);
|
destStep2 = destStep6 = sqlite3VdbeMakeLabel(pParse);
|
||||||
}
|
}
|
||||||
for(i=0; i<nVector; i++){
|
for(i=0; i<nVector; i++){
|
||||||
Expr *p = sqlite3VectorFieldSubexpr(pExpr->pLeft, i);
|
Expr *p = sqlite3VectorFieldSubexpr(pExpr->pLeft, i);
|
||||||
@@ -3195,7 +3195,7 @@ static void sqlite3ExprCodeIN(
|
|||||||
addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, destIfFalse);
|
addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, destIfFalse);
|
||||||
VdbeCoverage(v);
|
VdbeCoverage(v);
|
||||||
if( nVector>1 ){
|
if( nVector>1 ){
|
||||||
destNotNull = sqlite3VdbeMakeLabel(v);
|
destNotNull = sqlite3VdbeMakeLabel(pParse);
|
||||||
}else{
|
}else{
|
||||||
/* For nVector==1, combine steps 6 and 7 by immediately returning
|
/* For nVector==1, combine steps 6 and 7 by immediately returning
|
||||||
** FALSE if the first comparison is not NULL */
|
** FALSE if the first comparison is not NULL */
|
||||||
@@ -3760,7 +3760,7 @@ expr_code_doover:
|
|||||||
** arguments past the first non-NULL argument.
|
** arguments past the first non-NULL argument.
|
||||||
*/
|
*/
|
||||||
if( pDef->funcFlags & SQLITE_FUNC_COALESCE ){
|
if( pDef->funcFlags & SQLITE_FUNC_COALESCE ){
|
||||||
int endCoalesce = sqlite3VdbeMakeLabel(v);
|
int endCoalesce = sqlite3VdbeMakeLabel(pParse);
|
||||||
assert( nFarg>=2 );
|
assert( nFarg>=2 );
|
||||||
sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target);
|
sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target);
|
||||||
for(i=1; i<nFarg; i++){
|
for(i=1; i<nFarg; i++){
|
||||||
@@ -3908,8 +3908,8 @@ expr_code_doover:
|
|||||||
return pExpr->pLeft->iTable + pExpr->iColumn;
|
return pExpr->pLeft->iTable + pExpr->iColumn;
|
||||||
}
|
}
|
||||||
case TK_IN: {
|
case TK_IN: {
|
||||||
int destIfFalse = sqlite3VdbeMakeLabel(v);
|
int destIfFalse = sqlite3VdbeMakeLabel(pParse);
|
||||||
int destIfNull = sqlite3VdbeMakeLabel(v);
|
int destIfNull = sqlite3VdbeMakeLabel(pParse);
|
||||||
sqlite3VdbeAddOp2(v, OP_Null, 0, target);
|
sqlite3VdbeAddOp2(v, OP_Null, 0, target);
|
||||||
sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull);
|
sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull);
|
||||||
sqlite3VdbeAddOp2(v, OP_Integer, 1, target);
|
sqlite3VdbeAddOp2(v, OP_Integer, 1, target);
|
||||||
@@ -4049,7 +4049,7 @@ expr_code_doover:
|
|||||||
pEList = pExpr->x.pList;
|
pEList = pExpr->x.pList;
|
||||||
aListelem = pEList->a;
|
aListelem = pEList->a;
|
||||||
nExpr = pEList->nExpr;
|
nExpr = pEList->nExpr;
|
||||||
endLabel = sqlite3VdbeMakeLabel(v);
|
endLabel = sqlite3VdbeMakeLabel(pParse);
|
||||||
if( (pX = pExpr->pLeft)!=0 ){
|
if( (pX = pExpr->pLeft)!=0 ){
|
||||||
tempX = *pX;
|
tempX = *pX;
|
||||||
testcase( pX->op==TK_COLUMN );
|
testcase( pX->op==TK_COLUMN );
|
||||||
@@ -4072,7 +4072,7 @@ expr_code_doover:
|
|||||||
}else{
|
}else{
|
||||||
pTest = aListelem[i].pExpr;
|
pTest = aListelem[i].pExpr;
|
||||||
}
|
}
|
||||||
nextCase = sqlite3VdbeMakeLabel(v);
|
nextCase = sqlite3VdbeMakeLabel(pParse);
|
||||||
testcase( pTest->op==TK_COLUMN );
|
testcase( pTest->op==TK_COLUMN );
|
||||||
sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL);
|
sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL);
|
||||||
testcase( aListelem[i+1].pExpr->op==TK_COLUMN );
|
testcase( aListelem[i+1].pExpr->op==TK_COLUMN );
|
||||||
@@ -4441,7 +4441,7 @@ void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
|
|||||||
op = pExpr->op;
|
op = pExpr->op;
|
||||||
switch( op ){
|
switch( op ){
|
||||||
case TK_AND: {
|
case TK_AND: {
|
||||||
int d2 = sqlite3VdbeMakeLabel(v);
|
int d2 = sqlite3VdbeMakeLabel(pParse);
|
||||||
testcase( jumpIfNull==0 );
|
testcase( jumpIfNull==0 );
|
||||||
sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2,jumpIfNull^SQLITE_JUMPIFNULL);
|
sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2,jumpIfNull^SQLITE_JUMPIFNULL);
|
||||||
sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
|
sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
|
||||||
@@ -4527,7 +4527,7 @@ void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
|
|||||||
}
|
}
|
||||||
#ifndef SQLITE_OMIT_SUBQUERY
|
#ifndef SQLITE_OMIT_SUBQUERY
|
||||||
case TK_IN: {
|
case TK_IN: {
|
||||||
int destIfFalse = sqlite3VdbeMakeLabel(v);
|
int destIfFalse = sqlite3VdbeMakeLabel(pParse);
|
||||||
int destIfNull = jumpIfNull ? dest : destIfFalse;
|
int destIfNull = jumpIfNull ? dest : destIfFalse;
|
||||||
sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull);
|
sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull);
|
||||||
sqlite3VdbeGoto(v, dest);
|
sqlite3VdbeGoto(v, dest);
|
||||||
@@ -4614,7 +4614,7 @@ void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TK_OR: {
|
case TK_OR: {
|
||||||
int d2 = sqlite3VdbeMakeLabel(v);
|
int d2 = sqlite3VdbeMakeLabel(pParse);
|
||||||
testcase( jumpIfNull==0 );
|
testcase( jumpIfNull==0 );
|
||||||
sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL);
|
sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL);
|
||||||
sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
|
sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
|
||||||
@@ -4698,7 +4698,7 @@ void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
|
|||||||
if( jumpIfNull ){
|
if( jumpIfNull ){
|
||||||
sqlite3ExprCodeIN(pParse, pExpr, dest, dest);
|
sqlite3ExprCodeIN(pParse, pExpr, dest, dest);
|
||||||
}else{
|
}else{
|
||||||
int destIfNull = sqlite3VdbeMakeLabel(v);
|
int destIfNull = sqlite3VdbeMakeLabel(pParse);
|
||||||
sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull);
|
sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull);
|
||||||
sqlite3VdbeResolveLabel(v, destIfNull);
|
sqlite3VdbeResolveLabel(v, destIfNull);
|
||||||
}
|
}
|
||||||
|
@@ -329,7 +329,7 @@ static void fkLookupParent(
|
|||||||
int i; /* Iterator variable */
|
int i; /* Iterator variable */
|
||||||
Vdbe *v = sqlite3GetVdbe(pParse); /* Vdbe to add code to */
|
Vdbe *v = sqlite3GetVdbe(pParse); /* Vdbe to add code to */
|
||||||
int iCur = pParse->nTab - 1; /* Cursor number to use */
|
int iCur = pParse->nTab - 1; /* Cursor number to use */
|
||||||
int iOk = sqlite3VdbeMakeLabel(v); /* jump here if parent key found */
|
int iOk = sqlite3VdbeMakeLabel(pParse); /* jump here if parent key found */
|
||||||
|
|
||||||
sqlite3VdbeVerifyAbortable(v,
|
sqlite3VdbeVerifyAbortable(v,
|
||||||
(!pFKey->isDeferred
|
(!pFKey->isDeferred
|
||||||
@@ -729,7 +729,7 @@ void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTab){
|
|||||||
if( p->isDeferred || (db->flags & SQLITE_DeferFKs) ) break;
|
if( p->isDeferred || (db->flags & SQLITE_DeferFKs) ) break;
|
||||||
}
|
}
|
||||||
if( !p ) return;
|
if( !p ) return;
|
||||||
iSkip = sqlite3VdbeMakeLabel(v);
|
iSkip = sqlite3VdbeMakeLabel(pParse);
|
||||||
sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip); VdbeCoverage(v);
|
sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip); VdbeCoverage(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
10
src/insert.c
10
src/insert.c
@@ -866,7 +866,7 @@ void sqlite3Insert(
|
|||||||
|
|
||||||
/* Run the BEFORE and INSTEAD OF triggers, if there are any
|
/* Run the BEFORE and INSTEAD OF triggers, if there are any
|
||||||
*/
|
*/
|
||||||
endOfLoop = sqlite3VdbeMakeLabel(v);
|
endOfLoop = sqlite3VdbeMakeLabel(pParse);
|
||||||
if( tmask & TRIGGER_BEFORE ){
|
if( tmask & TRIGGER_BEFORE ){
|
||||||
int regCols = sqlite3GetTempRange(pParse, pTab->nCol+1);
|
int regCols = sqlite3GetTempRange(pParse, pTab->nCol+1);
|
||||||
|
|
||||||
@@ -1356,7 +1356,7 @@ void sqlite3GenerateConstraintChecks(
|
|||||||
switch( onError ){
|
switch( onError ){
|
||||||
case OE_Replace: {
|
case OE_Replace: {
|
||||||
assert( onError==OE_Replace );
|
assert( onError==OE_Replace );
|
||||||
addr1 = sqlite3VdbeMakeLabel(v);
|
addr1 = sqlite3VdbeMakeLabel(pParse);
|
||||||
sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1);
|
sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1);
|
||||||
VdbeCoverage(v);
|
VdbeCoverage(v);
|
||||||
sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i);
|
sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i);
|
||||||
@@ -1407,7 +1407,7 @@ void sqlite3GenerateConstraintChecks(
|
|||||||
** updated so there is no point it verifying the check constraint */
|
** updated so there is no point it verifying the check constraint */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
allOk = sqlite3VdbeMakeLabel(v);
|
allOk = sqlite3VdbeMakeLabel(pParse);
|
||||||
sqlite3VdbeVerifyAbortable(v, onError);
|
sqlite3VdbeVerifyAbortable(v, onError);
|
||||||
sqlite3ExprIfTrue(pParse, pExpr, allOk, SQLITE_JUMPIFNULL);
|
sqlite3ExprIfTrue(pParse, pExpr, allOk, SQLITE_JUMPIFNULL);
|
||||||
if( onError==OE_Ignore ){
|
if( onError==OE_Ignore ){
|
||||||
@@ -1474,7 +1474,7 @@ void sqlite3GenerateConstraintChecks(
|
|||||||
** exist in the table.
|
** exist in the table.
|
||||||
*/
|
*/
|
||||||
if( pkChng && pPk==0 ){
|
if( pkChng && pPk==0 ){
|
||||||
int addrRowidOk = sqlite3VdbeMakeLabel(v);
|
int addrRowidOk = sqlite3VdbeMakeLabel(pParse);
|
||||||
|
|
||||||
/* Figure out what action to take in case of a rowid collision */
|
/* Figure out what action to take in case of a rowid collision */
|
||||||
onError = pTab->keyConf;
|
onError = pTab->keyConf;
|
||||||
@@ -1624,7 +1624,7 @@ void sqlite3GenerateConstraintChecks(
|
|||||||
VdbeComment((v, "Skip upsert subroutine"));
|
VdbeComment((v, "Skip upsert subroutine"));
|
||||||
sqlite3VdbeJumpHere(v, upsertJump);
|
sqlite3VdbeJumpHere(v, upsertJump);
|
||||||
}else{
|
}else{
|
||||||
addrUniqueOk = sqlite3VdbeMakeLabel(v);
|
addrUniqueOk = sqlite3VdbeMakeLabel(pParse);
|
||||||
}
|
}
|
||||||
if( bAffinityDone==0 && (pUpIdx==0 || pUpIdx==pIdx) ){
|
if( bAffinityDone==0 && (pUpIdx==0 || pUpIdx==pIdx) ){
|
||||||
sqlite3TableAffinity(v, pTab, regNewData+1);
|
sqlite3TableAffinity(v, pTab, regNewData+1);
|
||||||
|
10
src/pragma.c
10
src/pragma.c
@@ -1376,7 +1376,7 @@ void sqlite3Pragma(
|
|||||||
x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols);
|
x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols);
|
||||||
assert( x==0 );
|
assert( x==0 );
|
||||||
}
|
}
|
||||||
addrOk = sqlite3VdbeMakeLabel(v);
|
addrOk = sqlite3VdbeMakeLabel(pParse);
|
||||||
|
|
||||||
/* Generate code to read the child key values into registers
|
/* Generate code to read the child key values into registers
|
||||||
** regRow..regRow+n. If any of the child key values are NULL, this
|
** regRow..regRow+n. If any of the child key values are NULL, this
|
||||||
@@ -1596,8 +1596,8 @@ void sqlite3Pragma(
|
|||||||
if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){
|
if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){
|
||||||
ExprList *pCheck = sqlite3ExprListDup(db, pTab->pCheck, 0);
|
ExprList *pCheck = sqlite3ExprListDup(db, pTab->pCheck, 0);
|
||||||
if( db->mallocFailed==0 ){
|
if( db->mallocFailed==0 ){
|
||||||
int addrCkFault = sqlite3VdbeMakeLabel(v);
|
int addrCkFault = sqlite3VdbeMakeLabel(pParse);
|
||||||
int addrCkOk = sqlite3VdbeMakeLabel(v);
|
int addrCkOk = sqlite3VdbeMakeLabel(pParse);
|
||||||
char *zErr;
|
char *zErr;
|
||||||
int k;
|
int k;
|
||||||
pParse->iSelfTab = iDataCur + 1;
|
pParse->iSelfTab = iDataCur + 1;
|
||||||
@@ -1620,7 +1620,7 @@ void sqlite3Pragma(
|
|||||||
/* Validate index entries for the current row */
|
/* Validate index entries for the current row */
|
||||||
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
|
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
|
||||||
int jmp2, jmp3, jmp4, jmp5;
|
int jmp2, jmp3, jmp4, jmp5;
|
||||||
int ckUniq = sqlite3VdbeMakeLabel(v);
|
int ckUniq = sqlite3VdbeMakeLabel(pParse);
|
||||||
if( pPk==pIdx ) continue;
|
if( pPk==pIdx ) continue;
|
||||||
r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3,
|
r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3,
|
||||||
pPrior, r1);
|
pPrior, r1);
|
||||||
@@ -1641,7 +1641,7 @@ void sqlite3Pragma(
|
|||||||
** current key. The entry is unique if (1) any column is NULL
|
** current key. The entry is unique if (1) any column is NULL
|
||||||
** or (2) the next entry has a different key */
|
** or (2) the next entry has a different key */
|
||||||
if( IsUniqueIndex(pIdx) ){
|
if( IsUniqueIndex(pIdx) ){
|
||||||
int uniqOk = sqlite3VdbeMakeLabel(v);
|
int uniqOk = sqlite3VdbeMakeLabel(pParse);
|
||||||
int jmp6;
|
int jmp6;
|
||||||
int kk;
|
int kk;
|
||||||
for(kk=0; kk<pIdx->nKeyCol; kk++){
|
for(kk=0; kk<pIdx->nKeyCol; kk++){
|
||||||
|
40
src/select.c
40
src/select.c
@@ -631,7 +631,7 @@ static void pushOntoSorter(
|
|||||||
}
|
}
|
||||||
assert( pSelect->iOffset==0 || pSelect->iLimit!=0 );
|
assert( pSelect->iOffset==0 || pSelect->iLimit!=0 );
|
||||||
iLimit = pSelect->iOffset ? pSelect->iOffset+1 : pSelect->iLimit;
|
iLimit = pSelect->iOffset ? pSelect->iOffset+1 : pSelect->iLimit;
|
||||||
pSort->labelDone = sqlite3VdbeMakeLabel(v);
|
pSort->labelDone = sqlite3VdbeMakeLabel(pParse);
|
||||||
sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, regOrigData,
|
sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, regOrigData,
|
||||||
SQLITE_ECEL_DUP | (regOrigData? SQLITE_ECEL_REF : 0));
|
SQLITE_ECEL_DUP | (regOrigData? SQLITE_ECEL_REF : 0));
|
||||||
if( bSeq ){
|
if( bSeq ){
|
||||||
@@ -670,7 +670,7 @@ static void pushOntoSorter(
|
|||||||
pKI->nAllField-pKI->nKeyField-1);
|
pKI->nAllField-pKI->nKeyField-1);
|
||||||
addrJmp = sqlite3VdbeCurrentAddr(v);
|
addrJmp = sqlite3VdbeCurrentAddr(v);
|
||||||
sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v);
|
sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v);
|
||||||
pSort->labelBkOut = sqlite3VdbeMakeLabel(v);
|
pSort->labelBkOut = sqlite3VdbeMakeLabel(pParse);
|
||||||
pSort->regReturn = ++pParse->nMem;
|
pSort->regReturn = ++pParse->nMem;
|
||||||
sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut);
|
sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut);
|
||||||
sqlite3VdbeAddOp1(v, OP_ResetSorter, pSort->iECursor);
|
sqlite3VdbeAddOp1(v, OP_ResetSorter, pSort->iECursor);
|
||||||
@@ -1417,7 +1417,7 @@ static void generateSortTail(
|
|||||||
){
|
){
|
||||||
Vdbe *v = pParse->pVdbe; /* The prepared statement */
|
Vdbe *v = pParse->pVdbe; /* The prepared statement */
|
||||||
int addrBreak = pSort->labelDone; /* Jump here to exit loop */
|
int addrBreak = pSort->labelDone; /* Jump here to exit loop */
|
||||||
int addrContinue = sqlite3VdbeMakeLabel(v); /* Jump here for next cycle */
|
int addrContinue = sqlite3VdbeMakeLabel(pParse);/* Jump here for next cycle */
|
||||||
int addr; /* Top of output loop. Jump for Next. */
|
int addr; /* Top of output loop. Jump for Next. */
|
||||||
int addrOnce = 0;
|
int addrOnce = 0;
|
||||||
int iTab;
|
int iTab;
|
||||||
@@ -2329,7 +2329,7 @@ static void generateWithRecursiveQuery(
|
|||||||
if( sqlite3AuthCheck(pParse, SQLITE_RECURSIVE, 0, 0, 0) ) return;
|
if( sqlite3AuthCheck(pParse, SQLITE_RECURSIVE, 0, 0, 0) ) return;
|
||||||
|
|
||||||
/* Process the LIMIT and OFFSET clauses, if they exist */
|
/* Process the LIMIT and OFFSET clauses, if they exist */
|
||||||
addrBreak = sqlite3VdbeMakeLabel(v);
|
addrBreak = sqlite3VdbeMakeLabel(pParse);
|
||||||
p->nSelectRow = 320; /* 4 billion rows */
|
p->nSelectRow = 320; /* 4 billion rows */
|
||||||
computeLimitRegisters(pParse, p, addrBreak);
|
computeLimitRegisters(pParse, p, addrBreak);
|
||||||
pLimit = p->pLimit;
|
pLimit = p->pLimit;
|
||||||
@@ -2399,7 +2399,7 @@ static void generateWithRecursiveQuery(
|
|||||||
sqlite3VdbeAddOp1(v, OP_Delete, iQueue);
|
sqlite3VdbeAddOp1(v, OP_Delete, iQueue);
|
||||||
|
|
||||||
/* Output the single row in Current */
|
/* Output the single row in Current */
|
||||||
addrCont = sqlite3VdbeMakeLabel(v);
|
addrCont = sqlite3VdbeMakeLabel(pParse);
|
||||||
codeOffset(v, regOffset, addrCont);
|
codeOffset(v, regOffset, addrCont);
|
||||||
selectInnerLoop(pParse, p, iCurrent,
|
selectInnerLoop(pParse, p, iCurrent,
|
||||||
0, 0, pDest, addrCont, addrBreak);
|
0, 0, pDest, addrCont, addrBreak);
|
||||||
@@ -2707,8 +2707,8 @@ static int multiSelect(
|
|||||||
if( dest.eDest!=priorOp ){
|
if( dest.eDest!=priorOp ){
|
||||||
int iCont, iBreak, iStart;
|
int iCont, iBreak, iStart;
|
||||||
assert( p->pEList );
|
assert( p->pEList );
|
||||||
iBreak = sqlite3VdbeMakeLabel(v);
|
iBreak = sqlite3VdbeMakeLabel(pParse);
|
||||||
iCont = sqlite3VdbeMakeLabel(v);
|
iCont = sqlite3VdbeMakeLabel(pParse);
|
||||||
computeLimitRegisters(pParse, p, iBreak);
|
computeLimitRegisters(pParse, p, iBreak);
|
||||||
sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v);
|
sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v);
|
||||||
iStart = sqlite3VdbeCurrentAddr(v);
|
iStart = sqlite3VdbeCurrentAddr(v);
|
||||||
@@ -2776,8 +2776,8 @@ static int multiSelect(
|
|||||||
** tables.
|
** tables.
|
||||||
*/
|
*/
|
||||||
assert( p->pEList );
|
assert( p->pEList );
|
||||||
iBreak = sqlite3VdbeMakeLabel(v);
|
iBreak = sqlite3VdbeMakeLabel(pParse);
|
||||||
iCont = sqlite3VdbeMakeLabel(v);
|
iCont = sqlite3VdbeMakeLabel(pParse);
|
||||||
computeLimitRegisters(pParse, p, iBreak);
|
computeLimitRegisters(pParse, p, iBreak);
|
||||||
sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v);
|
sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v);
|
||||||
r1 = sqlite3GetTempReg(pParse);
|
r1 = sqlite3GetTempReg(pParse);
|
||||||
@@ -2907,7 +2907,7 @@ static int generateOutputSubroutine(
|
|||||||
int addr;
|
int addr;
|
||||||
|
|
||||||
addr = sqlite3VdbeCurrentAddr(v);
|
addr = sqlite3VdbeCurrentAddr(v);
|
||||||
iContinue = sqlite3VdbeMakeLabel(v);
|
iContinue = sqlite3VdbeMakeLabel(pParse);
|
||||||
|
|
||||||
/* Suppress duplicates for UNION, EXCEPT, and INTERSECT
|
/* Suppress duplicates for UNION, EXCEPT, and INTERSECT
|
||||||
*/
|
*/
|
||||||
@@ -3144,8 +3144,8 @@ static int multiSelectOrderBy(
|
|||||||
db = pParse->db;
|
db = pParse->db;
|
||||||
v = pParse->pVdbe;
|
v = pParse->pVdbe;
|
||||||
assert( v!=0 ); /* Already thrown the error if VDBE alloc failed */
|
assert( v!=0 ); /* Already thrown the error if VDBE alloc failed */
|
||||||
labelEnd = sqlite3VdbeMakeLabel(v);
|
labelEnd = sqlite3VdbeMakeLabel(pParse);
|
||||||
labelCmpr = sqlite3VdbeMakeLabel(v);
|
labelCmpr = sqlite3VdbeMakeLabel(pParse);
|
||||||
|
|
||||||
|
|
||||||
/* Patch up the ORDER BY clause
|
/* Patch up the ORDER BY clause
|
||||||
@@ -5330,7 +5330,7 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){
|
|||||||
regAgg = 0;
|
regAgg = 0;
|
||||||
}
|
}
|
||||||
if( pF->iDistinct>=0 ){
|
if( pF->iDistinct>=0 ){
|
||||||
addrNext = sqlite3VdbeMakeLabel(v);
|
addrNext = sqlite3VdbeMakeLabel(pParse);
|
||||||
testcase( nArg==0 ); /* Error condition */
|
testcase( nArg==0 ); /* Error condition */
|
||||||
testcase( nArg>1 ); /* Also an error */
|
testcase( nArg>1 ); /* Also an error */
|
||||||
codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg);
|
codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg);
|
||||||
@@ -6038,7 +6038,7 @@ int sqlite3Select(
|
|||||||
|
|
||||||
/* Set the limiter.
|
/* Set the limiter.
|
||||||
*/
|
*/
|
||||||
iEnd = sqlite3VdbeMakeLabel(v);
|
iEnd = sqlite3VdbeMakeLabel(pParse);
|
||||||
if( (p->selFlags & SF_FixedLimit)==0 ){
|
if( (p->selFlags & SF_FixedLimit)==0 ){
|
||||||
p->nSelectRow = 320; /* 4 billion rows */
|
p->nSelectRow = 320; /* 4 billion rows */
|
||||||
}
|
}
|
||||||
@@ -6105,9 +6105,9 @@ int sqlite3Select(
|
|||||||
assert( p->pEList==pEList );
|
assert( p->pEList==pEList );
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
if( pWin ){
|
if( pWin ){
|
||||||
int addrGosub = sqlite3VdbeMakeLabel(v);
|
int addrGosub = sqlite3VdbeMakeLabel(pParse);
|
||||||
int iCont = sqlite3VdbeMakeLabel(v);
|
int iCont = sqlite3VdbeMakeLabel(pParse);
|
||||||
int iBreak = sqlite3VdbeMakeLabel(v);
|
int iBreak = sqlite3VdbeMakeLabel(pParse);
|
||||||
int regGosub = ++pParse->nMem;
|
int regGosub = ++pParse->nMem;
|
||||||
|
|
||||||
sqlite3WindowCodeStep(pParse, p, pWInfo, regGosub, addrGosub);
|
sqlite3WindowCodeStep(pParse, p, pWInfo, regGosub, addrGosub);
|
||||||
@@ -6182,7 +6182,7 @@ int sqlite3Select(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Create a label to jump to when we want to abort the query */
|
/* Create a label to jump to when we want to abort the query */
|
||||||
addrEnd = sqlite3VdbeMakeLabel(v);
|
addrEnd = sqlite3VdbeMakeLabel(pParse);
|
||||||
|
|
||||||
/* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in
|
/* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in
|
||||||
** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the
|
** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the
|
||||||
@@ -6271,9 +6271,9 @@ int sqlite3Select(
|
|||||||
iUseFlag = ++pParse->nMem;
|
iUseFlag = ++pParse->nMem;
|
||||||
iAbortFlag = ++pParse->nMem;
|
iAbortFlag = ++pParse->nMem;
|
||||||
regOutputRow = ++pParse->nMem;
|
regOutputRow = ++pParse->nMem;
|
||||||
addrOutputRow = sqlite3VdbeMakeLabel(v);
|
addrOutputRow = sqlite3VdbeMakeLabel(pParse);
|
||||||
regReset = ++pParse->nMem;
|
regReset = ++pParse->nMem;
|
||||||
addrReset = sqlite3VdbeMakeLabel(v);
|
addrReset = sqlite3VdbeMakeLabel(pParse);
|
||||||
iAMem = pParse->nMem + 1;
|
iAMem = pParse->nMem + 1;
|
||||||
pParse->nMem += pGroupBy->nExpr;
|
pParse->nMem += pGroupBy->nExpr;
|
||||||
iBMem = pParse->nMem + 1;
|
iBMem = pParse->nMem + 1;
|
||||||
|
@@ -3073,7 +3073,8 @@ struct Parse {
|
|||||||
int szOpAlloc; /* Bytes of memory space allocated for Vdbe.aOp[] */
|
int szOpAlloc; /* Bytes of memory space allocated for Vdbe.aOp[] */
|
||||||
int iSelfTab; /* Table associated with an index on expr, or negative
|
int iSelfTab; /* Table associated with an index on expr, or negative
|
||||||
** of the base register during check-constraint eval */
|
** of the base register during check-constraint eval */
|
||||||
int nLabel; /* Number of labels used */
|
int nLabel; /* The *negative* of the number of labels used */
|
||||||
|
int nLabelAlloc; /* Number of slots in aLabel */
|
||||||
int *aLabel; /* Space to hold the labels */
|
int *aLabel; /* Space to hold the labels */
|
||||||
ExprList *pConstExpr;/* Constant expressions */
|
ExprList *pConstExpr;/* Constant expressions */
|
||||||
Token constraintName;/* Name of the constraint currently being parsed */
|
Token constraintName;/* Name of the constraint currently being parsed */
|
||||||
|
@@ -944,7 +944,7 @@ static TriggerPrg *codeRowTrigger(
|
|||||||
if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen)
|
if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen)
|
||||||
&& db->mallocFailed==0
|
&& db->mallocFailed==0
|
||||||
){
|
){
|
||||||
iEndTrigger = sqlite3VdbeMakeLabel(v);
|
iEndTrigger = sqlite3VdbeMakeLabel(pSubParse);
|
||||||
sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL);
|
sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL);
|
||||||
}
|
}
|
||||||
sqlite3ExprDelete(db, pWhen);
|
sqlite3ExprDelete(db, pWhen);
|
||||||
|
@@ -441,7 +441,7 @@ void sqlite3Update(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Jump to labelBreak to abandon further processing of this UPDATE */
|
/* Jump to labelBreak to abandon further processing of this UPDATE */
|
||||||
labelContinue = labelBreak = sqlite3VdbeMakeLabel(v);
|
labelContinue = labelBreak = sqlite3VdbeMakeLabel(pParse);
|
||||||
|
|
||||||
/* Not an UPSERT. Normal processing. Begin by
|
/* Not an UPSERT. Normal processing. Begin by
|
||||||
** initialize the count of updated rows */
|
** initialize the count of updated rows */
|
||||||
@@ -576,13 +576,13 @@ void sqlite3Update(
|
|||||||
VdbeCoverage(v);
|
VdbeCoverage(v);
|
||||||
}
|
}
|
||||||
if( eOnePass!=ONEPASS_SINGLE ){
|
if( eOnePass!=ONEPASS_SINGLE ){
|
||||||
labelContinue = sqlite3VdbeMakeLabel(v);
|
labelContinue = sqlite3VdbeMakeLabel(pParse);
|
||||||
}
|
}
|
||||||
sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak);
|
sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak);
|
||||||
VdbeCoverageIf(v, pPk==0);
|
VdbeCoverageIf(v, pPk==0);
|
||||||
VdbeCoverageIf(v, pPk!=0);
|
VdbeCoverageIf(v, pPk!=0);
|
||||||
}else if( pPk ){
|
}else if( pPk ){
|
||||||
labelContinue = sqlite3VdbeMakeLabel(v);
|
labelContinue = sqlite3VdbeMakeLabel(pParse);
|
||||||
sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v);
|
sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v);
|
||||||
addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey);
|
addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey);
|
||||||
sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0);
|
sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0);
|
||||||
|
26
src/vdbe.c
26
src/vdbe.c
@@ -3629,6 +3629,9 @@ case OP_OpenDup: {
|
|||||||
** the main database is read-only. The ephemeral
|
** the main database is read-only. The ephemeral
|
||||||
** table is deleted automatically when the cursor is closed.
|
** table is deleted automatically when the cursor is closed.
|
||||||
**
|
**
|
||||||
|
** If the cursor P1 is already opened on an ephermal table, the table
|
||||||
|
** is cleared (all content is erased).
|
||||||
|
**
|
||||||
** P2 is the number of columns in the ephemeral table.
|
** P2 is the number of columns in the ephemeral table.
|
||||||
** The cursor points to a BTree table if P4==0 and to a BTree index
|
** The cursor points to a BTree table if P4==0 and to a BTree index
|
||||||
** if P4 is not 0. If P4 is not NULL, it points to a KeyInfo structure
|
** if P4 is not 0. If P4 is not NULL, it points to a KeyInfo structure
|
||||||
@@ -3660,12 +3663,19 @@ case OP_OpenEphemeral: {
|
|||||||
SQLITE_OPEN_TRANSIENT_DB;
|
SQLITE_OPEN_TRANSIENT_DB;
|
||||||
assert( pOp->p1>=0 );
|
assert( pOp->p1>=0 );
|
||||||
assert( pOp->p2>=0 );
|
assert( pOp->p2>=0 );
|
||||||
|
pCx = p->apCsr[pOp->p1];
|
||||||
|
if( pCx ){
|
||||||
|
/* If the ephermeral table is already open, erase all existing content
|
||||||
|
** so that the table is empty again, rather than creating a new table. */
|
||||||
|
rc = sqlite3BtreeClearTable(pCx->pBtx, pCx->pgnoRoot, 0);
|
||||||
|
}else{
|
||||||
pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE);
|
pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE);
|
||||||
if( pCx==0 ) goto no_mem;
|
if( pCx==0 ) goto no_mem;
|
||||||
pCx->nullRow = 1;
|
pCx->nullRow = 1;
|
||||||
pCx->isEphemeral = 1;
|
pCx->isEphemeral = 1;
|
||||||
rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx,
|
rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx,
|
||||||
BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags);
|
BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5,
|
||||||
|
vfsFlags);
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0);
|
rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0);
|
||||||
}
|
}
|
||||||
@@ -3676,27 +3686,27 @@ case OP_OpenEphemeral: {
|
|||||||
** automatically created table with root-page 1 (an BLOB_INTKEY table).
|
** automatically created table with root-page 1 (an BLOB_INTKEY table).
|
||||||
*/
|
*/
|
||||||
if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){
|
if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){
|
||||||
int pgno;
|
|
||||||
assert( pOp->p4type==P4_KEYINFO );
|
assert( pOp->p4type==P4_KEYINFO );
|
||||||
rc = sqlite3BtreeCreateTable(pCx->pBtx, &pgno, BTREE_BLOBKEY | pOp->p5);
|
rc = sqlite3BtreeCreateTable(pCx->pBtx, (int*)&pCx->pgnoRoot,
|
||||||
|
BTREE_BLOBKEY | pOp->p5);
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
assert( pgno==MASTER_ROOT+1 );
|
assert( pCx->pgnoRoot==MASTER_ROOT+1 );
|
||||||
assert( pKeyInfo->db==db );
|
assert( pKeyInfo->db==db );
|
||||||
assert( pKeyInfo->enc==ENC(db) );
|
assert( pKeyInfo->enc==ENC(db) );
|
||||||
pCx->pgnoRoot = pgno;
|
rc = sqlite3BtreeCursor(pCx->pBtx, pCx->pgnoRoot, BTREE_WRCSR,
|
||||||
rc = sqlite3BtreeCursor(pCx->pBtx, pgno, BTREE_WRCSR,
|
|
||||||
pKeyInfo, pCx->uc.pCursor);
|
pKeyInfo, pCx->uc.pCursor);
|
||||||
}
|
}
|
||||||
pCx->isTable = 0;
|
pCx->isTable = 0;
|
||||||
}else{
|
}else{
|
||||||
|
pCx->pgnoRoot = MASTER_ROOT;
|
||||||
rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR,
|
rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR,
|
||||||
0, pCx->uc.pCursor);
|
0, pCx->uc.pCursor);
|
||||||
pCx->isTable = 1;
|
pCx->isTable = 1;
|
||||||
pCx->pgnoRoot = MASTER_ROOT;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED);
|
||||||
|
}
|
||||||
if( rc ) goto abort_due_to_error;
|
if( rc ) goto abort_due_to_error;
|
||||||
pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
11
src/vdbe.h
11
src/vdbe.h
@@ -156,12 +156,11 @@ typedef struct VdbeOpList VdbeOpList;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** The following macro converts a relative address in the p2 field
|
** The following macro converts a label returned by sqlite3VdbeMakeLabel()
|
||||||
** of a VdbeOp structure into a negative number so that
|
** into an index into the Parse.aLabel[] array that contains the resolved
|
||||||
** sqlite3VdbeAddOpList() knows that the address is relative. Calling
|
** address of that label.
|
||||||
** the macro again restores the address.
|
|
||||||
*/
|
*/
|
||||||
#define ADDR(X) (-1-(X))
|
#define ADDR(X) (~(X))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** The makefile scans the vdbe.c source file and creates the "opcodes.h"
|
** The makefile scans the vdbe.c source file and creates the "opcodes.h"
|
||||||
@@ -237,7 +236,7 @@ void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type);
|
|||||||
void sqlite3VdbeSetP4KeyInfo(Parse*, Index*);
|
void sqlite3VdbeSetP4KeyInfo(Parse*, Index*);
|
||||||
void sqlite3VdbeUsesBtree(Vdbe*, int);
|
void sqlite3VdbeUsesBtree(Vdbe*, int);
|
||||||
VdbeOp *sqlite3VdbeGetOp(Vdbe*, int);
|
VdbeOp *sqlite3VdbeGetOp(Vdbe*, int);
|
||||||
int sqlite3VdbeMakeLabel(Vdbe*);
|
int sqlite3VdbeMakeLabel(Parse*);
|
||||||
void sqlite3VdbeRunOnlyOnce(Vdbe*);
|
void sqlite3VdbeRunOnlyOnce(Vdbe*);
|
||||||
void sqlite3VdbeReusable(Vdbe*);
|
void sqlite3VdbeReusable(Vdbe*);
|
||||||
void sqlite3VdbeDelete(Vdbe*);
|
void sqlite3VdbeDelete(Vdbe*);
|
||||||
|
@@ -460,21 +460,22 @@ void sqlite3VdbeEndCoroutine(Vdbe *v, int regYield){
|
|||||||
** The VDBE knows that a P2 value is a label because labels are
|
** The VDBE knows that a P2 value is a label because labels are
|
||||||
** always negative and P2 values are suppose to be non-negative.
|
** always negative and P2 values are suppose to be non-negative.
|
||||||
** Hence, a negative P2 value is a label that has yet to be resolved.
|
** Hence, a negative P2 value is a label that has yet to be resolved.
|
||||||
|
** (Later:) This is only true for opcodes that have the OPFLG_JUMP
|
||||||
|
** property.
|
||||||
**
|
**
|
||||||
** Zero is returned if a malloc() fails.
|
** Variable usage notes:
|
||||||
|
**
|
||||||
|
** Parse.aLabel[x] Stores the address that the x-th label resolves
|
||||||
|
** into. For testing (SQLITE_DEBUG), unresolved
|
||||||
|
** labels stores -1, but that is not required.
|
||||||
|
** Parse.nLabelAlloc Number of slots allocated to Parse.aLabel[]
|
||||||
|
** Parse.nLabel The *negative* of the number of labels that have
|
||||||
|
** been issued. The negative is stored because
|
||||||
|
** that gives a performance improvement over storing
|
||||||
|
** the equivalent positive value.
|
||||||
*/
|
*/
|
||||||
int sqlite3VdbeMakeLabel(Vdbe *v){
|
int sqlite3VdbeMakeLabel(Parse *pParse){
|
||||||
Parse *p = v->pParse;
|
return --pParse->nLabel;
|
||||||
int i = p->nLabel++;
|
|
||||||
assert( v->magic==VDBE_MAGIC_INIT );
|
|
||||||
if( (i & (i-1))==0 ){
|
|
||||||
p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel,
|
|
||||||
(i*2+1)*sizeof(p->aLabel[0]));
|
|
||||||
}
|
|
||||||
if( p->aLabel ){
|
|
||||||
p->aLabel[i] = -1;
|
|
||||||
}
|
|
||||||
return ADDR(i);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -482,18 +483,35 @@ int sqlite3VdbeMakeLabel(Vdbe *v){
|
|||||||
** be inserted. The parameter "x" must have been obtained from
|
** be inserted. The parameter "x" must have been obtained from
|
||||||
** a prior call to sqlite3VdbeMakeLabel().
|
** a prior call to sqlite3VdbeMakeLabel().
|
||||||
*/
|
*/
|
||||||
|
static SQLITE_NOINLINE void resizeResolveLabel(Parse *p, Vdbe *v, int j){
|
||||||
|
int nNewSize = 10 - p->nLabel;
|
||||||
|
p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel,
|
||||||
|
nNewSize*sizeof(p->aLabel[0]));
|
||||||
|
if( p->aLabel==0 ){
|
||||||
|
p->nLabelAlloc = 0;
|
||||||
|
}else{
|
||||||
|
#ifdef SQLITE_DEBUG
|
||||||
|
int i;
|
||||||
|
for(i=p->nLabelAlloc; i<nNewSize; i++) p->aLabel[i] = -1;
|
||||||
|
#endif
|
||||||
|
p->nLabelAlloc = nNewSize;
|
||||||
|
p->aLabel[j] = v->nOp;
|
||||||
|
}
|
||||||
|
}
|
||||||
void sqlite3VdbeResolveLabel(Vdbe *v, int x){
|
void sqlite3VdbeResolveLabel(Vdbe *v, int x){
|
||||||
Parse *p = v->pParse;
|
Parse *p = v->pParse;
|
||||||
int j = ADDR(x);
|
int j = ADDR(x);
|
||||||
assert( v->magic==VDBE_MAGIC_INIT );
|
assert( v->magic==VDBE_MAGIC_INIT );
|
||||||
assert( j<p->nLabel );
|
assert( j<-p->nLabel );
|
||||||
assert( j>=0 );
|
assert( j>=0 );
|
||||||
if( p->aLabel ){
|
|
||||||
#ifdef SQLITE_DEBUG
|
#ifdef SQLITE_DEBUG
|
||||||
if( p->db->flags & SQLITE_VdbeAddopTrace ){
|
if( p->db->flags & SQLITE_VdbeAddopTrace ){
|
||||||
printf("RESOLVE LABEL %d to %d\n", x, v->nOp);
|
printf("RESOLVE LABEL %d to %d\n", x, v->nOp);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
if( p->nLabelAlloc + p->nLabel < 0 ){
|
||||||
|
resizeResolveLabel(p,v,j);
|
||||||
|
}else{
|
||||||
assert( p->aLabel[j]==(-1) ); /* Labels may only be resolved once */
|
assert( p->aLabel[j]==(-1) ); /* Labels may only be resolved once */
|
||||||
p->aLabel[j] = v->nOp;
|
p->aLabel[j] = v->nOp;
|
||||||
}
|
}
|
||||||
@@ -769,7 +787,7 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
|
|||||||
** non-jump opcodes less than SQLITE_MX_JUMP_CODE are guaranteed to
|
** non-jump opcodes less than SQLITE_MX_JUMP_CODE are guaranteed to
|
||||||
** have non-negative values for P2. */
|
** have non-negative values for P2. */
|
||||||
assert( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 );
|
assert( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 );
|
||||||
assert( ADDR(pOp->p2)<pParse->nLabel );
|
assert( ADDR(pOp->p2)<-pParse->nLabel );
|
||||||
pOp->p2 = aLabel[ADDR(pOp->p2)];
|
pOp->p2 = aLabel[ADDR(pOp->p2)];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@@ -837,7 +837,7 @@ static void constructAutomaticIndex(
|
|||||||
addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v);
|
addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v);
|
||||||
}
|
}
|
||||||
if( pPartial ){
|
if( pPartial ){
|
||||||
iContinue = sqlite3VdbeMakeLabel(v);
|
iContinue = sqlite3VdbeMakeLabel(pParse);
|
||||||
sqlite3ExprIfFalse(pParse, pPartial, iContinue, SQLITE_JUMPIFNULL);
|
sqlite3ExprIfFalse(pParse, pPartial, iContinue, SQLITE_JUMPIFNULL);
|
||||||
pLoop->wsFlags |= WHERE_PARTIALIDX;
|
pLoop->wsFlags |= WHERE_PARTIALIDX;
|
||||||
}
|
}
|
||||||
@@ -4644,7 +4644,7 @@ WhereInfo *sqlite3WhereBegin(
|
|||||||
pWInfo->pResultSet = pResultSet;
|
pWInfo->pResultSet = pResultSet;
|
||||||
pWInfo->aiCurOnePass[0] = pWInfo->aiCurOnePass[1] = -1;
|
pWInfo->aiCurOnePass[0] = pWInfo->aiCurOnePass[1] = -1;
|
||||||
pWInfo->nLevel = nTabList;
|
pWInfo->nLevel = nTabList;
|
||||||
pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(v);
|
pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(pParse);
|
||||||
pWInfo->wctrlFlags = wctrlFlags;
|
pWInfo->wctrlFlags = wctrlFlags;
|
||||||
pWInfo->iLimit = iAuxArg;
|
pWInfo->iLimit = iAuxArg;
|
||||||
pWInfo->savedNQueryLoop = pParse->nQueryLoop;
|
pWInfo->savedNQueryLoop = pParse->nQueryLoop;
|
||||||
|
@@ -566,7 +566,7 @@ static int codeEqualityTerm(
|
|||||||
|
|
||||||
pLoop->wsFlags |= WHERE_IN_ABLE;
|
pLoop->wsFlags |= WHERE_IN_ABLE;
|
||||||
if( pLevel->u.in.nIn==0 ){
|
if( pLevel->u.in.nIn==0 ){
|
||||||
pLevel->addrNxt = sqlite3VdbeMakeLabel(v);
|
pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse);
|
||||||
}
|
}
|
||||||
|
|
||||||
i = pLevel->u.in.nIn;
|
i = pLevel->u.in.nIn;
|
||||||
@@ -1208,8 +1208,8 @@ Bitmask sqlite3WhereCodeOneLoopStart(
|
|||||||
** there are no IN operators in the constraints, the "addrNxt" label
|
** there are no IN operators in the constraints, the "addrNxt" label
|
||||||
** is the same as "addrBrk".
|
** is the same as "addrBrk".
|
||||||
*/
|
*/
|
||||||
addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(v);
|
addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse);
|
||||||
addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(v);
|
addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(pParse);
|
||||||
|
|
||||||
/* If this is the right table of a LEFT OUTER JOIN, allocate and
|
/* If this is the right table of a LEFT OUTER JOIN, allocate and
|
||||||
** initialize a memory cell that records if this table matches any
|
** initialize a memory cell that records if this table matches any
|
||||||
@@ -1832,7 +1832,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
|
|||||||
int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */
|
int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */
|
||||||
int regRowset = 0; /* Register for RowSet object */
|
int regRowset = 0; /* Register for RowSet object */
|
||||||
int regRowid = 0; /* Register holding rowid */
|
int regRowid = 0; /* Register holding rowid */
|
||||||
int iLoopBody = sqlite3VdbeMakeLabel(v); /* Start of loop body */
|
int iLoopBody = sqlite3VdbeMakeLabel(pParse);/* Start of loop body */
|
||||||
int iRetInit; /* Address of regReturn init */
|
int iRetInit; /* Address of regReturn init */
|
||||||
int untestedTerms = 0; /* Some terms not completely tested */
|
int untestedTerms = 0; /* Some terms not completely tested */
|
||||||
int ii; /* Loop counter */
|
int ii; /* Loop counter */
|
||||||
|
14
src/window.c
14
src/window.c
@@ -1330,7 +1330,7 @@ static void windowReturnOneRow(
|
|||||||
|| pFunc->zName==first_valueName
|
|| pFunc->zName==first_valueName
|
||||||
){
|
){
|
||||||
int csr = pWin->csrApp;
|
int csr = pWin->csrApp;
|
||||||
int lbl = sqlite3VdbeMakeLabel(v);
|
int lbl = sqlite3VdbeMakeLabel(pParse);
|
||||||
int tmpReg = sqlite3GetTempReg(pParse);
|
int tmpReg = sqlite3GetTempReg(pParse);
|
||||||
sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult);
|
sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult);
|
||||||
|
|
||||||
@@ -1353,7 +1353,7 @@ static void windowReturnOneRow(
|
|||||||
int nArg = pWin->pOwner->x.pList->nExpr;
|
int nArg = pWin->pOwner->x.pList->nExpr;
|
||||||
int iEph = pMWin->iEphCsr;
|
int iEph = pMWin->iEphCsr;
|
||||||
int csr = pWin->csrApp;
|
int csr = pWin->csrApp;
|
||||||
int lbl = sqlite3VdbeMakeLabel(v);
|
int lbl = sqlite3VdbeMakeLabel(pParse);
|
||||||
int tmpReg = sqlite3GetTempReg(pParse);
|
int tmpReg = sqlite3GetTempReg(pParse);
|
||||||
|
|
||||||
if( nArg<3 ){
|
if( nArg<3 ){
|
||||||
@@ -1614,8 +1614,8 @@ static void windowCodeRowExprStep(
|
|||||||
|
|
||||||
/* Allocate register and label for the "flush_partition" sub-routine. */
|
/* Allocate register and label for the "flush_partition" sub-routine. */
|
||||||
regFlushPart = ++pParse->nMem;
|
regFlushPart = ++pParse->nMem;
|
||||||
lblFlushPart = sqlite3VdbeMakeLabel(v);
|
lblFlushPart = sqlite3VdbeMakeLabel(pParse);
|
||||||
lblFlushDone = sqlite3VdbeMakeLabel(v);
|
lblFlushDone = sqlite3VdbeMakeLabel(pParse);
|
||||||
|
|
||||||
regStart = ++pParse->nMem;
|
regStart = ++pParse->nMem;
|
||||||
regEnd = ++pParse->nMem;
|
regEnd = ++pParse->nMem;
|
||||||
@@ -1725,7 +1725,7 @@ static void windowCodeRowExprStep(
|
|||||||
|| pMWin->eStart==TK_PRECEDING
|
|| pMWin->eStart==TK_PRECEDING
|
||||||
|| pMWin->eStart==TK_FOLLOWING
|
|| pMWin->eStart==TK_FOLLOWING
|
||||||
){
|
){
|
||||||
int lblSkipInverse = sqlite3VdbeMakeLabel(v);;
|
int lblSkipInverse = sqlite3VdbeMakeLabel(pParse);;
|
||||||
if( pMWin->eStart==TK_PRECEDING ){
|
if( pMWin->eStart==TK_PRECEDING ){
|
||||||
sqlite3VdbeAddOp3(v, OP_IfPos, regStart, lblSkipInverse, 1);
|
sqlite3VdbeAddOp3(v, OP_IfPos, regStart, lblSkipInverse, 1);
|
||||||
VdbeCoverage(v);
|
VdbeCoverage(v);
|
||||||
@@ -1890,13 +1890,13 @@ static void windowCodeCacheStep(
|
|||||||
|| (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_UNBOUNDED)
|
|| (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_UNBOUNDED)
|
||||||
);
|
);
|
||||||
|
|
||||||
lblEmpty = sqlite3VdbeMakeLabel(v);
|
lblEmpty = sqlite3VdbeMakeLabel(pParse);
|
||||||
regNewPeer = pParse->nMem+1;
|
regNewPeer = pParse->nMem+1;
|
||||||
pParse->nMem += nPeer;
|
pParse->nMem += nPeer;
|
||||||
|
|
||||||
/* Allocate register and label for the "flush_partition" sub-routine. */
|
/* Allocate register and label for the "flush_partition" sub-routine. */
|
||||||
regFlushPart = ++pParse->nMem;
|
regFlushPart = ++pParse->nMem;
|
||||||
lblFlushPart = sqlite3VdbeMakeLabel(v);
|
lblFlushPart = sqlite3VdbeMakeLabel(pParse);
|
||||||
|
|
||||||
csrLead = pParse->nTab++;
|
csrLead = pParse->nTab++;
|
||||||
regCtr = ++pParse->nMem;
|
regCtr = ++pParse->nMem;
|
||||||
|
@@ -620,4 +620,49 @@ do_execsql_test 14.1 {
|
|||||||
);
|
);
|
||||||
} {1 2 3}
|
} {1 2 3}
|
||||||
|
|
||||||
|
# 2018-12-31
|
||||||
|
# https://www.sqlite.org/src/info/d0866b26f83e9c55
|
||||||
|
# Window function in correlated subquery causes assertion fault
|
||||||
|
#
|
||||||
|
do_catchsql_test 15.0 {
|
||||||
|
WITH t(id, parent) AS (
|
||||||
|
SELECT CAST(1 AS INT), CAST(NULL AS INT)
|
||||||
|
UNION ALL
|
||||||
|
SELECT 2, NULL
|
||||||
|
UNION ALL
|
||||||
|
SELECT 3, 1
|
||||||
|
UNION ALL
|
||||||
|
SELECT 4, 1
|
||||||
|
UNION ALL
|
||||||
|
SELECT 5, 2
|
||||||
|
UNION ALL
|
||||||
|
SELECT 6, 2
|
||||||
|
), q AS (
|
||||||
|
SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) AS rn
|
||||||
|
FROM t
|
||||||
|
WHERE parent IS NULL
|
||||||
|
UNION ALL
|
||||||
|
SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) AS rn
|
||||||
|
FROM q
|
||||||
|
JOIN t
|
||||||
|
ON t.parent = q.id
|
||||||
|
)
|
||||||
|
SELECT *
|
||||||
|
FROM q;
|
||||||
|
} {1 {cannot use window functions in recursive queries}}
|
||||||
|
do_execsql_test 15.1 {
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
DROP TABLE IF EXISTS t2;
|
||||||
|
CREATE TABLE t1(x);
|
||||||
|
INSERT INTO t1 VALUES('a'), ('b'), ('c');
|
||||||
|
CREATE TABLE t2(a, b);
|
||||||
|
INSERT INTO t2 VALUES('X', 1), ('X', 2), ('Y', 2), ('Y', 3);
|
||||||
|
SELECT x, (
|
||||||
|
SELECT sum(b)
|
||||||
|
OVER (PARTITION BY a ROWS BETWEEN UNBOUNDED PRECEDING
|
||||||
|
AND UNBOUNDED FOLLOWING)
|
||||||
|
FROM t2 WHERE b<x
|
||||||
|
) FROM t1;
|
||||||
|
} {a 3 b 3 c 3}
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
Reference in New Issue
Block a user