Fix the SQLITE_ALLOW_ROWID_IN_VIEW bug-compatibility option so that it works
again. Add the SQLITE_CONFIG_ROWID_IN_VIEW sqlite3_config() value to optionally disable the bug-compatibility mode at start-time. Enable testing of SQLITE_ALLOW_ROWID_IN_VIEW. FossilOrigin-Name: b6802565df0f63286a7ef26c92d3ed817895f244920a24909cd855090fdfa08c
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
C Make\ssure\sthe\snew\su1.nRow\svalue\sis\scopied\swhen\smaking\sa\scopy\sof\sa\sSrcItem\nobject.\s\sThis\sfixes\sa\sproblem\sin\s[ac6f095e13e43d66]\sfrom\syesterady.
|
||||
D 2024-03-19T19:42:56.248
|
||||
C Fix\sthe\sSQLITE_ALLOW_ROWID_IN_VIEW\sbug-compatibility\soption\sso\sthat\sit\sworks\nagain.\s\sAdd\sthe\sSQLITE_CONFIG_ROWID_IN_VIEW\ssqlite3_config()\svalue\nto\soptionally\sdisable\sthe\sbug-compatibility\smode\sat\sstart-time.\s\sEnable\ntesting\sof\sSQLITE_ALLOW_ROWID_IN_VIEW.
|
||||
D 2024-03-20T10:45:13.735
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||
@@ -692,7 +692,7 @@ F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522
|
||||
F src/btree.c 285b493d843e7ba8ef78b6ae7d31238e904901dbc0c484f7904de4cf18fd8802
|
||||
F src/btree.h 55066f513eb095db935169dab1dc2f7c7a747ef223c533f5d4ad4dfed346cbd0
|
||||
F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6
|
||||
F src/build.c 04f1bcee189f045ab086d84fee95db42cb49df82ff8e84af8136309ff3c8a75f
|
||||
F src/build.c fff536730a6d83120ae38d960f812b548394e8af6907249effb1764d69178106
|
||||
F src/callback.c db3a45e376deff6a16c0058163fe0ae2b73a2945f3f408ca32cf74960b28d490
|
||||
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
||||
F src/ctime.c 23331529e654be40ca97d171cbbffe9b3d4c71cc53b78fe5501230675952da8b
|
||||
@@ -704,7 +704,7 @@ F src/expr.c 94f48513fbec07725501298dee3f16d95b1762bb4a12296455f544b2d7f2d74a
|
||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||
F src/fkey.c a47610f0a5c6cb0ad79f8fcef039c01833dec0c751bb695f28dc0ec6a4c3ba00
|
||||
F src/func.c 283d4f3b2751a1d9339fd93a8a013d1948fd5f4474a3cab0955eb4fafd445d0f
|
||||
F src/global.c 765a0656d6cbf043cb272ff0ae38f39cc46713539ffe6793258ed3eb4b188b52
|
||||
F src/global.c 61a419dd9e993b9be0f91de4c4ccf322b053eb829868e089f0321dd669be3b90
|
||||
F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220
|
||||
F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51
|
||||
F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6
|
||||
@@ -713,7 +713,7 @@ F src/insert.c 06ce505713e86172612f9e01febefd2d3331d1f70461b4ada0eae5a76bb6349f
|
||||
F src/json.c e2e40760d6689134c3e2ece38c6a496b34ff5e2661a8f238444a119af666fdce
|
||||
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
|
||||
F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36
|
||||
F src/main.c 438b95162acfa17b7d218f586f5bde11d6ae82bcf030c9611fc537556870ad6b
|
||||
F src/main.c 8a59d297ec77e6b78550433bfccb95a1b26f2fb69aaaf233206e21579a1cfcc1
|
||||
F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e
|
||||
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
||||
F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
|
||||
@@ -748,14 +748,14 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
|
||||
F src/prepare.c 371f6115cb69286ebc12c6f2d7511279c2e47d9f54f475d46a554d687a3b312c
|
||||
F src/printf.c 87b67bba3662a0523f39ae6b084a3907109702f717c654d6cecb838af5cd57f1
|
||||
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
|
||||
F src/resolve.c ef87e3bc7700bfe761a7bbee2ce6084f1766dc816dd82a3ae77c133eec898432
|
||||
F src/resolve.c eb1860b134fb044fd819c4347105c148d5aac7c6498032be2829e5cc95619b28
|
||||
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
|
||||
F src/select.c df2bf515fc36e02e97959a70e82da8a4967d6c85590646a7fda2926a734c81ce
|
||||
F src/shell.c.in cf80c636bccb0ff9db46995e39d69ca21fde2a8a331d1691e4d62a69d7841c8a
|
||||
F src/sqlite.h.in 19a2db3995a699bd7f6dfb423856242bfceb7ec849a93c91d241d19fc28d9f0f
|
||||
F src/select.c a83532bae45185f271b59babf715a31a831ac17e2b4bc061f52ee53825c688f1
|
||||
F src/shell.c.in 0354ca51eee5fbf6af394a7ef9f5ef6823ef45b743db65431f6777e4d5be2199
|
||||
F src/sqlite.h.in 41c5febd217b1e475aae022895c60f57fbe39ff6136450110662cfad67002d43
|
||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||
F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54
|
||||
F src/sqliteInt.h 9ffcf672d8a55d5bd5b5c8988c14ea575350c4920b7e43393608ac65aee332fe
|
||||
F src/sqliteInt.h f8928f0397d797046396dd9d360a6af8ce6dcb48bd72ea290165b07c8c518744
|
||||
F src/sqliteLimit.h 6878ab64bdeb8c24a1d762d45635e34b96da21132179023338c93f820eee6728
|
||||
F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b
|
||||
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
|
||||
@@ -774,7 +774,7 @@ F src/test_backup.c bf5da90c9926df0a4b941f2d92825a01bbe090a0
|
||||
F src/test_bestindex.c f6af1e41cb7901edafb065a8198e4a0192dd42432b642d038965be5e628dec12
|
||||
F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31ce
|
||||
F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274
|
||||
F src/test_config.c f0cc1f517deaa96dd384822ae2bb91534fa56aa458528b439830d709941d3932
|
||||
F src/test_config.c 5fa77ee6064ba546e144c4fea870c5ede2c54314616f81485c6a9c4192100c75
|
||||
F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f
|
||||
F src/test_demovfs.c 38a459d1c78fd9afa770445b224c485e079018d6ac07332ff9bd07b54d2b8ce9
|
||||
F src/test_devsym.c 649434ed34d0b03fbd5a6b42df80f0f9a7e53f94dd1710aad5dd8831e91c4e86
|
||||
@@ -1257,7 +1257,7 @@ F test/fuzzdata8.db 4a53b6d077c6a5c23b609d8d3ac66996fa55ba3f8d02f9b6efdd0214a767
|
||||
F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8
|
||||
F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14
|
||||
F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc
|
||||
F test/fuzzinvariants.c b34530e8431f2cf3591eff588fc7684d6fdef466916fb46141c8c5374a3d8099
|
||||
F test/fuzzinvariants.c 4355043e98cd8555c62462fcbba91c17c6492b0b017bbbe68656d5f2208f6444
|
||||
F test/gcfault.test 4ea410ac161e685f17b19e1f606f58514a2850e806c65b846d05f60d436c5b0d
|
||||
F test/gencol1.test e169bdfa11c7ed5e9f322a98a7db3afe9e66235750b68c923efee8e1876b46ec
|
||||
F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98
|
||||
@@ -1326,7 +1326,7 @@ F test/join.test f7abfef3faeaf2800308872e33a57e5b6e4a2b44fb8c6b90c6068412e71a6cf
|
||||
F test/join2.test 8561fe82ce434ac96de91544072e578dc2cadddf2d9bc9cd802f866a9b92502e
|
||||
F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0
|
||||
F test/join4.test 1a352e4e267114444c29266ce79e941af5885916
|
||||
F test/join5.test 7cc3f3595bb41e60f3f96d5cb6dd8cfcbc31212f0136bba6fc081c082994a94a
|
||||
F test/join5.test 380d12a9350f99f0cc681a4f1fea999886f18b3fe0d71a9b3065bcaead1e007f
|
||||
F test/join6.test f809c025fa253f9e150c0e9afd4cef8813257bceeb6f46e04041228c9403cc2c
|
||||
F test/join7.test 2268dcbb54b724391dda3748ea95c60d960607ffeed67885675998e7117697f6
|
||||
F test/join8.test d384d63985e3991c404afccadaf3efd1cdf9cd72680167f80e3cb80b95c18c68
|
||||
@@ -1337,7 +1337,7 @@ F test/joinC.test 1f1a602c2127f55f136e2cbd3bf2d26546614bf8cffe5902ec1ac9c07f87f2
|
||||
F test/joinD.test 2ce62e7353a0702ca5e70008faf319c1d4686aa19fba34275c6d1da0e960be28
|
||||
F test/joinE.test d5d182f3812771e2c0d97c9dcf5dbe4c41c8e21c82560e59358731c4a3981d6b
|
||||
F test/joinF.test 53dd66158806823ea680dd7543b5406af151b5aafa5cd06a7f3231cd94938127
|
||||
F test/joinH.test f69e5b53b7d887914e854b6a131efbed4ea9f5ca52bdab81788bfc3e79299f43
|
||||
F test/joinH.test d5054173442fdf98260eeb6bb9751daa733b0ae6842fe50dcbd5469945b86985
|
||||
F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497
|
||||
F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4
|
||||
F test/journal3.test 7c3cf23ffc77db06601c1fcfc9743de8441cb77db9d1aa931863d94f5ffa140e
|
||||
@@ -1426,7 +1426,7 @@ F test/minmax2.test cf9311babb6f0518d04e42fd6a42c619531c4309a9dd790a2c4e9b3bc595
|
||||
F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354
|
||||
F test/minmax4.test 272ca395257f05937dc96441c9dde4bc9fbf116a8d4fa02baeb0d13d50e36c87
|
||||
F test/misc1.test e3e36262aff1bd9b8b9bf1eeb3af04adb3fc1e23f0a92dbff708bba9e939ace1
|
||||
F test/misc2.test 71e746af479119386ac2ed7ab7d81d99970e75b49ffd3e8efffee100b4b5f350
|
||||
F test/misc2.test a1a3573cc02662becd967766021d6f16c54684d56df5f227481c7ef0d9df0bd0
|
||||
F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d
|
||||
F test/misc4.test 10cd6addb2fa9093df4751a1b92b50440175dd5468a6ec84d0386e78f087db0e
|
||||
F test/misc5.test 027cf0ac10314ea534173f335a33bb4059907ddabbac2c16786766d6f26c8923
|
||||
@@ -1527,7 +1527,7 @@ F test/regexp2.test 55ed41da802b0e284ac7e2fe944be3948f93ff25abbca0361a609acfed13
|
||||
F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d
|
||||
F test/resetdb.test 54c06f18bc832ac6d6319e5ab23d5c8dd49fdbeec7c696d791682a8006bd5fc3
|
||||
F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb
|
||||
F test/returning1.test db532cde29d6aebbc48c6ddc3149b30476f8e69ca7a2c4b53986c7635e6fd8ec
|
||||
F test/returning1.test 3ead782eddf51f573cdd43bcbb10d1b485ac095a19a76d16c43fd159ea9b7466
|
||||
F test/returningfault.test ae4c4b5e8745813287a359d9ccdb9d5c883c2e68afb18fb0767937d5de5692a4
|
||||
F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa
|
||||
F test/rollback2.test 3f3a4e20401825017df7e7671e9f31b6de5fae5620c2b9b49917f52f8c160a8f
|
||||
@@ -1535,7 +1535,7 @@ F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a
|
||||
F test/round1.test 29c3c9039936ed024d672f003c4d35ee11c14c0acb75c5f7d6188ff16190cfd4
|
||||
F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc
|
||||
F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81
|
||||
F test/rowid.test e29025be95baf6b32f0d5edef59a7633028325896a98f1caa8019559ca910350
|
||||
F test/rowid.test aaa2572271edf58f8f88ac4d39f69e57ee5ae7a858332cdce9106e7cff8b7963
|
||||
F test/rowvalue.test baf4fa3ec1a8c1c920c3faa5fd25959cb454bbd99ac8960397c34549d9fc4abe
|
||||
F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b
|
||||
F test/rowvalue3.test 1347e25ca11c547c5a6ff0cc5626f95aa9740e9275bfaec096029f57cb2130ce
|
||||
@@ -1867,7 +1867,7 @@ F test/trigger5.test 619391a3e9fc194081d22cefd830d811e7badf83
|
||||
F test/trigger6.test 0e411654f122552da6590f0b4e6f781048a4a9b9
|
||||
F test/trigger7.test e7ce54bfda67a88d778aea42544e151c465547a7e617127b6914c2221a6d53c1
|
||||
F test/trigger8.test 30cb0530bd7c4728055420e3f739aa00412eafa4
|
||||
F test/trigger9.test fd49aff8b724ae1a6238989ecf84320d88c0e8f8d9142a891b93f826dfe37b59
|
||||
F test/trigger9.test 1724b595661da3dd3c8d79f0ebae818132a39e65c241bad2049f66952b1dc29d
|
||||
F test/triggerA.test 837be862d8721f903dba3f3ceff05b32e0bee5214cf6ea3da5fadf12d3650e9d
|
||||
F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe
|
||||
F test/triggerC.test 29f5a28d0fe39e6e2c01f6e1f53f08c0955170ae10a63ad023e33cb0a1682a51
|
||||
@@ -1887,7 +1887,7 @@ F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff
|
||||
F test/types2.test 1aeb81976841a91eef292723649b5c4fe3bc3cac
|
||||
F test/types3.test c9db8f9e80309edfa4252585cf16bcab7ed31f39eeb904d21e831199a3613fb0
|
||||
F test/unhex.test b7f1b806207cb77fa31c3e434fe92fba524464e3e9356809bfcc28f15af1a8b7
|
||||
F test/unionall.test 5b1c4186a661e4bf762875caf4c61d8fda3dd04a6fa9005187f6ba8900c2913f
|
||||
F test/unionall.test 04d30726c5056f84f92b3a12bf8d8a1dbbe807d1ddc8af95def09e6ef2dd91e3
|
||||
F test/unionall2.test 71e8fa08d5699d50dc9f9dc0c9799c2e7a6bb7931a330d369307a4df7f157fa1
|
||||
F test/unionallfault.test 652bfbb630e6c43135965dc1e8f0a9a791da83aec885d626a632fe1909c56f73
|
||||
F test/unionvtab.test e1704ab1b4c1bb3ffc9da4681f8e85a0b909fd80b937984fc94b27415ac8e5a4
|
||||
@@ -2180,8 +2180,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P 0dddadbd5b217a48bb5c1b0568a03fbafb89dba98c577727bf4f79ff7e0ca849
|
||||
R e14b4caec27431611935484cb358ede2
|
||||
P 262f8f9d80d37160e4126634b99aa48fce2073e61f6365e8bdbe1cc4fa560a96 54680d0fbec1f0575ac4be6dca866971795dab2c42b02a492d5cd485f46d153f
|
||||
R 1676f1a7037df308a062e51e2c63ab1f
|
||||
T +closed 54680d0fbec1f0575ac4be6dca866971795dab2c42b02a492d5cd485f46d153f
|
||||
U drh
|
||||
Z bd83640688abf542746530f70fd640a9
|
||||
Z 8bdaec16fb58072604ac6ea406b7bf1a
|
||||
# Remove this line to create a well-formed Fossil manifest.
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
262f8f9d80d37160e4126634b99aa48fce2073e61f6365e8bdbe1cc4fa560a96
|
||||
b6802565df0f63286a7ef26c92d3ed817895f244920a24909cd855090fdfa08c
|
||||
+6
-3
@@ -3006,9 +3006,12 @@ void sqlite3CreateView(
|
||||
** on a view, even though views do not have rowids. The following flag
|
||||
** setting fixes this problem. But the fix can be disabled by compiling
|
||||
** with -DSQLITE_ALLOW_ROWID_IN_VIEW in case there are legacy apps that
|
||||
** depend upon the old buggy behavior. */
|
||||
#ifndef SQLITE_ALLOW_ROWID_IN_VIEW
|
||||
p->tabFlags |= TF_NoVisibleRowid;
|
||||
** depend upon the old buggy behavior. The ability can also be toggled
|
||||
** using sqlite3_config(SQLITE_CONFIG_ROWID_IN_VIEW,...) */
|
||||
#ifdef SQLITE_ALLOW_ROWID_IN_VIEW
|
||||
p->tabFlags |= sqlite3Config.mNoVisibleRowid; /* Optional. Allow by default */
|
||||
#else
|
||||
p->tabFlags |= TF_NoVisibleRowid; /* Never allow rowid in view */
|
||||
#endif
|
||||
|
||||
sqlite3TwoPartName(pParse, pName1, pName2, &pName);
|
||||
|
||||
@@ -288,6 +288,9 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = {
|
||||
#endif
|
||||
#ifndef SQLITE_UNTESTABLE
|
||||
0, /* xTestCallback */
|
||||
#endif
|
||||
#ifdef SQLITE_ALLOW_ROWID_IN_VIEW
|
||||
0, /* mNoVisibleRowid. 0 == allow rowid-in-view */
|
||||
#endif
|
||||
0, /* bLocaltimeFault */
|
||||
0, /* xAltLocaltime */
|
||||
|
||||
+12
@@ -765,6 +765,18 @@ int sqlite3_config(int op, ...){
|
||||
}
|
||||
#endif /* SQLITE_OMIT_DESERIALIZE */
|
||||
|
||||
case SQLITE_CONFIG_ROWID_IN_VIEW: {
|
||||
int *pVal = va_arg(ap,int*);
|
||||
#ifdef SQLITE_ALLOW_ROWID_IN_VIEW
|
||||
if( 0==*pVal ) sqlite3GlobalConfig.mNoVisibleRowid = TF_NoVisibleRowid;
|
||||
if( 1==*pVal ) sqlite3GlobalConfig.mNoVisibleRowid = 0;
|
||||
*pVal = (sqlite3GlobalConfig.mNoVisibleRowid==0);
|
||||
#else
|
||||
*pVal = 0;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
rc = SQLITE_ERROR;
|
||||
break;
|
||||
|
||||
+31
-2
@@ -469,8 +469,37 @@ static int lookupName(
|
||||
}
|
||||
}
|
||||
if( 0==cnt && VisibleRowid(pTab) ){
|
||||
/* pTab is a potential ROWID match. Keep track of it and match
|
||||
** the ROWID later if that seems appropriate. (Search for "cntTab"
|
||||
** to find related code.) Only allow a ROWID match if there is
|
||||
** a single ROWID match candidate.
|
||||
*/
|
||||
#ifdef SQLITE_ALLOW_ROWID_IN_VIEW
|
||||
/* In SQLITE_ALLOW_ROWID_IN_VIEW mode, allow a ROWID match
|
||||
** if there is a single VIEW candidate or if there is a single
|
||||
** non-VIEW candidate plus multiple VIEW candidates. In other
|
||||
** words non-VIEW candidate terms take precedence over VIEWs.
|
||||
*/
|
||||
if( cntTab==0
|
||||
|| (cntTab==1
|
||||
&& ALWAYS(pMatch!=0)
|
||||
&& ALWAYS(pMatch->pTab!=0)
|
||||
&& (pMatch->pTab->tabFlags & TF_Ephemeral)!=0
|
||||
&& (pTab->tabFlags & TF_Ephemeral)==0)
|
||||
){
|
||||
cntTab = 1;
|
||||
pMatch = pItem;
|
||||
}else{
|
||||
cntTab++;
|
||||
}
|
||||
#else
|
||||
/* The (much more common) non-SQLITE_ALLOW_ROWID_IN_VIEW case is
|
||||
** simpler since we require exactly one candidate, which will
|
||||
** always be a non-VIEW
|
||||
*/
|
||||
cntTab++;
|
||||
pMatch = pItem;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if( pMatch ){
|
||||
@@ -596,13 +625,13 @@ static int lookupName(
|
||||
** Perhaps the name is a reference to the ROWID
|
||||
*/
|
||||
if( cnt==0
|
||||
&& cntTab==1
|
||||
&& cntTab>=1
|
||||
&& pMatch
|
||||
&& (pNC->ncFlags & (NC_IdxExpr|NC_GenCol))==0
|
||||
&& sqlite3IsRowid(zCol)
|
||||
&& ALWAYS(VisibleRowid(pMatch->pTab) || pMatch->fg.isNestedFrom)
|
||||
){
|
||||
cnt = 1;
|
||||
cnt = cntTab;
|
||||
if( pMatch->fg.isNestedFrom==0 ) pExpr->iColumn = -1;
|
||||
pExpr->affExpr = SQLITE_AFF_INTEGER;
|
||||
}
|
||||
|
||||
+8
-9
@@ -1953,11 +1953,7 @@ static const char *columnTypeImpl(
|
||||
** data for the result-set column of the sub-select.
|
||||
*/
|
||||
if( iCol<pS->pEList->nExpr
|
||||
#ifdef SQLITE_ALLOW_ROWID_IN_VIEW
|
||||
&& iCol>=0
|
||||
#else
|
||||
&& ALWAYS(iCol>=0)
|
||||
#endif
|
||||
&& (!ViewCanHaveRowid || iCol>=0)
|
||||
){
|
||||
/* If iCol is less than zero, then the expression requests the
|
||||
** rowid of the sub-select or view. This expression is legal (see
|
||||
@@ -5874,7 +5870,8 @@ int sqlite3ExpandSubquery(Parse *pParse, SrcItem *pFrom){
|
||||
/* The usual case - do not allow ROWID on a subquery */
|
||||
pTab->tabFlags |= TF_Ephemeral | TF_NoVisibleRowid;
|
||||
#else
|
||||
pTab->tabFlags |= TF_Ephemeral; /* Legacy compatibility mode */
|
||||
/* Legacy compatibility mode */
|
||||
pTab->tabFlags |= TF_Ephemeral | sqlite3Config.mNoVisibleRowid;
|
||||
#endif
|
||||
return pParse->nErr ? SQLITE_ERROR : SQLITE_OK;
|
||||
}
|
||||
@@ -6142,7 +6139,7 @@ static int selectExpander(Walker *pWalker, Select *p){
|
||||
pNestedFrom = pFrom->pSelect->pEList;
|
||||
assert( pNestedFrom!=0 );
|
||||
assert( pNestedFrom->nExpr==pTab->nCol );
|
||||
assert( VisibleRowid(pTab)==0 );
|
||||
assert( VisibleRowid(pTab)==0 || ViewCanHaveRowid );
|
||||
}else{
|
||||
if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){
|
||||
continue;
|
||||
@@ -6174,7 +6171,8 @@ static int selectExpander(Walker *pWalker, Select *p){
|
||||
pUsing = 0;
|
||||
}
|
||||
|
||||
nAdd = pTab->nCol + (VisibleRowid(pTab) && (selFlags&SF_NestedFrom));
|
||||
nAdd = pTab->nCol;
|
||||
if( VisibleRowid(pTab) && (selFlags & SF_NestedFrom)!=0 ) nAdd++;
|
||||
for(j=0; j<nAdd; j++){
|
||||
const char *zName;
|
||||
struct ExprList_item *pX; /* Newly added ExprList term */
|
||||
@@ -6256,7 +6254,8 @@ static int selectExpander(Walker *pWalker, Select *p){
|
||||
pX = &pNew->a[pNew->nExpr-1];
|
||||
assert( pX->zEName==0 );
|
||||
if( (selFlags & SF_NestedFrom)!=0 && !IN_RENAME_OBJECT ){
|
||||
if( pNestedFrom ){
|
||||
if( pNestedFrom && (!ViewCanHaveRowid || j<pNestedFrom->nExpr) ){
|
||||
assert( j<pNestedFrom->nExpr );
|
||||
pX->zEName = sqlite3DbStrDup(db, pNestedFrom->a[j].zEName);
|
||||
testcase( pX->zEName==0 );
|
||||
}else{
|
||||
|
||||
@@ -12058,6 +12058,7 @@ static const char zOptions[] =
|
||||
" -newline SEP set output row separator. Default: '\\n'\n"
|
||||
" -nofollow refuse to open symbolic links to database files\n"
|
||||
" -nonce STRING set the safe-mode escape nonce\n"
|
||||
" -no-rowid-in-view Disable rowid-in-view using sqlite3_config()\n"
|
||||
" -nullvalue TEXT set text string for NULL values. Default ''\n"
|
||||
" -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
|
||||
" -pcachetrace trace all page cache operations\n"
|
||||
@@ -12348,6 +12349,10 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
|
||||
stdin_is_interactive = 0;
|
||||
}else if( cli_strcmp(z,"-utf8")==0 ){
|
||||
}else if( cli_strcmp(z,"-no-utf8")==0 ){
|
||||
}else if( cli_strcmp(z,"-no-rowid-in-view")==0 ){
|
||||
int val = 0;
|
||||
sqlite3_config(SQLITE_CONFIG_ROWID_IN_VIEW, &val);
|
||||
assert( val==0 );
|
||||
}else if( cli_strcmp(z,"-heap")==0 ){
|
||||
#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
|
||||
const char *zSize;
|
||||
@@ -12623,6 +12628,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
|
||||
/* already handled */
|
||||
}else if( cli_strcmp(z,"-no-utf8")==0 ){
|
||||
/* already handled */
|
||||
}else if( cli_strcmp(z,"-no-rowid-in-view")==0 ){
|
||||
/* already handled */
|
||||
}else if( cli_strcmp(z,"-heap")==0 ){
|
||||
i++;
|
||||
}else if( cli_strcmp(z,"-pagecache")==0 ){
|
||||
|
||||
@@ -2143,6 +2143,22 @@ struct sqlite3_mem_methods {
|
||||
** configuration setting is never used, then the default maximum is determined
|
||||
** by the [SQLITE_MEMDB_DEFAULT_MAXSIZE] compile-time option. If that
|
||||
** compile-time option is not set, then the default maximum is 1073741824.
|
||||
**
|
||||
** [[SQLITE_CONFIG_ROWID_IN_VIEW]]
|
||||
** <dt>SQLITE_CONFIG_ROWID_IN_VIEW
|
||||
** <dd>The SQLITE_CONFIG_ROWID_IN_VIEW option enables or disables the ability
|
||||
** for VIEWs to have a ROWID. The capability can only be enabled if SQLite is
|
||||
** compiled with -DSQLITE_ALLOW_ROWID_IN_VIEW, in which case the capability
|
||||
** defaults to on. This configuration option queries the current setting or
|
||||
** changes the setting to off or on. The argument is a pointer to an integer.
|
||||
** If that integer initially holds a value of 1, then the ability for VIEWs to
|
||||
** have ROWIDs is activated. If the integer initially holds zero, then the
|
||||
** ability is deactivated. Any other initial value for the integer leaves the
|
||||
** setting unchanged. After changes, if any, the integer is written with
|
||||
** a 1 or 0, if the ability for VIEWs to have ROWIDs is on or off. If SQLite
|
||||
** is compiled without -DSQLITE_ALLOW_ROWID_IN_VIEW (which is the usual and
|
||||
** recommended case) then the integer is always filled with zero, regardless
|
||||
** if its initial value.
|
||||
** </dl>
|
||||
*/
|
||||
#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
|
||||
@@ -2174,6 +2190,7 @@ struct sqlite3_mem_methods {
|
||||
#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */
|
||||
#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */
|
||||
#define SQLITE_CONFIG_MEMDB_MAXSIZE 29 /* sqlite3_int64 */
|
||||
#define SQLITE_CONFIG_ROWID_IN_VIEW 30 /* int* */
|
||||
|
||||
/*
|
||||
** CAPI3REF: Database Connection Configuration Options
|
||||
|
||||
@@ -2535,6 +2535,15 @@ struct Table {
|
||||
#define HasRowid(X) (((X)->tabFlags & TF_WithoutRowid)==0)
|
||||
#define VisibleRowid(X) (((X)->tabFlags & TF_NoVisibleRowid)==0)
|
||||
|
||||
/* Macro is true if the SQLITE_ALLOW_ROWID_IN_VIEW (mis-)feature is
|
||||
** available. By default, this macro is false
|
||||
*/
|
||||
#ifndef SQLITE_ALLOW_ROWID_IN_VIEW
|
||||
# define ViewCanHaveRowid 0
|
||||
#else
|
||||
# define ViewCanHaveRowid (sqlite3Config.mNoVisibleRowid==0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Each foreign key constraint is an instance of the following structure.
|
||||
**
|
||||
@@ -4253,6 +4262,11 @@ struct Sqlite3Config {
|
||||
#endif
|
||||
#ifndef SQLITE_UNTESTABLE
|
||||
int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */
|
||||
#endif
|
||||
#ifdef SQLITE_ALLOW_ROWID_IN_VIEW
|
||||
u32 mNoVisibleRowid; /* TF_NoVisibleRowid if the ROWID_IN_VIEW
|
||||
** feature is disabled. 0 if rowids can
|
||||
** occur in views. */
|
||||
#endif
|
||||
int bLocaltimeFault; /* True to fail localtime() calls */
|
||||
int (*xAltLocaltime)(const void*,void*); /* Alternative localtime() routine */
|
||||
|
||||
@@ -59,6 +59,14 @@ static void set_options(Tcl_Interp *interp){
|
||||
Tcl_SetVar2(interp, "sqlite_options", "rowid32", "0", TCL_GLOBAL_ONLY);
|
||||
#endif
|
||||
|
||||
#ifdef SQLITE_ALLOW_ROWID_IN_VIEW
|
||||
Tcl_SetVar2(
|
||||
interp, "sqlite_options", "allow_rowid_in_view", "1", TCL_GLOBAL_ONLY);
|
||||
#else
|
||||
Tcl_SetVar2(
|
||||
interp, "sqlite_options", "allow_rowid_in_view", "0", TCL_GLOBAL_ONLY);
|
||||
#endif
|
||||
|
||||
#ifdef SQLITE_CASE_SENSITIVE_LIKE
|
||||
Tcl_SetVar2(interp, "sqlite_options","casesensitivelike","1",TCL_GLOBAL_ONLY);
|
||||
#else
|
||||
|
||||
@@ -296,6 +296,14 @@ static char *fuzz_invariant_sql(sqlite3_stmt *pStmt, int iCnt){
|
||||
** WHERE clause. */
|
||||
continue;
|
||||
}
|
||||
#ifdef SQLITE_ALLOW_ROWID_IN_VIEW
|
||||
if( sqlite3_strlike("%rowid%",zColName,0)==0
|
||||
|| sqlite3_strlike("%oid%",zColName,0)==0
|
||||
){
|
||||
/* ROWID values are unreliable if SQLITE_ALLOW_ROWID_IN_VIEW is used */
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
for(j=0; j<i; j++){
|
||||
const char *zPrior = sqlite3_column_name(pBase, j);
|
||||
if( sqlite3_stricmp(zPrior, zColName)==0 ) break;
|
||||
|
||||
+6
-2
@@ -370,8 +370,12 @@ do_execsql_test 9.1 {
|
||||
ANALYZE sqlite_schema;
|
||||
INSERT INTO sqlite_stat1 VALUES('t1','t1x1','648 324 81 81 81 81 81 81 81081 81 81 81');
|
||||
ANALYZE sqlite_schema;
|
||||
SELECT a FROM (SELECT a FROM t1 NATURAL LEFT JOIN t1) NATURAL LEFT JOIN t1 WHERE (rowid,1)<=(5,0);
|
||||
} {1}
|
||||
}
|
||||
do_catchsql_test 9.2 {
|
||||
SELECT a FROM
|
||||
(SELECT a FROM t1 NATURAL LEFT JOIN t1) NATURAL LEFT JOIN t1
|
||||
WHERE (rowid,1)<=(5,0);
|
||||
} {0 1}
|
||||
|
||||
# 2022-03-02 https://sqlite.org/forum/info/50a1bbe08ce4c29c
|
||||
# Bloom-filter pulldown is incompatible with skip-scan.
|
||||
|
||||
+3
-3
@@ -201,13 +201,13 @@ do_execsql_test 9.0 {
|
||||
|
||||
do_catchsql_test 9.1 {
|
||||
SELECT rowid FROM wo1, x1, x2;
|
||||
} {1 {no such column: rowid}}
|
||||
} {1 {ambiguous column name: rowid}}
|
||||
do_catchsql_test 9.2 {
|
||||
SELECT rowid FROM wo1, (x1, x2);
|
||||
} {1 {no such column: rowid}}
|
||||
} {1 {ambiguous column name: rowid}}
|
||||
do_catchsql_test 9.3 {
|
||||
SELECT rowid FROM wo1 JOIN (x1 JOIN x2);
|
||||
} {1 {no such column: rowid}}
|
||||
} {1 {ambiguous column name: rowid}}
|
||||
do_catchsql_test 9.4 {
|
||||
SELECT a FROM wo1, x1, x2;
|
||||
} {1 {ambiguous column name: a}}
|
||||
|
||||
+22
-7
@@ -54,19 +54,34 @@ do_test misc2-2.1 {
|
||||
}
|
||||
} {}
|
||||
ifcapable subquery {
|
||||
do_catchsql_test misc2-2.2 {
|
||||
SELECT rowid, * FROM (SELECT * FROM t1, t2);
|
||||
} {1 {no such column: rowid}}
|
||||
ifcapable allow_rowid_in_view {
|
||||
do_catchsql_test misc2-2.2 {
|
||||
SELECT rowid, * FROM (SELECT * FROM t1, t2);
|
||||
} {0 {{} 1 2 3 7 8 9}}
|
||||
} else {
|
||||
do_catchsql_test misc2-2.2 {
|
||||
SELECT rowid, * FROM (SELECT * FROM t1, t2);
|
||||
} {1 {no such column: rowid}}
|
||||
}
|
||||
do_catchsql_test misc2-2.2b {
|
||||
SELECT 'rowid', * FROM (SELECT * FROM t1, t2);
|
||||
} {0 {rowid 1 2 3 7 8 9}}
|
||||
}
|
||||
|
||||
ifcapable view {
|
||||
do_catchsql_test misc2-2.3 {
|
||||
CREATE VIEW v1 AS SELECT * FROM t1, t2;
|
||||
SELECT rowid, * FROM v1;
|
||||
} {1 {no such column: rowid}}
|
||||
ifcapable allow_rowid_in_view {
|
||||
do_catchsql_test misc2-2.3 {
|
||||
CREATE VIEW v1 AS SELECT * FROM t1, t2;
|
||||
SELECT rowid, * FROM v1;
|
||||
} {0 {{} 1 2 3 7 8 9}}
|
||||
} else {
|
||||
do_catchsql_test misc2-2.3 {
|
||||
CREATE VIEW v1 AS SELECT * FROM t1, t2;
|
||||
SELECT rowid, * FROM v1;
|
||||
} {1 {no such column: rowid}}
|
||||
}
|
||||
|
||||
|
||||
do_catchsql_test misc2-2.3b {
|
||||
SELECT 'rowid', * FROM v1;
|
||||
} {0 {rowid 1 2 3 7 8 9}}
|
||||
|
||||
+32
-11
@@ -212,17 +212,38 @@ do_execsql_test 10.2 {
|
||||
END;
|
||||
}
|
||||
|
||||
do_catchsql_test 10.3a {
|
||||
INSERT INTO t1(a, b) VALUES(1234, 5678) RETURNING rowid;
|
||||
} {1 {no such column: new.rowid}}
|
||||
|
||||
do_catchsql_test 10.3b {
|
||||
UPDATE t1 SET a='z' WHERE b='y' RETURNING rowid;
|
||||
} {1 {no such column: new.rowid}}
|
||||
|
||||
do_execsql_test 10.4 {
|
||||
SELECT * FROM log;
|
||||
} {}
|
||||
ifcapable !allow_rowid_in_view {
|
||||
do_catchsql_test 10.3a {
|
||||
INSERT INTO t1(a, b) VALUES(1234, 5678) RETURNING rowid;
|
||||
} {1 {no such column: new.rowid}}
|
||||
|
||||
do_catchsql_test 10.3b {
|
||||
UPDATE t1 SET a='z' WHERE b='y' RETURNING rowid;
|
||||
} {1 {no such column: new.rowid}}
|
||||
|
||||
do_execsql_test 10.4 {
|
||||
SELECT * FROM log;
|
||||
} {}
|
||||
} else {
|
||||
# Note: The values returned by the RETURNING clauses of the following
|
||||
# two statements are the rowid columns of views. These values are not
|
||||
# well defined, so the INSERT returns -1, and the UPDATE returns 1, 2
|
||||
# and 3. These match the values used for new.rowid expressions, but
|
||||
# not much else.
|
||||
do_catchsql_test 10.3a {
|
||||
INSERT INTO t1(a, b) VALUES(1234, 5678) RETURNING rowid;
|
||||
} {0 -1}
|
||||
|
||||
do_catchsql_test 10.3b {
|
||||
UPDATE t1 SET a='z' WHERE b='y' RETURNING rowid;
|
||||
} {0 {1 2 3}}
|
||||
|
||||
do_execsql_test 10.4 {
|
||||
SELECT * FROM log;
|
||||
} {
|
||||
insert -1 1234 5678 update 1 z y update 2 z y update 3 z y
|
||||
}
|
||||
}
|
||||
|
||||
# 2021-04-27 dbsqlfuzz 78b9400770ef8cc7d9427dfba26f4fcf46ea7dc2
|
||||
# Returning clauses on TEMP tables with triggers.
|
||||
|
||||
+23
-10
@@ -803,18 +803,31 @@ do_execsql_test 16.0 {
|
||||
INSERT INTO t3(rowid, z) VALUES(3, 3);
|
||||
}
|
||||
|
||||
do_execsql_test 16.1 { SELECT rowid FROM t1, t2; } {1}
|
||||
do_execsql_test 16.2 { SELECT rowid FROM t1, v1; } {1}
|
||||
do_execsql_test 16.3 { SELECT rowid FROM t3, v1; } {3}
|
||||
do_execsql_test 16.4 { SELECT rowid FROM t3, (SELECT 123); } {3}
|
||||
ifcapable allow_rowid_in_view {
|
||||
set nosuch "1 {no such column: rowid}"
|
||||
do_execsql_test 16.1 { SELECT rowid FROM t1, t2; } {1}
|
||||
do_catchsql_test 16.2 { SELECT rowid FROM t1, v1; } $nosuch
|
||||
do_catchsql_test 16.3 { SELECT rowid FROM t3, v1; } $nosuch
|
||||
do_catchsql_test 16.4 { SELECT rowid FROM t3, (SELECT 123); } $nosuch
|
||||
|
||||
do_execsql_test 16.5 { SELECT rowid FROM t2, t1; } {1}
|
||||
do_execsql_test 16.6 { SELECT rowid FROM v1, t1; } {1}
|
||||
do_execsql_test 16.7 { SELECT rowid FROM v1, t3; } {3}
|
||||
do_execsql_test 16.8 { SELECT rowid FROM (SELECT 123), t3; } {3}
|
||||
|
||||
do_catchsql_test 16.5 { SELECT rowid FROM t1, t3; } {1 {no such column: rowid}}
|
||||
do_execsql_test 16.5 { SELECT rowid FROM t2, t1; } {1}
|
||||
do_catchsql_test 16.6 { SELECT rowid FROM v1, t1; } $nosuch
|
||||
do_catchsql_test 16.7 { SELECT rowid FROM v1, t3; } $nosuch
|
||||
do_execsql_test 16.8 { SELECT rowid FROM (SELECT 123), t3; } {3}
|
||||
} else {
|
||||
do_execsql_test 16.1 { SELECT rowid FROM t1, t2; } {1}
|
||||
do_execsql_test 16.2 { SELECT rowid FROM t1, v1; } {1}
|
||||
do_execsql_test 16.3 { SELECT rowid FROM t3, v1; } {3}
|
||||
do_execsql_test 16.4 { SELECT rowid FROM t3, (SELECT 123); } {3}
|
||||
|
||||
do_execsql_test 16.5 { SELECT rowid FROM t2, t1; } {1}
|
||||
do_execsql_test 16.6 { SELECT rowid FROM v1, t1; } {1}
|
||||
do_execsql_test 16.7 { SELECT rowid FROM v1, t3; } {3}
|
||||
do_execsql_test 16.8 { SELECT rowid FROM (SELECT 123), t3; } {3}
|
||||
}
|
||||
|
||||
do_catchsql_test 16.9 {
|
||||
SELECT rowid FROM t1, t3;
|
||||
} {1 {ambiguous column name: rowid}}
|
||||
|
||||
finish_test
|
||||
|
||||
+21
-6
@@ -242,12 +242,27 @@ do_execsql_test 4.1 {
|
||||
END;
|
||||
}
|
||||
|
||||
do_catchsql_test 4.2 {
|
||||
DELETE FROM v1 WHERE rowid=1;
|
||||
} {1 {no such column: rowid}}
|
||||
ifcapable !allow_rowid_in_view {
|
||||
do_catchsql_test 4.2 {
|
||||
DELETE FROM v1 WHERE rowid=1;
|
||||
} {1 {no such column: rowid}}
|
||||
|
||||
do_catchsql_test 4.3 {
|
||||
UPDATE v1 SET a=b WHERE rowid=2;
|
||||
} {1 {no such column: rowid}}
|
||||
do_catchsql_test 4.3 {
|
||||
UPDATE v1 SET a=b WHERE rowid=2;
|
||||
} {1 {no such column: rowid}}
|
||||
} else {
|
||||
do_execsql_test 4.2a {
|
||||
DELETE FROM log;
|
||||
}
|
||||
do_catchsql_test 4.2 {
|
||||
DELETE FROM v1 WHERE rowid=1;
|
||||
} {0 {}}
|
||||
do_catchsql_test 4.3 {
|
||||
UPDATE v1 SET a=b WHERE rowid=2;
|
||||
} {0 {}}
|
||||
do_execsql_test 4.3b {
|
||||
SELECT * FROM log;
|
||||
}
|
||||
}
|
||||
|
||||
finish_test
|
||||
|
||||
+1
-1
@@ -351,7 +351,7 @@ do_catchsql_test 5.30 {
|
||||
SELECT * FROM (t1 NATURAL JOIN pragma_table_xinfo('t1_a') NATURAL JOIN t3) t1
|
||||
NATURAL JOIN t2 NATURAL JOIN t3
|
||||
WHERE rowid ISNULL>0 AND 0%y;
|
||||
} {1 {no such column: rowid}}
|
||||
} {1 {ambiguous column name: rowid}}
|
||||
}
|
||||
|
||||
reset_db
|
||||
|
||||
Reference in New Issue
Block a user