mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Merge all recent trunk fixes and enhancements into the jsonb branch.
FossilOrigin-Name: 6d78d50ed2357e6c943c1ef97b1d2ea0902cbadef90c2c35dccdbdc2bdf8702f
This commit is contained in:
15
Makefile.in
15
Makefile.in
@@ -710,6 +710,21 @@ fuzzcheck-asan$(TEXE): $(FUZZCHECK_SRC) sqlite3.c sqlite3.h $(FUZZCHECK_DEP)
|
|||||||
fuzzcheck-ubsan$(TEXE): $(FUZZCHECK_SRC) sqlite3.c sqlite3.h $(FUZZCHECK_DEP)
|
fuzzcheck-ubsan$(TEXE): $(FUZZCHECK_SRC) sqlite3.c sqlite3.h $(FUZZCHECK_DEP)
|
||||||
$(LTLINK) -o $@ -fsanitize=undefined $(FUZZCHECK_OPT) $(FUZZCHECK_SRC) sqlite3.c $(TLIBS)
|
$(LTLINK) -o $@ -fsanitize=undefined $(FUZZCHECK_OPT) $(FUZZCHECK_SRC) sqlite3.c $(TLIBS)
|
||||||
|
|
||||||
|
# Usage: FUZZDB=filename make run-fuzzcheck
|
||||||
|
#
|
||||||
|
# Where filename is a fuzzcheck database, this target builds and runs
|
||||||
|
# fuzzcheck, fuzzcheck-asan, and fuzzcheck-ubsan on that database.
|
||||||
|
#
|
||||||
|
# FUZZDB can be a glob pattern of two or more databases. Example:
|
||||||
|
#
|
||||||
|
# FUZZDB=test/fuzzdata*.db make run-fuzzcheck
|
||||||
|
#
|
||||||
|
run-fuzzcheck: fuzzcheck$(TEXE) fuzzcheck-asan$(TEXE) fuzzcheck-ubsan$(TEXE)
|
||||||
|
@if test "$(FUZZDB)" = ""; then echo 'ERROR: No FUZZDB specified. Rerun with FUZZDB=filename'; exit 1; fi
|
||||||
|
./fuzzcheck$(TEXE) --spinner $(FUZZDB)
|
||||||
|
./fuzzcheck-asan$(TEXE) --spinner $(FUZZDB)
|
||||||
|
./fuzzcheck-ubsan$(TEXE) --spinner $(FUZZDB)
|
||||||
|
|
||||||
ossshell$(TEXE): $(TOP)/test/ossfuzz.c $(TOP)/test/ossshell.c sqlite3.c sqlite3.h
|
ossshell$(TEXE): $(TOP)/test/ossfuzz.c $(TOP)/test/ossshell.c sqlite3.c sqlite3.h
|
||||||
$(LTLINK) -o $@ $(FUZZCHECK_OPT) $(TOP)/test/ossshell.c \
|
$(LTLINK) -o $@ $(FUZZCHECK_OPT) $(TOP)/test/ossshell.c \
|
||||||
$(TOP)/test/ossfuzz.c sqlite3.c $(TLIBS)
|
$(TOP)/test/ossfuzz.c sqlite3.c $(TLIBS)
|
||||||
|
@@ -4404,7 +4404,7 @@ static void fts5WriteAppendPoslistData(
|
|||||||
const u8 *a = aData;
|
const u8 *a = aData;
|
||||||
int n = nData;
|
int n = nData;
|
||||||
|
|
||||||
assert( p->pConfig->pgsz>0 );
|
assert( p->pConfig->pgsz>0 || p->rc!=SQLITE_OK );
|
||||||
while( p->rc==SQLITE_OK
|
while( p->rc==SQLITE_OK
|
||||||
&& (pPage->buf.n + pPage->pgidx.n + n)>=p->pConfig->pgsz
|
&& (pPage->buf.n + pPage->pgidx.n + n)>=p->pConfig->pgsz
|
||||||
){
|
){
|
||||||
@@ -5664,8 +5664,9 @@ int sqlite3Fts5IndexOptimize(Fts5Index *p){
|
|||||||
|
|
||||||
assert( p->rc==SQLITE_OK );
|
assert( p->rc==SQLITE_OK );
|
||||||
fts5IndexFlush(p);
|
fts5IndexFlush(p);
|
||||||
assert( p->nContentlessDelete==0 );
|
assert( p->rc!=SQLITE_OK || p->nContentlessDelete==0 );
|
||||||
pStruct = fts5StructureRead(p);
|
pStruct = fts5StructureRead(p);
|
||||||
|
assert( p->rc!=SQLITE_OK || pStruct!=0 );
|
||||||
fts5StructureInvalidate(p);
|
fts5StructureInvalidate(p);
|
||||||
|
|
||||||
if( pStruct ){
|
if( pStruct ){
|
||||||
|
@@ -46,5 +46,31 @@ do_faultsim_test 1 -faults oom* -prep {
|
|||||||
faultsim_test_result {0 {}}
|
faultsim_test_result {0 {}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reset_db
|
||||||
|
do_execsql_test 2.0 {
|
||||||
|
CREATE VIRTUAL TABLE t1 USING fts5(a, content=, contentless_delete=1);
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO t1 VALUES('here''s some text');
|
||||||
|
INSERT INTO t1 VALUES('useful stuff, text');
|
||||||
|
INSERT INTO t1 VALUES('what would we do without text!');
|
||||||
|
COMMIT;
|
||||||
|
}
|
||||||
|
faultsim_save_and_close
|
||||||
|
do_faultsim_test 2 -faults oom* -prep {
|
||||||
|
faultsim_restore_and_reopen
|
||||||
|
execsql {
|
||||||
|
BEGIN;
|
||||||
|
DELETE FROM t1 WHERE rowid=2;
|
||||||
|
}
|
||||||
|
} -body {
|
||||||
|
execsql {
|
||||||
|
INSERT INTO t1(t1) VALUES('optimize');
|
||||||
|
}
|
||||||
|
} -test {
|
||||||
|
faultsim_integrity_check
|
||||||
|
faultsim_test_result {0 {}}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
36
manifest
36
manifest
@@ -1,9 +1,9 @@
|
|||||||
C Make\sedits\sdirectly\sto\sthe\sJSONB\sBLOB\swhen\sthe\sinput\sto\sjson_replace()\nis\sa\sJSONB.
|
C Merge\sall\srecent\strunk\sfixes\sand\senhancements\sinto\sthe\sjsonb\sbranch.
|
||||||
D 2023-11-21T17:51:58.335
|
D 2023-11-21T17:54:55.986
|
||||||
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 LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
F Makefile.in 8b59912fc1538f96a08555605c5886cdcc733696ae7f22e374b2a4752196ca20
|
F Makefile.in a0cf17b2a456ae24959030b979bc6f1ec5efc74a240fb834c12e63dd1127cd72
|
||||||
F Makefile.linux-gcc f3842a0b1efbfbb74ac0ef60e56b301836d05b4d867d014f714fa750048f1ab6
|
F Makefile.linux-gcc f3842a0b1efbfbb74ac0ef60e56b301836d05b4d867d014f714fa750048f1ab6
|
||||||
F Makefile.msc f0cf219350d9af4fba411b4f6306dce2adc897484e8f446de1fb4f40de674d00
|
F Makefile.msc f0cf219350d9af4fba411b4f6306dce2adc897484e8f446de1fb4f40de674d00
|
||||||
F README.md 963d30019abf0cc06b263cd2824bce022893f3f93a531758f6f04ff2194a16a8
|
F README.md 963d30019abf0cc06b263cd2824bce022893f3f93a531758f6f04ff2194a16a8
|
||||||
@@ -94,7 +94,7 @@ F ext/fts5/fts5_buffer.c 3001fbabb585d6de52947b44b455235072b741038391f830d6b7292
|
|||||||
F ext/fts5/fts5_config.c 054359543566cbff1ba65a188330660a5457299513ac71c53b3a07d934c7b081
|
F ext/fts5/fts5_config.c 054359543566cbff1ba65a188330660a5457299513ac71c53b3a07d934c7b081
|
||||||
F ext/fts5/fts5_expr.c bd3b81ce669c4104e34ffe66570af1999a317b142c15fccb112de9fb0caa57a6
|
F ext/fts5/fts5_expr.c bd3b81ce669c4104e34ffe66570af1999a317b142c15fccb112de9fb0caa57a6
|
||||||
F ext/fts5/fts5_hash.c 076058f93327051952a752dc765df1acfe783eb11b419b30652aa1fc1f987902
|
F ext/fts5/fts5_hash.c 076058f93327051952a752dc765df1acfe783eb11b419b30652aa1fc1f987902
|
||||||
F ext/fts5/fts5_index.c 01b671fedd2189f6969385d96facc4c06d9c441f0f91d584386a62b724282f9f
|
F ext/fts5/fts5_index.c 809407c520c6afc3c1a0b8080cbd9080e4d84442f52a31654cc0e3d3acccea17
|
||||||
F ext/fts5/fts5_main.c a07ed863b8bd9e6fefb62db2fd40a3518eb30a5f7dcfda5be915dd2db45efa2f
|
F ext/fts5/fts5_main.c a07ed863b8bd9e6fefb62db2fd40a3518eb30a5f7dcfda5be915dd2db45efa2f
|
||||||
F ext/fts5/fts5_storage.c 5d10b9bdcce5b90656cad13c7d12ad4148677d4b9e3fca0481fca56d6601426d
|
F ext/fts5/fts5_storage.c 5d10b9bdcce5b90656cad13c7d12ad4148677d4b9e3fca0481fca56d6601426d
|
||||||
F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae
|
F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae
|
||||||
@@ -167,7 +167,7 @@ F ext/fts5/test/fts5faultB.test d606bdb8e81aaeb6f41de3fc9fc7ae315733f0903fbff05c
|
|||||||
F ext/fts5/test/fts5faultD.test e7ed7895abfe6bc98a5e853826f6b74956e7ba7f594f1860bbf9e504b9647996
|
F ext/fts5/test/fts5faultD.test e7ed7895abfe6bc98a5e853826f6b74956e7ba7f594f1860bbf9e504b9647996
|
||||||
F ext/fts5/test/fts5faultE.test 844586ce71dab4be85bb86880e87b624d089f851654cd22e4710c77eb8ce7075
|
F ext/fts5/test/fts5faultE.test 844586ce71dab4be85bb86880e87b624d089f851654cd22e4710c77eb8ce7075
|
||||||
F ext/fts5/test/fts5faultF.test 4abef99f86e99d9f0c6460dd68c586a766b6b9f1f660ada55bf2e8266bd1bbc1
|
F ext/fts5/test/fts5faultF.test 4abef99f86e99d9f0c6460dd68c586a766b6b9f1f660ada55bf2e8266bd1bbc1
|
||||||
F ext/fts5/test/fts5faultG.test 340e59d2c2c1c7c379224f3968ee8d09b0f64bf56c5194217d1ded887b9d47c4
|
F ext/fts5/test/fts5faultG.test d2e5a4d9a34e08dcaadcaeafef74d10cbc2abdd11aa2659a18af0294bf2812d3
|
||||||
F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b996159f6909dc8079
|
F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b996159f6909dc8079
|
||||||
F ext/fts5/test/fts5full.test e1701a112354e0ff9a1fdffb0c940c576530c33732ee20ac5e8361777070d717
|
F ext/fts5/test/fts5full.test e1701a112354e0ff9a1fdffb0c940c576530c33732ee20ac5e8361777070d717
|
||||||
F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e
|
F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e
|
||||||
@@ -675,7 +675,7 @@ F src/date.c 3b8d02977d160e128469de38493b4085f7c5cf4073193459909a6af3cf6d7c91
|
|||||||
F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782
|
F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782
|
||||||
F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43
|
F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43
|
||||||
F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
|
F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
|
||||||
F src/expr.c 88629faed0b576b7ffa3d82ce44cbcee4ed476a2bf1ea4e1d6bf1260e03b19cb
|
F src/expr.c e9a491c7f156e5b25641c28af11b735a424e108a21b9f83b6f3e51c99a8141d9
|
||||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||||
F src/fkey.c a47610f0a5c6cb0ad79f8fcef039c01833dec0c751bb695f28dc0ec6a4c3ba00
|
F src/fkey.c a47610f0a5c6cb0ad79f8fcef039c01833dec0c751bb695f28dc0ec6a4c3ba00
|
||||||
F src/func.c 472f6dcfa39cf54f89a6aec76c79c225fb880a6c14469c15d361331662b9bf43
|
F src/func.c 472f6dcfa39cf54f89a6aec76c79c225fb880a6c14469c15d361331662b9bf43
|
||||||
@@ -702,14 +702,14 @@ F src/mutex.c 1b4c7e5e3621b510e0c18397210be27cd54c8084141144fbbafd003fde948e88
|
|||||||
F src/mutex.h a7b2293c48db5f27007c3bdb21d438873637d12658f5a0bf8ad025bb96803c4a
|
F src/mutex.h a7b2293c48db5f27007c3bdb21d438873637d12658f5a0bf8ad025bb96803c4a
|
||||||
F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4
|
F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4
|
||||||
F src/mutex_unix.c f7ee5a2061a4c11815a2bf4fc0e2bfa6fb8d9dc89390eb613ca0cec32fc9a3d1
|
F src/mutex_unix.c f7ee5a2061a4c11815a2bf4fc0e2bfa6fb8d9dc89390eb613ca0cec32fc9a3d1
|
||||||
F src/mutex_w32.c 38b56d0bc8d54c17c20cbaaad3719b0c36b92fd07a7e34360d0c6a18d5589912
|
F src/mutex_w32.c 28f8d480387db5b2ef5248705dd4e19db0cfc12c3ba426695a7d2c45c48e6885
|
||||||
F src/notify.c 57c2d1a2805d6dee32acd5d250d928ab94e02d76369ae057dee7d445fd64e878
|
F src/notify.c 57c2d1a2805d6dee32acd5d250d928ab94e02d76369ae057dee7d445fd64e878
|
||||||
F src/os.c 509452169d5ea739723e213b8e2481cf0e587f0e88579a912d200db5269f5f6d
|
F src/os.c 509452169d5ea739723e213b8e2481cf0e587f0e88579a912d200db5269f5f6d
|
||||||
F src/os.h 1ff5ae51d339d0e30d8a9d814f4b8f8e448169304d83a7ed9db66a65732f3e63
|
F src/os.h 1ff5ae51d339d0e30d8a9d814f4b8f8e448169304d83a7ed9db66a65732f3e63
|
||||||
F src/os_common.h 6c0eb8dd40ef3e12fe585a13e709710267a258e2c8dd1c40b1948a1d14582e06
|
F src/os_common.h 6c0eb8dd40ef3e12fe585a13e709710267a258e2c8dd1c40b1948a1d14582e06
|
||||||
F src/os_kv.c 4d39e1f1c180b11162c6dc4aa8ad34053873a639bac6baae23272fc03349986a
|
F src/os_kv.c 4d39e1f1c180b11162c6dc4aa8ad34053873a639bac6baae23272fc03349986a
|
||||||
F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d872107
|
F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d872107
|
||||||
F src/os_unix.c f8a557ff5b387ec599e8b84b7341e5a45ebdd579da03788364a34b9a9567faeb
|
F src/os_unix.c dc5404b56da7fb13cf272ddb94c3753cf9e82d32a65cba35dbb6aadcb849419c
|
||||||
F src/os_win.c 4a50a154aeebc66a1f8fb79c1ff6dd5fe3d005556533361e0d460d41cb6a45a8
|
F src/os_win.c 4a50a154aeebc66a1f8fb79c1ff6dd5fe3d005556533361e0d460d41cb6a45a8
|
||||||
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
||||||
F src/pager.c 987ab3a2cd9065d62e9955474470ff733445e2357432a67e3d0f5a8f9313e334
|
F src/pager.c 987ab3a2cd9065d62e9955474470ff733445e2357432a67e3d0f5a8f9313e334
|
||||||
@@ -720,12 +720,12 @@ F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5
|
|||||||
F src/pcache1.c 602acb23c471bb8d557a6f0083cc2be641d6cafcafa19e481eba7ef4c9ca0f00
|
F src/pcache1.c 602acb23c471bb8d557a6f0083cc2be641d6cafcafa19e481eba7ef4c9ca0f00
|
||||||
F src/pragma.c b3b4ad9c0298d63098a067acca613c21a5f56b4d176d5842922bcd0b07b7164e
|
F src/pragma.c b3b4ad9c0298d63098a067acca613c21a5f56b4d176d5842922bcd0b07b7164e
|
||||||
F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
|
F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
|
||||||
F src/prepare.c bde74add20fc0e8ce0c4e937a1f70a36d17413afe4f71d3e103f5cb74b17c8d9
|
F src/prepare.c 371f6115cb69286ebc12c6f2d7511279c2e47d9f54f475d46a554d687a3b312c
|
||||||
F src/printf.c 9da63b9ae1c14789bcae12840f5d800fd9302500cd2d62733fac77f0041b4750
|
F src/printf.c 9da63b9ae1c14789bcae12840f5d800fd9302500cd2d62733fac77f0041b4750
|
||||||
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
|
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
|
||||||
F src/resolve.c d017bad7ba8e778617701a0e986fdeb393d67d6afa84fb28ef4e8b8ad2acf916
|
F src/resolve.c d017bad7ba8e778617701a0e986fdeb393d67d6afa84fb28ef4e8b8ad2acf916
|
||||||
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
|
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
|
||||||
F src/select.c b3e8bb88f7a9572200fdb89cb1ef31605f45b7b2eb876d12d5102c068de905f0
|
F src/select.c 85857bedd2913d888aa571755b48c54cd2e6e7fcb0087e19b226ee0368cfda1e
|
||||||
F src/shell.c.in 297625a1ba6ea1c08bc2ea1b838b646cad309b62bf08df0e379355629404f140
|
F src/shell.c.in 297625a1ba6ea1c08bc2ea1b838b646cad309b62bf08df0e379355629404f140
|
||||||
F src/sqlite.h.in d93a4821d2f792467a60f7dc81268d1bb8634f40c31694ef254cab4f9921f96a
|
F src/sqlite.h.in d93a4821d2f792467a60f7dc81268d1bb8634f40c31694ef254cab4f9921f96a
|
||||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||||
@@ -795,7 +795,7 @@ F src/upsert.c fa125a8d3410ce9a97b02cb50f7ae68a2476c405c76aa692d3acf6b8586e9242
|
|||||||
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
|
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
|
||||||
F src/util.c b22cc9f203a8c0b9ee5338a67f8860347d14845864c10248bebe84518a781677
|
F src/util.c b22cc9f203a8c0b9ee5338a67f8860347d14845864c10248bebe84518a781677
|
||||||
F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
|
F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
|
||||||
F src/vdbe.c 8b8e0c687e8dc355dfbdd40bf1cfa57effbaf3efeb0d634296d547c8549cc4ac
|
F src/vdbe.c a5bf636ef502cfac538418fbf537a5e0cf825c7ce9ff784cddee2eb813dfe7a7
|
||||||
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
|
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
|
||||||
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
|
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
|
||||||
F src/vdbeapi.c 8f57d60c89da0b60e6d4e272358c511f6bae4e24330bdb11f8b42f986d1bf21b
|
F src/vdbeapi.c 8f57d60c89da0b60e6d4e272358c511f6bae4e24330bdb11f8b42f986d1bf21b
|
||||||
@@ -824,7 +824,7 @@ F test/aggnested.test ce85a6af7d59c3109e35c5f03b2cd11da1a9b1417371e2f942102d0f0d
|
|||||||
F test/aggorderby.test e6b98dbbf3ababa96892435d387de2dcf602ef02c2b848d2d817473066f154ba
|
F test/aggorderby.test e6b98dbbf3ababa96892435d387de2dcf602ef02c2b848d2d817473066f154ba
|
||||||
F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
|
F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
|
||||||
F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13
|
F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13
|
||||||
F test/alter.test 5d3c2a662c54362193b08961f6a65178c434905ec0fda8e0a86ebd99ea04d3cc
|
F test/alter.test 3c00eff1e2036b9f93e9cd0f3d3e63750ac87ecb5bc71b9d7bd07cbf2ac4c494
|
||||||
F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687
|
F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687
|
||||||
F test/alter3.test ffc4ab29ce78a3517a66afd69b2730667e3471622509c283b2bd4c46f680fba3
|
F test/alter3.test ffc4ab29ce78a3517a66afd69b2730667e3471622509c283b2bd4c46f680fba3
|
||||||
F test/alter4.test 716caa071dd8a3c6d57225778d15d3c3cbf5e34b2e84ae44199aeb2bbf50a707
|
F test/alter4.test 716caa071dd8a3c6d57225778d15d3c3cbf5e34b2e84ae44199aeb2bbf50a707
|
||||||
@@ -1566,7 +1566,7 @@ F test/sharedA.test 64bdd21216dda2c6a3bd3475348ccdc108160f34682c97f2f51c19fc0e21
|
|||||||
F test/sharedB.test 1a84863d7a2204e0d42f2e1606577c5e92e4473fa37ea0f5bdf829e4bf8ee707
|
F test/sharedB.test 1a84863d7a2204e0d42f2e1606577c5e92e4473fa37ea0f5bdf829e4bf8ee707
|
||||||
F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939
|
F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939
|
||||||
F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304
|
F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304
|
||||||
F test/shell1.test 2191c892d8256b1b6cccb4fca894cfc2e748450cf422e6ec80a320a0d538b6df
|
F test/shell1.test 0bb36232873d7df2ba627ed25cff1332f6d98c0f7f244b425702c1ab1850bd15
|
||||||
F test/shell2.test 35226c070a8c7f64fd016dfac2a0db2a40f709b3131f61daacd9dad61536c9cb
|
F test/shell2.test 35226c070a8c7f64fd016dfac2a0db2a40f709b3131f61daacd9dad61536c9cb
|
||||||
F test/shell3.test 91febeac0412812bf6370abb8ed72700e32bf8f9878849414518f662dfd55e8a
|
F test/shell3.test 91febeac0412812bf6370abb8ed72700e32bf8f9878849414518f662dfd55e8a
|
||||||
F test/shell4.test 9abd0c12a7e20a4c49e84d5be208d2124fa6c09e728f56f1f4bee0f02853935f
|
F test/shell4.test 9abd0c12a7e20a4c49e84d5be208d2124fa6c09e728f56f1f4bee0f02853935f
|
||||||
@@ -1818,7 +1818,7 @@ F test/tokenize.test ce430a7aed48fc98301611429595883fdfcab5d7
|
|||||||
F test/tpch01.test 4479008f85f6f8f25f7ab2cb305d665752b4727fa28a8df3d8e0ad46520c62ff
|
F test/tpch01.test 4479008f85f6f8f25f7ab2cb305d665752b4727fa28a8df3d8e0ad46520c62ff
|
||||||
F test/trace.test a659a9862957f4789e37a92b3bf6d2caf5c86b02cdeefc41e850ae53acf6992a
|
F test/trace.test a659a9862957f4789e37a92b3bf6d2caf5c86b02cdeefc41e850ae53acf6992a
|
||||||
F test/trace2.test f5cb67ad3bc09e0c58e8cca78dfd0b5639259983
|
F test/trace2.test f5cb67ad3bc09e0c58e8cca78dfd0b5639259983
|
||||||
F test/trace3.test ae2004df24b585fed9046cc0bae4601762bc6fc4aa321d475f1350bba5047f31
|
F test/trace3.test 4f418ed30d15d9d17dcf13a17f0bd99a92e3038e038798e35db7525f82f4c281
|
||||||
F test/trans.test 45f6f9ab6f66a7b5744f1caac06b558f95da62501916906cf55586a896f9f439
|
F test/trans.test 45f6f9ab6f66a7b5744f1caac06b558f95da62501916906cf55586a896f9f439
|
||||||
F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76
|
F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76
|
||||||
F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94
|
F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94
|
||||||
@@ -1969,7 +1969,7 @@ F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6
|
|||||||
F test/whereD.test c1c335e914e28b122e000e9310f02d2be83e1c9dbca2e29f46bd732703944d1b
|
F test/whereD.test c1c335e914e28b122e000e9310f02d2be83e1c9dbca2e29f46bd732703944d1b
|
||||||
F test/whereE.test 7a727b5d5b6bc8fa4cef5206e90cc0363e55ca7f0566f6fbad0206e43170f59e
|
F test/whereE.test 7a727b5d5b6bc8fa4cef5206e90cc0363e55ca7f0566f6fbad0206e43170f59e
|
||||||
F test/whereF.test 926b65519608e3f2aa28720822b9154fb5c7b13519dd78194f434a511ab3dac5
|
F test/whereF.test 926b65519608e3f2aa28720822b9154fb5c7b13519dd78194f434a511ab3dac5
|
||||||
F test/whereG.test b2a479f425f7d0a432df7e842e8484560908ef703fe0fd407888ff85e7097238
|
F test/whereG.test 649d5ad02a87a76ec2ac8de9441e2c83a4dd0f29e459a31215c0533788c6bf07
|
||||||
F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2
|
F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2
|
||||||
F test/whereI.test c4bb7e2ca56d49bd8ab5c7bd085b8b83e353922b46904d68aefb3c7468643581
|
F test/whereI.test c4bb7e2ca56d49bd8ab5c7bd085b8b83e353922b46904d68aefb3c7468643581
|
||||||
F test/whereJ.test fc05e374cc9f2dc204148d6c06822c380ad388895fe97a6d335b94a26a08aecf
|
F test/whereJ.test fc05e374cc9f2dc204148d6c06822c380ad388895fe97a6d335b94a26a08aecf
|
||||||
@@ -2142,8 +2142,8 @@ 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 162f0509ef27bcd3ec87629640281a71c773e7c3bbd2cd0df76faf481531e7f1
|
P d69c6acef54a81f46a97a05d443fe648635b4b70772069d6705ef829b718e985 8936daa08243729d8538bb7288bbefb43f3bd842a0d4b2e8019092f5701c2926
|
||||||
R 38409c37dc02439917dd59332bdf58d4
|
R e8c6337278c34718864f8e382e5ab75f
|
||||||
U drh
|
U drh
|
||||||
Z 4892279bd4eeae014e8915fe6a430955
|
Z 78714a658254db90406116c46e75110c
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@@ -1 +1 @@
|
|||||||
d69c6acef54a81f46a97a05d443fe648635b4b70772069d6705ef829b718e985
|
6d78d50ed2357e6c943c1ef97b1d2ea0902cbadef90c2c35dccdbdc2bdf8702f
|
@@ -6043,8 +6043,8 @@ int sqlite3ExprListCompare(const ExprList *pA, const ExprList *pB, int iTab){
|
|||||||
*/
|
*/
|
||||||
int sqlite3ExprCompareSkip(Expr *pA,Expr *pB, int iTab){
|
int sqlite3ExprCompareSkip(Expr *pA,Expr *pB, int iTab){
|
||||||
return sqlite3ExprCompare(0,
|
return sqlite3ExprCompare(0,
|
||||||
sqlite3ExprSkipCollateAndLikely(pA),
|
sqlite3ExprSkipCollate(pA),
|
||||||
sqlite3ExprSkipCollateAndLikely(pB),
|
sqlite3ExprSkipCollate(pB),
|
||||||
iTab);
|
iTab);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -87,7 +87,7 @@ void sqlite3MemoryBarrier(void){
|
|||||||
SQLITE_MEMORY_BARRIER;
|
SQLITE_MEMORY_BARRIER;
|
||||||
#elif defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
__sync_synchronize();
|
__sync_synchronize();
|
||||||
#elif MSVC_VERSION>=1300
|
#elif MSVC_VERSION>=1400
|
||||||
_ReadWriteBarrier();
|
_ReadWriteBarrier();
|
||||||
#elif defined(MemoryBarrier)
|
#elif defined(MemoryBarrier)
|
||||||
MemoryBarrier();
|
MemoryBarrier();
|
||||||
|
207
src/os_unix.c
207
src/os_unix.c
@@ -4313,6 +4313,25 @@ static int unixGetpagesize(void){
|
|||||||
** Either unixShmNode.pShmMutex must be held or unixShmNode.nRef==0 and
|
** Either unixShmNode.pShmMutex must be held or unixShmNode.nRef==0 and
|
||||||
** unixMutexHeld() is true when reading or writing any other field
|
** unixMutexHeld() is true when reading or writing any other field
|
||||||
** in this structure.
|
** in this structure.
|
||||||
|
**
|
||||||
|
** aLock[SQLITE_SHM_NLOCK]:
|
||||||
|
** This array records the various locks held by clients on each of the
|
||||||
|
** SQLITE_SHM_NLOCK slots. If the aLock[] entry is set to 0, then no
|
||||||
|
** locks are held by the process on this slot. If it is set to -1, then
|
||||||
|
** some client holds an EXCLUSIVE lock on the locking slot. If the aLock[]
|
||||||
|
** value is set to a positive value, then it is the number of shared
|
||||||
|
** locks currently held on the slot.
|
||||||
|
**
|
||||||
|
** aMutex[SQLITE_SHM_NLOCK]:
|
||||||
|
** Normally, when SQLITE_ENABLE_SETLK_TIMEOUT is not defined, mutex
|
||||||
|
** pShmMutex is used to protect the aLock[] array and the right to
|
||||||
|
** call fcntl() on unixShmNode.hShm to obtain or release locks.
|
||||||
|
**
|
||||||
|
** If SQLITE_ENABLE_SETLK_TIMEOUT is defined though, we use an array
|
||||||
|
** of mutexes - one for each locking slot. To read or write locking
|
||||||
|
** slot aLock[iSlot], the caller must hold the corresponding mutex
|
||||||
|
** aMutex[iSlot]. Similarly, to call fcntl() to obtain or release a
|
||||||
|
** lock corresponding to slot iSlot, mutex aMutex[iSlot] must be held.
|
||||||
*/
|
*/
|
||||||
struct unixShmNode {
|
struct unixShmNode {
|
||||||
unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */
|
unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */
|
||||||
@@ -4326,10 +4345,11 @@ struct unixShmNode {
|
|||||||
char **apRegion; /* Array of mapped shared-memory regions */
|
char **apRegion; /* Array of mapped shared-memory regions */
|
||||||
int nRef; /* Number of unixShm objects pointing to this */
|
int nRef; /* Number of unixShm objects pointing to this */
|
||||||
unixShm *pFirst; /* All unixShm objects pointing to this */
|
unixShm *pFirst; /* All unixShm objects pointing to this */
|
||||||
|
#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
|
||||||
|
sqlite3_mutex *aMutex[SQLITE_SHM_NLOCK];
|
||||||
|
#endif
|
||||||
int aLock[SQLITE_SHM_NLOCK]; /* # shared locks on slot, -1==excl lock */
|
int aLock[SQLITE_SHM_NLOCK]; /* # shared locks on slot, -1==excl lock */
|
||||||
#ifdef SQLITE_DEBUG
|
#ifdef SQLITE_DEBUG
|
||||||
u8 exclMask; /* Mask of exclusive locks held */
|
|
||||||
u8 sharedMask; /* Mask of shared locks held */
|
|
||||||
u8 nextShmId; /* Next available unixShm.id value */
|
u8 nextShmId; /* Next available unixShm.id value */
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
@@ -4412,16 +4432,29 @@ static int unixShmSystemLock(
|
|||||||
struct flock f; /* The posix advisory locking structure */
|
struct flock f; /* The posix advisory locking structure */
|
||||||
int rc = SQLITE_OK; /* Result code form fcntl() */
|
int rc = SQLITE_OK; /* Result code form fcntl() */
|
||||||
|
|
||||||
/* Access to the unixShmNode object is serialized by the caller */
|
|
||||||
pShmNode = pFile->pInode->pShmNode;
|
pShmNode = pFile->pInode->pShmNode;
|
||||||
assert( pShmNode->nRef==0 || sqlite3_mutex_held(pShmNode->pShmMutex) );
|
|
||||||
assert( pShmNode->nRef>0 || unixMutexHeld() );
|
/* Assert that the correct mutex or mutexes are held. */
|
||||||
|
if( pShmNode->nRef==0 ){
|
||||||
|
assert( ofst==UNIX_SHM_DMS && n==1 && unixMutexHeld() );
|
||||||
|
}else{
|
||||||
|
#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
|
||||||
|
int ii;
|
||||||
|
for(ii=ofst-UNIX_SHM_BASE; ii<ofst-UNIX_SHM_BASE+n; ii++){
|
||||||
|
assert( sqlite3_mutex_held(pShmNode->aMutex[ii]) );
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
assert( sqlite3_mutex_held(pShmNode->pShmMutex) );
|
||||||
|
assert( pShmNode->nRef>0 );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* Shared locks never span more than one byte */
|
/* Shared locks never span more than one byte */
|
||||||
assert( n==1 || lockType!=F_RDLCK );
|
assert( n==1 || lockType!=F_RDLCK );
|
||||||
|
|
||||||
/* Locks are within range */
|
/* Locks are within range */
|
||||||
assert( n>=1 && n<=SQLITE_SHM_NLOCK );
|
assert( n>=1 && n<=SQLITE_SHM_NLOCK );
|
||||||
|
assert( ofst>=UNIX_SHM_BASE && ofst<=(UNIX_SHM_DMS+SQLITE_SHM_NLOCK) );
|
||||||
|
|
||||||
if( pShmNode->hShm>=0 ){
|
if( pShmNode->hShm>=0 ){
|
||||||
int res;
|
int res;
|
||||||
@@ -4440,39 +4473,28 @@ static int unixShmSystemLock(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the global lock state and do debug tracing */
|
/* Do debug tracing */
|
||||||
#ifdef SQLITE_DEBUG
|
#ifdef SQLITE_DEBUG
|
||||||
{ u16 mask;
|
|
||||||
OSTRACE(("SHM-LOCK "));
|
OSTRACE(("SHM-LOCK "));
|
||||||
mask = ofst>31 ? 0xffff : (1<<(ofst+n)) - (1<<ofst);
|
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
if( lockType==F_UNLCK ){
|
if( lockType==F_UNLCK ){
|
||||||
OSTRACE(("unlock %d ok", ofst));
|
OSTRACE(("unlock %d..%d ok\n", ofst, ofst+n-1));
|
||||||
pShmNode->exclMask &= ~mask;
|
|
||||||
pShmNode->sharedMask &= ~mask;
|
|
||||||
}else if( lockType==F_RDLCK ){
|
}else if( lockType==F_RDLCK ){
|
||||||
OSTRACE(("read-lock %d ok", ofst));
|
OSTRACE(("read-lock %d..%d ok\n", ofst, ofst+n-1));
|
||||||
pShmNode->exclMask &= ~mask;
|
|
||||||
pShmNode->sharedMask |= mask;
|
|
||||||
}else{
|
}else{
|
||||||
assert( lockType==F_WRLCK );
|
assert( lockType==F_WRLCK );
|
||||||
OSTRACE(("write-lock %d ok", ofst));
|
OSTRACE(("write-lock %d..%d ok\n", ofst, ofst+n-1));
|
||||||
pShmNode->exclMask |= mask;
|
|
||||||
pShmNode->sharedMask &= ~mask;
|
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
if( lockType==F_UNLCK ){
|
if( lockType==F_UNLCK ){
|
||||||
OSTRACE(("unlock %d failed", ofst));
|
OSTRACE(("unlock %d..%d failed\n", ofst, ofst+n-1));
|
||||||
}else if( lockType==F_RDLCK ){
|
}else if( lockType==F_RDLCK ){
|
||||||
OSTRACE(("read-lock failed"));
|
OSTRACE(("read-lock %d..%d failed\n", ofst, ofst+n-1));
|
||||||
}else{
|
}else{
|
||||||
assert( lockType==F_WRLCK );
|
assert( lockType==F_WRLCK );
|
||||||
OSTRACE(("write-lock %d failed", ofst));
|
OSTRACE(("write-lock %d..%d failed\n", ofst, ofst+n-1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
OSTRACE((" - afterwards %03x,%03x\n",
|
|
||||||
pShmNode->sharedMask, pShmNode->exclMask));
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
@@ -4509,6 +4531,11 @@ static void unixShmPurge(unixFile *pFd){
|
|||||||
int i;
|
int i;
|
||||||
assert( p->pInode==pFd->pInode );
|
assert( p->pInode==pFd->pInode );
|
||||||
sqlite3_mutex_free(p->pShmMutex);
|
sqlite3_mutex_free(p->pShmMutex);
|
||||||
|
#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
|
||||||
|
for(i=0; i<SQLITE_SHM_NLOCK; i++){
|
||||||
|
sqlite3_mutex_free(p->aMutex[i]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
for(i=0; i<p->nRegion; i+=nShmPerMap){
|
for(i=0; i<p->nRegion; i+=nShmPerMap){
|
||||||
if( p->hShm>=0 ){
|
if( p->hShm>=0 ){
|
||||||
osMunmap(p->apRegion[i], p->szRegion);
|
osMunmap(p->apRegion[i], p->szRegion);
|
||||||
@@ -4689,6 +4716,18 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
|
|||||||
rc = SQLITE_NOMEM_BKPT;
|
rc = SQLITE_NOMEM_BKPT;
|
||||||
goto shm_open_err;
|
goto shm_open_err;
|
||||||
}
|
}
|
||||||
|
#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
|
||||||
|
{
|
||||||
|
int ii;
|
||||||
|
for(ii=0; ii<SQLITE_SHM_NLOCK; ii++){
|
||||||
|
pShmNode->aMutex[ii] = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);
|
||||||
|
if( pShmNode->aMutex[ii]==0 ){
|
||||||
|
rc = SQLITE_NOMEM_BKPT;
|
||||||
|
goto shm_open_err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if( pInode->bProcessLock==0 ){
|
if( pInode->bProcessLock==0 ){
|
||||||
@@ -4910,9 +4949,11 @@ shmpage_out:
|
|||||||
*/
|
*/
|
||||||
#ifdef SQLITE_DEBUG
|
#ifdef SQLITE_DEBUG
|
||||||
static int assertLockingArrayOk(unixShmNode *pShmNode){
|
static int assertLockingArrayOk(unixShmNode *pShmNode){
|
||||||
|
#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
|
||||||
|
return 1;
|
||||||
|
#else
|
||||||
unixShm *pX;
|
unixShm *pX;
|
||||||
int aLock[SQLITE_SHM_NLOCK];
|
int aLock[SQLITE_SHM_NLOCK];
|
||||||
assert( sqlite3_mutex_held(pShmNode->pShmMutex) );
|
|
||||||
|
|
||||||
memset(aLock, 0, sizeof(aLock));
|
memset(aLock, 0, sizeof(aLock));
|
||||||
for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
|
for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
|
||||||
@@ -4930,13 +4971,14 @@ static int assertLockingArrayOk(unixShmNode *pShmNode){
|
|||||||
|
|
||||||
assert( 0==memcmp(pShmNode->aLock, aLock, sizeof(aLock)) );
|
assert( 0==memcmp(pShmNode->aLock, aLock, sizeof(aLock)) );
|
||||||
return (memcmp(pShmNode->aLock, aLock, sizeof(aLock))==0);
|
return (memcmp(pShmNode->aLock, aLock, sizeof(aLock))==0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Change the lock state for a shared-memory segment.
|
** Change the lock state for a shared-memory segment.
|
||||||
**
|
**
|
||||||
** Note that the relationship between SHAREd and EXCLUSIVE locks is a little
|
** Note that the relationship between SHARED and EXCLUSIVE locks is a little
|
||||||
** different here than in posix. In xShmLock(), one can go from unlocked
|
** different here than in posix. In xShmLock(), one can go from unlocked
|
||||||
** to shared and back or from unlocked to exclusive and back. But one may
|
** to shared and back or from unlocked to exclusive and back. But one may
|
||||||
** not go from shared to exclusive or from exclusive to shared.
|
** not go from shared to exclusive or from exclusive to shared.
|
||||||
@@ -4951,7 +4993,7 @@ static int unixShmLock(
|
|||||||
unixShm *p; /* The shared memory being locked */
|
unixShm *p; /* The shared memory being locked */
|
||||||
unixShmNode *pShmNode; /* The underlying file iNode */
|
unixShmNode *pShmNode; /* The underlying file iNode */
|
||||||
int rc = SQLITE_OK; /* Result code */
|
int rc = SQLITE_OK; /* Result code */
|
||||||
u16 mask; /* Mask of locks to take or release */
|
u16 mask = (1<<(ofst+n)) - (1<<ofst); /* Mask of locks to take or release */
|
||||||
int *aLock;
|
int *aLock;
|
||||||
|
|
||||||
p = pDbFd->pShm;
|
p = pDbFd->pShm;
|
||||||
@@ -4997,18 +5039,71 @@ static int unixShmLock(
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mask = (1<<(ofst+n)) - (1<<ofst);
|
/* Check if there is any work to do. There are three cases:
|
||||||
assert( n>1 || mask==(1<<ofst) );
|
**
|
||||||
sqlite3_mutex_enter(pShmNode->pShmMutex);
|
** a) An unlock operation where there are locks to unlock,
|
||||||
assert( assertLockingArrayOk(pShmNode) );
|
** b) An shared lock where the requested lock is not already held
|
||||||
if( flags & SQLITE_SHM_UNLOCK ){
|
** c) An exclusive lock where the requested lock is not already held
|
||||||
if( (p->exclMask|p->sharedMask) & mask ){
|
**
|
||||||
int ii;
|
** The SQLite core never requests an exclusive lock that it already holds.
|
||||||
int bUnlock = 1;
|
** This is assert()ed below.
|
||||||
|
*/
|
||||||
|
assert( flags!=(SQLITE_SHM_EXCLUSIVE|SQLITE_SHM_LOCK)
|
||||||
|
|| 0==(p->exclMask & mask)
|
||||||
|
);
|
||||||
|
if( ((flags & SQLITE_SHM_UNLOCK) && ((p->exclMask|p->sharedMask) & mask))
|
||||||
|
|| (flags==(SQLITE_SHM_SHARED|SQLITE_SHM_LOCK) && 0==(p->sharedMask & mask))
|
||||||
|
|| (flags==(SQLITE_SHM_EXCLUSIVE|SQLITE_SHM_LOCK))
|
||||||
|
){
|
||||||
|
|
||||||
for(ii=ofst; ii<ofst+n; ii++){
|
/* Take the required mutexes. In SETLK_TIMEOUT mode (blocking locks), if
|
||||||
if( aLock[ii]>((p->sharedMask & (1<<ii)) ? 1 : 0) ){
|
** this is an attempt on an exclusive lock use sqlite3_mutex_try(). If any
|
||||||
|
** other thread is holding this mutex, then it is either holding or about
|
||||||
|
** to hold a lock exclusive to the one being requested, and we may
|
||||||
|
** therefore return SQLITE_BUSY to the caller.
|
||||||
|
**
|
||||||
|
** Doing this prevents some deadlock scenarios. For example, thread 1 may
|
||||||
|
** be a checkpointer blocked waiting on the WRITER lock. And thread 2
|
||||||
|
** may be a normal SQL client upgrading to a write transaction. In this
|
||||||
|
** case thread 2 does a non-blocking request for the WRITER lock. But -
|
||||||
|
** if it were to use sqlite3_mutex_enter() then it would effectively
|
||||||
|
** become a (doomed) blocking request, as thread 2 would block until thread
|
||||||
|
** 1 obtained WRITER and released the mutex. Since thread 2 already holds
|
||||||
|
** a lock on a read-locking slot at this point, this breaks the
|
||||||
|
** anti-deadlock rules (see above). */
|
||||||
|
#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
|
||||||
|
int iMutex;
|
||||||
|
for(iMutex=ofst; iMutex<ofst+n; iMutex++){
|
||||||
|
if( flags==(SQLITE_SHM_LOCK|SQLITE_SHM_EXCLUSIVE) ){
|
||||||
|
rc = sqlite3_mutex_try(pShmNode->aMutex[iMutex]);
|
||||||
|
if( rc!=SQLITE_OK ) break;
|
||||||
|
}else{
|
||||||
|
sqlite3_mutex_enter(pShmNode->aMutex[iMutex]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
sqlite3_mutex_enter(pShmNode->pShmMutex);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if( rc==SQLITE_OK ){
|
||||||
|
if( flags & SQLITE_SHM_UNLOCK ){
|
||||||
|
/* Case (a) - unlock. */
|
||||||
|
int bUnlock = 1;
|
||||||
|
assert( (p->exclMask & p->sharedMask)==0 );
|
||||||
|
assert( !(flags & SQLITE_SHM_EXCLUSIVE) || (p->exclMask & mask)==mask );
|
||||||
|
assert( !(flags & SQLITE_SHM_SHARED) || (p->sharedMask & mask)==mask );
|
||||||
|
|
||||||
|
/* If this is a SHARED lock being unlocked, it is possible that other
|
||||||
|
** clients within this process are holding the same SHARED lock. In
|
||||||
|
** this case, set bUnlock to 0 so that the posix lock is not removed
|
||||||
|
** from the file-descriptor below. */
|
||||||
|
if( flags & SQLITE_SHM_SHARED ){
|
||||||
|
assert( n==1 );
|
||||||
|
assert( aLock[ofst]>=1 );
|
||||||
|
if( aLock[ofst]>1 ){
|
||||||
bUnlock = 0;
|
bUnlock = 0;
|
||||||
|
aLock[ofst]--;
|
||||||
|
p->sharedMask &= ~mask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5016,23 +5111,15 @@ static int unixShmLock(
|
|||||||
rc = unixShmSystemLock(pDbFd, F_UNLCK, ofst+UNIX_SHM_BASE, n);
|
rc = unixShmSystemLock(pDbFd, F_UNLCK, ofst+UNIX_SHM_BASE, n);
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
memset(&aLock[ofst], 0, sizeof(int)*n);
|
memset(&aLock[ofst], 0, sizeof(int)*n);
|
||||||
}
|
|
||||||
}else if( ALWAYS(p->sharedMask & (1<<ofst)) ){
|
|
||||||
assert( n==1 && aLock[ofst]>1 );
|
|
||||||
aLock[ofst]--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Undo the local locks */
|
|
||||||
if( rc==SQLITE_OK ){
|
|
||||||
p->exclMask &= ~mask;
|
|
||||||
p->sharedMask &= ~mask;
|
p->sharedMask &= ~mask;
|
||||||
|
p->exclMask &= ~mask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else if( flags & SQLITE_SHM_SHARED ){
|
}else if( flags & SQLITE_SHM_SHARED ){
|
||||||
assert( n==1 );
|
/* Case (b) - a shared lock. */
|
||||||
assert( (p->exclMask & (1<<ofst))==0 );
|
|
||||||
if( (p->sharedMask & mask)==0 ){
|
|
||||||
if( aLock[ofst]<0 ){
|
if( aLock[ofst]<0 ){
|
||||||
|
/* An exclusive lock is held by some other connection. BUSY. */
|
||||||
rc = SQLITE_BUSY;
|
rc = SQLITE_BUSY;
|
||||||
}else if( aLock[ofst]==0 ){
|
}else if( aLock[ofst]==0 ){
|
||||||
rc = unixShmSystemLock(pDbFd, F_RDLCK, ofst+UNIX_SHM_BASE, n);
|
rc = unixShmSystemLock(pDbFd, F_RDLCK, ofst+UNIX_SHM_BASE, n);
|
||||||
@@ -5043,14 +5130,18 @@ static int unixShmLock(
|
|||||||
p->sharedMask |= mask;
|
p->sharedMask |= mask;
|
||||||
aLock[ofst]++;
|
aLock[ofst]++;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}else{
|
}else{
|
||||||
|
/* Case (c) - an exclusive lock. */
|
||||||
|
int ii;
|
||||||
|
|
||||||
|
assert( flags==(SQLITE_SHM_LOCK|SQLITE_SHM_EXCLUSIVE) );
|
||||||
|
assert( (p->sharedMask & mask)==0 );
|
||||||
|
assert( (p->exclMask & mask)==0 );
|
||||||
|
|
||||||
/* Make sure no sibling connections hold locks that will block this
|
/* Make sure no sibling connections hold locks that will block this
|
||||||
** lock. If any do, return SQLITE_BUSY right away. */
|
** lock. If any do, return SQLITE_BUSY right away. */
|
||||||
int ii;
|
|
||||||
for(ii=ofst; ii<ofst+n; ii++){
|
for(ii=ofst; ii<ofst+n; ii++){
|
||||||
assert( (p->sharedMask & mask)==0 );
|
if( aLock[ii] ){
|
||||||
if( ALWAYS((p->exclMask & (1<<ii))==0) && aLock[ii] ){
|
|
||||||
rc = SQLITE_BUSY;
|
rc = SQLITE_BUSY;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -5061,7 +5152,6 @@ static int unixShmLock(
|
|||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
rc = unixShmSystemLock(pDbFd, F_WRLCK, ofst+UNIX_SHM_BASE, n);
|
rc = unixShmSystemLock(pDbFd, F_WRLCK, ofst+UNIX_SHM_BASE, n);
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
assert( (p->sharedMask & mask)==0 );
|
|
||||||
p->exclMask |= mask;
|
p->exclMask |= mask;
|
||||||
for(ii=ofst; ii<ofst+n; ii++){
|
for(ii=ofst; ii<ofst+n; ii++){
|
||||||
aLock[ii] = -1;
|
aLock[ii] = -1;
|
||||||
@@ -5070,7 +5160,18 @@ static int unixShmLock(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert( assertLockingArrayOk(pShmNode) );
|
assert( assertLockingArrayOk(pShmNode) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Drop the mutexes acquired above. */
|
||||||
|
#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
|
||||||
|
for(iMutex--; iMutex>=ofst; iMutex--){
|
||||||
|
sqlite3_mutex_leave(pShmNode->aMutex[iMutex]);
|
||||||
|
}
|
||||||
|
#else
|
||||||
sqlite3_mutex_leave(pShmNode->pShmMutex);
|
sqlite3_mutex_leave(pShmNode->pShmMutex);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n",
|
OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n",
|
||||||
p->id, osGetpid(0), p->sharedMask, p->exclMask));
|
p->id, osGetpid(0), p->sharedMask, p->exclMask));
|
||||||
return rc;
|
return rc;
|
||||||
|
@@ -868,6 +868,7 @@ static int sqlite3LockAndPrepare(
|
|||||||
assert( (rc&db->errMask)==rc );
|
assert( (rc&db->errMask)==rc );
|
||||||
db->busyHandler.nBusy = 0;
|
db->busyHandler.nBusy = 0;
|
||||||
sqlite3_mutex_leave(db->mutex);
|
sqlite3_mutex_leave(db->mutex);
|
||||||
|
assert( rc==SQLITE_OK || (*ppStmt)==0 );
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2319,7 +2319,8 @@ void sqlite3SubqueryColumnTypes(
|
|||||||
NameContext sNC;
|
NameContext sNC;
|
||||||
|
|
||||||
assert( pSelect!=0 );
|
assert( pSelect!=0 );
|
||||||
assert( (pSelect->selFlags & SF_Resolved)!=0 );
|
testcase( (pSelect->selFlags & SF_Resolved)==0 );
|
||||||
|
assert( (pSelect->selFlags & SF_Resolved)!=0 || IN_RENAME_OBJECT );
|
||||||
assert( pTab->nCol==pSelect->pEList->nExpr || pParse->nErr>0 );
|
assert( pTab->nCol==pSelect->pEList->nExpr || pParse->nErr>0 );
|
||||||
assert( aff==SQLITE_AFF_NONE || aff==SQLITE_AFF_BLOB );
|
assert( aff==SQLITE_AFF_NONE || aff==SQLITE_AFF_BLOB );
|
||||||
if( db->mallocFailed || IN_RENAME_OBJECT ) return;
|
if( db->mallocFailed || IN_RENAME_OBJECT ) return;
|
||||||
|
@@ -8184,7 +8184,7 @@ case OP_VCheck: { /* out2 */
|
|||||||
pTab = pOp->p4.pTab;
|
pTab = pOp->p4.pTab;
|
||||||
assert( pTab!=0 );
|
assert( pTab!=0 );
|
||||||
assert( IsVirtual(pTab) );
|
assert( IsVirtual(pTab) );
|
||||||
assert( pTab->u.vtab.p!=0 );
|
if( pTab->u.vtab.p==0 ) break;
|
||||||
pVtab = pTab->u.vtab.p->pVtab;
|
pVtab = pTab->u.vtab.p->pVtab;
|
||||||
assert( pVtab!=0 );
|
assert( pVtab!=0 );
|
||||||
pModule = pVtab->pModule;
|
pModule = pVtab->pModule;
|
||||||
|
@@ -970,5 +970,17 @@ do_execsql_test alter-21.1 {
|
|||||||
do_execsql_test alter-21.2 {
|
do_execsql_test alter-21.2 {
|
||||||
SELECT name, type FROM sqlite_schema ORDER BY name;
|
SELECT name, type FROM sqlite_schema ORDER BY name;
|
||||||
} {e table r1 trigger t1 table}
|
} {e table r1 trigger t1 table}
|
||||||
|
do_execsql_test alter-21.3 {
|
||||||
|
DROP TRIGGER r1;
|
||||||
|
CREATE TRIGGER r2 AFTER INSERT ON e BEGIN
|
||||||
|
SELECT unknown_function(a ORDER BY (SELECT group_concat(a ORDER BY a) FROM (SELECT b FROM t1))) FROM t1;
|
||||||
|
END;
|
||||||
|
ALTER TABLE e RENAME TO t99;
|
||||||
|
}
|
||||||
|
do_execsql_test alter-21.4 {
|
||||||
|
SELECT name, type FROM sqlite_schema ORDER BY name;
|
||||||
|
} {r2 trigger t1 table t99 table}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
@@ -1067,7 +1067,7 @@ do_test shell1-5.0 {
|
|||||||
#
|
#
|
||||||
set escapes [list \
|
set escapes [list \
|
||||||
\a \\a \b \\b \t \\t \n \\n \v \\v \f \\f \r \\r \
|
\a \\a \b \\b \t \\t \n \\n \v \\v \f \\f \r \\r \
|
||||||
" " "\" \"" \" \\\" ' \"'\" \\ \\\\]
|
" " "\" \"" \" \\\" \\ \\\\]
|
||||||
} else {
|
} else {
|
||||||
#
|
#
|
||||||
# NOTE: On Unix, we need to escape most of the whitespace characters
|
# NOTE: On Unix, we need to escape most of the whitespace characters
|
||||||
|
@@ -132,6 +132,8 @@ do_test trace3-4.3 {
|
|||||||
list $stmt [expr {$ns >= 0 && $ns <= 9999999}]; # less than 0.010 seconds
|
list $stmt [expr {$ns >= 0 && $ns <= 9999999}]; # less than 0.010 seconds
|
||||||
} {/^-?\d+ 1$/}
|
} {/^-?\d+ 1$/}
|
||||||
do_test trace3-4.4 {
|
do_test trace3-4.4 {
|
||||||
|
set cnt 0
|
||||||
|
while {1} {
|
||||||
set ::stmtlist(record) {}
|
set ::stmtlist(record) {}
|
||||||
db trace_v2 trace_v2_record 2
|
db trace_v2 trace_v2_record 2
|
||||||
execsql {
|
execsql {
|
||||||
@@ -139,7 +141,18 @@ do_test trace3-4.4 {
|
|||||||
}
|
}
|
||||||
set stmt [lindex [lindex $::stmtlist(record) 0] 0]
|
set stmt [lindex [lindex $::stmtlist(record) 0] 0]
|
||||||
set ns [lindex [lindex $::stmtlist(record) 0] 1]
|
set ns [lindex [lindex $::stmtlist(record) 0] 1]
|
||||||
list $stmt [expr {$ns >= 0 && $ns <= 9999999}]; # less than 0.010 seconds
|
if {$ns<0 || $ns>9999999} { #less than 0.010 seconds
|
||||||
|
incr cnt
|
||||||
|
if {$cnt>3} {
|
||||||
|
set res "time out of bounds. Expected less than 99999999. Got $ns"
|
||||||
|
break
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
set res 1
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
list $stmt $res
|
||||||
} {/^-?\d+ 1$/}
|
} {/^-?\d+ 1$/}
|
||||||
|
|
||||||
do_test trace3-5.1 {
|
do_test trace3-5.1 {
|
||||||
|
@@ -311,6 +311,20 @@ do_execsql_test 8.9 {
|
|||||||
do_execsql_test 8.10 {
|
do_execsql_test 8.10 {
|
||||||
SELECT * FROM t0 WHERE likelihood(t0.rowid <= '0', 0.5);
|
SELECT * FROM t0 WHERE likelihood(t0.rowid <= '0', 0.5);
|
||||||
} {}
|
} {}
|
||||||
|
# Forum https://sqlite.org/forum/forumpost/45ec3d9788
|
||||||
|
reset_db
|
||||||
|
do_execsql_test 8.11 {
|
||||||
|
CREATE TABLE t1(c0 INT);
|
||||||
|
INSERT INTO t1(c0) VALUES (NULL);
|
||||||
|
CREATE INDEX i46 ON t1(CAST( (c0 IS TRUE) AS TEXT));
|
||||||
|
CREATE VIEW v0(c2) AS SELECT CAST( (c0 IS TRUE) AS TEXT ) FROM t1;
|
||||||
|
}
|
||||||
|
do_execsql_test 8.12 {
|
||||||
|
SELECT quote(c0), quote(c2) FROM t1, v0 WHERE (0 < LIKELY(v0.c2));
|
||||||
|
} {NULL '0'}
|
||||||
|
do_execsql_test 8.13 {
|
||||||
|
SELECT quote(c0), quote(c2) FROM t1, v0 WHERE (0 < LIKELY(v0.c2)) IS TRUE;
|
||||||
|
} {NULL '0'}
|
||||||
|
|
||||||
# 2019-12-31: assertion fault discovered by Yongheng's fuzzer.
|
# 2019-12-31: assertion fault discovered by Yongheng's fuzzer.
|
||||||
# Harmless memIsValid() due to the code generators failure to
|
# Harmless memIsValid() due to the code generators failure to
|
||||||
|
Reference in New Issue
Block a user