mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-05 15:55:57 +03:00
Organize the various flag bits of the ExprList_item object into a substructure
so that the whole lot can be copied all at once. Faster and smaller code. FossilOrigin-Name: 5341d4bbe9a943f9cdbbdea829e18f108e98972ebb706396c50fc62fcc6a6328
This commit is contained in:
32
manifest
32
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Merge\strunk\sfixes\sinto\sthe\sright-join\sbranch.
|
C Organize\sthe\svarious\sflag\sbits\sof\sthe\sExprList_item\sobject\sinto\sa\ssubstructure\nso\sthat\sthe\swhole\slot\scan\sbe\scopied\sall\sat\sonce.\s\sFaster\sand\ssmaller\scode.
|
||||||
D 2022-05-02T20:14:26.269
|
D 2022-05-02T20:49:30.890
|
||||||
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
|
||||||
@@ -486,7 +486,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca
|
|||||||
F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
|
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 9395ece9850ad57c6fbb453aeb5185be4bae3b159c4b37611425c565124ee849
|
F src/alter.c d8872f9d1863d8e31c37475e318de746e1b5ca57c0e477e35042a9ebbb6e0298
|
||||||
F src/analyze.c aabdf3769c7fd9954a8ec508eb7041ae174b66f88d12c47199fabbea9a646467
|
F src/analyze.c aabdf3769c7fd9954a8ec508eb7041ae174b66f88d12c47199fabbea9a646467
|
||||||
F src/attach.c 4431f82f0247bf3aaf91589acafdff77d1882235c95407b36da1585c765fbbc8
|
F src/attach.c 4431f82f0247bf3aaf91589acafdff77d1882235c95407b36da1585c765fbbc8
|
||||||
F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf
|
F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf
|
||||||
@@ -496,7 +496,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
|
|||||||
F src/btree.c df695e953c2ce78ce4878ee5016751df9bc9a921dc0500a0f53ab3bb3196e505
|
F src/btree.c df695e953c2ce78ce4878ee5016751df9bc9a921dc0500a0f53ab3bb3196e505
|
||||||
F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22
|
F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22
|
||||||
F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e
|
F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e
|
||||||
F src/build.c e8e776b52bc145cbf4e9fb88b99830083880fc2b174c2f96518fff15cbc72396
|
F src/build.c 23f874642825d7eaaeeb7a3281b2b1a75e1d4c4dd9ae4dceddcd908266634214
|
||||||
F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c
|
F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c
|
||||||
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
||||||
F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad
|
F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad
|
||||||
@@ -504,7 +504,7 @@ F src/date.c 15082566229d4b1e5f24fdb490bf9bcc68824b911d70e3573ef075a1b9e2d26f
|
|||||||
F src/dbpage.c 90661a87e1db8bfbc8d2ebbdcd3749651ddb287c555c07a28fb17c7c591ffb68
|
F src/dbpage.c 90661a87e1db8bfbc8d2ebbdcd3749651ddb287c555c07a28fb17c7c591ffb68
|
||||||
F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d
|
F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d
|
||||||
F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce
|
F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce
|
||||||
F src/expr.c 495ff0219a5aa2161d33e10f20912ce7dcd55fc13459e0dc48abae52934bfadf
|
F src/expr.c d955e8954e03e637c19033241806b04f6a937d0657f6261f2d9e4cdfe674b478
|
||||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||||
F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e
|
F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e
|
||||||
F src/func.c a3407a6fbb0d4088d8d502e46f0ace63e0aeae7467ae23a9ca9815bbf9239761
|
F src/func.c a3407a6fbb0d4088d8d502e46f0ace63e0aeae7467ae23a9ca9815bbf9239761
|
||||||
@@ -551,14 +551,14 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
|
|||||||
F src/prepare.c fd940149c691684e7c1073c3787a7170e44852b02d1275d2e30a5b58e89cfcaf
|
F src/prepare.c fd940149c691684e7c1073c3787a7170e44852b02d1275d2e30a5b58e89cfcaf
|
||||||
F src/printf.c 512574910a45341c8ad244bd3d4939968ebdfde215645b676fff01cc46e90757
|
F src/printf.c 512574910a45341c8ad244bd3d4939968ebdfde215645b676fff01cc46e90757
|
||||||
F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c
|
F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c
|
||||||
F src/resolve.c b14bf8a4a1e3cb01eefc48a7e4129b15bb6a18b56d16dd4eca676586464337d0
|
F src/resolve.c e9ee235c4151d2b7fa47435a219bfd30bf516a804d2f004639858087ebf3137b
|
||||||
F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
|
F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
|
||||||
F src/select.c 0c54305ca957ffe188dd5b042b81b44e0aeba3f3bcb73df81ddd740908655ff7
|
F src/select.c 727e718482269f24e6db2850074498b14949ecf0778f065580f9ab0f2e76675e
|
||||||
F src/shell.c.in ae0a6fae983caac6f8c824733f0599dfdf7b3a7e8efdef3cb5e3ab2e457ffc35
|
F src/shell.c.in ae0a6fae983caac6f8c824733f0599dfdf7b3a7e8efdef3cb5e3ab2e457ffc35
|
||||||
F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17
|
F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17
|
||||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||||
F src/sqlite3ext.h f49e28c25bd941e79794db5415fdf7b202deb3bc072ed6f1ed273d578703684e
|
F src/sqlite3ext.h f49e28c25bd941e79794db5415fdf7b202deb3bc072ed6f1ed273d578703684e
|
||||||
F src/sqliteInt.h 850fea2046c4d333bf328164fd5bc19a2a04955fb4b2abc361317f07820f4de1
|
F src/sqliteInt.h 7c8146fc57f2e009152eb93ad41eab28490f9c31691559f281a80f9077ec1f2a
|
||||||
F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
|
F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
|
||||||
F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0
|
F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0
|
||||||
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
|
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
|
||||||
@@ -618,8 +618,8 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394
|
|||||||
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
||||||
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
||||||
F src/tokenize.c a38f52058b517929e264094abd0b5fd1e8e145a1aa43bc6f6a72ae5218f96c98
|
F src/tokenize.c a38f52058b517929e264094abd0b5fd1e8e145a1aa43bc6f6a72ae5218f96c98
|
||||||
F src/treeview.c e33a0fa956469a7ba96f586beb12e601fb60412d71aca7a8d152e28b4cf86d7c
|
F src/treeview.c 4153f2f044d13a3216e64271dfd1e59a3fa40222a45e6da248708088634e6f06
|
||||||
F src/trigger.c 372ada38f667c6823a3db15749eb668338e65c793394e55a37e56a489f2d1b55
|
F src/trigger.c 4fe4c1ac811755aff49d669d2e52e414eb5dfa6e172e849ab7b6825e70a571c0
|
||||||
F src/update.c 2cfaded82ca80ff56afb8c3ae5e88284e0824bfd86119827cc22481959f96f92
|
F src/update.c 2cfaded82ca80ff56afb8c3ae5e88284e0824bfd86119827cc22481959f96f92
|
||||||
F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937
|
F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937
|
||||||
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
|
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
|
||||||
@@ -640,11 +640,11 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
|
|||||||
F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d
|
F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d
|
||||||
F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
|
F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
|
||||||
F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
|
F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
|
||||||
F src/where.c 43085b3a4ce2e56315fabb0b240a56e76667d9e03c79f287695bcae7b76152d5
|
F src/where.c eb86c068e8e24a1e0a650beb20573bd5648fe1584f11d5bdffaf17ec3de52b5d
|
||||||
F src/whereInt.h 4db5a877a9d1f38b5c928c1c84297c07f30b9a3bc1f5f66214cf1a8ef90a0556
|
F src/whereInt.h 4db5a877a9d1f38b5c928c1c84297c07f30b9a3bc1f5f66214cf1a8ef90a0556
|
||||||
F src/wherecode.c dfc3fbb6b7cb14a5a8e022d22f4d2c6004807e458a7cd8278194fbef7c1670e1
|
F src/wherecode.c dfc3fbb6b7cb14a5a8e022d22f4d2c6004807e458a7cd8278194fbef7c1670e1
|
||||||
F src/whereexpr.c 174d4ad5be165c610c907abb779ef4a97974d22b84e1ce7898d2d9f6947249e5
|
F src/whereexpr.c e036477ac8424de50ae5b36a71103405d3f86b33ba11125ec7a2a99d501b0622
|
||||||
F src/window.c 924e04fd6e0e113d4dba18b78d43fcb8e42b8ebffc8fc728da52cf3ab014cf3c
|
F src/window.c fff1b51757438c664e471d5184634e48dcdf8ea34b640f3b1b0810b1e06de18c
|
||||||
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
||||||
F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
|
F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
|
||||||
F test/affinity3.test b5c19d504dec222c0dc66642673d23dce915d35737b68e74d9f237b80493eb53
|
F test/affinity3.test b5c19d504dec222c0dc66642673d23dce915d35737b68e74d9f237b80493eb53
|
||||||
@@ -1952,8 +1952,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 158b80bed61ade793ccfd979f26a5231fabc8c14697ca0141bba61bc13e3b2ba 053cf45ecaa7eac8cc64c7b2672807f736a45575a84b426263b2e1feb060b401
|
P e01f4c05c21e89dcc7985e00874f288d9ba5d5d932f7284f8d970bd3145ac0c2
|
||||||
R 4b24813532984e0e78854b2b4a0d231e
|
R 4390ecbce69667e0c74ca1d6573c2546
|
||||||
U drh
|
U drh
|
||||||
Z bcd7e0add8b57bb93082cd41d63cfefe
|
Z ec5e63ee49f22b25e0961585c1886f82
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@@ -1 +1 @@
|
|||||||
e01f4c05c21e89dcc7985e00874f288d9ba5d5d932f7284f8d970bd3145ac0c2
|
5341d4bbe9a943f9cdbbdea829e18f108e98972ebb706396c50fc62fcc6a6328
|
@@ -880,7 +880,7 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){
|
|||||||
if( ALWAYS(p->pEList) ){
|
if( ALWAYS(p->pEList) ){
|
||||||
ExprList *pList = p->pEList;
|
ExprList *pList = p->pEList;
|
||||||
for(i=0; i<pList->nExpr; i++){
|
for(i=0; i<pList->nExpr; i++){
|
||||||
if( pList->a[i].zEName && pList->a[i].eEName==ENAME_NAME ){
|
if( pList->a[i].zEName && pList->a[i].fg.eEName==ENAME_NAME ){
|
||||||
sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName);
|
sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -929,7 +929,7 @@ void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){
|
|||||||
sWalker.xExprCallback = renameUnmapExprCb;
|
sWalker.xExprCallback = renameUnmapExprCb;
|
||||||
sqlite3WalkExprList(&sWalker, pEList);
|
sqlite3WalkExprList(&sWalker, pEList);
|
||||||
for(i=0; i<pEList->nExpr; i++){
|
for(i=0; i<pEList->nExpr; i++){
|
||||||
if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) ){
|
if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME) ){
|
||||||
sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName);
|
sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1087,7 +1087,7 @@ static void renameColumnElistNames(
|
|||||||
int i;
|
int i;
|
||||||
for(i=0; i<pEList->nExpr; i++){
|
for(i=0; i<pEList->nExpr; i++){
|
||||||
const char *zName = pEList->a[i].zEName;
|
const char *zName = pEList->a[i].zEName;
|
||||||
if( ALWAYS(pEList->a[i].eEName==ENAME_NAME)
|
if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME)
|
||||||
&& ALWAYS(zName!=0)
|
&& ALWAYS(zName!=0)
|
||||||
&& 0==sqlite3_stricmp(zName, zOld)
|
&& 0==sqlite3_stricmp(zName, zOld)
|
||||||
){
|
){
|
||||||
|
10
src/build.c
10
src/build.c
@@ -1890,7 +1890,7 @@ void sqlite3AddPrimaryKey(
|
|||||||
pTab->keyConf = (u8)onError;
|
pTab->keyConf = (u8)onError;
|
||||||
assert( autoInc==0 || autoInc==1 );
|
assert( autoInc==0 || autoInc==1 );
|
||||||
pTab->tabFlags |= autoInc*TF_Autoincrement;
|
pTab->tabFlags |= autoInc*TF_Autoincrement;
|
||||||
if( pList ) pParse->iPkSortOrder = pList->a[0].sortFlags;
|
if( pList ) pParse->iPkSortOrder = pList->a[0].fg.sortFlags;
|
||||||
(void)sqlite3HasExplicitNulls(pParse, pList);
|
(void)sqlite3HasExplicitNulls(pParse, pList);
|
||||||
}else if( autoInc ){
|
}else if( autoInc ){
|
||||||
#ifndef SQLITE_OMIT_AUTOINCREMENT
|
#ifndef SQLITE_OMIT_AUTOINCREMENT
|
||||||
@@ -2384,7 +2384,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){
|
|||||||
if( IN_RENAME_OBJECT ){
|
if( IN_RENAME_OBJECT ){
|
||||||
sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey);
|
sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey);
|
||||||
}
|
}
|
||||||
pList->a[0].sortFlags = pParse->iPkSortOrder;
|
pList->a[0].fg.sortFlags = pParse->iPkSortOrder;
|
||||||
assert( pParse->pNewTable==pTab );
|
assert( pParse->pNewTable==pTab );
|
||||||
pTab->iPKey = -1;
|
pTab->iPKey = -1;
|
||||||
sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0,
|
sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0,
|
||||||
@@ -3872,8 +3872,8 @@ int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){
|
|||||||
if( pList ){
|
if( pList ){
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<pList->nExpr; i++){
|
for(i=0; i<pList->nExpr; i++){
|
||||||
if( pList->a[i].bNulls ){
|
if( pList->a[i].fg.bNulls ){
|
||||||
u8 sf = pList->a[i].sortFlags;
|
u8 sf = pList->a[i].fg.sortFlags;
|
||||||
sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s",
|
sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s",
|
||||||
(sf==0 || sf==3) ? "FIRST" : "LAST"
|
(sf==0 || sf==3) ? "FIRST" : "LAST"
|
||||||
);
|
);
|
||||||
@@ -4226,7 +4226,7 @@ void sqlite3CreateIndex(
|
|||||||
goto exit_create_index;
|
goto exit_create_index;
|
||||||
}
|
}
|
||||||
pIndex->azColl[i] = zColl;
|
pIndex->azColl[i] = zColl;
|
||||||
requestedSortOrder = pListItem->sortFlags & sortOrderMask;
|
requestedSortOrder = pListItem->fg.sortFlags & sortOrderMask;
|
||||||
pIndex->aSortOrder[i] = (u8)requestedSortOrder;
|
pIndex->aSortOrder[i] = (u8)requestedSortOrder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
32
src/expr.c
32
src/expr.c
@@ -1628,14 +1628,8 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, const ExprList *p, int flags){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName);
|
pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName);
|
||||||
pItem->sortFlags = pOldItem->sortFlags;
|
pItem->fg = pOldItem->fg;
|
||||||
pItem->eEName = pOldItem->eEName;
|
pItem->fg.done = 0;
|
||||||
pItem->done = 0;
|
|
||||||
pItem->bNulls = pOldItem->bNulls;
|
|
||||||
pItem->bUsed = pOldItem->bUsed;
|
|
||||||
pItem->bUsingTerm = pOldItem->bUsingTerm;
|
|
||||||
pItem->bSorterRef = pOldItem->bSorterRef;
|
|
||||||
pItem->bNoExpand = pOldItem->bNoExpand;
|
|
||||||
pItem->u = pOldItem->u;
|
pItem->u = pOldItem->u;
|
||||||
}
|
}
|
||||||
return pNew;
|
return pNew;
|
||||||
@@ -1935,16 +1929,16 @@ void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int eNulls){
|
|||||||
);
|
);
|
||||||
|
|
||||||
pItem = &p->a[p->nExpr-1];
|
pItem = &p->a[p->nExpr-1];
|
||||||
assert( pItem->bNulls==0 );
|
assert( pItem->fg.bNulls==0 );
|
||||||
if( iSortOrder==SQLITE_SO_UNDEFINED ){
|
if( iSortOrder==SQLITE_SO_UNDEFINED ){
|
||||||
iSortOrder = SQLITE_SO_ASC;
|
iSortOrder = SQLITE_SO_ASC;
|
||||||
}
|
}
|
||||||
pItem->sortFlags = (u8)iSortOrder;
|
pItem->fg.sortFlags = (u8)iSortOrder;
|
||||||
|
|
||||||
if( eNulls!=SQLITE_SO_UNDEFINED ){
|
if( eNulls!=SQLITE_SO_UNDEFINED ){
|
||||||
pItem->bNulls = 1;
|
pItem->fg.bNulls = 1;
|
||||||
if( iSortOrder!=eNulls ){
|
if( iSortOrder!=eNulls ){
|
||||||
pItem->sortFlags |= KEYINFO_ORDER_BIGNULL;
|
pItem->fg.sortFlags |= KEYINFO_ORDER_BIGNULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1970,7 +1964,7 @@ void sqlite3ExprListSetName(
|
|||||||
assert( pList->nExpr>0 );
|
assert( pList->nExpr>0 );
|
||||||
pItem = &pList->a[pList->nExpr-1];
|
pItem = &pList->a[pList->nExpr-1];
|
||||||
assert( pItem->zEName==0 );
|
assert( pItem->zEName==0 );
|
||||||
assert( pItem->eEName==ENAME_NAME );
|
assert( pItem->fg.eEName==ENAME_NAME );
|
||||||
pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n);
|
pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n);
|
||||||
if( dequote ){
|
if( dequote ){
|
||||||
/* If dequote==0, then pName->z does not point to part of a DDL
|
/* If dequote==0, then pName->z does not point to part of a DDL
|
||||||
@@ -2005,7 +1999,7 @@ void sqlite3ExprListSetSpan(
|
|||||||
assert( pList->nExpr>0 );
|
assert( pList->nExpr>0 );
|
||||||
if( pItem->zEName==0 ){
|
if( pItem->zEName==0 ){
|
||||||
pItem->zEName = sqlite3DbSpanDup(db, zStart, zEnd);
|
pItem->zEName = sqlite3DbSpanDup(db, zStart, zEnd);
|
||||||
pItem->eEName = ENAME_SPAN;
|
pItem->fg.eEName = ENAME_SPAN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4831,7 +4825,9 @@ int sqlite3ExprCodeRunJustOnce(
|
|||||||
struct ExprList_item *pItem;
|
struct ExprList_item *pItem;
|
||||||
int i;
|
int i;
|
||||||
for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){
|
for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){
|
||||||
if( pItem->reusable && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0 ){
|
if( pItem->fg.reusable
|
||||||
|
&& sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0
|
||||||
|
){
|
||||||
return pItem->u.iConstExprReg;
|
return pItem->u.iConstExprReg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4854,7 +4850,7 @@ int sqlite3ExprCodeRunJustOnce(
|
|||||||
p = sqlite3ExprListAppend(pParse, p, pExpr);
|
p = sqlite3ExprListAppend(pParse, p, pExpr);
|
||||||
if( p ){
|
if( p ){
|
||||||
struct ExprList_item *pItem = &p->a[p->nExpr-1];
|
struct ExprList_item *pItem = &p->a[p->nExpr-1];
|
||||||
pItem->reusable = regDest<0;
|
pItem->fg.reusable = regDest<0;
|
||||||
if( regDest<0 ) regDest = ++pParse->nMem;
|
if( regDest<0 ) regDest = ++pParse->nMem;
|
||||||
pItem->u.iConstExprReg = regDest;
|
pItem->u.iConstExprReg = regDest;
|
||||||
}
|
}
|
||||||
@@ -4988,7 +4984,7 @@ int sqlite3ExprCodeExprList(
|
|||||||
for(pItem=pList->a, i=0; i<n; i++, pItem++){
|
for(pItem=pList->a, i=0; i<n; i++, pItem++){
|
||||||
Expr *pExpr = pItem->pExpr;
|
Expr *pExpr = pItem->pExpr;
|
||||||
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
|
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
|
||||||
if( pItem->bSorterRef ){
|
if( pItem->fg.bSorterRef ){
|
||||||
i--;
|
i--;
|
||||||
n--;
|
n--;
|
||||||
}else
|
}else
|
||||||
@@ -5613,7 +5609,7 @@ int sqlite3ExprListCompare(const ExprList *pA, const ExprList *pB, int iTab){
|
|||||||
int res;
|
int res;
|
||||||
Expr *pExprA = pA->a[i].pExpr;
|
Expr *pExprA = pA->a[i].pExpr;
|
||||||
Expr *pExprB = pB->a[i].pExpr;
|
Expr *pExprB = pB->a[i].pExpr;
|
||||||
if( pA->a[i].sortFlags!=pB->a[i].sortFlags ) return 1;
|
if( pA->a[i].fg.sortFlags!=pB->a[i].fg.sortFlags ) return 1;
|
||||||
if( (res = sqlite3ExprCompare(0, pExprA, pExprB, iTab)) ) return res;
|
if( (res = sqlite3ExprCompare(0, pExprA, pExprB, iTab)) ) return res;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -130,7 +130,7 @@ int sqlite3MatchEName(
|
|||||||
){
|
){
|
||||||
int n;
|
int n;
|
||||||
const char *zSpan;
|
const char *zSpan;
|
||||||
if( pItem->eEName!=ENAME_TAB ) return 0;
|
if( pItem->fg.eEName!=ENAME_TAB ) return 0;
|
||||||
zSpan = pItem->zEName;
|
zSpan = pItem->zEName;
|
||||||
for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){}
|
for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){}
|
||||||
if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){
|
if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){
|
||||||
@@ -359,9 +359,9 @@ static int lookupName(
|
|||||||
cntTab = 2;
|
cntTab = 2;
|
||||||
pMatch = pItem;
|
pMatch = pItem;
|
||||||
pExpr->iColumn = j;
|
pExpr->iColumn = j;
|
||||||
pEList->a[j].bUsed = 1;
|
pEList->a[j].fg.bUsed = 1;
|
||||||
hit = 1;
|
hit = 1;
|
||||||
if( pEList->a[j].bUsingTerm ) break;
|
if( pEList->a[j].fg.bUsingTerm ) break;
|
||||||
}
|
}
|
||||||
if( hit || zTab==0 ) continue;
|
if( hit || zTab==0 ) continue;
|
||||||
}
|
}
|
||||||
@@ -584,7 +584,7 @@ static int lookupName(
|
|||||||
assert( pEList!=0 );
|
assert( pEList!=0 );
|
||||||
for(j=0; j<pEList->nExpr; j++){
|
for(j=0; j<pEList->nExpr; j++){
|
||||||
char *zAs = pEList->a[j].zEName;
|
char *zAs = pEList->a[j].zEName;
|
||||||
if( pEList->a[j].eEName==ENAME_NAME
|
if( pEList->a[j].fg.eEName==ENAME_NAME
|
||||||
&& sqlite3_stricmp(zAs, zCol)==0
|
&& sqlite3_stricmp(zAs, zCol)==0
|
||||||
){
|
){
|
||||||
Expr *pOrig;
|
Expr *pOrig;
|
||||||
@@ -1337,7 +1337,7 @@ static int resolveAsName(
|
|||||||
assert( !ExprHasProperty(pE, EP_IntValue) );
|
assert( !ExprHasProperty(pE, EP_IntValue) );
|
||||||
zCol = pE->u.zToken;
|
zCol = pE->u.zToken;
|
||||||
for(i=0; i<pEList->nExpr; i++){
|
for(i=0; i<pEList->nExpr; i++){
|
||||||
if( pEList->a[i].eEName==ENAME_NAME
|
if( pEList->a[i].fg.eEName==ENAME_NAME
|
||||||
&& sqlite3_stricmp(pEList->a[i].zEName, zCol)==0
|
&& sqlite3_stricmp(pEList->a[i].zEName, zCol)==0
|
||||||
){
|
){
|
||||||
return i+1;
|
return i+1;
|
||||||
@@ -1458,7 +1458,7 @@ static int resolveCompoundOrderBy(
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
for(i=0; i<pOrderBy->nExpr; i++){
|
for(i=0; i<pOrderBy->nExpr; i++){
|
||||||
pOrderBy->a[i].done = 0;
|
pOrderBy->a[i].fg.done = 0;
|
||||||
}
|
}
|
||||||
pSelect->pNext = 0;
|
pSelect->pNext = 0;
|
||||||
while( pSelect->pPrior ){
|
while( pSelect->pPrior ){
|
||||||
@@ -1473,7 +1473,7 @@ static int resolveCompoundOrderBy(
|
|||||||
for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
|
for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
|
||||||
int iCol = -1;
|
int iCol = -1;
|
||||||
Expr *pE, *pDup;
|
Expr *pE, *pDup;
|
||||||
if( pItem->done ) continue;
|
if( pItem->fg.done ) continue;
|
||||||
pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr);
|
pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr);
|
||||||
if( NEVER(pE==0) ) continue;
|
if( NEVER(pE==0) ) continue;
|
||||||
if( sqlite3ExprIsInteger(pE, &iCol) ){
|
if( sqlite3ExprIsInteger(pE, &iCol) ){
|
||||||
@@ -1526,7 +1526,7 @@ static int resolveCompoundOrderBy(
|
|||||||
sqlite3ExprDelete(db, pE);
|
sqlite3ExprDelete(db, pE);
|
||||||
pItem->u.x.iOrderByCol = (u16)iCol;
|
pItem->u.x.iOrderByCol = (u16)iCol;
|
||||||
}
|
}
|
||||||
pItem->done = 1;
|
pItem->fg.done = 1;
|
||||||
}else{
|
}else{
|
||||||
moreToDo = 1;
|
moreToDo = 1;
|
||||||
}
|
}
|
||||||
@@ -1534,7 +1534,7 @@ static int resolveCompoundOrderBy(
|
|||||||
pSelect = pSelect->pNext;
|
pSelect = pSelect->pNext;
|
||||||
}
|
}
|
||||||
for(i=0; i<pOrderBy->nExpr; i++){
|
for(i=0; i<pOrderBy->nExpr; i++){
|
||||||
if( pOrderBy->a[i].done==0 ){
|
if( pOrderBy->a[i].fg.done==0 ){
|
||||||
sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any "
|
sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any "
|
||||||
"column in the result set", i+1);
|
"column in the result set", i+1);
|
||||||
return 1;
|
return 1;
|
||||||
|
49
src/select.c
49
src/select.c
@@ -331,7 +331,7 @@ void sqlite3SrcItemColumnUsed(SrcItem *pItem, int iCol){
|
|||||||
pResults = pItem->pSelect->pEList;
|
pResults = pItem->pSelect->pEList;
|
||||||
assert( pResults!=0 );
|
assert( pResults!=0 );
|
||||||
assert( iCol>=0 && iCol<pResults->nExpr );
|
assert( iCol>=0 && iCol<pResults->nExpr );
|
||||||
pResults->a[iCol].bUsed = 1;
|
pResults->a[iCol].fg.bUsed = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -999,7 +999,7 @@ static void fixDistinctOpenEph(
|
|||||||
** retrieved directly from table t1. If the values are very large, this
|
** retrieved directly from table t1. If the values are very large, this
|
||||||
** can be more efficient than storing them directly in the sorter records.
|
** can be more efficient than storing them directly in the sorter records.
|
||||||
**
|
**
|
||||||
** The ExprList_item.bSorterRef flag is set for each expression in pEList
|
** The ExprList_item.fg.fg.bSorterRef flag is set for each expression in pEList
|
||||||
** for which the sorter-reference optimization should be enabled.
|
** for which the sorter-reference optimization should be enabled.
|
||||||
** Additionally, the pSort->aDefer[] array is populated with entries
|
** Additionally, the pSort->aDefer[] array is populated with entries
|
||||||
** for all cursors required to evaluate all selected expressions. Finally.
|
** for all cursors required to evaluate all selected expressions. Finally.
|
||||||
@@ -1059,7 +1059,7 @@ static void selectExprDefer(
|
|||||||
nDefer++;
|
nDefer++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pItem->bSorterRef = 1;
|
pItem->fg.bSorterRef = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1190,7 +1190,7 @@ static void selectInnerLoop(
|
|||||||
for(i=0; i<pEList->nExpr; i++){
|
for(i=0; i<pEList->nExpr; i++){
|
||||||
if( pEList->a[i].u.x.iOrderByCol>0
|
if( pEList->a[i].u.x.iOrderByCol>0
|
||||||
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
|
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
|
||||||
|| pEList->a[i].bSorterRef
|
|| pEList->a[i].fg.bSorterRef
|
||||||
#endif
|
#endif
|
||||||
){
|
){
|
||||||
nResultCol--;
|
nResultCol--;
|
||||||
@@ -1552,7 +1552,7 @@ KeyInfo *sqlite3KeyInfoFromExprList(
|
|||||||
assert( sqlite3KeyInfoIsWriteable(pInfo) );
|
assert( sqlite3KeyInfoIsWriteable(pInfo) );
|
||||||
for(i=iStart, pItem=pList->a+iStart; i<nExpr; i++, pItem++){
|
for(i=iStart, pItem=pList->a+iStart; i<nExpr; i++, pItem++){
|
||||||
pInfo->aColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr);
|
pInfo->aColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr);
|
||||||
pInfo->aSortFlags[i-iStart] = pItem->sortFlags;
|
pInfo->aSortFlags[i-iStart] = pItem->fg.sortFlags;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return pInfo;
|
return pInfo;
|
||||||
@@ -1691,7 +1691,7 @@ static void generateSortTail(
|
|||||||
}
|
}
|
||||||
for(i=0, iCol=nKey+bSeq-1; i<nColumn; i++){
|
for(i=0, iCol=nKey+bSeq-1; i<nColumn; i++){
|
||||||
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
|
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
|
||||||
if( aOutEx[i].bSorterRef ) continue;
|
if( aOutEx[i].fg.bSorterRef ) continue;
|
||||||
#endif
|
#endif
|
||||||
if( aOutEx[i].u.x.iOrderByCol==0 ) iCol++;
|
if( aOutEx[i].u.x.iOrderByCol==0 ) iCol++;
|
||||||
}
|
}
|
||||||
@@ -1728,7 +1728,7 @@ static void generateSortTail(
|
|||||||
#endif
|
#endif
|
||||||
for(i=nColumn-1; i>=0; i--){
|
for(i=nColumn-1; i>=0; i--){
|
||||||
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
|
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
|
||||||
if( aOutEx[i].bSorterRef ){
|
if( aOutEx[i].fg.bSorterRef ){
|
||||||
sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i);
|
sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i);
|
||||||
}else
|
}else
|
||||||
#endif
|
#endif
|
||||||
@@ -2094,7 +2094,7 @@ void sqlite3GenerateColumnNames(
|
|||||||
assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */
|
assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */
|
||||||
assert( p->op!=TK_COLUMN
|
assert( p->op!=TK_COLUMN
|
||||||
|| (ExprUseYTab(p) && p->y.pTab!=0) ); /* Covering idx not yet coded */
|
|| (ExprUseYTab(p) && p->y.pTab!=0) ); /* Covering idx not yet coded */
|
||||||
if( pEList->a[i].zEName && pEList->a[i].eEName==ENAME_NAME ){
|
if( pEList->a[i].zEName && pEList->a[i].fg.eEName==ENAME_NAME ){
|
||||||
/* An AS clause always takes first priority */
|
/* An AS clause always takes first priority */
|
||||||
char *zName = pEList->a[i].zEName;
|
char *zName = pEList->a[i].zEName;
|
||||||
sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT);
|
sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT);
|
||||||
@@ -2183,7 +2183,7 @@ int sqlite3ColumnsFromExprList(
|
|||||||
struct ExprList_item *pCollide;
|
struct ExprList_item *pCollide;
|
||||||
/* Get an appropriate name for the column
|
/* Get an appropriate name for the column
|
||||||
*/
|
*/
|
||||||
if( (zName = pX->zEName)!=0 && pX->eEName==ENAME_NAME ){
|
if( (zName = pX->zEName)!=0 && pX->fg.eEName==ENAME_NAME ){
|
||||||
/* If the column contains an "AS <name>" phrase, use <name> as the name */
|
/* If the column contains an "AS <name>" phrase, use <name> as the name */
|
||||||
}else{
|
}else{
|
||||||
Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pX->pExpr);
|
Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pX->pExpr);
|
||||||
@@ -2218,7 +2218,7 @@ int sqlite3ColumnsFromExprList(
|
|||||||
*/
|
*/
|
||||||
cnt = 0;
|
cnt = 0;
|
||||||
while( zName && (pCollide = sqlite3HashFind(&ht, zName))!=0 ){
|
while( zName && (pCollide = sqlite3HashFind(&ht, zName))!=0 ){
|
||||||
if( pCollide->bUsingTerm ){
|
if( pCollide->fg.bUsingTerm ){
|
||||||
pCol->colFlags |= COLFLAG_NOEXPAND;
|
pCol->colFlags |= COLFLAG_NOEXPAND;
|
||||||
}
|
}
|
||||||
nName = sqlite3Strlen30(zName);
|
nName = sqlite3Strlen30(zName);
|
||||||
@@ -2231,7 +2231,7 @@ int sqlite3ColumnsFromExprList(
|
|||||||
}
|
}
|
||||||
pCol->zCnName = zName;
|
pCol->zCnName = zName;
|
||||||
pCol->hName = sqlite3StrIHash(zName);
|
pCol->hName = sqlite3StrIHash(zName);
|
||||||
if( pX->bNoExpand ){
|
if( pX->fg.bNoExpand ){
|
||||||
pCol->colFlags |= COLFLAG_NOEXPAND;
|
pCol->colFlags |= COLFLAG_NOEXPAND;
|
||||||
}
|
}
|
||||||
sqlite3ColumnPropertiesFromName(0, pCol);
|
sqlite3ColumnPropertiesFromName(0, pCol);
|
||||||
@@ -2492,7 +2492,7 @@ static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){
|
|||||||
}
|
}
|
||||||
assert( sqlite3KeyInfoIsWriteable(pRet) );
|
assert( sqlite3KeyInfoIsWriteable(pRet) );
|
||||||
pRet->aColl[i] = pColl;
|
pRet->aColl[i] = pColl;
|
||||||
pRet->aSortFlags[i] = pOrderBy->a[i].sortFlags;
|
pRet->aSortFlags[i] = pOrderBy->a[i].fg.sortFlags;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5098,7 +5098,7 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){
|
|||||||
}
|
}
|
||||||
*ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0);
|
*ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0);
|
||||||
assert( pOrderBy!=0 || db->mallocFailed );
|
assert( pOrderBy!=0 || db->mallocFailed );
|
||||||
if( pOrderBy ) pOrderBy->a[0].sortFlags = sortFlags;
|
if( pOrderBy ) pOrderBy->a[0].fg.sortFlags = sortFlags;
|
||||||
return eRet;
|
return eRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5805,7 +5805,7 @@ static int selectExpander(Walker *pWalker, Select *p){
|
|||||||
pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr);
|
pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr);
|
||||||
if( pNew ){
|
if( pNew ){
|
||||||
pNew->a[pNew->nExpr-1].zEName = a[k].zEName;
|
pNew->a[pNew->nExpr-1].zEName = a[k].zEName;
|
||||||
pNew->a[pNew->nExpr-1].eEName = a[k].eEName;
|
pNew->a[pNew->nExpr-1].fg.eEName = a[k].fg.eEName;
|
||||||
a[k].zEName = 0;
|
a[k].zEName = 0;
|
||||||
}
|
}
|
||||||
a[k].pExpr = 0;
|
a[k].pExpr = 0;
|
||||||
@@ -5859,8 +5859,8 @@ static int selectExpander(Walker *pWalker, Select *p){
|
|||||||
struct ExprList_item *pX = &pNew->a[pNew->nExpr-1];
|
struct ExprList_item *pX = &pNew->a[pNew->nExpr-1];
|
||||||
assert( pX->zEName==0 );
|
assert( pX->zEName==0 );
|
||||||
pX->zEName = sqlite3MPrintf(db,"..%s", zUName);
|
pX->zEName = sqlite3MPrintf(db,"..%s", zUName);
|
||||||
pX->eEName = ENAME_TAB;
|
pX->fg.eEName = ENAME_TAB;
|
||||||
pX->bUsingTerm = 1;
|
pX->fg.bUsingTerm = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
@@ -5943,20 +5943,20 @@ static int selectExpander(Walker *pWalker, Select *p){
|
|||||||
zSchemaName, zTabName, zName);
|
zSchemaName, zTabName, zName);
|
||||||
testcase( pX->zEName==0 );
|
testcase( pX->zEName==0 );
|
||||||
}
|
}
|
||||||
pX->eEName = ENAME_TAB;
|
pX->fg.eEName = ENAME_TAB;
|
||||||
if( (pFrom->fg.isUsing
|
if( (pFrom->fg.isUsing
|
||||||
&& sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0)
|
&& sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0)
|
||||||
|| (pUsing && sqlite3IdListIndex(pUsing, zName)>=0)
|
|| (pUsing && sqlite3IdListIndex(pUsing, zName)>=0)
|
||||||
|| (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0
|
|| (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0
|
||||||
){
|
){
|
||||||
pX->bNoExpand = 1;
|
pX->fg.bNoExpand = 1;
|
||||||
}
|
}
|
||||||
}else if( longNames ){
|
}else if( longNames ){
|
||||||
pX->zEName = sqlite3MPrintf(db, "%s.%s", zTabName, zName);
|
pX->zEName = sqlite3MPrintf(db, "%s.%s", zTabName, zName);
|
||||||
pX->eEName = ENAME_NAME;
|
pX->fg.eEName = ENAME_NAME;
|
||||||
}else{
|
}else{
|
||||||
pX->zEName = sqlite3DbStrDup(db, zName);
|
pX->zEName = sqlite3DbStrDup(db, zName);
|
||||||
pX->eEName = ENAME_NAME;
|
pX->fg.eEName = ENAME_NAME;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7084,13 +7084,13 @@ int sqlite3Select(
|
|||||||
if( p->selFlags & SF_NestedFrom ){
|
if( p->selFlags & SF_NestedFrom ){
|
||||||
/* Delete or NULL-out result columns that will never be used */
|
/* Delete or NULL-out result columns that will never be used */
|
||||||
int ii;
|
int ii;
|
||||||
for(ii=pEList->nExpr-1; ii>0 && pEList->a[ii].bUsed==0; ii--){
|
for(ii=pEList->nExpr-1; ii>0 && pEList->a[ii].fg.bUsed==0; ii--){
|
||||||
sqlite3ExprDelete(db, pEList->a[ii].pExpr);
|
sqlite3ExprDelete(db, pEList->a[ii].pExpr);
|
||||||
sqlite3DbFree(db, pEList->a[ii].zEName);
|
sqlite3DbFree(db, pEList->a[ii].zEName);
|
||||||
pEList->nExpr--;
|
pEList->nExpr--;
|
||||||
}
|
}
|
||||||
for(ii=0; ii<pEList->nExpr; ii++){
|
for(ii=0; ii<pEList->nExpr; ii++){
|
||||||
if( pEList->a[ii].bUsed==0 ) pEList->a[ii].pExpr->op = TK_NULL;
|
if( pEList->a[ii].fg.bUsed==0 ) pEList->a[ii].pExpr->op = TK_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7242,8 +7242,9 @@ int sqlite3Select(
|
|||||||
** ORDER BY to maximize the chances of rows being delivered in an
|
** ORDER BY to maximize the chances of rows being delivered in an
|
||||||
** order that makes the ORDER BY redundant. */
|
** order that makes the ORDER BY redundant. */
|
||||||
for(ii=0; ii<pGroupBy->nExpr; ii++){
|
for(ii=0; ii<pGroupBy->nExpr; ii++){
|
||||||
u8 sortFlags = sSort.pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_DESC;
|
u8 sortFlags;
|
||||||
pGroupBy->a[ii].sortFlags = sortFlags;
|
sortFlags = sSort.pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_DESC;
|
||||||
|
pGroupBy->a[ii].fg.sortFlags = sortFlags;
|
||||||
}
|
}
|
||||||
if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){
|
if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){
|
||||||
orderByGrp = 1;
|
orderByGrp = 1;
|
||||||
|
@@ -3001,16 +3001,18 @@ struct ExprList {
|
|||||||
struct ExprList_item { /* For each expression in the list */
|
struct ExprList_item { /* For each expression in the list */
|
||||||
Expr *pExpr; /* The parse tree for this expression */
|
Expr *pExpr; /* The parse tree for this expression */
|
||||||
char *zEName; /* Token associated with this expression */
|
char *zEName; /* Token associated with this expression */
|
||||||
u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */
|
struct {
|
||||||
unsigned eEName :2; /* Meaning of zEName */
|
u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */
|
||||||
unsigned done :1; /* A flag to indicate when processing is finished */
|
unsigned eEName :2; /* Meaning of zEName */
|
||||||
unsigned reusable :1; /* Constant expression is reusable */
|
unsigned done :1; /* Indicates when processing is finished */
|
||||||
unsigned bSorterRef :1; /* Defer evaluation until after sorting */
|
unsigned reusable :1; /* Constant expression is reusable */
|
||||||
unsigned bNulls :1; /* True if explicit "NULLS FIRST/LAST" */
|
unsigned bSorterRef :1; /* Defer evaluation until after sorting */
|
||||||
unsigned bUsed :1; /* This column used in a SF_NestedFrom subquery */
|
unsigned bNulls :1; /* True if explicit "NULLS FIRST/LAST" */
|
||||||
unsigned bUsingTerm:1; /* Term from the USING clause of a NestedFrom */
|
unsigned bUsed :1; /* This column used in a SF_NestedFrom subquery */
|
||||||
unsigned bNoExpand: 1; /* Term is an auxiliary in NestedFrom and should
|
unsigned bUsingTerm:1; /* Term from the USING clause of a NestedFrom */
|
||||||
** not be expanded by "*" in parent queries */
|
unsigned bNoExpand: 1; /* Term is an auxiliary in NestedFrom and should
|
||||||
|
** not be expanded by "*" in parent queries */
|
||||||
|
} fg;
|
||||||
union {
|
union {
|
||||||
struct { /* Used by any ExprList other than Parse.pConsExpr */
|
struct { /* Used by any ExprList other than Parse.pConsExpr */
|
||||||
u16 iOrderByCol; /* For ORDER BY, column number in result set */
|
u16 iOrderByCol; /* For ORDER BY, column number in result set */
|
||||||
|
@@ -875,15 +875,15 @@ void sqlite3TreeViewBareExprList(
|
|||||||
moreToFollow = 0;
|
moreToFollow = 0;
|
||||||
sqlite3TreeViewLine(pView, 0);
|
sqlite3TreeViewLine(pView, 0);
|
||||||
if( zName ){
|
if( zName ){
|
||||||
switch( pList->a[i].eEName ){
|
switch( pList->a[i].fg.eEName ){
|
||||||
default:
|
default:
|
||||||
fprintf(stdout, "AS %s ", zName);
|
fprintf(stdout, "AS %s ", zName);
|
||||||
break;
|
break;
|
||||||
case ENAME_TAB:
|
case ENAME_TAB:
|
||||||
fprintf(stdout, "TABLE-ALIAS-NAME(\"%s\") ", zName);
|
fprintf(stdout, "TABLE-ALIAS-NAME(\"%s\") ", zName);
|
||||||
if( pList->a[i].bUsed ) fprintf(stdout, "(used) ");
|
if( pList->a[i].fg.bUsed ) fprintf(stdout, "(used) ");
|
||||||
if( pList->a[i].bUsingTerm ) fprintf(stdout, "(USING-term) ");
|
if( pList->a[i].fg.bUsingTerm ) fprintf(stdout, "(USING-term) ");
|
||||||
if( pList->a[i].bNoExpand ) fprintf(stdout, "(NoExpand) ");
|
if( pList->a[i].fg.bNoExpand ) fprintf(stdout, "(NoExpand) ");
|
||||||
break;
|
break;
|
||||||
case ENAME_SPAN:
|
case ENAME_SPAN:
|
||||||
fprintf(stdout, "SPAN(\"%s\") ", zName);
|
fprintf(stdout, "SPAN(\"%s\") ", zName);
|
||||||
|
@@ -905,7 +905,7 @@ static ExprList *sqlite3ExpandReturning(
|
|||||||
if( !db->mallocFailed ){
|
if( !db->mallocFailed ){
|
||||||
struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1];
|
struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1];
|
||||||
pItem->zEName = sqlite3DbStrDup(db, pTab->aCol[jj].zCnName);
|
pItem->zEName = sqlite3DbStrDup(db, pTab->aCol[jj].zCnName);
|
||||||
pItem->eEName = ENAME_NAME;
|
pItem->fg.eEName = ENAME_NAME;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
@@ -914,7 +914,7 @@ static ExprList *sqlite3ExpandReturning(
|
|||||||
if( !db->mallocFailed && ALWAYS(pList->a[i].zEName!=0) ){
|
if( !db->mallocFailed && ALWAYS(pList->a[i].zEName!=0) ){
|
||||||
struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1];
|
struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1];
|
||||||
pItem->zEName = sqlite3DbStrDup(db, pList->a[i].zEName);
|
pItem->zEName = sqlite3DbStrDup(db, pList->a[i].zEName);
|
||||||
pItem->eEName = pList->a[i].eEName;
|
pItem->fg.eEName = pList->a[i].fg.eEName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
12
src/where.c
12
src/where.c
@@ -1206,7 +1206,7 @@ static sqlite3_index_info *allocateIndexInfo(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Virtual tables are unable to deal with NULLS FIRST */
|
/* Virtual tables are unable to deal with NULLS FIRST */
|
||||||
if( pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL ) break;
|
if( pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) break;
|
||||||
|
|
||||||
/* First case - a direct column references without a COLLATE operator */
|
/* First case - a direct column references without a COLLATE operator */
|
||||||
if( pExpr->op==TK_COLUMN && pExpr->iTable==pSrc->iCursor ){
|
if( pExpr->op==TK_COLUMN && pExpr->iTable==pSrc->iCursor ){
|
||||||
@@ -1318,7 +1318,7 @@ static sqlite3_index_info *allocateIndexInfo(
|
|||||||
|| (pExpr->op==TK_COLLATE && pExpr->pLeft->op==TK_COLUMN
|
|| (pExpr->op==TK_COLLATE && pExpr->pLeft->op==TK_COLUMN
|
||||||
&& pExpr->iColumn==pExpr->pLeft->iColumn) );
|
&& pExpr->iColumn==pExpr->pLeft->iColumn) );
|
||||||
pIdxOrderBy[j].iColumn = pExpr->iColumn;
|
pIdxOrderBy[j].iColumn = pExpr->iColumn;
|
||||||
pIdxOrderBy[j].desc = pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC;
|
pIdxOrderBy[j].desc = pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC;
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
pIdxInfo->nOrderBy = j;
|
pIdxInfo->nOrderBy = j;
|
||||||
@@ -4457,16 +4457,18 @@ static i8 wherePathSatisfiesOrderBy(
|
|||||||
/* Make sure the sort order is compatible in an ORDER BY clause.
|
/* Make sure the sort order is compatible in an ORDER BY clause.
|
||||||
** Sort order is irrelevant for a GROUP BY clause. */
|
** Sort order is irrelevant for a GROUP BY clause. */
|
||||||
if( revSet ){
|
if( revSet ){
|
||||||
if( (rev ^ revIdx)!=(pOrderBy->a[i].sortFlags&KEYINFO_ORDER_DESC) ){
|
if( (rev ^ revIdx)
|
||||||
|
!= (pOrderBy->a[i].fg.sortFlags&KEYINFO_ORDER_DESC)
|
||||||
|
){
|
||||||
isMatch = 0;
|
isMatch = 0;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
rev = revIdx ^ (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC);
|
rev = revIdx ^ (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC);
|
||||||
if( rev ) *pRevMask |= MASKBIT(iLoop);
|
if( rev ) *pRevMask |= MASKBIT(iLoop);
|
||||||
revSet = 1;
|
revSet = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( isMatch && (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL) ){
|
if( isMatch && (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL) ){
|
||||||
if( j==pLoop->u.btree.nEq ){
|
if( j==pLoop->u.btree.nEq ){
|
||||||
pLoop->wsFlags |= WHERE_BIGNULL_SORT;
|
pLoop->wsFlags |= WHERE_BIGNULL_SORT;
|
||||||
}else{
|
}else{
|
||||||
|
@@ -1616,7 +1616,7 @@ void sqlite3WhereAddLimit(WhereClause *pWC, Select *p){
|
|||||||
Expr *pExpr = pOrderBy->a[ii].pExpr;
|
Expr *pExpr = pOrderBy->a[ii].pExpr;
|
||||||
if( pExpr->op!=TK_COLUMN ) return;
|
if( pExpr->op!=TK_COLUMN ) return;
|
||||||
if( pExpr->iTable!=iCsr ) return;
|
if( pExpr->iTable!=iCsr ) return;
|
||||||
if( pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_BIGNULL ) return;
|
if( pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -916,7 +916,7 @@ static ExprList *exprListAppendList(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
pList = sqlite3ExprListAppend(pParse, pList, pDup);
|
pList = sqlite3ExprListAppend(pParse, pList, pDup);
|
||||||
if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags;
|
if( pList ) pList->a[nInit+i].fg.sortFlags = pAppend->a[i].fg.sortFlags;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return pList;
|
return pList;
|
||||||
@@ -2117,7 +2117,7 @@ static void windowCodeRangeTest(
|
|||||||
|
|
||||||
assert( op==OP_Ge || op==OP_Gt || op==OP_Le );
|
assert( op==OP_Ge || op==OP_Gt || op==OP_Le );
|
||||||
assert( pOrderBy && pOrderBy->nExpr==1 );
|
assert( pOrderBy && pOrderBy->nExpr==1 );
|
||||||
if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_DESC ){
|
if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_DESC ){
|
||||||
switch( op ){
|
switch( op ){
|
||||||
case OP_Ge: op = OP_Le; break;
|
case OP_Ge: op = OP_Le; break;
|
||||||
case OP_Gt: op = OP_Lt; break;
|
case OP_Gt: op = OP_Lt; break;
|
||||||
@@ -2150,7 +2150,7 @@ static void windowCodeRangeTest(
|
|||||||
** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is
|
** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is
|
||||||
** not taken, control jumps over the comparison operator coded below this
|
** not taken, control jumps over the comparison operator coded below this
|
||||||
** block. */
|
** block. */
|
||||||
if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_BIGNULL ){
|
if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_BIGNULL ){
|
||||||
/* This block runs if reg1 contains a NULL. */
|
/* This block runs if reg1 contains a NULL. */
|
||||||
int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v);
|
int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v);
|
||||||
switch( op ){
|
switch( op ){
|
||||||
|
Reference in New Issue
Block a user